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