UNO Grid Control

From Apache OpenOffice Wiki
< API‎ | UNO AWT
Revision as of 10:15, 29 September 2009 by Misheto (Talk | contribs)

Jump to: navigation, search

Abstract

OpenOffice.org hasn't a Grid Control via UNO API today. The goal is to develop and implement an UNO Grid Control. This Wiki page should help you to implement a UNO Grid Control within your own UNO application.

Overview

Overview gridcontrol.png

Example

Create new columns:

Java

 // #1 column
 Object column1Obj = xMultiComponentFactory.createInstanceWithContext(
                "com.sun.star.awt.grid.GridColumn", m_xContext);
 
 XGridColumn column1 = (XGridColumn) UnoRuntime.queryInterface(
                XGridColumn.class, column1Obj);
 
 column1.setTitle("Column1");
 
 // #2 column
 Object column2Obj = xMultiComponentFactory.createInstanceWithContext(
                "com.sun.star.awt.grid.GridColumn", m_xContext);
 XGridColumn column2 = (XGridColumn) UnoRuntime.queryInterface(
                XGridColumn.class, column2Obj);
 
 column2.setTitle("Column2");

Basic

oColumnModel = createUnoService( "com.sun.star.awt.grid.DefaultGridColumnModel")
 
oColumn1 = createUnoService( "com.sun.star.awt.grid.GridColumn")
oColumn1.Title = "City"
 
oColumn2 = createUnoService( "com.sun.star.awt.grid.GridColumn")
oColumn2.Title = "Country"

Add the columns to the column model of the grid control:

Java

 Object columnModel = xMultiComponentFactory.createInstanceWithContext(
                "com.sun.star.awt.grid.DefaultGridColumnModel", m_xContext);
 XGridColumnModel xGridColumnModel = (XGridColumnModel) UnoRuntime.queryInterface(
                XGridColumnModel.class, columnModel);
 
 xGridColumnModel.addColumn(column1);
 xGridColumnModel.addColumn(column2);

Basic

oColumnModel.addColumn( oColumn1 )
oColumnModel.addColumn( oColumn2 )

Use the data model of the grid control to add rows:

Java

 Object dataModel = xMultiComponentFactory.createInstanceWithContext(
                "com.sun.star.awt.grid.DefaultGridDataModel", m_xContext);
 XGridDataModel xGridDataModel = (XGridDataModel) UnoRuntime.queryInterface(
                XGridDataModel.class, dataModel);
 
 xGridDataModel.addRow("1", new String[] {"1,1","1,2"} );
 xGridDataModel.addRow("2", new String[] {"2,1","2,2"} );

Basic

oDataModel = createUnoService( "com.sun.star.awt.grid.DefaultGridDataModel")
'first parameter is for header title if row header exists, else put empty string
oDataModel.addRow ( "1", Array( "Hamburg", "Germany") )
oDataModel.addRow ( "2", Array("Brisbane", "Australia") )

Create the grid model and assign the column and data model:

Java

 Object gridModel = xMultiServiceFactory.createInstance(
                "com.sun.star.awt.grid.UnoControlGridModel");
 XPropertySet xPSetButton = (XPropertySet) UnoRuntime.queryInterface(
                XPropertySet.class, gridModel);
 
 xPSetButton.setPropertyValue("PositionX", new Integer(50));
 xPSetButton.setPropertyValue("PositionY", new Integer(30));
 xPSetButton.setPropertyValue("Width", new Integer(400));
 xPSetButton.setPropertyValue("Height", new Integer(400));
 xPSetButton.setPropertyValue("Name", "GridControl");
 xPSetButton.setPropertyValue("TabIndex", new Short((short) 0));
 xPSetButton.setPropertyValue("ColumnModel", xGridColumnModel);
 xPSetButton.setPropertyValue("GridDataModel", xGridDataModel);

Basic

oModel = oDialogModel.createInstance( "com.sun.star.awt.grid.UnoControlGridModel" )
oModel.Name="Grid1"
oModel.GridDataModel = oDataModel
oModel.ColumnModel = oColumnModel
oModel.ShowColumnHeader = True
oModel.ShowRowHeader = True
oDialogModel.insertByName("Grid1", oModel )

Event Handling

Supported Listeners

Name Method Comments
XGridDataListener
rowAdded
rowRemoved Invoked after a remove row call. If removedAll was called the GridDataEvent.Index contains -1.
dataChanged
XGridColumnListener
columnAdded
columnRemoved
columnChanged
XMouseListener
mousePressed
mouseReleased
mouseEntered Not yet implemented.
mouseExited Not yet implemented.
XGridSelectionListener Not yet implemented.
selectionChanged

XGridDataListener

The XGridDataListener supports methods to indicate operations on the data model of the grid control. The listener will be invoked by the data model. Each event triggered by the listener uses an instance of GridDataEvent to give details.


Example:

Object dataModel = xMultiComponentFactory.createInstanceWithContext(
                "com.sun.star.awt.grid.DefaultGridDataModel", this.context);
xGridDataModel = (XGridDataModel) UnoRuntime.queryInterface(
                XGridDataModel.class, dataModel);
 
xGridDataModel.addDataListener(new XGridDataListener() {
 
                public void rowAdded(GridDataEvent arg0) {
                    throw new UnsupportedOperationException("Not supported yet.");
                }
 
                public void rowRemoved(GridDataEvent arg0) {
                    throw new UnsupportedOperationException("Not supported yet.");
                }
 
                public void dataChanged(GridDataEvent arg0) {
                    throw new UnsupportedOperationException("Not supported yet.");
                }
 
                public void disposing(EventObject arg0) {
                    throw new UnsupportedOperationException("Not supported yet.");
                }
            });

