Page 1 of 1
[Solved] Horizontal large table inside a dialog
Posted: Mon Nov 27, 2017 8:52 pm
by Crisdeannn
Hello,
I would like to display a 2-row table inside of a dialog. These rows shall display data taken from 2 array variables (first row would contain the headers and the second one: the data).
There would be around 100 elements in each row. Of course, it will not fit in a dialog window. Therefore, I would like to have a scroll bar inside of the display field of a dialog box, which will move the content horizontally.
The problem is that I can't find any dialog control element that would be suitable to this purpose. Do you have any ideas on how to do that ?
Thanks
Re: horizontal large table inside a dialog
Posted: Mon Nov 27, 2017 11:44 pm
by musikai
You have to create such a dialog at runtime.
I don't know from where I got this code, (perhaps from the forum here, you might search for "UnoControlGridModel")
but here it is. It adds 4 columns and automatically spaces them. But you can see that it automatically adds a scrollbar when you resize the most right one with the mouse. Perhaps there is also something like a fixed horizontal size property or a "rowmodel"?
Code: Select all
Sub GridOnDialog()
Dim dlg, dlgmodel, gridmodel, columnmodel, col, datamodel, grid, oListener
dlg = CreateUnoDialog(DialogLibraries.Standard.getByName("Dialog1"))
dlgmodel = dlg.getModel()
' create new grid control
gridmodel = dlgmodel.createInstance("com.sun.star.awt.grid.UnoControlGridModel")
with gridmodel
.PositionX = 10
.PositionY = 10
.Width = 150
.Height = 100
.SelectionModel = com.sun.star.view.SelectionType.MULTI
end with
' add columns
columnmodel = gridmodel.ColumnModel
col = columnmodel.createColumn()
col.Title = "Name"
columnmodel.addColumn(col)
col = columnmodel.createColumn()
col.Title = "Value"
columnmodel.addColumn(col)
col = columnmodel.createColumn()
col.Title = "Value2"
columnmodel.addColumn(col)
col.Title = "Value3"
columnmodel.addColumn(col)
' insert grid control to the dialog
dlgmodel.insertByName("grid", gridmodel)
' fill the grid with data
datamodel = gridmodel.GridDataModel
datamodel.addRow("a", Array("foo", 100,20))
datamodel.addRow("b", Array("bar", 200,300,400))
datamodel.addRow("c", Array("hoge", 300))
datamodel.addRow("d", Array("huga", 400))
' adding the listener for selection changed
grid = dlg.getControl("grid")
oListener = createUnoListener("ListenerGrid_","com.sun.star.awt.grid.XGridSelectionListener")
grid.AddSelectionListener(oListener)
dlg.execute()
dlg.dispose()
End Sub
Sub ListenerGrid_selectionChanged(ev)
Dim S As String
Dim i As Integer
Dim rows
s = ""
rows = ev.Source.getSelectedRows()
for i = 0 to ubound(rows) step 1
s = s & CStr(rows(i)) & chr(10)
next
msgbox s
End Sub
Sub ListenerGrid_disposing(ev)
End Sub
Re: Horizontal large table inside a dialog
Posted: Wed Nov 29, 2017 12:58 am
by musikai
Here is a more complete code that lets you define also the column widths.
It creates a 1x10 table from an array and adds a button in the default Standard-Dialog.

