1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski import com.sun.star.uno.*; 25*b1cdbd2cSJim Jagielski import com.sun.star.beans.*; 26*b1cdbd2cSJim Jagielski import com.sun.star.form.*; 27*b1cdbd2cSJim Jagielski import com.sun.star.lang.*; 28*b1cdbd2cSJim Jagielski import com.sun.star.sdb.*; 29*b1cdbd2cSJim Jagielski import com.sun.star.sdbc.*; 30*b1cdbd2cSJim Jagielski import com.sun.star.sdbcx.*; 31*b1cdbd2cSJim Jagielski import com.sun.star.container.*; 32*b1cdbd2cSJim Jagielski import com.sun.star.awt.*; 33*b1cdbd2cSJim Jagielski 34*b1cdbd2cSJim Jagielski /**************************************************************************/ 35*b1cdbd2cSJim Jagielski /** base class for helpers dealing with unique column values 36*b1cdbd2cSJim Jagielski */ 37*b1cdbd2cSJim Jagielski class UniqueColumnValue 38*b1cdbd2cSJim Jagielski { 39*b1cdbd2cSJim Jagielski /* ------------------------------------------------------------------ */ 40*b1cdbd2cSJim Jagielski /** extracts the name of the table a form is based on. 41*b1cdbd2cSJim Jagielski 42*b1cdbd2cSJim Jagielski <p>This method works for forms based directly on tables, and for forms based on statements, which 43*b1cdbd2cSJim Jagielski themself are based on one table.<br/> 44*b1cdbd2cSJim Jagielski Everything else (especially forms based on queries) is not yet implemented.</p> 45*b1cdbd2cSJim Jagielski */ extractTableName( XPropertySet xForm )46*b1cdbd2cSJim Jagielski protected String extractTableName( XPropertySet xForm ) throws com.sun.star.uno.Exception 47*b1cdbd2cSJim Jagielski { 48*b1cdbd2cSJim Jagielski String sReturn; 49*b1cdbd2cSJim Jagielski 50*b1cdbd2cSJim Jagielski Integer aCommandType = (Integer)xForm.getPropertyValue( "CommandType" ); 51*b1cdbd2cSJim Jagielski String sCommand = (String)xForm.getPropertyValue( "Command" ); 52*b1cdbd2cSJim Jagielski 53*b1cdbd2cSJim Jagielski if ( CommandType.COMMAND == aCommandType.intValue() ) 54*b1cdbd2cSJim Jagielski { 55*b1cdbd2cSJim Jagielski // get the connection from the form 56*b1cdbd2cSJim Jagielski XConnection xFormConn = (XConnection)UnoRuntime.queryInterface( XConnection.class, 57*b1cdbd2cSJim Jagielski xForm.getPropertyValue( "ActiveConnection" ) ); 58*b1cdbd2cSJim Jagielski // and let it create a composer for us 59*b1cdbd2cSJim Jagielski XSQLQueryComposerFactory xComposerFac = 60*b1cdbd2cSJim Jagielski (XSQLQueryComposerFactory)UnoRuntime.queryInterface( 61*b1cdbd2cSJim Jagielski XSQLQueryComposerFactory.class, xFormConn ); 62*b1cdbd2cSJim Jagielski XSQLQueryComposer xComposer = xComposerFac.createQueryComposer( ); 63*b1cdbd2cSJim Jagielski 64*b1cdbd2cSJim Jagielski // let this composer analyze the command 65*b1cdbd2cSJim Jagielski xComposer.setQuery( sCommand ); 66*b1cdbd2cSJim Jagielski 67*b1cdbd2cSJim Jagielski // and ask it for the table(s) 68*b1cdbd2cSJim Jagielski XTablesSupplier xSuppTables = (XTablesSupplier)UnoRuntime.queryInterface( 69*b1cdbd2cSJim Jagielski XTablesSupplier.class, xComposer ); 70*b1cdbd2cSJim Jagielski XNameAccess xTables = xSuppTables.getTables(); 71*b1cdbd2cSJim Jagielski 72*b1cdbd2cSJim Jagielski // simply take the first table name 73*b1cdbd2cSJim Jagielski String[] aNames = xTables.getElementNames( ); 74*b1cdbd2cSJim Jagielski sCommand = aNames[0]; 75*b1cdbd2cSJim Jagielski } 76*b1cdbd2cSJim Jagielski 77*b1cdbd2cSJim Jagielski return sCommand; 78*b1cdbd2cSJim Jagielski } 79*b1cdbd2cSJim Jagielski 80*b1cdbd2cSJim Jagielski /* ------------------------------------------------------------------ */ 81*b1cdbd2cSJim Jagielski /** generates a statement which can be used to create a unique (in all conscience) value 82*b1cdbd2cSJim Jagielski for the column given. 83*b1cdbd2cSJim Jagielski <p>Currently, the implementation uses a very simple approach - it just determines the maximum of currently 84*b1cdbd2cSJim Jagielski existing values in the column. If your concrete data source supports a more sophisticated approach of generating 85*b1cdbd2cSJim Jagielski unique values, you probably want to adjust the <code>SELECT</code> statement below accordingly.</p> 86*b1cdbd2cSJim Jagielski 87*b1cdbd2cSJim Jagielski @returns 88*b1cdbd2cSJim Jagielski a String which can be used as statement to retrieve a unique value for the given column. 89*b1cdbd2cSJim Jagielski The result set resulting from such a execution contains the value in it's first column. 90*b1cdbd2cSJim Jagielski */ composeUniqueyKeyStatement( XPropertySet xForm, String sFieldName )91*b1cdbd2cSJim Jagielski protected String composeUniqueyKeyStatement( XPropertySet xForm, String sFieldName ) throws com.sun.star.uno.Exception 92*b1cdbd2cSJim Jagielski { 93*b1cdbd2cSJim Jagielski String sStatement = new String( "SELECT MAX( " ); 94*b1cdbd2cSJim Jagielski sStatement += sFieldName; 95*b1cdbd2cSJim Jagielski sStatement += new String( ") + 1 FROM " ); 96*b1cdbd2cSJim Jagielski // the table name is a property of the form 97*b1cdbd2cSJim Jagielski sStatement += extractTableName( xForm ); 98*b1cdbd2cSJim Jagielski 99*b1cdbd2cSJim Jagielski // note that the implementation is imperfect (besides the problem that MAX is not a really good solution 100*b1cdbd2cSJim Jagielski // for a database with more that one client): 101*b1cdbd2cSJim Jagielski // It does not quote the field and the table name. This needs to be done if the database is intolerant 102*b1cdbd2cSJim Jagielski // against such things - the XDatabaseMetaData, obtained from the connection, would be needed then 103*b1cdbd2cSJim Jagielski // Unfortunately, there is no UNO service doing this - it would need to be implemented manually. 104*b1cdbd2cSJim Jagielski 105*b1cdbd2cSJim Jagielski return sStatement; 106*b1cdbd2cSJim Jagielski } 107*b1cdbd2cSJim Jagielski 108*b1cdbd2cSJim Jagielski /* ------------------------------------------------------------------ */ 109*b1cdbd2cSJim Jagielski /** generates a unique (in all conscience) key into the column given 110*b1cdbd2cSJim Jagielski @param xForm 111*b1cdbd2cSJim Jagielski the form which contains the column in question 112*b1cdbd2cSJim Jagielski @param sFieldName 113*b1cdbd2cSJim Jagielski the name of the column 114*b1cdbd2cSJim Jagielski */ generatePrimaryKey( XPropertySet xForm, String sFieldName )115*b1cdbd2cSJim Jagielski protected int generatePrimaryKey( XPropertySet xForm, String sFieldName ) throws com.sun.star.uno.Exception 116*b1cdbd2cSJim Jagielski { 117*b1cdbd2cSJim Jagielski // get the current connection of the form 118*b1cdbd2cSJim Jagielski XConnection xConn = (XConnection)UnoRuntime.queryInterface( 119*b1cdbd2cSJim Jagielski XConnection.class, xForm.getPropertyValue( "ActiveConnection" ) ); 120*b1cdbd2cSJim Jagielski // let it create a new statement 121*b1cdbd2cSJim Jagielski XStatement xStatement = xConn.createStatement(); 122*b1cdbd2cSJim Jagielski 123*b1cdbd2cSJim Jagielski // build the query string to determine a free value 124*b1cdbd2cSJim Jagielski String sStatement = composeUniqueyKeyStatement( xForm, sFieldName ); 125*b1cdbd2cSJim Jagielski 126*b1cdbd2cSJim Jagielski // execute the query 127*b1cdbd2cSJim Jagielski XResultSet xResults = xStatement.executeQuery( sStatement ); 128*b1cdbd2cSJim Jagielski 129*b1cdbd2cSJim Jagielski // move the result set to the first record 130*b1cdbd2cSJim Jagielski xResults.next( ); 131*b1cdbd2cSJim Jagielski 132*b1cdbd2cSJim Jagielski // get the value 133*b1cdbd2cSJim Jagielski XRow xRow = (XRow)UnoRuntime.queryInterface( XRow.class, xResults ); 134*b1cdbd2cSJim Jagielski int nFreeValue = xRow.getInt( 1 ); 135*b1cdbd2cSJim Jagielski 136*b1cdbd2cSJim Jagielski // dispose the temporary objects 137*b1cdbd2cSJim Jagielski FLTools.disposeComponent( xStatement ); 138*b1cdbd2cSJim Jagielski // this should get rid of the result set, too 139*b1cdbd2cSJim Jagielski 140*b1cdbd2cSJim Jagielski return nFreeValue; 141*b1cdbd2cSJim Jagielski } 142*b1cdbd2cSJim Jagielski 143*b1cdbd2cSJim Jagielski /* ------------------------------------------------------------------ */ 144*b1cdbd2cSJim Jagielski /** inserts a unique (in all conscience) key into the column given 145*b1cdbd2cSJim Jagielski @param xForm 146*b1cdbd2cSJim Jagielski the form which contains the column in question 147*b1cdbd2cSJim Jagielski @param sFieldName 148*b1cdbd2cSJim Jagielski the name of the column 149*b1cdbd2cSJim Jagielski */ insertPrimaryKey( XPropertySet xForm, String sFieldName )150*b1cdbd2cSJim Jagielski public void insertPrimaryKey( XPropertySet xForm, String sFieldName ) throws com.sun.star.uno.Exception 151*b1cdbd2cSJim Jagielski { 152*b1cdbd2cSJim Jagielski // check the privileges 153*b1cdbd2cSJim Jagielski Integer aConcurrency = (Integer)xForm.getPropertyValue( "ResultSetConcurrency" ); 154*b1cdbd2cSJim Jagielski if ( ResultSetConcurrency.READ_ONLY != aConcurrency.intValue() ) 155*b1cdbd2cSJim Jagielski { 156*b1cdbd2cSJim Jagielski // get the column object 157*b1cdbd2cSJim Jagielski XColumnsSupplier xSuppCols = (XColumnsSupplier)UnoRuntime.queryInterface( 158*b1cdbd2cSJim Jagielski XColumnsSupplier.class, xForm ); 159*b1cdbd2cSJim Jagielski XNameAccess xCols = xSuppCols.getColumns(); 160*b1cdbd2cSJim Jagielski XColumnUpdate xCol = (XColumnUpdate)UnoRuntime.queryInterface( 161*b1cdbd2cSJim Jagielski XColumnUpdate.class, xCols.getByName( sFieldName ) ); 162*b1cdbd2cSJim Jagielski 163*b1cdbd2cSJim Jagielski xCol.updateInt( generatePrimaryKey( xForm, sFieldName ) ); 164*b1cdbd2cSJim Jagielski } 165*b1cdbd2cSJim Jagielski } 166*b1cdbd2cSJim Jagielski }; 167*b1cdbd2cSJim Jagielski 168*b1cdbd2cSJim Jagielski /**************************************************************************/ 169*b1cdbd2cSJim Jagielski /** base class for helpers dealing with unique column values 170*b1cdbd2cSJim Jagielski */ 171*b1cdbd2cSJim Jagielski class KeyGeneratorForReset extends UniqueColumnValue implements XResetListener 172*b1cdbd2cSJim Jagielski { 173*b1cdbd2cSJim Jagielski /* ------------------------------------------------------------------ */ 174*b1cdbd2cSJim Jagielski private DocumentViewHelper m_aView; 175*b1cdbd2cSJim Jagielski private String m_sFieldName; 176*b1cdbd2cSJim Jagielski 177*b1cdbd2cSJim Jagielski /* ------------------------------------------------------------------ */ 178*b1cdbd2cSJim Jagielski /** ctor 179*b1cdbd2cSJim Jagielski @param aView 180*b1cdbd2cSJim Jagielski the view which shall be used to focus controls 181*b1cdbd2cSJim Jagielski @param sFieldName 182*b1cdbd2cSJim Jagielski the name of the field for which keys should be generated 183*b1cdbd2cSJim Jagielski */ KeyGeneratorForReset( String sFieldName, DocumentViewHelper aView )184*b1cdbd2cSJim Jagielski public KeyGeneratorForReset( String sFieldName, DocumentViewHelper aView ) 185*b1cdbd2cSJim Jagielski { 186*b1cdbd2cSJim Jagielski m_sFieldName = sFieldName; 187*b1cdbd2cSJim Jagielski m_aView = aView; 188*b1cdbd2cSJim Jagielski } 189*b1cdbd2cSJim Jagielski 190*b1cdbd2cSJim Jagielski /* ------------------------------------------------------------------ */ 191*b1cdbd2cSJim Jagielski /** sets the focus to the first control which is no fixed text, and not the 192*b1cdbd2cSJim Jagielski one we're defaulting 193*b1cdbd2cSJim Jagielski */ defaultNewRecordFocus( XPropertySet xForm )194*b1cdbd2cSJim Jagielski public void defaultNewRecordFocus( XPropertySet xForm ) throws com.sun.star.uno.Exception 195*b1cdbd2cSJim Jagielski { 196*b1cdbd2cSJim Jagielski XIndexAccess xFormAsContainer = (XIndexAccess)UnoRuntime.queryInterface( 197*b1cdbd2cSJim Jagielski XIndexAccess.class, xForm ); 198*b1cdbd2cSJim Jagielski for ( int i = 0; i<xFormAsContainer.getCount(); ++i ) 199*b1cdbd2cSJim Jagielski { 200*b1cdbd2cSJim Jagielski // the model 201*b1cdbd2cSJim Jagielski XPropertySet xModel = UNO.queryPropertySet( xFormAsContainer.getByIndex( i ) ); 202*b1cdbd2cSJim Jagielski 203*b1cdbd2cSJim Jagielski // check if it's a valid leaf (no sub form or such) 204*b1cdbd2cSJim Jagielski XPropertySetInfo xPSI = xModel.getPropertySetInfo( ); 205*b1cdbd2cSJim Jagielski if ( ( null == xPSI ) || !xPSI.hasPropertyByName( "ClassId" ) ) 206*b1cdbd2cSJim Jagielski continue; 207*b1cdbd2cSJim Jagielski 208*b1cdbd2cSJim Jagielski // check if it's a fixed text 209*b1cdbd2cSJim Jagielski Short nClassId = (Short)xModel.getPropertyValue( "ClassId" ); 210*b1cdbd2cSJim Jagielski if ( FormComponentType.FIXEDTEXT == nClassId.shortValue() ) 211*b1cdbd2cSJim Jagielski continue; 212*b1cdbd2cSJim Jagielski 213*b1cdbd2cSJim Jagielski // check if it is bound to the field we are responsible for 214*b1cdbd2cSJim Jagielski if ( !xPSI.hasPropertyByName( "DataField" ) ) 215*b1cdbd2cSJim Jagielski continue; 216*b1cdbd2cSJim Jagielski 217*b1cdbd2cSJim Jagielski String sFieldDataSource = (String)xModel.getPropertyValue( "DataField" ); 218*b1cdbd2cSJim Jagielski if ( sFieldDataSource.equals( m_sFieldName ) ) 219*b1cdbd2cSJim Jagielski continue; 220*b1cdbd2cSJim Jagielski 221*b1cdbd2cSJim Jagielski // both conditions do not apply 222*b1cdbd2cSJim Jagielski // -> set the focus into the respective control 223*b1cdbd2cSJim Jagielski XControlModel xCM = UNO.queryControlModel( xModel ); 224*b1cdbd2cSJim Jagielski m_aView.grabControlFocus( xCM); 225*b1cdbd2cSJim Jagielski break; 226*b1cdbd2cSJim Jagielski } 227*b1cdbd2cSJim Jagielski } 228*b1cdbd2cSJim Jagielski 229*b1cdbd2cSJim Jagielski /* ------------------------------------------------------------------ */ 230*b1cdbd2cSJim Jagielski // XResetListener overridables 231*b1cdbd2cSJim Jagielski /* ------------------------------------------------------------------ */ approveReset( com.sun.star.lang.EventObject rEvent )232*b1cdbd2cSJim Jagielski public boolean approveReset( com.sun.star.lang.EventObject rEvent ) throws com.sun.star.uno.RuntimeException 233*b1cdbd2cSJim Jagielski { 234*b1cdbd2cSJim Jagielski // not interested in vetoing this 235*b1cdbd2cSJim Jagielski return true; 236*b1cdbd2cSJim Jagielski } 237*b1cdbd2cSJim Jagielski 238*b1cdbd2cSJim Jagielski /* ------------------------------------------------------------------ */ resetted( com.sun.star.lang.EventObject aEvent )239*b1cdbd2cSJim Jagielski public void resetted( com.sun.star.lang.EventObject aEvent ) throws com.sun.star.uno.RuntimeException 240*b1cdbd2cSJim Jagielski { 241*b1cdbd2cSJim Jagielski // check if this reset occured becase we're on a new record 242*b1cdbd2cSJim Jagielski XPropertySet xFormProps = UNO.queryPropertySet( aEvent.Source ); 243*b1cdbd2cSJim Jagielski try 244*b1cdbd2cSJim Jagielski { 245*b1cdbd2cSJim Jagielski Boolean aIsNew = (Boolean)xFormProps.getPropertyValue( "IsNew" ); 246*b1cdbd2cSJim Jagielski if ( aIsNew.booleanValue() ) 247*b1cdbd2cSJim Jagielski { // yepp 248*b1cdbd2cSJim Jagielski 249*b1cdbd2cSJim Jagielski // we're going to modify the record, though after that, to the user, it should look 250*b1cdbd2cSJim Jagielski // like it has not been modified 251*b1cdbd2cSJim Jagielski // So we need to ensure that we do not change the IsModified property with whatever we do 252*b1cdbd2cSJim Jagielski Object aModifiedFlag = xFormProps.getPropertyValue( "IsModified" ); 253*b1cdbd2cSJim Jagielski 254*b1cdbd2cSJim Jagielski // now set the value 255*b1cdbd2cSJim Jagielski insertPrimaryKey( xFormProps, m_sFieldName ); 256*b1cdbd2cSJim Jagielski 257*b1cdbd2cSJim Jagielski // then restore the flag 258*b1cdbd2cSJim Jagielski xFormProps.setPropertyValue( "IsModified", aModifiedFlag ); 259*b1cdbd2cSJim Jagielski 260*b1cdbd2cSJim Jagielski // still one thing ... would be nice to have the focus in a control which is 261*b1cdbd2cSJim Jagielski // the one which's value we just defaulted 262*b1cdbd2cSJim Jagielski defaultNewRecordFocus( xFormProps ); 263*b1cdbd2cSJim Jagielski } 264*b1cdbd2cSJim Jagielski } 265*b1cdbd2cSJim Jagielski catch( com.sun.star.uno.Exception e ) 266*b1cdbd2cSJim Jagielski { 267*b1cdbd2cSJim Jagielski System.out.println(e); 268*b1cdbd2cSJim Jagielski e.printStackTrace(); 269*b1cdbd2cSJim Jagielski } 270*b1cdbd2cSJim Jagielski } 271*b1cdbd2cSJim Jagielski /* ------------------------------------------------------------------ */ 272*b1cdbd2cSJim Jagielski // XEventListener overridables 273*b1cdbd2cSJim Jagielski /* ------------------------------------------------------------------ */ disposing( EventObject aEvent )274*b1cdbd2cSJim Jagielski public void disposing( EventObject aEvent ) 275*b1cdbd2cSJim Jagielski { 276*b1cdbd2cSJim Jagielski // not interested in 277*b1cdbd2cSJim Jagielski } 278*b1cdbd2cSJim Jagielski }; 279*b1cdbd2cSJim Jagielski 280*b1cdbd2cSJim Jagielski 281*b1cdbd2cSJim Jagielski /**************************************************************************/ 282*b1cdbd2cSJim Jagielski /** base class for helpers dealing with unique column values 283*b1cdbd2cSJim Jagielski */ 284*b1cdbd2cSJim Jagielski class KeyGeneratorForUpdate extends UniqueColumnValue implements XRowSetApproveListener 285*b1cdbd2cSJim Jagielski { 286*b1cdbd2cSJim Jagielski /* ------------------------------------------------------------------ */ 287*b1cdbd2cSJim Jagielski private String m_sFieldName; 288*b1cdbd2cSJim Jagielski 289*b1cdbd2cSJim Jagielski /* ------------------------------------------------------------------ */ KeyGeneratorForUpdate( String sFieldName )290*b1cdbd2cSJim Jagielski public KeyGeneratorForUpdate( String sFieldName ) 291*b1cdbd2cSJim Jagielski { 292*b1cdbd2cSJim Jagielski m_sFieldName = sFieldName; 293*b1cdbd2cSJim Jagielski } 294*b1cdbd2cSJim Jagielski 295*b1cdbd2cSJim Jagielski /* ------------------------------------------------------------------ */ 296*b1cdbd2cSJim Jagielski // XRowSetApproveListener overridables 297*b1cdbd2cSJim Jagielski /* ------------------------------------------------------------------ */ approveCursorMove( com.sun.star.lang.EventObject aEvent )298*b1cdbd2cSJim Jagielski public boolean approveCursorMove( com.sun.star.lang.EventObject aEvent ) throws com.sun.star.uno.RuntimeException 299*b1cdbd2cSJim Jagielski { 300*b1cdbd2cSJim Jagielski // not interested in vetoing moves 301*b1cdbd2cSJim Jagielski return true; 302*b1cdbd2cSJim Jagielski } 303*b1cdbd2cSJim Jagielski 304*b1cdbd2cSJim Jagielski /* ------------------------------------------------------------------ */ approveRowChange( RowChangeEvent aEvent )305*b1cdbd2cSJim Jagielski public boolean approveRowChange( RowChangeEvent aEvent ) throws com.sun.star.uno.RuntimeException 306*b1cdbd2cSJim Jagielski { 307*b1cdbd2cSJim Jagielski if ( RowChangeAction.INSERT == aEvent.Action ) 308*b1cdbd2cSJim Jagielski { 309*b1cdbd2cSJim Jagielski try 310*b1cdbd2cSJim Jagielski { 311*b1cdbd2cSJim Jagielski // the affected form 312*b1cdbd2cSJim Jagielski XPropertySet xFormProps = UNO.queryPropertySet( aEvent.Source ); 313*b1cdbd2cSJim Jagielski // insert a new unique value 314*b1cdbd2cSJim Jagielski insertPrimaryKey( xFormProps, m_sFieldName ); 315*b1cdbd2cSJim Jagielski } 316*b1cdbd2cSJim Jagielski catch( com.sun.star.uno.Exception e ) 317*b1cdbd2cSJim Jagielski { 318*b1cdbd2cSJim Jagielski System.out.println(e); 319*b1cdbd2cSJim Jagielski e.printStackTrace(); 320*b1cdbd2cSJim Jagielski } 321*b1cdbd2cSJim Jagielski } 322*b1cdbd2cSJim Jagielski return true; 323*b1cdbd2cSJim Jagielski } 324*b1cdbd2cSJim Jagielski 325*b1cdbd2cSJim Jagielski /* ------------------------------------------------------------------ */ approveRowSetChange( com.sun.star.lang.EventObject aEvent )326*b1cdbd2cSJim Jagielski public boolean approveRowSetChange( com.sun.star.lang.EventObject aEvent ) throws com.sun.star.uno.RuntimeException 327*b1cdbd2cSJim Jagielski { 328*b1cdbd2cSJim Jagielski // not interested in vetoing executions of the row set 329*b1cdbd2cSJim Jagielski return true; 330*b1cdbd2cSJim Jagielski } 331*b1cdbd2cSJim Jagielski /* ------------------------------------------------------------------ */ 332*b1cdbd2cSJim Jagielski // XEventListener overridables 333*b1cdbd2cSJim Jagielski /* ------------------------------------------------------------------ */ disposing( EventObject aEvent )334*b1cdbd2cSJim Jagielski public void disposing( EventObject aEvent ) 335*b1cdbd2cSJim Jagielski { 336*b1cdbd2cSJim Jagielski // not interested in 337*b1cdbd2cSJim Jagielski } 338*b1cdbd2cSJim Jagielski }; 339*b1cdbd2cSJim Jagielski 340*b1cdbd2cSJim Jagielski /**************************************************************************/ 341*b1cdbd2cSJim Jagielski /** allows to generate unique keys for a field of a Form 342*b1cdbd2cSJim Jagielski */ 343*b1cdbd2cSJim Jagielski public class KeyGenerator 344*b1cdbd2cSJim Jagielski { 345*b1cdbd2cSJim Jagielski /* ------------------------------------------------------------------ */ 346*b1cdbd2cSJim Jagielski private KeyGeneratorForReset m_aResetKeyGenerator; 347*b1cdbd2cSJim Jagielski private KeyGeneratorForUpdate m_aUpdateKeyGenerator; 348*b1cdbd2cSJim Jagielski private boolean m_bResetListening; 349*b1cdbd2cSJim Jagielski private boolean m_bUpdateListening; 350*b1cdbd2cSJim Jagielski 351*b1cdbd2cSJim Jagielski private DocumentHelper m_aDocument; 352*b1cdbd2cSJim Jagielski private XPropertySet m_xForm; 353*b1cdbd2cSJim Jagielski 354*b1cdbd2cSJim Jagielski /* ------------------------------------------------------------------ */ 355*b1cdbd2cSJim Jagielski /** ctor 356*b1cdbd2cSJim Jagielski @param xForm 357*b1cdbd2cSJim Jagielski specified the form to operate on 358*b1cdbd2cSJim Jagielski @param sFieldName 359*b1cdbd2cSJim Jagielski specifies the field which's value should be manipulated 360*b1cdbd2cSJim Jagielski */ KeyGenerator( XPropertySet xForm, String sFieldName, XComponentContext xCtx )361*b1cdbd2cSJim Jagielski public KeyGenerator( XPropertySet xForm, String sFieldName, 362*b1cdbd2cSJim Jagielski XComponentContext xCtx ) 363*b1cdbd2cSJim Jagielski { 364*b1cdbd2cSJim Jagielski m_xForm = xForm; 365*b1cdbd2cSJim Jagielski 366*b1cdbd2cSJim Jagielski DocumentHelper aDocument = DocumentHelper.getDocumentForComponent( xForm, xCtx ); 367*b1cdbd2cSJim Jagielski 368*b1cdbd2cSJim Jagielski m_aResetKeyGenerator = new KeyGeneratorForReset( sFieldName, aDocument.getCurrentView() ); 369*b1cdbd2cSJim Jagielski m_aUpdateKeyGenerator = new KeyGeneratorForUpdate( sFieldName ); 370*b1cdbd2cSJim Jagielski 371*b1cdbd2cSJim Jagielski m_bResetListening = m_bUpdateListening = false; 372*b1cdbd2cSJim Jagielski } 373*b1cdbd2cSJim Jagielski 374*b1cdbd2cSJim Jagielski /* ------------------------------------------------------------------ */ 375*b1cdbd2cSJim Jagielski /** stops any actions on the form 376*b1cdbd2cSJim Jagielski */ stopGenerator( )377*b1cdbd2cSJim Jagielski public void stopGenerator( ) 378*b1cdbd2cSJim Jagielski { 379*b1cdbd2cSJim Jagielski XReset xFormReset = UNO.queryReset( m_xForm ); 380*b1cdbd2cSJim Jagielski xFormReset.removeResetListener( m_aResetKeyGenerator ); 381*b1cdbd2cSJim Jagielski 382*b1cdbd2cSJim Jagielski XRowSetApproveBroadcaster xFormBroadcaster = (XRowSetApproveBroadcaster)UnoRuntime.queryInterface( 383*b1cdbd2cSJim Jagielski XRowSetApproveBroadcaster.class, m_xForm ); 384*b1cdbd2cSJim Jagielski xFormBroadcaster.removeRowSetApproveListener( m_aUpdateKeyGenerator ); 385*b1cdbd2cSJim Jagielski 386*b1cdbd2cSJim Jagielski m_bUpdateListening = m_bResetListening = false; 387*b1cdbd2cSJim Jagielski } 388*b1cdbd2cSJim Jagielski 389*b1cdbd2cSJim Jagielski /* ------------------------------------------------------------------ */ 390*b1cdbd2cSJim Jagielski /** activates one of our two key generators 391*b1cdbd2cSJim Jagielski */ activateKeyGenerator( boolean bGenerateOnReset )392*b1cdbd2cSJim Jagielski public void activateKeyGenerator( boolean bGenerateOnReset ) 393*b1cdbd2cSJim Jagielski { 394*b1cdbd2cSJim Jagielski // for resets 395*b1cdbd2cSJim Jagielski XReset xFormReset = UNO.queryReset( m_xForm ); 396*b1cdbd2cSJim Jagielski // for approving actions 397*b1cdbd2cSJim Jagielski XRowSetApproveBroadcaster xFormBroadcaster = (XRowSetApproveBroadcaster)UnoRuntime.queryInterface( 398*b1cdbd2cSJim Jagielski XRowSetApproveBroadcaster.class, m_xForm ); 399*b1cdbd2cSJim Jagielski 400*b1cdbd2cSJim Jagielski if ( bGenerateOnReset ) 401*b1cdbd2cSJim Jagielski { 402*b1cdbd2cSJim Jagielski if ( !m_bResetListening ) 403*b1cdbd2cSJim Jagielski xFormReset.addResetListener( m_aResetKeyGenerator ); 404*b1cdbd2cSJim Jagielski if ( m_bUpdateListening ) 405*b1cdbd2cSJim Jagielski xFormBroadcaster.removeRowSetApproveListener( m_aUpdateKeyGenerator ); 406*b1cdbd2cSJim Jagielski 407*b1cdbd2cSJim Jagielski m_bUpdateListening = false; 408*b1cdbd2cSJim Jagielski m_bResetListening = true; 409*b1cdbd2cSJim Jagielski } 410*b1cdbd2cSJim Jagielski else 411*b1cdbd2cSJim Jagielski { 412*b1cdbd2cSJim Jagielski if ( m_bResetListening ) 413*b1cdbd2cSJim Jagielski xFormReset.removeResetListener( m_aResetKeyGenerator ); 414*b1cdbd2cSJim Jagielski if ( !m_bUpdateListening ) 415*b1cdbd2cSJim Jagielski xFormBroadcaster.addRowSetApproveListener( m_aUpdateKeyGenerator ); 416*b1cdbd2cSJim Jagielski 417*b1cdbd2cSJim Jagielski m_bResetListening = false; 418*b1cdbd2cSJim Jagielski m_bUpdateListening = true; 419*b1cdbd2cSJim Jagielski } 420*b1cdbd2cSJim Jagielski } 421*b1cdbd2cSJim Jagielski }; 422