xref: /trunk/main/svx/source/form/navigatortreemodel.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
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
10cdf0e10cSrcweir  *
11*f6e50924SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
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.
19cdf0e10cSrcweir  *
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 <svx/dialmgr.hxx>
27cdf0e10cSrcweir #include <svx/fmshell.hxx>
28cdf0e10cSrcweir #include <svx/fmmodel.hxx>
29cdf0e10cSrcweir #include <svx/fmpage.hxx>
30cdf0e10cSrcweir #include <svx/fmglob.hxx>
31cdf0e10cSrcweir #include "svx/svditer.hxx"
32cdf0e10cSrcweir #include <svx/svdogrp.hxx>
33cdf0e10cSrcweir #include <svx/svdpagv.hxx>
34cdf0e10cSrcweir 
35cdf0e10cSrcweir #include "fmprop.hrc"
36cdf0e10cSrcweir 
37cdf0e10cSrcweir #include "fmundo.hxx"
38cdf0e10cSrcweir #include "fmhelp.hrc"
39cdf0e10cSrcweir #include "fmexpl.hrc"
40cdf0e10cSrcweir #include "fmexpl.hxx"
41cdf0e10cSrcweir #include "svx/fmresids.hrc"
42cdf0e10cSrcweir #include "fmshimp.hxx"
43cdf0e10cSrcweir #include "fmobj.hxx"
44cdf0e10cSrcweir #include <sfx2/objsh.hxx>
45cdf0e10cSrcweir #include <tools/diagnose_ex.h>
46cdf0e10cSrcweir #include <rtl/logfile.hxx>
47cdf0e10cSrcweir #include <com/sun/star/container/XContainer.hpp>
48cdf0e10cSrcweir 
49cdf0e10cSrcweir //............................................................................
50cdf0e10cSrcweir namespace svxform
51cdf0e10cSrcweir {
52cdf0e10cSrcweir //............................................................................
53cdf0e10cSrcweir 
54cdf0e10cSrcweir     using namespace ::com::sun::star::uno;
55cdf0e10cSrcweir     using namespace ::com::sun::star::lang;
56cdf0e10cSrcweir     using namespace ::com::sun::star::beans;
57cdf0e10cSrcweir     using namespace ::com::sun::star::form;
58cdf0e10cSrcweir     using namespace ::com::sun::star::awt;
59cdf0e10cSrcweir     using namespace ::com::sun::star::container;
60cdf0e10cSrcweir     using namespace ::com::sun::star::script;
61cdf0e10cSrcweir     using namespace ::com::sun::star::sdb;
62cdf0e10cSrcweir 
63cdf0e10cSrcweir     //========================================================================
64cdf0e10cSrcweir     // class OFormComponentObserver
65cdf0e10cSrcweir     //========================================================================
66cdf0e10cSrcweir     //------------------------------------------------------------------------
OFormComponentObserver(NavigatorTreeModel * _pModel)67cdf0e10cSrcweir     OFormComponentObserver::OFormComponentObserver(NavigatorTreeModel* _pModel)
68cdf0e10cSrcweir         :m_pNavModel(_pModel)
69cdf0e10cSrcweir         ,m_nLocks(0)
70cdf0e10cSrcweir         ,m_bCanUndo(sal_True)
71cdf0e10cSrcweir     {
72cdf0e10cSrcweir         RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "OFormComponentObserver::OFormComponentObserver" );
73cdf0e10cSrcweir     }
74cdf0e10cSrcweir 
75cdf0e10cSrcweir     // XPropertyChangeListener
76cdf0e10cSrcweir     //------------------------------------------------------------------------
disposing(const EventObject & Source)77cdf0e10cSrcweir     void SAL_CALL OFormComponentObserver::disposing(const EventObject& Source) throw( RuntimeException )
78cdf0e10cSrcweir     {
79cdf0e10cSrcweir         RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "OFormComponentObserver::disposing" );
80cdf0e10cSrcweir         Remove( Source.Source );
81cdf0e10cSrcweir     }
82cdf0e10cSrcweir 
83cdf0e10cSrcweir     //------------------------------------------------------------------------
propertyChange(const PropertyChangeEvent & evt)84cdf0e10cSrcweir     void SAL_CALL OFormComponentObserver::propertyChange(const PropertyChangeEvent& evt) throw(RuntimeException)
85cdf0e10cSrcweir     {
86cdf0e10cSrcweir         RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "OFormComponentObserver::propertyChange" );
87cdf0e10cSrcweir         if( !m_pNavModel ) return;
88cdf0e10cSrcweir         if( evt.PropertyName != FM_PROP_NAME ) return;
89cdf0e10cSrcweir 
90cdf0e10cSrcweir         Reference< XFormComponent >  xFormComponent(evt.Source, UNO_QUERY);
91cdf0e10cSrcweir         Reference< XForm >  xForm(evt.Source, UNO_QUERY);
92cdf0e10cSrcweir 
93cdf0e10cSrcweir         FmEntryData* pEntryData( NULL );
94cdf0e10cSrcweir         if( xForm.is() )
95cdf0e10cSrcweir             pEntryData = m_pNavModel->FindData( xForm, m_pNavModel->GetRootList() );
96cdf0e10cSrcweir         else if( xFormComponent.is() )
97cdf0e10cSrcweir             pEntryData = m_pNavModel->FindData( xFormComponent, m_pNavModel->GetRootList() );
98cdf0e10cSrcweir 
99cdf0e10cSrcweir         if( pEntryData )
100cdf0e10cSrcweir         {
101cdf0e10cSrcweir             ::rtl::OUString aNewName =  ::comphelper::getString(evt.NewValue);
102cdf0e10cSrcweir             pEntryData->SetText( aNewName );
103cdf0e10cSrcweir             FmNavNameChangedHint aNameChangedHint( pEntryData, aNewName );
104cdf0e10cSrcweir             m_pNavModel->Broadcast( aNameChangedHint );
105cdf0e10cSrcweir         }
106cdf0e10cSrcweir     }
107cdf0e10cSrcweir 
108cdf0e10cSrcweir     // XContainerListener
109cdf0e10cSrcweir     //------------------------------------------------------------------------------
elementInserted(const ContainerEvent & evt)110cdf0e10cSrcweir     void SAL_CALL OFormComponentObserver::elementInserted(const ContainerEvent& evt) throw(RuntimeException)
111cdf0e10cSrcweir     {
112cdf0e10cSrcweir         RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "OFormComponentObserver::elementInserted" );
113cdf0e10cSrcweir         if (IsLocked() || !m_pNavModel)
114cdf0e10cSrcweir             return;
115cdf0e10cSrcweir 
116cdf0e10cSrcweir         // keine Undoaction einfuegen
117cdf0e10cSrcweir         m_bCanUndo = sal_False;
118cdf0e10cSrcweir 
119cdf0e10cSrcweir         Reference< XInterface > xTemp;
120cdf0e10cSrcweir         evt.Element >>= xTemp;
121cdf0e10cSrcweir         Insert(xTemp, ::comphelper::getINT32(evt.Accessor));
122cdf0e10cSrcweir 
123cdf0e10cSrcweir         m_bCanUndo = sal_True;
124cdf0e10cSrcweir     }
125cdf0e10cSrcweir 
126cdf0e10cSrcweir     //------------------------------------------------------------------------------
Insert(const Reference<XInterface> & xIface,sal_Int32 nIndex)127cdf0e10cSrcweir     void OFormComponentObserver::Insert(const Reference< XInterface > & xIface, sal_Int32 nIndex)
128cdf0e10cSrcweir     {
129cdf0e10cSrcweir         RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "OFormComponentObserver::Insert" );
130cdf0e10cSrcweir         Reference< XForm >  xForm(xIface, UNO_QUERY);
131cdf0e10cSrcweir         if (xForm.is())
132cdf0e10cSrcweir         {
133cdf0e10cSrcweir             m_pNavModel->InsertForm(xForm, sal_uInt32(nIndex));
134cdf0e10cSrcweir             Reference< XIndexContainer >  xContainer(xForm, UNO_QUERY);
135cdf0e10cSrcweir             Reference< XInterface > xTemp;
136cdf0e10cSrcweir             for (sal_Int32 i = 0; i < xContainer->getCount(); i++)
137cdf0e10cSrcweir             {
138cdf0e10cSrcweir                 xContainer->getByIndex(i) >>= xTemp;
139cdf0e10cSrcweir                 Insert(xTemp, i);
140cdf0e10cSrcweir             }
141cdf0e10cSrcweir         }
142cdf0e10cSrcweir         else
143cdf0e10cSrcweir         {
144cdf0e10cSrcweir             Reference< XFormComponent >  xFormComp(xIface, UNO_QUERY);
145cdf0e10cSrcweir             if (xFormComp.is())
146cdf0e10cSrcweir                 m_pNavModel->InsertFormComponent(xFormComp, sal_uInt32(nIndex));
147cdf0e10cSrcweir         }
148cdf0e10cSrcweir     }
149cdf0e10cSrcweir 
150cdf0e10cSrcweir     //------------------------------------------------------------------------------
elementReplaced(const ContainerEvent & evt)151cdf0e10cSrcweir     void SAL_CALL OFormComponentObserver::elementReplaced(const ContainerEvent& evt) throw(RuntimeException)
152cdf0e10cSrcweir     {
153cdf0e10cSrcweir         RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "OFormComponentObserver::elementReplaced" );
154cdf0e10cSrcweir         if (IsLocked() || !m_pNavModel)
155cdf0e10cSrcweir             return;
156cdf0e10cSrcweir 
157cdf0e10cSrcweir         m_bCanUndo = sal_False;
158cdf0e10cSrcweir 
159cdf0e10cSrcweir         // EntryData loeschen
160cdf0e10cSrcweir         Reference< XFormComponent >  xReplaced;
161cdf0e10cSrcweir         evt.ReplacedElement >>= xReplaced;
162cdf0e10cSrcweir         FmEntryData* pEntryData = m_pNavModel->FindData(xReplaced, m_pNavModel->GetRootList(), sal_True);
163cdf0e10cSrcweir         if (pEntryData)
164cdf0e10cSrcweir         {
165cdf0e10cSrcweir             if (pEntryData->ISA(FmControlData))
166cdf0e10cSrcweir             {
167cdf0e10cSrcweir                 Reference< XFormComponent >  xComp;
168cdf0e10cSrcweir                 evt.Element >>= xComp;
169cdf0e10cSrcweir                 DBG_ASSERT(xComp.is(), "OFormComponentObserver::elementReplaced : invalid argument !");
170cdf0e10cSrcweir                     // an einer FmControlData sollte eine XFormComponent haengen
171cdf0e10cSrcweir                 m_pNavModel->ReplaceFormComponent(xReplaced, xComp);
172cdf0e10cSrcweir             }
173cdf0e10cSrcweir             else if (pEntryData->ISA(FmFormData))
174cdf0e10cSrcweir             {
175cdf0e10cSrcweir                 DBG_ERROR("replacing forms not implemented yet !");
176cdf0e10cSrcweir             }
177cdf0e10cSrcweir         }
178cdf0e10cSrcweir 
179cdf0e10cSrcweir         m_bCanUndo = sal_True;
180cdf0e10cSrcweir     }
181cdf0e10cSrcweir 
182cdf0e10cSrcweir     //------------------------------------------------------------------------------
Remove(const::com::sun::star::uno::Reference<::com::sun::star::uno::XInterface> & _rxElement)183cdf0e10cSrcweir     void OFormComponentObserver::Remove( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxElement )
184cdf0e10cSrcweir     {
185cdf0e10cSrcweir         RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "OFormComponentObserver::Remove" );
186cdf0e10cSrcweir         if (IsLocked() || !m_pNavModel)
187cdf0e10cSrcweir             return;
188cdf0e10cSrcweir 
189cdf0e10cSrcweir         m_bCanUndo = sal_False;
190cdf0e10cSrcweir 
191cdf0e10cSrcweir         //////////////////////////////////////////////////////////
192cdf0e10cSrcweir         // EntryData loeschen
193cdf0e10cSrcweir         FmEntryData* pEntryData = m_pNavModel->FindData( _rxElement, m_pNavModel->GetRootList(), sal_True );
194cdf0e10cSrcweir         if (pEntryData)
195cdf0e10cSrcweir             m_pNavModel->Remove(pEntryData);
196cdf0e10cSrcweir 
197cdf0e10cSrcweir         m_bCanUndo = sal_True;
198cdf0e10cSrcweir     }
199cdf0e10cSrcweir 
200cdf0e10cSrcweir     //------------------------------------------------------------------------------
elementRemoved(const ContainerEvent & evt)201cdf0e10cSrcweir     void SAL_CALL OFormComponentObserver::elementRemoved(const ContainerEvent& evt) throw(RuntimeException)
202cdf0e10cSrcweir     {
203cdf0e10cSrcweir         RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "OFormComponentObserver::elementRemoved" );
204cdf0e10cSrcweir         Reference< XInterface > xElement;
205cdf0e10cSrcweir         evt.Element >>= xElement;
206cdf0e10cSrcweir         Remove( xElement );
207cdf0e10cSrcweir     }
208cdf0e10cSrcweir 
209cdf0e10cSrcweir     //========================================================================
210cdf0e10cSrcweir     // class NavigatorTreeModel
211cdf0e10cSrcweir     //========================================================================
212cdf0e10cSrcweir 
213cdf0e10cSrcweir     //------------------------------------------------------------------------
NavigatorTreeModel(const ImageList & _rNormalImages,const ImageList & _rHCImages)214cdf0e10cSrcweir     NavigatorTreeModel::NavigatorTreeModel( const ImageList& _rNormalImages, const ImageList& _rHCImages )
215cdf0e10cSrcweir                     :m_pFormShell(NULL)
216cdf0e10cSrcweir                     ,m_pFormPage(NULL)
217cdf0e10cSrcweir                     ,m_pFormModel(NULL)
218cdf0e10cSrcweir                     ,m_aNormalImages( _rNormalImages )
219cdf0e10cSrcweir                     ,m_aHCImages( _rHCImages )
220cdf0e10cSrcweir     {
221cdf0e10cSrcweir         RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTreeModel::NavigatorTreeModel" );
222cdf0e10cSrcweir         m_pPropChangeList = new OFormComponentObserver(this);
223cdf0e10cSrcweir         m_pPropChangeList->acquire();
224cdf0e10cSrcweir         m_pRootList = new FmEntryDataList();
225cdf0e10cSrcweir     }
226cdf0e10cSrcweir 
227cdf0e10cSrcweir     //------------------------------------------------------------------------
~NavigatorTreeModel()228cdf0e10cSrcweir     NavigatorTreeModel::~NavigatorTreeModel()
229cdf0e10cSrcweir     {
230cdf0e10cSrcweir         //////////////////////////////////////////////////////////////////////
231cdf0e10cSrcweir         // Als Listener abmelden
232cdf0e10cSrcweir         if( m_pFormShell)
233cdf0e10cSrcweir         {
234cdf0e10cSrcweir             FmFormModel* pFormModel = m_pFormShell->GetFormModel();
235cdf0e10cSrcweir             if( pFormModel && IsListening(*pFormModel))
236cdf0e10cSrcweir                 EndListening( *pFormModel );
237cdf0e10cSrcweir 
238cdf0e10cSrcweir             if (IsListening(*m_pFormShell))
239cdf0e10cSrcweir                 EndListening(*m_pFormShell);
240cdf0e10cSrcweir         }
241cdf0e10cSrcweir 
242cdf0e10cSrcweir         Clear();
243cdf0e10cSrcweir         delete m_pRootList;
244cdf0e10cSrcweir         m_pPropChangeList->ReleaseModel();
245cdf0e10cSrcweir         m_pPropChangeList->release();
246cdf0e10cSrcweir     }
247cdf0e10cSrcweir 
248cdf0e10cSrcweir 
249cdf0e10cSrcweir     //------------------------------------------------------------------------
SetModified(sal_Bool bMod)250cdf0e10cSrcweir     void NavigatorTreeModel::SetModified( sal_Bool bMod )
251cdf0e10cSrcweir     {
252cdf0e10cSrcweir         RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTreeModel::SetModified" );
253cdf0e10cSrcweir         if( !m_pFormShell ) return;
254cdf0e10cSrcweir         SfxObjectShell* pObjShell = m_pFormShell->GetFormModel()->GetObjectShell();
255cdf0e10cSrcweir         if( !pObjShell ) return;
256cdf0e10cSrcweir         pObjShell->SetModified( bMod );
257cdf0e10cSrcweir     }
258cdf0e10cSrcweir 
259cdf0e10cSrcweir     //------------------------------------------------------------------------
Clear()260cdf0e10cSrcweir     void NavigatorTreeModel::Clear()
261cdf0e10cSrcweir     {
262cdf0e10cSrcweir         RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTreeModel::Clear" );
263cdf0e10cSrcweir         Reference< XNameContainer >  xForms( GetForms());
264cdf0e10cSrcweir         Reference< XContainer >  xContainer(xForms, UNO_QUERY);
265cdf0e10cSrcweir         if (xContainer.is())
266cdf0e10cSrcweir             xContainer->removeContainerListener((XContainerListener*)m_pPropChangeList);
267cdf0e10cSrcweir 
268cdf0e10cSrcweir         //////////////////////////////////////////////////////////////////////
269cdf0e10cSrcweir         // RootList loeschen
270cdf0e10cSrcweir         FmEntryData* pChildData;
271cdf0e10cSrcweir         FmEntryDataList* pRootList = GetRootList();
272cdf0e10cSrcweir 
273cdf0e10cSrcweir         for( sal_uInt32 i=pRootList->Count(); i>0; i-- )
274cdf0e10cSrcweir         {
275cdf0e10cSrcweir             pChildData = pRootList->GetObject(i-1);
276cdf0e10cSrcweir             pRootList->Remove( pChildData );
277cdf0e10cSrcweir             delete pChildData;
278cdf0e10cSrcweir         }
279cdf0e10cSrcweir 
280cdf0e10cSrcweir         //////////////////////////////////////////////////////////////////////
281cdf0e10cSrcweir         // UI benachrichtigen
282cdf0e10cSrcweir         FmNavClearedHint aClearedHint;
283cdf0e10cSrcweir         Broadcast( aClearedHint );
284cdf0e10cSrcweir     }
285cdf0e10cSrcweir 
286cdf0e10cSrcweir     //------------------------------------------------------------------------
GetForms() const287cdf0e10cSrcweir     Reference< XNameContainer >  NavigatorTreeModel::GetForms() const
288cdf0e10cSrcweir     {
289cdf0e10cSrcweir         RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTreeModel::GetForms" );
290cdf0e10cSrcweir         if( !m_pFormShell || !m_pFormShell->GetCurPage())
291cdf0e10cSrcweir             return NULL;
292cdf0e10cSrcweir         else
293cdf0e10cSrcweir             return m_pFormShell->GetCurPage()->GetForms();
294cdf0e10cSrcweir     }
295cdf0e10cSrcweir 
296cdf0e10cSrcweir     //------------------------------------------------------------------------
Insert(FmEntryData * pEntry,sal_uLong nRelPos,sal_Bool bAlterModel)297cdf0e10cSrcweir     void NavigatorTreeModel::Insert(FmEntryData* pEntry, sal_uLong nRelPos, sal_Bool bAlterModel)
298cdf0e10cSrcweir     {
299cdf0e10cSrcweir         RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTreeModel::Insert" );
300cdf0e10cSrcweir         if (IsListening(*m_pFormModel))
301cdf0e10cSrcweir             EndListening(*m_pFormModel);
302cdf0e10cSrcweir 
303cdf0e10cSrcweir         m_pPropChangeList->Lock();
304cdf0e10cSrcweir         FmFormData* pFolder     = (FmFormData*) pEntry->GetParent();
305cdf0e10cSrcweir         Reference< XChild > xElement( pEntry->GetChildIFace() );
306cdf0e10cSrcweir         if (bAlterModel)
307cdf0e10cSrcweir         {
308cdf0e10cSrcweir             XubString aStr;
309cdf0e10cSrcweir             if (pEntry->ISA(FmFormData))
310cdf0e10cSrcweir                 aStr = SVX_RES(RID_STR_FORM);
311cdf0e10cSrcweir             else
312cdf0e10cSrcweir                 aStr = SVX_RES(RID_STR_CONTROL);
313cdf0e10cSrcweir 
314cdf0e10cSrcweir             Reference< XIndexContainer >  xContainer;
315cdf0e10cSrcweir             if (pFolder)
316cdf0e10cSrcweir                 xContainer = Reference< XIndexContainer > (pFolder->GetFormIface(), UNO_QUERY);
317cdf0e10cSrcweir             else
318cdf0e10cSrcweir                 xContainer = Reference< XIndexContainer > (GetForms(), UNO_QUERY);
319cdf0e10cSrcweir 
320cdf0e10cSrcweir             bool bUndo = m_pFormModel->IsUndoEnabled();
321cdf0e10cSrcweir 
322cdf0e10cSrcweir             if( bUndo )
323cdf0e10cSrcweir             {
324cdf0e10cSrcweir                 XubString aUndoStr(SVX_RES(RID_STR_UNDO_CONTAINER_INSERT));
325cdf0e10cSrcweir                 aUndoStr.SearchAndReplace('#', aStr);
326cdf0e10cSrcweir                 m_pFormModel->BegUndo(aUndoStr);
327cdf0e10cSrcweir             }
328cdf0e10cSrcweir 
329cdf0e10cSrcweir             if (nRelPos >= (sal_uInt32)xContainer->getCount())
330cdf0e10cSrcweir                 nRelPos = (sal_uInt32)xContainer->getCount();
331cdf0e10cSrcweir 
332cdf0e10cSrcweir             // UndoAction
333cdf0e10cSrcweir             if ( bUndo && m_pPropChangeList->CanUndo())
334cdf0e10cSrcweir             {
335cdf0e10cSrcweir                 m_pFormModel->AddUndo(new FmUndoContainerAction(*m_pFormModel,
336cdf0e10cSrcweir                                                          FmUndoContainerAction::Inserted,
337cdf0e10cSrcweir                                                          xContainer,
338cdf0e10cSrcweir                                                          xElement,
339cdf0e10cSrcweir                                                          nRelPos));
340cdf0e10cSrcweir             }
341cdf0e10cSrcweir 
342cdf0e10cSrcweir             // das Element muss den Typ haben, den der Container erwartet
343cdf0e10cSrcweir             if (xContainer->getElementType() ==
344cdf0e10cSrcweir                 ::getCppuType((const Reference< XForm>*)0))
345cdf0e10cSrcweir 
346cdf0e10cSrcweir             {
347cdf0e10cSrcweir                 Reference< XForm >  xElementAsForm(xElement, UNO_QUERY);
348cdf0e10cSrcweir                 xContainer->insertByIndex(nRelPos, makeAny(xElementAsForm));
349cdf0e10cSrcweir             }
350cdf0e10cSrcweir             else if (xContainer->getElementType() ==
351cdf0e10cSrcweir                 ::getCppuType((const Reference< XFormComponent>*)0))
352cdf0e10cSrcweir 
353cdf0e10cSrcweir             {
354cdf0e10cSrcweir                 Reference< XFormComponent >  xElementAsComponent(xElement, UNO_QUERY);
355cdf0e10cSrcweir                 xContainer->insertByIndex(nRelPos, makeAny(xElementAsComponent));
356cdf0e10cSrcweir             }
357cdf0e10cSrcweir             else
358cdf0e10cSrcweir             {
359cdf0e10cSrcweir                 DBG_ERROR("NavigatorTreeModel::Insert : the parent container needs an elementtype I don't know !");
360cdf0e10cSrcweir             }
361cdf0e10cSrcweir 
362cdf0e10cSrcweir             if( bUndo )
363cdf0e10cSrcweir                 m_pFormModel->EndUndo();
364cdf0e10cSrcweir         }
365cdf0e10cSrcweir 
366cdf0e10cSrcweir         //////////////////////////////////////////////////////////////////////
367cdf0e10cSrcweir         // Als PropertyChangeListener anmelden
368cdf0e10cSrcweir         Reference< XPropertySet >  xSet(xElement, UNO_QUERY);
369cdf0e10cSrcweir         if( xSet.is() )
370cdf0e10cSrcweir             xSet->addPropertyChangeListener( FM_PROP_NAME, m_pPropChangeList );
371cdf0e10cSrcweir 
372cdf0e10cSrcweir         //////////////////////////////////////////////////////////////////////
373cdf0e10cSrcweir         // Daten aus Model entfernen
374cdf0e10cSrcweir         if (pEntry->ISA(FmFormData))
375cdf0e10cSrcweir         {
376cdf0e10cSrcweir             Reference< XContainer >  xContainer(xElement, UNO_QUERY);
377cdf0e10cSrcweir             if (xContainer.is())
378cdf0e10cSrcweir                 xContainer->addContainerListener((XContainerListener*)m_pPropChangeList);
379cdf0e10cSrcweir         }
380cdf0e10cSrcweir 
381cdf0e10cSrcweir         if (pFolder)
382cdf0e10cSrcweir             pFolder->GetChildList()->Insert( pEntry, nRelPos );
383cdf0e10cSrcweir         else
384cdf0e10cSrcweir             GetRootList()->Insert( pEntry, nRelPos );
385cdf0e10cSrcweir 
386cdf0e10cSrcweir         //////////////////////////////////////////////////////////////////////
387cdf0e10cSrcweir         // UI benachrichtigen
388cdf0e10cSrcweir         FmNavInsertedHint aInsertedHint( pEntry, nRelPos );
389cdf0e10cSrcweir         Broadcast( aInsertedHint );
390cdf0e10cSrcweir 
391cdf0e10cSrcweir         m_pPropChangeList->UnLock();
392cdf0e10cSrcweir         if (IsListening(*m_pFormModel))
393cdf0e10cSrcweir             StartListening(*m_pFormModel);
394cdf0e10cSrcweir     }
395cdf0e10cSrcweir 
396cdf0e10cSrcweir     //------------------------------------------------------------------------
Remove(FmEntryData * pEntry,sal_Bool bAlterModel)397cdf0e10cSrcweir     void NavigatorTreeModel::Remove(FmEntryData* pEntry, sal_Bool bAlterModel)
398cdf0e10cSrcweir     {
399cdf0e10cSrcweir         RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTreeModel::Remove" );
400cdf0e10cSrcweir         //////////////////////////////////////////////////////////////////////
401cdf0e10cSrcweir         // Form und Parent holen
402cdf0e10cSrcweir         if (!pEntry || !m_pFormModel)
403cdf0e10cSrcweir             return;
404cdf0e10cSrcweir 
405cdf0e10cSrcweir         if (IsListening(*m_pFormModel))
406cdf0e10cSrcweir             EndListening(*m_pFormModel);
407cdf0e10cSrcweir 
408cdf0e10cSrcweir         const bool bUndo = m_pFormModel->IsUndoEnabled();
409cdf0e10cSrcweir 
410cdf0e10cSrcweir         m_pPropChangeList->Lock();
411cdf0e10cSrcweir         FmFormData*     pFolder     = (FmFormData*) pEntry->GetParent();
412cdf0e10cSrcweir         Reference< XChild > xElement ( pEntry->GetChildIFace() );
413cdf0e10cSrcweir         if (bAlterModel)
414cdf0e10cSrcweir         {
415cdf0e10cSrcweir             XubString        aStr;
416cdf0e10cSrcweir             if (pEntry->ISA(FmFormData))
417cdf0e10cSrcweir                 aStr = SVX_RES(RID_STR_FORM);
418cdf0e10cSrcweir             else
419cdf0e10cSrcweir                 aStr = SVX_RES(RID_STR_CONTROL);
420cdf0e10cSrcweir 
421cdf0e10cSrcweir             if( bUndo )
422cdf0e10cSrcweir             {
423cdf0e10cSrcweir                 XubString aUndoStr(SVX_RES(RID_STR_UNDO_CONTAINER_REMOVE));
424cdf0e10cSrcweir                 aUndoStr.SearchAndReplace('#', aStr);
425cdf0e10cSrcweir                 m_pFormModel->BegUndo(aUndoStr);
426cdf0e10cSrcweir             }
427cdf0e10cSrcweir         }
428cdf0e10cSrcweir 
429cdf0e10cSrcweir         // jetzt die eigentliche Entfernung der Daten aus dem Model
430cdf0e10cSrcweir         if (pEntry->ISA(FmFormData))
431cdf0e10cSrcweir             RemoveForm((FmFormData*)pEntry);
432cdf0e10cSrcweir         else
433cdf0e10cSrcweir             RemoveFormComponent((FmControlData*)pEntry);
434cdf0e10cSrcweir 
435cdf0e10cSrcweir 
436cdf0e10cSrcweir         if (bAlterModel)
437cdf0e10cSrcweir         {
438cdf0e10cSrcweir             Reference< XIndexContainer >  xContainer(xElement->getParent(), UNO_QUERY);
439cdf0e10cSrcweir             // aus dem Container entfernen
440cdf0e10cSrcweir             sal_Int32 nContainerIndex = getElementPos(xContainer.get(), xElement);
441cdf0e10cSrcweir             // UndoAction
442cdf0e10cSrcweir             if (nContainerIndex >= 0)
443cdf0e10cSrcweir             {
444cdf0e10cSrcweir                 if ( bUndo && m_pPropChangeList->CanUndo())
445cdf0e10cSrcweir                 {
446cdf0e10cSrcweir                     m_pFormModel->AddUndo(new FmUndoContainerAction(*m_pFormModel,
447cdf0e10cSrcweir                                                           FmUndoContainerAction::Removed,
448cdf0e10cSrcweir                                                           xContainer,
449cdf0e10cSrcweir                                                           xElement, nContainerIndex ));
450cdf0e10cSrcweir                 }
451cdf0e10cSrcweir                 else if( !m_pPropChangeList->CanUndo() )
452cdf0e10cSrcweir                 {
453cdf0e10cSrcweir                     FmUndoContainerAction::DisposeElement( xElement );
454cdf0e10cSrcweir                 }
455cdf0e10cSrcweir 
456cdf0e10cSrcweir                 xContainer->removeByIndex(nContainerIndex );
457cdf0e10cSrcweir             }
458cdf0e10cSrcweir 
459cdf0e10cSrcweir             if( bUndo )
460cdf0e10cSrcweir                 m_pFormModel->EndUndo();
461cdf0e10cSrcweir         }
462cdf0e10cSrcweir 
463cdf0e10cSrcweir         // beim Vater austragen
464cdf0e10cSrcweir         if (pFolder)
465cdf0e10cSrcweir             pFolder->GetChildList()->Remove(pEntry);
466cdf0e10cSrcweir         else
467cdf0e10cSrcweir         {
468cdf0e10cSrcweir             GetRootList()->Remove(pEntry);
469cdf0e10cSrcweir             //////////////////////////////////////////////////////////////////////
470cdf0e10cSrcweir             // Wenn keine Form mehr in der Root, an der Shell CurForm zuruecksetzen
471cdf0e10cSrcweir             if (!GetRootList()->Count())
472cdf0e10cSrcweir                 m_pFormShell->GetImpl()->forgetCurrentForm();
473cdf0e10cSrcweir         }
474cdf0e10cSrcweir 
475cdf0e10cSrcweir         //////////////////////////////////////////////////////////////////////
476cdf0e10cSrcweir         // UI benachrichtigen
477cdf0e10cSrcweir         FmNavRemovedHint aRemovedHint( pEntry );
478cdf0e10cSrcweir         Broadcast( aRemovedHint );
479cdf0e10cSrcweir 
480cdf0e10cSrcweir         // Eintrag loeschen
481cdf0e10cSrcweir         delete pEntry;
482cdf0e10cSrcweir 
483cdf0e10cSrcweir         m_pPropChangeList->UnLock();
484cdf0e10cSrcweir         StartListening(*m_pFormModel);
485cdf0e10cSrcweir     }
486cdf0e10cSrcweir 
487cdf0e10cSrcweir     //------------------------------------------------------------------------
RemoveForm(FmFormData * pFormData)488cdf0e10cSrcweir     void NavigatorTreeModel::RemoveForm(FmFormData* pFormData)
489cdf0e10cSrcweir     {
490cdf0e10cSrcweir         RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTreeModel::RemoveForm" );
491cdf0e10cSrcweir         //////////////////////////////////////////////////////////////////////
492cdf0e10cSrcweir         // Form und Parent holen
493cdf0e10cSrcweir         if (!pFormData || !m_pFormModel)
494cdf0e10cSrcweir             return;
495cdf0e10cSrcweir 
496cdf0e10cSrcweir         FmEntryDataList*    pChildList = pFormData->GetChildList();
497cdf0e10cSrcweir         sal_uInt32 nCount = pChildList->Count();
498cdf0e10cSrcweir         for (sal_uInt32 i = nCount; i > 0; i--)
499cdf0e10cSrcweir         {
500cdf0e10cSrcweir             FmEntryData* pEntryData = pChildList->GetObject(i - 1);
501cdf0e10cSrcweir 
502cdf0e10cSrcweir             //////////////////////////////////////////////////////////////////////
503cdf0e10cSrcweir             // Child ist Form -> rekursiver Aufruf
504cdf0e10cSrcweir             if( pEntryData->ISA(FmFormData) )
505cdf0e10cSrcweir                 RemoveForm( (FmFormData*)pEntryData);
506cdf0e10cSrcweir             else if( pEntryData->ISA(FmControlData) )
507cdf0e10cSrcweir                 RemoveFormComponent((FmControlData*) pEntryData);
508cdf0e10cSrcweir         }
509cdf0e10cSrcweir 
510cdf0e10cSrcweir         //////////////////////////////////////////////////////////////////////
511cdf0e10cSrcweir         // Als PropertyChangeListener abmelden
512cdf0e10cSrcweir         Reference< XPropertySet > xSet( pFormData->GetPropertySet() );
513cdf0e10cSrcweir         if ( xSet.is() )
514cdf0e10cSrcweir             xSet->removePropertyChangeListener( FM_PROP_NAME, m_pPropChangeList );
515cdf0e10cSrcweir 
516cdf0e10cSrcweir         Reference< XContainer >  xContainer( pFormData->GetContainer() );
517cdf0e10cSrcweir         if (xContainer.is())
518cdf0e10cSrcweir             xContainer->removeContainerListener((XContainerListener*)m_pPropChangeList);
519cdf0e10cSrcweir     }
520cdf0e10cSrcweir 
521cdf0e10cSrcweir     //------------------------------------------------------------------------
RemoveFormComponent(FmControlData * pControlData)522cdf0e10cSrcweir     void NavigatorTreeModel::RemoveFormComponent(FmControlData* pControlData)
523cdf0e10cSrcweir     {
524cdf0e10cSrcweir         RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTreeModel::RemoveFormComponent" );
525cdf0e10cSrcweir         //////////////////////////////////////////////////////////////////////
526cdf0e10cSrcweir         // Control und Parent holen
527cdf0e10cSrcweir         if (!pControlData)
528cdf0e10cSrcweir             return;
529cdf0e10cSrcweir 
530cdf0e10cSrcweir         //////////////////////////////////////////////////////////////////////
531cdf0e10cSrcweir         // Als PropertyChangeListener abmelden
532cdf0e10cSrcweir         Reference< XPropertySet >  xSet( pControlData->GetPropertySet() );
533cdf0e10cSrcweir         if (xSet.is())
534cdf0e10cSrcweir             xSet->removePropertyChangeListener( FM_PROP_NAME, m_pPropChangeList);
535cdf0e10cSrcweir     }
536cdf0e10cSrcweir 
537cdf0e10cSrcweir     //------------------------------------------------------------------------
ClearBranch(FmFormData * pParentData)538cdf0e10cSrcweir     void NavigatorTreeModel::ClearBranch( FmFormData* pParentData )
539cdf0e10cSrcweir     {
540cdf0e10cSrcweir         RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTreeModel::ClearBranch" );
541cdf0e10cSrcweir         //////////////////////////////////////////////////////////////////////
542cdf0e10cSrcweir         // Alle Eintraege dieses Zweiges loeschen
543cdf0e10cSrcweir         FmEntryDataList* pChildList = pParentData->GetChildList();
544cdf0e10cSrcweir         FmEntryData* pChildData;
545cdf0e10cSrcweir 
546cdf0e10cSrcweir         for( sal_uInt32 i=pChildList->Count(); i>0; i-- )
547cdf0e10cSrcweir         {
548cdf0e10cSrcweir             pChildData = pChildList->GetObject(i-1);
549cdf0e10cSrcweir             if( pChildData->ISA(FmFormData) )
550cdf0e10cSrcweir                 ClearBranch( (FmFormData*)pChildData );
551cdf0e10cSrcweir 
552cdf0e10cSrcweir             pChildList->Remove( pChildData );
553cdf0e10cSrcweir         }
554cdf0e10cSrcweir     }
555cdf0e10cSrcweir 
556cdf0e10cSrcweir     //------------------------------------------------------------------------
FillBranch(FmFormData * pFormData)557cdf0e10cSrcweir     void NavigatorTreeModel::FillBranch( FmFormData* pFormData )
558cdf0e10cSrcweir     {
559cdf0e10cSrcweir         RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTreeModel::FillBranch" );
560cdf0e10cSrcweir         //////////////////////////////////////////////////////////////
561cdf0e10cSrcweir         // Forms aus der Root einfuegen
562cdf0e10cSrcweir         if( pFormData == NULL )
563cdf0e10cSrcweir         {
564cdf0e10cSrcweir             Reference< XIndexContainer >   xForms(GetForms(), UNO_QUERY);
565cdf0e10cSrcweir             if (!xForms.is())
566cdf0e10cSrcweir                 return;
567cdf0e10cSrcweir 
568cdf0e10cSrcweir             Reference< XForm >     xSubForm;
569cdf0e10cSrcweir             FmFormData* pSubFormData;
570cdf0e10cSrcweir             for (sal_Int32 i=0; i<xForms->getCount(); ++i)
571cdf0e10cSrcweir             {
572cdf0e10cSrcweir                 DBG_ASSERT( xForms->getByIndex(i).getValueType() == ::getCppuType((const Reference< XForm>*)NULL),
573cdf0e10cSrcweir                     "NavigatorTreeModel::FillBranch : the root container should supply only elements of type XForm");
574cdf0e10cSrcweir 
575cdf0e10cSrcweir                 xForms->getByIndex(i) >>= xSubForm;
576cdf0e10cSrcweir                 pSubFormData = new FmFormData( xSubForm, m_aNormalImages, m_aHCImages, pFormData );
577cdf0e10cSrcweir                 Insert( pSubFormData, LIST_APPEND );
578cdf0e10cSrcweir 
579cdf0e10cSrcweir                 //////////////////////////////////////////////////////////////
580cdf0e10cSrcweir                 // Neuer Branch, wenn SubForm wiederum Subforms enthaelt
581cdf0e10cSrcweir                 FillBranch( pSubFormData );
582cdf0e10cSrcweir             }
583cdf0e10cSrcweir         }
584cdf0e10cSrcweir 
585cdf0e10cSrcweir         //////////////////////////////////////////////////////////////
586cdf0e10cSrcweir         // Componenten einfuegen
587cdf0e10cSrcweir         else
588cdf0e10cSrcweir         {
589cdf0e10cSrcweir             Reference< XIndexContainer >  xComponents( GetFormComponents(pFormData));
590cdf0e10cSrcweir             if( !xComponents.is() ) return;
591cdf0e10cSrcweir 
592cdf0e10cSrcweir             ::rtl::OUString aControlName;
593cdf0e10cSrcweir             Reference< XInterface >  xInterface;
594cdf0e10cSrcweir             Reference< XPropertySet >  xSet;
595cdf0e10cSrcweir             FmControlData* pNewControlData;
596cdf0e10cSrcweir             FmFormData* pSubFormData;
597cdf0e10cSrcweir 
598cdf0e10cSrcweir             Reference< XFormComponent >  xCurrentComponent;
599cdf0e10cSrcweir             for (sal_Int32 j=0; j<xComponents->getCount(); ++j)
600cdf0e10cSrcweir             {
601cdf0e10cSrcweir                 xComponents->getByIndex(j) >>= xCurrentComponent;
602cdf0e10cSrcweir                 Reference< XForm >  xSubForm(xCurrentComponent, UNO_QUERY);
603cdf0e10cSrcweir 
604cdf0e10cSrcweir                 if (xSubForm.is())
605cdf0e10cSrcweir                 {   // die aktuelle Component ist eine Form
606cdf0e10cSrcweir                     pSubFormData = new FmFormData(xSubForm, m_aNormalImages, m_aHCImages, pFormData);
607cdf0e10cSrcweir                     Insert(pSubFormData, LIST_APPEND);
608cdf0e10cSrcweir 
609cdf0e10cSrcweir                     //////////////////////////////////////////////////////////////
610cdf0e10cSrcweir                     // Neuer Branch, wenn SubForm wiederum Subforms enthaelt
611cdf0e10cSrcweir                     FillBranch(pSubFormData);
612cdf0e10cSrcweir                 }
613cdf0e10cSrcweir                 else
614cdf0e10cSrcweir                 {
615cdf0e10cSrcweir                     pNewControlData = new FmControlData(xCurrentComponent, m_aNormalImages, m_aHCImages, pFormData);
616cdf0e10cSrcweir                     Insert(pNewControlData, LIST_APPEND);
617cdf0e10cSrcweir                 }
618cdf0e10cSrcweir             }
619cdf0e10cSrcweir         }
620cdf0e10cSrcweir     }
621cdf0e10cSrcweir 
622cdf0e10cSrcweir     //------------------------------------------------------------------------
InsertForm(const Reference<XForm> & xForm,sal_uInt32 nRelPos)623cdf0e10cSrcweir     void NavigatorTreeModel::InsertForm(const Reference< XForm > & xForm, sal_uInt32 nRelPos)
624cdf0e10cSrcweir     {
625cdf0e10cSrcweir         RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTreeModel::InsertForm" );
626cdf0e10cSrcweir         FmFormData* pFormData = (FmFormData*)FindData( xForm, GetRootList() );
627cdf0e10cSrcweir         if (pFormData)
628cdf0e10cSrcweir             return;
629cdf0e10cSrcweir 
630cdf0e10cSrcweir         //////////////////////////////////////////////////////////
631cdf0e10cSrcweir         // ParentData setzen
632cdf0e10cSrcweir         Reference< XInterface >  xIFace( xForm->getParent());
633cdf0e10cSrcweir         Reference< XForm >  xParentForm(xIFace, UNO_QUERY);
634cdf0e10cSrcweir         FmFormData* pParentData = NULL;
635cdf0e10cSrcweir         if (xParentForm.is())
636cdf0e10cSrcweir             pParentData = (FmFormData*)FindData( xParentForm, GetRootList() );
637cdf0e10cSrcweir 
638cdf0e10cSrcweir         pFormData = new FmFormData( xForm, m_aNormalImages, m_aHCImages, pParentData );
639cdf0e10cSrcweir         Insert( pFormData, nRelPos );
640cdf0e10cSrcweir     }
641cdf0e10cSrcweir 
642cdf0e10cSrcweir     //------------------------------------------------------------------------
InsertFormComponent(const Reference<XFormComponent> & xComp,sal_uInt32 nRelPos)643cdf0e10cSrcweir     void NavigatorTreeModel::InsertFormComponent(const Reference< XFormComponent > & xComp, sal_uInt32 nRelPos)
644cdf0e10cSrcweir     {
645cdf0e10cSrcweir         RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTreeModel::InsertFormComponent" );
646cdf0e10cSrcweir         //////////////////////////////////////////////////////////
647cdf0e10cSrcweir         // ParentData setzen
648cdf0e10cSrcweir         Reference< XInterface >  xIFace( xComp->getParent());
649cdf0e10cSrcweir         Reference< XForm >  xForm(xIFace, UNO_QUERY);
650cdf0e10cSrcweir         if (!xForm.is())
651cdf0e10cSrcweir             return;
652cdf0e10cSrcweir 
653cdf0e10cSrcweir         FmFormData* pParentData = (FmFormData*)FindData( xForm, GetRootList() );
654cdf0e10cSrcweir         if( !pParentData )
655cdf0e10cSrcweir         {
656cdf0e10cSrcweir             pParentData = new FmFormData( xForm, m_aNormalImages, m_aHCImages, NULL );
657cdf0e10cSrcweir             Insert( pParentData, LIST_APPEND );
658cdf0e10cSrcweir         }
659cdf0e10cSrcweir 
660cdf0e10cSrcweir         if (!FindData(xComp, pParentData->GetChildList(),sal_False))
661cdf0e10cSrcweir         {
662cdf0e10cSrcweir             //////////////////////////////////////////////////////////
663cdf0e10cSrcweir             // Neue EntryData setzen
664cdf0e10cSrcweir             FmEntryData* pNewEntryData = new FmControlData( xComp, m_aNormalImages, m_aHCImages, pParentData );
665cdf0e10cSrcweir 
666cdf0e10cSrcweir             //////////////////////////////////////////////////////////
667cdf0e10cSrcweir             // Neue EntryData einfuegen
668cdf0e10cSrcweir             Insert( pNewEntryData, nRelPos );
669cdf0e10cSrcweir         }
670cdf0e10cSrcweir     }
671cdf0e10cSrcweir 
672cdf0e10cSrcweir     //------------------------------------------------------------------------
ReplaceFormComponent(const Reference<XFormComponent> & xOld,const Reference<XFormComponent> & xNew)673cdf0e10cSrcweir     void NavigatorTreeModel::ReplaceFormComponent(const Reference< XFormComponent > & xOld, const Reference< XFormComponent > & xNew)
674cdf0e10cSrcweir     {
675cdf0e10cSrcweir         RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTreeModel::ReplaceFormComponent" );
676cdf0e10cSrcweir         FmEntryData* pData = FindData(xOld, GetRootList(), sal_True);
677cdf0e10cSrcweir         DBG_ASSERT(pData && pData->ISA(FmControlData), "NavigatorTreeModel::ReplaceFormComponent : invalid argument !");
678cdf0e10cSrcweir         ((FmControlData*)pData)->ModelReplaced( xNew, m_aNormalImages, m_aHCImages );
679cdf0e10cSrcweir 
680cdf0e10cSrcweir         FmNavModelReplacedHint aReplacedHint( pData );
681cdf0e10cSrcweir         Broadcast( aReplacedHint );
682cdf0e10cSrcweir     }
683cdf0e10cSrcweir 
684cdf0e10cSrcweir     //------------------------------------------------------------------------
FindData(const Reference<XInterface> & xElement,FmEntryDataList * pDataList,sal_Bool bRecurs)685cdf0e10cSrcweir     FmEntryData* NavigatorTreeModel::FindData(const Reference< XInterface > & xElement, FmEntryDataList* pDataList, sal_Bool bRecurs)
686cdf0e10cSrcweir     {
687cdf0e10cSrcweir         RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTreeModel::FindData" );
688cdf0e10cSrcweir         // normalize
689cdf0e10cSrcweir         Reference< XInterface > xIFace( xElement, UNO_QUERY );
690cdf0e10cSrcweir 
691cdf0e10cSrcweir         for (sal_uInt16 i=0; i < pDataList->Count(); i++)
692cdf0e10cSrcweir         {
693cdf0e10cSrcweir             FmEntryData* pEntryData = pDataList->GetObject(i);
694cdf0e10cSrcweir             if ( pEntryData->GetElement().get() == xIFace.get() )
695cdf0e10cSrcweir                 return pEntryData;
696cdf0e10cSrcweir             else if (bRecurs)
697cdf0e10cSrcweir             {
698cdf0e10cSrcweir                 pEntryData = FindData( xElement, pEntryData->GetChildList() );
699cdf0e10cSrcweir                 if (pEntryData)
700cdf0e10cSrcweir                     return pEntryData;
701cdf0e10cSrcweir             }
702cdf0e10cSrcweir         }
703cdf0e10cSrcweir         return NULL;
704cdf0e10cSrcweir     }
705cdf0e10cSrcweir 
706cdf0e10cSrcweir     //------------------------------------------------------------------------
FindData(const::rtl::OUString & rText,FmFormData * pParentData,sal_Bool bRecurs)707cdf0e10cSrcweir     FmEntryData* NavigatorTreeModel::FindData( const ::rtl::OUString& rText, FmFormData* pParentData, sal_Bool bRecurs )
708cdf0e10cSrcweir     {
709cdf0e10cSrcweir         RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTreeModel::FindData" );
710cdf0e10cSrcweir         FmEntryDataList* pDataList;
711cdf0e10cSrcweir         if( !pParentData )
712cdf0e10cSrcweir             pDataList = GetRootList();
713cdf0e10cSrcweir         else
714cdf0e10cSrcweir             pDataList = pParentData->GetChildList();
715cdf0e10cSrcweir 
716cdf0e10cSrcweir         ::rtl::OUString aEntryText;
717cdf0e10cSrcweir         FmEntryData* pEntryData;
718cdf0e10cSrcweir         FmEntryData* pChildData;
719cdf0e10cSrcweir 
720cdf0e10cSrcweir         for( sal_uInt16 i=0; i<pDataList->Count(); i++ )
721cdf0e10cSrcweir         {
722cdf0e10cSrcweir             pEntryData = pDataList->GetObject(i);
723cdf0e10cSrcweir             aEntryText = pEntryData->GetText();
724cdf0e10cSrcweir 
725cdf0e10cSrcweir             if (rText == aEntryText)
726cdf0e10cSrcweir                 return pEntryData;
727cdf0e10cSrcweir 
728cdf0e10cSrcweir             if( bRecurs && pEntryData->ISA(FmFormData) )
729cdf0e10cSrcweir             {
730cdf0e10cSrcweir                 pChildData = FindData( rText, (FmFormData*)pEntryData );
731cdf0e10cSrcweir                 if( pChildData )
732cdf0e10cSrcweir                     return pChildData;
733cdf0e10cSrcweir             }
734cdf0e10cSrcweir         }
735cdf0e10cSrcweir 
736cdf0e10cSrcweir         return NULL;
737cdf0e10cSrcweir     }
738cdf0e10cSrcweir 
739cdf0e10cSrcweir     //------------------------------------------------------------------------
Notify(SfxBroadcaster &,const SfxHint & rHint)740cdf0e10cSrcweir     void NavigatorTreeModel::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint )
741cdf0e10cSrcweir     {
742cdf0e10cSrcweir         RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTreeModel::Notify" );
743cdf0e10cSrcweir         if( rHint.ISA(SdrHint) )
744cdf0e10cSrcweir         {
745cdf0e10cSrcweir             SdrHint* pSdrHint = (SdrHint*)&rHint;
746cdf0e10cSrcweir             switch( pSdrHint->GetKind() )
747cdf0e10cSrcweir             {
748cdf0e10cSrcweir                 case HINT_OBJINSERTED:
749cdf0e10cSrcweir                     InsertSdrObj(pSdrHint->GetObject());
750cdf0e10cSrcweir                     break;
751cdf0e10cSrcweir                 case HINT_OBJREMOVED:
752cdf0e10cSrcweir                     RemoveSdrObj(pSdrHint->GetObject());
753cdf0e10cSrcweir                     break;
754cdf0e10cSrcweir                 default:
755cdf0e10cSrcweir                     break;
756cdf0e10cSrcweir             }
757cdf0e10cSrcweir         }
758cdf0e10cSrcweir         // hat sich die shell verabschiedet?
759cdf0e10cSrcweir         else if ( rHint.ISA(SfxSimpleHint) && ((SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING)
760cdf0e10cSrcweir             UpdateContent((FmFormShell*)NULL);
761cdf0e10cSrcweir 
762cdf0e10cSrcweir         // hat sich die Markierung der Controls veraendert ?
763cdf0e10cSrcweir         else if (rHint.ISA(FmNavViewMarksChanged))
764cdf0e10cSrcweir         {
765cdf0e10cSrcweir             FmNavViewMarksChanged* pvmcHint = (FmNavViewMarksChanged*)&rHint;
766cdf0e10cSrcweir             BroadcastMarkedObjects( pvmcHint->GetAffectedView()->GetMarkedObjectList() );
767cdf0e10cSrcweir         }
768cdf0e10cSrcweir     }
769cdf0e10cSrcweir 
770cdf0e10cSrcweir     //------------------------------------------------------------------------
InsertSdrObj(const SdrObject * pObj)771cdf0e10cSrcweir     void NavigatorTreeModel::InsertSdrObj( const SdrObject* pObj )
772cdf0e10cSrcweir     {
773cdf0e10cSrcweir         RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTreeModel::InsertSdrObj" );
774cdf0e10cSrcweir         const FmFormObj* pFormObject = FmFormObj::GetFormObject( pObj );
775cdf0e10cSrcweir         if ( pFormObject )
776cdf0e10cSrcweir         {
777cdf0e10cSrcweir             try
778cdf0e10cSrcweir             {
779cdf0e10cSrcweir                 Reference< XFormComponent > xFormComponent( pFormObject->GetUnoControlModel(), UNO_QUERY_THROW );
780cdf0e10cSrcweir                 Reference< XIndexAccess > xContainer( xFormComponent->getParent(), UNO_QUERY_THROW );
781cdf0e10cSrcweir 
782cdf0e10cSrcweir                 sal_Int32 nPos = getElementPos( xContainer, xFormComponent );
783cdf0e10cSrcweir                 InsertFormComponent( xFormComponent, nPos );
784cdf0e10cSrcweir             }
785cdf0e10cSrcweir             catch( const Exception& )
786cdf0e10cSrcweir             {
787cdf0e10cSrcweir                 DBG_UNHANDLED_EXCEPTION();
788cdf0e10cSrcweir             }
789cdf0e10cSrcweir         }
790cdf0e10cSrcweir         else if ( pObj->IsGroupObject() )
791cdf0e10cSrcweir         {
792cdf0e10cSrcweir             SdrObjListIter aIter( *pObj->GetSubList() );
793cdf0e10cSrcweir             while ( aIter.IsMore() )
794cdf0e10cSrcweir                 InsertSdrObj( aIter.Next() );
795cdf0e10cSrcweir         }
796cdf0e10cSrcweir     }
797cdf0e10cSrcweir 
798cdf0e10cSrcweir     //------------------------------------------------------------------------
RemoveSdrObj(const SdrObject * pObj)799cdf0e10cSrcweir     void NavigatorTreeModel::RemoveSdrObj( const SdrObject* pObj )
800cdf0e10cSrcweir     {
801cdf0e10cSrcweir         RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTreeModel::RemoveSdrObj" );
802cdf0e10cSrcweir         const FmFormObj* pFormObject = FmFormObj::GetFormObject( pObj );
803cdf0e10cSrcweir         if ( pFormObject )
804cdf0e10cSrcweir         {
805cdf0e10cSrcweir             try
806cdf0e10cSrcweir             {
807cdf0e10cSrcweir                 Reference< XFormComponent > xFormComponent( pFormObject->GetUnoControlModel(), UNO_QUERY_THROW );
808cdf0e10cSrcweir                 FmEntryData* pEntryData = FindData( xFormComponent, GetRootList(), sal_True );
809cdf0e10cSrcweir                 if ( pEntryData )
810cdf0e10cSrcweir                     Remove( pEntryData );
811cdf0e10cSrcweir             }
812cdf0e10cSrcweir             catch( const Exception& )
813cdf0e10cSrcweir             {
814cdf0e10cSrcweir                 DBG_UNHANDLED_EXCEPTION();
815cdf0e10cSrcweir             }
816cdf0e10cSrcweir         }
817cdf0e10cSrcweir         else if ( pObj->IsGroupObject() )
818cdf0e10cSrcweir         {
819cdf0e10cSrcweir             SdrObjListIter aIter( *pObj->GetSubList() );
820cdf0e10cSrcweir             while ( aIter.IsMore() )
821cdf0e10cSrcweir                 RemoveSdrObj( aIter.Next() );
822cdf0e10cSrcweir         }
823cdf0e10cSrcweir     }
824cdf0e10cSrcweir 
InsertFormComponent(FmNavRequestSelectHint & rHint,SdrObject * pObject)825cdf0e10cSrcweir     sal_Bool NavigatorTreeModel::InsertFormComponent(FmNavRequestSelectHint& rHint, SdrObject* pObject)
826cdf0e10cSrcweir     {
827cdf0e10cSrcweir         RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTreeModel::InsertFormComponent" );
828cdf0e10cSrcweir         if ( pObject->ISA(SdrObjGroup) )
829cdf0e10cSrcweir         {   // rekursiv absteigen
830cdf0e10cSrcweir             const SdrObjList *pChilds = ((SdrObjGroup*)pObject)->GetSubList();
831cdf0e10cSrcweir             for ( sal_uInt16 i=0; i<pChilds->GetObjCount(); ++i )
832cdf0e10cSrcweir             {
833cdf0e10cSrcweir                 SdrObject* pCurrent = pChilds->GetObj(i);
834cdf0e10cSrcweir                 if (!InsertFormComponent(rHint, pCurrent))
835cdf0e10cSrcweir                     return sal_False;
836cdf0e10cSrcweir             }
837cdf0e10cSrcweir         }
838cdf0e10cSrcweir         else
839cdf0e10cSrcweir         {
840cdf0e10cSrcweir             FmFormObj* pFormObject = FmFormObj::GetFormObject( pObject );
841cdf0e10cSrcweir             if ( !pFormObject )
842cdf0e10cSrcweir                 return sal_False;
843cdf0e10cSrcweir 
844cdf0e10cSrcweir             try
845cdf0e10cSrcweir             {
846cdf0e10cSrcweir                 Reference< XFormComponent > xFormViewControl( pFormObject->GetUnoControlModel(), UNO_QUERY_THROW );
847cdf0e10cSrcweir                 FmEntryData* pControlData = FindData( xFormViewControl, GetRootList() );
848cdf0e10cSrcweir                 if ( !pControlData )
849cdf0e10cSrcweir                     return sal_False;
850cdf0e10cSrcweir 
851cdf0e10cSrcweir                 rHint.AddItem( pControlData );
852cdf0e10cSrcweir                 return sal_True;
853cdf0e10cSrcweir             }
854cdf0e10cSrcweir             catch( const Exception& )
855cdf0e10cSrcweir             {
856cdf0e10cSrcweir                 DBG_UNHANDLED_EXCEPTION();
857cdf0e10cSrcweir                 return sal_False;
858cdf0e10cSrcweir             }
859cdf0e10cSrcweir         }
860cdf0e10cSrcweir 
861cdf0e10cSrcweir         return sal_True;
862cdf0e10cSrcweir     }
863cdf0e10cSrcweir 
BroadcastMarkedObjects(const SdrMarkList & mlMarked)864cdf0e10cSrcweir     void NavigatorTreeModel::BroadcastMarkedObjects(const SdrMarkList& mlMarked)
865cdf0e10cSrcweir     {
866cdf0e10cSrcweir         RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTreeModel::BroadcastMarkedObjects" );
867cdf0e10cSrcweir         // gehen wir durch alle markierten Objekte und suchen wir die raus, mit denen ich was anfangen kann
868cdf0e10cSrcweir         FmNavRequestSelectHint rshRequestSelection;
869cdf0e10cSrcweir         sal_Bool bIsMixedSelection = sal_False;
870cdf0e10cSrcweir 
871cdf0e10cSrcweir         for (sal_uLong i=0; (i<mlMarked.GetMarkCount()) && !bIsMixedSelection; i++)
872cdf0e10cSrcweir         {
873cdf0e10cSrcweir             SdrObject* pobjCurrent = mlMarked.GetMark(i)->GetMarkedSdrObj();
874cdf0e10cSrcweir             bIsMixedSelection |= !InsertFormComponent(rshRequestSelection, pobjCurrent);
875cdf0e10cSrcweir                 // bei einem Nicht-Form-Control liefert InsertFormComponent sal_False !
876cdf0e10cSrcweir         }
877cdf0e10cSrcweir 
878cdf0e10cSrcweir         rshRequestSelection.SetMixedSelection(bIsMixedSelection);
879cdf0e10cSrcweir         if (bIsMixedSelection)
880cdf0e10cSrcweir             rshRequestSelection.ClearItems();
881cdf0e10cSrcweir 
882cdf0e10cSrcweir         Broadcast(rshRequestSelection);
883cdf0e10cSrcweir             // eine leere Liste interpretiert der NavigatorTree so, dass er seine Selektion komplett rausnimmt
884cdf0e10cSrcweir     }
885cdf0e10cSrcweir 
886cdf0e10cSrcweir     //------------------------------------------------------------------------
UpdateContent(const Reference<XNameContainer> & xForms)887cdf0e10cSrcweir     void NavigatorTreeModel::UpdateContent( const Reference< XNameContainer > & xForms )
888cdf0e10cSrcweir     {
889cdf0e10cSrcweir         RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTreeModel::UpdateContent" );
890cdf0e10cSrcweir         //////////////////////////////////////////////////////////////////////
891cdf0e10cSrcweir         // Model von der Root aufwaerts neu fuellen
892cdf0e10cSrcweir         Clear();
893cdf0e10cSrcweir         if (xForms.is())
894cdf0e10cSrcweir         {
895cdf0e10cSrcweir             Reference< XContainer >  xFormContainer(xForms, UNO_QUERY);
896cdf0e10cSrcweir             if (xFormContainer.is())
897cdf0e10cSrcweir                 xFormContainer->addContainerListener((XContainerListener*)m_pPropChangeList);
898cdf0e10cSrcweir 
899cdf0e10cSrcweir             FillBranch(NULL);
900cdf0e10cSrcweir 
901cdf0e10cSrcweir             // jetzt in meinem Tree genau die das in meiner View markierte Control selektieren
902cdf0e10cSrcweir             // (bzw alle solchen), falls es eines gibt ...
903cdf0e10cSrcweir             if(!m_pFormShell) return;       // keine Shell -> wech
904cdf0e10cSrcweir 
905cdf0e10cSrcweir             FmFormView* pFormView = m_pFormShell->GetFormView();
906cdf0e10cSrcweir             DBG_ASSERT(pFormView != NULL, "NavigatorTreeModel::UpdateContent : keine FormView");
907cdf0e10cSrcweir             BroadcastMarkedObjects(pFormView->GetMarkedObjectList());
908cdf0e10cSrcweir         }
909cdf0e10cSrcweir     }
910cdf0e10cSrcweir 
911cdf0e10cSrcweir     //------------------------------------------------------------------------
UpdateContent(FmFormShell * pShell)912cdf0e10cSrcweir     void NavigatorTreeModel::UpdateContent( FmFormShell* pShell )
913cdf0e10cSrcweir     {
914cdf0e10cSrcweir         RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTreeModel::UpdateContent" );
915cdf0e10cSrcweir         //////////////////////////////////////////////////////////////////////
916cdf0e10cSrcweir         // Wenn Shell sich nicht veraendert hat, nichts machen
917cdf0e10cSrcweir         FmFormPage* pNewPage = pShell ? pShell->GetCurPage() : NULL;
918cdf0e10cSrcweir         if ((pShell == m_pFormShell) && (m_pFormPage == pNewPage))
919cdf0e10cSrcweir             return;
920cdf0e10cSrcweir 
921cdf0e10cSrcweir         //////////////////////////////////////////////////////////////////////
922cdf0e10cSrcweir         // Als Listener abmelden
923cdf0e10cSrcweir         if( m_pFormShell )
924cdf0e10cSrcweir         {
925cdf0e10cSrcweir             if (m_pFormModel)
926cdf0e10cSrcweir                 EndListening( *m_pFormModel );
927cdf0e10cSrcweir             m_pFormModel = NULL;
928cdf0e10cSrcweir             EndListening( *m_pFormShell );
929cdf0e10cSrcweir             Clear();
930cdf0e10cSrcweir         }
931cdf0e10cSrcweir 
932cdf0e10cSrcweir         //////////////////////////////////////////////////////////////////////
933cdf0e10cSrcweir         // Vollupdate
934cdf0e10cSrcweir         m_pFormShell = pShell;
935cdf0e10cSrcweir         if (m_pFormShell)
936cdf0e10cSrcweir         {
937cdf0e10cSrcweir             m_pFormPage = pNewPage;
938cdf0e10cSrcweir             UpdateContent(m_pFormPage->GetForms());
939cdf0e10cSrcweir         } else
940cdf0e10cSrcweir             m_pFormPage = NULL;
941cdf0e10cSrcweir 
942cdf0e10cSrcweir         //////////////////////////////////////////////////////////////////////
943cdf0e10cSrcweir         // Als Listener neu anmelden
944cdf0e10cSrcweir         if( m_pFormShell )
945cdf0e10cSrcweir         {
946cdf0e10cSrcweir             StartListening( *m_pFormShell );
947cdf0e10cSrcweir             m_pFormModel = m_pFormShell->GetFormModel();
948cdf0e10cSrcweir             if( m_pFormModel )
949cdf0e10cSrcweir                 StartListening( *m_pFormModel );
950cdf0e10cSrcweir         }
951cdf0e10cSrcweir     }
952cdf0e10cSrcweir 
953cdf0e10cSrcweir     //------------------------------------------------------------------------
GetFormComponents(FmFormData * pFormData)954cdf0e10cSrcweir     Reference< XIndexContainer >  NavigatorTreeModel::GetFormComponents( FmFormData* pFormData )
955cdf0e10cSrcweir     {
956cdf0e10cSrcweir         RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTreeModel::GetFormComponents" );
957cdf0e10cSrcweir         //////////////////////////////////////////////////////////////////////
958cdf0e10cSrcweir         // Von der Form Components holen
959cdf0e10cSrcweir         if (pFormData)
960cdf0e10cSrcweir             return Reference< XIndexContainer > (pFormData->GetFormIface(), UNO_QUERY);
961cdf0e10cSrcweir 
962cdf0e10cSrcweir         return Reference< XIndexContainer > ();
963cdf0e10cSrcweir     }
964cdf0e10cSrcweir 
965cdf0e10cSrcweir     //------------------------------------------------------------------------
CheckEntry(FmEntryData * pEntryData)966cdf0e10cSrcweir     sal_Bool NavigatorTreeModel::CheckEntry( FmEntryData* pEntryData )
967cdf0e10cSrcweir     {
968cdf0e10cSrcweir         RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTreeModel::CheckEntry" );
969cdf0e10cSrcweir         //////////////////////////////////////////////////////////////////////
970cdf0e10cSrcweir         // Nur Forms duerfen auf Doppeldeutigkeit untersucht werden
971cdf0e10cSrcweir         if( !pEntryData->ISA(FmFormData) ) return sal_True;
972cdf0e10cSrcweir 
973cdf0e10cSrcweir         //////////////////////////////////////////////////////////////////////
974cdf0e10cSrcweir         // ChildListe des Parents holen
975cdf0e10cSrcweir         FmFormData* pParentData = (FmFormData*)pEntryData->GetParent();
976cdf0e10cSrcweir         FmEntryDataList* pChildList;
977cdf0e10cSrcweir         if( !pParentData )
978cdf0e10cSrcweir             pChildList = GetRootList();
979cdf0e10cSrcweir         else
980cdf0e10cSrcweir             pChildList = pParentData->GetChildList();
981cdf0e10cSrcweir 
982cdf0e10cSrcweir         //////////////////////////////////////////////////////////////////////
983cdf0e10cSrcweir         // In ChildListe nach doppelten Namen suchen
984cdf0e10cSrcweir         ::rtl::OUString aChildText;
985cdf0e10cSrcweir         FmEntryData* pChildData;
986cdf0e10cSrcweir 
987cdf0e10cSrcweir         for( sal_uInt16 i=0; i<pChildList->Count(); i++ )
988cdf0e10cSrcweir         {
989cdf0e10cSrcweir             pChildData = pChildList->GetObject(i);
990cdf0e10cSrcweir             aChildText = pChildData->GetText();
991cdf0e10cSrcweir 
992cdf0e10cSrcweir             //////////////////////////////////////////////////////////////////////
993cdf0e10cSrcweir             // Gleichen Eintrag gefunden
994cdf0e10cSrcweir             if  (   (aChildText == pEntryData->GetText())
995cdf0e10cSrcweir                 &&  (pEntryData!=pChildData)
996cdf0e10cSrcweir                 )
997cdf0e10cSrcweir             {
998cdf0e10cSrcweir 
999cdf0e10cSrcweir 
1000cdf0e10cSrcweir                 SQLContext aError;
1001cdf0e10cSrcweir                 aError.Message = String(SVX_RES(RID_ERR_CONTEXT_ADDFORM));
1002cdf0e10cSrcweir                 aError.Details = String(SVX_RES(RID_ERR_DUPLICATE_NAME));
1003cdf0e10cSrcweir                 displayException(aError);
1004cdf0e10cSrcweir 
1005cdf0e10cSrcweir                 return sal_False;
1006cdf0e10cSrcweir             }
1007cdf0e10cSrcweir         }
1008cdf0e10cSrcweir 
1009cdf0e10cSrcweir         return sal_True;
1010cdf0e10cSrcweir     }
1011cdf0e10cSrcweir 
1012cdf0e10cSrcweir     //------------------------------------------------------------------------
Rename(FmEntryData * pEntryData,const::rtl::OUString & rNewText)1013cdf0e10cSrcweir     sal_Bool NavigatorTreeModel::Rename( FmEntryData* pEntryData, const ::rtl::OUString& rNewText )
1014cdf0e10cSrcweir     {
1015cdf0e10cSrcweir         RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTreeModel::Rename" );
1016cdf0e10cSrcweir         //////////////////////////////////////////////////////////////////////
1017cdf0e10cSrcweir         // Wenn Name schon vorhanden, Fehlermeldung
1018cdf0e10cSrcweir         pEntryData->SetText( rNewText );
1019cdf0e10cSrcweir 
1020cdf0e10cSrcweir         //////////////////////////////////////////////////////////////////////
1021cdf0e10cSrcweir         // PropertySet besorgen
1022cdf0e10cSrcweir         Reference< XFormComponent >  xFormComponent;
1023cdf0e10cSrcweir 
1024cdf0e10cSrcweir         if( pEntryData->ISA(FmFormData) )
1025cdf0e10cSrcweir         {
1026cdf0e10cSrcweir             FmFormData* pFormData = (FmFormData*)pEntryData;
1027cdf0e10cSrcweir             Reference< XForm >  xForm( pFormData->GetFormIface());
1028cdf0e10cSrcweir             xFormComponent = Reference< XFormComponent > (xForm, UNO_QUERY);
1029cdf0e10cSrcweir         }
1030cdf0e10cSrcweir 
1031cdf0e10cSrcweir         if( pEntryData->ISA(FmControlData) )
1032cdf0e10cSrcweir         {
1033cdf0e10cSrcweir             FmControlData* pControlData = (FmControlData*)pEntryData;
1034cdf0e10cSrcweir             xFormComponent = pControlData->GetFormComponent();
1035cdf0e10cSrcweir         }
1036cdf0e10cSrcweir 
1037cdf0e10cSrcweir         if( !xFormComponent.is() ) return sal_False;
1038cdf0e10cSrcweir         Reference< XPropertySet >  xSet(xFormComponent, UNO_QUERY);
1039cdf0e10cSrcweir         if( !xSet.is() ) return sal_False;
1040cdf0e10cSrcweir 
1041cdf0e10cSrcweir         //////////////////////////////////////////////////////////////////////
1042cdf0e10cSrcweir         // Namen setzen
1043cdf0e10cSrcweir         xSet->setPropertyValue( FM_PROP_NAME, makeAny(rNewText) );
1044cdf0e10cSrcweir 
1045cdf0e10cSrcweir         return sal_True;
1046cdf0e10cSrcweir     }
1047cdf0e10cSrcweir 
1048cdf0e10cSrcweir     //------------------------------------------------------------------------
IsNameAlreadyDefined(const::rtl::OUString & rName,FmFormData * pParentData)1049cdf0e10cSrcweir     sal_Bool NavigatorTreeModel::IsNameAlreadyDefined( const ::rtl::OUString& rName, FmFormData* pParentData )
1050cdf0e10cSrcweir     {
1051cdf0e10cSrcweir         RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTreeModel::IsNameAlreadyDefined" );
1052cdf0e10cSrcweir         //////////////////////////////////////////////////////////////////////
1053cdf0e10cSrcweir         // Form in der Root
1054cdf0e10cSrcweir         if( !pParentData )
1055cdf0e10cSrcweir         {
1056cdf0e10cSrcweir             if (GetForms()->hasByName(rName))
1057cdf0e10cSrcweir                 return sal_True;
1058cdf0e10cSrcweir         }
1059cdf0e10cSrcweir 
1060cdf0e10cSrcweir         //////////////////////////////////////////////////////////////////////
1061cdf0e10cSrcweir         // Restliche Components
1062cdf0e10cSrcweir         else
1063cdf0e10cSrcweir         {
1064cdf0e10cSrcweir             Reference< XNameContainer >  xFormComponents(GetFormComponents(pParentData), UNO_QUERY);
1065cdf0e10cSrcweir             if (xFormComponents.is() && xFormComponents->hasByName(rName))
1066cdf0e10cSrcweir                 return sal_True;
1067cdf0e10cSrcweir         }
1068cdf0e10cSrcweir 
1069cdf0e10cSrcweir         return sal_False;
1070cdf0e10cSrcweir     }
1071cdf0e10cSrcweir 
1072cdf0e10cSrcweir     //------------------------------------------------------------------------
GetSdrObj(FmControlData * pControlData)1073cdf0e10cSrcweir     SdrObject* NavigatorTreeModel::GetSdrObj( FmControlData* pControlData )
1074cdf0e10cSrcweir     {
1075cdf0e10cSrcweir         RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTreeModel::GetSdrObj" );
1076cdf0e10cSrcweir         if (!pControlData || !m_pFormShell)
1077cdf0e10cSrcweir             return NULL;
1078cdf0e10cSrcweir 
1079cdf0e10cSrcweir         //////////////////////////////////////////////////////////////////////
1080cdf0e10cSrcweir         // In der Page das entsprechende SdrObj finden und selektieren
1081cdf0e10cSrcweir         Reference< XFormComponent >  xFormComponent( pControlData->GetFormComponent());
1082cdf0e10cSrcweir         if (!xFormComponent.is())
1083cdf0e10cSrcweir             return NULL;
1084cdf0e10cSrcweir 
1085cdf0e10cSrcweir         FmFormView*     pFormView       = m_pFormShell->GetFormView();
1086cdf0e10cSrcweir         SdrPageView*    pPageView       = pFormView->GetSdrPageView();
1087cdf0e10cSrcweir         SdrPage*        pPage           = pPageView->GetPage();
1088cdf0e10cSrcweir 
1089cdf0e10cSrcweir         SdrObjListIter  aIter( *pPage );
1090cdf0e10cSrcweir         return Search(aIter, xFormComponent);
1091cdf0e10cSrcweir     }
1092cdf0e10cSrcweir 
1093cdf0e10cSrcweir     //------------------------------------------------------------------
Search(SdrObjListIter & rIter,const Reference<XFormComponent> & xComp)1094cdf0e10cSrcweir     SdrObject* NavigatorTreeModel::Search(SdrObjListIter& rIter, const Reference< XFormComponent > & xComp)
1095cdf0e10cSrcweir     {
1096cdf0e10cSrcweir         RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "NavigatorTreeModel::Search" );
1097cdf0e10cSrcweir         while (rIter.IsMore())
1098cdf0e10cSrcweir         {
1099cdf0e10cSrcweir             SdrObject* pObj = rIter.Next();
1100cdf0e10cSrcweir             FmFormObj* pFormObject = FmFormObj::GetFormObject( pObj );
1101cdf0e10cSrcweir             if ( pFormObject )
1102cdf0e10cSrcweir             {
1103cdf0e10cSrcweir                 Reference< XFormComponent > xFormViewControl( pFormObject->GetUnoControlModel(), UNO_QUERY );
1104cdf0e10cSrcweir                 if ( xFormViewControl == xComp )
1105cdf0e10cSrcweir                     return pObj;
1106cdf0e10cSrcweir             }
1107cdf0e10cSrcweir             else if ( pObj->IsGroupObject() )
1108cdf0e10cSrcweir             {
1109cdf0e10cSrcweir                 SdrObjListIter aIter( *pObj->GetSubList() );
1110cdf0e10cSrcweir                 pObj = Search( aIter, xComp );
1111cdf0e10cSrcweir                 if ( pObj )
1112cdf0e10cSrcweir                     return pObj;
1113cdf0e10cSrcweir             }
1114cdf0e10cSrcweir         }
1115cdf0e10cSrcweir         return NULL;
1116cdf0e10cSrcweir     }
1117cdf0e10cSrcweir 
1118cdf0e10cSrcweir //............................................................................
1119cdf0e10cSrcweir }   // namespace svxform
1120cdf0e10cSrcweir //............................................................................
1121