1*f6e50924SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*f6e50924SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*f6e50924SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*f6e50924SAndrew Rist  * distributed with this work for additional information
6*f6e50924SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*f6e50924SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*f6e50924SAndrew Rist  * "License"); you may not use this file except in compliance
9*f6e50924SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*f6e50924SAndrew Rist  *
11*f6e50924SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*f6e50924SAndrew Rist  *
13*f6e50924SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*f6e50924SAndrew Rist  * software distributed under the License is distributed on an
15*f6e50924SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*f6e50924SAndrew Rist  * KIND, either express or implied.  See the License for the
17*f6e50924SAndrew Rist  * specific language governing permissions and limitations
18*f6e50924SAndrew Rist  * under the License.
19*f6e50924SAndrew Rist  *
20*f6e50924SAndrew Rist  *************************************************************/
21*f6e50924SAndrew Rist 
22*f6e50924SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_svx.hxx"
26cdf0e10cSrcweir #include <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 //............................................................................
1121cdf0e10cSrcweir 
1122cdf0e10cSrcweir 
1123