xref: /aoo4110/main/svx/source/form/fmvwimp.cxx (revision b1cdbd2c)
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 // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_svx.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include "fmdocumentclassification.hxx"
28*b1cdbd2cSJim Jagielski #include "fmobj.hxx"
29*b1cdbd2cSJim Jagielski #include "fmpgeimp.hxx"
30*b1cdbd2cSJim Jagielski #include "fmprop.hrc"
31*b1cdbd2cSJim Jagielski #include "svx/fmresids.hrc"
32*b1cdbd2cSJim Jagielski #include "fmservs.hxx"
33*b1cdbd2cSJim Jagielski #include "fmshimp.hxx"
34*b1cdbd2cSJim Jagielski #include "svx/fmtools.hxx"
35*b1cdbd2cSJim Jagielski #include "fmundo.hxx"
36*b1cdbd2cSJim Jagielski #include "fmvwimp.hxx"
37*b1cdbd2cSJim Jagielski #include "formcontrolfactory.hxx"
38*b1cdbd2cSJim Jagielski #include "svx/sdrpaintwindow.hxx"
39*b1cdbd2cSJim Jagielski #include "svx/svditer.hxx"
40*b1cdbd2cSJim Jagielski #include "svx/dataaccessdescriptor.hxx"
41*b1cdbd2cSJim Jagielski #include "svx/dialmgr.hxx"
42*b1cdbd2cSJim Jagielski #include "svx/fmglob.hxx"
43*b1cdbd2cSJim Jagielski #include "svx/fmmodel.hxx"
44*b1cdbd2cSJim Jagielski #include "svx/fmpage.hxx"
45*b1cdbd2cSJim Jagielski #include "svx/fmshell.hxx"
46*b1cdbd2cSJim Jagielski #include "svx/fmview.hxx"
47*b1cdbd2cSJim Jagielski #include "svx/sdrpagewindow.hxx"
48*b1cdbd2cSJim Jagielski #include "svx/svdogrp.hxx"
49*b1cdbd2cSJim Jagielski #include "svx/svdpagv.hxx"
50*b1cdbd2cSJim Jagielski #include "svx/xmlexchg.hxx"
51*b1cdbd2cSJim Jagielski 
52*b1cdbd2cSJim Jagielski /** === begin UNO includes === **/
53*b1cdbd2cSJim Jagielski #include <com/sun/star/ui/dialogs/XExecutableDialog.hpp>
54*b1cdbd2cSJim Jagielski #include <com/sun/star/style/VerticalAlignment.hpp>
55*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XInitialization.hpp>
56*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbc/XRowSet.hpp>
57*b1cdbd2cSJim Jagielski #include <com/sun/star/form/XLoadable.hpp>
58*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/VisualEffect.hpp>
59*b1cdbd2cSJim Jagielski #include <com/sun/star/util/XNumberFormatsSupplier.hpp>
60*b1cdbd2cSJim Jagielski #include <com/sun/star/util/XNumberFormats.hpp>
61*b1cdbd2cSJim Jagielski #include <com/sun/star/sdb/CommandType.hpp>
62*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbc/DataType.hpp>
63*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbc/ColumnValue.hpp>
64*b1cdbd2cSJim Jagielski #include <com/sun/star/form/FormComponentType.hpp>
65*b1cdbd2cSJim Jagielski #include <com/sun/star/form/FormButtonType.hpp>
66*b1cdbd2cSJim Jagielski #include <com/sun/star/form/XReset.hpp>
67*b1cdbd2cSJim Jagielski #include <com/sun/star/form/binding/XBindableValue.hpp>
68*b1cdbd2cSJim Jagielski #include <com/sun/star/form/binding/XValueBinding.hpp>
69*b1cdbd2cSJim Jagielski #include <com/sun/star/form/submission/XSubmissionSupplier.hpp>
70*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/XTabControllerModel.hpp>
71*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/XControlContainer.hpp>
72*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/XTabController.hpp>
73*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XIndexAccess.hpp>
74*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/XControl.hpp>
75*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XUnoTunnel.hpp>
76*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbcx/XTablesSupplier.hpp>
77*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbc/XPreparedStatement.hpp>
78*b1cdbd2cSJim Jagielski #include <com/sun/star/sdb/XQueriesSupplier.hpp>
79*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XContainer.hpp>
80*b1cdbd2cSJim Jagielski /** === end UNO includes === **/
81*b1cdbd2cSJim Jagielski 
82*b1cdbd2cSJim Jagielski #include <comphelper/enumhelper.hxx>
83*b1cdbd2cSJim Jagielski #include <comphelper/extract.hxx>
84*b1cdbd2cSJim Jagielski #include <comphelper/namedvaluecollection.hxx>
85*b1cdbd2cSJim Jagielski #include <comphelper/numbers.hxx>
86*b1cdbd2cSJim Jagielski #include <comphelper/property.hxx>
87*b1cdbd2cSJim Jagielski #include <cppuhelper/exc_hlp.hxx>
88*b1cdbd2cSJim Jagielski #include <unotools/moduleoptions.hxx>
89*b1cdbd2cSJim Jagielski #include <tools/diagnose_ex.h>
90*b1cdbd2cSJim Jagielski #include <vcl/msgbox.hxx>
91*b1cdbd2cSJim Jagielski #include <vcl/stdtext.hxx>
92*b1cdbd2cSJim Jagielski #include <vos/mutex.hxx>
93*b1cdbd2cSJim Jagielski #include <rtl/logfile.hxx>
94*b1cdbd2cSJim Jagielski 
95*b1cdbd2cSJim Jagielski #include <algorithm>
96*b1cdbd2cSJim Jagielski 
97*b1cdbd2cSJim Jagielski using namespace ::comphelper;
98*b1cdbd2cSJim Jagielski using namespace ::svx;
99*b1cdbd2cSJim Jagielski using namespace ::svxform;
100*b1cdbd2cSJim Jagielski 
101*b1cdbd2cSJim Jagielski     using namespace ::com::sun::star;
102*b1cdbd2cSJim Jagielski     /** === begin UNO using === **/
103*b1cdbd2cSJim Jagielski     using ::com::sun::star::uno::Exception;
104*b1cdbd2cSJim Jagielski     using ::com::sun::star::uno::RuntimeException;
105*b1cdbd2cSJim Jagielski     using ::com::sun::star::uno::XInterface;
106*b1cdbd2cSJim Jagielski     using ::com::sun::star::uno::Sequence;
107*b1cdbd2cSJim Jagielski     using ::com::sun::star::uno::UNO_QUERY;
108*b1cdbd2cSJim Jagielski     using ::com::sun::star::uno::UNO_QUERY_THROW;
109*b1cdbd2cSJim Jagielski     using ::com::sun::star::uno::UNO_SET_THROW;
110*b1cdbd2cSJim Jagielski     using ::com::sun::star::uno::Type;
111*b1cdbd2cSJim Jagielski     using ::com::sun::star::uno::Reference;
112*b1cdbd2cSJim Jagielski     using ::com::sun::star::uno::Any;
113*b1cdbd2cSJim Jagielski     using ::com::sun::star::uno::makeAny;
114*b1cdbd2cSJim Jagielski     using ::com::sun::star::style::VerticalAlignment_MIDDLE;
115*b1cdbd2cSJim Jagielski     using ::com::sun::star::form::FormButtonType_SUBMIT;
116*b1cdbd2cSJim Jagielski     using ::com::sun::star::form::binding::XValueBinding;
117*b1cdbd2cSJim Jagielski     using ::com::sun::star::form::binding::XBindableValue;
118*b1cdbd2cSJim Jagielski     using ::com::sun::star::lang::XComponent;
119*b1cdbd2cSJim Jagielski     using ::com::sun::star::container::XIndexAccess;
120*b1cdbd2cSJim Jagielski     using ::com::sun::star::form::XForm;
121*b1cdbd2cSJim Jagielski     using ::com::sun::star::form::runtime::XFormController;
122*b1cdbd2cSJim Jagielski     using ::com::sun::star::script::XEventAttacherManager;
123*b1cdbd2cSJim Jagielski     using ::com::sun::star::awt::XTabControllerModel;
124*b1cdbd2cSJim Jagielski     using ::com::sun::star::container::XChild;
125*b1cdbd2cSJim Jagielski     using ::com::sun::star::container::XEnumeration;
126*b1cdbd2cSJim Jagielski     using ::com::sun::star::task::XInteractionHandler;
127*b1cdbd2cSJim Jagielski     using ::com::sun::star::lang::XInitialization;
128*b1cdbd2cSJim Jagielski     using ::com::sun::star::awt::XTabController;
129*b1cdbd2cSJim Jagielski     using ::com::sun::star::lang::XUnoTunnel;
130*b1cdbd2cSJim Jagielski     using ::com::sun::star::awt::XControlContainer;
131*b1cdbd2cSJim Jagielski     using ::com::sun::star::awt::XControl;
132*b1cdbd2cSJim Jagielski     using ::com::sun::star::form::XFormComponent;
133*b1cdbd2cSJim Jagielski     using ::com::sun::star::form::XForm;
134*b1cdbd2cSJim Jagielski     using ::com::sun::star::lang::IndexOutOfBoundsException;
135*b1cdbd2cSJim Jagielski     using ::com::sun::star::lang::WrappedTargetException;
136*b1cdbd2cSJim Jagielski     using ::com::sun::star::container::XContainer;
137*b1cdbd2cSJim Jagielski     using ::com::sun::star::container::ContainerEvent;
138*b1cdbd2cSJim Jagielski     using ::com::sun::star::lang::EventObject;
139*b1cdbd2cSJim Jagielski     using ::com::sun::star::beans::NamedValue;
140*b1cdbd2cSJim Jagielski     using ::com::sun::star::sdb::SQLErrorEvent;
141*b1cdbd2cSJim Jagielski     using ::com::sun::star::sdbc::XRowSet;
142*b1cdbd2cSJim Jagielski     using ::com::sun::star::beans::XPropertySet;
143*b1cdbd2cSJim Jagielski     using ::com::sun::star::container::XElementAccess;
144*b1cdbd2cSJim Jagielski     using ::com::sun::star::awt::XWindow;
145*b1cdbd2cSJim Jagielski     using ::com::sun::star::awt::FocusEvent;
146*b1cdbd2cSJim Jagielski     using ::com::sun::star::ui::dialogs::XExecutableDialog;
147*b1cdbd2cSJim Jagielski     using ::com::sun::star::sdbc::XDataSource;
148*b1cdbd2cSJim Jagielski     using ::com::sun::star::container::XIndexContainer;
149*b1cdbd2cSJim Jagielski     using ::com::sun::star::sdbc::XConnection;
150*b1cdbd2cSJim Jagielski     using ::com::sun::star::container::XNameAccess;
151*b1cdbd2cSJim Jagielski     using ::com::sun::star::sdb::SQLContext;
152*b1cdbd2cSJim Jagielski     using ::com::sun::star::sdbc::SQLWarning;
153*b1cdbd2cSJim Jagielski     using ::com::sun::star::sdbc::SQLException;
154*b1cdbd2cSJim Jagielski     using ::com::sun::star::util::XNumberFormatsSupplier;
155*b1cdbd2cSJim Jagielski     using ::com::sun::star::util::XNumberFormats;
156*b1cdbd2cSJim Jagielski     using ::com::sun::star::beans::XPropertySetInfo;
157*b1cdbd2cSJim Jagielski     /** === end UNO using === **/
158*b1cdbd2cSJim Jagielski     namespace FormComponentType = ::com::sun::star::form::FormComponentType;
159*b1cdbd2cSJim Jagielski     namespace CommandType = ::com::sun::star::sdb::CommandType;
160*b1cdbd2cSJim Jagielski     namespace DataType = ::com::sun::star::sdbc::DataType;
161*b1cdbd2cSJim Jagielski 
162*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
163*b1cdbd2cSJim Jagielski class FmXFormView::ObjectRemoveListener : public SfxListener
164*b1cdbd2cSJim Jagielski {
165*b1cdbd2cSJim Jagielski 	FmXFormView* m_pParent;
166*b1cdbd2cSJim Jagielski public:
167*b1cdbd2cSJim Jagielski 	ObjectRemoveListener( FmXFormView* pParent );
168*b1cdbd2cSJim Jagielski 	virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint );
169*b1cdbd2cSJim Jagielski };
170*b1cdbd2cSJim Jagielski 
171*b1cdbd2cSJim Jagielski //========================================================================
DBG_NAME(FormViewPageWindowAdapter)172*b1cdbd2cSJim Jagielski DBG_NAME(FormViewPageWindowAdapter)
173*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
174*b1cdbd2cSJim Jagielski FormViewPageWindowAdapter::FormViewPageWindowAdapter( const ::comphelper::ComponentContext& _rContext, const SdrPageWindow& _rWindow, FmXFormView* _pViewImpl )
175*b1cdbd2cSJim Jagielski :	m_xControlContainer( _rWindow.GetControlContainer() ),
176*b1cdbd2cSJim Jagielski 	m_aContext( _rContext ),
177*b1cdbd2cSJim Jagielski 	m_pViewImpl( _pViewImpl ),
178*b1cdbd2cSJim Jagielski     m_pWindow( dynamic_cast< Window* >( &_rWindow.GetPaintWindow().GetOutputDevice() ) )
179*b1cdbd2cSJim Jagielski {
180*b1cdbd2cSJim Jagielski 	DBG_CTOR(FormViewPageWindowAdapter,NULL);
181*b1cdbd2cSJim Jagielski 
182*b1cdbd2cSJim Jagielski     // create an XFormController for every form
183*b1cdbd2cSJim Jagielski     FmFormPage* pFormPage = dynamic_cast< FmFormPage* >( _rWindow.GetPageView().GetPage() );
184*b1cdbd2cSJim Jagielski     DBG_ASSERT( pFormPage, "FormViewPageWindowAdapter::FormViewPageWindowAdapter: no FmFormPage found!" );
185*b1cdbd2cSJim Jagielski     if ( pFormPage )
186*b1cdbd2cSJim Jagielski 	{
187*b1cdbd2cSJim Jagielski         try
188*b1cdbd2cSJim Jagielski         {
189*b1cdbd2cSJim Jagielski             Reference< XIndexAccess > xForms( pFormPage->GetForms(), UNO_QUERY_THROW );
190*b1cdbd2cSJim Jagielski 		    sal_uInt32 nLength = xForms->getCount();
191*b1cdbd2cSJim Jagielski 		    for (sal_uInt32 i = 0; i < nLength; i++)
192*b1cdbd2cSJim Jagielski 		    {
193*b1cdbd2cSJim Jagielski                 Reference< XForm > xForm( xForms->getByIndex(i), UNO_QUERY );
194*b1cdbd2cSJim Jagielski                 if ( xForm.is() )
195*b1cdbd2cSJim Jagielski 			        setController( xForm, NULL );
196*b1cdbd2cSJim Jagielski 		    }
197*b1cdbd2cSJim Jagielski         }
198*b1cdbd2cSJim Jagielski         catch( const Exception& )
199*b1cdbd2cSJim Jagielski         {
200*b1cdbd2cSJim Jagielski         	DBG_UNHANDLED_EXCEPTION();
201*b1cdbd2cSJim Jagielski         }
202*b1cdbd2cSJim Jagielski 	}
203*b1cdbd2cSJim Jagielski }
204*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
~FormViewPageWindowAdapter()205*b1cdbd2cSJim Jagielski FormViewPageWindowAdapter::~FormViewPageWindowAdapter()
206*b1cdbd2cSJim Jagielski {
207*b1cdbd2cSJim Jagielski 	DBG_DTOR(FormViewPageWindowAdapter,NULL);
208*b1cdbd2cSJim Jagielski }
209*b1cdbd2cSJim Jagielski 
210*b1cdbd2cSJim Jagielski //------------------------------------------------------------------
dispose()211*b1cdbd2cSJim Jagielski void FormViewPageWindowAdapter::dispose()
212*b1cdbd2cSJim Jagielski {
213*b1cdbd2cSJim Jagielski     for (   ::std::vector< Reference< XFormController > >::const_iterator i = m_aControllerList.begin();
214*b1cdbd2cSJim Jagielski             i != m_aControllerList.end();
215*b1cdbd2cSJim Jagielski             ++i
216*b1cdbd2cSJim Jagielski         )
217*b1cdbd2cSJim Jagielski     {
218*b1cdbd2cSJim Jagielski         try
219*b1cdbd2cSJim Jagielski         {
220*b1cdbd2cSJim Jagielski             Reference< XFormController > xController( *i, UNO_QUERY_THROW );
221*b1cdbd2cSJim Jagielski 
222*b1cdbd2cSJim Jagielski             // detaching the events
223*b1cdbd2cSJim Jagielski             Reference< XChild > xControllerModel( xController->getModel(), UNO_QUERY );
224*b1cdbd2cSJim Jagielski             if ( xControllerModel.is() )
225*b1cdbd2cSJim Jagielski             {
226*b1cdbd2cSJim Jagielski                 Reference< XEventAttacherManager >  xEventManager( xControllerModel->getParent(), UNO_QUERY_THROW );
227*b1cdbd2cSJim Jagielski                 Reference< XInterface > xControllerNormalized( xController, UNO_QUERY_THROW );
228*b1cdbd2cSJim Jagielski                 xEventManager->detach( i - m_aControllerList.begin(), xControllerNormalized );
229*b1cdbd2cSJim Jagielski             }
230*b1cdbd2cSJim Jagielski 
231*b1cdbd2cSJim Jagielski             // dispose the formcontroller
232*b1cdbd2cSJim Jagielski             Reference< XComponent > xComp( xController, UNO_QUERY_THROW );
233*b1cdbd2cSJim Jagielski             xComp->dispose();
234*b1cdbd2cSJim Jagielski         }
235*b1cdbd2cSJim Jagielski         catch( const Exception& )
236*b1cdbd2cSJim Jagielski         {
237*b1cdbd2cSJim Jagielski             DBG_UNHANDLED_EXCEPTION();
238*b1cdbd2cSJim Jagielski         }
239*b1cdbd2cSJim Jagielski     }
240*b1cdbd2cSJim Jagielski 
241*b1cdbd2cSJim Jagielski     m_aControllerList.clear();
242*b1cdbd2cSJim Jagielski }
243*b1cdbd2cSJim Jagielski 
244*b1cdbd2cSJim Jagielski 
245*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
hasElements(void)246*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL FormViewPageWindowAdapter::hasElements(void) throw( RuntimeException )
247*b1cdbd2cSJim Jagielski {
248*b1cdbd2cSJim Jagielski 	return getCount() != 0;
249*b1cdbd2cSJim Jagielski }
250*b1cdbd2cSJim Jagielski 
251*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
getElementType(void)252*b1cdbd2cSJim Jagielski Type SAL_CALL  FormViewPageWindowAdapter::getElementType(void) throw( RuntimeException )
253*b1cdbd2cSJim Jagielski {
254*b1cdbd2cSJim Jagielski 	return ::getCppuType((const Reference< XFormController>*)0);
255*b1cdbd2cSJim Jagielski }
256*b1cdbd2cSJim Jagielski 
257*b1cdbd2cSJim Jagielski // XEnumerationAccess
258*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
createEnumeration(void)259*b1cdbd2cSJim Jagielski Reference< XEnumeration >  SAL_CALL FormViewPageWindowAdapter::createEnumeration(void) throw( RuntimeException )
260*b1cdbd2cSJim Jagielski {
261*b1cdbd2cSJim Jagielski 	return new ::comphelper::OEnumerationByIndex(this);
262*b1cdbd2cSJim Jagielski }
263*b1cdbd2cSJim Jagielski 
264*b1cdbd2cSJim Jagielski // XIndexAccess
265*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
getCount(void)266*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL FormViewPageWindowAdapter::getCount(void) throw( RuntimeException )
267*b1cdbd2cSJim Jagielski {
268*b1cdbd2cSJim Jagielski 	return m_aControllerList.size();
269*b1cdbd2cSJim Jagielski }
270*b1cdbd2cSJim Jagielski 
271*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
getByIndex(sal_Int32 nIndex)272*b1cdbd2cSJim Jagielski Any SAL_CALL FormViewPageWindowAdapter::getByIndex(sal_Int32 nIndex) throw( IndexOutOfBoundsException, WrappedTargetException, RuntimeException )
273*b1cdbd2cSJim Jagielski {
274*b1cdbd2cSJim Jagielski 	if (nIndex < 0 ||
275*b1cdbd2cSJim Jagielski 		nIndex >= getCount())
276*b1cdbd2cSJim Jagielski 		throw IndexOutOfBoundsException();
277*b1cdbd2cSJim Jagielski 
278*b1cdbd2cSJim Jagielski 	Any aElement;
279*b1cdbd2cSJim Jagielski 	aElement <<= m_aControllerList[nIndex];
280*b1cdbd2cSJim Jagielski 	return aElement;
281*b1cdbd2cSJim Jagielski }
282*b1cdbd2cSJim Jagielski 
283*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
makeVisible(const Reference<XControl> & _Control)284*b1cdbd2cSJim Jagielski void SAL_CALL FormViewPageWindowAdapter::makeVisible( const Reference< XControl >& _Control ) throw (RuntimeException)
285*b1cdbd2cSJim Jagielski {
286*b1cdbd2cSJim Jagielski 	::vos::OGuard aSolarGuard(Application::GetSolarMutex());
287*b1cdbd2cSJim Jagielski 
288*b1cdbd2cSJim Jagielski     Reference< XWindow >  xWindow( _Control, UNO_QUERY );
289*b1cdbd2cSJim Jagielski 	if ( xWindow.is() && m_pViewImpl->getView() && m_pWindow )
290*b1cdbd2cSJim Jagielski 	{
291*b1cdbd2cSJim Jagielski 		awt::Rectangle aRect = xWindow->getPosSize();
292*b1cdbd2cSJim Jagielski 		::Rectangle aNewRect( aRect.X, aRect.Y, aRect.X + aRect.Width, aRect.Y + aRect.Height );
293*b1cdbd2cSJim Jagielski 		aNewRect = m_pWindow->PixelToLogic( aNewRect );
294*b1cdbd2cSJim Jagielski 		m_pViewImpl->getView()->MakeVisible( aNewRect, *m_pWindow );
295*b1cdbd2cSJim Jagielski 	}
296*b1cdbd2cSJim Jagielski }
297*b1cdbd2cSJim Jagielski 
298*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
getControllerSearchChilds(const Reference<XIndexAccess> & xIndex,const Reference<XTabControllerModel> & xModel)299*b1cdbd2cSJim Jagielski Reference< XFormController >  getControllerSearchChilds( const Reference< XIndexAccess > & xIndex, const Reference< XTabControllerModel > & xModel)
300*b1cdbd2cSJim Jagielski {
301*b1cdbd2cSJim Jagielski 	if (xIndex.is() && xIndex->getCount())
302*b1cdbd2cSJim Jagielski 	{
303*b1cdbd2cSJim Jagielski 		Reference< XFormController >  xController;
304*b1cdbd2cSJim Jagielski 
305*b1cdbd2cSJim Jagielski 		for (sal_Int32 n = xIndex->getCount(); n-- && !xController.is(); )
306*b1cdbd2cSJim Jagielski 		{
307*b1cdbd2cSJim Jagielski 			xIndex->getByIndex(n) >>= xController;
308*b1cdbd2cSJim Jagielski 			if ((XTabControllerModel*)xModel.get() == (XTabControllerModel*)xController->getModel().get())
309*b1cdbd2cSJim Jagielski 				return xController;
310*b1cdbd2cSJim Jagielski 			else
311*b1cdbd2cSJim Jagielski 			{
312*b1cdbd2cSJim Jagielski 				xController = getControllerSearchChilds(Reference< XIndexAccess > (xController, UNO_QUERY), xModel);
313*b1cdbd2cSJim Jagielski 				if ( xController.is() )
314*b1cdbd2cSJim Jagielski 					return xController;
315*b1cdbd2cSJim Jagielski 			}
316*b1cdbd2cSJim Jagielski 		}
317*b1cdbd2cSJim Jagielski 	}
318*b1cdbd2cSJim Jagielski 	return Reference< XFormController > ();
319*b1cdbd2cSJim Jagielski }
320*b1cdbd2cSJim Jagielski 
321*b1cdbd2cSJim Jagielski // Search the according controller
322*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
getController(const Reference<XForm> & xForm) const323*b1cdbd2cSJim Jagielski Reference< XFormController >  FormViewPageWindowAdapter::getController( const Reference< XForm > & xForm ) const
324*b1cdbd2cSJim Jagielski {
325*b1cdbd2cSJim Jagielski 	Reference< XTabControllerModel >  xModel(xForm, UNO_QUERY);
326*b1cdbd2cSJim Jagielski 	for (::std::vector< Reference< XFormController > >::const_iterator i = m_aControllerList.begin();
327*b1cdbd2cSJim Jagielski 		 i != m_aControllerList.end(); i++)
328*b1cdbd2cSJim Jagielski 	{
329*b1cdbd2cSJim Jagielski 		if ((XTabControllerModel*)(*i)->getModel().get() == (XTabControllerModel*)xModel.get())
330*b1cdbd2cSJim Jagielski 			return *i;
331*b1cdbd2cSJim Jagielski 
332*b1cdbd2cSJim Jagielski 		// the current-round controller isn't the right one. perhaps one of it's children ?
333*b1cdbd2cSJim Jagielski 		Reference< XFormController >  xChildSearch = getControllerSearchChilds(Reference< XIndexAccess > (*i, UNO_QUERY), xModel);
334*b1cdbd2cSJim Jagielski 		if (xChildSearch.is())
335*b1cdbd2cSJim Jagielski 			return xChildSearch;
336*b1cdbd2cSJim Jagielski 	}
337*b1cdbd2cSJim Jagielski 	return Reference< XFormController > ();
338*b1cdbd2cSJim Jagielski }
339*b1cdbd2cSJim Jagielski 
340*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
setController(const Reference<XForm> & xForm,const Reference<XFormController> & _rxParentController)341*b1cdbd2cSJim Jagielski void FormViewPageWindowAdapter::setController(const Reference< XForm > & xForm, const Reference< XFormController >& _rxParentController )
342*b1cdbd2cSJim Jagielski {
343*b1cdbd2cSJim Jagielski     DBG_ASSERT( xForm.is(), "FormViewPageWindowAdapter::setController: there should be a form!" );
344*b1cdbd2cSJim Jagielski 	Reference< XIndexAccess >  xFormCps(xForm, UNO_QUERY);
345*b1cdbd2cSJim Jagielski 	if (!xFormCps.is())
346*b1cdbd2cSJim Jagielski 		return;
347*b1cdbd2cSJim Jagielski 
348*b1cdbd2cSJim Jagielski 	Reference< XTabControllerModel >  xTabOrder(xForm, UNO_QUERY);
349*b1cdbd2cSJim Jagielski 
350*b1cdbd2cSJim Jagielski 	// create a form controller
351*b1cdbd2cSJim Jagielski     Reference< XFormController > xController( m_aContext.createComponent( FM_FORM_CONTROLLER ), UNO_QUERY );
352*b1cdbd2cSJim Jagielski     if ( !xController.is() )
353*b1cdbd2cSJim Jagielski     {
354*b1cdbd2cSJim Jagielski         ShowServiceNotAvailableError( m_pWindow, FM_FORM_CONTROLLER, sal_True );
355*b1cdbd2cSJim Jagielski         return;
356*b1cdbd2cSJim Jagielski     }
357*b1cdbd2cSJim Jagielski 
358*b1cdbd2cSJim Jagielski     Reference< XInteractionHandler > xHandler;
359*b1cdbd2cSJim Jagielski     if ( _rxParentController.is() )
360*b1cdbd2cSJim Jagielski         xHandler = _rxParentController->getInteractionHandler();
361*b1cdbd2cSJim Jagielski     else
362*b1cdbd2cSJim Jagielski     {
363*b1cdbd2cSJim Jagielski         // TODO: should we create a default handler? Not really necessary, since the
364*b1cdbd2cSJim Jagielski         // FormController itself has a default fallback
365*b1cdbd2cSJim Jagielski     }
366*b1cdbd2cSJim Jagielski     if ( xHandler.is() )
367*b1cdbd2cSJim Jagielski         xController->setInteractionHandler( xHandler );
368*b1cdbd2cSJim Jagielski 
369*b1cdbd2cSJim Jagielski     xController->setContext( this );
370*b1cdbd2cSJim Jagielski 
371*b1cdbd2cSJim Jagielski 	xController->setModel( xTabOrder );
372*b1cdbd2cSJim Jagielski 	xController->setContainer( m_xControlContainer );
373*b1cdbd2cSJim Jagielski 	xController->activateTabOrder();
374*b1cdbd2cSJim Jagielski 	xController->addActivateListener( m_pViewImpl );
375*b1cdbd2cSJim Jagielski 
376*b1cdbd2cSJim Jagielski 	if ( _rxParentController.is() )
377*b1cdbd2cSJim Jagielski 		_rxParentController->addChildController( xController );
378*b1cdbd2cSJim Jagielski 	else
379*b1cdbd2cSJim Jagielski 	{
380*b1cdbd2cSJim Jagielski 		m_aControllerList.push_back(xController);
381*b1cdbd2cSJim Jagielski 
382*b1cdbd2cSJim Jagielski 		xController->setParent( *this );
383*b1cdbd2cSJim Jagielski 
384*b1cdbd2cSJim Jagielski 		// attaching the events
385*b1cdbd2cSJim Jagielski 		Reference< XEventAttacherManager > xEventManager( xForm->getParent(), UNO_QUERY );
386*b1cdbd2cSJim Jagielski 		Reference< XInterface >  xIfc(xController, UNO_QUERY);
387*b1cdbd2cSJim Jagielski 		xEventManager->attach(m_aControllerList.size() - 1, xIfc, makeAny(xController) );
388*b1cdbd2cSJim Jagielski 	}
389*b1cdbd2cSJim Jagielski 
390*b1cdbd2cSJim Jagielski 	// jetzt die Subforms durchgehen
391*b1cdbd2cSJim Jagielski 	sal_uInt32 nLength = xFormCps->getCount();
392*b1cdbd2cSJim Jagielski 	Reference< XForm >  xSubForm;
393*b1cdbd2cSJim Jagielski 	for (sal_uInt32 i = 0; i < nLength; i++)
394*b1cdbd2cSJim Jagielski 	{
395*b1cdbd2cSJim Jagielski 		if ( xFormCps->getByIndex(i) >>= xSubForm )
396*b1cdbd2cSJim Jagielski 			setController( xSubForm, xController );
397*b1cdbd2cSJim Jagielski 	}
398*b1cdbd2cSJim Jagielski }
399*b1cdbd2cSJim Jagielski 
400*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
updateTabOrder(const Reference<XForm> & _rxForm)401*b1cdbd2cSJim Jagielski void FormViewPageWindowAdapter::updateTabOrder( const Reference< XForm >& _rxForm )
402*b1cdbd2cSJim Jagielski {
403*b1cdbd2cSJim Jagielski     OSL_PRECOND( _rxForm.is(), "FormViewPageWindowAdapter::updateTabOrder: illegal argument!" );
404*b1cdbd2cSJim Jagielski     if ( !_rxForm.is() )
405*b1cdbd2cSJim Jagielski         return;
406*b1cdbd2cSJim Jagielski 
407*b1cdbd2cSJim Jagielski     try
408*b1cdbd2cSJim Jagielski     {
409*b1cdbd2cSJim Jagielski         Reference< XTabController > xTabCtrl( getController( _rxForm ).get() );
410*b1cdbd2cSJim Jagielski         if ( xTabCtrl.is() )
411*b1cdbd2cSJim Jagielski         {   // if there already is a TabController for this form, then delegate the "updateTabOrder" request
412*b1cdbd2cSJim Jagielski             xTabCtrl->activateTabOrder();
413*b1cdbd2cSJim Jagielski         }
414*b1cdbd2cSJim Jagielski         else
415*b1cdbd2cSJim Jagielski         {   // otherwise, create a TabController
416*b1cdbd2cSJim Jagielski 
417*b1cdbd2cSJim Jagielski             // if it's a sub form, then we must ensure there exist TabControllers
418*b1cdbd2cSJim Jagielski             // for all its ancestors, too
419*b1cdbd2cSJim Jagielski             Reference< XForm > xParentForm( _rxForm->getParent(), UNO_QUERY );
420*b1cdbd2cSJim Jagielski             // there is a parent form -> look for the respective controller
421*b1cdbd2cSJim Jagielski             Reference< XFormController > xParentController;
422*b1cdbd2cSJim Jagielski             if ( xParentForm.is() )
423*b1cdbd2cSJim Jagielski                 xParentController.set( getController( xParentForm ), UNO_QUERY );
424*b1cdbd2cSJim Jagielski 
425*b1cdbd2cSJim Jagielski             setController( _rxForm, xParentController );
426*b1cdbd2cSJim Jagielski         }
427*b1cdbd2cSJim Jagielski     }
428*b1cdbd2cSJim Jagielski     catch( const Exception& )
429*b1cdbd2cSJim Jagielski     {
430*b1cdbd2cSJim Jagielski     	DBG_UNHANDLED_EXCEPTION();
431*b1cdbd2cSJim Jagielski     }
432*b1cdbd2cSJim Jagielski }
433*b1cdbd2cSJim Jagielski 
434*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
FmXFormView(const::comphelper::ComponentContext & _rContext,FmFormView * _pView)435*b1cdbd2cSJim Jagielski FmXFormView::FmXFormView(const ::comphelper::ComponentContext& _rContext, FmFormView* _pView )
436*b1cdbd2cSJim Jagielski     :m_aContext( _rContext )
437*b1cdbd2cSJim Jagielski 	,m_pMarkedGrid(NULL)
438*b1cdbd2cSJim Jagielski 	,m_pView(_pView)
439*b1cdbd2cSJim Jagielski 	,m_nActivationEvent(0)
440*b1cdbd2cSJim Jagielski 	,m_nErrorMessageEvent( 0 )
441*b1cdbd2cSJim Jagielski 	,m_nAutoFocusEvent( 0 )
442*b1cdbd2cSJim Jagielski     ,m_nControlWizardEvent( 0 )
443*b1cdbd2cSJim Jagielski 	,m_pWatchStoredList( NULL )
444*b1cdbd2cSJim Jagielski 	,m_bFirstActivation( true )
445*b1cdbd2cSJim Jagielski     ,m_isTabOrderUpdateSuspended( false )
446*b1cdbd2cSJim Jagielski {
447*b1cdbd2cSJim Jagielski }
448*b1cdbd2cSJim Jagielski 
449*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
cancelEvents()450*b1cdbd2cSJim Jagielski void FmXFormView::cancelEvents()
451*b1cdbd2cSJim Jagielski {
452*b1cdbd2cSJim Jagielski 	if ( m_nActivationEvent )
453*b1cdbd2cSJim Jagielski 	{
454*b1cdbd2cSJim Jagielski 		Application::RemoveUserEvent( m_nActivationEvent );
455*b1cdbd2cSJim Jagielski 		m_nActivationEvent = 0;
456*b1cdbd2cSJim Jagielski 	}
457*b1cdbd2cSJim Jagielski 
458*b1cdbd2cSJim Jagielski 	if ( m_nErrorMessageEvent )
459*b1cdbd2cSJim Jagielski 	{
460*b1cdbd2cSJim Jagielski 		Application::RemoveUserEvent( m_nErrorMessageEvent );
461*b1cdbd2cSJim Jagielski 		m_nErrorMessageEvent = 0;
462*b1cdbd2cSJim Jagielski 	}
463*b1cdbd2cSJim Jagielski 
464*b1cdbd2cSJim Jagielski 	if ( m_nAutoFocusEvent )
465*b1cdbd2cSJim Jagielski 	{
466*b1cdbd2cSJim Jagielski         Application::RemoveUserEvent( m_nAutoFocusEvent );
467*b1cdbd2cSJim Jagielski 		m_nAutoFocusEvent = 0;
468*b1cdbd2cSJim Jagielski 	}
469*b1cdbd2cSJim Jagielski 
470*b1cdbd2cSJim Jagielski     if ( m_nControlWizardEvent )
471*b1cdbd2cSJim Jagielski 	{
472*b1cdbd2cSJim Jagielski         Application::RemoveUserEvent( m_nControlWizardEvent );
473*b1cdbd2cSJim Jagielski 		m_nControlWizardEvent = 0;
474*b1cdbd2cSJim Jagielski 	}
475*b1cdbd2cSJim Jagielski }
476*b1cdbd2cSJim Jagielski 
477*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
notifyViewDying()478*b1cdbd2cSJim Jagielski void FmXFormView::notifyViewDying( )
479*b1cdbd2cSJim Jagielski {
480*b1cdbd2cSJim Jagielski 	DBG_ASSERT( m_pView, "FmXFormView::notifyViewDying: my view already died!" );
481*b1cdbd2cSJim Jagielski 	m_pView = NULL;
482*b1cdbd2cSJim Jagielski 	cancelEvents();
483*b1cdbd2cSJim Jagielski }
484*b1cdbd2cSJim Jagielski 
485*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
~FmXFormView()486*b1cdbd2cSJim Jagielski FmXFormView::~FmXFormView()
487*b1cdbd2cSJim Jagielski {
488*b1cdbd2cSJim Jagielski     DBG_ASSERT( m_aPageWindowAdapters.empty(), "FmXFormView::~FmXFormView: Window list not empty!" );
489*b1cdbd2cSJim Jagielski     if ( !m_aPageWindowAdapters.empty() )
490*b1cdbd2cSJim Jagielski     {
491*b1cdbd2cSJim Jagielski         for (   PageWindowAdapterList::const_iterator loop = m_aPageWindowAdapters.begin();
492*b1cdbd2cSJim Jagielski                 loop != m_aPageWindowAdapters.end();
493*b1cdbd2cSJim Jagielski                 ++loop
494*b1cdbd2cSJim Jagielski             )
495*b1cdbd2cSJim Jagielski         {
496*b1cdbd2cSJim Jagielski             (*loop)->dispose();
497*b1cdbd2cSJim Jagielski         }
498*b1cdbd2cSJim Jagielski     }
499*b1cdbd2cSJim Jagielski 
500*b1cdbd2cSJim Jagielski 	cancelEvents();
501*b1cdbd2cSJim Jagielski 
502*b1cdbd2cSJim Jagielski 	delete m_pWatchStoredList;
503*b1cdbd2cSJim Jagielski 	m_pWatchStoredList = NULL;
504*b1cdbd2cSJim Jagielski }
505*b1cdbd2cSJim Jagielski 
506*b1cdbd2cSJim Jagielski //      EventListener
507*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
disposing(const EventObject & Source)508*b1cdbd2cSJim Jagielski void SAL_CALL FmXFormView::disposing(const EventObject& Source) throw( RuntimeException )
509*b1cdbd2cSJim Jagielski {
510*b1cdbd2cSJim Jagielski 	if ( m_xWindow.is() && Source.Source == m_xWindow )
511*b1cdbd2cSJim Jagielski 		removeGridWindowListening();
512*b1cdbd2cSJim Jagielski }
513*b1cdbd2cSJim Jagielski 
514*b1cdbd2cSJim Jagielski // XFormControllerListener
515*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
formActivated(const EventObject & rEvent)516*b1cdbd2cSJim Jagielski void SAL_CALL FmXFormView::formActivated(const EventObject& rEvent) throw( RuntimeException )
517*b1cdbd2cSJim Jagielski {
518*b1cdbd2cSJim Jagielski 	if ( m_pView && m_pView->GetFormShell() && m_pView->GetFormShell()->GetImpl() )
519*b1cdbd2cSJim Jagielski 		m_pView->GetFormShell()->GetImpl()->formActivated( rEvent );
520*b1cdbd2cSJim Jagielski }
521*b1cdbd2cSJim Jagielski 
522*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
formDeactivated(const EventObject & rEvent)523*b1cdbd2cSJim Jagielski void SAL_CALL FmXFormView::formDeactivated(const EventObject& rEvent) throw( RuntimeException )
524*b1cdbd2cSJim Jagielski {
525*b1cdbd2cSJim Jagielski 	if ( m_pView && m_pView->GetFormShell() && m_pView->GetFormShell()->GetImpl() )
526*b1cdbd2cSJim Jagielski 		m_pView->GetFormShell()->GetImpl()->formDeactivated( rEvent );
527*b1cdbd2cSJim Jagielski }
528*b1cdbd2cSJim Jagielski 
529*b1cdbd2cSJim Jagielski // XContainerListener
530*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
elementInserted(const ContainerEvent & evt)531*b1cdbd2cSJim Jagielski void SAL_CALL FmXFormView::elementInserted(const ContainerEvent& evt) throw( RuntimeException )
532*b1cdbd2cSJim Jagielski {
533*b1cdbd2cSJim Jagielski     try
534*b1cdbd2cSJim Jagielski     {
535*b1cdbd2cSJim Jagielski 	    Reference< XControlContainer > xControlContainer( evt.Source, UNO_QUERY_THROW );
536*b1cdbd2cSJim Jagielski 		Reference< XControl > xControl( evt.Element, UNO_QUERY_THROW );
537*b1cdbd2cSJim Jagielski         Reference< XFormComponent > xControlModel( xControl->getModel(), UNO_QUERY_THROW );
538*b1cdbd2cSJim Jagielski         Reference< XForm > xForm( xControlModel->getParent(), UNO_QUERY_THROW );
539*b1cdbd2cSJim Jagielski 
540*b1cdbd2cSJim Jagielski         if ( m_isTabOrderUpdateSuspended )
541*b1cdbd2cSJim Jagielski         {
542*b1cdbd2cSJim Jagielski             // remember the container and the control, so we can update the tab order on resumeTabOrderUpdate
543*b1cdbd2cSJim Jagielski             m_aNeedTabOrderUpdate[ xControlContainer ].insert( xForm );
544*b1cdbd2cSJim Jagielski         }
545*b1cdbd2cSJim Jagielski         else
546*b1cdbd2cSJim Jagielski         {
547*b1cdbd2cSJim Jagielski             PFormViewPageWindowAdapter pAdapter = findWindow( xControlContainer );
548*b1cdbd2cSJim Jagielski 		    if ( pAdapter.is() )
549*b1cdbd2cSJim Jagielski 			    pAdapter->updateTabOrder( xForm );
550*b1cdbd2cSJim Jagielski         }
551*b1cdbd2cSJim Jagielski     }
552*b1cdbd2cSJim Jagielski     catch( const Exception& )
553*b1cdbd2cSJim Jagielski     {
554*b1cdbd2cSJim Jagielski     	DBG_UNHANDLED_EXCEPTION();
555*b1cdbd2cSJim Jagielski     }
556*b1cdbd2cSJim Jagielski }
557*b1cdbd2cSJim Jagielski 
558*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
elementReplaced(const ContainerEvent & evt)559*b1cdbd2cSJim Jagielski void SAL_CALL FmXFormView::elementReplaced(const ContainerEvent& evt) throw( RuntimeException )
560*b1cdbd2cSJim Jagielski {
561*b1cdbd2cSJim Jagielski 	elementInserted(evt);
562*b1cdbd2cSJim Jagielski }
563*b1cdbd2cSJim Jagielski 
564*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
elementRemoved(const ContainerEvent &)565*b1cdbd2cSJim Jagielski void SAL_CALL FmXFormView::elementRemoved(const ContainerEvent& /*evt*/) throw( RuntimeException )
566*b1cdbd2cSJim Jagielski {
567*b1cdbd2cSJim Jagielski }
568*b1cdbd2cSJim Jagielski 
569*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
findWindow(const Reference<XControlContainer> & _rxCC) const570*b1cdbd2cSJim Jagielski PFormViewPageWindowAdapter FmXFormView::findWindow( const Reference< XControlContainer >& _rxCC )  const
571*b1cdbd2cSJim Jagielski {
572*b1cdbd2cSJim Jagielski 	for (   PageWindowAdapterList::const_iterator i = m_aPageWindowAdapters.begin();
573*b1cdbd2cSJim Jagielski 			i != m_aPageWindowAdapters.end();
574*b1cdbd2cSJim Jagielski             ++i
575*b1cdbd2cSJim Jagielski         )
576*b1cdbd2cSJim Jagielski 	{
577*b1cdbd2cSJim Jagielski 		if ( _rxCC == (*i)->getControlContainer() )
578*b1cdbd2cSJim Jagielski 			return *i;
579*b1cdbd2cSJim Jagielski 	}
580*b1cdbd2cSJim Jagielski 	return NULL;
581*b1cdbd2cSJim Jagielski }
582*b1cdbd2cSJim Jagielski 
583*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
addWindow(const SdrPageWindow & rWindow)584*b1cdbd2cSJim Jagielski void FmXFormView::addWindow(const SdrPageWindow& rWindow)
585*b1cdbd2cSJim Jagielski {
586*b1cdbd2cSJim Jagielski     FmFormPage* pFormPage = PTR_CAST( FmFormPage, rWindow.GetPageView().GetPage() );
587*b1cdbd2cSJim Jagielski     if ( !pFormPage )
588*b1cdbd2cSJim Jagielski         return;
589*b1cdbd2cSJim Jagielski 
590*b1cdbd2cSJim Jagielski     Reference< XControlContainer > xCC = rWindow.GetControlContainer();
591*b1cdbd2cSJim Jagielski     if  (   xCC.is()
592*b1cdbd2cSJim Jagielski         &&  ( !findWindow( xCC ).is() )
593*b1cdbd2cSJim Jagielski         )
594*b1cdbd2cSJim Jagielski     {
595*b1cdbd2cSJim Jagielski         PFormViewPageWindowAdapter pAdapter = new FormViewPageWindowAdapter( m_aContext, rWindow, this );
596*b1cdbd2cSJim Jagielski         m_aPageWindowAdapters.push_back( pAdapter );
597*b1cdbd2cSJim Jagielski 
598*b1cdbd2cSJim Jagielski         // Am ControlContainer horchen um Aenderungen mitzbekommen
599*b1cdbd2cSJim Jagielski         Reference< XContainer >  xContainer( xCC, UNO_QUERY );
600*b1cdbd2cSJim Jagielski         if ( xContainer.is() )
601*b1cdbd2cSJim Jagielski             xContainer->addContainerListener( this );
602*b1cdbd2cSJim Jagielski 	}
603*b1cdbd2cSJim Jagielski }
604*b1cdbd2cSJim Jagielski 
605*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
removeWindow(const Reference<XControlContainer> & _rxCC)606*b1cdbd2cSJim Jagielski void FmXFormView::removeWindow( const Reference< XControlContainer >& _rxCC )
607*b1cdbd2cSJim Jagielski {
608*b1cdbd2cSJim Jagielski 	// Wird gerufen, wenn
609*b1cdbd2cSJim Jagielski 	// - in den Design-Modus geschaltet wird
610*b1cdbd2cSJim Jagielski 	// - ein Window geloescht wird, waehrend man im Design-Modus ist
611*b1cdbd2cSJim Jagielski 	// - der Control-Container fuer ein Window entfernt wird, waehrend
612*b1cdbd2cSJim Jagielski 	//   der aktive Modus eingeschaltet ist.
613*b1cdbd2cSJim Jagielski 
614*b1cdbd2cSJim Jagielski 	for (   PageWindowAdapterList::iterator i = m_aPageWindowAdapters.begin();
615*b1cdbd2cSJim Jagielski 			i != m_aPageWindowAdapters.end();
616*b1cdbd2cSJim Jagielski             ++i
617*b1cdbd2cSJim Jagielski         )
618*b1cdbd2cSJim Jagielski 	{
619*b1cdbd2cSJim Jagielski 		if ( _rxCC != (*i)->getControlContainer() )
620*b1cdbd2cSJim Jagielski             continue;
621*b1cdbd2cSJim Jagielski 
622*b1cdbd2cSJim Jagielski         Reference< XContainer >  xContainer( _rxCC, UNO_QUERY );
623*b1cdbd2cSJim Jagielski 	    if ( xContainer.is() )
624*b1cdbd2cSJim Jagielski 		    xContainer->removeContainerListener( this );
625*b1cdbd2cSJim Jagielski 
626*b1cdbd2cSJim Jagielski 	    (*i)->dispose();
627*b1cdbd2cSJim Jagielski 	    m_aPageWindowAdapters.erase( i );
628*b1cdbd2cSJim Jagielski         break;
629*b1cdbd2cSJim Jagielski 	}
630*b1cdbd2cSJim Jagielski }
631*b1cdbd2cSJim Jagielski 
632*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
displayAsyncErrorMessage(const SQLErrorEvent & _rEvent)633*b1cdbd2cSJim Jagielski void FmXFormView::displayAsyncErrorMessage( const SQLErrorEvent& _rEvent )
634*b1cdbd2cSJim Jagielski {
635*b1cdbd2cSJim Jagielski 	DBG_ASSERT( 0 == m_nErrorMessageEvent, "FmXFormView::displayAsyncErrorMessage: not too fast, please!" );
636*b1cdbd2cSJim Jagielski 		// This should not happen - usually, the PostUserEvent is faster than any possible user
637*b1cdbd2cSJim Jagielski 		// interaction which could trigger a new error. If it happens, we need a queue for the events.
638*b1cdbd2cSJim Jagielski 	m_aAsyncError = _rEvent;
639*b1cdbd2cSJim Jagielski 	m_nErrorMessageEvent = Application::PostUserEvent( LINK( this, FmXFormView, OnDelayedErrorMessage ) );
640*b1cdbd2cSJim Jagielski }
641*b1cdbd2cSJim Jagielski 
642*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
643*b1cdbd2cSJim Jagielski IMPL_LINK(FmXFormView, OnDelayedErrorMessage, void*, /*EMPTYTAG*/)
644*b1cdbd2cSJim Jagielski {
645*b1cdbd2cSJim Jagielski 	m_nErrorMessageEvent = 0;
646*b1cdbd2cSJim Jagielski 	displayException( m_aAsyncError );
647*b1cdbd2cSJim Jagielski 	return 0L;
648*b1cdbd2cSJim Jagielski }
649*b1cdbd2cSJim Jagielski 
650*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
onFirstViewActivation(const FmFormModel * _pDocModel)651*b1cdbd2cSJim Jagielski void FmXFormView::onFirstViewActivation( const FmFormModel* _pDocModel )
652*b1cdbd2cSJim Jagielski {
653*b1cdbd2cSJim Jagielski 	if ( _pDocModel && _pDocModel->GetAutoControlFocus() )
654*b1cdbd2cSJim Jagielski 		m_nAutoFocusEvent = Application::PostUserEvent( LINK( this, FmXFormView, OnAutoFocus ) );
655*b1cdbd2cSJim Jagielski }
656*b1cdbd2cSJim Jagielski 
657*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
suspendTabOrderUpdate()658*b1cdbd2cSJim Jagielski void FmXFormView::suspendTabOrderUpdate()
659*b1cdbd2cSJim Jagielski {
660*b1cdbd2cSJim Jagielski     OSL_ENSURE( !m_isTabOrderUpdateSuspended, "FmXFormView::suspendTabOrderUpdate: nesting not allowed!" );
661*b1cdbd2cSJim Jagielski     m_isTabOrderUpdateSuspended = true;
662*b1cdbd2cSJim Jagielski }
663*b1cdbd2cSJim Jagielski 
664*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
resumeTabOrderUpdate()665*b1cdbd2cSJim Jagielski void FmXFormView::resumeTabOrderUpdate()
666*b1cdbd2cSJim Jagielski {
667*b1cdbd2cSJim Jagielski     OSL_ENSURE( m_isTabOrderUpdateSuspended, "FmXFormView::resumeTabOrderUpdate: not suspended!" );
668*b1cdbd2cSJim Jagielski     m_isTabOrderUpdateSuspended = false;
669*b1cdbd2cSJim Jagielski 
670*b1cdbd2cSJim Jagielski     // update the tab orders for all components which were collected since the suspendTabOrderUpdate call.
671*b1cdbd2cSJim Jagielski     for (   MapControlContainerToSetOfForms::const_iterator container = m_aNeedTabOrderUpdate.begin();
672*b1cdbd2cSJim Jagielski             container != m_aNeedTabOrderUpdate.end();
673*b1cdbd2cSJim Jagielski             ++container
674*b1cdbd2cSJim Jagielski         )
675*b1cdbd2cSJim Jagielski     {
676*b1cdbd2cSJim Jagielski         PFormViewPageWindowAdapter pAdapter = findWindow( container->first );
677*b1cdbd2cSJim Jagielski         if ( !pAdapter.is() )
678*b1cdbd2cSJim Jagielski             continue;
679*b1cdbd2cSJim Jagielski 
680*b1cdbd2cSJim Jagielski         for (   SetOfForms::const_iterator form = container->second.begin();
681*b1cdbd2cSJim Jagielski                 form != container->second.end();
682*b1cdbd2cSJim Jagielski                 ++form
683*b1cdbd2cSJim Jagielski             )
684*b1cdbd2cSJim Jagielski         {
685*b1cdbd2cSJim Jagielski 	        pAdapter->updateTabOrder( *form );
686*b1cdbd2cSJim Jagielski         }
687*b1cdbd2cSJim Jagielski     }
688*b1cdbd2cSJim Jagielski     m_aNeedTabOrderUpdate.clear();
689*b1cdbd2cSJim Jagielski }
690*b1cdbd2cSJim Jagielski 
691*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
692*b1cdbd2cSJim Jagielski IMPL_LINK(FmXFormView, OnActivate, void*, /*EMPTYTAG*/)
693*b1cdbd2cSJim Jagielski {
694*b1cdbd2cSJim Jagielski 	m_nActivationEvent = 0;
695*b1cdbd2cSJim Jagielski 
696*b1cdbd2cSJim Jagielski 	if ( !m_pView )
697*b1cdbd2cSJim Jagielski 	{
698*b1cdbd2cSJim Jagielski 		DBG_ERROR( "FmXFormView::OnActivate: well .... seems we have a timing problem (the view already died)!" );
699*b1cdbd2cSJim Jagielski 		return 0;
700*b1cdbd2cSJim Jagielski 	}
701*b1cdbd2cSJim Jagielski 
702*b1cdbd2cSJim Jagielski 	// setting the controller to activate
703*b1cdbd2cSJim Jagielski 	if (m_pView->GetFormShell() && m_pView->GetActualOutDev() && m_pView->GetActualOutDev()->GetOutDevType() == OUTDEV_WINDOW)
704*b1cdbd2cSJim Jagielski 	{
705*b1cdbd2cSJim Jagielski 		Window* pWindow = const_cast<Window*>(static_cast<const Window*>(m_pView->GetActualOutDev()));
706*b1cdbd2cSJim Jagielski         PFormViewPageWindowAdapter pAdapter = m_aPageWindowAdapters.empty() ? NULL : m_aPageWindowAdapters[0];
707*b1cdbd2cSJim Jagielski 		for (   PageWindowAdapterList::const_iterator i = m_aPageWindowAdapters.begin();
708*b1cdbd2cSJim Jagielski 			    i != m_aPageWindowAdapters.end();
709*b1cdbd2cSJim Jagielski                 ++i
710*b1cdbd2cSJim Jagielski             )
711*b1cdbd2cSJim Jagielski 		{
712*b1cdbd2cSJim Jagielski 			if ( pWindow == (*i)->getWindow() )
713*b1cdbd2cSJim Jagielski 				pAdapter =*i;
714*b1cdbd2cSJim Jagielski 		}
715*b1cdbd2cSJim Jagielski 
716*b1cdbd2cSJim Jagielski 		if ( pAdapter.get() )
717*b1cdbd2cSJim Jagielski 		{
718*b1cdbd2cSJim Jagielski 			for (   ::std::vector< Reference< XFormController > >::const_iterator i = pAdapter->GetList().begin();
719*b1cdbd2cSJim Jagielski 				    i != pAdapter->GetList().end();
720*b1cdbd2cSJim Jagielski                     ++i
721*b1cdbd2cSJim Jagielski                 )
722*b1cdbd2cSJim Jagielski 			{
723*b1cdbd2cSJim Jagielski 				const Reference< XFormController > & xController = *i;
724*b1cdbd2cSJim Jagielski 				if ( !xController.is() )
725*b1cdbd2cSJim Jagielski                     continue;
726*b1cdbd2cSJim Jagielski 
727*b1cdbd2cSJim Jagielski                 // only database forms are to be activated
728*b1cdbd2cSJim Jagielski 				Reference< XRowSet >  xForm(xController->getModel(), UNO_QUERY);
729*b1cdbd2cSJim Jagielski                 if ( !xForm.is() || !OStaticDataAccessTools().getRowSetConnection( xForm ).is() )
730*b1cdbd2cSJim Jagielski                     continue;
731*b1cdbd2cSJim Jagielski 
732*b1cdbd2cSJim Jagielski                 Reference< XPropertySet > xFormSet( xForm, UNO_QUERY );
733*b1cdbd2cSJim Jagielski                 ENSURE_OR_CONTINUE( xFormSet.is(), "FmXFormView::OnActivate: a form which does not have properties?" );
734*b1cdbd2cSJim Jagielski 
735*b1cdbd2cSJim Jagielski 				const ::rtl::OUString aSource = ::comphelper::getString( xFormSet->getPropertyValue( FM_PROP_COMMAND ) );
736*b1cdbd2cSJim Jagielski 				if ( aSource.getLength() )
737*b1cdbd2cSJim Jagielski 				{
738*b1cdbd2cSJim Jagielski 					FmXFormShell* pShImpl =  m_pView->GetFormShell()->GetImpl();
739*b1cdbd2cSJim Jagielski 					if ( pShImpl )
740*b1cdbd2cSJim Jagielski 						pShImpl->setActiveController( xController );
741*b1cdbd2cSJim Jagielski 					break;
742*b1cdbd2cSJim Jagielski 				}
743*b1cdbd2cSJim Jagielski 			}
744*b1cdbd2cSJim Jagielski 		}
745*b1cdbd2cSJim Jagielski 	}
746*b1cdbd2cSJim Jagielski 	return 0;
747*b1cdbd2cSJim Jagielski }
748*b1cdbd2cSJim Jagielski 
749*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
Activate(sal_Bool bSync)750*b1cdbd2cSJim Jagielski void FmXFormView::Activate(sal_Bool bSync)
751*b1cdbd2cSJim Jagielski {
752*b1cdbd2cSJim Jagielski 	if (m_nActivationEvent)
753*b1cdbd2cSJim Jagielski 	{
754*b1cdbd2cSJim Jagielski 		Application::RemoveUserEvent(m_nActivationEvent);
755*b1cdbd2cSJim Jagielski 		m_nActivationEvent = 0;
756*b1cdbd2cSJim Jagielski 	}
757*b1cdbd2cSJim Jagielski 
758*b1cdbd2cSJim Jagielski 	if (bSync)
759*b1cdbd2cSJim Jagielski 	{
760*b1cdbd2cSJim Jagielski 		LINK(this,FmXFormView,OnActivate).Call(NULL);
761*b1cdbd2cSJim Jagielski 	}
762*b1cdbd2cSJim Jagielski 	else
763*b1cdbd2cSJim Jagielski 		m_nActivationEvent = Application::PostUserEvent(LINK(this,FmXFormView,OnActivate));
764*b1cdbd2cSJim Jagielski }
765*b1cdbd2cSJim Jagielski 
766*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
Deactivate(sal_Bool bDeactivateController)767*b1cdbd2cSJim Jagielski void FmXFormView::Deactivate(sal_Bool bDeactivateController)
768*b1cdbd2cSJim Jagielski {
769*b1cdbd2cSJim Jagielski 	if (m_nActivationEvent)
770*b1cdbd2cSJim Jagielski 	{
771*b1cdbd2cSJim Jagielski 		Application::RemoveUserEvent(m_nActivationEvent);
772*b1cdbd2cSJim Jagielski 		m_nActivationEvent = 0;
773*b1cdbd2cSJim Jagielski 	}
774*b1cdbd2cSJim Jagielski 
775*b1cdbd2cSJim Jagielski 	FmXFormShell* pShImpl =  m_pView->GetFormShell() ? m_pView->GetFormShell()->GetImpl() : NULL;
776*b1cdbd2cSJim Jagielski 	if (pShImpl && bDeactivateController)
777*b1cdbd2cSJim Jagielski 		pShImpl->setActiveController( NULL );
778*b1cdbd2cSJim Jagielski }
779*b1cdbd2cSJim Jagielski 
780*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
GetFormShell() const781*b1cdbd2cSJim Jagielski FmFormShell* FmXFormView::GetFormShell() const
782*b1cdbd2cSJim Jagielski {
783*b1cdbd2cSJim Jagielski 	return m_pView ? m_pView->GetFormShell() : NULL;
784*b1cdbd2cSJim Jagielski }
785*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
AutoFocus(sal_Bool _bSync)786*b1cdbd2cSJim Jagielski void FmXFormView::AutoFocus( sal_Bool _bSync )
787*b1cdbd2cSJim Jagielski {
788*b1cdbd2cSJim Jagielski 	if (m_nAutoFocusEvent)
789*b1cdbd2cSJim Jagielski         Application::RemoveUserEvent(m_nAutoFocusEvent);
790*b1cdbd2cSJim Jagielski 
791*b1cdbd2cSJim Jagielski 	if ( _bSync )
792*b1cdbd2cSJim Jagielski 		OnAutoFocus( NULL );
793*b1cdbd2cSJim Jagielski 	else
794*b1cdbd2cSJim Jagielski 		m_nAutoFocusEvent = Application::PostUserEvent(LINK(this, FmXFormView, OnAutoFocus));
795*b1cdbd2cSJim Jagielski }
796*b1cdbd2cSJim Jagielski 
797*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
isFocusable(const Reference<XControl> & i_rControl)798*b1cdbd2cSJim Jagielski bool FmXFormView::isFocusable( const Reference< XControl >& i_rControl )
799*b1cdbd2cSJim Jagielski {
800*b1cdbd2cSJim Jagielski     if ( !i_rControl.is() )
801*b1cdbd2cSJim Jagielski         return false;
802*b1cdbd2cSJim Jagielski 
803*b1cdbd2cSJim Jagielski 	try
804*b1cdbd2cSJim Jagielski 	{
805*b1cdbd2cSJim Jagielski 		Reference< XPropertySet > xModelProps( i_rControl->getModel(), UNO_QUERY_THROW );
806*b1cdbd2cSJim Jagielski 
807*b1cdbd2cSJim Jagielski         // only enabled controls are allowed to participate
808*b1cdbd2cSJim Jagielski         sal_Bool bEnabled = sal_False;
809*b1cdbd2cSJim Jagielski         OSL_VERIFY( xModelProps->getPropertyValue( FM_PROP_ENABLED ) >>= bEnabled );
810*b1cdbd2cSJim Jagielski         if ( !bEnabled )
811*b1cdbd2cSJim Jagielski             return false;
812*b1cdbd2cSJim Jagielski 
813*b1cdbd2cSJim Jagielski         // check the class id of the control model
814*b1cdbd2cSJim Jagielski 		sal_Int16 nClassId = FormComponentType::CONTROL;
815*b1cdbd2cSJim Jagielski 		OSL_VERIFY( xModelProps->getPropertyValue( FM_PROP_CLASSID ) >>= nClassId );
816*b1cdbd2cSJim Jagielski 
817*b1cdbd2cSJim Jagielski 		// controls which are not focussable
818*b1cdbd2cSJim Jagielski 		if	(	( FormComponentType::CONTROL != nClassId )
819*b1cdbd2cSJim Jagielski 			&&	( FormComponentType::IMAGEBUTTON != nClassId )
820*b1cdbd2cSJim Jagielski 			&&	( FormComponentType::GROUPBOX != nClassId )
821*b1cdbd2cSJim Jagielski 			&&	( FormComponentType::FIXEDTEXT != nClassId )
822*b1cdbd2cSJim Jagielski 			&&	( FormComponentType::HIDDENCONTROL != nClassId )
823*b1cdbd2cSJim Jagielski 			&&	( FormComponentType::IMAGECONTROL != nClassId )
824*b1cdbd2cSJim Jagielski 			&&	( FormComponentType::SCROLLBAR != nClassId )
825*b1cdbd2cSJim Jagielski 			&&	( FormComponentType::SPINBUTTON!= nClassId )
826*b1cdbd2cSJim Jagielski 			)
827*b1cdbd2cSJim Jagielski 		{
828*b1cdbd2cSJim Jagielski             return true;
829*b1cdbd2cSJim Jagielski 		}
830*b1cdbd2cSJim Jagielski 	}
831*b1cdbd2cSJim Jagielski 	catch( const Exception& e )
832*b1cdbd2cSJim Jagielski 	{
833*b1cdbd2cSJim Jagielski         DBG_UNHANDLED_EXCEPTION();
834*b1cdbd2cSJim Jagielski 	}
835*b1cdbd2cSJim Jagielski     return false;
836*b1cdbd2cSJim Jagielski }
837*b1cdbd2cSJim Jagielski 
838*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
lcl_firstFocussableControl(const Sequence<Reference<XControl>> & _rControls)839*b1cdbd2cSJim Jagielski static Reference< XControl > lcl_firstFocussableControl( const Sequence< Reference< XControl > >& _rControls )
840*b1cdbd2cSJim Jagielski {
841*b1cdbd2cSJim Jagielski 	Reference< XControl > xReturn;
842*b1cdbd2cSJim Jagielski 
843*b1cdbd2cSJim Jagielski 	// loop through all the controls
844*b1cdbd2cSJim Jagielski 	const Reference< XControl >* pControls = _rControls.getConstArray();
845*b1cdbd2cSJim Jagielski 	const Reference< XControl >* pControlsEnd = _rControls.getConstArray() + _rControls.getLength();
846*b1cdbd2cSJim Jagielski 	for ( ; pControls != pControlsEnd; ++pControls )
847*b1cdbd2cSJim Jagielski 	{
848*b1cdbd2cSJim Jagielski 		if ( !pControls->is() )
849*b1cdbd2cSJim Jagielski             continue;
850*b1cdbd2cSJim Jagielski 
851*b1cdbd2cSJim Jagielski         if ( FmXFormView::isFocusable( *pControls ) )
852*b1cdbd2cSJim Jagielski         {
853*b1cdbd2cSJim Jagielski             xReturn = *pControls;
854*b1cdbd2cSJim Jagielski             break;
855*b1cdbd2cSJim Jagielski         }
856*b1cdbd2cSJim Jagielski 	}
857*b1cdbd2cSJim Jagielski 
858*b1cdbd2cSJim Jagielski 	if ( !xReturn.is() && _rControls.getLength() )
859*b1cdbd2cSJim Jagielski 		xReturn = _rControls[0];
860*b1cdbd2cSJim Jagielski 
861*b1cdbd2cSJim Jagielski 	return xReturn;
862*b1cdbd2cSJim Jagielski }
863*b1cdbd2cSJim Jagielski 
864*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
865*b1cdbd2cSJim Jagielski namespace
866*b1cdbd2cSJim Jagielski {
867*b1cdbd2cSJim Jagielski     // .........................................................................
lcl_ensureControlsOfFormExist_nothrow(const SdrPage & _rPage,const SdrView & _rView,const Window & _rWindow,const Reference<XForm> & _rxForm)868*b1cdbd2cSJim Jagielski     void lcl_ensureControlsOfFormExist_nothrow( const SdrPage& _rPage, const SdrView& _rView, const Window& _rWindow, const Reference< XForm >& _rxForm )
869*b1cdbd2cSJim Jagielski     {
870*b1cdbd2cSJim Jagielski         try
871*b1cdbd2cSJim Jagielski         {
872*b1cdbd2cSJim Jagielski             Reference< XInterface > xNormalizedForm( _rxForm, UNO_QUERY_THROW );
873*b1cdbd2cSJim Jagielski 
874*b1cdbd2cSJim Jagielski             SdrObjListIter aSdrObjectLoop( _rPage, IM_DEEPNOGROUPS );
875*b1cdbd2cSJim Jagielski             while ( aSdrObjectLoop.IsMore() )
876*b1cdbd2cSJim Jagielski             {
877*b1cdbd2cSJim Jagielski                 FmFormObj* pFormObject = FmFormObj::GetFormObject( aSdrObjectLoop.Next() );
878*b1cdbd2cSJim Jagielski                 if ( !pFormObject )
879*b1cdbd2cSJim Jagielski                     continue;
880*b1cdbd2cSJim Jagielski 
881*b1cdbd2cSJim Jagielski                 Reference< XChild > xModel( pFormObject->GetUnoControlModel(), UNO_QUERY_THROW );
882*b1cdbd2cSJim Jagielski                 Reference< XInterface > xModelParent( xModel->getParent(), UNO_QUERY_THROW );
883*b1cdbd2cSJim Jagielski 
884*b1cdbd2cSJim Jagielski                 if ( xNormalizedForm.get() != xModelParent.get() )
885*b1cdbd2cSJim Jagielski                     continue;
886*b1cdbd2cSJim Jagielski 
887*b1cdbd2cSJim Jagielski                 pFormObject->GetUnoControl( _rView, _rWindow );
888*b1cdbd2cSJim Jagielski             }
889*b1cdbd2cSJim Jagielski         }
890*b1cdbd2cSJim Jagielski         catch( const Exception& )
891*b1cdbd2cSJim Jagielski         {
892*b1cdbd2cSJim Jagielski         	DBG_UNHANDLED_EXCEPTION();
893*b1cdbd2cSJim Jagielski         }
894*b1cdbd2cSJim Jagielski     }
895*b1cdbd2cSJim Jagielski }
896*b1cdbd2cSJim Jagielski 
897*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
getFormController(const Reference<XForm> & _rxForm,const OutputDevice & _rDevice) const898*b1cdbd2cSJim Jagielski Reference< XFormController > FmXFormView::getFormController( const Reference< XForm >& _rxForm, const OutputDevice& _rDevice ) const
899*b1cdbd2cSJim Jagielski {
900*b1cdbd2cSJim Jagielski     Reference< XFormController > xController;
901*b1cdbd2cSJim Jagielski 
902*b1cdbd2cSJim Jagielski     for (   PageWindowAdapterList::const_iterator pos = m_aPageWindowAdapters.begin();
903*b1cdbd2cSJim Jagielski             pos != m_aPageWindowAdapters.end();
904*b1cdbd2cSJim Jagielski             ++pos
905*b1cdbd2cSJim Jagielski         )
906*b1cdbd2cSJim Jagielski     {
907*b1cdbd2cSJim Jagielski         const PFormViewPageWindowAdapter pAdapter( *pos );
908*b1cdbd2cSJim Jagielski         ENSURE_OR_CONTINUE( pAdapter.get(), "FmXFormView::getFormController: invalid page window adapter!" );
909*b1cdbd2cSJim Jagielski         if ( pAdapter->getWindow() != &_rDevice )
910*b1cdbd2cSJim Jagielski             // wrong device
911*b1cdbd2cSJim Jagielski             continue;
912*b1cdbd2cSJim Jagielski 
913*b1cdbd2cSJim Jagielski         xController = pAdapter->getController( _rxForm );
914*b1cdbd2cSJim Jagielski         if ( xController.is() )
915*b1cdbd2cSJim Jagielski             break;
916*b1cdbd2cSJim Jagielski     }
917*b1cdbd2cSJim Jagielski     return xController;
918*b1cdbd2cSJim Jagielski }
919*b1cdbd2cSJim Jagielski 
920*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
921*b1cdbd2cSJim Jagielski IMPL_LINK(FmXFormView, OnAutoFocus, void*, /*EMPTYTAG*/)
922*b1cdbd2cSJim Jagielski {
923*b1cdbd2cSJim Jagielski 	m_nAutoFocusEvent = 0;
924*b1cdbd2cSJim Jagielski 
925*b1cdbd2cSJim Jagielski 	// go to the first form of our page, examine it's TabController, go to it's first (in terms of the tab order)
926*b1cdbd2cSJim Jagielski 	// control, give it the focus
927*b1cdbd2cSJim Jagielski 
928*b1cdbd2cSJim Jagielski     do
929*b1cdbd2cSJim Jagielski     {
930*b1cdbd2cSJim Jagielski 
931*b1cdbd2cSJim Jagielski 	// get the forms collection of the page we belong to
932*b1cdbd2cSJim Jagielski     FmFormPage* pPage = m_pView ? PTR_CAST( FmFormPage, m_pView->GetSdrPageView()->GetPage() ) : NULL;
933*b1cdbd2cSJim Jagielski     Reference< XIndexAccess > xForms( pPage ? Reference< XIndexAccess >( pPage->GetForms(), UNO_QUERY ) : Reference< XIndexAccess >() );
934*b1cdbd2cSJim Jagielski 
935*b1cdbd2cSJim Jagielski     const PFormViewPageWindowAdapter pAdapter = m_aPageWindowAdapters.empty() ? NULL : m_aPageWindowAdapters[0];
936*b1cdbd2cSJim Jagielski     const Window* pWindow = pAdapter.get() ? pAdapter->getWindow() : NULL;
937*b1cdbd2cSJim Jagielski 
938*b1cdbd2cSJim Jagielski     ENSURE_OR_RETURN( xForms.is() && pWindow, "FmXFormView::OnAutoFocus: could not collect all essentials!", 0L );
939*b1cdbd2cSJim Jagielski 
940*b1cdbd2cSJim Jagielski     try
941*b1cdbd2cSJim Jagielski 	{
942*b1cdbd2cSJim Jagielski 		// go for the tab controller of the first form
943*b1cdbd2cSJim Jagielski         if ( !xForms->getCount() )
944*b1cdbd2cSJim Jagielski             break;
945*b1cdbd2cSJim Jagielski         Reference< XForm > xForm( xForms->getByIndex( 0 ), UNO_QUERY_THROW );
946*b1cdbd2cSJim Jagielski 		Reference< XTabController > xTabController( pAdapter->getController( xForm ), UNO_QUERY_THROW );
947*b1cdbd2cSJim Jagielski 
948*b1cdbd2cSJim Jagielski         // go for the first control of the controller
949*b1cdbd2cSJim Jagielski 		Sequence< Reference< XControl > > aControls( xTabController->getControls() );
950*b1cdbd2cSJim Jagielski         if ( aControls.getLength() == 0 )
951*b1cdbd2cSJim Jagielski         {
952*b1cdbd2cSJim Jagielski             Reference< XElementAccess > xFormElementAccess( xForm, UNO_QUERY_THROW );
953*b1cdbd2cSJim Jagielski             if ( xFormElementAccess->hasElements() )
954*b1cdbd2cSJim Jagielski             {
955*b1cdbd2cSJim Jagielski                 // there are control models in the form, but no controls, yet.
956*b1cdbd2cSJim Jagielski                 // Well, since some time controls are created on demand only. In particular,
957*b1cdbd2cSJim Jagielski                 // they're normally created when they're first painted.
958*b1cdbd2cSJim Jagielski                 // Unfortunately, the FormController does not have any way to
959*b1cdbd2cSJim Jagielski                 // trigger the creation itself, so we must hack this ...
960*b1cdbd2cSJim Jagielski                 lcl_ensureControlsOfFormExist_nothrow( *pPage, *m_pView, *pWindow, xForm );
961*b1cdbd2cSJim Jagielski                 aControls = xTabController->getControls();
962*b1cdbd2cSJim Jagielski                 OSL_ENSURE( aControls.getLength(), "FmXFormView::OnAutoFocus: no controls at all!" );
963*b1cdbd2cSJim Jagielski             }
964*b1cdbd2cSJim Jagielski         }
965*b1cdbd2cSJim Jagielski 
966*b1cdbd2cSJim Jagielski 		// set the focus to this first control
967*b1cdbd2cSJim Jagielski 		Reference< XWindow > xControlWindow( lcl_firstFocussableControl( aControls ), UNO_QUERY );
968*b1cdbd2cSJim Jagielski 		if ( !xControlWindow.is() )
969*b1cdbd2cSJim Jagielski             break;
970*b1cdbd2cSJim Jagielski 
971*b1cdbd2cSJim Jagielski         xControlWindow->setFocus();
972*b1cdbd2cSJim Jagielski 
973*b1cdbd2cSJim Jagielski 		// ensure that the control is visible
974*b1cdbd2cSJim Jagielski 		// 80210 - 12/07/00 - FS
975*b1cdbd2cSJim Jagielski         const Window* pCurrentWindow = dynamic_cast< const Window* >( m_pView->GetActualOutDev() );
976*b1cdbd2cSJim Jagielski         if ( pCurrentWindow )
977*b1cdbd2cSJim Jagielski 		{
978*b1cdbd2cSJim Jagielski             awt::Rectangle aRect = xControlWindow->getPosSize();
979*b1cdbd2cSJim Jagielski 			::Rectangle aNonUnoRect( aRect.X, aRect.Y, aRect.X + aRect.Width, aRect.Y + aRect.Height );
980*b1cdbd2cSJim Jagielski 			m_pView->MakeVisible( pCurrentWindow->PixelToLogic( aNonUnoRect ), *const_cast< Window* >( pCurrentWindow ) );
981*b1cdbd2cSJim Jagielski 		}
982*b1cdbd2cSJim Jagielski 	}
983*b1cdbd2cSJim Jagielski     catch( const Exception& )
984*b1cdbd2cSJim Jagielski     {
985*b1cdbd2cSJim Jagielski     	DBG_UNHANDLED_EXCEPTION();
986*b1cdbd2cSJim Jagielski     }
987*b1cdbd2cSJim Jagielski 
988*b1cdbd2cSJim Jagielski     }   // do
989*b1cdbd2cSJim Jagielski     while ( false );
990*b1cdbd2cSJim Jagielski 
991*b1cdbd2cSJim Jagielski 	return 1L;
992*b1cdbd2cSJim Jagielski }
993*b1cdbd2cSJim Jagielski 
994*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
onCreatedFormObject(FmFormObj & _rFormObject)995*b1cdbd2cSJim Jagielski void FmXFormView::onCreatedFormObject( FmFormObj& _rFormObject )
996*b1cdbd2cSJim Jagielski {
997*b1cdbd2cSJim Jagielski     FmFormShell* pShell = m_pView ? m_pView->GetFormShell() : NULL;
998*b1cdbd2cSJim Jagielski     FmXFormShell* pShellImpl = pShell ? pShell->GetImpl() : NULL;
999*b1cdbd2cSJim Jagielski     OSL_ENSURE( pShellImpl, "FmXFormView::onCreatedFormObject: no form shell!" );
1000*b1cdbd2cSJim Jagielski     if ( !pShellImpl )
1001*b1cdbd2cSJim Jagielski         return;
1002*b1cdbd2cSJim Jagielski 
1003*b1cdbd2cSJim Jagielski     // it is valid that the form shell's forms collection is not initialized, yet
1004*b1cdbd2cSJim Jagielski     pShellImpl->UpdateForms( sal_True );
1005*b1cdbd2cSJim Jagielski 
1006*b1cdbd2cSJim Jagielski     m_xLastCreatedControlModel.set( _rFormObject.GetUnoControlModel(), UNO_QUERY );
1007*b1cdbd2cSJim Jagielski     if ( !m_xLastCreatedControlModel.is() )
1008*b1cdbd2cSJim Jagielski         return;
1009*b1cdbd2cSJim Jagielski 
1010*b1cdbd2cSJim Jagielski     // some initial property defaults
1011*b1cdbd2cSJim Jagielski     FormControlFactory aControlFactory( m_aContext );
1012*b1cdbd2cSJim Jagielski     aControlFactory.initializeControlModel( pShellImpl->getDocumentType(), _rFormObject );
1013*b1cdbd2cSJim Jagielski 
1014*b1cdbd2cSJim Jagielski     if ( !pShellImpl->GetWizardUsing() )
1015*b1cdbd2cSJim Jagielski         return;
1016*b1cdbd2cSJim Jagielski 
1017*b1cdbd2cSJim Jagielski     // #i31958# don't call wizards in XForms mode
1018*b1cdbd2cSJim Jagielski     if ( pShellImpl->isEnhancedForm() )
1019*b1cdbd2cSJim Jagielski         return;
1020*b1cdbd2cSJim Jagielski 
1021*b1cdbd2cSJim Jagielski     // #i46898# no wizards if there is no Base installed - currently, all wizards are
1022*b1cdbd2cSJim Jagielski     // database related
1023*b1cdbd2cSJim Jagielski     if ( !SvtModuleOptions().IsModuleInstalled( SvtModuleOptions::E_SDATABASE ) )
1024*b1cdbd2cSJim Jagielski         return;
1025*b1cdbd2cSJim Jagielski 
1026*b1cdbd2cSJim Jagielski     if ( m_nControlWizardEvent )
1027*b1cdbd2cSJim Jagielski         Application::RemoveUserEvent( m_nControlWizardEvent );
1028*b1cdbd2cSJim Jagielski     m_nControlWizardEvent = Application::PostUserEvent( LINK( this, FmXFormView, OnStartControlWizard ) );
1029*b1cdbd2cSJim Jagielski }
1030*b1cdbd2cSJim Jagielski 
1031*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
1032*b1cdbd2cSJim Jagielski IMPL_LINK( FmXFormView, OnStartControlWizard, void*, /**/ )
1033*b1cdbd2cSJim Jagielski {
1034*b1cdbd2cSJim Jagielski     m_nControlWizardEvent = 0;
1035*b1cdbd2cSJim Jagielski     OSL_PRECOND( m_xLastCreatedControlModel.is(), "FmXFormView::OnStartControlWizard: illegal call!" );
1036*b1cdbd2cSJim Jagielski     if ( !m_xLastCreatedControlModel.is() )
1037*b1cdbd2cSJim Jagielski         return 0L;
1038*b1cdbd2cSJim Jagielski 
1039*b1cdbd2cSJim Jagielski     sal_Int16 nClassId = FormComponentType::CONTROL;
1040*b1cdbd2cSJim Jagielski     try
1041*b1cdbd2cSJim Jagielski     {
1042*b1cdbd2cSJim Jagielski         OSL_VERIFY( m_xLastCreatedControlModel->getPropertyValue( FM_PROP_CLASSID ) >>= nClassId );
1043*b1cdbd2cSJim Jagielski     }
1044*b1cdbd2cSJim Jagielski     catch( const Exception& )
1045*b1cdbd2cSJim Jagielski     {
1046*b1cdbd2cSJim Jagielski     	DBG_UNHANDLED_EXCEPTION();
1047*b1cdbd2cSJim Jagielski     }
1048*b1cdbd2cSJim Jagielski 
1049*b1cdbd2cSJim Jagielski     const sal_Char* pWizardAsciiName = NULL;
1050*b1cdbd2cSJim Jagielski     switch ( nClassId )
1051*b1cdbd2cSJim Jagielski     {
1052*b1cdbd2cSJim Jagielski         case FormComponentType::GRIDCONTROL:
1053*b1cdbd2cSJim Jagielski             pWizardAsciiName = "com.sun.star.sdb.GridControlAutoPilot";
1054*b1cdbd2cSJim Jagielski             break;
1055*b1cdbd2cSJim Jagielski         case FormComponentType::LISTBOX:
1056*b1cdbd2cSJim Jagielski         case FormComponentType::COMBOBOX:
1057*b1cdbd2cSJim Jagielski             pWizardAsciiName = "com.sun.star.sdb.ListComboBoxAutoPilot";
1058*b1cdbd2cSJim Jagielski             break;
1059*b1cdbd2cSJim Jagielski         case FormComponentType::GROUPBOX:
1060*b1cdbd2cSJim Jagielski             pWizardAsciiName = "com.sun.star.sdb.GroupBoxAutoPilot";
1061*b1cdbd2cSJim Jagielski             break;
1062*b1cdbd2cSJim Jagielski     }
1063*b1cdbd2cSJim Jagielski 
1064*b1cdbd2cSJim Jagielski     if ( pWizardAsciiName )
1065*b1cdbd2cSJim Jagielski     {
1066*b1cdbd2cSJim Jagielski         // build the argument list
1067*b1cdbd2cSJim Jagielski         ::comphelper::NamedValueCollection aWizardArgs;
1068*b1cdbd2cSJim Jagielski         aWizardArgs.put( "ObjectModel", m_xLastCreatedControlModel );
1069*b1cdbd2cSJim Jagielski 
1070*b1cdbd2cSJim Jagielski         // create the wizard object
1071*b1cdbd2cSJim Jagielski         Reference< XExecutableDialog > xWizard;
1072*b1cdbd2cSJim Jagielski         try
1073*b1cdbd2cSJim Jagielski         {
1074*b1cdbd2cSJim Jagielski             m_aContext.createComponentWithArguments( pWizardAsciiName, aWizardArgs.getWrappedPropertyValues(), xWizard );
1075*b1cdbd2cSJim Jagielski         }
1076*b1cdbd2cSJim Jagielski         catch( const Exception& )
1077*b1cdbd2cSJim Jagielski         {
1078*b1cdbd2cSJim Jagielski             DBG_UNHANDLED_EXCEPTION();
1079*b1cdbd2cSJim Jagielski         }
1080*b1cdbd2cSJim Jagielski 
1081*b1cdbd2cSJim Jagielski         if ( !xWizard.is() )
1082*b1cdbd2cSJim Jagielski         {
1083*b1cdbd2cSJim Jagielski             ShowServiceNotAvailableError( NULL, String::CreateFromAscii( pWizardAsciiName ), sal_True );
1084*b1cdbd2cSJim Jagielski         }
1085*b1cdbd2cSJim Jagielski         else
1086*b1cdbd2cSJim Jagielski         {
1087*b1cdbd2cSJim Jagielski             // execute the wizard
1088*b1cdbd2cSJim Jagielski             try
1089*b1cdbd2cSJim Jagielski             {
1090*b1cdbd2cSJim Jagielski                 xWizard->execute();
1091*b1cdbd2cSJim Jagielski             }
1092*b1cdbd2cSJim Jagielski             catch( const Exception& )
1093*b1cdbd2cSJim Jagielski             {
1094*b1cdbd2cSJim Jagielski                 DBG_UNHANDLED_EXCEPTION();
1095*b1cdbd2cSJim Jagielski             }
1096*b1cdbd2cSJim Jagielski         }
1097*b1cdbd2cSJim Jagielski     }
1098*b1cdbd2cSJim Jagielski 
1099*b1cdbd2cSJim Jagielski     m_xLastCreatedControlModel.clear();
1100*b1cdbd2cSJim Jagielski     return 1L;
1101*b1cdbd2cSJim Jagielski }
1102*b1cdbd2cSJim Jagielski 
1103*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
1104*b1cdbd2cSJim Jagielski namespace
1105*b1cdbd2cSJim Jagielski {
lcl_insertIntoFormComponentHierarchy_throw(const FmFormView & _rView,const SdrUnoObj & _rSdrObj,const Reference<XDataSource> & _rxDataSource=NULL,const::rtl::OUString & _rDataSourceName=::rtl::OUString (),const::rtl::OUString & _rCommand=::rtl::OUString (),const sal_Int32 _nCommandType=-1)1106*b1cdbd2cSJim Jagielski     void lcl_insertIntoFormComponentHierarchy_throw( const FmFormView& _rView, const SdrUnoObj& _rSdrObj,
1107*b1cdbd2cSJim Jagielski         const Reference< XDataSource >& _rxDataSource = NULL, const ::rtl::OUString& _rDataSourceName = ::rtl::OUString(),
1108*b1cdbd2cSJim Jagielski         const ::rtl::OUString& _rCommand = ::rtl::OUString(), const sal_Int32 _nCommandType = -1 )
1109*b1cdbd2cSJim Jagielski     {
1110*b1cdbd2cSJim Jagielski 		FmFormPage& rPage = static_cast< FmFormPage& >( *_rView.GetSdrPageView()->GetPage() );
1111*b1cdbd2cSJim Jagielski 
1112*b1cdbd2cSJim Jagielski 	    Reference< XFormComponent > xFormComponent( _rSdrObj.GetUnoControlModel(), UNO_QUERY_THROW );
1113*b1cdbd2cSJim Jagielski         Reference< XForm > xTargetForm(
1114*b1cdbd2cSJim Jagielski             rPage.GetImpl().findPlaceInFormComponentHierarchy( xFormComponent, _rxDataSource, _rDataSourceName, _rCommand, _nCommandType ),
1115*b1cdbd2cSJim Jagielski             UNO_SET_THROW );
1116*b1cdbd2cSJim Jagielski 
1117*b1cdbd2cSJim Jagielski         rPage.GetImpl().setUniqueName( xFormComponent, xTargetForm );
1118*b1cdbd2cSJim Jagielski 
1119*b1cdbd2cSJim Jagielski         Reference< XIndexContainer > xFormAsContainer( xTargetForm, UNO_QUERY_THROW );
1120*b1cdbd2cSJim Jagielski 	    xFormAsContainer->insertByIndex( xFormAsContainer->getCount(), makeAny( xFormComponent ) );
1121*b1cdbd2cSJim Jagielski     }
1122*b1cdbd2cSJim Jagielski }
1123*b1cdbd2cSJim Jagielski 
1124*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
implCreateFieldControl(const::svx::ODataAccessDescriptor & _rColumnDescriptor)1125*b1cdbd2cSJim Jagielski SdrObject* FmXFormView::implCreateFieldControl( const ::svx::ODataAccessDescriptor& _rColumnDescriptor )
1126*b1cdbd2cSJim Jagielski {
1127*b1cdbd2cSJim Jagielski 	// not if we're in design mode
1128*b1cdbd2cSJim Jagielski 	if ( !m_pView->IsDesignMode() )
1129*b1cdbd2cSJim Jagielski 		return NULL;
1130*b1cdbd2cSJim Jagielski 
1131*b1cdbd2cSJim Jagielski 	::rtl::OUString sCommand, sFieldName;
1132*b1cdbd2cSJim Jagielski 	sal_Int32 nCommandType = CommandType::COMMAND;
1133*b1cdbd2cSJim Jagielski     SharedConnection xConnection;
1134*b1cdbd2cSJim Jagielski 
1135*b1cdbd2cSJim Jagielski 	::rtl::OUString sDataSource = _rColumnDescriptor.getDataSource();
1136*b1cdbd2cSJim Jagielski 	_rColumnDescriptor[ daCommand ]		>>= sCommand;
1137*b1cdbd2cSJim Jagielski 	_rColumnDescriptor[ daColumnName ]	>>= sFieldName;
1138*b1cdbd2cSJim Jagielski 	_rColumnDescriptor[ daCommandType ]	>>= nCommandType;
1139*b1cdbd2cSJim Jagielski     {
1140*b1cdbd2cSJim Jagielski 	    Reference< XConnection > xExternalConnection;
1141*b1cdbd2cSJim Jagielski 	    _rColumnDescriptor[ daConnection ]  >>= xExternalConnection;
1142*b1cdbd2cSJim Jagielski         xConnection.reset( xExternalConnection, SharedConnection::NoTakeOwnership );
1143*b1cdbd2cSJim Jagielski     }
1144*b1cdbd2cSJim Jagielski 
1145*b1cdbd2cSJim Jagielski 	if  (   !sCommand.getLength()
1146*b1cdbd2cSJim Jagielski         ||  !sFieldName.getLength()
1147*b1cdbd2cSJim Jagielski         ||  (   !sDataSource.getLength()
1148*b1cdbd2cSJim Jagielski             &&  !xConnection.is()
1149*b1cdbd2cSJim Jagielski             )
1150*b1cdbd2cSJim Jagielski         )
1151*b1cdbd2cSJim Jagielski     {
1152*b1cdbd2cSJim Jagielski         DBG_ERROR( "FmXFormView::implCreateFieldControl: nonsense!" );
1153*b1cdbd2cSJim Jagielski     }
1154*b1cdbd2cSJim Jagielski 
1155*b1cdbd2cSJim Jagielski 	Reference< XDataSource > xDataSource;
1156*b1cdbd2cSJim Jagielski 	SQLErrorEvent aError;
1157*b1cdbd2cSJim Jagielski 	try
1158*b1cdbd2cSJim Jagielski 	{
1159*b1cdbd2cSJim Jagielski         if ( xConnection.is() && !xDataSource.is() && !sDataSource.getLength() )
1160*b1cdbd2cSJim Jagielski         {
1161*b1cdbd2cSJim Jagielski             Reference< XChild > xChild( xConnection, UNO_QUERY );
1162*b1cdbd2cSJim Jagielski             if ( xChild.is() )
1163*b1cdbd2cSJim Jagielski                 xDataSource = xDataSource.query( xChild->getParent() );
1164*b1cdbd2cSJim Jagielski         }
1165*b1cdbd2cSJim Jagielski 
1166*b1cdbd2cSJim Jagielski 	    // obtain the data source
1167*b1cdbd2cSJim Jagielski         if ( !xDataSource.is() )
1168*b1cdbd2cSJim Jagielski 		    xDataSource = OStaticDataAccessTools().getDataSource( sDataSource, m_aContext.getLegacyServiceFactory() );
1169*b1cdbd2cSJim Jagielski 
1170*b1cdbd2cSJim Jagielski         // and the connection, if necessary
1171*b1cdbd2cSJim Jagielski 		if ( !xConnection.is() )
1172*b1cdbd2cSJim Jagielski 			xConnection.reset( OStaticDataAccessTools().getConnection_withFeedback(
1173*b1cdbd2cSJim Jagielski                 sDataSource,
1174*b1cdbd2cSJim Jagielski                 ::rtl::OUString(),
1175*b1cdbd2cSJim Jagielski                 ::rtl::OUString(),
1176*b1cdbd2cSJim Jagielski                 m_aContext.getLegacyServiceFactory()
1177*b1cdbd2cSJim Jagielski             ) );
1178*b1cdbd2cSJim Jagielski 	}
1179*b1cdbd2cSJim Jagielski     catch ( const SQLException& )
1180*b1cdbd2cSJim Jagielski     {
1181*b1cdbd2cSJim Jagielski         aError.Reason = ::cppu::getCaughtException();
1182*b1cdbd2cSJim Jagielski     }
1183*b1cdbd2cSJim Jagielski     catch( const Exception& ) { /* will be asserted below */ }
1184*b1cdbd2cSJim Jagielski 	if (aError.Reason.hasValue())
1185*b1cdbd2cSJim Jagielski 	{
1186*b1cdbd2cSJim Jagielski 		displayAsyncErrorMessage( aError );
1187*b1cdbd2cSJim Jagielski 		return NULL;
1188*b1cdbd2cSJim Jagielski 	}
1189*b1cdbd2cSJim Jagielski 
1190*b1cdbd2cSJim Jagielski 	// need a data source and a connection here
1191*b1cdbd2cSJim Jagielski 	if (!xDataSource.is() || !xConnection.is())
1192*b1cdbd2cSJim Jagielski 	{
1193*b1cdbd2cSJim Jagielski 		DBG_ERROR("FmXFormView::implCreateFieldControl : could not retrieve the data source or the connection!");
1194*b1cdbd2cSJim Jagielski 		return NULL;
1195*b1cdbd2cSJim Jagielski 	}
1196*b1cdbd2cSJim Jagielski 
1197*b1cdbd2cSJim Jagielski 	OStaticDataAccessTools aDBATools;
1198*b1cdbd2cSJim Jagielski 	Reference< XComponent > xKeepFieldsAlive;
1199*b1cdbd2cSJim Jagielski 	// go
1200*b1cdbd2cSJim Jagielski 	try
1201*b1cdbd2cSJim Jagielski 	{
1202*b1cdbd2cSJim Jagielski 		// determine the table/query field which we should create a control for
1203*b1cdbd2cSJim Jagielski 		Reference< XPropertySet >	xField;
1204*b1cdbd2cSJim Jagielski 
1205*b1cdbd2cSJim Jagielski 		Reference< XNameAccess >	xFields = aDBATools.getFieldsByCommandDescriptor(
1206*b1cdbd2cSJim Jagielski 			xConnection, nCommandType, sCommand, xKeepFieldsAlive );
1207*b1cdbd2cSJim Jagielski 
1208*b1cdbd2cSJim Jagielski 		if (xFields.is() && xFields->hasByName(sFieldName))
1209*b1cdbd2cSJim Jagielski 			xFields->getByName(sFieldName) >>= xField;
1210*b1cdbd2cSJim Jagielski         if ( !xField.is() )
1211*b1cdbd2cSJim Jagielski             return NULL;
1212*b1cdbd2cSJim Jagielski 
1213*b1cdbd2cSJim Jagielski 		Reference< XNumberFormatsSupplier > xSupplier( aDBATools.getNumberFormats( xConnection, sal_False ), UNO_SET_THROW );
1214*b1cdbd2cSJim Jagielski 		Reference< XNumberFormats >  xNumberFormats( xSupplier->getNumberFormats(), UNO_SET_THROW );
1215*b1cdbd2cSJim Jagielski 
1216*b1cdbd2cSJim Jagielski 		::rtl::OUString sLabelPostfix;
1217*b1cdbd2cSJim Jagielski 
1218*b1cdbd2cSJim Jagielski 		////////////////////////////////////////////////////////////////
1219*b1cdbd2cSJim Jagielski 		// nur fuer Textgroesse
1220*b1cdbd2cSJim Jagielski 		OutputDevice* pOutDev = NULL;
1221*b1cdbd2cSJim Jagielski 		if (m_pView->GetActualOutDev() && m_pView->GetActualOutDev()->GetOutDevType() == OUTDEV_WINDOW)
1222*b1cdbd2cSJim Jagielski 			pOutDev = const_cast<OutputDevice*>(m_pView->GetActualOutDev());
1223*b1cdbd2cSJim Jagielski 		else
1224*b1cdbd2cSJim Jagielski 		{// OutDev suchen
1225*b1cdbd2cSJim Jagielski 			SdrPageView* pPageView = m_pView->GetSdrPageView();
1226*b1cdbd2cSJim Jagielski 			if( pPageView && !pOutDev )
1227*b1cdbd2cSJim Jagielski 			{
1228*b1cdbd2cSJim Jagielski 				// const SdrPageViewWinList& rWinList = pPageView->GetWinList();
1229*b1cdbd2cSJim Jagielski 				// const SdrPageViewWindows& rPageViewWindows = pPageView->GetPageViewWindows();
1230*b1cdbd2cSJim Jagielski 
1231*b1cdbd2cSJim Jagielski 				for( sal_uInt32 i = 0L; i < pPageView->PageWindowCount(); i++ )
1232*b1cdbd2cSJim Jagielski 				{
1233*b1cdbd2cSJim Jagielski 					const SdrPageWindow& rPageWindow = *pPageView->GetPageWindow(i);
1234*b1cdbd2cSJim Jagielski 
1235*b1cdbd2cSJim Jagielski 					if( rPageWindow.GetPaintWindow().OutputToWindow())
1236*b1cdbd2cSJim Jagielski 					{
1237*b1cdbd2cSJim Jagielski 						pOutDev = &rPageWindow.GetPaintWindow().GetOutputDevice();
1238*b1cdbd2cSJim Jagielski 						break;
1239*b1cdbd2cSJim Jagielski 					}
1240*b1cdbd2cSJim Jagielski 				}
1241*b1cdbd2cSJim Jagielski 			}
1242*b1cdbd2cSJim Jagielski 		}
1243*b1cdbd2cSJim Jagielski 
1244*b1cdbd2cSJim Jagielski 		if ( !pOutDev )
1245*b1cdbd2cSJim Jagielski 			return NULL;
1246*b1cdbd2cSJim Jagielski 
1247*b1cdbd2cSJim Jagielski 		sal_Int32 nDataType = ::comphelper::getINT32(xField->getPropertyValue(FM_PROP_FIELDTYPE));
1248*b1cdbd2cSJim Jagielski 		if ((DataType::BINARY == nDataType) || (DataType::VARBINARY == nDataType))
1249*b1cdbd2cSJim Jagielski 			return NULL;
1250*b1cdbd2cSJim Jagielski 
1251*b1cdbd2cSJim Jagielski 		//////////////////////////////////////////////////////////////////////
1252*b1cdbd2cSJim Jagielski 		// determine the control type by examining the data type of the bound column
1253*b1cdbd2cSJim Jagielski 		sal_uInt16 nOBJID = 0;
1254*b1cdbd2cSJim Jagielski 		sal_Bool bDateNTimeField = sal_False;
1255*b1cdbd2cSJim Jagielski 
1256*b1cdbd2cSJim Jagielski 		sal_Bool bIsCurrency = sal_False;
1257*b1cdbd2cSJim Jagielski 		if (::comphelper::hasProperty(FM_PROP_ISCURRENCY, xField))
1258*b1cdbd2cSJim Jagielski 			bIsCurrency = ::comphelper::getBOOL(xField->getPropertyValue(FM_PROP_ISCURRENCY));
1259*b1cdbd2cSJim Jagielski 
1260*b1cdbd2cSJim Jagielski 		if (bIsCurrency)
1261*b1cdbd2cSJim Jagielski 			nOBJID = OBJ_FM_CURRENCYFIELD;
1262*b1cdbd2cSJim Jagielski 		else
1263*b1cdbd2cSJim Jagielski 			switch (nDataType)
1264*b1cdbd2cSJim Jagielski 			{
1265*b1cdbd2cSJim Jagielski 				case DataType::BLOB:
1266*b1cdbd2cSJim Jagielski 				case DataType::LONGVARBINARY:
1267*b1cdbd2cSJim Jagielski 					nOBJID = OBJ_FM_IMAGECONTROL;
1268*b1cdbd2cSJim Jagielski 					break;
1269*b1cdbd2cSJim Jagielski 				case DataType::LONGVARCHAR:
1270*b1cdbd2cSJim Jagielski 				case DataType::CLOB:
1271*b1cdbd2cSJim Jagielski 					nOBJID = OBJ_FM_EDIT;
1272*b1cdbd2cSJim Jagielski 					break;
1273*b1cdbd2cSJim Jagielski 				case DataType::BINARY:
1274*b1cdbd2cSJim Jagielski 				case DataType::VARBINARY:
1275*b1cdbd2cSJim Jagielski 					return NULL;
1276*b1cdbd2cSJim Jagielski 				case DataType::BIT:
1277*b1cdbd2cSJim Jagielski 				case DataType::BOOLEAN:
1278*b1cdbd2cSJim Jagielski 					nOBJID = OBJ_FM_CHECKBOX;
1279*b1cdbd2cSJim Jagielski 					break;
1280*b1cdbd2cSJim Jagielski 				case DataType::TINYINT:
1281*b1cdbd2cSJim Jagielski 				case DataType::SMALLINT:
1282*b1cdbd2cSJim Jagielski 				case DataType::INTEGER:
1283*b1cdbd2cSJim Jagielski 					nOBJID = OBJ_FM_NUMERICFIELD;
1284*b1cdbd2cSJim Jagielski 					break;
1285*b1cdbd2cSJim Jagielski 				case DataType::REAL:
1286*b1cdbd2cSJim Jagielski 				case DataType::DOUBLE:
1287*b1cdbd2cSJim Jagielski 				case DataType::NUMERIC:
1288*b1cdbd2cSJim Jagielski 				case DataType::DECIMAL:
1289*b1cdbd2cSJim Jagielski 					nOBJID = OBJ_FM_FORMATTEDFIELD;
1290*b1cdbd2cSJim Jagielski 					break;
1291*b1cdbd2cSJim Jagielski 				case DataType::TIMESTAMP:
1292*b1cdbd2cSJim Jagielski 					bDateNTimeField = sal_True;
1293*b1cdbd2cSJim Jagielski 					sLabelPostfix = String( SVX_RES( RID_STR_POSTFIX_DATE ) );
1294*b1cdbd2cSJim Jagielski 					// DON'T break !
1295*b1cdbd2cSJim Jagielski 				case DataType::DATE:
1296*b1cdbd2cSJim Jagielski 					nOBJID = OBJ_FM_DATEFIELD;
1297*b1cdbd2cSJim Jagielski 					break;
1298*b1cdbd2cSJim Jagielski 				case DataType::TIME:
1299*b1cdbd2cSJim Jagielski 					nOBJID = OBJ_FM_TIMEFIELD;
1300*b1cdbd2cSJim Jagielski 					break;
1301*b1cdbd2cSJim Jagielski 				case DataType::CHAR:
1302*b1cdbd2cSJim Jagielski 				case DataType::VARCHAR:
1303*b1cdbd2cSJim Jagielski 				default:
1304*b1cdbd2cSJim Jagielski 					nOBJID = OBJ_FM_EDIT;
1305*b1cdbd2cSJim Jagielski 					break;
1306*b1cdbd2cSJim Jagielski 			}
1307*b1cdbd2cSJim Jagielski 		if (!nOBJID)
1308*b1cdbd2cSJim Jagielski 			return NULL;
1309*b1cdbd2cSJim Jagielski 
1310*b1cdbd2cSJim Jagielski 		SdrUnoObj* pLabel( NULL );
1311*b1cdbd2cSJim Jagielski 		SdrUnoObj* pControl( NULL );
1312*b1cdbd2cSJim Jagielski 		if  (   !createControlLabelPair( *pOutDev, 0, 0, xField, xNumberFormats, nOBJID, sLabelPostfix,
1313*b1cdbd2cSJim Jagielski                     pLabel, pControl, xDataSource, sDataSource, sCommand, nCommandType )
1314*b1cdbd2cSJim Jagielski             )
1315*b1cdbd2cSJim Jagielski 		{
1316*b1cdbd2cSJim Jagielski 			return NULL;
1317*b1cdbd2cSJim Jagielski 		}
1318*b1cdbd2cSJim Jagielski 
1319*b1cdbd2cSJim Jagielski 		//////////////////////////////////////////////////////////////////////
1320*b1cdbd2cSJim Jagielski 		// group objects
1321*b1cdbd2cSJim Jagielski 		bool bCheckbox = ( OBJ_FM_CHECKBOX == nOBJID );
1322*b1cdbd2cSJim Jagielski         OSL_ENSURE( !bCheckbox || !pLabel, "FmXFormView::implCreateFieldControl: why was there a label created for a check box?" );
1323*b1cdbd2cSJim Jagielski         if ( bCheckbox )
1324*b1cdbd2cSJim Jagielski             return pControl;
1325*b1cdbd2cSJim Jagielski 
1326*b1cdbd2cSJim Jagielski 		SdrObjGroup* pGroup  = new SdrObjGroup();
1327*b1cdbd2cSJim Jagielski 		SdrObjList* pObjList = pGroup->GetSubList();
1328*b1cdbd2cSJim Jagielski 		pObjList->InsertObject( pLabel );
1329*b1cdbd2cSJim Jagielski 		pObjList->InsertObject( pControl );
1330*b1cdbd2cSJim Jagielski 
1331*b1cdbd2cSJim Jagielski 		if ( bDateNTimeField )
1332*b1cdbd2cSJim Jagielski 		{	// so far we created a date field only, but we also need a time field
1333*b1cdbd2cSJim Jagielski 			pLabel = pControl = NULL;
1334*b1cdbd2cSJim Jagielski 			if  (   createControlLabelPair( *pOutDev, 0, 1000, xField, xNumberFormats, OBJ_FM_TIMEFIELD,
1335*b1cdbd2cSJim Jagielski                         String( SVX_RES( RID_STR_POSTFIX_TIME ) ), pLabel, pControl,
1336*b1cdbd2cSJim Jagielski                         xDataSource, sDataSource, sCommand, nCommandType )
1337*b1cdbd2cSJim Jagielski                 )
1338*b1cdbd2cSJim Jagielski 			{
1339*b1cdbd2cSJim Jagielski 				pObjList->InsertObject( pLabel );
1340*b1cdbd2cSJim Jagielski 				pObjList->InsertObject( pControl );
1341*b1cdbd2cSJim Jagielski 			}
1342*b1cdbd2cSJim Jagielski 		}
1343*b1cdbd2cSJim Jagielski 
1344*b1cdbd2cSJim Jagielski 		return pGroup; // und fertig
1345*b1cdbd2cSJim Jagielski 	}
1346*b1cdbd2cSJim Jagielski 	catch(const Exception&)
1347*b1cdbd2cSJim Jagielski 	{
1348*b1cdbd2cSJim Jagielski         DBG_UNHANDLED_EXCEPTION();
1349*b1cdbd2cSJim Jagielski 	}
1350*b1cdbd2cSJim Jagielski 
1351*b1cdbd2cSJim Jagielski 
1352*b1cdbd2cSJim Jagielski 	return NULL;
1353*b1cdbd2cSJim Jagielski }
1354*b1cdbd2cSJim Jagielski 
1355*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
implCreateXFormsControl(const::svx::OXFormsDescriptor & _rDesc)1356*b1cdbd2cSJim Jagielski SdrObject* FmXFormView::implCreateXFormsControl( const ::svx::OXFormsDescriptor &_rDesc )
1357*b1cdbd2cSJim Jagielski {
1358*b1cdbd2cSJim Jagielski 	// not if we're in design mode
1359*b1cdbd2cSJim Jagielski 	if ( !m_pView->IsDesignMode() )
1360*b1cdbd2cSJim Jagielski 		return NULL;
1361*b1cdbd2cSJim Jagielski 
1362*b1cdbd2cSJim Jagielski 	Reference< XComponent > xKeepFieldsAlive;
1363*b1cdbd2cSJim Jagielski 
1364*b1cdbd2cSJim Jagielski 	// go
1365*b1cdbd2cSJim Jagielski 	try
1366*b1cdbd2cSJim Jagielski 	{
1367*b1cdbd2cSJim Jagielski 		// determine the table/query field which we should create a control for
1368*b1cdbd2cSJim Jagielski 		Reference< XNumberFormats >	xNumberFormats;
1369*b1cdbd2cSJim Jagielski 		::rtl::OUString sLabelPostfix = _rDesc.szName;
1370*b1cdbd2cSJim Jagielski 
1371*b1cdbd2cSJim Jagielski 		////////////////////////////////////////////////////////////////
1372*b1cdbd2cSJim Jagielski 		// nur fuer Textgroesse
1373*b1cdbd2cSJim Jagielski 		OutputDevice* pOutDev = NULL;
1374*b1cdbd2cSJim Jagielski 		if (m_pView->GetActualOutDev() && m_pView->GetActualOutDev()->GetOutDevType() == OUTDEV_WINDOW)
1375*b1cdbd2cSJim Jagielski 			pOutDev = const_cast<OutputDevice*>(m_pView->GetActualOutDev());
1376*b1cdbd2cSJim Jagielski 		else
1377*b1cdbd2cSJim Jagielski 		{// OutDev suchen
1378*b1cdbd2cSJim Jagielski 			SdrPageView* pPageView = m_pView->GetSdrPageView();
1379*b1cdbd2cSJim Jagielski 			if( pPageView && !pOutDev )
1380*b1cdbd2cSJim Jagielski 			{
1381*b1cdbd2cSJim Jagielski 				// const SdrPageViewWinList& rWinList = pPageView->GetWinList();
1382*b1cdbd2cSJim Jagielski 				// const SdrPageViewWindows& rPageViewWindows = pPageView->GetPageViewWindows();
1383*b1cdbd2cSJim Jagielski 
1384*b1cdbd2cSJim Jagielski 				for( sal_uInt32 i = 0L; i < pPageView->PageWindowCount(); i++ )
1385*b1cdbd2cSJim Jagielski 				{
1386*b1cdbd2cSJim Jagielski 					const SdrPageWindow& rPageWindow = *pPageView->GetPageWindow(i);
1387*b1cdbd2cSJim Jagielski 
1388*b1cdbd2cSJim Jagielski 					if( rPageWindow.GetPaintWindow().GetOutputDevice().GetOutDevType() == OUTDEV_WINDOW)
1389*b1cdbd2cSJim Jagielski 					{
1390*b1cdbd2cSJim Jagielski 						pOutDev = &rPageWindow.GetPaintWindow().GetOutputDevice();
1391*b1cdbd2cSJim Jagielski 						break;
1392*b1cdbd2cSJim Jagielski 					}
1393*b1cdbd2cSJim Jagielski 				}
1394*b1cdbd2cSJim Jagielski 			}
1395*b1cdbd2cSJim Jagielski 		}
1396*b1cdbd2cSJim Jagielski 
1397*b1cdbd2cSJim Jagielski 		if ( !pOutDev )
1398*b1cdbd2cSJim Jagielski 			return NULL;
1399*b1cdbd2cSJim Jagielski 
1400*b1cdbd2cSJim Jagielski 		//////////////////////////////////////////////////////////////////////
1401*b1cdbd2cSJim Jagielski 		// The service name decides which control should be created
1402*b1cdbd2cSJim Jagielski 		sal_uInt16 nOBJID = OBJ_FM_EDIT;
1403*b1cdbd2cSJim Jagielski 		if(::rtl::OUString(_rDesc.szServiceName).equals((::rtl::OUString)FM_SUN_COMPONENT_NUMERICFIELD))
1404*b1cdbd2cSJim Jagielski 			nOBJID = OBJ_FM_NUMERICFIELD;
1405*b1cdbd2cSJim Jagielski 		if(::rtl::OUString(_rDesc.szServiceName).equals((::rtl::OUString)FM_SUN_COMPONENT_CHECKBOX))
1406*b1cdbd2cSJim Jagielski 			nOBJID = OBJ_FM_CHECKBOX;
1407*b1cdbd2cSJim Jagielski 		if(::rtl::OUString(_rDesc.szServiceName).equals((::rtl::OUString)FM_COMPONENT_COMMANDBUTTON))
1408*b1cdbd2cSJim Jagielski 			nOBJID = OBJ_FM_BUTTON;
1409*b1cdbd2cSJim Jagielski 
1410*b1cdbd2cSJim Jagielski 		typedef ::com::sun::star::form::submission::XSubmission XSubmission_t;
1411*b1cdbd2cSJim Jagielski 		Reference< XSubmission_t > xSubmission(_rDesc.xPropSet, UNO_QUERY);
1412*b1cdbd2cSJim Jagielski 
1413*b1cdbd2cSJim Jagielski 		// xform control or submission button?
1414*b1cdbd2cSJim Jagielski 		if ( !xSubmission.is() )
1415*b1cdbd2cSJim Jagielski         {
1416*b1cdbd2cSJim Jagielski 			SdrUnoObj* pLabel( NULL );
1417*b1cdbd2cSJim Jagielski 			SdrUnoObj* pControl( NULL );
1418*b1cdbd2cSJim Jagielski 			if  (   !createControlLabelPair( *pOutDev, 0, 0, NULL, xNumberFormats, nOBJID, sLabelPostfix,
1419*b1cdbd2cSJim Jagielski                         pLabel, pControl )
1420*b1cdbd2cSJim Jagielski                 )
1421*b1cdbd2cSJim Jagielski             {
1422*b1cdbd2cSJim Jagielski 				return NULL;
1423*b1cdbd2cSJim Jagielski 			}
1424*b1cdbd2cSJim Jagielski 
1425*b1cdbd2cSJim Jagielski 			//////////////////////////////////////////////////////////////////////
1426*b1cdbd2cSJim Jagielski 			// Now build the connection between the control and the data item.
1427*b1cdbd2cSJim Jagielski 			Reference< XValueBinding > xValueBinding(_rDesc.xPropSet,UNO_QUERY);
1428*b1cdbd2cSJim Jagielski 			Reference< XBindableValue > xBindableValue(pControl->GetUnoControlModel(),UNO_QUERY);
1429*b1cdbd2cSJim Jagielski 
1430*b1cdbd2cSJim Jagielski             DBG_ASSERT( xBindableValue.is(), "FmXFormView::implCreateXFormsControl: control's not bindable!" );
1431*b1cdbd2cSJim Jagielski             if ( xBindableValue.is() )
1432*b1cdbd2cSJim Jagielski 			    xBindableValue->setValueBinding(xValueBinding);
1433*b1cdbd2cSJim Jagielski 
1434*b1cdbd2cSJim Jagielski 		    bool bCheckbox = ( OBJ_FM_CHECKBOX == nOBJID );
1435*b1cdbd2cSJim Jagielski             OSL_ENSURE( !bCheckbox || !pLabel, "FmXFormView::implCreateXFormsControl: why was there a label created for a check box?" );
1436*b1cdbd2cSJim Jagielski             if ( bCheckbox )
1437*b1cdbd2cSJim Jagielski                 return pControl;
1438*b1cdbd2cSJim Jagielski 
1439*b1cdbd2cSJim Jagielski 			//////////////////////////////////////////////////////////////////////
1440*b1cdbd2cSJim Jagielski 			// group objects
1441*b1cdbd2cSJim Jagielski 			SdrObjGroup* pGroup  = new SdrObjGroup();
1442*b1cdbd2cSJim Jagielski 			SdrObjList* pObjList = pGroup->GetSubList();
1443*b1cdbd2cSJim Jagielski 			pObjList->InsertObject(pLabel);
1444*b1cdbd2cSJim Jagielski 			pObjList->InsertObject(pControl);
1445*b1cdbd2cSJim Jagielski 
1446*b1cdbd2cSJim Jagielski 			return pGroup;
1447*b1cdbd2cSJim Jagielski 		}
1448*b1cdbd2cSJim Jagielski 		else {
1449*b1cdbd2cSJim Jagielski 
1450*b1cdbd2cSJim Jagielski 			// create a button control
1451*b1cdbd2cSJim Jagielski 			const MapMode eTargetMode( pOutDev->GetMapMode() );
1452*b1cdbd2cSJim Jagielski 			const MapMode eSourceMode(MAP_100TH_MM);
1453*b1cdbd2cSJim Jagielski 			const sal_uInt16 nObjID = OBJ_FM_BUTTON;
1454*b1cdbd2cSJim Jagielski 			::Size controlSize(4000, 500);
1455*b1cdbd2cSJim Jagielski 			FmFormObj *pControl = static_cast<FmFormObj*>(SdrObjFactory::MakeNewObject( FmFormInventor, nObjID, NULL, NULL ));
1456*b1cdbd2cSJim Jagielski 			controlSize.Width() = Fraction(controlSize.Width(), 1) * eTargetMode.GetScaleX();
1457*b1cdbd2cSJim Jagielski 			controlSize.Height() = Fraction(controlSize.Height(), 1) * eTargetMode.GetScaleY();
1458*b1cdbd2cSJim Jagielski 			::Point controlPos( pOutDev->LogicToLogic( ::Point( controlSize.Width(), 0 ), eSourceMode, eTargetMode ) );
1459*b1cdbd2cSJim Jagielski 			::Rectangle controlRect( controlPos, pOutDev->LogicToLogic( controlSize, eSourceMode, eTargetMode ) );
1460*b1cdbd2cSJim Jagielski 			pControl->SetLogicRect(controlRect);
1461*b1cdbd2cSJim Jagielski 
1462*b1cdbd2cSJim Jagielski 			// set the button label
1463*b1cdbd2cSJim Jagielski 			Reference< XPropertySet > xControlSet(pControl->GetUnoControlModel(), UNO_QUERY);
1464*b1cdbd2cSJim Jagielski 			xControlSet->setPropertyValue(FM_PROP_LABEL, makeAny(::rtl::OUString(_rDesc.szName)));
1465*b1cdbd2cSJim Jagielski 
1466*b1cdbd2cSJim Jagielski 			// connect the submission with the submission supplier (aka the button)
1467*b1cdbd2cSJim Jagielski             xControlSet->setPropertyValue( FM_PROP_BUTTON_TYPE,
1468*b1cdbd2cSJim Jagielski                                            makeAny( FormButtonType_SUBMIT ) );
1469*b1cdbd2cSJim Jagielski 			typedef ::com::sun::star::form::submission::XSubmissionSupplier XSubmissionSupplier_t;
1470*b1cdbd2cSJim Jagielski 			Reference< XSubmissionSupplier_t > xSubmissionSupplier(pControl->GetUnoControlModel(), UNO_QUERY);
1471*b1cdbd2cSJim Jagielski 			xSubmissionSupplier->setSubmission(xSubmission);
1472*b1cdbd2cSJim Jagielski 
1473*b1cdbd2cSJim Jagielski 			return pControl;
1474*b1cdbd2cSJim Jagielski 		}
1475*b1cdbd2cSJim Jagielski 	}
1476*b1cdbd2cSJim Jagielski 	catch(const Exception&)
1477*b1cdbd2cSJim Jagielski 	{
1478*b1cdbd2cSJim Jagielski         DBG_ERROR("FmXFormView::implCreateXFormsControl: caught an exception while creating the control !");
1479*b1cdbd2cSJim Jagielski 	}
1480*b1cdbd2cSJim Jagielski 
1481*b1cdbd2cSJim Jagielski 
1482*b1cdbd2cSJim Jagielski 	return NULL;
1483*b1cdbd2cSJim Jagielski }
1484*b1cdbd2cSJim Jagielski 
1485*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
createControlLabelPair(OutputDevice & _rOutDev,sal_Int32 _nXOffsetMM,sal_Int32 _nYOffsetMM,const Reference<XPropertySet> & _rxField,const Reference<XNumberFormats> & _rxNumberFormats,sal_uInt16 _nControlObjectID,const::rtl::OUString & _rFieldPostfix,SdrUnoObj * & _rpLabel,SdrUnoObj * & _rpControl,const Reference<XDataSource> & _rxDataSource,const::rtl::OUString & _rDataSourceName,const::rtl::OUString & _rCommand,const sal_Int32 _nCommandType)1486*b1cdbd2cSJim Jagielski bool FmXFormView::createControlLabelPair( OutputDevice& _rOutDev, sal_Int32 _nXOffsetMM, sal_Int32 _nYOffsetMM,
1487*b1cdbd2cSJim Jagielski         const Reference< XPropertySet >& _rxField, const Reference< XNumberFormats >& _rxNumberFormats,
1488*b1cdbd2cSJim Jagielski         sal_uInt16 _nControlObjectID, const ::rtl::OUString& _rFieldPostfix,
1489*b1cdbd2cSJim Jagielski         SdrUnoObj*& _rpLabel, SdrUnoObj*& _rpControl,
1490*b1cdbd2cSJim Jagielski         const Reference< XDataSource >& _rxDataSource, const ::rtl::OUString& _rDataSourceName,
1491*b1cdbd2cSJim Jagielski         const ::rtl::OUString& _rCommand, const sal_Int32 _nCommandType )
1492*b1cdbd2cSJim Jagielski {
1493*b1cdbd2cSJim Jagielski     if  (   !createControlLabelPair( m_aContext, _rOutDev, _nXOffsetMM, _nYOffsetMM,
1494*b1cdbd2cSJim Jagielski                 _rxField, _rxNumberFormats, _nControlObjectID, _rFieldPostfix, FmFormInventor, OBJ_FM_FIXEDTEXT,
1495*b1cdbd2cSJim Jagielski                 NULL, NULL, NULL, _rpLabel, _rpControl )
1496*b1cdbd2cSJim Jagielski         )
1497*b1cdbd2cSJim Jagielski         return false;
1498*b1cdbd2cSJim Jagielski 
1499*b1cdbd2cSJim Jagielski     // insert the control model(s) into the form component hierachy
1500*b1cdbd2cSJim Jagielski     if ( _rpLabel )
1501*b1cdbd2cSJim Jagielski         lcl_insertIntoFormComponentHierarchy_throw( *m_pView, *_rpLabel, _rxDataSource, _rDataSourceName, _rCommand, _nCommandType );
1502*b1cdbd2cSJim Jagielski     lcl_insertIntoFormComponentHierarchy_throw( *m_pView, *_rpControl, _rxDataSource, _rDataSourceName, _rCommand, _nCommandType );
1503*b1cdbd2cSJim Jagielski 
1504*b1cdbd2cSJim Jagielski     // some context-dependent initializations
1505*b1cdbd2cSJim Jagielski     FormControlFactory aControlFactory( m_aContext );
1506*b1cdbd2cSJim Jagielski     if ( _rpLabel )
1507*b1cdbd2cSJim Jagielski         aControlFactory.initializeControlModel( impl_getDocumentType(), *_rpLabel );
1508*b1cdbd2cSJim Jagielski     aControlFactory.initializeControlModel( impl_getDocumentType(), *_rpControl );
1509*b1cdbd2cSJim Jagielski 
1510*b1cdbd2cSJim Jagielski     return true;
1511*b1cdbd2cSJim Jagielski }
1512*b1cdbd2cSJim Jagielski 
1513*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
createControlLabelPair(const::comphelper::ComponentContext & _rContext,OutputDevice & _rOutDev,sal_Int32 _nXOffsetMM,sal_Int32 _nYOffsetMM,const Reference<XPropertySet> & _rxField,const Reference<XNumberFormats> & _rxNumberFormats,sal_uInt16 _nControlObjectID,const::rtl::OUString & _rFieldPostfix,sal_uInt32 _nInventor,sal_uInt16 _nLabelObjectID,SdrPage * _pLabelPage,SdrPage * _pControlPage,SdrModel * _pModel,SdrUnoObj * & _rpLabel,SdrUnoObj * & _rpControl)1514*b1cdbd2cSJim Jagielski bool FmXFormView::createControlLabelPair( const ::comphelper::ComponentContext& _rContext,
1515*b1cdbd2cSJim Jagielski     OutputDevice& _rOutDev, sal_Int32 _nXOffsetMM, sal_Int32 _nYOffsetMM, const Reference< XPropertySet >& _rxField,
1516*b1cdbd2cSJim Jagielski     const Reference< XNumberFormats >& _rxNumberFormats, sal_uInt16 _nControlObjectID,
1517*b1cdbd2cSJim Jagielski     const ::rtl::OUString& _rFieldPostfix, sal_uInt32 _nInventor, sal_uInt16 _nLabelObjectID,
1518*b1cdbd2cSJim Jagielski     SdrPage* _pLabelPage, SdrPage* _pControlPage, SdrModel* _pModel, SdrUnoObj*& _rpLabel, SdrUnoObj*& _rpControl)
1519*b1cdbd2cSJim Jagielski {
1520*b1cdbd2cSJim Jagielski 	sal_Int32 nDataType = 0;
1521*b1cdbd2cSJim Jagielski 	::rtl::OUString sFieldName;
1522*b1cdbd2cSJim Jagielski 	Any aFieldName;
1523*b1cdbd2cSJim Jagielski 	if ( _rxField.is() )
1524*b1cdbd2cSJim Jagielski 	{
1525*b1cdbd2cSJim Jagielski 		nDataType = ::comphelper::getINT32(_rxField->getPropertyValue(FM_PROP_FIELDTYPE));
1526*b1cdbd2cSJim Jagielski 		aFieldName = Any(_rxField->getPropertyValue(FM_PROP_NAME));
1527*b1cdbd2cSJim Jagielski 		aFieldName >>= sFieldName;
1528*b1cdbd2cSJim Jagielski 	}
1529*b1cdbd2cSJim Jagielski 
1530*b1cdbd2cSJim Jagielski 	// calculate the positions, respecting the settings of the target device
1531*b1cdbd2cSJim Jagielski 	::Size aTextSize( _rOutDev.GetTextWidth(sFieldName + _rFieldPostfix), _rOutDev.GetTextHeight() );
1532*b1cdbd2cSJim Jagielski 
1533*b1cdbd2cSJim Jagielski 	MapMode   eTargetMode( _rOutDev.GetMapMode() ),
1534*b1cdbd2cSJim Jagielski 			  eSourceMode( MAP_100TH_MM );
1535*b1cdbd2cSJim Jagielski 
1536*b1cdbd2cSJim Jagielski 	// Textbreite ist mindestens 4cm
1537*b1cdbd2cSJim Jagielski 	// Texthoehe immer halber cm
1538*b1cdbd2cSJim Jagielski 	::Size aDefTxtSize(4000, 500);
1539*b1cdbd2cSJim Jagielski 	::Size aDefSize(4000, 500);
1540*b1cdbd2cSJim Jagielski 	::Size aDefImageSize(4000, 4000);
1541*b1cdbd2cSJim Jagielski 
1542*b1cdbd2cSJim Jagielski 	::Size aRealSize = _rOutDev.LogicToLogic(aTextSize, eTargetMode, eSourceMode);
1543*b1cdbd2cSJim Jagielski 	aRealSize.Width() = std::max(aRealSize.Width(), aDefTxtSize.Width());
1544*b1cdbd2cSJim Jagielski 	aRealSize.Height()= aDefSize.Height();
1545*b1cdbd2cSJim Jagielski 
1546*b1cdbd2cSJim Jagielski 	// adjust to scaling of the target device (#53523#)
1547*b1cdbd2cSJim Jagielski 	aRealSize.Width() = long(Fraction(aRealSize.Width(), 1) * eTargetMode.GetScaleX());
1548*b1cdbd2cSJim Jagielski 	aRealSize.Height() = long(Fraction(aRealSize.Height(), 1) * eTargetMode.GetScaleY());
1549*b1cdbd2cSJim Jagielski 
1550*b1cdbd2cSJim Jagielski     // for boolean fields, we do not create a label, but just a checkbox
1551*b1cdbd2cSJim Jagielski     bool bNeedLabel = ( _nControlObjectID != OBJ_FM_CHECKBOX );
1552*b1cdbd2cSJim Jagielski 
1553*b1cdbd2cSJim Jagielski 	// the label
1554*b1cdbd2cSJim Jagielski     ::std::auto_ptr< SdrUnoObj > pLabel;
1555*b1cdbd2cSJim Jagielski     Reference< XPropertySet > xLabelModel;
1556*b1cdbd2cSJim Jagielski     if ( bNeedLabel )
1557*b1cdbd2cSJim Jagielski     {
1558*b1cdbd2cSJim Jagielski         pLabel.reset( dynamic_cast< SdrUnoObj* >(
1559*b1cdbd2cSJim Jagielski             SdrObjFactory::MakeNewObject( _nInventor, _nLabelObjectID, _pLabelPage, _pModel ) ) );
1560*b1cdbd2cSJim Jagielski         OSL_ENSURE( pLabel.get(), "FmXFormView::createControlLabelPair: could not create the label!" );
1561*b1cdbd2cSJim Jagielski         if ( !pLabel.get() )
1562*b1cdbd2cSJim Jagielski             return false;
1563*b1cdbd2cSJim Jagielski 
1564*b1cdbd2cSJim Jagielski 		xLabelModel.set( pLabel->GetUnoControlModel(), UNO_QUERY );
1565*b1cdbd2cSJim Jagielski 		if ( xLabelModel.is() )
1566*b1cdbd2cSJim Jagielski         {
1567*b1cdbd2cSJim Jagielski             ::rtl::OUString sLabel;
1568*b1cdbd2cSJim Jagielski             if ( _rxField.is() && _rxField->getPropertySetInfo()->hasPropertyByName(FM_PROP_LABEL) )
1569*b1cdbd2cSJim Jagielski                 _rxField->getPropertyValue(FM_PROP_LABEL) >>= sLabel;
1570*b1cdbd2cSJim Jagielski             if ( !sLabel.getLength() )
1571*b1cdbd2cSJim Jagielski                 sLabel = sFieldName;
1572*b1cdbd2cSJim Jagielski 
1573*b1cdbd2cSJim Jagielski 		    xLabelModel->setPropertyValue( FM_PROP_LABEL, makeAny( sLabel + _rFieldPostfix ) );
1574*b1cdbd2cSJim Jagielski             String sObjectLabel( SVX_RES( RID_STR_OBJECT_LABEL ) );
1575*b1cdbd2cSJim Jagielski             sObjectLabel.SearchAndReplaceAllAscii( "#object#", sFieldName );
1576*b1cdbd2cSJim Jagielski             xLabelModel->setPropertyValue( FM_PROP_NAME, makeAny( ::rtl::OUString( sObjectLabel ) ) );
1577*b1cdbd2cSJim Jagielski         }
1578*b1cdbd2cSJim Jagielski 
1579*b1cdbd2cSJim Jagielski 	    pLabel->SetLogicRect( ::Rectangle(
1580*b1cdbd2cSJim Jagielski             _rOutDev.LogicToLogic( ::Point( _nXOffsetMM, _nYOffsetMM ), eSourceMode, eTargetMode ),
1581*b1cdbd2cSJim Jagielski             _rOutDev.LogicToLogic( aRealSize, eSourceMode, eTargetMode )
1582*b1cdbd2cSJim Jagielski         ) );
1583*b1cdbd2cSJim Jagielski     }
1584*b1cdbd2cSJim Jagielski 
1585*b1cdbd2cSJim Jagielski 	// the control
1586*b1cdbd2cSJim Jagielski     ::std::auto_ptr< SdrUnoObj > pControl( dynamic_cast< SdrUnoObj* >(
1587*b1cdbd2cSJim Jagielski 	    SdrObjFactory::MakeNewObject( _nInventor, _nControlObjectID, _pControlPage, _pModel ) ) );
1588*b1cdbd2cSJim Jagielski     OSL_ENSURE( pControl.get(), "FmXFormView::createControlLabelPair: could not create the control!" );
1589*b1cdbd2cSJim Jagielski     if ( !pControl.get() )
1590*b1cdbd2cSJim Jagielski         return false;
1591*b1cdbd2cSJim Jagielski 
1592*b1cdbd2cSJim Jagielski     Reference< XPropertySet > xControlSet( pControl->GetUnoControlModel(), UNO_QUERY );
1593*b1cdbd2cSJim Jagielski     if ( !xControlSet.is() )
1594*b1cdbd2cSJim Jagielski         return false;
1595*b1cdbd2cSJim Jagielski 
1596*b1cdbd2cSJim Jagielski 	// size of the control
1597*b1cdbd2cSJim Jagielski 	::Size aControlSize( aDefSize );
1598*b1cdbd2cSJim Jagielski     switch ( nDataType )
1599*b1cdbd2cSJim Jagielski     {
1600*b1cdbd2cSJim Jagielski     case DataType::BIT:
1601*b1cdbd2cSJim Jagielski     case DataType::BOOLEAN:
1602*b1cdbd2cSJim Jagielski 		aControlSize = aDefSize;
1603*b1cdbd2cSJim Jagielski         break;
1604*b1cdbd2cSJim Jagielski     case DataType::LONGVARCHAR:
1605*b1cdbd2cSJim Jagielski 	case DataType::CLOB:
1606*b1cdbd2cSJim Jagielski     case DataType::LONGVARBINARY:
1607*b1cdbd2cSJim Jagielski 	case DataType::BLOB:
1608*b1cdbd2cSJim Jagielski 		aControlSize = aDefImageSize;
1609*b1cdbd2cSJim Jagielski         break;
1610*b1cdbd2cSJim Jagielski     }
1611*b1cdbd2cSJim Jagielski 
1612*b1cdbd2cSJim Jagielski     if ( OBJ_FM_IMAGECONTROL == _nControlObjectID )
1613*b1cdbd2cSJim Jagielski 		aControlSize = aDefImageSize;
1614*b1cdbd2cSJim Jagielski 
1615*b1cdbd2cSJim Jagielski 	aControlSize.Width() = long(Fraction(aControlSize.Width(), 1) * eTargetMode.GetScaleX());
1616*b1cdbd2cSJim Jagielski 	aControlSize.Height() = long(Fraction(aControlSize.Height(), 1) * eTargetMode.GetScaleY());
1617*b1cdbd2cSJim Jagielski 
1618*b1cdbd2cSJim Jagielski     pControl->SetLogicRect( ::Rectangle(
1619*b1cdbd2cSJim Jagielski         _rOutDev.LogicToLogic( ::Point( aRealSize.Width() + _nXOffsetMM, _nYOffsetMM ), eSourceMode, eTargetMode ),
1620*b1cdbd2cSJim Jagielski         _rOutDev.LogicToLogic( aControlSize, eSourceMode, eTargetMode )
1621*b1cdbd2cSJim Jagielski     ) );
1622*b1cdbd2cSJim Jagielski 
1623*b1cdbd2cSJim Jagielski     // some initializations
1624*b1cdbd2cSJim Jagielski     Reference< XPropertySetInfo > xControlPropInfo = xControlSet->getPropertySetInfo();
1625*b1cdbd2cSJim Jagielski 
1626*b1cdbd2cSJim Jagielski 	if ( aFieldName.hasValue() )
1627*b1cdbd2cSJim Jagielski 	{
1628*b1cdbd2cSJim Jagielski 		xControlSet->setPropertyValue( FM_PROP_CONTROLSOURCE, aFieldName );
1629*b1cdbd2cSJim Jagielski 		xControlSet->setPropertyValue( FM_PROP_NAME, aFieldName );
1630*b1cdbd2cSJim Jagielski         if ( !bNeedLabel )
1631*b1cdbd2cSJim Jagielski         {
1632*b1cdbd2cSJim Jagielski             // no dedicated label control => use the label property
1633*b1cdbd2cSJim Jagielski             if ( xControlPropInfo->hasPropertyByName( FM_PROP_LABEL ) )
1634*b1cdbd2cSJim Jagielski 		        xControlSet->setPropertyValue( FM_PROP_LABEL, makeAny( sFieldName + _rFieldPostfix ) );
1635*b1cdbd2cSJim Jagielski             else
1636*b1cdbd2cSJim Jagielski                 OSL_ENSURE( false, "FmXFormView::createControlLabelPair: can't set a label for the control!" );
1637*b1cdbd2cSJim Jagielski         }
1638*b1cdbd2cSJim Jagielski 	}
1639*b1cdbd2cSJim Jagielski 
1640*b1cdbd2cSJim Jagielski 	if ( (nDataType == DataType::LONGVARCHAR || nDataType == DataType::CLOB) && xControlPropInfo->hasPropertyByName( FM_PROP_MULTILINE ) )
1641*b1cdbd2cSJim Jagielski 	{
1642*b1cdbd2cSJim Jagielski 		xControlSet->setPropertyValue( FM_PROP_MULTILINE, makeAny( sal_Bool( sal_True ) ) );
1643*b1cdbd2cSJim Jagielski 	}
1644*b1cdbd2cSJim Jagielski 
1645*b1cdbd2cSJim Jagielski     // announce the label to the control
1646*b1cdbd2cSJim Jagielski     if ( xControlPropInfo->hasPropertyByName( FM_PROP_CONTROLLABEL ) && xLabelModel.is() )
1647*b1cdbd2cSJim Jagielski     {
1648*b1cdbd2cSJim Jagielski 	    try
1649*b1cdbd2cSJim Jagielski 	    {
1650*b1cdbd2cSJim Jagielski 		    xControlSet->setPropertyValue( FM_PROP_CONTROLLABEL, makeAny( xLabelModel ) );
1651*b1cdbd2cSJim Jagielski 	    }
1652*b1cdbd2cSJim Jagielski 	    catch( const Exception& )
1653*b1cdbd2cSJim Jagielski 	    {
1654*b1cdbd2cSJim Jagielski             DBG_UNHANDLED_EXCEPTION();
1655*b1cdbd2cSJim Jagielski 	    }
1656*b1cdbd2cSJim Jagielski     }
1657*b1cdbd2cSJim Jagielski 
1658*b1cdbd2cSJim Jagielski 	if ( _rxField.is() )
1659*b1cdbd2cSJim Jagielski     {
1660*b1cdbd2cSJim Jagielski     	FormControlFactory aControlFactory( _rContext );
1661*b1cdbd2cSJim Jagielski 	    aControlFactory.initializeFieldDependentProperties( _rxField, xControlSet, _rxNumberFormats );
1662*b1cdbd2cSJim Jagielski 	}
1663*b1cdbd2cSJim Jagielski 
1664*b1cdbd2cSJim Jagielski     _rpLabel = pLabel.release();
1665*b1cdbd2cSJim Jagielski     _rpControl = pControl.release();
1666*b1cdbd2cSJim Jagielski     return true;
1667*b1cdbd2cSJim Jagielski }
1668*b1cdbd2cSJim Jagielski 
1669*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
ObjectRemoveListener(FmXFormView * pParent)1670*b1cdbd2cSJim Jagielski FmXFormView::ObjectRemoveListener::ObjectRemoveListener( FmXFormView* pParent )
1671*b1cdbd2cSJim Jagielski 	:m_pParent( pParent )
1672*b1cdbd2cSJim Jagielski {
1673*b1cdbd2cSJim Jagielski }
1674*b1cdbd2cSJim Jagielski 
1675*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
Notify(SfxBroadcaster &,const SfxHint & rHint)1676*b1cdbd2cSJim Jagielski void FmXFormView::ObjectRemoveListener::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint )
1677*b1cdbd2cSJim Jagielski {
1678*b1cdbd2cSJim Jagielski 	if (rHint.ISA(SdrHint) && (((SdrHint&)rHint).GetKind() == HINT_OBJREMOVED))
1679*b1cdbd2cSJim Jagielski 		m_pParent->ObjectRemovedInAliveMode(((SdrHint&)rHint).GetObject());
1680*b1cdbd2cSJim Jagielski }
1681*b1cdbd2cSJim Jagielski 
1682*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
ObjectRemovedInAliveMode(const SdrObject * pObject)1683*b1cdbd2cSJim Jagielski void FmXFormView::ObjectRemovedInAliveMode( const SdrObject* pObject )
1684*b1cdbd2cSJim Jagielski {
1685*b1cdbd2cSJim Jagielski 	// wenn das entfernte Objekt in meiner MarkList, die ich mir beim Umschalten in den Alive-Mode gemerkt habe, steht,
1686*b1cdbd2cSJim Jagielski 	// muss ich es jetzt da rausnehmen, da ich sonst beim Zurueckschalten versuche, die Markierung wieder zu setzen
1687*b1cdbd2cSJim Jagielski 	// (interesanterweise geht das nur bei gruppierten Objekten schief (beim Zugriff auf deren ObjList GPF), nicht bei einzelnen)
1688*b1cdbd2cSJim Jagielski 
1689*b1cdbd2cSJim Jagielski 	sal_uIntPtr nCount = m_aMark.GetMarkCount();
1690*b1cdbd2cSJim Jagielski 	for (sal_uIntPtr i = 0; i < nCount; ++i)
1691*b1cdbd2cSJim Jagielski 	{
1692*b1cdbd2cSJim Jagielski 		SdrMark* pMark = m_aMark.GetMark(i);
1693*b1cdbd2cSJim Jagielski 		SdrObject* pCurrent = pMark->GetMarkedSdrObj();
1694*b1cdbd2cSJim Jagielski 		if (pObject == pCurrent)
1695*b1cdbd2cSJim Jagielski 		{
1696*b1cdbd2cSJim Jagielski 			m_aMark.DeleteMark(i);
1697*b1cdbd2cSJim Jagielski 			return;
1698*b1cdbd2cSJim Jagielski 		}
1699*b1cdbd2cSJim Jagielski 		// ich brauche nicht in GroupObjects absteigen : wenn dort unten ein Objekt geloescht wird, dann bleibt der
1700*b1cdbd2cSJim Jagielski 		// Zeiger auf das GroupObject, den ich habe, trotzdem weiter gueltig bleibt ...
1701*b1cdbd2cSJim Jagielski 	}
1702*b1cdbd2cSJim Jagielski }
1703*b1cdbd2cSJim Jagielski 
1704*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
stopMarkListWatching()1705*b1cdbd2cSJim Jagielski void FmXFormView::stopMarkListWatching()
1706*b1cdbd2cSJim Jagielski {
1707*b1cdbd2cSJim Jagielski 	if ( m_pWatchStoredList )
1708*b1cdbd2cSJim Jagielski 	{
1709*b1cdbd2cSJim Jagielski 		m_pWatchStoredList->EndListeningAll();
1710*b1cdbd2cSJim Jagielski 		delete m_pWatchStoredList;
1711*b1cdbd2cSJim Jagielski 		m_pWatchStoredList = NULL;
1712*b1cdbd2cSJim Jagielski 	}
1713*b1cdbd2cSJim Jagielski }
1714*b1cdbd2cSJim Jagielski 
1715*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
startMarkListWatching()1716*b1cdbd2cSJim Jagielski void FmXFormView::startMarkListWatching()
1717*b1cdbd2cSJim Jagielski {
1718*b1cdbd2cSJim Jagielski 	if ( !m_pWatchStoredList )
1719*b1cdbd2cSJim Jagielski 	{
1720*b1cdbd2cSJim Jagielski 		m_pWatchStoredList = new ObjectRemoveListener( this );
1721*b1cdbd2cSJim Jagielski 		FmFormModel* pModel = GetFormShell() ? GetFormShell()->GetFormModel() : NULL;
1722*b1cdbd2cSJim Jagielski 		DBG_ASSERT( pModel != NULL, "FmXFormView::startMarkListWatching: shell has no model!" );
1723*b1cdbd2cSJim Jagielski 		m_pWatchStoredList->StartListening( *static_cast< SfxBroadcaster* >( pModel ) );
1724*b1cdbd2cSJim Jagielski 	}
1725*b1cdbd2cSJim Jagielski 	else
1726*b1cdbd2cSJim Jagielski 	{
1727*b1cdbd2cSJim Jagielski 		DBG_ERROR( "FmXFormView::startMarkListWatching: already listening!" );
1728*b1cdbd2cSJim Jagielski 	}
1729*b1cdbd2cSJim Jagielski }
1730*b1cdbd2cSJim Jagielski 
1731*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
saveMarkList(sal_Bool _bSmartUnmark)1732*b1cdbd2cSJim Jagielski void FmXFormView::saveMarkList( sal_Bool _bSmartUnmark )
1733*b1cdbd2cSJim Jagielski {
1734*b1cdbd2cSJim Jagielski 	if ( m_pView )
1735*b1cdbd2cSJim Jagielski 	{
1736*b1cdbd2cSJim Jagielski 		m_aMark = m_pView->GetMarkedObjectList();
1737*b1cdbd2cSJim Jagielski 		if ( _bSmartUnmark )
1738*b1cdbd2cSJim Jagielski 		{
1739*b1cdbd2cSJim Jagielski 			sal_uIntPtr nCount = m_aMark.GetMarkCount( );
1740*b1cdbd2cSJim Jagielski 			for ( sal_uIntPtr i = 0; i < nCount; ++i )
1741*b1cdbd2cSJim Jagielski 			{
1742*b1cdbd2cSJim Jagielski 				SdrMark*   pMark = m_aMark.GetMark(i);
1743*b1cdbd2cSJim Jagielski 				SdrObject* pObj  = pMark->GetMarkedSdrObj();
1744*b1cdbd2cSJim Jagielski 
1745*b1cdbd2cSJim Jagielski 				if ( m_pView->IsObjMarked( pObj ) )
1746*b1cdbd2cSJim Jagielski 				{
1747*b1cdbd2cSJim Jagielski 					if ( pObj->IsGroupObject() )
1748*b1cdbd2cSJim Jagielski 					{
1749*b1cdbd2cSJim Jagielski 						SdrObjListIter aIter( *pObj->GetSubList() );
1750*b1cdbd2cSJim Jagielski 						sal_Bool bMixed = sal_False;
1751*b1cdbd2cSJim Jagielski 						while ( aIter.IsMore() && !bMixed )
1752*b1cdbd2cSJim Jagielski 							bMixed = ( aIter.Next()->GetObjInventor() != FmFormInventor );
1753*b1cdbd2cSJim Jagielski 
1754*b1cdbd2cSJim Jagielski 						if ( !bMixed )
1755*b1cdbd2cSJim Jagielski 						{
1756*b1cdbd2cSJim Jagielski 							// all objects in the group are form objects
1757*b1cdbd2cSJim Jagielski 							m_pView->MarkObj( pMark->GetMarkedSdrObj(), pMark->GetPageView(), sal_True /* unmark! */ );
1758*b1cdbd2cSJim Jagielski 						}
1759*b1cdbd2cSJim Jagielski 					}
1760*b1cdbd2cSJim Jagielski 					else
1761*b1cdbd2cSJim Jagielski 					{
1762*b1cdbd2cSJim Jagielski 						if ( pObj->GetObjInventor() == FmFormInventor )
1763*b1cdbd2cSJim Jagielski 						{	// this is a form layer object
1764*b1cdbd2cSJim Jagielski 							m_pView->MarkObj( pMark->GetMarkedSdrObj(), pMark->GetPageView(), sal_True /* unmark! */ );
1765*b1cdbd2cSJim Jagielski 						}
1766*b1cdbd2cSJim Jagielski 					}
1767*b1cdbd2cSJim Jagielski 				}
1768*b1cdbd2cSJim Jagielski 			}
1769*b1cdbd2cSJim Jagielski 		}
1770*b1cdbd2cSJim Jagielski 	}
1771*b1cdbd2cSJim Jagielski 	else
1772*b1cdbd2cSJim Jagielski 	{
1773*b1cdbd2cSJim Jagielski 		DBG_ERROR( "FmXFormView::saveMarkList: invalid view!" );
1774*b1cdbd2cSJim Jagielski 		m_aMark = SdrMarkList();
1775*b1cdbd2cSJim Jagielski 	}
1776*b1cdbd2cSJim Jagielski }
1777*b1cdbd2cSJim Jagielski 
1778*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
lcl_hasObject(SdrObjListIter & rIter,SdrObject * pObj)1779*b1cdbd2cSJim Jagielski static sal_Bool lcl_hasObject( SdrObjListIter& rIter, SdrObject* pObj )
1780*b1cdbd2cSJim Jagielski {
1781*b1cdbd2cSJim Jagielski 	sal_Bool bFound = sal_False;
1782*b1cdbd2cSJim Jagielski 	while (rIter.IsMore() && !bFound)
1783*b1cdbd2cSJim Jagielski 		bFound = pObj == rIter.Next();
1784*b1cdbd2cSJim Jagielski 
1785*b1cdbd2cSJim Jagielski 	rIter.Reset();
1786*b1cdbd2cSJim Jagielski 	return bFound;
1787*b1cdbd2cSJim Jagielski }
1788*b1cdbd2cSJim Jagielski 
1789*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
restoreMarkList(SdrMarkList & _rRestoredMarkList)1790*b1cdbd2cSJim Jagielski void FmXFormView::restoreMarkList( SdrMarkList& _rRestoredMarkList )
1791*b1cdbd2cSJim Jagielski {
1792*b1cdbd2cSJim Jagielski 	if ( !m_pView )
1793*b1cdbd2cSJim Jagielski 		return;
1794*b1cdbd2cSJim Jagielski 
1795*b1cdbd2cSJim Jagielski 	_rRestoredMarkList.Clear();
1796*b1cdbd2cSJim Jagielski 
1797*b1cdbd2cSJim Jagielski 	const SdrMarkList& rCurrentList = m_pView->GetMarkedObjectList();
1798*b1cdbd2cSJim Jagielski 	FmFormPage* pPage = GetFormShell() ? GetFormShell()->GetCurPage() : NULL;
1799*b1cdbd2cSJim Jagielski 	if (pPage)
1800*b1cdbd2cSJim Jagielski 	{
1801*b1cdbd2cSJim Jagielski 		if (rCurrentList.GetMarkCount())
1802*b1cdbd2cSJim Jagielski 		{	// there is a current mark ... hmm. Is it a subset of the mark we remembered in saveMarkList?
1803*b1cdbd2cSJim Jagielski 			sal_Bool bMisMatch = sal_False;
1804*b1cdbd2cSJim Jagielski 
1805*b1cdbd2cSJim Jagielski 			// loop through all current marks
1806*b1cdbd2cSJim Jagielski 			sal_uIntPtr nCurrentCount = rCurrentList.GetMarkCount();
1807*b1cdbd2cSJim Jagielski 			for ( sal_uIntPtr i=0; i<nCurrentCount&& !bMisMatch; ++i )
1808*b1cdbd2cSJim Jagielski 			{
1809*b1cdbd2cSJim Jagielski 				const SdrObject* pCurrentMarked = rCurrentList.GetMark( i )->GetMarkedSdrObj();
1810*b1cdbd2cSJim Jagielski 
1811*b1cdbd2cSJim Jagielski 				// loop through all saved marks, check for equality
1812*b1cdbd2cSJim Jagielski 				sal_Bool bFound = sal_False;
1813*b1cdbd2cSJim Jagielski 				sal_uIntPtr nSavedCount = m_aMark.GetMarkCount();
1814*b1cdbd2cSJim Jagielski 				for ( sal_uIntPtr j=0; j<nSavedCount && !bFound; ++j )
1815*b1cdbd2cSJim Jagielski 				{
1816*b1cdbd2cSJim Jagielski 					if ( m_aMark.GetMark( j )->GetMarkedSdrObj() == pCurrentMarked )
1817*b1cdbd2cSJim Jagielski 						bFound = sal_True;
1818*b1cdbd2cSJim Jagielski 				}
1819*b1cdbd2cSJim Jagielski 
1820*b1cdbd2cSJim Jagielski 				// did not find a current mark in the saved marks
1821*b1cdbd2cSJim Jagielski 				if ( !bFound )
1822*b1cdbd2cSJim Jagielski 					bMisMatch = sal_True;
1823*b1cdbd2cSJim Jagielski 			}
1824*b1cdbd2cSJim Jagielski 
1825*b1cdbd2cSJim Jagielski 			if ( bMisMatch )
1826*b1cdbd2cSJim Jagielski 			{
1827*b1cdbd2cSJim Jagielski 				m_aMark.Clear();
1828*b1cdbd2cSJim Jagielski 				_rRestoredMarkList = rCurrentList;
1829*b1cdbd2cSJim Jagielski 				return;
1830*b1cdbd2cSJim Jagielski 			}
1831*b1cdbd2cSJim Jagielski 		}
1832*b1cdbd2cSJim Jagielski 		// wichtig ist das auf die Objecte der markliste nicht zugegriffen wird
1833*b1cdbd2cSJim Jagielski 		// da diese bereits zerstoert sein koennen
1834*b1cdbd2cSJim Jagielski 		SdrPageView* pCurPageView = m_pView->GetSdrPageView();
1835*b1cdbd2cSJim Jagielski 		SdrObjListIter aPageIter( *pPage );
1836*b1cdbd2cSJim Jagielski 		sal_Bool bFound = sal_True;
1837*b1cdbd2cSJim Jagielski 
1838*b1cdbd2cSJim Jagielski 		// gibt es noch alle Objecte
1839*b1cdbd2cSJim Jagielski 		sal_uIntPtr nCount = m_aMark.GetMarkCount();
1840*b1cdbd2cSJim Jagielski 		for (sal_uIntPtr i = 0; i < nCount && bFound; i++)
1841*b1cdbd2cSJim Jagielski 		{
1842*b1cdbd2cSJim Jagielski 			SdrMark*   pMark = m_aMark.GetMark(i);
1843*b1cdbd2cSJim Jagielski 			SdrObject* pObj  = pMark->GetMarkedSdrObj();
1844*b1cdbd2cSJim Jagielski 			if (pObj->IsGroupObject())
1845*b1cdbd2cSJim Jagielski 			{
1846*b1cdbd2cSJim Jagielski 				SdrObjListIter aIter(*pObj->GetSubList());
1847*b1cdbd2cSJim Jagielski 				while (aIter.IsMore() && bFound)
1848*b1cdbd2cSJim Jagielski 					bFound = lcl_hasObject(aPageIter, aIter.Next());
1849*b1cdbd2cSJim Jagielski 			}
1850*b1cdbd2cSJim Jagielski 			else
1851*b1cdbd2cSJim Jagielski 				bFound = lcl_hasObject(aPageIter, pObj);
1852*b1cdbd2cSJim Jagielski 
1853*b1cdbd2cSJim Jagielski 			bFound = bFound && pCurPageView == pMark->GetPageView();
1854*b1cdbd2cSJim Jagielski 		}
1855*b1cdbd2cSJim Jagielski 
1856*b1cdbd2cSJim Jagielski 		if (bFound)
1857*b1cdbd2cSJim Jagielski 		{
1858*b1cdbd2cSJim Jagielski 			// Das LastObject auswerten
1859*b1cdbd2cSJim Jagielski 			if (nCount) // Objecte jetzt Markieren
1860*b1cdbd2cSJim Jagielski 			{
1861*b1cdbd2cSJim Jagielski 				for (sal_uIntPtr i = 0; i < nCount; i++)
1862*b1cdbd2cSJim Jagielski 				{
1863*b1cdbd2cSJim Jagielski 					SdrMark* pMark = m_aMark.GetMark(i);
1864*b1cdbd2cSJim Jagielski 					SdrObject* pObj = pMark->GetMarkedSdrObj();
1865*b1cdbd2cSJim Jagielski 					if ( pObj->GetObjInventor() == FmFormInventor )
1866*b1cdbd2cSJim Jagielski 						if ( !m_pView->IsObjMarked( pObj ) )
1867*b1cdbd2cSJim Jagielski 							m_pView->MarkObj( pObj, pMark->GetPageView() );
1868*b1cdbd2cSJim Jagielski 				}
1869*b1cdbd2cSJim Jagielski 
1870*b1cdbd2cSJim Jagielski 				_rRestoredMarkList = m_aMark;
1871*b1cdbd2cSJim Jagielski 			}
1872*b1cdbd2cSJim Jagielski 		}
1873*b1cdbd2cSJim Jagielski 		m_aMark.Clear();
1874*b1cdbd2cSJim Jagielski 	}
1875*b1cdbd2cSJim Jagielski }
1876*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
focusGained(const FocusEvent &)1877*b1cdbd2cSJim Jagielski void SAL_CALL FmXFormView::focusGained( const FocusEvent& /*e*/ ) throw (RuntimeException)
1878*b1cdbd2cSJim Jagielski {
1879*b1cdbd2cSJim Jagielski 	if ( m_xWindow.is() && m_pView )
1880*b1cdbd2cSJim Jagielski 	{
1881*b1cdbd2cSJim Jagielski         m_pView->SetMoveOutside( sal_True, FmFormView::ImplAccess() );
1882*b1cdbd2cSJim Jagielski 	}
1883*b1cdbd2cSJim Jagielski }
1884*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
focusLost(const FocusEvent &)1885*b1cdbd2cSJim Jagielski void SAL_CALL FmXFormView::focusLost( const FocusEvent& /*e*/ ) throw (RuntimeException)
1886*b1cdbd2cSJim Jagielski {
1887*b1cdbd2cSJim Jagielski 	// when switch the focus outside the office the mark didn't change
1888*b1cdbd2cSJim Jagielski 	// so we can not remove us as focus listener
1889*b1cdbd2cSJim Jagielski 	if ( m_xWindow.is() && m_pView )
1890*b1cdbd2cSJim Jagielski 	{
1891*b1cdbd2cSJim Jagielski 		m_pView->SetMoveOutside( sal_False, FmFormView::ImplAccess() );
1892*b1cdbd2cSJim Jagielski 	}
1893*b1cdbd2cSJim Jagielski }
1894*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
removeGridWindowListening()1895*b1cdbd2cSJim Jagielski void FmXFormView::removeGridWindowListening()
1896*b1cdbd2cSJim Jagielski {
1897*b1cdbd2cSJim Jagielski 	if ( m_xWindow.is() )
1898*b1cdbd2cSJim Jagielski 	{
1899*b1cdbd2cSJim Jagielski 		m_xWindow->removeFocusListener(this);
1900*b1cdbd2cSJim Jagielski 		if ( m_pView )
1901*b1cdbd2cSJim Jagielski 		{
1902*b1cdbd2cSJim Jagielski 			m_pView->SetMoveOutside( sal_False, FmFormView::ImplAccess() );
1903*b1cdbd2cSJim Jagielski 		}
1904*b1cdbd2cSJim Jagielski 		m_xWindow = NULL;
1905*b1cdbd2cSJim Jagielski 	}
1906*b1cdbd2cSJim Jagielski }
1907*b1cdbd2cSJim Jagielski 
1908*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
impl_getDocumentType() const1909*b1cdbd2cSJim Jagielski DocumentType FmXFormView::impl_getDocumentType() const
1910*b1cdbd2cSJim Jagielski {
1911*b1cdbd2cSJim Jagielski     if ( GetFormShell() && GetFormShell()->GetImpl() )
1912*b1cdbd2cSJim Jagielski         return GetFormShell()->GetImpl()->getDocumentType();
1913*b1cdbd2cSJim Jagielski     return eUnknownDocumentType;
1914*b1cdbd2cSJim Jagielski }
1915