- Table in Dialog.PNG (16.2 KiB) Viewed 10665 times
Code: Select all
REM ***** BASIC *****
dim oDlg as variant
Sub Dialog_with_Grid
'run Standard Dialog1
oDlg = CreateUnoDialog(DialogLibraries.Standard.getByName("Dialog1"))
'create Grid
oGridModel = oDlg.Model.createInstance("com.sun.star.awt.grid.UnoControlGridModel")
oGridModel.Name = "myGrid"
With oGridModel
.ShowColumnHeader = True
.ShowRowHeader = false
.HScroll = false
rem.VScroll = True
.Sizeable = True
.Step = 0
End with
oColumnModel = createUnoService("com.sun.star.awt.grid.DefaultGridColumnModel")
Titlesarray=array("Title1","Title2","Title3","Title4","Title5","Title6","Title7","Title8","Title9","Title10")
Valuesarray=array("Value1","Value2","Value3","Value4","Value5","Value6","Value7","Value8","Value9","Value10")
' add columns
for i=0 to ubound(Titlesarray)
oColumn = createUnoService("com.sun.star.awt.grid.GridColumn")
oColumn.Title = Titlesarray(i)
oColumn.Resizeable=true
oColumn.ColumnWidth=30
oColumn.Flexibility=false
oColumnModel.addColumn(oColumn)
next
oGridModel.ColumnModel = oColumnModel
' add Rows
oDataModel = createUnoService("com.sun.star.awt.grid.DefaultGridDataModel")
oDataModel.addRow("a", Valuesarray)
oGridModel.GridDataModel = oDataModel
' create Grid-Controlelement
oGridControl = createUnoService("com.sun.star.awt.grid.UnoControlGrid")
oGridControl.setModel(oGridModel) 'das Model zuweisen
' add Grid-Controlelement to Dialog
oDlg.addControl("tab_g1", oGridControl)
' set Position and Size of Grid-Controlelement (try!)
oGridControl.setPosSize(10,10,330,60, com.sun.star.awt.PosSize.POSSIZE)
REM add a button model
oButtonModel = oDlg.model.createInstance("com.sun.star.awt.UnoControlButtonModel")
oButtonModel.Name = "Value_Button"
oButtonModel.Width = 100
oButtonModel.Height = 20
oButtonModel.PositionX = 10
oButtonModel.PositionY = 50
oButtonModel.Label = "Value of selected Column"
oButtonModel.PushButtonType = com.sun.star.awt.PushButtonType.STANDARD
oDlg.model.insertByName("Value_Button", oButtonModel)
oValue_Listener = CreateUnoListener("Value_Listener_","com.sun.star.awt.XActionListener")
oCmdValue = oDlg.getControl("Value_Button")
oCmdValue.AddActionListener(oValue_Listener)
' run Dialog
oDlg.execute()
' remove action listener after
oDlg.getControl("Value_Button").removeActionListener(oValue_Listener)
End Sub
rem---action listener for button
Sub Value_Listener_actionPerformed( oEv As com.sun.star.awt.ActionEvent )
if NOT oDlg.getControl("tab_g1").hasSelectedRows() then 'keine markierte Zeile
msgbox "Please select a Value!"
exit sub
end if
aZeile = oDlg.getControl("tab_g1").model.GridDataModel.getRowData(oDlg.getControl("tab_g1").getCurrentRow)
msgbox aZeile(oDlg.getControl("tab_g1").CurrentColumn)
End Sub
Sub Value_Listener_disposing( oEv As com.sun.star.lang.EventObject)
End Sub
Re: Horizontal large table inside a dialog
Posted: Thu Nov 30, 2017 7:40 pm
by Crisdeannn
Musikai,
Thanks a lot for your codes !
I'll try it and leave some feedback later.
Re: Horizontal large table inside a dialog
Posted: Sat Dec 02, 2017 8:11 pm
by Crisdeannn
I've implemented the code and it works pretty well.
Thanks again!
Re: Horizontal large table inside a dialog
Posted: Mon Dec 04, 2017 4:46 pm
by Crisdeannn
One more question relating to this code.. It worked fine, unitl I launched it on another computer
Do you know how to set oGridControl.setPosSize(10,10,330,60, com.sun.star.awt.PosSize.POSSIZE) coordinates to Map AppFont (ma) units ?
Re: Horizontal large table inside a dialog
Posted: Mon Dec 04, 2017 9:05 pm
by musikai
AppFont was a new word to me.
After reading this:
https://wiki.openoffice.org/wiki/Docume ... Properties
I understand that the Dialogs created with the Dialog Editor or the Width-Properties of the models use Appfont units.
Possize use pixels as read here:
viewtopic.php?f=45&t=85181
This above link above might have your solution.
But even when I only create Dialogs with the editor they don't always look the same on different Systems (Windows, Linux).
BTW I'm curious for what you use such a table. Although I created the code I don't have a clue for what it's good.

