简体   繁体   中英

Libre Office custom Dialog Table

I am creating a custom Dialog where the user is supposed to select one of multiple possible entries. I use a List Box to list the possible entries to be selected from.

There are multiple variables for each row, therefore I would like to use a table to properly align the entries. Is there a possibility to do so?

What i have:

abcdefg hijkl mnopq
abcd efghijk lmno

What i want:

abcdefg   hijkl      mnopq
abcd      efghilkl   mno

Use a fixed-width font for the list box, and pad the strings with spaces.

Sub PaddedListboxItems
    oListBox.addItems(Array(
        PaddedItem(Array("abcdefg", "hijkl", "mnopq")),
        PaddedItem(Array("abcd", "efghijk", "lmno"))), 0)
End Sub

Function PaddedItem(item_strings As Array)
    PaddedItem = PadString(item_strings(0), 10) & _
        PadString(item_strings(1), 11) & item_strings(2)
End Function

Function PadString(strSource As String, lPadLen As Long)
    PadString = strSource & " "
    If Len(strSource) < lPadLen Then
        PadString = strSource & Space(lPadLen - Len(strSource))
    End If
End Function

More ways to pad strings in Basic are at http://www.tek-tips.com/viewthread.cfm?qid=522164 , although not all of them work in LibreOffice Basic.

Yes, it is possible.

Create a new dialog and at the bottom, add a label. Create a new module and add following code:

Option Explicit
Option Base 0

Dim oDialog1 As Object, oDataModel As Object, oListener As Object

Sub OpenDialog()
    Dim oGrid As Object, oGridModel As Object, oColumnModel As Object, oCol As Object
    Dim oLabel1 As Object, rect(3) As Integer

    DialogLibraries.LoadLibrary("Standard")
    oDialog1 = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
    oGridModel = oDialog1.getModel().createInstance("com.sun.star.awt.grid.UnoControlGridModel")

    oLabel1 = oDialog1.getModel().getByName("Label1")
    rect(0) = oLabel1.getPropertyValue("PositionX")
    rect(1) = 10
    rect(2) = oLabel1.getPropertyValue("Width")
    rect(3) = oLabel1.getPropertyValue("PositionY") - 2*rect(1)
    With oGridModel
        .PositionX = rect(0)
        .PositionY = rect(1)
        .Width = rect(2)
        .Height = rect(3)
    End With

    oColumnModel = oGridModel.ColumnModel
    oCol = oColumnModel.createColumn()
    oCol.Title = "Column 1"
    oColumnModel.addColumn(oCol)

    oCol = oColumnModel.createColumn()
    oCol.Title = "Column 2"
    oColumnModel.addColumn(oCol)

    oCol = oColumnModel.createColumn()
    oCol.Title = "Column 3"
    oColumnModel.addColumn(oCol)

    oDialog1.getModel().insertByName("grid", oGridModel)
    oGrid = oDialog1.getControl("grid")
    oListener = (CreateUnoListener("grid_", "com.sun.star.awt.grid.XGridSelectionListener"))
    oGrid.addSelectionListener(oListener)

    oDataModel = oGridModel.GridDataModel
    oDataModel.addRow("a", Array("abcdefg", "hijkl", "mnopq"))
    oDataModel.addRow("b", Array("abcd", "efghijk", "lmno"))

    oDialog1.execute()
    oDialog1.dispose()
End Sub

To get the values of the selected row, add a listener for the grid_selectionChanged event:

Sub grid_selectionChanged(ev)
    Dim oRows() As Object, oLabel1 As Object, sCells(2) As String
    oRows = ev.Source.getSelectedRows()
    oLabel1 = oDialog1.getModel().getByName("Label1")
    sCells(0) = oDataModel.getRowData(oRows(0))(0)
    sCells(1) = oDataModel.getRowData(oRows(0))(1)
    sCells(2) = oDataModel.getRowData(oRows(0))(2)
    oLabel1.setPropertyValue("Label", "Selected values: " + sCells(0) + "," + sCells(1) + "," + sCells(2))
End Sub

If you did all correctly, by running OpenDialog you should get your grid:

在此输入图像描述

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM