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
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.