UNO Grid Control
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
Example
Create new columns:
// #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");
Add the columns to the column model of the grid control:
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);
Use the data model of the grid control to add rows:
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"} );
Create the grid model and assign the column and data model:
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);
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:
|
| |
2 | 2009-08-28 | in progress |
To do:
|
| |
3 | open |
To do:
|
| ||
4 | open |
To do:
|
| ||
5 | open |
To do:
|
|
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