If you find a solution for your problem we are always very thankful if you post it here.
Re: Horizontal large table inside a dialog
Posted: Mon Dec 04, 2017 11:28 pm
by Crisdeannn
Thanks, I'll check this solution and let you know if and how it worked.
Well.. I decided to create a spreadsheet with macros to support managing tools in our company. At the moment we have it in normal spreadsheets, but that's not enough.
After few days with Openoffice Basic I decided to create an independent dialog-based interface, which uses spreadsheets just as a database (in fact, users won't even get access to any part of the spreadsheet, other than a button that starts a dialog). I know - spreadsheets are not databases and I'm doing something that macros are not designed for. But I'm going to finish that project and then I can learn java, write it from zero again and release upgraded version

.
The table is used after user reported an operation on tool (and before he confirmed it) to make a summary that will show him in 3 simple lines: 1) what's current content of the database for this tool or set of tools (each tool is described by 20 properties), 2) what's the content of the report he/she has already prepared (each contain around 15 records, but the full list of potential changes has almost 100 elements) and 3) how the database and current tools description will change after the action is confirmed.
Sounds complicated but as far it works fine and it takes less than one minute and around 10 clicks to prepare a complex report for a set of tools.
For this purpose your code works very well, users may see current records for 10-20 or even more different tools and scroll the list left/right, up/down, comparing it with the record they prepared, see what will change and what will stay unchanged.
By the way, I can't stand all these expensive, professional softwares with so many obvious functions missing. The softwares that won't even let you to preview of what you are going to record or which let you to upgrade the dictionary with a name that begins with space.. The costs of problems that occured only because someone has registered an item with comma insted of dot are uncountable.. It took me around 10 minutes to prepare a function that eliminates 95% of potential errors when registering new part number in a dictionary, a function that asks: "hey, it looks like 'item X' that we already have registered is something you're trying to register again. Are you sure?".
I'll keep you informed how it works..

Re: Horizontal large table inside a dialog
Posted: Wed Dec 06, 2017 1:56 pm
by steveg
Hi,
great piece of code. I'm new to programming macros for openoffice. How do I change the font, size for the table produced.
I understand its to do with the FontDescriptor but how I apply this to your code I have no idea
regards
Re: Horizontal large table inside a dialog
Posted: Wed Dec 06, 2017 11:22 pm
by musikai
Here are the properties of UnoControlGridModel:
https://www.openoffice.org/api/docs/com ... Model.html
Setting colors like this works:
Code: Select all
oGridModel.TextColor = RGB(255,0,0)
But setting font properties of the grid with
Code: Select all
oGridModel.FontWeight = com.sun.star.awt.FontWeight.BOLD
doesn't show. MRI tells that the properties are changed but they don't show in the dialog.
Applying the same to the Button works:
Code: Select all
oButtonModel.FontWeight = com.sun.star.awt.FontWeight.BOLD
Re: Horizontal large table inside a dialog
Posted: Fri Dec 08, 2017 12:17 pm
by steveg
Is this a fault? or am I doing it wrong? i've tried
Code: Select all
'create Grid
oGridModel = oDlg.Model.createInstance("com.sun.star.awt.grid.UnoControlGridModel")
oGridModel.Name = "myGrid"
'oGridModel.FontDescriptor = com.sun.star.awt.FontWeight.BOLD
With oGridModel
.ShowColumnHeader = True
.ShowRowHeader = false
.HScroll = false
rem.VScroll = True
.Sizeable = True
.Step = 0
.TextColor = RGB(255,0,0)
.FontWeight = com.sun.star.awt.FontWeight.BOLD
.FontDescriptor.Name = "Arial"
.FontDescriptor.Weight = "Bold"
.FontDescriptor.Height = 24
.FontDescriptor.CharacterWidth = 24
End with
I can change the text colour but thats about it nothing else changes
sorry for my ignorance on the subject. I've assumed that the commands are correct as the macro runs without protest
regards
Re: Horizontal large table inside a dialog
Posted: Fri Dec 08, 2017 4:41 pm
by hanya
Some properties of the grid are not implemented internally. You could not change font descriptor related properties on the grid control. These properties are not passed from the model to the internal grid implementation even you specify.
Re: Horizontal large table inside a dialog
Posted: Fri Dec 08, 2017 5:00 pm
by steveg
I think I understood that.
If the gridcontrolmodel doesn't have the functionality to change the font. Is there a way to change it externally from say the dialog model
Is that how it works. Even thou if it is I can't get that to work either.
So how do I implement changes to the font. How do I set the font size for the grid.
As I said I can change the text color but not the font size?
Is it possible even.
regards
Re: [Solved] Horizontal large table inside a dialog
Posted: Sun Mar 15, 2020 4:59 pm
by caravas
Greetings!
This code is being very useful, thanks for sharing.
I would like to create a grid with some columns filled with information from a query, but it would be possible in at least one to complete the data manually, after the dialogue is running. I don't know if it is possible, any suggestions?
Thank you in advance.