summaryrefslogtreecommitdiff
path: root/odk/examples/DevelopersGuide/Forms/DataAwareness.java
diff options
context:
space:
mode:
Diffstat (limited to 'odk/examples/DevelopersGuide/Forms/DataAwareness.java')
-rw-r--r--odk/examples/DevelopersGuide/Forms/DataAwareness.java932
1 files changed, 0 insertions, 932 deletions
diff --git a/odk/examples/DevelopersGuide/Forms/DataAwareness.java b/odk/examples/DevelopersGuide/Forms/DataAwareness.java
deleted file mode 100644
index 4395e99d..00000000
--- a/odk/examples/DevelopersGuide/Forms/DataAwareness.java
+++ /dev/null
@@ -1,932 +0,0 @@
-/*************************************************************************
- *
- * The Contents of this file are made available subject to the terms of
- * the BSD license.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of Sun Microsystems, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
- * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
- * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *************************************************************************/
-import com.sun.star.beans.PropertyChangeEvent;
-import com.sun.star.beans.XPropertyChangeListener;
-import com.sun.star.beans.XPropertySet;
-
-
-// __________ Imports __________
-import com.sun.star.beans.XPropertySetInfo;
-
-// base classes
-import com.sun.star.container.XIndexContainer;
-import com.sun.star.container.XNameAccess;
-import com.sun.star.container.XNamed;
-import com.sun.star.form.FormComponentType;
-import com.sun.star.form.ListSourceType;
-import com.sun.star.form.XGridColumnFactory;
-import com.sun.star.form.XReset;
-import com.sun.star.form.XResetListener;
-import com.sun.star.form.runtime.FormFeature;
-import com.sun.star.lang.EventObject;
-import com.sun.star.lang.XComponent;
-import com.sun.star.sdb.CommandType;
-import com.sun.star.sdb.XColumnUpdate;
-import com.sun.star.sdbc.ResultSetConcurrency;
-import com.sun.star.sdbc.XConnection;
-import com.sun.star.sdbc.XDataSource;
-import com.sun.star.sdbc.XStatement;
-import com.sun.star.sdbcx.XColumnsSupplier;
-import com.sun.star.uno.UnoRuntime;
-import com.sun.star.uno.XInterface;
-
-/**************************************************************************/
-/** a class for enumerating a form component tree
-*/
-class PrintComponentTree extends ComponentTreeTraversal
-{
- private String m_sPrefix;
-
- public PrintComponentTree()
- {
- m_sPrefix = new String();
- }
-
- public void handle( Object aFormComponent ) throws com.sun.star.uno.Exception
- {
- // the name of the child
- XNamed xName = (XNamed)UnoRuntime.queryInterface( XNamed.class, aFormComponent );
-
- // if it's a form control model, check it's type
- XPropertySet xProps = UNO.queryPropertySet( aFormComponent );
- String sTypeName = FLTools.classifyFormComponentType( xProps );
-
- String sName;
- if ( null == xName )
- sName = "<unnamed>";
- else
- sName = xName.getName();
-
- // print the component's name
- if ( 0 != sTypeName.length() )
- {
- System.out.println( m_sPrefix + sName + " (" + sTypeName + ")" );
- }
- else
- {
- System.out.println( m_sPrefix + sName );
- }
-
- // let the super class step down the tree
- m_sPrefix = m_sPrefix + " ";
- super.handle( aFormComponent );
- m_sPrefix = m_sPrefix.substring( 0, m_sPrefix.length() - 1 );
- }
-};
-
-/**************************************************************************/
-/** a class revoking button models from a ButtonOperator instance
-*/
-class RevokeButtons extends ComponentTreeTraversal
-{
- private ButtonOperator m_aOperator;
-
- public RevokeButtons( ButtonOperator aOperator )
- {
- m_aOperator = aOperator;
- }
-
- public void handle( Object aFormComponent ) throws com.sun.star.uno.Exception
- {
- // check if it's a button
- XPropertySet xProps = UNO.queryPropertySet( aFormComponent );
- XPropertySetInfo xPI = null;
- if ( null != xProps )
- xPI = xProps.getPropertySetInfo();
- if ( ( null != xPI ) && xPI.hasPropertyByName( "ClassId" ) )
- {
- Short nClassId = (Short)xProps.getPropertyValue( "ClassId" );
- if ( FormComponentType.COMMANDBUTTON == nClassId.shortValue() )
- {
- // yes, it is
- m_aOperator.revokeButton( xProps );
- }
- }
-
- // let the super class step down the tree (if possible)
- super.handle( aFormComponent );
- }
-}
-
-/**************************************************************************/
-public class DataAwareness extends DocumentBasedExample implements XPropertyChangeListener, XResetListener
-{
- /* ================================================================== */
- private HsqlDatabase m_database;
-
- private static final String s_tableNameSalesmen = "SALESMEN";
- private static final String s_tableNameCustomers = "CUSTOMERS";
- private static final String s_tableNameSales = "SALES";
-
- private XPropertySet m_xMasterForm;
- private ButtonOperator m_aOperator;
- private SalesFilter m_aSalesFilter;
-
- private KeyGenerator m_aSalesmanKeyGenerator;
- private KeyGenerator m_aSalesKeyGenerator;
- private ControlLock m_aSalesmenLocker;
- private ControlLock m_aSalesLocker;
- private GridFieldValidator m_aSalesNameValidator;
-
- private boolean m_bDefaultSalesDate;
- private boolean m_bProtectKeyFields;
- private boolean m_bAllowEmptySales;
-
- /* ------------------------------------------------------------------ */
- public DataAwareness()
- {
- super( DocumentType.WRITER );
- m_bDefaultSalesDate = false;
- m_bProtectKeyFields = false;
- m_bAllowEmptySales = false;
- }
-
- /* ==================================================================
- = form components
- ================================================================== */
-
- /* ------------------------------------------------------------------ */
- /** enumerates and prints all the elements in the given container, together with the container itself
- */
- protected void enumFormComponents( XNameAccess xContainer ) throws java.lang.Exception
- {
- String sObjectName;
-
- XNamed xNameAcc = (XNamed)UnoRuntime.queryInterface( XNamed.class, xContainer );
- if ( null == xNameAcc )
- sObjectName = new String( "<unnamed>" );
- else
- sObjectName = xNameAcc.getName();
- System.out.println( new String( "enumerating the container named \"" ) + sObjectName +
- new String( "\"\n" ) );
-
- PrintComponentTree aPrinter = new PrintComponentTree();
- aPrinter.handle( xContainer );
- }
-
- /* ------------------------------------------------------------------ */
- /** enumerates and prints all form elements in the document
- */
- protected void enumFormComponents( ) throws java.lang.Exception
- {
- enumFormComponents( m_document.getFormComponentTreeRoot() );
- }
-
- /* ==================================================================
- = UNO callbacks
- ================================================================== */
-
- /* ------------------------------------------------------------------ */
- // XResetListener overridables
- /* ------------------------------------------------------------------ */
- public boolean approveReset( EventObject aEvent ) throws com.sun.star.uno.RuntimeException
- {
- // not interested in vetoing this
- return true;
- }
-
- /* ------------------------------------------------------------------ */
- public void resetted( EventObject aEvent ) throws com.sun.star.uno.RuntimeException
- {
- // check if this reset occurred becase we're on a new record
- XPropertySet xFormProps = UNO.queryPropertySet( aEvent.Source );
- try
- {
- Boolean aIsNew = (Boolean)xFormProps.getPropertyValue( "IsNew" );
- if ( aIsNew.booleanValue() )
- { // yepp
-
- if ( !m_bDefaultSalesDate )
- { // we're interested to do all this only if the user told us to default the sales date
- // to "today"
- // As date fields do this defaulting automatically, the semantics is inverted here:
- // If we're told to default, we must do nothing, if we should not default, we must
- // reset the value which the date field set automatically.
-
- Integer aConcurrency = (Integer)xFormProps.getPropertyValue( "ResultSetConcurrency" );
- if ( ResultSetConcurrency.READ_ONLY != aConcurrency.intValue() )
- {
- // we're going to modify the record, though after that, to the user, it should look
- // like it has not been modified
- // So we need to ensure that we do not change the IsModified property with whatever we do
- Object aModifiedFlag = xFormProps.getPropertyValue( "IsModified" );
-
-
- // get the columns of our master form
- XColumnsSupplier xSuppCols = (XColumnsSupplier)UnoRuntime.queryInterface(
- XColumnsSupplier.class, xFormProps );
- XNameAccess xCols = xSuppCols.getColumns();
-
- // and update the date column with a NULL value
- XColumnUpdate xDateColumn = (XColumnUpdate)UnoRuntime.queryInterface(
- XColumnUpdate.class, xCols.getByName( "SALEDATE" ) );
- xDateColumn.updateNull();
-
-
- // then restore the flag
- xFormProps.setPropertyValue( "IsModified", aModifiedFlag );
- }
- }
- }
- }
- catch( com.sun.star.uno.Exception e )
- {
- System.out.println(e);
- e.printStackTrace();
- }
- }
-
- /* ------------------------------------------------------------------ */
- // XPropertyChangeListener overridables
- /* ------------------------------------------------------------------ */
- public void propertyChange( PropertyChangeEvent aEvent ) throws com.sun.star.uno.RuntimeException
- {
- try
- {
- // did it come from a radio button or checkbox?
- if ( aEvent.PropertyName.equals( "State" ) )
- { // yep
- Short aNewState = (Short)aEvent.NewValue;
-
- XPropertySet xModel = UNO.queryPropertySet( aEvent.Source );
- String sName = (String)xModel.getPropertyValue( "Name" );
-
- Short aClassId = (Short)xModel.getPropertyValue( "ClassId" );
- if ( FormComponentType.RADIOBUTTON == aClassId.shortValue() )
- {
- String sRefValue = (String)xModel.getPropertyValue( "RefValue" );
-
- short nNewValue = ((Short)aEvent.NewValue).shortValue();
- if ( sName.equals( "KeyGen" ) )
- {
- // it's one of the options for key generation
- if ( sRefValue.equals( "none" ) )
- { // no automatic generation at all
- m_aSalesmanKeyGenerator.stopGenerator( );
- m_aSalesKeyGenerator.stopGenerator( );
- }
- else
- {
- boolean bGenerateOnReset = true;
- if ( sRefValue.equals( "update" ) )
- { // generate on update
- bGenerateOnReset = ( 0 == nNewValue );
- }
- else if ( sRefValue.equals( "reset" ) )
- { // generat on reset
- bGenerateOnReset = ( 0 != nNewValue );
- }
- m_aSalesmanKeyGenerator.activateKeyGenerator( bGenerateOnReset );
- m_aSalesKeyGenerator.activateKeyGenerator( bGenerateOnReset );
- }
- }
- }
- else if ( FormComponentType.CHECKBOX == aClassId.shortValue() )
- {
- boolean bEnabled = ( 0 != aNewState.shortValue() );
- if ( sName.equals( "defaultdate" ) )
- {
- m_bDefaultSalesDate = bEnabled;
- }
- else if ( sName.equals( "protectkeys" ) )
- {
- m_bProtectKeyFields = bEnabled;
- m_aSalesmenLocker.enableLock( m_bProtectKeyFields );
- m_aSalesLocker.enableLock( m_bProtectKeyFields );
- }
- else if ( sName.equals( "emptysales" ) )
- {
- m_bAllowEmptySales = bEnabled;
- m_aSalesNameValidator.enableColumnWatch( m_bAllowEmptySales );
- }
- }
- }
- }
- catch(com.sun.star.uno.Exception e)
- {
- System.out.println(e);
- e.printStackTrace();
- }
- }
-
- /* ------------------------------------------------------------------ */
- // XEventListener overridables
- /* ------------------------------------------------------------------ */
- public void disposing( EventObject aEvent )
- {
- // simply disambiguate
- super.disposing( aEvent );
- }
-
- /* ==================================================================
- = miscellaneous
- ================================================================== */
-
- /* ------------------------------------------------------------------ */
- /** skips line feeds in the input stream
-
- @returns
- the first character which does not belong to a line feed
- */
- protected int skipLineFeeds( java.io.InputStream aInput ) throws java.io.IOException
- {
- // read characters, until we encounter something which is not a line feed character
- int nChar = aInput.read( );
- while ( ( 13 == nChar ) || ( 10 == nChar ) )
- nChar = aInput.read( );
-
- // now read everything which is behind this single character we are interested in
- while ( 0 < aInput.available() )
- aInput.read( );
-
- return nChar;
- }
-
- /* ==================================================================
- = table handling
- ================================================================== */
- /* ------------------------------------------------------------------ */
- /** checks if a given table exists.
-
- <p>The check is made using a SELECT statement, so even if the connection
- is a n SDB-level connection, which may filter tables in it's table
- supplier, the result may be reliable ....</p>
- */
- protected boolean existsInvisibleTable( XConnection xConn, String sTableName ) throws java.lang.Exception
- {
- String sStatement = "SELECT * FROM ";
- sStatement += sTableName;
- sStatement += " WHERE 0=1";
-
- boolean bSuccess = false;
- try
- {
- XStatement xStatement = xConn.createStatement();
- xStatement.execute( sStatement );
- // if we reached this point, the table probably exists
- bSuccess = true;
- }
- catch(com.sun.star.sdbc.SQLException e)
- {
- }
- return bSuccess;
- }
-
- /* ------------------------------------------------------------------ */
- /** add a specified table name to the table filter of the given data source.
- */
- protected void makeTableVisible( XDataSource xDS, XConnection xConn, String sTableName ) throws java.lang.Exception
- {
- // get the table filter
- XPropertySet xDSP = UNO.queryPropertySet( xDS );
- String[] aCurrentFilter = (String[])xDSP.getPropertyValue( "TableFilter" );
-
- // check if the table name is already part of it
- String sAllTables = "*"; // all tables
-
- for ( int i=0; i<aCurrentFilter.length; ++i )
- {
- String sCurrentTableFilter = aCurrentFilter[i];
-
- if ( sCurrentTableFilter.equals( sTableName ) )
- return;
- if ( sCurrentTableFilter.equals( sAllTables ) )
- return;
- }
-
- // if we are here, we have to add our table to the filter sequence
- String[] aNewFilter = new String[ aCurrentFilter.length + 1 ];
- // copy the existent filter entries
- for ( int i=0; i<aCurrentFilter.length; ++i )
- aNewFilter[i] = aCurrentFilter[i];
- // add our table
- aNewFilter[ aCurrentFilter.length ] = sTableName;
-
- xDSP.setPropertyValue( "TableFilter", aNewFilter );
- }
-
- /* ------------------------------------------------------------------ */
- /** executes the given statement on the given connection
- */
- protected boolean implExecuteStatement( XConnection xConn, String sStatement ) throws java.lang.Exception
- {
- try
- {
- XStatement xStatement = xConn.createStatement( );
- xStatement.execute( sStatement );
- }
- catch(com.sun.star.sdbc.SQLException e)
- {
- System.err.println( e );
- return false;
- }
-
- return true;
- }
-
- /* ------------------------------------------------------------------ */
- /** creates the table witht the given name, using the given statement
- */
- protected boolean implCreateTable( XConnection xConn, String sCreateStatement, String sTableName ) throws java.lang.Exception
- {
- if ( !implExecuteStatement( xConn, sCreateStatement ) )
- {
- System.out.println( " could not create the table " + sTableName + "." );
- System.out.println( );
- return false;
- }
-
- return true;
- }
-
- /* ------------------------------------------------------------------ */
- /** creates the table SALESMEN
-
- @return
- <TRUE/> if and only if the creation succeeded
- */
- protected boolean createTableSalesman( XConnection xConn ) throws java.lang.Exception
- {
- String sCreateStatement = "CREATE TABLE " + s_tableNameSalesmen + " ";
- sCreateStatement += "(SNR INTEGER NOT NULL, ";
- sCreateStatement += "FIRSTNAME VARCHAR(50), ";
- sCreateStatement += "LASTNAME VARCHAR(100), ";
- sCreateStatement += "STREET VARCHAR(50), ";
- sCreateStatement += "STATE VARCHAR(50), ";
- sCreateStatement += "ZIP INTEGER, ";
- sCreateStatement += "BIRTHDATE DATE, ";
- sCreateStatement += "PRIMARY KEY(SNR))";
-
- if ( implCreateTable( xConn, sCreateStatement, s_tableNameSalesmen) )
- {
- String sInsertionPrefix = "INSERT INTO " + s_tableNameSalesmen + " VALUES ";
-
- implExecuteStatement( xConn, sInsertionPrefix + "(1, 'Joseph', 'Smith', 'Bond Street', 'CA', 95460, '1946-07-02')" );
- implExecuteStatement( xConn, sInsertionPrefix + "(2, 'Frank', 'Jones', 'Lake silver', 'CA', 95460, '1963-12-24')" );
- implExecuteStatement( xConn, sInsertionPrefix + "(3, 'Jane', 'Esperansa', '23 Hollywood driver', 'CA', 95460, '1972-04-01')" );
-
- return true;
- }
- return false;
- }
-
- /* ------------------------------------------------------------------ */
- /** creates the table CUSTOMERS
-
- @return
- <TRUE/> if and only if the creation succeeded
- */
- protected boolean createTableCustomer( XConnection xConn ) throws java.lang.Exception
- {
- String sCreateStatement = "CREATE TABLE " + s_tableNameCustomers + " ";
- sCreateStatement += "(COS_NR INTEGER NOT NULL, ";
- sCreateStatement += "LASTNAME VARCHAR(100), ";
- sCreateStatement += "STREET VARCHAR(50), ";
- sCreateStatement += "CITY VARCHAR(50), ";
- sCreateStatement += "STATE VARCHAR(50), ";
- sCreateStatement += "ZIP INTEGER, ";
- sCreateStatement += "PRIMARY KEY(COS_NR))";
-
- if ( implCreateTable( xConn, sCreateStatement, s_tableNameCustomers ) )
- {
- String sInsertionPrefix = "INSERT INTO " + s_tableNameCustomers + " VALUES ";
-
- implExecuteStatement( xConn, sInsertionPrefix + "(100, 'Acme, Inc.', '99 Market Street', 'Groundsville', 'CA', 95199)" );
- implExecuteStatement( xConn, sInsertionPrefix + "(101, 'Superior BugSoft', '1 Party Place', 'Mendocino', 'CA', 95460)");
- implExecuteStatement( xConn, sInsertionPrefix + "(102, 'WeKnowAll, Inc.', '100 Coffee Lane', 'Meadows', 'CA', 93699)");
-
- return true;
- }
- return false;
- }
-
- /* ------------------------------------------------------------------ */
- /** creates the table SALES
-
- @return
- <TRUE/> if and only if the creation succeeded
- */
- protected boolean createTableSales( XConnection xConn ) throws java.lang.Exception
- {
- String sCreateStatement = "CREATE TABLE " + s_tableNameSales + " ";
- sCreateStatement += "(SALENR INTEGER NOT NULL, ";
- sCreateStatement += "COS_NR INTEGER NOT NULL, ";
- sCreateStatement += "SNR INTEGER NOT NULL, ";
- sCreateStatement += "NAME VARCHAR(50), ";
- sCreateStatement += "SALEDATE DATE, ";
- sCreateStatement += "PRICE DECIMAL(8,2), ";
- sCreateStatement += "PRIMARY KEY(SALENR))";
-
- if ( implCreateTable( xConn, sCreateStatement, s_tableNameSales ) )
- {
- String sInsertionPrefix = "INSERT INTO " + s_tableNameSales + " VALUES ";
-
- implExecuteStatement( xConn, sInsertionPrefix + "(1, 100, 1, 'Fruits', '2005-02-12', 39.99)" );
- implExecuteStatement( xConn, sInsertionPrefix + "(2, 101, 3, 'Beef', '2005-10-18', 15.78)" );
- implExecuteStatement( xConn, sInsertionPrefix + "(3, 102, 3, 'Orange Juice', '2005-09-08', 25.63)" );
- implExecuteStatement( xConn, sInsertionPrefix + "(4, 101, 2, 'Oil', '2005-03-01', 12.30)" );
-
- return true;
- }
-
- return false;
- }
-
- /* ------------------------------------------------------------------ */
- /** ensures that the tables we need for our example exist
- */
- protected void ensureTables() throws java.lang.Exception
- {
- // get the data source
- XDataSource xDS = m_database.getDataSource();
- XPropertySet xDSProps = UNO.queryPropertySet( xDS );
-
- // connect to this data source
- XConnection xConn = xDS.getConnection( "", "" );
- XComponent xConnComp = UNO.queryComponent( xConn );
-
- createTableSalesman( xConn );
- createTableCustomer( xConn );
- createTableSales( xConn );
-
- // free the resources acquired by the connection
- xConnComp.dispose();
- }
-
- /* ==================================================================
- = sample document handling
- ================================================================== */
-
- /* ------------------------------------------------------------------ */
- /** creates the button used for demonstrating (amonst others) event handling
- @param nXPos
- x-position of the to be inserted shape
- @param nYPos
- y-position of the to be inserted shape
- @param nXSize
- width of the to be inserted shape
- @param sName
- the name of the model in the form component hierarchy
- @param sLabel
- the label of the button control
- @param sActionURL
- the URL of the action which should be triggered by the button
- @return
- the model of the newly created button
- */
- protected XPropertySet createButton( int nXPos, int nYPos, int nXSize, String sName, String sLabel, short _formFeature ) throws java.lang.Exception
- {
- XPropertySet xButton = m_formLayer.createControlAndShape( "CommandButton", nXPos, nYPos, nXSize, 6 );
- // the name for referring to it later:
- xButton.setPropertyValue( "Name", sName );
- // the label
- xButton.setPropertyValue( "Label", sLabel );
- // use the name as help text
- xButton.setPropertyValue( "HelpText", sName );
- // don't want buttons to be accessible by the "tab" key - this would be uncomfortable when traveling
- // with records with "tab"
- xButton.setPropertyValue( "Tabstop", new Boolean( false ) );
- // similar, they should not steal the focus when clicked
- xButton.setPropertyValue( "FocusOnClick", new Boolean( false ) );
-
- m_aOperator.addButton( xButton, _formFeature );
-
- return xButton;
- }
-
- /* ------------------------------------------------------------------ */
- /** creates a column in a grid
- @param xGridModel
- specifies the model of the grid where the new column should be inserted
- @param sColumnService
- specifies the service name of the column to create (e.g. "NumericField")
- @param sDataField
- specifies the database field to which the column should be bound
- @param nWidth
- specifies the column width (in mm). If 0, no width is set.
- @return
- the newly created column
- */
- XPropertySet createGridColumn( Object aGridModel, String sColumnService, String sDataField, int nWidth )
- throws com.sun.star.uno.Exception
- {
- // the container to insert columns into
- XIndexContainer xColumnContainer = UNO.queryIndexContainer( aGridModel );
- // the factory for creating column models
- XGridColumnFactory xColumnFactory = (XGridColumnFactory)UnoRuntime.queryInterface(
- XGridColumnFactory.class, aGridModel );
-
- // (let) create the new col
- XInterface xNewCol = (XInterface)xColumnFactory.createColumn( sColumnService );
- XPropertySet xColProps = UNO.queryPropertySet( xNewCol );
-
- // some props
- // the field the column is bound to
- xColProps.setPropertyValue( "DataField", sDataField );
- // the "display name" of the column
- xColProps.setPropertyValue( "Label", sDataField );
- // the name of the column within it's parent
- xColProps.setPropertyValue( "Name", sDataField );
-
- if ( nWidth > 0 )
- xColProps.setPropertyValue( "Width", new Integer( nWidth * 10 ) );
-
- // insert
- xColumnContainer.insertByIndex( xColumnContainer.getCount(), xNewCol );
-
- // outta here
- return xColProps;
- }
-
- /* ------------------------------------------------------------------ */
- /** creates a column in a grid
- */
- XPropertySet createGridColumn( Object aGridModel, String sColumnService, String sDataField )
- throws com.sun.star.uno.Exception
- {
- return createGridColumn( aGridModel, sColumnService, sDataField );
- }
-
- /* ------------------------------------------------------------------ */
- /** creates our sample document
- */
- protected void prepareDocument() throws com.sun.star.uno.Exception, java.lang.Exception
- {
- super.prepareDocument();
-
- m_database = new HsqlDatabase( m_xCtx );
-
- // ensure that we have the tables needed for our example
- ensureTables();
-
- // --------------------------------------------------------------
- /* create some shapes */
- XPropertySet xSNRField = m_formLayer.insertControlLine( "NumericField", "SNR", "", 3 );
- m_formLayer.insertControlLine( "TextField", "FIRSTNAME", "", 11);
- m_formLayer.insertControlLine( "TextField", "LASTNAME", "", 19 );
- m_formLayer.insertControlLine( "TextField", "STREET", "", 27 );
- m_formLayer.insertControlLine( "TextField", "STATE", "", 35 );
- XPropertySet xZipField = m_formLayer.insertControlLine( "NumericField", "ZIP", "", 43 );
- m_formLayer.insertControlLine( "FormattedField", "BIRTHDATE", "", 51 );
-
- // for the salesman number / zip code, we don't want to have decimal places:
- xSNRField.setPropertyValue( "DecimalAccuracy", new Short( (short)0 ) );
- xZipField.setPropertyValue( "DecimalAccuracy", new Short( (short)0 ) );
-
- // --------------------------------------------------------------
- /** need the form the control models belong to
- for this, we simply obtain the parent for any of the control models we have
-
- Note that this involves knowledge about the implementation: If a control shape is
- inserted into a document, where the control model does not belong to the form component
- hierarchy, yet, it is automatically inserted into the first form, which is created
- if necessary.
- */
- m_xMasterForm = FLTools.getParent( xZipField );
-
- // set the data source signature at the form
- m_xMasterForm.setPropertyValue( "DataSourceName", m_database.getDocumentURL() );
- m_xMasterForm.setPropertyValue( "CommandType", new Integer( CommandType.TABLE ) );
- m_xMasterForm.setPropertyValue( "Command", "SALESMEN" );
-
- // --------------------------------------------------------------
- // insert the buttons
- // create our button operator, if necessary
- m_aOperator = new ButtonOperator( m_xCtx, m_document, m_xMasterForm );
-
- createButton( 2, 63, 8, "first", "<<", FormFeature.MoveToFirst );
- createButton( 12, 63, 8, "prev", "<", FormFeature.MoveToPrevious );
- createButton( 22, 63, 8, "next", ">", FormFeature.MoveToNext );
- createButton( 32, 63, 8, "last", ">>", FormFeature.MoveToLast );
- createButton( 42, 63, 8, "new", ">*", FormFeature.MoveToInsertRow );
- createButton( 58, 63, 13, "reload", "reload", FormFeature.ReloadForm );
-
- // --------------------------------------------------------------
- // create a sub for for the sales
-
- // for this, first create a sub form and bind it to the SALES table
- XIndexContainer xSalesForm = m_document.createSubForm( m_xMasterForm, "Sales" );
- XPropertySet xSalesFormProps = UNO.queryPropertySet( xSalesForm );
-
- xSalesFormProps.setPropertyValue( "DataSourceName", m_database.getDocumentURL() );
- xSalesFormProps.setPropertyValue( "CommandType", new Integer( CommandType.COMMAND ) );
-
- String sCommand = new String( "SELECT * FROM " );
- sCommand += s_tableNameSales;
- sCommand += " WHERE " + s_tableNameSales + ".SNR = :salesmen";
- xSalesFormProps.setPropertyValue( "Command", sCommand );
-
- // the master-details connection
- String[] aMasterFields = new String[] { "SNR" }; // the field in the master form
- String[] aDetailFields = new String[] { "salesmen" }; // the name in the detail form
- xSalesFormProps.setPropertyValue( "MasterFields", aMasterFields );
- xSalesFormProps.setPropertyValue( "DetailFields", aDetailFields );
-
- // the create thr grid model
- XPropertySet xSalesGridModel = m_formLayer.createControlAndShape( "GridControl", 2, 80, 162, 40, xSalesForm );
- xSalesGridModel.setPropertyValue( "Name", "SalesTable" );
- XPropertySet xKeyColumn = createGridColumn( xSalesGridModel, "NumericField", "SALENR", 12 );
- XPropertySet xCustomerColumn = createGridColumn( xSalesGridModel, "ListBox", "COS_NR", 40 );
- XPropertySet xSalesNameColumn = createGridColumn( xSalesGridModel, "TextField", "NAME", 25 );
- createGridColumn( xSalesGridModel, "DateField", "SALEDATE", 24 );
- createGridColumn( xSalesGridModel, "CurrencyField", "PRICE", 16 );
-
- // please note that a better solution for the SALEDATE field would have been to use
- // a FormattedField. But we want to demonstrate some effects with DateFields here ...
-
- m_aSalesNameValidator = new GridFieldValidator( m_xCtx, xSalesNameColumn );
- m_aSalesNameValidator.enableColumnWatch( m_bAllowEmptySales );
-
- xKeyColumn.setPropertyValue( "DecimalAccuracy", new Short( (short)0 ) );
-
- // init the list box which is for choosing the customer a sale belongs to
- xCustomerColumn.setPropertyValue( "BoundColumn", new Short( (short)1 ) );
- xCustomerColumn.setPropertyValue( "Label", "Customer" );
- xCustomerColumn.setPropertyValue( "ListSourceType", ListSourceType.SQL );
-
- String sListSource = "SELECT LASTNAME, COS_NR FROM ";
- sListSource += s_tableNameCustomers;
- String[] aListSource = new String[] { sListSource };
- xCustomerColumn.setPropertyValue( "ListSource", aListSource );
-
- // We want to demonstrate how to reset fields to NULL, we do this with the SALEDATE field
- // above. For this, we add as reset listener to the form
- XReset xFormReset = UNO.queryReset( xSalesForm );
- xFormReset.addResetListener( this );
-
-
- // --------------------------------------------------------------
- // the option for filtering the sales form
- XIndexContainer xSalesFilterForm = m_document.createSiblingForm( xSalesForm, "SalesFilter" );
- XPropertySet xSFFProps = UNO.queryPropertySet( xSalesFilterForm );
- XPropertySet xLabel = m_formLayer.createControlAndShape( "FixedText", 2, 125, 35, 6, xSalesFilterForm );
- xLabel.setPropertyValue( "Label", "show only sales since" );
- xLabel.setPropertyValue( "Name", "FilterLabel" );
-
- XPropertySet xFilterSelection = m_formLayer.createControlAndShape( "ListBox", 40, 125, 59, 6, xSalesFilterForm );
- xFilterSelection.setPropertyValue( "Name", "FilterList" );
- xFilterSelection.setPropertyValue( "LabelControl", xLabel );
- XPropertySet xManualFilter = m_formLayer.createControlAndShape( "DateField", 104, 125, 30, 6, xSalesFilterForm );
- xManualFilter.setPropertyValue( "Name", "ManualFilter" );
- XPropertySet xApplyFilter = m_formLayer.createControlAndShape( "CommandButton", 139, 125, 25, 6, xSalesFilterForm );
- xApplyFilter.setPropertyValue( "Name", "ApplyFilter" );
- xApplyFilter.setPropertyValue( "DefaultButton", new Boolean( true ) );
- m_aSalesFilter = new SalesFilter( m_document, xSalesFormProps, xFilterSelection,
- xManualFilter, xApplyFilter );
-
-
- // --------------------------------------------------------------
- // the options section
- // for this, we need a form which is a sibling of our master form (don't want to interfere
- // the controls which represent options only with the controls which are used for data access)
-
- XIndexContainer xOptionsForm = m_document.createSiblingForm( m_xMasterForm, "Options" );
-
- xLabel = m_formLayer.createControlAndShape( "GroupBox", 98, 0, 66, 62, xOptionsForm );
- xLabel.setPropertyValue( "Name", "Options" );
- xLabel.setPropertyValue( "Label", "Options" );
-
- // radio buttons which controls how we generate unique keys
- xLabel = m_formLayer.createControlAndShape( "GroupBox", 103, 5, 56, 25, xOptionsForm );
- xLabel.setPropertyValue( "Label", "key generation" );
- xLabel.setPropertyValue( "Name", "KeyGeneration" );
- XPropertySet xKeyGen = m_formLayer.createControlAndShape( "RadioButton", 106, 11, 50, 6, xOptionsForm );
- xKeyGen.setPropertyValue( "Name", "KeyGen" );
- xKeyGen.setPropertyValue( "Label", "no automatic generation" );
- xKeyGen.setPropertyValue( "RefValue", "none" );
- xKeyGen.addPropertyChangeListener( "State", this );
-
- xKeyGen = m_formLayer.createControlAndShape( "RadioButton", 106, 17, 50, 6, xOptionsForm );
- xKeyGen.setPropertyValue( "Name", "KeyGen" );
- xKeyGen.setPropertyValue( "Label", "before inserting a record" );
- xKeyGen.setPropertyValue( "RefValue", "update" );
- xKeyGen.addPropertyChangeListener( "State", this );
-
- xKeyGen = m_formLayer.createControlAndShape( "RadioButton", 106, 23, 50, 6, xOptionsForm );
- xKeyGen.setPropertyValue( "Name", "KeyGen" );
- xKeyGen.setPropertyValue( "Label", "when moving to a new record" );
- xKeyGen.setPropertyValue( "RefValue", "reset" );
- xKeyGen.addPropertyChangeListener( "State", this );
-
- // initialize listeners
- // master form - key generation
- m_aSalesmanKeyGenerator = new KeyGenerator( m_xMasterForm, "SNR", m_xCtx );
- m_aSalesmanKeyGenerator.activateKeyGenerator( true );
- // master form - control locking
- m_aSalesmenLocker = new ControlLock( m_xMasterForm, "SNR" );
- m_aSalesmenLocker.enableLock( m_bProtectKeyFields );
-
- // details form - key generation
- m_aSalesKeyGenerator = new KeyGenerator( xSalesFormProps, "SALENR", m_xCtx );
- m_aSalesKeyGenerator.activateKeyGenerator( true );
-
- // details form - control locking
- m_aSalesLocker = new ControlLock( xSalesFormProps, "SALENR" );
- m_aSalesLocker.enableLock( m_bProtectKeyFields );
-
- // initally, we want to generate keys when moving to a new record
- xKeyGen.setPropertyValue( "DefaultState", new Short( (short)1 ) );
-
- // --------------------------------------------------------------
- // second options block
- xLabel = m_formLayer.createControlAndShape( "GroupBox", 103, 33, 56, 25, xOptionsForm );
- xLabel.setPropertyValue( "Name", "Misc" );
- xLabel.setPropertyValue( "Label", "Miscellaneous" );
-
- XPropertySet xCheck = m_formLayer.createControlAndShape( "CheckBox", 106, 39, 60, 6, xOptionsForm );
- xCheck.setPropertyValue( "Name", "defaultdate" );
- xCheck.setPropertyValue( "Label", "default sales date to \"today\"" );
- xCheck.setPropertyValue( "HelpText", "When checked, newly entered sales records are pre-filled with today's date, else left empty." );
- xCheck.addPropertyChangeListener( "State", this );
-
- xCheck = m_formLayer.createControlAndShape( "CheckBox", 106, 45, 60, 6, xOptionsForm );
- xCheck.setPropertyValue( "Name", "protectkeys" );
- xCheck.setPropertyValue( "Label", "protect key fields from editing" );
- xCheck.setPropertyValue( "HelpText", "When checked, you cannot modify the values in the table's key fields (SNR and SALENR)" );
- xCheck.addPropertyChangeListener( "State", this );
-
- xCheck = m_formLayer.createControlAndShape( "CheckBox", 106, 51, 60, 6, xOptionsForm );
- xCheck.setPropertyValue( "Name", "emptysales" );
- xCheck.setPropertyValue( "Label", "check for empty sales names" );
- xCheck.setPropertyValue( "HelpText", "When checked, you cannot enter empty values into the NAME column of the 'Sales' table." );
- xCheck.addPropertyChangeListener( "State", this );
-
- // dump the form component tree
- enumFormComponents( );
- }
-
- /* ------------------------------------------------------------------ */
- protected void onFormsAlive()
- {
- m_aOperator.onFormsAlive();
- }
-
- /* ------------------------------------------------------------------ */
- /** performs any cleanup before exiting the program
- */
- protected void cleanUp( ) throws java.lang.Exception
- {
- // remove the listeners at the buttons
- RevokeButtons aRevoke = new RevokeButtons( m_aOperator );
- aRevoke.handle( m_document.getFormComponentTreeRoot( ) );
-
- // remove the key generator listeners from the form
- m_aSalesmanKeyGenerator.stopGenerator( );
- m_aSalesKeyGenerator.stopGenerator( );
-
- // and the control lockers
- m_aSalesmenLocker.enableLock( false );
- m_aSalesLocker.enableLock( false );
-
- // the validator for the grid column
- m_aSalesNameValidator.enableColumnWatch( false );
-
- // remove our own reset listener from the form
- XNameAccess xMasterAsNames = (XNameAccess)UnoRuntime.queryInterface(
- XNameAccess.class, m_xMasterForm );
- XReset xFormReset = UNO.queryReset( xMasterAsNames.getByName( "Sales" ) );
- xFormReset.removeResetListener( this );
-
- super.cleanUp();
- }
-
- /* ------------------------------------------------------------------ */
- /** class entry point
- */
- public static void main(String argv[]) throws java.lang.Exception
- {
- DataAwareness aSample = new DataAwareness();
- aSample.run( argv );
- }
-}