1*2a97ec55SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*2a97ec55SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*2a97ec55SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*2a97ec55SAndrew Rist  * distributed with this work for additional information
6*2a97ec55SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*2a97ec55SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*2a97ec55SAndrew Rist  * "License"); you may not use this file except in compliance
9*2a97ec55SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*2a97ec55SAndrew Rist  *
11*2a97ec55SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*2a97ec55SAndrew Rist  *
13*2a97ec55SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*2a97ec55SAndrew Rist  * software distributed under the License is distributed on an
15*2a97ec55SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*2a97ec55SAndrew Rist  * KIND, either express or implied.  See the License for the
17*2a97ec55SAndrew Rist  * specific language governing permissions and limitations
18*2a97ec55SAndrew Rist  * under the License.
19*2a97ec55SAndrew Rist  *
20*2a97ec55SAndrew Rist  *************************************************************/
21*2a97ec55SAndrew Rist 
22*2a97ec55SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_extensions.hxx"
26cdf0e10cSrcweir #include "gridwizard.hxx"
27cdf0e10cSrcweir #include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
28cdf0e10cSrcweir #include <com/sun/star/sdbc/DataType.hpp>
29cdf0e10cSrcweir #include <comphelper/stl_types.hxx>
30cdf0e10cSrcweir #include <tools/string.hxx>
31cdf0e10cSrcweir #include <com/sun/star/form/XGridColumnFactory.hpp>
32cdf0e10cSrcweir #include <com/sun/star/awt/MouseWheelBehavior.hpp>
33cdf0e10cSrcweir #include <com/sun/star/container/XNameContainer.hpp>
34cdf0e10cSrcweir #include <tools/debug.hxx>
35cdf0e10cSrcweir #include "dbptools.hxx"
36cdf0e10cSrcweir #include "dbpilots.hrc"
37cdf0e10cSrcweir 
38cdf0e10cSrcweir #define GW_STATE_DATASOURCE_SELECTION	0
39cdf0e10cSrcweir #define GW_STATE_FIELDSELECTION			1
40cdf0e10cSrcweir 
41cdf0e10cSrcweir //.........................................................................
42cdf0e10cSrcweir namespace dbp
43cdf0e10cSrcweir {
44cdf0e10cSrcweir //.........................................................................
45cdf0e10cSrcweir 
46cdf0e10cSrcweir 	using namespace ::com::sun::star::uno;
47cdf0e10cSrcweir 	using namespace ::com::sun::star::lang;
48cdf0e10cSrcweir 	using namespace ::com::sun::star::beans;
49cdf0e10cSrcweir 	using namespace ::com::sun::star::sdbc;
50cdf0e10cSrcweir 	using namespace ::com::sun::star::container;
51cdf0e10cSrcweir 	using namespace ::com::sun::star::form;
52cdf0e10cSrcweir 	using namespace ::com::sun::star::awt;
53cdf0e10cSrcweir 	using namespace ::svt;
54cdf0e10cSrcweir 
55cdf0e10cSrcweir 	//=====================================================================
56cdf0e10cSrcweir 	//= OGridWizard
57cdf0e10cSrcweir 	//=====================================================================
58cdf0e10cSrcweir 	//---------------------------------------------------------------------
OGridWizard(Window * _pParent,const Reference<XPropertySet> & _rxObjectModel,const Reference<XMultiServiceFactory> & _rxORB)59cdf0e10cSrcweir 	OGridWizard::OGridWizard( Window* _pParent,
60cdf0e10cSrcweir 			const Reference< XPropertySet >& _rxObjectModel, const Reference< XMultiServiceFactory >& _rxORB )
61cdf0e10cSrcweir 		:OControlWizard(_pParent, ModuleRes(RID_DLG_GRIDWIZARD), _rxObjectModel, _rxORB)
62cdf0e10cSrcweir 		,m_bHadDataSelection(sal_True)
63cdf0e10cSrcweir 	{
64cdf0e10cSrcweir 		initControlSettings(&m_aSettings);
65cdf0e10cSrcweir 
66cdf0e10cSrcweir 		m_pPrevPage->SetHelpId(HID_GRIDWIZARD_PREVIOUS);
67cdf0e10cSrcweir 		m_pNextPage->SetHelpId(HID_GRIDWIZARD_NEXT);
68cdf0e10cSrcweir 		m_pCancel->SetHelpId(HID_GRIDWIZARD_CANCEL);
69cdf0e10cSrcweir 		m_pFinish->SetHelpId(HID_GRIDWIZARD_FINISH);
70cdf0e10cSrcweir 
71cdf0e10cSrcweir 		// if we do not need the data source selection page ...
72cdf0e10cSrcweir 		if (!needDatasourceSelection())
73cdf0e10cSrcweir 		{	// ... skip it!
74cdf0e10cSrcweir 			skip(1);
75cdf0e10cSrcweir 			m_bHadDataSelection = sal_False;
76cdf0e10cSrcweir 		}
77cdf0e10cSrcweir 	}
78cdf0e10cSrcweir 
79cdf0e10cSrcweir 	//---------------------------------------------------------------------
approveControl(sal_Int16 _nClassId)80cdf0e10cSrcweir 	sal_Bool OGridWizard::approveControl(sal_Int16 _nClassId)
81cdf0e10cSrcweir 	{
82cdf0e10cSrcweir 		if (FormComponentType::GRIDCONTROL != _nClassId)
83cdf0e10cSrcweir 			return sal_False;
84cdf0e10cSrcweir 
85cdf0e10cSrcweir 		Reference< XGridColumnFactory > xColumnFactory(getContext().xObjectModel, UNO_QUERY);
86cdf0e10cSrcweir 		if (!xColumnFactory.is())
87cdf0e10cSrcweir 			return sal_False;
88cdf0e10cSrcweir 
89cdf0e10cSrcweir 		return sal_True;
90cdf0e10cSrcweir 	}
91cdf0e10cSrcweir 
92cdf0e10cSrcweir 	//---------------------------------------------------------------------
implApplySettings()93cdf0e10cSrcweir 	void OGridWizard::implApplySettings()
94cdf0e10cSrcweir 	{
95cdf0e10cSrcweir 		const OControlWizardContext& rContext = getContext();
96cdf0e10cSrcweir 
97cdf0e10cSrcweir 		// the factory for the columns
98cdf0e10cSrcweir 		Reference< XGridColumnFactory > xColumnFactory(rContext.xObjectModel, UNO_QUERY);
99cdf0e10cSrcweir 		DBG_ASSERT(xColumnFactory.is(), "OGridWizard::implApplySettings: should never have made it 'til here!");
100cdf0e10cSrcweir 			// (if we're here, what the hell happened in approveControl??)
101cdf0e10cSrcweir 
102cdf0e10cSrcweir 		// the container for the columns
103cdf0e10cSrcweir 		Reference< XNameContainer > xColumnContainer(rContext.xObjectModel, UNO_QUERY);
104cdf0e10cSrcweir 		DBG_ASSERT(xColumnContainer.is(), "OGridWizard::implApplySettings: no container!");
105cdf0e10cSrcweir 
106cdf0e10cSrcweir 		if (!xColumnFactory.is() || !xColumnContainer.is())
107cdf0e10cSrcweir 			return;
108cdf0e10cSrcweir 
109cdf0e10cSrcweir 		static const ::rtl::OUString s_sDataFieldProperty	= ::rtl::OUString::createFromAscii("DataField");
110cdf0e10cSrcweir 		static const ::rtl::OUString s_sLabelProperty		= ::rtl::OUString::createFromAscii("Label");
111cdf0e10cSrcweir 		static const ::rtl::OUString s_sWidthProperty		= ::rtl::OUString::createFromAscii("Width");
112cdf0e10cSrcweir 		static const ::rtl::OUString s_sMouseWheelBehavior  = ::rtl::OUString::createFromAscii("MouseWheelBehavior");
113cdf0e10cSrcweir 		static const ::rtl::OUString s_sEmptyString;
114cdf0e10cSrcweir 
115cdf0e10cSrcweir 		// collect "descriptors" for the to-be-created (grid)columns
116cdf0e10cSrcweir 		DECLARE_STL_VECTOR( ::rtl::OUString, StringArray );
117cdf0e10cSrcweir 		StringArray aColumnServiceNames;	// service names to be used with the XGridColumnFactory
118cdf0e10cSrcweir 		StringArray aColumnLabelPostfixes;	// postfixes to append to the column labels
119cdf0e10cSrcweir 		StringArray aFormFieldNames;		// data field names
120cdf0e10cSrcweir 
121cdf0e10cSrcweir 		aColumnServiceNames.reserve(getSettings().aSelectedFields.getLength());
122cdf0e10cSrcweir 		aColumnLabelPostfixes.reserve(getSettings().aSelectedFields.getLength());
123cdf0e10cSrcweir 		aFormFieldNames.reserve(getSettings().aSelectedFields.getLength());
124cdf0e10cSrcweir 
125cdf0e10cSrcweir 		// loop through the selected field names
126cdf0e10cSrcweir 		const ::rtl::OUString* pSelectedFields = getSettings().aSelectedFields.getConstArray();
127cdf0e10cSrcweir 		const ::rtl::OUString* pEnd = pSelectedFields + getSettings().aSelectedFields.getLength();
128cdf0e10cSrcweir 		for (;pSelectedFields < pEnd; ++pSelectedFields)
129cdf0e10cSrcweir 		{
130cdf0e10cSrcweir 			// get the information for the selected column
131cdf0e10cSrcweir 			sal_Int32 nFieldType = DataType::OTHER;
132cdf0e10cSrcweir 			OControlWizardContext::TNameTypeMap::const_iterator aFind = rContext.aTypes.find(*pSelectedFields);
133cdf0e10cSrcweir 			if ( aFind != rContext.aTypes.end() )
134cdf0e10cSrcweir 				nFieldType = aFind->second;
135cdf0e10cSrcweir 
136cdf0e10cSrcweir 			aFormFieldNames.push_back(*pSelectedFields);
137cdf0e10cSrcweir 			switch (nFieldType)
138cdf0e10cSrcweir 			{
139cdf0e10cSrcweir 				case DataType::BIT:
140cdf0e10cSrcweir 				case DataType::BOOLEAN:
141cdf0e10cSrcweir 					aColumnServiceNames.push_back(::rtl::OUString::createFromAscii("CheckBox"));
142cdf0e10cSrcweir 					aColumnLabelPostfixes.push_back(s_sEmptyString);
143cdf0e10cSrcweir 					break;
144cdf0e10cSrcweir 
145cdf0e10cSrcweir 				case DataType::TINYINT:
146cdf0e10cSrcweir 				case DataType::SMALLINT:
147cdf0e10cSrcweir 				case DataType::INTEGER:
148cdf0e10cSrcweir 					aColumnServiceNames.push_back(::rtl::OUString::createFromAscii("NumericField"));
149cdf0e10cSrcweir 					aColumnLabelPostfixes.push_back(s_sEmptyString);
150cdf0e10cSrcweir 					break;
151cdf0e10cSrcweir 
152cdf0e10cSrcweir 				case DataType::FLOAT:
153cdf0e10cSrcweir 				case DataType::REAL:
154cdf0e10cSrcweir 				case DataType::DOUBLE:
155cdf0e10cSrcweir 				case DataType::NUMERIC:
156cdf0e10cSrcweir 				case DataType::DECIMAL:
157cdf0e10cSrcweir 					aColumnServiceNames.push_back(::rtl::OUString::createFromAscii("FormattedField"));
158cdf0e10cSrcweir 					aColumnLabelPostfixes.push_back(s_sEmptyString);
159cdf0e10cSrcweir 					break;
160cdf0e10cSrcweir 
161cdf0e10cSrcweir 				case DataType::DATE:
162cdf0e10cSrcweir 					aColumnServiceNames.push_back(::rtl::OUString::createFromAscii("DateField"));
163cdf0e10cSrcweir 					aColumnLabelPostfixes.push_back(s_sEmptyString);
164cdf0e10cSrcweir 					break;
165cdf0e10cSrcweir 
166cdf0e10cSrcweir 				case DataType::TIME:
167cdf0e10cSrcweir 					aColumnServiceNames.push_back(::rtl::OUString::createFromAscii("TimeField"));
168cdf0e10cSrcweir 					aColumnLabelPostfixes.push_back(s_sEmptyString);
169cdf0e10cSrcweir 					break;
170cdf0e10cSrcweir 
171cdf0e10cSrcweir 				case DataType::TIMESTAMP:
172cdf0e10cSrcweir 					aColumnServiceNames.push_back(::rtl::OUString::createFromAscii("DateField"));
173cdf0e10cSrcweir 					aColumnLabelPostfixes.push_back(String(ModuleRes(RID_STR_DATEPOSTFIX)));
174cdf0e10cSrcweir 
175cdf0e10cSrcweir 					aFormFieldNames.push_back(*pSelectedFields);
176cdf0e10cSrcweir 					aColumnServiceNames.push_back(::rtl::OUString::createFromAscii("TimeField"));
177cdf0e10cSrcweir 					aColumnLabelPostfixes.push_back(String(ModuleRes(RID_STR_TIMEPOSTFIX)));
178cdf0e10cSrcweir 					break;
179cdf0e10cSrcweir 
180cdf0e10cSrcweir 				default:
181cdf0e10cSrcweir 					aColumnServiceNames.push_back(::rtl::OUString::createFromAscii("TextField"));
182cdf0e10cSrcweir 					aColumnLabelPostfixes.push_back(s_sEmptyString);
183cdf0e10cSrcweir 			}
184cdf0e10cSrcweir 		}
185cdf0e10cSrcweir 
186cdf0e10cSrcweir 		DBG_ASSERT(	aFormFieldNames.size() == aColumnServiceNames.size()
187cdf0e10cSrcweir 				&&	aColumnServiceNames.size() == aColumnLabelPostfixes.size(),
188cdf0e10cSrcweir 				"OGridWizard::implApplySettings: inconsistent descriptor sequences!");
189cdf0e10cSrcweir 
190cdf0e10cSrcweir 		// now loop through the descriptions and create the (grid)columns out of th descriptors
191cdf0e10cSrcweir 		{
192cdf0e10cSrcweir 			Reference< XNameAccess > xExistenceChecker(xColumnContainer.get());
193cdf0e10cSrcweir 
194cdf0e10cSrcweir 			ConstStringArrayIterator pColumnServiceName = aColumnServiceNames.begin();
195cdf0e10cSrcweir 			ConstStringArrayIterator pColumnLabelPostfix = aColumnLabelPostfixes.begin();
196cdf0e10cSrcweir 			ConstStringArrayIterator pFormFieldName = aFormFieldNames.begin();
197cdf0e10cSrcweir 			ConstStringArrayIterator pColumnServiceNameEnd = aColumnServiceNames.end();
198cdf0e10cSrcweir 
199cdf0e10cSrcweir 			for (;pColumnServiceName < pColumnServiceNameEnd; ++pColumnServiceName, ++pColumnLabelPostfix, ++pFormFieldName)
200cdf0e10cSrcweir 			{
201cdf0e10cSrcweir 				// create a (grid)column for the (resultset)column
202cdf0e10cSrcweir 				try
203cdf0e10cSrcweir 				{
204cdf0e10cSrcweir 					Reference< XPropertySet > xColumn( xColumnFactory->createColumn(*pColumnServiceName), UNO_SET_THROW );
205cdf0e10cSrcweir 					Reference< XPropertySetInfo > xColumnPSI( xColumn->getPropertySetInfo(), UNO_SET_THROW );
206cdf0e10cSrcweir 
207cdf0e10cSrcweir 					::rtl::OUString sColumnName(*pColumnServiceName);
208cdf0e10cSrcweir 					disambiguateName(xExistenceChecker, sColumnName);
209cdf0e10cSrcweir 
210cdf0e10cSrcweir 					// the data field the column should be bound to
211cdf0e10cSrcweir 					xColumn->setPropertyValue(s_sDataFieldProperty, makeAny(*pFormFieldName));
212cdf0e10cSrcweir 					// the label
213cdf0e10cSrcweir 					xColumn->setPropertyValue(s_sLabelProperty, makeAny(::rtl::OUString(*pFormFieldName) += *pColumnLabelPostfix));
214cdf0e10cSrcweir 					// the width (<void/> => column will be auto-sized)
215cdf0e10cSrcweir 					xColumn->setPropertyValue(s_sWidthProperty, Any());
216cdf0e10cSrcweir 
217cdf0e10cSrcweir 					if ( xColumnPSI->hasPropertyByName( s_sMouseWheelBehavior ) )
218cdf0e10cSrcweir 						xColumn->setPropertyValue( s_sMouseWheelBehavior, makeAny( MouseWheelBehavior::SCROLL_DISABLED ) );
219cdf0e10cSrcweir 
220cdf0e10cSrcweir 					// insert the column
221cdf0e10cSrcweir 					xColumnContainer->insertByName(sColumnName, makeAny(xColumn));
222cdf0e10cSrcweir 				}
223cdf0e10cSrcweir 				catch(Exception&)
224cdf0e10cSrcweir 				{
225cdf0e10cSrcweir 					DBG_ERROR(	::rtl::OString("OGridWizard::implApplySettings: unexpected exception while creating the grid column for field ")
226cdf0e10cSrcweir 							+=	::rtl::OString(pFormFieldName->getStr(), pFormFieldName->getLength(), gsl_getSystemTextEncoding())
227cdf0e10cSrcweir 							+=	::rtl::OString("!"));
228cdf0e10cSrcweir 				}
229cdf0e10cSrcweir 			}
230cdf0e10cSrcweir 		}
231cdf0e10cSrcweir 	}
232cdf0e10cSrcweir 
233cdf0e10cSrcweir 	//---------------------------------------------------------------------
createPage(WizardState _nState)234cdf0e10cSrcweir 	OWizardPage* OGridWizard::createPage(WizardState _nState)
235cdf0e10cSrcweir 	{
236cdf0e10cSrcweir 		switch (_nState)
237cdf0e10cSrcweir 		{
238cdf0e10cSrcweir 			case GW_STATE_DATASOURCE_SELECTION:
239cdf0e10cSrcweir 				return new OTableSelectionPage(this);
240cdf0e10cSrcweir 			case GW_STATE_FIELDSELECTION:
241cdf0e10cSrcweir 				return new OGridFieldsSelection(this);
242cdf0e10cSrcweir 		}
243cdf0e10cSrcweir 
244cdf0e10cSrcweir 		return NULL;
245cdf0e10cSrcweir 	}
246cdf0e10cSrcweir 
247cdf0e10cSrcweir 	//---------------------------------------------------------------------
determineNextState(WizardState _nCurrentState) const248cdf0e10cSrcweir 	WizardTypes::WizardState OGridWizard::determineNextState( WizardState _nCurrentState ) const
249cdf0e10cSrcweir 	{
250cdf0e10cSrcweir 		switch (_nCurrentState)
251cdf0e10cSrcweir 		{
252cdf0e10cSrcweir 			case GW_STATE_DATASOURCE_SELECTION:
253cdf0e10cSrcweir 				return GW_STATE_FIELDSELECTION;
254cdf0e10cSrcweir 			case GW_STATE_FIELDSELECTION:
255cdf0e10cSrcweir 				return WZS_INVALID_STATE;
256cdf0e10cSrcweir 		}
257cdf0e10cSrcweir 
258cdf0e10cSrcweir 		return WZS_INVALID_STATE;
259cdf0e10cSrcweir 	}
260cdf0e10cSrcweir 
261cdf0e10cSrcweir 	//---------------------------------------------------------------------
enterState(WizardState _nState)262cdf0e10cSrcweir 	void OGridWizard::enterState(WizardState _nState)
263cdf0e10cSrcweir 	{
264cdf0e10cSrcweir 		OControlWizard::enterState(_nState);
265cdf0e10cSrcweir 
266cdf0e10cSrcweir 		enableButtons(WZB_PREVIOUS, m_bHadDataSelection ? (GW_STATE_DATASOURCE_SELECTION < _nState) : GW_STATE_FIELDSELECTION < _nState);
267cdf0e10cSrcweir 		enableButtons(WZB_NEXT, GW_STATE_FIELDSELECTION != _nState);
268cdf0e10cSrcweir 		if (_nState < GW_STATE_FIELDSELECTION)
269cdf0e10cSrcweir 			enableButtons(WZB_FINISH, sal_False);
270cdf0e10cSrcweir 
271cdf0e10cSrcweir 		if (GW_STATE_FIELDSELECTION == _nState)
272cdf0e10cSrcweir 			defaultButton(WZB_FINISH);
273cdf0e10cSrcweir 	}
274cdf0e10cSrcweir 
275cdf0e10cSrcweir 	//---------------------------------------------------------------------
leaveState(WizardState _nState)276cdf0e10cSrcweir 	sal_Bool OGridWizard::leaveState(WizardState _nState)
277cdf0e10cSrcweir 	{
278cdf0e10cSrcweir 		if (!OControlWizard::leaveState(_nState))
279cdf0e10cSrcweir 			return sal_False;
280cdf0e10cSrcweir 
281cdf0e10cSrcweir 		if (GW_STATE_FIELDSELECTION == _nState)
282cdf0e10cSrcweir 			defaultButton(WZB_NEXT);
283cdf0e10cSrcweir 
284cdf0e10cSrcweir 		return sal_True;
285cdf0e10cSrcweir 	}
286cdf0e10cSrcweir 
287cdf0e10cSrcweir 	//---------------------------------------------------------------------
onFinish()288cdf0e10cSrcweir 	sal_Bool OGridWizard::onFinish()
289cdf0e10cSrcweir 	{
290cdf0e10cSrcweir 		if ( !OControlWizard::onFinish() )
291cdf0e10cSrcweir 			return sal_False;
292cdf0e10cSrcweir 
293cdf0e10cSrcweir 		implApplySettings();
294cdf0e10cSrcweir 
295cdf0e10cSrcweir 		return sal_True;
296cdf0e10cSrcweir 	}
297cdf0e10cSrcweir 
298cdf0e10cSrcweir 	//=====================================================================
299cdf0e10cSrcweir 	//= OGridFieldsSelection
300cdf0e10cSrcweir 	//=====================================================================
301cdf0e10cSrcweir 	//---------------------------------------------------------------------
OGridFieldsSelection(OGridWizard * _pParent)302cdf0e10cSrcweir 	OGridFieldsSelection::OGridFieldsSelection( OGridWizard* _pParent )
303cdf0e10cSrcweir 		:OGridPage(_pParent, ModuleRes(RID_PAGE_GW_FIELDSELECTION))
304cdf0e10cSrcweir 		,m_aFrame				(this, ModuleRes(FL_FRAME))
305cdf0e10cSrcweir 		,m_aExistFieldsLabel	(this, ModuleRes(FT_EXISTING_FIELDS))
306cdf0e10cSrcweir 		,m_aExistFields			(this, ModuleRes(LB_EXISTING_FIELDS))
307cdf0e10cSrcweir 		,m_aSelectOne			(this, ModuleRes(PB_FIELDRIGHT))
308cdf0e10cSrcweir 		,m_aSelectAll			(this, ModuleRes(PB_ALLFIELDSRIGHT))
309cdf0e10cSrcweir 		,m_aDeselectOne			(this, ModuleRes(PB_FIELDLEFT))
310cdf0e10cSrcweir 		,m_aDeselectAll			(this, ModuleRes(PB_ALLFIELDSLEFT))
311cdf0e10cSrcweir 		,m_aSelFieldsLabel		(this, ModuleRes(FT_SELECTED_FIELDS))
312cdf0e10cSrcweir 		,m_aSelFields			(this, ModuleRes(LB_SELECTED_FIELDS))
313cdf0e10cSrcweir 	{
314cdf0e10cSrcweir 		FreeResource();
315cdf0e10cSrcweir 
316cdf0e10cSrcweir 		enableFormDatasourceDisplay();
317cdf0e10cSrcweir 
318cdf0e10cSrcweir 		m_aSelectOne.SetClickHdl(LINK(this, OGridFieldsSelection, OnMoveOneEntry));
319cdf0e10cSrcweir 		m_aSelectAll.SetClickHdl(LINK(this, OGridFieldsSelection, OnMoveAllEntries));
320cdf0e10cSrcweir 		m_aDeselectOne.SetClickHdl(LINK(this, OGridFieldsSelection, OnMoveOneEntry));
321cdf0e10cSrcweir 		m_aDeselectAll.SetClickHdl(LINK(this, OGridFieldsSelection, OnMoveAllEntries));
322cdf0e10cSrcweir 
323cdf0e10cSrcweir 		m_aExistFields.SetSelectHdl(LINK(this, OGridFieldsSelection, OnEntrySelected));
324cdf0e10cSrcweir 		m_aSelFields.SetSelectHdl(LINK(this, OGridFieldsSelection, OnEntrySelected));
325cdf0e10cSrcweir 		m_aExistFields.SetDoubleClickHdl(LINK(this, OGridFieldsSelection, OnEntryDoubleClicked));
326cdf0e10cSrcweir 		m_aSelFields.SetDoubleClickHdl(LINK(this, OGridFieldsSelection, OnEntryDoubleClicked));
327cdf0e10cSrcweir 	}
328cdf0e10cSrcweir 
329cdf0e10cSrcweir 	//---------------------------------------------------------------------
ActivatePage()330cdf0e10cSrcweir 	void OGridFieldsSelection::ActivatePage()
331cdf0e10cSrcweir 	{
332cdf0e10cSrcweir 		OGridPage::ActivatePage();
333cdf0e10cSrcweir 		m_aExistFields.GrabFocus();
334cdf0e10cSrcweir 	}
335cdf0e10cSrcweir 
336cdf0e10cSrcweir 	//---------------------------------------------------------------------
canAdvance() const337cdf0e10cSrcweir 	bool OGridFieldsSelection::canAdvance() const
338cdf0e10cSrcweir 	{
339cdf0e10cSrcweir 		return false;
340cdf0e10cSrcweir 			// we're the last page in our wizard
341cdf0e10cSrcweir 	}
342cdf0e10cSrcweir 
343cdf0e10cSrcweir 	//---------------------------------------------------------------------
initializePage()344cdf0e10cSrcweir 	void OGridFieldsSelection::initializePage()
345cdf0e10cSrcweir 	{
346cdf0e10cSrcweir 		OGridPage::initializePage();
347cdf0e10cSrcweir 
348cdf0e10cSrcweir 		const OControlWizardContext& rContext = getContext();
349cdf0e10cSrcweir 		fillListBox(m_aExistFields, rContext.aFieldNames);
350cdf0e10cSrcweir 
351cdf0e10cSrcweir 		m_aSelFields.Clear();
352cdf0e10cSrcweir 		const OGridSettings& rSettings = getSettings();
353cdf0e10cSrcweir 		const ::rtl::OUString* pSelected = rSettings.aSelectedFields.getConstArray();
354cdf0e10cSrcweir 		const ::rtl::OUString* pEnd = pSelected + rSettings.aSelectedFields.getLength();
355cdf0e10cSrcweir 		for (; pSelected < pEnd; ++pSelected)
356cdf0e10cSrcweir 		{
357cdf0e10cSrcweir 			m_aSelFields.InsertEntry(*pSelected);
358cdf0e10cSrcweir 			m_aExistFields.RemoveEntry(*pSelected);
359cdf0e10cSrcweir 		}
360cdf0e10cSrcweir 
361cdf0e10cSrcweir 		implCheckButtons();
362cdf0e10cSrcweir 	}
363cdf0e10cSrcweir 
364cdf0e10cSrcweir 	//---------------------------------------------------------------------
commitPage(::svt::WizardTypes::CommitPageReason _eReason)365cdf0e10cSrcweir 	sal_Bool OGridFieldsSelection::commitPage( ::svt::WizardTypes::CommitPageReason _eReason )
366cdf0e10cSrcweir 	{
367cdf0e10cSrcweir 		if (!OGridPage::commitPage(_eReason))
368cdf0e10cSrcweir 			return sal_False;
369cdf0e10cSrcweir 
370cdf0e10cSrcweir 		OGridSettings& rSettings = getSettings();
371cdf0e10cSrcweir 		sal_uInt16 nSelected = m_aSelFields.GetEntryCount();
372cdf0e10cSrcweir 
373cdf0e10cSrcweir 		rSettings.aSelectedFields.realloc(nSelected);
374cdf0e10cSrcweir 		::rtl::OUString* pSelected = rSettings.aSelectedFields.getArray();
375cdf0e10cSrcweir 
376cdf0e10cSrcweir 		for (sal_uInt16 i=0; i<nSelected; ++i, ++pSelected)
377cdf0e10cSrcweir 			*pSelected = m_aSelFields.GetEntry(i);
378cdf0e10cSrcweir 
379cdf0e10cSrcweir 		return sal_True;
380cdf0e10cSrcweir 	}
381cdf0e10cSrcweir 
382cdf0e10cSrcweir 	//---------------------------------------------------------------------
implCheckButtons()383cdf0e10cSrcweir 	void OGridFieldsSelection::implCheckButtons()
384cdf0e10cSrcweir 	{
385cdf0e10cSrcweir 		m_aSelectOne.Enable(m_aExistFields.GetSelectEntryCount() != 0);
386cdf0e10cSrcweir 		m_aSelectAll.Enable(m_aExistFields.GetEntryCount() != 0);
387cdf0e10cSrcweir 
388cdf0e10cSrcweir 		m_aDeselectOne.Enable(m_aSelFields.GetSelectEntryCount() != 0);
389cdf0e10cSrcweir 		m_aDeselectAll.Enable(m_aSelFields.GetEntryCount() != 0);
390cdf0e10cSrcweir 
391cdf0e10cSrcweir 		getDialog()->enableButtons(WZB_FINISH, 0 != m_aSelFields.GetEntryCount());
392cdf0e10cSrcweir 	}
393cdf0e10cSrcweir 
394cdf0e10cSrcweir 	//---------------------------------------------------------------------
IMPL_LINK(OGridFieldsSelection,OnEntryDoubleClicked,ListBox *,_pList)395cdf0e10cSrcweir 	IMPL_LINK(OGridFieldsSelection, OnEntryDoubleClicked, ListBox*, _pList)
396cdf0e10cSrcweir 	{
397cdf0e10cSrcweir 		PushButton* pSimulateButton = &m_aExistFields == _pList ? &m_aSelectOne : &m_aDeselectOne;
398cdf0e10cSrcweir 		if (pSimulateButton->IsEnabled())
399cdf0e10cSrcweir 			return OnMoveOneEntry( pSimulateButton );
400cdf0e10cSrcweir 		else
401cdf0e10cSrcweir 			return 1L;
402cdf0e10cSrcweir 	}
403cdf0e10cSrcweir 
404cdf0e10cSrcweir 	//---------------------------------------------------------------------
405cdf0e10cSrcweir 	IMPL_LINK(OGridFieldsSelection, OnEntrySelected, ListBox*, /*NOTINTERESTEDIN*/)
406cdf0e10cSrcweir 	{
407cdf0e10cSrcweir 		implCheckButtons();
408cdf0e10cSrcweir 		return 0L;
409cdf0e10cSrcweir 	}
410cdf0e10cSrcweir 
411cdf0e10cSrcweir 	//---------------------------------------------------------------------
IMPL_LINK(OGridFieldsSelection,OnMoveOneEntry,PushButton *,_pButton)412cdf0e10cSrcweir 	IMPL_LINK(OGridFieldsSelection, OnMoveOneEntry, PushButton*, _pButton)
413cdf0e10cSrcweir 	{
414cdf0e10cSrcweir 		sal_Bool bMoveRight = (&m_aSelectOne == _pButton);
415cdf0e10cSrcweir 		ListBox& rMoveTo = bMoveRight ? m_aSelFields : m_aExistFields;
416cdf0e10cSrcweir 
417cdf0e10cSrcweir 		// the index of the selected entry
418cdf0e10cSrcweir 		sal_uInt16 nSelected = bMoveRight ? m_aExistFields.GetSelectEntryPos() : m_aSelFields.GetSelectEntryPos();
419cdf0e10cSrcweir 		// the (original) relative position of the entry
420cdf0e10cSrcweir 		sal_IntPtr nRelativeIndex = reinterpret_cast<sal_IntPtr>(bMoveRight ? m_aExistFields.GetEntryData(nSelected) : m_aSelFields.GetEntryData(nSelected));
421cdf0e10cSrcweir 
422cdf0e10cSrcweir 		sal_uInt16 nInsertPos = LISTBOX_APPEND;
423cdf0e10cSrcweir 		if (!bMoveRight)
424cdf0e10cSrcweir 		{	// need to determine an insert pos which reflects the original
425cdf0e10cSrcweir 			nInsertPos = 0;
426cdf0e10cSrcweir 			while (nInsertPos < rMoveTo.GetEntryCount())
427cdf0e10cSrcweir 			{
428cdf0e10cSrcweir 				if (reinterpret_cast<sal_IntPtr>(rMoveTo.GetEntryData(nInsertPos)) > nRelativeIndex)
429cdf0e10cSrcweir 					break;
430cdf0e10cSrcweir 				++nInsertPos;
431cdf0e10cSrcweir 			}
432cdf0e10cSrcweir 		}
433cdf0e10cSrcweir 
434cdf0e10cSrcweir 		// the text of the entry to move
435cdf0e10cSrcweir 		String sMovingEntry = bMoveRight ? m_aExistFields.GetEntry(nSelected) : m_aSelFields.GetEntry(nSelected);
436cdf0e10cSrcweir 
437cdf0e10cSrcweir 		// insert the entry
438cdf0e10cSrcweir 		nInsertPos = rMoveTo.InsertEntry(sMovingEntry, nInsertPos);
439cdf0e10cSrcweir 		// preserve it's "relative position" entry data
440cdf0e10cSrcweir 		rMoveTo.SetEntryData(nInsertPos, reinterpret_cast<void*>(nRelativeIndex));
441cdf0e10cSrcweir 
442cdf0e10cSrcweir 		// remove the entry from it's old list
443cdf0e10cSrcweir 		if (bMoveRight)
444cdf0e10cSrcweir 		{
445cdf0e10cSrcweir 			sal_uInt16 nSelectPos = m_aExistFields.GetSelectEntryPos();
446cdf0e10cSrcweir 			m_aExistFields.RemoveEntry(nSelected);
447cdf0e10cSrcweir 			if ((LISTBOX_ENTRY_NOTFOUND != nSelectPos) && (nSelectPos < m_aExistFields.GetEntryCount()))
448cdf0e10cSrcweir 				m_aExistFields.SelectEntryPos(nSelectPos);
449cdf0e10cSrcweir 
450cdf0e10cSrcweir 			m_aExistFields.GrabFocus();
451cdf0e10cSrcweir 		}
452cdf0e10cSrcweir 		else
453cdf0e10cSrcweir 		{
454cdf0e10cSrcweir 			sal_uInt16 nSelectPos = m_aSelFields.GetSelectEntryPos();
455cdf0e10cSrcweir 			m_aSelFields.RemoveEntry(nSelected);
456cdf0e10cSrcweir 			if ((LISTBOX_ENTRY_NOTFOUND != nSelectPos) && (nSelectPos < m_aSelFields.GetEntryCount()))
457cdf0e10cSrcweir 				m_aSelFields.SelectEntryPos(nSelectPos);
458cdf0e10cSrcweir 
459cdf0e10cSrcweir 			m_aSelFields.GrabFocus();
460cdf0e10cSrcweir 		}
461cdf0e10cSrcweir 
462cdf0e10cSrcweir 		implCheckButtons();
463cdf0e10cSrcweir 		return 0;
464cdf0e10cSrcweir 	}
465cdf0e10cSrcweir 
466cdf0e10cSrcweir 	//---------------------------------------------------------------------
IMPL_LINK(OGridFieldsSelection,OnMoveAllEntries,PushButton *,_pButton)467cdf0e10cSrcweir 	IMPL_LINK(OGridFieldsSelection, OnMoveAllEntries, PushButton*, _pButton)
468cdf0e10cSrcweir 	{
469cdf0e10cSrcweir 		sal_Bool bMoveRight = (&m_aSelectAll == _pButton);
470cdf0e10cSrcweir 		m_aExistFields.Clear();
471cdf0e10cSrcweir 		m_aSelFields.Clear();
472cdf0e10cSrcweir 		fillListBox(bMoveRight ? m_aSelFields : m_aExistFields, getContext().aFieldNames);
473cdf0e10cSrcweir 
474cdf0e10cSrcweir 		implCheckButtons();
475cdf0e10cSrcweir 		return 0;
476cdf0e10cSrcweir 	}
477cdf0e10cSrcweir 
478cdf0e10cSrcweir //.........................................................................
479cdf0e10cSrcweir }	// namespace dbp
480cdf0e10cSrcweir //.........................................................................
481cdf0e10cSrcweir 
482