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