1

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
asked Apr 24, 2017 at 14:57

2 Answers 2

0

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.

answered Apr 24, 2017 at 16:43
Sign up to request clarification or add additional context in comments.

Comments

0

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:

enter image description here

answered Jun 16, 2017 at 22:51

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.