1*f6e50924SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*f6e50924SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*f6e50924SAndrew Rist * or more contributor license agreements. See the NOTICE file
5*f6e50924SAndrew Rist * distributed with this work for additional information
6*f6e50924SAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*f6e50924SAndrew Rist * to you under the Apache License, Version 2.0 (the
8*f6e50924SAndrew Rist * "License"); you may not use this file except in compliance
9*f6e50924SAndrew Rist * with the License. You may obtain a copy of the License at
10*f6e50924SAndrew Rist *
11*f6e50924SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12*f6e50924SAndrew Rist *
13*f6e50924SAndrew Rist * Unless required by applicable law or agreed to in writing,
14*f6e50924SAndrew Rist * software distributed under the License is distributed on an
15*f6e50924SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*f6e50924SAndrew Rist * KIND, either express or implied. See the License for the
17*f6e50924SAndrew Rist * specific language governing permissions and limitations
18*f6e50924SAndrew Rist * under the License.
19*f6e50924SAndrew Rist *
20*f6e50924SAndrew Rist *************************************************************/
21*f6e50924SAndrew Rist
22*f6e50924SAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_svx.hxx"
26cdf0e10cSrcweir #include "fmvwimp.hxx"
27cdf0e10cSrcweir #include <svx/fmshell.hxx>
28cdf0e10cSrcweir #include "svx/fmtools.hxx"
29cdf0e10cSrcweir #include "fmservs.hxx"
30cdf0e10cSrcweir #ifndef _SVX_FMPROP_HRC
31cdf0e10cSrcweir #include "fmprop.hrc"
32cdf0e10cSrcweir #endif
33cdf0e10cSrcweir #include "fmpgeimp.hxx"
34cdf0e10cSrcweir #include "fmitems.hxx"
35cdf0e10cSrcweir #include "fmundo.hxx"
36cdf0e10cSrcweir #include <vcl/waitobj.hxx>
37cdf0e10cSrcweir #include <com/sun/star/form/XLoadable.hpp>
38cdf0e10cSrcweir #include <com/sun/star/container/XNamed.hpp>
39cdf0e10cSrcweir #ifndef _COM_SUN_STAR_SDDB_PRIVILEGE_HPP_
40cdf0e10cSrcweir #include <com/sun/star/sdbcx/Privilege.hpp>
41cdf0e10cSrcweir #endif
42cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp>
43cdf0e10cSrcweir #include <com/sun/star/beans/XMultiPropertySet.hpp>
44cdf0e10cSrcweir #include <com/sun/star/beans/XFastPropertySet.hpp>
45cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/XExecutableDialog.hpp>
46cdf0e10cSrcweir #include <com/sun/star/lang/XServiceInfo.hpp>
47cdf0e10cSrcweir #include <com/sun/star/container/XNameContainer.hpp>
48cdf0e10cSrcweir #include <com/sun/star/awt/XTabControllerModel.hpp>
49cdf0e10cSrcweir #include <sfx2/viewfrm.hxx>
50cdf0e10cSrcweir #include <vcl/wrkwin.hxx>
51cdf0e10cSrcweir #include <vcl/msgbox.hxx>
52cdf0e10cSrcweir #include <svl/whiter.hxx>
53cdf0e10cSrcweir #include <sfx2/app.hxx>
54cdf0e10cSrcweir #include <svl/intitem.hxx>
55cdf0e10cSrcweir #include <svl/visitem.hxx>
56cdf0e10cSrcweir #include <unotools/moduleoptions.hxx>
57cdf0e10cSrcweir #include <sfx2/objface.hxx>
58cdf0e10cSrcweir #include <sfx2/request.hxx>
59cdf0e10cSrcweir #include <sfx2/dispatch.hxx>
60cdf0e10cSrcweir #include <sfx2/objsh.hxx>
61cdf0e10cSrcweir #include <svx/svdobj.hxx>
62cdf0e10cSrcweir #include <svx/fmpage.hxx>
63cdf0e10cSrcweir #include "svx/svditer.hxx"
64cdf0e10cSrcweir #include "fmobj.hxx"
65cdf0e10cSrcweir
66cdf0e10cSrcweir #ifndef _SVX_SVXIDS_HRC
67cdf0e10cSrcweir #include <svx/svxids.hrc>
68cdf0e10cSrcweir #endif
69cdf0e10cSrcweir
70cdf0e10cSrcweir #ifndef _SVX_FMRESIDS_HRC
71cdf0e10cSrcweir #include "svx/fmresids.hrc"
72cdf0e10cSrcweir #endif
73cdf0e10cSrcweir #include "fmexch.hxx"
74cdf0e10cSrcweir #include <svx/fmglob.hxx>
75cdf0e10cSrcweir #include <svl/eitem.hxx>
76cdf0e10cSrcweir #include <tools/shl.hxx>
77cdf0e10cSrcweir #include <tools/diagnose_ex.h>
78cdf0e10cSrcweir #include <svx/svdpage.hxx>
79cdf0e10cSrcweir #include <svx/fmmodel.hxx>
80cdf0e10cSrcweir #include <svx/dialmgr.hxx>
81cdf0e10cSrcweir #include "fmshimp.hxx"
82cdf0e10cSrcweir #include <svx/svdpagv.hxx>
83cdf0e10cSrcweir #include <sfx2/objitem.hxx>
84cdf0e10cSrcweir #include <sfx2/viewsh.hxx>
85cdf0e10cSrcweir #include <vcl/sound.hxx>
86cdf0e10cSrcweir #include "fmexpl.hxx"
87cdf0e10cSrcweir #include "formcontrolling.hxx"
88cdf0e10cSrcweir #include <svl/numuno.hxx>
89cdf0e10cSrcweir #include <connectivity/dbtools.hxx>
90cdf0e10cSrcweir #include <comphelper/types.hxx>
91cdf0e10cSrcweir #include <comphelper/processfactory.hxx>
92cdf0e10cSrcweir #include "fmdocumentclassification.hxx"
93cdf0e10cSrcweir #include "formtoolbars.hxx"
94cdf0e10cSrcweir
95cdf0e10cSrcweir #include <svx/svxdlg.hxx> //CHINA001
96cdf0e10cSrcweir #include <svx/dialogs.hrc> //CHINA001
97cdf0e10cSrcweir
98cdf0e10cSrcweir #include "svx/sdrobjectfilter.hxx"
99cdf0e10cSrcweir
100cdf0e10cSrcweir #define HANDLE_SQL_ERRORS( action, successflag, context, message ) \
101cdf0e10cSrcweir try \
102cdf0e10cSrcweir { \
103cdf0e10cSrcweir successflag = sal_False; \
104cdf0e10cSrcweir action; \
105cdf0e10cSrcweir successflag = sal_True; \
106cdf0e10cSrcweir } \
107cdf0e10cSrcweir catch(::com::sun::star::sdbc::SQLException& e) \
108cdf0e10cSrcweir { \
109cdf0e10cSrcweir ::com::sun::star::sdb::SQLContext eExtendedInfo = \
110cdf0e10cSrcweir GetImpl()->prependContextInfo(e, Reference< XInterface > (), context, ::rtl::OUString()); \
111cdf0e10cSrcweir displayException(eExtendedInfo); \
112cdf0e10cSrcweir } \
113cdf0e10cSrcweir catch(Exception&) \
114cdf0e10cSrcweir { \
115cdf0e10cSrcweir DBG_ERROR(message); \
116cdf0e10cSrcweir } \
117cdf0e10cSrcweir
118cdf0e10cSrcweir
119cdf0e10cSrcweir #define DO_SAFE_WITH_ERROR( action, message ) try { action; } catch(Exception&) { DBG_ERROR(message); }
120cdf0e10cSrcweir
121cdf0e10cSrcweir #define FmFormShell
122cdf0e10cSrcweir #include "svxslots.hxx"
123cdf0e10cSrcweir
124cdf0e10cSrcweir #ifndef _SVX_SVXIDS_HRC
125cdf0e10cSrcweir #include <svx/svxids.hrc>
126cdf0e10cSrcweir #endif
127cdf0e10cSrcweir #include "tbxform.hxx"
128cdf0e10cSrcweir #include <comphelper/property.hxx>
129cdf0e10cSrcweir #include <com/sun/star/beans/PropertyValue.hpp>
130cdf0e10cSrcweir
131cdf0e10cSrcweir // wird fuer Invalidate verwendet -> mitpflegen
132cdf0e10cSrcweir // aufsteigend sortieren !!!!!!
133cdf0e10cSrcweir sal_uInt16 ControllerSlotMap[] = // slots des Controllers
134cdf0e10cSrcweir {
135cdf0e10cSrcweir SID_FM_CONFIG,
136cdf0e10cSrcweir SID_FM_PUSHBUTTON,
137cdf0e10cSrcweir SID_FM_RADIOBUTTON,
138cdf0e10cSrcweir SID_FM_CHECKBOX,
139cdf0e10cSrcweir SID_FM_FIXEDTEXT,
140cdf0e10cSrcweir SID_FM_GROUPBOX,
141cdf0e10cSrcweir SID_FM_EDIT,
142cdf0e10cSrcweir SID_FM_LISTBOX,
143cdf0e10cSrcweir SID_FM_COMBOBOX,
144cdf0e10cSrcweir SID_FM_DBGRID,
145cdf0e10cSrcweir SID_FM_IMAGEBUTTON,
146cdf0e10cSrcweir SID_FM_FILECONTROL,
147cdf0e10cSrcweir SID_FM_NAVIGATIONBAR,
148cdf0e10cSrcweir SID_FM_CTL_PROPERTIES,
149cdf0e10cSrcweir SID_FM_PROPERTIES,
150cdf0e10cSrcweir SID_FM_TAB_DIALOG,
151cdf0e10cSrcweir SID_FM_ADD_FIELD,
152cdf0e10cSrcweir SID_FM_DESIGN_MODE,
153cdf0e10cSrcweir SID_FM_SHOW_FMEXPLORER,
154cdf0e10cSrcweir SID_FM_SHOW_PROPERTIES,
155cdf0e10cSrcweir SID_FM_FMEXPLORER_CONTROL,
156cdf0e10cSrcweir SID_FM_DATEFIELD,
157cdf0e10cSrcweir SID_FM_TIMEFIELD,
158cdf0e10cSrcweir SID_FM_NUMERICFIELD,
159cdf0e10cSrcweir SID_FM_CURRENCYFIELD,
160cdf0e10cSrcweir SID_FM_PATTERNFIELD,
161cdf0e10cSrcweir SID_FM_OPEN_READONLY,
162cdf0e10cSrcweir SID_FM_IMAGECONTROL,
163cdf0e10cSrcweir SID_FM_USE_WIZARDS,
164cdf0e10cSrcweir SID_FM_FORMATTEDFIELD,
165cdf0e10cSrcweir SID_FM_FILTER_NAVIGATOR,
166cdf0e10cSrcweir SID_FM_AUTOCONTROLFOCUS,
167cdf0e10cSrcweir SID_FM_SCROLLBAR,
168cdf0e10cSrcweir SID_FM_SPINBUTTON,
169cdf0e10cSrcweir SID_FM_SHOW_DATANAVIGATOR,
170cdf0e10cSrcweir SID_FM_DATANAVIGATOR_CONTROL,
171cdf0e10cSrcweir
172cdf0e10cSrcweir 0
173cdf0e10cSrcweir };
174cdf0e10cSrcweir
175cdf0e10cSrcweir using namespace ::com::sun::star::uno;
176cdf0e10cSrcweir using namespace ::com::sun::star::awt;
177cdf0e10cSrcweir using namespace ::com::sun::star::sdbc;
178cdf0e10cSrcweir using namespace ::com::sun::star::sdbcx;
179cdf0e10cSrcweir using namespace ::com::sun::star::beans;
180cdf0e10cSrcweir using namespace ::com::sun::star::form;
181cdf0e10cSrcweir using namespace ::com::sun::star::form::runtime;
182cdf0e10cSrcweir using namespace ::com::sun::star::frame;
183cdf0e10cSrcweir using namespace ::svxform;
184cdf0e10cSrcweir
185cdf0e10cSrcweir //========================================================================
186cdf0e10cSrcweir // class FmDesignModeChangedHint
187cdf0e10cSrcweir //========================================================================
188cdf0e10cSrcweir TYPEINIT1( FmDesignModeChangedHint, SfxHint );
189cdf0e10cSrcweir
190cdf0e10cSrcweir //------------------------------------------------------------------------
FmDesignModeChangedHint(sal_Bool bDesMode)191cdf0e10cSrcweir FmDesignModeChangedHint::FmDesignModeChangedHint( sal_Bool bDesMode )
192cdf0e10cSrcweir :m_bDesignMode( bDesMode )
193cdf0e10cSrcweir {
194cdf0e10cSrcweir }
195cdf0e10cSrcweir
196cdf0e10cSrcweir //------------------------------------------------------------------------
~FmDesignModeChangedHint()197cdf0e10cSrcweir FmDesignModeChangedHint::~FmDesignModeChangedHint()
198cdf0e10cSrcweir {
199cdf0e10cSrcweir }
200cdf0e10cSrcweir
201cdf0e10cSrcweir //========================================================================
202cdf0e10cSrcweir const sal_uInt32 FM_UI_FEATURE_SHOW_DATABASEBAR = 0x00000001;
203cdf0e10cSrcweir const sal_uInt32 FM_UI_FEATURE_SHOW_FIELD = 0x00000002;
204cdf0e10cSrcweir const sal_uInt32 FM_UI_FEATURE_SHOW_PROPERTIES = 0x00000004;
205cdf0e10cSrcweir const sal_uInt32 FM_UI_FEATURE_SHOW_EXPLORER = 0x00000008;
206cdf0e10cSrcweir const sal_uInt32 FM_UI_FEATURE_SHOW_FILTERBAR = 0x00000010;
207cdf0e10cSrcweir const sal_uInt32 FM_UI_FEATURE_SHOW_FILTERNAVIGATOR = 0x00000020;
208cdf0e10cSrcweir const sal_uInt32 FM_UI_FEATURE_SHOW_TEXT_CONTROL_BAR = 0x00000040;
209cdf0e10cSrcweir const sal_uInt32 FM_UI_FEATURE_TB_CONTROLS = 0x00000080;
210cdf0e10cSrcweir const sal_uInt32 FM_UI_FEATURE_TB_MORECONTROLS = 0x00000100;
211cdf0e10cSrcweir const sal_uInt32 FM_UI_FEATURE_TB_FORMDESIGN = 0x00000200;
212cdf0e10cSrcweir const sal_uInt32 FM_UI_FEATURE_SHOW_DATANAVIGATOR = 0x00000400;
213cdf0e10cSrcweir
SFX_IMPL_INTERFACE(FmFormShell,SfxShell,SVX_RES (RID_STR_FORMSHELL))214cdf0e10cSrcweir SFX_IMPL_INTERFACE(FmFormShell, SfxShell, SVX_RES(RID_STR_FORMSHELL))
215cdf0e10cSrcweir {
216cdf0e10cSrcweir SFX_FEATURED_OBJECTBAR_REGISTRATION( SFX_OBJECTBAR_NAVIGATION|SFX_VISIBILITY_STANDARD|SFX_VISIBILITY_READONLYDOC,
217cdf0e10cSrcweir SVX_RES(RID_SVXTBX_FORM_NAVIGATION),
218cdf0e10cSrcweir FM_UI_FEATURE_SHOW_DATABASEBAR );
219cdf0e10cSrcweir
220cdf0e10cSrcweir SFX_FEATURED_OBJECTBAR_REGISTRATION( SFX_OBJECTBAR_NAVIGATION|SFX_VISIBILITY_STANDARD|SFX_VISIBILITY_READONLYDOC,
221cdf0e10cSrcweir SVX_RES(RID_SVXTBX_FORM_FILTER),
222cdf0e10cSrcweir FM_UI_FEATURE_SHOW_FILTERBAR );
223cdf0e10cSrcweir
224cdf0e10cSrcweir SFX_FEATURED_OBJECTBAR_REGISTRATION( SFX_OBJECTBAR_OBJECT | SFX_VISIBILITY_STANDARD | SFX_VISIBILITY_READONLYDOC,
225cdf0e10cSrcweir SVX_RES( RID_SVXTBX_TEXT_CONTROL_ATTRIBUTES ),
226cdf0e10cSrcweir FM_UI_FEATURE_SHOW_TEXT_CONTROL_BAR );
227cdf0e10cSrcweir
228cdf0e10cSrcweir SFX_FEATURED_CHILDWINDOW_REGISTRATION(SID_FM_ADD_FIELD, FM_UI_FEATURE_SHOW_FIELD);
229cdf0e10cSrcweir SFX_FEATURED_CHILDWINDOW_REGISTRATION(SID_FM_SHOW_PROPERTIES, FM_UI_FEATURE_SHOW_PROPERTIES);
230cdf0e10cSrcweir SFX_FEATURED_CHILDWINDOW_REGISTRATION(SID_FM_SHOW_FMEXPLORER, FM_UI_FEATURE_SHOW_EXPLORER);
231cdf0e10cSrcweir SFX_FEATURED_CHILDWINDOW_REGISTRATION(SID_FM_FILTER_NAVIGATOR, FM_UI_FEATURE_SHOW_FILTERNAVIGATOR);
232cdf0e10cSrcweir SFX_FEATURED_CHILDWINDOW_REGISTRATION(SID_FM_SHOW_DATANAVIGATOR, FM_UI_FEATURE_SHOW_DATANAVIGATOR);
233cdf0e10cSrcweir
234cdf0e10cSrcweir SFX_FEATURED_OBJECTBAR_REGISTRATION( SFX_OBJECTBAR_OBJECT | SFX_VISIBILITY_STANDARD,
235cdf0e10cSrcweir SVX_RES( RID_SVXTBX_CONTROLS ),
236cdf0e10cSrcweir FM_UI_FEATURE_TB_CONTROLS );
237cdf0e10cSrcweir
238cdf0e10cSrcweir SFX_FEATURED_OBJECTBAR_REGISTRATION( SFX_OBJECTBAR_OBJECT | SFX_VISIBILITY_STANDARD,
239cdf0e10cSrcweir SVX_RES( RID_SVXTBX_MORECONTROLS ),
240cdf0e10cSrcweir FM_UI_FEATURE_TB_MORECONTROLS );
241cdf0e10cSrcweir
242cdf0e10cSrcweir SFX_FEATURED_OBJECTBAR_REGISTRATION( SFX_OBJECTBAR_OBJECT | SFX_VISIBILITY_STANDARD,
243cdf0e10cSrcweir SVX_RES( RID_SVXTBX_FORMDESIGN ),
244cdf0e10cSrcweir FM_UI_FEATURE_TB_FORMDESIGN );
245cdf0e10cSrcweir }
246cdf0e10cSrcweir
247cdf0e10cSrcweir //========================================================================
TYPEINIT1(FmFormShell,SfxShell)248cdf0e10cSrcweir TYPEINIT1(FmFormShell,SfxShell)
249cdf0e10cSrcweir
250cdf0e10cSrcweir //------------------------------------------------------------------------
251cdf0e10cSrcweir FmFormShell::FmFormShell( SfxViewShell* _pParent, FmFormView* pView )
252cdf0e10cSrcweir :SfxShell(_pParent)
253cdf0e10cSrcweir ,m_pImpl(new FmXFormShell(*this, _pParent->GetViewFrame()))
254cdf0e10cSrcweir ,m_pFormView( pView )
255cdf0e10cSrcweir ,m_pFormModel( NULL )
256cdf0e10cSrcweir ,m_pParentShell(_pParent)
257cdf0e10cSrcweir ,m_nLastSlot( 0 )
258cdf0e10cSrcweir ,m_bDesignMode( sal_True )
259cdf0e10cSrcweir ,m_bHasForms(sal_False)
260cdf0e10cSrcweir {
261cdf0e10cSrcweir m_pImpl->acquire();
262cdf0e10cSrcweir SetPool( &SFX_APP()->GetPool() );
263cdf0e10cSrcweir SetName( String::CreateFromAscii( "Form" ) );
264cdf0e10cSrcweir
265cdf0e10cSrcweir SetView(m_pFormView);
266cdf0e10cSrcweir }
267cdf0e10cSrcweir
268cdf0e10cSrcweir //------------------------------------------------------------------------
~FmFormShell()269cdf0e10cSrcweir FmFormShell::~FmFormShell()
270cdf0e10cSrcweir {
271cdf0e10cSrcweir if ( m_pFormView )
272cdf0e10cSrcweir SetView( NULL );
273cdf0e10cSrcweir
274cdf0e10cSrcweir m_pImpl->dispose();
275cdf0e10cSrcweir m_pImpl->release();
276cdf0e10cSrcweir m_pImpl = NULL;
277cdf0e10cSrcweir }
278cdf0e10cSrcweir
279cdf0e10cSrcweir //------------------------------------------------------------------------
NotifyMarkListChanged(FmFormView * pWhichView)280cdf0e10cSrcweir void FmFormShell::NotifyMarkListChanged(FmFormView* pWhichView)
281cdf0e10cSrcweir {
282cdf0e10cSrcweir FmNavViewMarksChanged aChangeNotification(pWhichView);
283cdf0e10cSrcweir Broadcast(aChangeNotification);
284cdf0e10cSrcweir }
285cdf0e10cSrcweir
286cdf0e10cSrcweir //------------------------------------------------------------------------
PrepareClose(sal_Bool bUI,sal_Bool)287cdf0e10cSrcweir sal_uInt16 FmFormShell::PrepareClose(sal_Bool bUI, sal_Bool /*bForBrowsing*/)
288cdf0e10cSrcweir {
289cdf0e10cSrcweir if ( GetImpl()->didPrepareClose() )
290cdf0e10cSrcweir // we already did a PrepareClose for the current modifications of the current form
291cdf0e10cSrcweir // 2002-11-12 #104702# - fs@openoffice.org
292cdf0e10cSrcweir return sal_True;
293cdf0e10cSrcweir
294cdf0e10cSrcweir sal_Bool bResult = sal_True;
295cdf0e10cSrcweir // Save the data records, not in DesignMode and FilterMode
296cdf0e10cSrcweir if (!m_bDesignMode && !GetImpl()->isInFilterMode() &&
297cdf0e10cSrcweir m_pFormView && m_pFormView->GetActualOutDev() &&
298cdf0e10cSrcweir m_pFormView->GetActualOutDev()->GetOutDevType() == OUTDEV_WINDOW)
299cdf0e10cSrcweir {
300cdf0e10cSrcweir SdrPageView* pCurPageView = m_pFormView->GetSdrPageView();
301cdf0e10cSrcweir
302cdf0e10cSrcweir // sal_uInt16 nPos = pCurPageView ? pCurPageView->GetWinList().Find((OutputDevice*)m_pFormView->GetActualOutDev()) : SDRPAGEVIEWWIN_NOTFOUND;
303cdf0e10cSrcweir SdrPageWindow* pWindow = pCurPageView ? pCurPageView->FindPageWindow(*((OutputDevice*)m_pFormView->GetActualOutDev())) : 0L;
304cdf0e10cSrcweir
305cdf0e10cSrcweir if(pWindow)
306cdf0e10cSrcweir {
307cdf0e10cSrcweir // Zunaechst werden die aktuellen Inhalte der Controls gespeichert
308cdf0e10cSrcweir // Wenn alles glatt gelaufen ist, werden die modifizierten Datensaetze gespeichert
309cdf0e10cSrcweir if ( GetImpl()->getActiveController().is() )
310cdf0e10cSrcweir {
311cdf0e10cSrcweir const ::svx::ControllerFeatures& rController = GetImpl()->getActiveControllerFeatures();
312cdf0e10cSrcweir if ( rController->commitCurrentControl() )
313cdf0e10cSrcweir {
314cdf0e10cSrcweir sal_Bool bModified = rController->isModifiedRow();
315cdf0e10cSrcweir
316cdf0e10cSrcweir if ( bModified && bUI )
317cdf0e10cSrcweir {
318cdf0e10cSrcweir QueryBox aQry(NULL, SVX_RES(RID_QRY_SAVEMODIFIED));
319cdf0e10cSrcweir switch (aQry.Execute())
320cdf0e10cSrcweir {
321cdf0e10cSrcweir case RET_NO:
322cdf0e10cSrcweir bModified = sal_False;
323cdf0e10cSrcweir GetImpl()->didPrepareClose( sal_True );
324cdf0e10cSrcweir break;
325cdf0e10cSrcweir
326cdf0e10cSrcweir case RET_CANCEL:
327cdf0e10cSrcweir return sal_False;
328cdf0e10cSrcweir
329cdf0e10cSrcweir case RET_NEWTASK:
330cdf0e10cSrcweir return RET_NEWTASK;
331cdf0e10cSrcweir }
332cdf0e10cSrcweir
333cdf0e10cSrcweir if ( bModified )
334cdf0e10cSrcweir bResult = rController->commitCurrentRecord( );
335cdf0e10cSrcweir }
336cdf0e10cSrcweir }
337cdf0e10cSrcweir }
338cdf0e10cSrcweir }
339cdf0e10cSrcweir }
340cdf0e10cSrcweir return bResult;
341cdf0e10cSrcweir }
342cdf0e10cSrcweir
343cdf0e10cSrcweir //------------------------------------------------------------------------
impl_setDesignMode(sal_Bool bDesign)344cdf0e10cSrcweir void FmFormShell::impl_setDesignMode(sal_Bool bDesign)
345cdf0e10cSrcweir {
346cdf0e10cSrcweir if (m_pFormView)
347cdf0e10cSrcweir {
348cdf0e10cSrcweir if (!bDesign)
349cdf0e10cSrcweir m_nLastSlot = SID_FM_DESIGN_MODE;
350cdf0e10cSrcweir
351cdf0e10cSrcweir GetImpl()->SetDesignMode(bDesign);
352cdf0e10cSrcweir // mein m_bDesignMode wird auch von der Impl gesetzt ...
353cdf0e10cSrcweir }
354cdf0e10cSrcweir else
355cdf0e10cSrcweir {
356cdf0e10cSrcweir m_bHasForms = sal_False;
357cdf0e10cSrcweir m_bDesignMode = bDesign;
358cdf0e10cSrcweir UIFeatureChanged();
359cdf0e10cSrcweir }
360cdf0e10cSrcweir
361cdf0e10cSrcweir GetViewShell()->GetViewFrame()->GetBindings().Invalidate(ControllerSlotMap);
362cdf0e10cSrcweir }
363cdf0e10cSrcweir
364cdf0e10cSrcweir //------------------------------------------------------------------------
HasUIFeature(sal_uInt32 nFeature)365cdf0e10cSrcweir sal_Bool FmFormShell::HasUIFeature( sal_uInt32 nFeature )
366cdf0e10cSrcweir {
367cdf0e10cSrcweir sal_Bool bResult = sal_False;
368cdf0e10cSrcweir if ((nFeature & FM_UI_FEATURE_SHOW_DATABASEBAR) == FM_UI_FEATURE_SHOW_DATABASEBAR)
369cdf0e10cSrcweir {
370cdf0e10cSrcweir // nur wenn auch formulare verfuegbar
371cdf0e10cSrcweir bResult = !m_bDesignMode && GetImpl()->hasDatabaseBar() && !GetImpl()->isInFilterMode();
372cdf0e10cSrcweir }
373cdf0e10cSrcweir else if ((nFeature & FM_UI_FEATURE_SHOW_FILTERBAR) == FM_UI_FEATURE_SHOW_FILTERBAR)
374cdf0e10cSrcweir {
375cdf0e10cSrcweir // nur wenn auch formulare verfuegbar
376cdf0e10cSrcweir bResult = !m_bDesignMode && GetImpl()->hasDatabaseBar() && GetImpl()->isInFilterMode();
377cdf0e10cSrcweir }
378cdf0e10cSrcweir else if ((nFeature & FM_UI_FEATURE_SHOW_FILTERNAVIGATOR) == FM_UI_FEATURE_SHOW_FILTERNAVIGATOR)
379cdf0e10cSrcweir {
380cdf0e10cSrcweir bResult = !m_bDesignMode && GetImpl()->hasDatabaseBar() && GetImpl()->isInFilterMode();
381cdf0e10cSrcweir }
382cdf0e10cSrcweir else if ((nFeature & FM_UI_FEATURE_SHOW_FIELD) == FM_UI_FEATURE_SHOW_FIELD)
383cdf0e10cSrcweir {
384cdf0e10cSrcweir bResult = m_bDesignMode && m_pFormView && m_bHasForms;
385cdf0e10cSrcweir }
386cdf0e10cSrcweir else if ((nFeature & FM_UI_FEATURE_SHOW_PROPERTIES) == FM_UI_FEATURE_SHOW_PROPERTIES)
387cdf0e10cSrcweir {
388cdf0e10cSrcweir bResult = m_bDesignMode && m_pFormView && m_bHasForms;
389cdf0e10cSrcweir }
390cdf0e10cSrcweir else if ((nFeature & FM_UI_FEATURE_SHOW_EXPLORER) == FM_UI_FEATURE_SHOW_EXPLORER)
391cdf0e10cSrcweir {
392cdf0e10cSrcweir bResult = m_bDesignMode; // OJ #101593# && m_pFormView && m_bHasForms;
393cdf0e10cSrcweir }
394cdf0e10cSrcweir else if ( ( nFeature & FM_UI_FEATURE_SHOW_TEXT_CONTROL_BAR ) == FM_UI_FEATURE_SHOW_TEXT_CONTROL_BAR )
395cdf0e10cSrcweir {
396cdf0e10cSrcweir bResult = !GetImpl()->IsReadonlyDoc() && m_pImpl->IsActiveControl( true );
397cdf0e10cSrcweir }
398cdf0e10cSrcweir else if ((nFeature & FM_UI_FEATURE_SHOW_DATANAVIGATOR) == FM_UI_FEATURE_SHOW_DATANAVIGATOR)
399cdf0e10cSrcweir {
400cdf0e10cSrcweir bResult = GetImpl()->isEnhancedForm();
401cdf0e10cSrcweir }
402cdf0e10cSrcweir else if ( ( ( nFeature & FM_UI_FEATURE_TB_CONTROLS ) == FM_UI_FEATURE_TB_CONTROLS )
403cdf0e10cSrcweir || ( ( nFeature & FM_UI_FEATURE_TB_MORECONTROLS ) == FM_UI_FEATURE_TB_MORECONTROLS )
404cdf0e10cSrcweir || ( ( nFeature & FM_UI_FEATURE_TB_FORMDESIGN ) == FM_UI_FEATURE_TB_FORMDESIGN )
405cdf0e10cSrcweir )
406cdf0e10cSrcweir {
407cdf0e10cSrcweir bResult = sal_True;
408cdf0e10cSrcweir }
409cdf0e10cSrcweir
410cdf0e10cSrcweir return bResult;
411cdf0e10cSrcweir }
412cdf0e10cSrcweir
413cdf0e10cSrcweir //------------------------------------------------------------------------
Execute(SfxRequest & rReq)414cdf0e10cSrcweir void FmFormShell::Execute(SfxRequest &rReq)
415cdf0e10cSrcweir {
416cdf0e10cSrcweir sal_uInt16 nSlot = rReq.GetSlot();
417cdf0e10cSrcweir
418cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////
419cdf0e10cSrcweir // MasterSlot setzen
420cdf0e10cSrcweir switch( nSlot )
421cdf0e10cSrcweir {
422cdf0e10cSrcweir case SID_FM_PUSHBUTTON:
423cdf0e10cSrcweir case SID_FM_RADIOBUTTON:
424cdf0e10cSrcweir case SID_FM_CHECKBOX:
425cdf0e10cSrcweir case SID_FM_FIXEDTEXT:
426cdf0e10cSrcweir case SID_FM_GROUPBOX:
427cdf0e10cSrcweir case SID_FM_LISTBOX:
428cdf0e10cSrcweir case SID_FM_COMBOBOX:
429cdf0e10cSrcweir case SID_FM_NAVIGATIONBAR:
430cdf0e10cSrcweir case SID_FM_EDIT:
431cdf0e10cSrcweir case SID_FM_DBGRID:
432cdf0e10cSrcweir case SID_FM_IMAGEBUTTON:
433cdf0e10cSrcweir case SID_FM_IMAGECONTROL:
434cdf0e10cSrcweir case SID_FM_FILECONTROL:
435cdf0e10cSrcweir case SID_FM_DATEFIELD:
436cdf0e10cSrcweir case SID_FM_TIMEFIELD:
437cdf0e10cSrcweir case SID_FM_NUMERICFIELD:
438cdf0e10cSrcweir case SID_FM_CURRENCYFIELD:
439cdf0e10cSrcweir case SID_FM_PATTERNFIELD:
440cdf0e10cSrcweir case SID_FM_FORMATTEDFIELD:
441cdf0e10cSrcweir case SID_FM_SCROLLBAR:
442cdf0e10cSrcweir case SID_FM_SPINBUTTON:
443cdf0e10cSrcweir m_nLastSlot = nSlot;
444cdf0e10cSrcweir GetViewShell()->GetViewFrame()->GetBindings().Invalidate( SID_FM_CONFIG );
445cdf0e10cSrcweir break;
446cdf0e10cSrcweir }
447cdf0e10cSrcweir
448cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////
449cdf0e10cSrcweir // Identifier und Inventor des Uno-Controls setzen
450cdf0e10cSrcweir sal_uInt16 nIdentifier = 0;
451cdf0e10cSrcweir switch( nSlot )
452cdf0e10cSrcweir {
453cdf0e10cSrcweir case SID_FM_CHECKBOX:
454cdf0e10cSrcweir nIdentifier = OBJ_FM_CHECKBOX;
455cdf0e10cSrcweir break;
456cdf0e10cSrcweir case SID_FM_PUSHBUTTON:
457cdf0e10cSrcweir nIdentifier = OBJ_FM_BUTTON;
458cdf0e10cSrcweir break;
459cdf0e10cSrcweir case SID_FM_FIXEDTEXT:
460cdf0e10cSrcweir nIdentifier = OBJ_FM_FIXEDTEXT;
461cdf0e10cSrcweir break;
462cdf0e10cSrcweir case SID_FM_LISTBOX:
463cdf0e10cSrcweir nIdentifier = OBJ_FM_LISTBOX;
464cdf0e10cSrcweir break;
465cdf0e10cSrcweir case SID_FM_EDIT:
466cdf0e10cSrcweir nIdentifier = OBJ_FM_EDIT;
467cdf0e10cSrcweir break;
468cdf0e10cSrcweir case SID_FM_RADIOBUTTON:
469cdf0e10cSrcweir nIdentifier = OBJ_FM_RADIOBUTTON;
470cdf0e10cSrcweir break;
471cdf0e10cSrcweir case SID_FM_GROUPBOX:
472cdf0e10cSrcweir nIdentifier = OBJ_FM_GROUPBOX;
473cdf0e10cSrcweir break;
474cdf0e10cSrcweir case SID_FM_COMBOBOX:
475cdf0e10cSrcweir nIdentifier = OBJ_FM_COMBOBOX;
476cdf0e10cSrcweir break;
477cdf0e10cSrcweir case SID_FM_NAVIGATIONBAR:
478cdf0e10cSrcweir nIdentifier = OBJ_FM_NAVIGATIONBAR;
479cdf0e10cSrcweir break;
480cdf0e10cSrcweir case SID_FM_DBGRID:
481cdf0e10cSrcweir nIdentifier = OBJ_FM_GRID;
482cdf0e10cSrcweir break;
483cdf0e10cSrcweir case SID_FM_IMAGEBUTTON:
484cdf0e10cSrcweir nIdentifier = OBJ_FM_IMAGEBUTTON;
485cdf0e10cSrcweir break;
486cdf0e10cSrcweir case SID_FM_IMAGECONTROL:
487cdf0e10cSrcweir nIdentifier = OBJ_FM_IMAGECONTROL;
488cdf0e10cSrcweir break;
489cdf0e10cSrcweir case SID_FM_FILECONTROL:
490cdf0e10cSrcweir nIdentifier = OBJ_FM_FILECONTROL;
491cdf0e10cSrcweir break;
492cdf0e10cSrcweir case SID_FM_DATEFIELD:
493cdf0e10cSrcweir nIdentifier = OBJ_FM_DATEFIELD;
494cdf0e10cSrcweir break;
495cdf0e10cSrcweir case SID_FM_TIMEFIELD:
496cdf0e10cSrcweir nIdentifier = OBJ_FM_TIMEFIELD;
497cdf0e10cSrcweir break;
498cdf0e10cSrcweir case SID_FM_NUMERICFIELD:
499cdf0e10cSrcweir nIdentifier = OBJ_FM_NUMERICFIELD;
500cdf0e10cSrcweir break;
501cdf0e10cSrcweir case SID_FM_CURRENCYFIELD:
502cdf0e10cSrcweir nIdentifier = OBJ_FM_CURRENCYFIELD;
503cdf0e10cSrcweir break;
504cdf0e10cSrcweir case SID_FM_PATTERNFIELD:
505cdf0e10cSrcweir nIdentifier = OBJ_FM_PATTERNFIELD;
506cdf0e10cSrcweir break;
507cdf0e10cSrcweir case SID_FM_FORMATTEDFIELD:
508cdf0e10cSrcweir nIdentifier = OBJ_FM_FORMATTEDFIELD;
509cdf0e10cSrcweir break;
510cdf0e10cSrcweir case SID_FM_SCROLLBAR:
511cdf0e10cSrcweir nIdentifier = OBJ_FM_SCROLLBAR;
512cdf0e10cSrcweir break;
513cdf0e10cSrcweir case SID_FM_SPINBUTTON:
514cdf0e10cSrcweir nIdentifier = OBJ_FM_SPINBUTTON;
515cdf0e10cSrcweir break;
516cdf0e10cSrcweir }
517cdf0e10cSrcweir
518cdf0e10cSrcweir switch ( nSlot )
519cdf0e10cSrcweir {
520cdf0e10cSrcweir case SID_FM_CHECKBOX:
521cdf0e10cSrcweir case SID_FM_PUSHBUTTON:
522cdf0e10cSrcweir case SID_FM_FIXEDTEXT:
523cdf0e10cSrcweir case SID_FM_LISTBOX:
524cdf0e10cSrcweir case SID_FM_EDIT:
525cdf0e10cSrcweir case SID_FM_RADIOBUTTON:
526cdf0e10cSrcweir case SID_FM_COMBOBOX:
527cdf0e10cSrcweir case SID_FM_NAVIGATIONBAR:
528cdf0e10cSrcweir case SID_FM_GROUPBOX:
529cdf0e10cSrcweir case SID_FM_DBGRID:
530cdf0e10cSrcweir case SID_FM_IMAGEBUTTON:
531cdf0e10cSrcweir case SID_FM_IMAGECONTROL:
532cdf0e10cSrcweir case SID_FM_FILECONTROL:
533cdf0e10cSrcweir case SID_FM_DATEFIELD:
534cdf0e10cSrcweir case SID_FM_TIMEFIELD:
535cdf0e10cSrcweir case SID_FM_NUMERICFIELD:
536cdf0e10cSrcweir case SID_FM_CURRENCYFIELD:
537cdf0e10cSrcweir case SID_FM_PATTERNFIELD:
538cdf0e10cSrcweir case SID_FM_FORMATTEDFIELD:
539cdf0e10cSrcweir case SID_FM_SCROLLBAR:
540cdf0e10cSrcweir case SID_FM_SPINBUTTON:
541cdf0e10cSrcweir {
542cdf0e10cSrcweir SFX_REQUEST_ARG( rReq, pGrabFocusItem, SfxBoolItem, SID_FM_TOGGLECONTROLFOCUS, sal_False );
543cdf0e10cSrcweir if ( pGrabFocusItem && pGrabFocusItem->GetValue() )
544cdf0e10cSrcweir { // see below
545cdf0e10cSrcweir SfxViewShell* pShell = GetViewShell();
546cdf0e10cSrcweir Window* pShellWnd = pShell ? pShell->GetWindow() : NULL;
547cdf0e10cSrcweir if ( pShellWnd )
548cdf0e10cSrcweir pShellWnd->GrabFocus();
549cdf0e10cSrcweir break;
550cdf0e10cSrcweir }
551cdf0e10cSrcweir
552cdf0e10cSrcweir SfxUInt16Item aIdentifierItem( SID_FM_CONTROL_IDENTIFIER, nIdentifier );
553cdf0e10cSrcweir SfxUInt32Item aInventorItem( SID_FM_CONTROL_INVENTOR, FmFormInventor );
554cdf0e10cSrcweir const SfxPoolItem* pArgs[] =
555cdf0e10cSrcweir {
556cdf0e10cSrcweir &aIdentifierItem, &aInventorItem, NULL
557cdf0e10cSrcweir };
558cdf0e10cSrcweir const SfxPoolItem* pInternalArgs[] =
559cdf0e10cSrcweir {
560cdf0e10cSrcweir NULL
561cdf0e10cSrcweir };
562cdf0e10cSrcweir
563cdf0e10cSrcweir GetViewShell()->GetViewFrame()->GetDispatcher()->Execute( SID_FM_CREATE_CONTROL, SFX_CALLMODE_ASYNCHRON,
564cdf0e10cSrcweir pArgs, rReq.GetModifier(), pInternalArgs );
565cdf0e10cSrcweir
566cdf0e10cSrcweir if ( rReq.GetModifier() & KEY_MOD1 )
567cdf0e10cSrcweir {
568cdf0e10cSrcweir // #99013# if selected with control key, return focus to current view
569cdf0e10cSrcweir // do this asynchron, so that the creation can be finished first
570cdf0e10cSrcweir // reusing the SID_FM_TOGGLECONTROLFOCUS is somewhat hacky ... which it wouldn't if it would have another
571cdf0e10cSrcweir // name, so I do not really have a big problem with this ....
572cdf0e10cSrcweir SfxBoolItem aGrabFocusIndicatorItem( SID_FM_TOGGLECONTROLFOCUS, sal_True );
573cdf0e10cSrcweir GetViewShell()->GetViewFrame()->GetDispatcher()->Execute( nSlot, SFX_CALLMODE_ASYNCHRON,
574cdf0e10cSrcweir &aGrabFocusIndicatorItem, NULL );
575cdf0e10cSrcweir }
576cdf0e10cSrcweir
577cdf0e10cSrcweir rReq.Done();
578cdf0e10cSrcweir } break;
579cdf0e10cSrcweir }
580cdf0e10cSrcweir
581cdf0e10cSrcweir // Individuelle Aktionen
582cdf0e10cSrcweir switch( nSlot )
583cdf0e10cSrcweir {
584cdf0e10cSrcweir case SID_FM_MORE_CONTROLS:
585cdf0e10cSrcweir case SID_FM_FORM_DESIGN_TOOLS:
586cdf0e10cSrcweir {
587cdf0e10cSrcweir FormToolboxes aToolboxAccess( GetImpl()->getHostFrame() );
588cdf0e10cSrcweir aToolboxAccess.toggleToolbox( nSlot );
589cdf0e10cSrcweir rReq.Done();
590cdf0e10cSrcweir }
591cdf0e10cSrcweir break;
592cdf0e10cSrcweir
593cdf0e10cSrcweir case SID_FM_TOGGLECONTROLFOCUS:
594cdf0e10cSrcweir {
595cdf0e10cSrcweir FmFormView* pFormView = GetFormView();
596cdf0e10cSrcweir if ( !pFormView )
597cdf0e10cSrcweir break;
598cdf0e10cSrcweir
599cdf0e10cSrcweir // if we execute this ourself, then either the application does not implement an own handling for this,
600cdf0e10cSrcweir // of we're on the top of the dispatcher stack, which means a control has the focus.
601cdf0e10cSrcweir // In the latter case, we put the focus to the document window, otherwise, we focus the first control
602cdf0e10cSrcweir const bool bHasControlFocus = GetImpl()->HasControlFocus();
603cdf0e10cSrcweir if ( bHasControlFocus )
604cdf0e10cSrcweir {
605cdf0e10cSrcweir const OutputDevice* pDevice = GetCurrentViewDevice();
606cdf0e10cSrcweir Window* pWindow = dynamic_cast< Window* >( const_cast< OutputDevice* >( pDevice ) );
607cdf0e10cSrcweir if ( pWindow )
608cdf0e10cSrcweir pWindow->GrabFocus();
609cdf0e10cSrcweir }
610cdf0e10cSrcweir else
611cdf0e10cSrcweir {
612cdf0e10cSrcweir pFormView->GrabFirstControlFocus( );
613cdf0e10cSrcweir }
614cdf0e10cSrcweir }
615cdf0e10cSrcweir break;
616cdf0e10cSrcweir
617cdf0e10cSrcweir case SID_FM_VIEW_AS_GRID:
618cdf0e10cSrcweir GetImpl()->CreateExternalView();
619cdf0e10cSrcweir break;
620cdf0e10cSrcweir case SID_FM_CONVERTTO_EDIT :
621cdf0e10cSrcweir case SID_FM_CONVERTTO_BUTTON :
622cdf0e10cSrcweir case SID_FM_CONVERTTO_FIXEDTEXT :
623cdf0e10cSrcweir case SID_FM_CONVERTTO_LISTBOX :
624cdf0e10cSrcweir case SID_FM_CONVERTTO_CHECKBOX :
625cdf0e10cSrcweir case SID_FM_CONVERTTO_RADIOBUTTON :
626cdf0e10cSrcweir case SID_FM_CONVERTTO_GROUPBOX :
627cdf0e10cSrcweir case SID_FM_CONVERTTO_COMBOBOX :
628cdf0e10cSrcweir case SID_FM_CONVERTTO_IMAGEBUTTON :
629cdf0e10cSrcweir case SID_FM_CONVERTTO_FILECONTROL :
630cdf0e10cSrcweir case SID_FM_CONVERTTO_DATE :
631cdf0e10cSrcweir case SID_FM_CONVERTTO_TIME :
632cdf0e10cSrcweir case SID_FM_CONVERTTO_NUMERIC :
633cdf0e10cSrcweir case SID_FM_CONVERTTO_CURRENCY :
634cdf0e10cSrcweir case SID_FM_CONVERTTO_PATTERN :
635cdf0e10cSrcweir case SID_FM_CONVERTTO_IMAGECONTROL :
636cdf0e10cSrcweir case SID_FM_CONVERTTO_FORMATTED :
637cdf0e10cSrcweir case SID_FM_CONVERTTO_SCROLLBAR :
638cdf0e10cSrcweir case SID_FM_CONVERTTO_SPINBUTTON :
639cdf0e10cSrcweir case SID_FM_CONVERTTO_NAVIGATIONBAR :
640cdf0e10cSrcweir GetImpl()->executeControlConversionSlot( nSlot );
641cdf0e10cSrcweir // nach dem Konvertieren die Selektion neu bestimmern, da sich ja das selektierte Objekt
642cdf0e10cSrcweir // geaendert hat
643cdf0e10cSrcweir GetImpl()->SetSelection(GetFormView()->GetMarkedObjectList());
644cdf0e10cSrcweir break;
645cdf0e10cSrcweir case SID_FM_LEAVE_CREATE:
646cdf0e10cSrcweir m_nLastSlot = 0;
647cdf0e10cSrcweir GetViewShell()->GetViewFrame()->GetBindings().Invalidate( SID_FM_CONFIG );
648cdf0e10cSrcweir rReq.Done();
649cdf0e10cSrcweir break;
650cdf0e10cSrcweir case SID_FM_SHOW_PROPERTY_BROWSER:
651cdf0e10cSrcweir {
652cdf0e10cSrcweir SFX_REQUEST_ARG( rReq, pShowItem, SfxBoolItem, SID_FM_SHOW_PROPERTIES, sal_False );
653cdf0e10cSrcweir sal_Bool bShow = sal_True;
654cdf0e10cSrcweir if ( pShowItem )
655cdf0e10cSrcweir bShow = pShowItem->GetValue();
656cdf0e10cSrcweir GetImpl()->ShowSelectionProperties( bShow );
657cdf0e10cSrcweir
658cdf0e10cSrcweir rReq.Done();
659cdf0e10cSrcweir } break;
660cdf0e10cSrcweir
661cdf0e10cSrcweir case SID_FM_PROPERTIES:
662cdf0e10cSrcweir {
663cdf0e10cSrcweir // PropertyBrowser anzeigen
664cdf0e10cSrcweir SFX_REQUEST_ARG(rReq, pShowItem, SfxBoolItem, nSlot, sal_False);
665cdf0e10cSrcweir sal_Bool bShow = pShowItem ? pShowItem->GetValue() : sal_True;
666cdf0e10cSrcweir
667cdf0e10cSrcweir InterfaceBag aOnlyTheForm;
668cdf0e10cSrcweir aOnlyTheForm.insert( Reference< XInterface >( GetImpl()->getCurrentForm(), UNO_QUERY ) );
669cdf0e10cSrcweir GetImpl()->setCurrentSelection( aOnlyTheForm );
670cdf0e10cSrcweir
671cdf0e10cSrcweir GetImpl()->ShowSelectionProperties( bShow );
672cdf0e10cSrcweir
673cdf0e10cSrcweir rReq.Done();
674cdf0e10cSrcweir } break;
675cdf0e10cSrcweir
676cdf0e10cSrcweir case SID_FM_CTL_PROPERTIES:
677cdf0e10cSrcweir {
678cdf0e10cSrcweir SFX_REQUEST_ARG(rReq, pShowItem, SfxBoolItem, nSlot, sal_False);
679cdf0e10cSrcweir sal_Bool bShow = pShowItem ? pShowItem->GetValue() : sal_True;
680cdf0e10cSrcweir
681cdf0e10cSrcweir OSL_ENSURE( GetImpl()->onlyControlsAreMarked(), "FmFormShell::Execute: ControlProperties should be disabled!" );
682cdf0e10cSrcweir if ( bShow )
683cdf0e10cSrcweir GetImpl()->selectLastMarkedControls();
684cdf0e10cSrcweir GetImpl()->ShowSelectionProperties( bShow );
685cdf0e10cSrcweir
686cdf0e10cSrcweir rReq.Done();
687cdf0e10cSrcweir } break;
688cdf0e10cSrcweir case SID_FM_SHOW_PROPERTIES:
689cdf0e10cSrcweir case SID_FM_ADD_FIELD:
690cdf0e10cSrcweir case SID_FM_FILTER_NAVIGATOR:
691cdf0e10cSrcweir case SID_FM_SHOW_DATANAVIGATOR :
692cdf0e10cSrcweir {
693cdf0e10cSrcweir GetViewShell()->GetViewFrame()->ChildWindowExecute( rReq );
694cdf0e10cSrcweir rReq.Done();
695cdf0e10cSrcweir } break;
696cdf0e10cSrcweir case SID_FM_SHOW_FMEXPLORER:
697cdf0e10cSrcweir {
698cdf0e10cSrcweir if (!m_pFormView) // setzen der ::com::sun::star::sdbcx::View Forcieren
699cdf0e10cSrcweir GetViewShell()->GetViewFrame()->GetDispatcher()->Execute(SID_CREATE_SW_DRAWVIEW);
700cdf0e10cSrcweir
701cdf0e10cSrcweir GetViewShell()->GetViewFrame()->ChildWindowExecute(rReq);
702cdf0e10cSrcweir rReq.Done();
703cdf0e10cSrcweir }
704cdf0e10cSrcweir break;
705cdf0e10cSrcweir
706cdf0e10cSrcweir case SID_FM_TAB_DIALOG:
707cdf0e10cSrcweir {
708cdf0e10cSrcweir GetImpl()->ExecuteTabOrderDialog( Reference< XTabControllerModel >( GetImpl()->getCurrentForm(), UNO_QUERY ) );
709cdf0e10cSrcweir rReq.Done();
710cdf0e10cSrcweir }
711cdf0e10cSrcweir break;
712cdf0e10cSrcweir
713cdf0e10cSrcweir case SID_FM_DESIGN_MODE:
714cdf0e10cSrcweir {
715cdf0e10cSrcweir SFX_REQUEST_ARG(rReq, pDesignItem, SfxBoolItem, nSlot, sal_False);
716cdf0e10cSrcweir sal_Bool bDesignMode = pDesignItem ? pDesignItem->GetValue() : !m_bDesignMode;
717cdf0e10cSrcweir SetDesignMode( bDesignMode );
718cdf0e10cSrcweir if ( m_bDesignMode == bDesignMode )
719cdf0e10cSrcweir rReq.Done();
720cdf0e10cSrcweir
721cdf0e10cSrcweir m_nLastSlot = SID_FM_DESIGN_MODE;
722cdf0e10cSrcweir GetViewShell()->GetViewFrame()->GetBindings().Invalidate( SID_FM_CONFIG );
723cdf0e10cSrcweir }
724cdf0e10cSrcweir break;
725cdf0e10cSrcweir
726cdf0e10cSrcweir case SID_FM_AUTOCONTROLFOCUS:
727cdf0e10cSrcweir {
728cdf0e10cSrcweir FmFormModel* pModel = GetFormModel();
729cdf0e10cSrcweir DBG_ASSERT(pModel, "FmFormShell::Execute : invalid call !");
730cdf0e10cSrcweir // should have been disabled in GetState if we don't have a FormModel
731cdf0e10cSrcweir pModel->SetAutoControlFocus( !pModel->GetAutoControlFocus() );
732cdf0e10cSrcweir GetViewShell()->GetViewFrame()->GetBindings().Invalidate(SID_FM_AUTOCONTROLFOCUS);
733cdf0e10cSrcweir }
734cdf0e10cSrcweir break;
735cdf0e10cSrcweir case SID_FM_OPEN_READONLY:
736cdf0e10cSrcweir {
737cdf0e10cSrcweir FmFormModel* pModel = GetFormModel();
738cdf0e10cSrcweir DBG_ASSERT(pModel, "FmFormShell::Execute : invalid call !");
739cdf0e10cSrcweir // should have been disabled in GetState if we don't have a FormModel
740cdf0e10cSrcweir pModel->SetOpenInDesignMode( !pModel->GetOpenInDesignMode() );
741cdf0e10cSrcweir GetViewShell()->GetViewFrame()->GetBindings().Invalidate(SID_FM_OPEN_READONLY);
742cdf0e10cSrcweir }
743cdf0e10cSrcweir break;
744cdf0e10cSrcweir case SID_FM_USE_WIZARDS:
745cdf0e10cSrcweir {
746cdf0e10cSrcweir GetImpl()->SetWizardUsing(!GetImpl()->GetWizardUsing());
747cdf0e10cSrcweir GetViewShell()->GetViewFrame()->GetBindings().Invalidate(SID_FM_USE_WIZARDS);
748cdf0e10cSrcweir }
749cdf0e10cSrcweir break;
750cdf0e10cSrcweir case SID_FM_SEARCH:
751cdf0e10cSrcweir {
752cdf0e10cSrcweir const ::svx::ControllerFeatures& rController = GetImpl()->getActiveControllerFeatures();
753cdf0e10cSrcweir if ( rController->commitCurrentControl() && rController->commitCurrentRecord() )
754cdf0e10cSrcweir GetImpl()->ExecuteSearch();
755cdf0e10cSrcweir rReq.Done();
756cdf0e10cSrcweir }
757cdf0e10cSrcweir break;
758cdf0e10cSrcweir
759cdf0e10cSrcweir case SID_FM_RECORD_FIRST:
760cdf0e10cSrcweir case SID_FM_RECORD_PREV:
761cdf0e10cSrcweir case SID_FM_RECORD_NEXT:
762cdf0e10cSrcweir case SID_FM_RECORD_LAST:
763cdf0e10cSrcweir case SID_FM_RECORD_NEW:
764cdf0e10cSrcweir case SID_FM_REFRESH:
765cdf0e10cSrcweir case SID_FM_REFRESH_FORM_CONTROL:
766cdf0e10cSrcweir case SID_FM_RECORD_DELETE:
767cdf0e10cSrcweir case SID_FM_RECORD_UNDO:
768cdf0e10cSrcweir case SID_FM_RECORD_SAVE:
769cdf0e10cSrcweir case SID_FM_REMOVE_FILTER_SORT:
770cdf0e10cSrcweir case SID_FM_SORTDOWN:
771cdf0e10cSrcweir case SID_FM_SORTUP:
772cdf0e10cSrcweir case SID_FM_AUTOFILTER:
773cdf0e10cSrcweir case SID_FM_ORDERCRIT:
774cdf0e10cSrcweir case SID_FM_FORM_FILTERED:
775cdf0e10cSrcweir {
776cdf0e10cSrcweir GetImpl()->ExecuteFormSlot( nSlot );
777cdf0e10cSrcweir rReq.Done();
778cdf0e10cSrcweir }
779cdf0e10cSrcweir break;
780cdf0e10cSrcweir
781cdf0e10cSrcweir case SID_FM_RECORD_ABSOLUTE:
782cdf0e10cSrcweir {
783cdf0e10cSrcweir const ::svx::ControllerFeatures& rController = GetImpl()->getNavControllerFeatures();
784cdf0e10cSrcweir sal_Int32 nRecord = -1;
785cdf0e10cSrcweir
786cdf0e10cSrcweir const SfxItemSet* pArgs = rReq.GetArgs();
787cdf0e10cSrcweir if ( pArgs )
788cdf0e10cSrcweir {
789cdf0e10cSrcweir const SfxPoolItem* pItem;
790cdf0e10cSrcweir if ( ( pArgs->GetItemState( FN_PARAM_1, sal_True, &pItem ) ) == SFX_ITEM_SET )
791cdf0e10cSrcweir {
792cdf0e10cSrcweir const SfxInt32Item* pTypedItem = PTR_CAST( SfxInt32Item, pItem );
793cdf0e10cSrcweir if ( pTypedItem )
794cdf0e10cSrcweir nRecord = Max( pTypedItem->GetValue(), sal_Int32(0) );
795cdf0e10cSrcweir }
796cdf0e10cSrcweir }
797cdf0e10cSrcweir else
798cdf0e10cSrcweir {
799cdf0e10cSrcweir SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
800cdf0e10cSrcweir DBG_ASSERT( pFact, "no dialog factory!" );
801cdf0e10cSrcweir if ( pFact )
802cdf0e10cSrcweir {
803cdf0e10cSrcweir ::std::auto_ptr< AbstractFmInputRecordNoDialog > dlg( pFact->CreateFmInputRecordNoDialog( NULL ) );
804cdf0e10cSrcweir DBG_ASSERT( dlg.get(), "Dialogdiet fail!" );
805cdf0e10cSrcweir dlg->SetValue( rController->getCursor()->getRow() );
806cdf0e10cSrcweir if ( dlg->Execute() == RET_OK )
807cdf0e10cSrcweir nRecord = dlg->GetValue();
808cdf0e10cSrcweir
809cdf0e10cSrcweir rReq.AppendItem( SfxInt32Item( FN_PARAM_1, nRecord ) );
810cdf0e10cSrcweir }
811cdf0e10cSrcweir }
812cdf0e10cSrcweir
813cdf0e10cSrcweir if ( nRecord != -1 )
814cdf0e10cSrcweir rController->execute( nSlot, ::rtl::OUString::createFromAscii( "Position" ), makeAny( (sal_Int32)nRecord ) );
815cdf0e10cSrcweir
816cdf0e10cSrcweir rReq.Done();
817cdf0e10cSrcweir } break;
818cdf0e10cSrcweir case SID_FM_FILTER_EXECUTE:
819cdf0e10cSrcweir case SID_FM_FILTER_EXIT:
820cdf0e10cSrcweir {
821cdf0e10cSrcweir sal_Bool bCancelled = ( SID_FM_FILTER_EXIT == nSlot );
822cdf0e10cSrcweir sal_Bool bReopenNavigator = sal_False;
823cdf0e10cSrcweir
824cdf0e10cSrcweir if ( !bCancelled )
825cdf0e10cSrcweir {
826cdf0e10cSrcweir // if the filter navigator is still open, we need to close it, so it can possibly
827cdf0e10cSrcweir // commit it's most recent changes
828cdf0e10cSrcweir if ( GetViewShell() && GetViewShell()->GetViewFrame() )
829cdf0e10cSrcweir if ( GetViewShell()->GetViewFrame()->HasChildWindow( SID_FM_FILTER_NAVIGATOR ) )
830cdf0e10cSrcweir {
831cdf0e10cSrcweir GetViewShell()->GetViewFrame()->ToggleChildWindow( SID_FM_FILTER_NAVIGATOR );
832cdf0e10cSrcweir bReopenNavigator = sal_True;
833cdf0e10cSrcweir }
834cdf0e10cSrcweir
835cdf0e10cSrcweir Reference< runtime::XFormController > xController( GetImpl()->getActiveController() );
836cdf0e10cSrcweir
837cdf0e10cSrcweir if ( GetViewShell()->GetViewFrame()->HasChildWindow( SID_FM_FILTER_NAVIGATOR )
838cdf0e10cSrcweir // closing the window was denied, for instance because of a invalid criterion
839cdf0e10cSrcweir
840cdf0e10cSrcweir || ( xController.is()
841cdf0e10cSrcweir && !GetImpl()->getActiveControllerFeatures()->commitCurrentControl( )
842cdf0e10cSrcweir )
843cdf0e10cSrcweir // committing the controller was denied
844cdf0e10cSrcweir )
845cdf0e10cSrcweir {
846cdf0e10cSrcweir rReq.Done();
847cdf0e10cSrcweir break;
848cdf0e10cSrcweir }
849cdf0e10cSrcweir }
850cdf0e10cSrcweir
851cdf0e10cSrcweir GetImpl()->stopFiltering( !bCancelled );
852cdf0e10cSrcweir rReq.Done();
853cdf0e10cSrcweir
854cdf0e10cSrcweir if ( bReopenNavigator )
855cdf0e10cSrcweir // we closed the navigator only to implicitly commit it (as we do not have another
856cdf0e10cSrcweir // direct wire to it), but to the user, it should look it it was always open
857cdf0e10cSrcweir GetViewShell()->GetViewFrame()->ToggleChildWindow( SID_FM_FILTER_NAVIGATOR );
858cdf0e10cSrcweir }
859cdf0e10cSrcweir break;
860cdf0e10cSrcweir
861cdf0e10cSrcweir case SID_FM_FILTER_START:
862cdf0e10cSrcweir {
863cdf0e10cSrcweir GetImpl()->startFiltering();
864cdf0e10cSrcweir rReq.Done();
865cdf0e10cSrcweir
866cdf0e10cSrcweir // initially open the filter navigator, the whole form based filter is pretty useless without it
867cdf0e10cSrcweir SfxBoolItem aIdentifierItem( SID_FM_FILTER_NAVIGATOR, sal_True );
868cdf0e10cSrcweir GetViewShell()->GetViewFrame()->GetDispatcher()->Execute( SID_FM_FILTER_NAVIGATOR, SFX_CALLMODE_ASYNCHRON,
869cdf0e10cSrcweir &aIdentifierItem, NULL );
870cdf0e10cSrcweir } break;
871cdf0e10cSrcweir }
872cdf0e10cSrcweir }
873cdf0e10cSrcweir
874cdf0e10cSrcweir //------------------------------------------------------------------------
GetState(SfxItemSet & rSet)875cdf0e10cSrcweir void FmFormShell::GetState(SfxItemSet &rSet)
876cdf0e10cSrcweir {
877cdf0e10cSrcweir SfxWhichIter aIter( rSet );
878cdf0e10cSrcweir sal_uInt16 nWhich = aIter.FirstWhich();
879cdf0e10cSrcweir while ( nWhich )
880cdf0e10cSrcweir {
881cdf0e10cSrcweir switch( nWhich )
882cdf0e10cSrcweir {
883cdf0e10cSrcweir case SID_FM_MORE_CONTROLS:
884cdf0e10cSrcweir case SID_FM_FORM_DESIGN_TOOLS:
885cdf0e10cSrcweir {
886cdf0e10cSrcweir FormToolboxes aToolboxAccess( GetImpl()->getHostFrame() );
887cdf0e10cSrcweir rSet.Put( SfxBoolItem( nWhich, aToolboxAccess.isToolboxVisible( nWhich ) ) );
888cdf0e10cSrcweir }
889cdf0e10cSrcweir break;
890cdf0e10cSrcweir
891cdf0e10cSrcweir case SID_FM_FILTER_EXECUTE:
892cdf0e10cSrcweir case SID_FM_FILTER_EXIT:
893cdf0e10cSrcweir if (!GetImpl()->isInFilterMode())
894cdf0e10cSrcweir rSet.DisableItem( nWhich );
895cdf0e10cSrcweir break;
896cdf0e10cSrcweir
897cdf0e10cSrcweir case SID_FM_USE_WIZARDS:
898cdf0e10cSrcweir if ( !SvtModuleOptions().IsModuleInstalled( SvtModuleOptions::E_SDATABASE ) )
899cdf0e10cSrcweir rSet.Put( SfxVisibilityItem( nWhich, sal_False ) );
900cdf0e10cSrcweir else if (!GetFormModel())
901cdf0e10cSrcweir rSet.DisableItem( nWhich );
902cdf0e10cSrcweir else
903cdf0e10cSrcweir rSet.Put( SfxBoolItem(nWhich, GetImpl()->GetWizardUsing() ) );
904cdf0e10cSrcweir break;
905cdf0e10cSrcweir case SID_FM_AUTOCONTROLFOCUS:
906cdf0e10cSrcweir if (!GetFormModel())
907cdf0e10cSrcweir rSet.DisableItem( nWhich );
908cdf0e10cSrcweir else
909cdf0e10cSrcweir rSet.Put( SfxBoolItem(nWhich, GetFormModel()->GetAutoControlFocus() ) );
910cdf0e10cSrcweir break;
911cdf0e10cSrcweir case SID_FM_OPEN_READONLY:
912cdf0e10cSrcweir if (!GetFormModel())
913cdf0e10cSrcweir rSet.DisableItem( nWhich );
914cdf0e10cSrcweir else
915cdf0e10cSrcweir rSet.Put( SfxBoolItem(nWhich, GetFormModel()->GetOpenInDesignMode() ) );
916cdf0e10cSrcweir break;
917cdf0e10cSrcweir
918cdf0e10cSrcweir case SID_FM_NAVIGATIONBAR:
919cdf0e10cSrcweir case SID_FM_DBGRID:
920cdf0e10cSrcweir if ( !SvtModuleOptions().IsModuleInstalled( SvtModuleOptions::E_SDATABASE ) )
921cdf0e10cSrcweir {
922cdf0e10cSrcweir rSet.Put( SfxVisibilityItem( nWhich, sal_False ) );
923cdf0e10cSrcweir break;
924cdf0e10cSrcweir }
925cdf0e10cSrcweir // NO break!
926cdf0e10cSrcweir
927cdf0e10cSrcweir case SID_FM_SCROLLBAR:
928cdf0e10cSrcweir case SID_FM_IMAGECONTROL:
929cdf0e10cSrcweir case SID_FM_FILECONTROL:
930cdf0e10cSrcweir case SID_FM_CURRENCYFIELD:
931cdf0e10cSrcweir case SID_FM_PATTERNFIELD:
932cdf0e10cSrcweir case SID_FM_IMAGEBUTTON:
933cdf0e10cSrcweir case SID_FM_RADIOBUTTON:
934cdf0e10cSrcweir case SID_FM_COMBOBOX:
935cdf0e10cSrcweir case SID_FM_GROUPBOX:
936cdf0e10cSrcweir case SID_FM_CHECKBOX:
937cdf0e10cSrcweir case SID_FM_PUSHBUTTON:
938cdf0e10cSrcweir case SID_FM_FIXEDTEXT:
939cdf0e10cSrcweir case SID_FM_LISTBOX:
940cdf0e10cSrcweir case SID_FM_EDIT:
941cdf0e10cSrcweir case SID_FM_DATEFIELD:
942cdf0e10cSrcweir case SID_FM_TIMEFIELD:
943cdf0e10cSrcweir case SID_FM_NUMERICFIELD:
944cdf0e10cSrcweir case SID_FM_FORMATTEDFIELD:
945cdf0e10cSrcweir case SID_FM_SPINBUTTON:
946cdf0e10cSrcweir if (!m_bDesignMode)
947cdf0e10cSrcweir rSet.DisableItem( nWhich );
948cdf0e10cSrcweir else
949cdf0e10cSrcweir {
950cdf0e10cSrcweir sal_Bool bLayerLocked = sal_False;
951cdf0e10cSrcweir if (m_pFormView)
952cdf0e10cSrcweir {
953cdf0e10cSrcweir // Ist der ::com::sun::star::drawing::Layer gelocked, so m???ssen die Slots disabled werden. #36897
954cdf0e10cSrcweir SdrPageView* pPV = m_pFormView->GetSdrPageView();
955cdf0e10cSrcweir if (pPV != NULL)
956cdf0e10cSrcweir bLayerLocked = pPV->IsLayerLocked(m_pFormView->GetActiveLayer());
957cdf0e10cSrcweir }
958cdf0e10cSrcweir if (bLayerLocked)
959cdf0e10cSrcweir rSet.DisableItem( nWhich );
960cdf0e10cSrcweir else
961cdf0e10cSrcweir rSet.Put( SfxBoolItem(nWhich, (nWhich==m_nLastSlot)) );
962cdf0e10cSrcweir }
963cdf0e10cSrcweir break;
964cdf0e10cSrcweir case SID_FM_FILTER_NAVIGATOR_CONTROL:
965cdf0e10cSrcweir {
966cdf0e10cSrcweir if (GetImpl()->isInFilterMode())
967cdf0e10cSrcweir rSet.Put(SfxObjectItem(nWhich, this));
968cdf0e10cSrcweir else
969cdf0e10cSrcweir rSet.Put(SfxObjectItem(nWhich));
970cdf0e10cSrcweir } break;
971cdf0e10cSrcweir case SID_FM_FIELDS_CONTROL:
972cdf0e10cSrcweir case SID_FM_PROPERTY_CONTROL:
973cdf0e10cSrcweir {
974cdf0e10cSrcweir if (!m_bDesignMode || !m_pFormView || !m_bHasForms)
975cdf0e10cSrcweir rSet.Put(SfxObjectItem(nWhich));
976cdf0e10cSrcweir else
977cdf0e10cSrcweir rSet.Put(SfxObjectItem(nWhich, this));
978cdf0e10cSrcweir
979cdf0e10cSrcweir } break;
980cdf0e10cSrcweir case SID_FM_FMEXPLORER_CONTROL:
981cdf0e10cSrcweir case SID_FM_DATANAVIGATOR_CONTROL :
982cdf0e10cSrcweir {
983cdf0e10cSrcweir if (!m_bDesignMode || !m_pFormView)
984cdf0e10cSrcweir rSet.Put(SfxObjectItem(nWhich));
985cdf0e10cSrcweir else
986cdf0e10cSrcweir rSet.Put(SfxObjectItem(nWhich, this));
987cdf0e10cSrcweir
988cdf0e10cSrcweir } break;
989cdf0e10cSrcweir case SID_FM_ADD_FIELD:
990cdf0e10cSrcweir case SID_FM_SHOW_FMEXPLORER:
991cdf0e10cSrcweir case SID_FM_SHOW_PROPERTIES:
992cdf0e10cSrcweir case SID_FM_FILTER_NAVIGATOR:
993cdf0e10cSrcweir case SID_FM_SHOW_DATANAVIGATOR:
994cdf0e10cSrcweir {
995cdf0e10cSrcweir if ( GetViewShell()->GetViewFrame()->KnowsChildWindow(nWhich) )
996cdf0e10cSrcweir rSet.Put( SfxBoolItem( nWhich, GetViewShell()->GetViewFrame()->HasChildWindow(nWhich)) );
997cdf0e10cSrcweir else
998cdf0e10cSrcweir rSet.DisableItem(nWhich);
999cdf0e10cSrcweir } break;
1000cdf0e10cSrcweir
1001cdf0e10cSrcweir case SID_FM_SHOW_PROPERTY_BROWSER:
1002cdf0e10cSrcweir {
1003cdf0e10cSrcweir rSet.Put(SfxBoolItem(GetImpl()->IsPropBrwOpen()));
1004cdf0e10cSrcweir }
1005cdf0e10cSrcweir break;
1006cdf0e10cSrcweir
1007cdf0e10cSrcweir case SID_FM_CTL_PROPERTIES:
1008cdf0e10cSrcweir {
1009cdf0e10cSrcweir // der Impl eventuell die Moeglichjkeit geben, ihre an der aktuellen MarkList ausgerichteten Objekte
1010cdf0e10cSrcweir // auf den neuesten Stand zu bringen
1011cdf0e10cSrcweir if (GetImpl()->IsSelectionUpdatePending())
1012cdf0e10cSrcweir GetImpl()->ForceUpdateSelection(sal_False);
1013cdf0e10cSrcweir
1014cdf0e10cSrcweir if ( !m_pFormView || !m_bDesignMode || !GetImpl()->onlyControlsAreMarked() )
1015cdf0e10cSrcweir rSet.DisableItem( nWhich );
1016cdf0e10cSrcweir else
1017cdf0e10cSrcweir {
1018cdf0e10cSrcweir sal_Bool bChecked = GetImpl()->IsPropBrwOpen() && !GetImpl()->isSolelySelected( GetImpl()->getCurrentForm() );
1019cdf0e10cSrcweir // if the property browser is open, and only controls are marked, and the current selection
1020cdf0e10cSrcweir // does not consist of only the current form, then the current selection is the (composition of)
1021cdf0e10cSrcweir // the currently marked controls
1022cdf0e10cSrcweir rSet.Put( SfxBoolItem( nWhich, bChecked ) );
1023cdf0e10cSrcweir }
1024cdf0e10cSrcweir } break;
1025cdf0e10cSrcweir
1026cdf0e10cSrcweir case SID_FM_PROPERTIES:
1027cdf0e10cSrcweir {
1028cdf0e10cSrcweir // der Impl eventuell die Moeglichjkeit geben, ihre an der aktuellen MarkList ausgerichteten Objekte
1029cdf0e10cSrcweir // auf den neuesten Stand zu bringen
1030cdf0e10cSrcweir if (GetImpl()->IsSelectionUpdatePending())
1031cdf0e10cSrcweir GetImpl()->ForceUpdateSelection(sal_False);
1032cdf0e10cSrcweir
1033cdf0e10cSrcweir if ( !m_pFormView || !m_bDesignMode || !GetImpl()->getCurrentForm().is() )
1034cdf0e10cSrcweir rSet.DisableItem( nWhich );
1035cdf0e10cSrcweir else
1036cdf0e10cSrcweir {
1037cdf0e10cSrcweir sal_Bool bChecked = GetImpl()->IsPropBrwOpen() && GetImpl()->isSolelySelected( GetImpl()->getCurrentForm() );
1038cdf0e10cSrcweir rSet.Put(SfxBoolItem(nWhich, bChecked));
1039cdf0e10cSrcweir }
1040cdf0e10cSrcweir } break;
1041cdf0e10cSrcweir case SID_FM_TAB_DIALOG:
1042cdf0e10cSrcweir // der Impl eventuell die Moeglichjkeit geben, ihre an der aktuellen MarkList ausgerichteten Objekte
1043cdf0e10cSrcweir // auf den neuesten Stand zu bringen
1044cdf0e10cSrcweir if (GetImpl()->IsSelectionUpdatePending())
1045cdf0e10cSrcweir GetImpl()->ForceUpdateSelection(sal_False);
1046cdf0e10cSrcweir
1047cdf0e10cSrcweir if (!m_pFormView || !m_bDesignMode || !GetImpl()->getCurrentForm().is() )
1048cdf0e10cSrcweir rSet.DisableItem( nWhich );
1049cdf0e10cSrcweir break;
1050cdf0e10cSrcweir case SID_FM_CONFIG:
1051cdf0e10cSrcweir rSet.Put(SfxUInt16Item(nWhich, m_nLastSlot));
1052cdf0e10cSrcweir break;
1053cdf0e10cSrcweir case SID_FM_DESIGN_MODE:
1054cdf0e10cSrcweir if (!m_pFormView || GetImpl()->IsReadonlyDoc() )
1055cdf0e10cSrcweir rSet.DisableItem( nWhich );
1056cdf0e10cSrcweir else
1057cdf0e10cSrcweir rSet.Put( SfxBoolItem(nWhich, m_bDesignMode) );
1058cdf0e10cSrcweir break;
1059cdf0e10cSrcweir case SID_FM_SEARCH:
1060cdf0e10cSrcweir case SID_FM_RECORD_FIRST:
1061cdf0e10cSrcweir case SID_FM_RECORD_NEXT:
1062cdf0e10cSrcweir case SID_FM_RECORD_PREV:
1063cdf0e10cSrcweir case SID_FM_RECORD_LAST:
1064cdf0e10cSrcweir case SID_FM_RECORD_NEW:
1065cdf0e10cSrcweir case SID_FM_RECORD_DELETE:
1066cdf0e10cSrcweir case SID_FM_RECORD_ABSOLUTE:
1067cdf0e10cSrcweir case SID_FM_RECORD_TOTAL:
1068cdf0e10cSrcweir case SID_FM_RECORD_SAVE:
1069cdf0e10cSrcweir case SID_FM_RECORD_UNDO:
1070cdf0e10cSrcweir case SID_FM_FORM_FILTERED:
1071cdf0e10cSrcweir case SID_FM_REMOVE_FILTER_SORT:
1072cdf0e10cSrcweir case SID_FM_SORTUP:
1073cdf0e10cSrcweir case SID_FM_SORTDOWN:
1074cdf0e10cSrcweir case SID_FM_ORDERCRIT:
1075cdf0e10cSrcweir case SID_FM_FILTER_START:
1076cdf0e10cSrcweir case SID_FM_AUTOFILTER:
1077cdf0e10cSrcweir case SID_FM_REFRESH:
1078cdf0e10cSrcweir case SID_FM_REFRESH_FORM_CONTROL:
1079cdf0e10cSrcweir case SID_FM_VIEW_AS_GRID:
1080cdf0e10cSrcweir GetFormState(rSet,nWhich);
1081cdf0e10cSrcweir break;
1082cdf0e10cSrcweir
1083cdf0e10cSrcweir case SID_FM_CHANGECONTROLTYPE:
1084cdf0e10cSrcweir {
1085cdf0e10cSrcweir if ( !m_pFormView || !m_bDesignMode )
1086cdf0e10cSrcweir rSet.DisableItem( nWhich );
1087cdf0e10cSrcweir else
1088cdf0e10cSrcweir {
1089cdf0e10cSrcweir if ( !GetImpl()->canConvertCurrentSelectionToControl( OBJ_FM_FIXEDTEXT ) )
1090cdf0e10cSrcweir // if it cannot be converted to a fixed text, it is no single control
1091cdf0e10cSrcweir rSet.DisableItem( nWhich );
1092cdf0e10cSrcweir }
1093cdf0e10cSrcweir } break;
1094cdf0e10cSrcweir
1095cdf0e10cSrcweir case SID_FM_CONVERTTO_FILECONTROL :
1096cdf0e10cSrcweir case SID_FM_CONVERTTO_CURRENCY :
1097cdf0e10cSrcweir case SID_FM_CONVERTTO_PATTERN :
1098cdf0e10cSrcweir case SID_FM_CONVERTTO_IMAGECONTROL :
1099cdf0e10cSrcweir case SID_FM_CONVERTTO_SCROLLBAR :
1100cdf0e10cSrcweir case SID_FM_CONVERTTO_NAVIGATIONBAR :
1101cdf0e10cSrcweir case SID_FM_CONVERTTO_IMAGEBUTTON :
1102cdf0e10cSrcweir case SID_FM_CONVERTTO_EDIT :
1103cdf0e10cSrcweir case SID_FM_CONVERTTO_BUTTON :
1104cdf0e10cSrcweir case SID_FM_CONVERTTO_FIXEDTEXT :
1105cdf0e10cSrcweir case SID_FM_CONVERTTO_LISTBOX :
1106cdf0e10cSrcweir case SID_FM_CONVERTTO_CHECKBOX :
1107cdf0e10cSrcweir case SID_FM_CONVERTTO_RADIOBUTTON :
1108cdf0e10cSrcweir case SID_FM_CONVERTTO_GROUPBOX :
1109cdf0e10cSrcweir case SID_FM_CONVERTTO_COMBOBOX :
1110cdf0e10cSrcweir case SID_FM_CONVERTTO_DATE :
1111cdf0e10cSrcweir case SID_FM_CONVERTTO_TIME :
1112cdf0e10cSrcweir case SID_FM_CONVERTTO_NUMERIC :
1113cdf0e10cSrcweir case SID_FM_CONVERTTO_FORMATTED :
1114cdf0e10cSrcweir case SID_FM_CONVERTTO_SPINBUTTON :
1115cdf0e10cSrcweir {
1116cdf0e10cSrcweir if ( !m_pFormView || !m_bDesignMode || !GetImpl()->canConvertCurrentSelectionToControl( nWhich ) )
1117cdf0e10cSrcweir rSet.DisableItem( nWhich );
1118cdf0e10cSrcweir else
1119cdf0e10cSrcweir {
1120cdf0e10cSrcweir rSet.Put( SfxBoolItem( nWhich, sal_False ) );
1121cdf0e10cSrcweir // just to have a defined state (available and not checked)
1122cdf0e10cSrcweir }
1123cdf0e10cSrcweir }
1124cdf0e10cSrcweir break;
1125cdf0e10cSrcweir }
1126cdf0e10cSrcweir nWhich = aIter.NextWhich();
1127cdf0e10cSrcweir }
1128cdf0e10cSrcweir }
1129cdf0e10cSrcweir
1130cdf0e10cSrcweir //------------------------------------------------------------------------
GetFormState(SfxItemSet & rSet,sal_uInt16 nWhich)1131cdf0e10cSrcweir void FmFormShell::GetFormState(SfxItemSet &rSet, sal_uInt16 nWhich)
1132cdf0e10cSrcweir {
1133cdf0e10cSrcweir if ( !GetImpl()->getNavController().is()
1134cdf0e10cSrcweir || !isRowSetAlive(GetImpl()->getNavController()->getModel())
1135cdf0e10cSrcweir || !m_pFormView
1136cdf0e10cSrcweir || m_bDesignMode
1137cdf0e10cSrcweir || !GetImpl()->getActiveForm().is()
1138cdf0e10cSrcweir || GetImpl()->isInFilterMode()
1139cdf0e10cSrcweir )
1140cdf0e10cSrcweir rSet.DisableItem(nWhich);
1141cdf0e10cSrcweir else
1142cdf0e10cSrcweir {
1143cdf0e10cSrcweir sal_Bool bEnable = sal_False;
1144cdf0e10cSrcweir try
1145cdf0e10cSrcweir {
1146cdf0e10cSrcweir switch (nWhich)
1147cdf0e10cSrcweir {
1148cdf0e10cSrcweir case SID_FM_VIEW_AS_GRID:
1149cdf0e10cSrcweir if (GetImpl()->getHostFrame().is() && GetImpl()->getNavController().is())
1150cdf0e10cSrcweir {
1151cdf0e10cSrcweir bEnable = sal_True;
1152cdf0e10cSrcweir sal_Bool bDisplayingCurrent =
1153cdf0e10cSrcweir GetImpl()->getInternalForm(
1154cdf0e10cSrcweir Reference< XForm >( GetImpl()->getNavController()->getModel(), UNO_QUERY )
1155cdf0e10cSrcweir ) == GetImpl()->getExternallyDisplayedForm();
1156cdf0e10cSrcweir rSet.Put(SfxBoolItem(nWhich, bDisplayingCurrent));
1157cdf0e10cSrcweir }
1158cdf0e10cSrcweir break;
1159cdf0e10cSrcweir
1160cdf0e10cSrcweir case SID_FM_SEARCH:
1161cdf0e10cSrcweir {
1162cdf0e10cSrcweir Reference< ::com::sun::star::beans::XPropertySet > xNavSet(GetImpl()->getActiveForm(), UNO_QUERY);
1163cdf0e10cSrcweir sal_Int32 nCount = ::comphelper::getINT32(xNavSet->getPropertyValue(FM_PROP_ROWCOUNT));
1164cdf0e10cSrcweir bEnable = nCount != 0;
1165cdf0e10cSrcweir } break;
1166cdf0e10cSrcweir case SID_FM_RECORD_ABSOLUTE:
1167cdf0e10cSrcweir case SID_FM_RECORD_TOTAL:
1168cdf0e10cSrcweir {
1169cdf0e10cSrcweir FeatureState aState;
1170cdf0e10cSrcweir GetImpl()->getNavControllerFeatures()->getState( nWhich, aState );
1171cdf0e10cSrcweir if ( SID_FM_RECORD_ABSOLUTE == nWhich )
1172cdf0e10cSrcweir {
1173cdf0e10cSrcweir sal_Int32 nPosition = 0;
1174cdf0e10cSrcweir aState.State >>= nPosition;
1175cdf0e10cSrcweir rSet.Put( SfxInt32Item( nWhich, nPosition ) );
1176cdf0e10cSrcweir }
1177cdf0e10cSrcweir else if ( SID_FM_RECORD_TOTAL == nWhich )
1178cdf0e10cSrcweir {
1179cdf0e10cSrcweir ::rtl::OUString sTotalCount;
1180cdf0e10cSrcweir aState.State >>= sTotalCount;
1181cdf0e10cSrcweir rSet.Put( SfxStringItem( nWhich, sTotalCount ) );
1182cdf0e10cSrcweir }
1183cdf0e10cSrcweir bEnable = aState.Enabled;
1184cdf0e10cSrcweir }
1185cdf0e10cSrcweir break;
1186cdf0e10cSrcweir
1187cdf0e10cSrcweir // first, prev, next, last, and absolute affect the nav controller, not the
1188cdf0e10cSrcweir // active controller
1189cdf0e10cSrcweir case SID_FM_RECORD_FIRST:
1190cdf0e10cSrcweir case SID_FM_RECORD_PREV:
1191cdf0e10cSrcweir case SID_FM_RECORD_NEXT:
1192cdf0e10cSrcweir case SID_FM_RECORD_LAST:
1193cdf0e10cSrcweir case SID_FM_RECORD_NEW:
1194cdf0e10cSrcweir case SID_FM_RECORD_SAVE:
1195cdf0e10cSrcweir case SID_FM_RECORD_UNDO:
1196cdf0e10cSrcweir case SID_FM_RECORD_DELETE:
1197cdf0e10cSrcweir case SID_FM_REFRESH:
1198cdf0e10cSrcweir case SID_FM_REFRESH_FORM_CONTROL:
1199cdf0e10cSrcweir case SID_FM_REMOVE_FILTER_SORT:
1200cdf0e10cSrcweir case SID_FM_SORTUP:
1201cdf0e10cSrcweir case SID_FM_SORTDOWN:
1202cdf0e10cSrcweir case SID_FM_AUTOFILTER:
1203cdf0e10cSrcweir case SID_FM_ORDERCRIT:
1204cdf0e10cSrcweir bEnable = GetImpl()->IsFormSlotEnabled( nWhich );
1205cdf0e10cSrcweir break;
1206cdf0e10cSrcweir
1207cdf0e10cSrcweir case SID_FM_FORM_FILTERED:
1208cdf0e10cSrcweir {
1209cdf0e10cSrcweir FeatureState aState;
1210cdf0e10cSrcweir bEnable = GetImpl()->IsFormSlotEnabled( nWhich, &aState );
1211cdf0e10cSrcweir
1212cdf0e10cSrcweir rSet.Put( SfxBoolItem( nWhich, ::comphelper::getBOOL( aState.State ) ) );
1213cdf0e10cSrcweir }
1214cdf0e10cSrcweir break;
1215cdf0e10cSrcweir
1216cdf0e10cSrcweir case SID_FM_FILTER_START:
1217cdf0e10cSrcweir bEnable = GetImpl()->getActiveControllerFeatures()->canDoFormFilter();
1218cdf0e10cSrcweir break;
1219cdf0e10cSrcweir }
1220cdf0e10cSrcweir }
1221cdf0e10cSrcweir catch( const Exception& )
1222cdf0e10cSrcweir {
1223cdf0e10cSrcweir DBG_ERROR( "FmFormShell::GetFormState: caught an exception while determining the state!" );
1224cdf0e10cSrcweir }
1225cdf0e10cSrcweir if (!bEnable)
1226cdf0e10cSrcweir rSet.DisableItem(nWhich);
1227cdf0e10cSrcweir }
1228cdf0e10cSrcweir }
1229cdf0e10cSrcweir
1230cdf0e10cSrcweir //------------------------------------------------------------------------
GetCurPage() const1231cdf0e10cSrcweir FmFormPage* FmFormShell::GetCurPage() const
1232cdf0e10cSrcweir {
1233cdf0e10cSrcweir FmFormPage* pP = NULL;
1234cdf0e10cSrcweir if (m_pFormView && m_pFormView->GetSdrPageView())
1235cdf0e10cSrcweir pP = PTR_CAST(FmFormPage,m_pFormView->GetSdrPageView()->GetPage());
1236cdf0e10cSrcweir return pP;
1237cdf0e10cSrcweir }
1238cdf0e10cSrcweir
1239cdf0e10cSrcweir //------------------------------------------------------------------------
SetView(FmFormView * _pView)1240cdf0e10cSrcweir void FmFormShell::SetView( FmFormView* _pView )
1241cdf0e10cSrcweir {
1242cdf0e10cSrcweir if ( m_pFormView )
1243cdf0e10cSrcweir {
1244cdf0e10cSrcweir if ( IsActive() )
1245cdf0e10cSrcweir GetImpl()->viewDeactivated( *m_pFormView );
1246cdf0e10cSrcweir
1247cdf0e10cSrcweir m_pFormView->SetFormShell( NULL, FmFormView::FormShellAccess() );
1248cdf0e10cSrcweir m_pFormView = NULL;
1249cdf0e10cSrcweir m_pFormModel = NULL;
1250cdf0e10cSrcweir }
1251cdf0e10cSrcweir
1252cdf0e10cSrcweir if ( !_pView )
1253cdf0e10cSrcweir return;
1254cdf0e10cSrcweir
1255cdf0e10cSrcweir m_pFormView = _pView;
1256cdf0e10cSrcweir m_pFormView->SetFormShell( this, FmFormView::FormShellAccess() );
1257cdf0e10cSrcweir m_pFormModel = (FmFormModel*)m_pFormView->GetModel();
1258cdf0e10cSrcweir
1259cdf0e10cSrcweir impl_setDesignMode( m_pFormView->IsDesignMode() );
1260cdf0e10cSrcweir
1261cdf0e10cSrcweir // We activate our view if we are activated ourself, but sometimes the Activate precedes the SetView.
1262cdf0e10cSrcweir // But here we know both the view and our activation state so we at least are able to pass the latter
1263cdf0e10cSrcweir // to the former.
1264cdf0e10cSrcweir // FS - 30.06.99 - 67308
1265cdf0e10cSrcweir if ( IsActive() )
1266cdf0e10cSrcweir GetImpl()->viewActivated( *m_pFormView );
1267cdf0e10cSrcweir }
1268cdf0e10cSrcweir
1269cdf0e10cSrcweir //------------------------------------------------------------------------
DetermineForms(sal_Bool bInvalidate)1270cdf0e10cSrcweir void FmFormShell::DetermineForms(sal_Bool bInvalidate)
1271cdf0e10cSrcweir {
1272cdf0e10cSrcweir // Existieren Formulare auf der aktuellen Page
1273cdf0e10cSrcweir sal_Bool bForms = GetImpl()->hasForms();
1274cdf0e10cSrcweir if (bForms != m_bHasForms)
1275cdf0e10cSrcweir {
1276cdf0e10cSrcweir m_bHasForms = bForms;
1277cdf0e10cSrcweir if (bInvalidate)
1278cdf0e10cSrcweir UIFeatureChanged();
1279cdf0e10cSrcweir }
1280cdf0e10cSrcweir }
1281cdf0e10cSrcweir
1282cdf0e10cSrcweir //------------------------------------------------------------------------
GetY2KState(sal_uInt16 & nReturn)1283cdf0e10cSrcweir sal_Bool FmFormShell::GetY2KState(sal_uInt16& nReturn)
1284cdf0e10cSrcweir {
1285cdf0e10cSrcweir return GetImpl()->GetY2KState(nReturn);
1286cdf0e10cSrcweir }
1287cdf0e10cSrcweir
1288cdf0e10cSrcweir //------------------------------------------------------------------------
SetY2KState(sal_uInt16 n)1289cdf0e10cSrcweir void FmFormShell::SetY2KState(sal_uInt16 n)
1290cdf0e10cSrcweir {
1291cdf0e10cSrcweir GetImpl()->SetY2KState(n);
1292cdf0e10cSrcweir }
1293cdf0e10cSrcweir
1294cdf0e10cSrcweir //------------------------------------------------------------------------
Activate(sal_Bool bMDI)1295cdf0e10cSrcweir void FmFormShell::Activate(sal_Bool bMDI)
1296cdf0e10cSrcweir {
1297cdf0e10cSrcweir SfxShell::Activate(bMDI);
1298cdf0e10cSrcweir
1299cdf0e10cSrcweir if ( m_pFormView )
1300cdf0e10cSrcweir GetImpl()->viewActivated( *m_pFormView, sal_True );
1301cdf0e10cSrcweir }
1302cdf0e10cSrcweir
1303cdf0e10cSrcweir //------------------------------------------------------------------------
Deactivate(sal_Bool bMDI)1304cdf0e10cSrcweir void FmFormShell::Deactivate(sal_Bool bMDI)
1305cdf0e10cSrcweir {
1306cdf0e10cSrcweir SfxShell::Deactivate(bMDI);
1307cdf0e10cSrcweir
1308cdf0e10cSrcweir if ( m_pFormView )
1309cdf0e10cSrcweir GetImpl()->viewDeactivated( *m_pFormView, sal_False );
1310cdf0e10cSrcweir }
1311cdf0e10cSrcweir
1312cdf0e10cSrcweir //------------------------------------------------------------------------
ExecuteTextAttribute(SfxRequest & _rReq)1313cdf0e10cSrcweir void FmFormShell::ExecuteTextAttribute( SfxRequest& _rReq )
1314cdf0e10cSrcweir {
1315cdf0e10cSrcweir m_pImpl->ExecuteTextAttribute( _rReq );
1316cdf0e10cSrcweir }
1317cdf0e10cSrcweir
1318cdf0e10cSrcweir //------------------------------------------------------------------------
GetTextAttributeState(SfxItemSet & _rSet)1319cdf0e10cSrcweir void FmFormShell::GetTextAttributeState( SfxItemSet& _rSet )
1320cdf0e10cSrcweir {
1321cdf0e10cSrcweir m_pImpl->GetTextAttributeState( _rSet );
1322cdf0e10cSrcweir }
1323cdf0e10cSrcweir
1324cdf0e10cSrcweir //------------------------------------------------------------------------
IsActiveControl() const1325cdf0e10cSrcweir bool FmFormShell::IsActiveControl() const
1326cdf0e10cSrcweir {
1327cdf0e10cSrcweir return m_pImpl->IsActiveControl();
1328cdf0e10cSrcweir }
1329cdf0e10cSrcweir
1330cdf0e10cSrcweir //------------------------------------------------------------------------
ForgetActiveControl()1331cdf0e10cSrcweir void FmFormShell::ForgetActiveControl()
1332cdf0e10cSrcweir {
1333cdf0e10cSrcweir m_pImpl->ForgetActiveControl();
1334cdf0e10cSrcweir }
1335cdf0e10cSrcweir
1336cdf0e10cSrcweir //------------------------------------------------------------------------
SetControlActivationHandler(const Link & _rHdl)1337cdf0e10cSrcweir void FmFormShell::SetControlActivationHandler( const Link& _rHdl )
1338cdf0e10cSrcweir {
1339cdf0e10cSrcweir m_pImpl->SetControlActivationHandler( _rHdl );
1340cdf0e10cSrcweir }
1341cdf0e10cSrcweir
1342cdf0e10cSrcweir //------------------------------------------------------------------------
1343cdf0e10cSrcweir namespace
1344cdf0e10cSrcweir {
lcl_findUnoObject(const SdrObjList & _rObjList,const Reference<XControlModel> & _rxModel)1345cdf0e10cSrcweir SdrUnoObj* lcl_findUnoObject( const SdrObjList& _rObjList, const Reference< XControlModel >& _rxModel )
1346cdf0e10cSrcweir {
1347cdf0e10cSrcweir SdrObjListIter aIter( _rObjList );
1348cdf0e10cSrcweir while ( aIter.IsMore() )
1349cdf0e10cSrcweir {
1350cdf0e10cSrcweir SdrObject* pObject = aIter.Next();
1351cdf0e10cSrcweir SdrUnoObj* pUnoObject = pObject ? PTR_CAST( SdrUnoObj, pObject ) : NULL;
1352cdf0e10cSrcweir if ( !pUnoObject )
1353cdf0e10cSrcweir continue;
1354cdf0e10cSrcweir
1355cdf0e10cSrcweir Reference< XControlModel > xControlModel = pUnoObject->GetUnoControlModel();
1356cdf0e10cSrcweir if ( !xControlModel.is() )
1357cdf0e10cSrcweir continue;
1358cdf0e10cSrcweir
1359cdf0e10cSrcweir if ( _rxModel == xControlModel )
1360cdf0e10cSrcweir return pUnoObject;
1361cdf0e10cSrcweir }
1362cdf0e10cSrcweir return NULL;
1363cdf0e10cSrcweir }
1364cdf0e10cSrcweir }
1365cdf0e10cSrcweir
1366cdf0e10cSrcweir //------------------------------------------------------------------------
ToggleControlFocus(const SdrUnoObj & i_rUnoObject,const SdrView & i_rView,OutputDevice & i_rDevice) const1367cdf0e10cSrcweir void FmFormShell::ToggleControlFocus( const SdrUnoObj& i_rUnoObject, const SdrView& i_rView, OutputDevice& i_rDevice ) const
1368cdf0e10cSrcweir {
1369cdf0e10cSrcweir try
1370cdf0e10cSrcweir {
1371cdf0e10cSrcweir // check if the focus currently is in a control
1372cdf0e10cSrcweir // Well, okay, do it the other way 'round: Check whether the current control of the active controller
1373cdf0e10cSrcweir // actually has the focus. This should be equivalent.
1374cdf0e10cSrcweir const bool bHasControlFocus = GetImpl()->HasControlFocus();
1375cdf0e10cSrcweir
1376cdf0e10cSrcweir if ( bHasControlFocus )
1377cdf0e10cSrcweir {
1378cdf0e10cSrcweir Window* pWindow( dynamic_cast< Window* >( &i_rDevice ) );
1379cdf0e10cSrcweir OSL_ENSURE( pWindow, "FmFormShell::ToggleControlFocus: I need a Window, really!" );
1380cdf0e10cSrcweir if ( pWindow )
1381cdf0e10cSrcweir pWindow->GrabFocus();
1382cdf0e10cSrcweir }
1383cdf0e10cSrcweir else
1384cdf0e10cSrcweir {
1385cdf0e10cSrcweir Reference< XControl > xControl;
1386cdf0e10cSrcweir GetFormControl( i_rUnoObject.GetUnoControlModel(), i_rView, i_rDevice, xControl );
1387cdf0e10cSrcweir Reference< XWindow > xControlWindow( xControl, UNO_QUERY );
1388cdf0e10cSrcweir if ( xControlWindow.is() )
1389cdf0e10cSrcweir xControlWindow->setFocus();
1390cdf0e10cSrcweir }
1391cdf0e10cSrcweir }
1392cdf0e10cSrcweir catch( const Exception& )
1393cdf0e10cSrcweir {
1394cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION();
1395cdf0e10cSrcweir }
1396cdf0e10cSrcweir }
1397cdf0e10cSrcweir
1398cdf0e10cSrcweir //------------------------------------------------------------------------
1399cdf0e10cSrcweir namespace
1400cdf0e10cSrcweir {
1401cdf0e10cSrcweir class FocusableControlsFilter : public ::svx::ISdrObjectFilter
1402cdf0e10cSrcweir {
1403cdf0e10cSrcweir public:
FocusableControlsFilter(const SdrView & i_rView,const OutputDevice & i_rDevice)1404cdf0e10cSrcweir FocusableControlsFilter( const SdrView& i_rView, const OutputDevice& i_rDevice )
1405cdf0e10cSrcweir :m_rView( i_rView )
1406cdf0e10cSrcweir ,m_rDevice( i_rDevice )
1407cdf0e10cSrcweir {
1408cdf0e10cSrcweir }
1409cdf0e10cSrcweir
1410cdf0e10cSrcweir public:
includeObject(const SdrObject & i_rObject) const1411cdf0e10cSrcweir virtual bool includeObject( const SdrObject& i_rObject ) const
1412cdf0e10cSrcweir {
1413cdf0e10cSrcweir const SdrUnoObj* pUnoObj = dynamic_cast< const SdrUnoObj* >( &i_rObject );
1414cdf0e10cSrcweir if ( !pUnoObj )
1415cdf0e10cSrcweir return false;
1416cdf0e10cSrcweir
1417cdf0e10cSrcweir Reference< XControl > xControl = pUnoObj->GetUnoControl( m_rView, m_rDevice );
1418cdf0e10cSrcweir return FmXFormView::isFocusable( xControl );
1419cdf0e10cSrcweir }
1420cdf0e10cSrcweir
1421cdf0e10cSrcweir private:
1422cdf0e10cSrcweir const SdrView& m_rView;
1423cdf0e10cSrcweir const OutputDevice& m_rDevice;
1424cdf0e10cSrcweir };
1425cdf0e10cSrcweir }
1426cdf0e10cSrcweir
1427cdf0e10cSrcweir //------------------------------------------------------------------------
CreateFocusableControlFilter(const SdrView & i_rView,const OutputDevice & i_rDevice) const1428cdf0e10cSrcweir ::std::auto_ptr< ::svx::ISdrObjectFilter > FmFormShell::CreateFocusableControlFilter( const SdrView& i_rView, const OutputDevice& i_rDevice ) const
1429cdf0e10cSrcweir {
1430cdf0e10cSrcweir ::std::auto_ptr< ::svx::ISdrObjectFilter > pFilter;
1431cdf0e10cSrcweir
1432cdf0e10cSrcweir if ( !i_rView.IsDesignMode() )
1433cdf0e10cSrcweir pFilter.reset( new FocusableControlsFilter( i_rView, i_rDevice ) );
1434cdf0e10cSrcweir
1435cdf0e10cSrcweir return pFilter;
1436cdf0e10cSrcweir }
1437cdf0e10cSrcweir
1438cdf0e10cSrcweir //------------------------------------------------------------------------
GetFormControl(const Reference<XControlModel> & _rxModel,const SdrView & _rView,const OutputDevice & _rDevice,Reference<XControl> & _out_rxControl) const1439cdf0e10cSrcweir SdrUnoObj* FmFormShell::GetFormControl( const Reference< XControlModel >& _rxModel, const SdrView& _rView, const OutputDevice& _rDevice, Reference< XControl >& _out_rxControl ) const
1440cdf0e10cSrcweir {
1441cdf0e10cSrcweir if ( !_rxModel.is() )
1442cdf0e10cSrcweir return NULL;
1443cdf0e10cSrcweir
1444cdf0e10cSrcweir // we can only retrieve controls for SdrObjects which belong to page which is actually displayed in the given view
1445cdf0e10cSrcweir SdrPageView* pPageView = _rView.GetSdrPageView();
1446cdf0e10cSrcweir SdrPage* pPage = pPageView ? pPageView->GetPage() : NULL;
1447cdf0e10cSrcweir OSL_ENSURE( pPage, "FmFormShell::GetFormControl: no page displayed in the given view!" );
1448cdf0e10cSrcweir if ( !pPage )
1449cdf0e10cSrcweir return NULL;
1450cdf0e10cSrcweir
1451cdf0e10cSrcweir SdrUnoObj* pUnoObject = lcl_findUnoObject( *pPage, _rxModel );
1452cdf0e10cSrcweir if ( pUnoObject )
1453cdf0e10cSrcweir {
1454cdf0e10cSrcweir _out_rxControl = pUnoObject->GetUnoControl( _rView, _rDevice );
1455cdf0e10cSrcweir return pUnoObject;
1456cdf0e10cSrcweir }
1457cdf0e10cSrcweir
1458cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 0
1459cdf0e10cSrcweir // perhaps we are fed with a control model which lives on a page other than the one displayed
1460cdf0e10cSrcweir // in the given view. This is worth being reported as error, in non-product builds.
1461cdf0e10cSrcweir FmFormModel* pModel = GetFormModel();
1462cdf0e10cSrcweir if ( pModel )
1463cdf0e10cSrcweir {
1464cdf0e10cSrcweir sal_uInt16 pageCount = pModel->GetPageCount();
1465cdf0e10cSrcweir for ( sal_uInt16 page = 0; page < pageCount; ++page )
1466cdf0e10cSrcweir {
1467cdf0e10cSrcweir pPage = pModel->GetPage( page );
1468cdf0e10cSrcweir OSL_ENSURE( pPage, "FmFormShell::GetFormControl: NULL page encountered!" );
1469cdf0e10cSrcweir if ( !pPage )
1470cdf0e10cSrcweir continue;
1471cdf0e10cSrcweir
1472cdf0e10cSrcweir pUnoObject = lcl_findUnoObject( *pPage, _rxModel );
1473cdf0e10cSrcweir OSL_ENSURE( !pUnoObject, "FmFormShell::GetFormControl: the given control model belongs to a wrong page (displayed elsewhere)!" );
1474cdf0e10cSrcweir }
1475cdf0e10cSrcweir }
1476cdf0e10cSrcweir #endif
1477cdf0e10cSrcweir
1478cdf0e10cSrcweir return NULL;
1479cdf0e10cSrcweir }
1480cdf0e10cSrcweir
1481cdf0e10cSrcweir //------------------------------------------------------------------------
GetFormController(const Reference<XForm> & _rxForm,const SdrView & _rView,const OutputDevice & _rDevice) const1482cdf0e10cSrcweir Reference< runtime::XFormController > FmFormShell::GetFormController( const Reference< XForm >& _rxForm, const SdrView& _rView, const OutputDevice& _rDevice ) const
1483cdf0e10cSrcweir {
1484cdf0e10cSrcweir const FmFormView* pFormView = dynamic_cast< const FmFormView* >( &_rView );
1485cdf0e10cSrcweir if ( !pFormView )
1486cdf0e10cSrcweir return NULL;
1487cdf0e10cSrcweir
1488cdf0e10cSrcweir return pFormView->GetFormController( _rxForm, _rDevice );
1489cdf0e10cSrcweir }
1490cdf0e10cSrcweir
1491cdf0e10cSrcweir //------------------------------------------------------------------------
SetDesignMode(sal_Bool _bDesignMode)1492cdf0e10cSrcweir void FmFormShell::SetDesignMode( sal_Bool _bDesignMode )
1493cdf0e10cSrcweir {
1494cdf0e10cSrcweir if ( _bDesignMode == m_bDesignMode )
1495cdf0e10cSrcweir return;
1496cdf0e10cSrcweir
1497cdf0e10cSrcweir FmFormModel* pModel = GetFormModel();
1498cdf0e10cSrcweir if (pModel)
1499cdf0e10cSrcweir // fuer die Zeit des Uebergangs das Undo-Environment ausschalten, das sichert, dass man dort auch nicht-transiente
1500cdf0e10cSrcweir // Properties mal eben aendern kann (sollte allerdings mit Vorsicht genossen und beim Rueckschalten des Modes
1501cdf0e10cSrcweir // auch immer wieder rueckgaegig gemacht werden. Ein Beispiel ist das Setzen der maximalen Text-Laenge durch das
1502cdf0e10cSrcweir // OEditModel an seinem Control.)
1503cdf0e10cSrcweir pModel->GetUndoEnv().Lock();
1504cdf0e10cSrcweir
1505cdf0e10cSrcweir // dann die eigentliche Umschaltung
1506cdf0e10cSrcweir if ( m_bDesignMode || PrepareClose( sal_True ) )
1507cdf0e10cSrcweir impl_setDesignMode(!m_bDesignMode );
1508cdf0e10cSrcweir
1509cdf0e10cSrcweir // und mein Undo-Environment wieder an
1510cdf0e10cSrcweir if ( pModel )
1511cdf0e10cSrcweir pModel->GetUndoEnv().UnLock();
1512cdf0e10cSrcweir }
1513