XGridColumnLisener

The XGridColumnLisener supports methods to indicate operations on the column model of the grid control. The listener will be invoked by the column model. Each event triggered by the listener uses an instance of GridColumnEvent to give details.


Example:

Object columnModel =  this.m_factory.createInstanceWithContext(
                "com.sun.star.awt.grid.DefaultGridColumnModel", this.context);
XGridColumnModel xGridColumnModel = (XGridColumnModel) UnoRuntime.queryInterface( XGridColumnModel.class, columnModel);
 
xGridColumnModel.addColumnListener(new XGridColumnListener() {
 
                public void columnAdded(GridColumnEvent arg0) {
                    throw new UnsupportedOperationException("Not supported yet.");
                }
 
                public void columnRemoved(GridColumnEvent arg0) {
                    throw new UnsupportedOperationException("Not supported yet.");
                }
 
                public void columnChanged(GridColumnEvent arg0) {
                    throw new UnsupportedOperationException("Not supported yet.");
                }
            });

XMouseListener

The XMouseListener is currently not full implemented within the grid control. Only the methods mousePressed and mouseRelease are supported. Use this listener to process mouse events e.g mouse clicks on a row.


Example:

XControlContainer xControlCont = (XControlContainer) UnoRuntime.queryInterface(
                XControlContainer.class, dialog);
Object objectGrid = xControlCont.getControl("Grid1");
 
XGridControl xGridControl = (XGridControl) UnoRuntime.queryInterface(XGridControl.class, objectGrid);
XWindow xWindow = (XWindow) UnoRuntime.queryInterface(XWindow.class, objectGrid);
 
xWindow.addMouseListener(new XMouseListener() {
 
                public void mousePressed(MouseEvent arg0) {
                    throw new UnsupportedOperationException("Not supported yet.");
                }
 
                public void mouseReleased(MouseEvent arg0) {
                    if (arg0.ClickCount >= 2) {
                      int pos = xGridControl.getItemIndexAtPoint(arg0.X, arg0.Y);
                      // put custom source code here.
                    }
                }
 
                public void mouseEntered(MouseEvent arg0) {
                    throw new UnsupportedOperationException("Not supported yet.");
                }
 
                public void mouseExited(MouseEvent arg0) {
                    throw new UnsupportedOperationException("Not supported yet.");
                }
 
                public void disposing(EventObject arg0) {
                    throw new UnsupportedOperationException("Not supported yet.");
                }
            });

Known Issues

Iteration Description Task ID Status Comments
1 Currently it's not possible to grain the focus with the TAB key - new
1 If the property UnoControlGridModel HScroll is set to TRUE. All data were drawn in a small rectangle in the upper left corner - new
1 If the property UnoControlGridModel HScroll is set to FALSE and many columns were added. The office crashes if you slide with the scrollbar to the right end. - fixed
1 If the property UnoControlGridModel SelectionModel is set to NONE. It's still possible to navigate with the arrow keys through the grid but mouse actions were ignored. - fixed
1 All selection were removed by using left or right arrow keys. Usage of left or right arrow keys shouldn't have an effect on selection - fixed
1 If text content of a cell doesn't fit into the cell it's overwrites the neighbour cell - new

Feature Set

  • Width for each column
  • Height for each row
  • Each cell has its own data type
  • Column and row header
  • Vertical and horizontal scrollbars
  • Row selection ( Single, Multi, Range )
  • Auto resizing
  • A11y

Planned Iteration

Iteration Due date Status Comment Description Components
1 2009-07-31 QA

To do:

  • UnoControl
  • Selection
  • Textdata only
  • Eventhandling
  • Scrollbars
  • Scrollbar modi
  • Column and row headers
  • UNO
    • IDL
    • Impl.
  • VCL
    • Impl.
2 in progress

To do:

  • Eventhandling
  • Different data types
  • A11y
  • UNO
    • IDL
    • Impl.
  • VCL
    • Impl.
3 open

To do:

  • modify column and row size
  • exception handling
  • A11y
  • UNO
    • IDL
    • Impl.
  • VCL
    • Impl.
4 open

To do:

  • Auto resizing
  • A11y
  • UNO
    • IDL
    • Impl.
  • VCL
    • Impl.
5 open

To do:

  • Basic IDE
  • Docs/Wiki |
  • IDE
    • Import/Export
    • UI
  • Doc
    • Wiki
    • SDK-Examples

Grid specification

Key And Mouse Usage

Action Selection Modus Description
Selection possibilities with the mouse
Mouse click in a cell SINGLE / RANGE / MULTI Single row selection.
Ctrl + mouse click in a cell MULTI Multiple rows selection possible, if row has been already selected, deselects it.
Shift + mouse click in a cell RANGE / MULTI Multiple rows selection, range is between current row and the chosen one.
Selection possibilities with the keyboard
Ctrl + Alt SINGLE / RANGE / MULTI Single row selection, if row has been already selected, deselects it.
Shift + UP RANGE / MULTI Multiple rows selection above current row, if rows above the current one have been already selected, they can be deselected one by one.
Shift + DOWN RANGE / MULTI Multiple rows selection beneath current row, if rows beneath the current one have been already selected, they can be deselected one by one
Shift + HOME RANGE / MULTI Multiple row selection, range is between current row and top one.
Shift + END RANGE / MULTI Multiple row selection, range is between current row and bottom one

.

  • Resizing
Personal tools