工具提示对LibreOffice Calc下拉列表中的每个选项起作用

时间:2018-06-29 10:52:39

标签: libreoffice-calc

我希望能够向我的LibreOffice Calc文档添加工具提示功能。

我有一个通过数据->有效性完成的下拉列表。要么具有单元格范围,要么具有列表。

如何尽可能简单地在该下拉列表的每个选项上方插入工具提示文本?

我以前没有写过宏(工具->宏),我对Visual Basic,Pyhton或Java不熟悉。 我可以寻求帮助的任何安装,插件和/或代码段吗?

例如:

1 (tooltip: this is option one)
2 (tooltip: this is option two)
3 (tooltip: option 3 this is)

我有Ubuntu 18.04。

1 个答案:

答案 0 :(得分:0)

可以轻松完成的一件事是使用插入->注释向每个单元格添加注释。

然后,例如,选择下图所示的单元格A5,然后转到数据->有效性。将像元范围源设置为A1到A3。

data validity and tooltips

或者,使用标签控件的工具提示示例位于https://forum.openoffice.org/en/forum/viewtopic.php?f=20&t=57791

通过编写事件侦听器,可能会找到更接近您在问题中所描述内容的解决方案。 XListBox有一个名为itemStateChanged的事件。发生此事件时,也许不显示工具提示,而是在文本框中显示信息。

编辑

以下是显示我的想法的示例代码。使用APSO运行showdlg()

import uno
import unohelper
from com.sun.star.awt import XItemListener

Items = [
        ("Item 1", "This is the first item"),
        ("Item 2", "This is the second item"),
        ("Item 3", "This is the third item"),
    ]

def showdlg():
    doc = XSCRIPTCONTEXT.getDocument()
    dlg = TooltipDialog(doc)
    dlg.show()

class TooltipDialog(XItemListener, unohelper.Base):
    def __init__(self, doc):
        self.parent = doc.CurrentController.Frame.ContainerWindow
        self.dlg = None
        self.label = None

    def show(self):
        toolkit = self.parent.getToolkit()
        ctx = uno.getComponentContext()
        smgr = ctx.ServiceManager
        model = smgr.createInstanceWithContext(
            "com.sun.star.awt.UnoControlDialogModel", ctx)
        dialog = smgr.createInstanceWithContext(
            "com.sun.star.awt.UnoControlDialog", ctx)
        model.setPropertyValue("PositionX", 100)
        model.setPropertyValue("PositionY", 100)
        model.setPropertyValue("Width", 200)
        model.setPropertyValue("Height", 75)
        model.setPropertyValue("Title", "Tooltip Listbox")

        listbox = model.createInstance(
            "com.sun.star.awt.UnoControlListBoxModel")
        listbox.setPropertyValue("PositionX", 20)
        listbox.setPropertyValue("PositionY", 10)
        listbox.setPropertyValue("Width", 40)
        listbox.setPropertyValue("Height", 20)
        listbox.setPropertyValue("Dropdown", True)
        listbox.setPropertyValue("Name", "ListBox1")
        for pos in range(len(Items)):
            listbox.insertItemText(pos, Items[pos][0])
        model.insertByName("ListBox1", listbox)

        label = model.createInstance(
            "com.sun.star.awt.UnoControlFixedTextModel")
        label.setPropertyValue("PositionX", 70)
        label.setPropertyValue("PositionY", 10)
        label.setPropertyValue("Width", 100)
        label.setPropertyValue("Height", 20)
        label.setPropertyValue("Name", "Label1")
        label.setPropertyValue("Label", "(Please select an item.)")
        model.insertByName("Label1", label)

        dialog.setModel(model)
        control = dialog.getControl("ListBox1")
        control.addItemListener(self)
        self.label = dialog.getControl("Label1")
        dialog.createPeer(toolkit, None)
        self.dlg = dialog
        self.dlg.execute()
        self.dlg.dispose()

    def itemStateChanged(self, itemEvent):
        """XItemListener event handler."""
        pos = itemEvent.Source.SelectedItemPos
        description = Items[pos][1]
        self.label.setText(description)

tooltip list box

您可能会注意到,该示例不包含任何特殊格式。例如,更改它以将标签修改为黄色的3-D框应该很简单。同样,该示例可适用于显示使用threads短时间后消失的消息。它仍然不是真正的工具提示,但是如果对您很重要,则可以使它看起来和工作起来很像。

可以使用电子表格lookup函数来实现类似的解决方案,而无需任何宏。文本将显示在单元格中,而不是单独的对话框中,并且将基于数据有效性结果来计算单元格值。那样会给外观带来很大的灵活性,但它应该能够毫无问题地显示说明。