xref: /trunk/main/svx/source/form/datanavi.cxx (revision cdf0e10c)
1  /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_svx.hxx"
30 
31 #include "datanavi.hxx"
32 #include "fmservs.hxx"
33 
34 #include "datanavi.hrc"
35 #include "svx/fmresids.hrc"
36 #include "fmhelp.hrc"
37 #include <svx/svxids.hrc>
38 #include <tools/rcid.h>
39 #include <tools/diagnose_ex.h>
40 #include "svx/xmlexchg.hxx"
41 #include <svx/dialmgr.hxx>
42 #include <svx/fmshell.hxx>
43 #include <svtools/miscopt.hxx>
44 #include <unotools/pathoptions.hxx>
45 #include <unotools/viewoptions.hxx>
46 #include <svtools/svtools.hrc>
47 #include <sfx2/app.hxx>
48 #include <sfx2/filedlghelper.hxx>
49 #include <sfx2/objitem.hxx>
50 #include <sfx2/viewfrm.hxx>
51 #include <sfx2/objsh.hxx>
52 #include <sfx2/bindings.hxx>
53 #include <sfx2/dispatch.hxx>
54 #include <com/sun/star/beans/PropertyAttribute.hpp>
55 #include <com/sun/star/container/XSet.hpp>
56 #include <com/sun/star/datatransfer/XTransferable.hpp>
57 #include <com/sun/star/frame/XController.hpp>
58 #include <com/sun/star/frame/XFramesSupplier.hpp>
59 #include <com/sun/star/frame/XModel.hpp>
60 #include "com/sun/star/ui/dialogs/TemplateDescription.hpp"
61 #include <com/sun/star/xforms/XFormsSupplier.hpp>
62 #include <com/sun/star/xml/dom/XDocument.hpp>
63 #include <com/sun/star/xml/dom/DOMException.hpp>
64 #include <com/sun/star/form/binding/XValueBinding.hpp>
65 #include <comphelper/processfactory.hxx>
66 #include <rtl/logfile.hxx>
67 
68 using namespace ::com::sun::star::beans;
69 using namespace ::com::sun::star::container;
70 using namespace ::com::sun::star::datatransfer;
71 using namespace ::com::sun::star::frame;
72 using namespace ::com::sun::star::uno;
73 using namespace ::com::sun::star::xml::dom::events;
74 using namespace ::svx;
75 
76 namespace css = ::com::sun::star;
77 
78 #define CFGNAME_DATANAVIGATOR		DEFINE_CONST_UNICODE("DataNavigator")
79 #define CFGNAME_SHOWDETAILS			DEFINE_CONST_UNICODE("ShowDetails")
80 #define MSG_VARIABLE				DEFINE_CONST_UNICODE("%1")
81 #define MODELNAME					DEFINE_CONST_UNICODE("$MODELNAME")
82 #define INSTANCENAME				DEFINE_CONST_UNICODE("$INSTANCENAME")
83 #define ELEMENTNAME					DEFINE_CONST_UNICODE("$ELEMENTNAME")
84 #define ATTRIBUTENAME               DEFINE_CONST_UNICODE("$ATTRIBUTENAME")
85 #define SUBMISSIONNAME              DEFINE_CONST_UNICODE("$SUBMISSIONNAME")
86 #define BINDINGNAME                 DEFINE_CONST_UNICODE("$BINDINGNAME")
87 
88 //............................................................................
89 namespace svxform
90 {
91 //............................................................................
92 
93 	// properties of instance
94 	#define PN_INSTANCE_MODEL		::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Instance" ) )
95 	#define PN_INSTANCE_ID			::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ID" ) )
96     #define PN_INSTANCE_URL         ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "URL" ) )
97     #define PN_INSTANCE_URLONCE     ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "URLOnce" ) )
98 
99 	// properties of binding
100 	#define PN_BINDING_ID			::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "BindingID" ) )
101 	#define PN_BINDING_EXPR			::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "BindingExpression" ) )
102 	#define PN_BINDING_MODEL		::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Model" ) )
103 	#define PN_BINDING_NAMESPACES	::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ModelNamespaces" ) )
104 	#define PN_BINDING_MODELID		::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ModelID" ) )
105 	#define PN_READONLY_EXPR		::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ReadonlyExpression" ) )
106 	#define PN_RELEVANT_EXPR		::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "RelevantExpression" ) )
107 	#define PN_REQUIRED_EXPR		::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "RequiredExpression" ) )
108 	#define PN_CONSTRAINT_EXPR		::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ConstraintExpression" ) )
109 	#define PN_CALCULATE_EXPR		::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "CalculateExpression" ) )
110 	#define PN_BINDING_TYPE			::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Type" ) )
111 	#define PN_BINDING_READONLY		::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ReadOnly" ) )
112 	#define PN_BINDING_ENABLED		::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Enabled" ) )
113 
114 	// properties of submission
115 	#define PN_SUBMISSION_ID		::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ID" ) )
116 	#define PN_SUBMISSION_BIND		::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Bind" ) )
117 	#define PN_SUBMISSION_REF		::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Ref" ) )
118 	#define PN_SUBMISSION_ACTION	::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Action" ) )
119 	#define PN_SUBMISSION_METHOD	::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Method" ) )
120 	#define PN_SUBMISSION_MODEL		::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Model" ) )
121 	#define PN_SUBMISSION_REPLACE	::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Replace" ) )
122 
123 	// submission methods
124 	#define SUBMITMETHOD_POST		::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "post" ) )
125 	#define SUBMITMETHOD_GET		::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "get" ) )
126 	#define SUBMITMETHOD_PUT		::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "put" ) )
127 
128 	// other const strings
129 	#define TRUE_VALUE				::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "true()" ) )
130 	#define FALSE_VALUE				::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "false()" ) )
131 	#define NEW_ELEMENT				::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "newElement" ) )
132     #define NEW_ATTRIBUTE           ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "newAttribute" ) )
133     #define EVENTTYPE_SUBTREE       ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DOMSubtreeModified" ) )
134     #define EVENTTYPE_CHARDATA      ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DOMCharacterDataModified" ) )
135     #define EVENTTYPE_ATTR          ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DOMAttrModified" ) )
136 
137 	#define MIN_PAGE_COUNT			3 // at least one instance, one submission and one binding page
138 
139 	struct ItemNode
140 	{
141 		Reference< css::xml::dom::XNode >	m_xNode;
142 		Reference< XPropertySet > 			m_xPropSet;
143 
144 		ItemNode( const Reference< css::xml::dom::XNode >& _rxNode ) :
145 			m_xNode( _rxNode ) {}
146 		ItemNode( const Reference< XPropertySet >& _rxSet ) :
147 			m_xPropSet( _rxSet ) {}
148 
149 		DataGroupType	GetDataGroupType() const;
150 	};
151 
152 	//========================================================================
153 	// class DataTreeListBox
154 	//========================================================================
155 	DataTreeListBox::DataTreeListBox( XFormsPage* pPage, DataGroupType _eGroup, const ResId& rResId ) :
156 
157 		SvTreeListBox( pPage, rResId ),
158 
159 		m_pXFormsPage	( pPage ),
160 		m_eGroup		( _eGroup )
161 
162 	{
163 		EnableContextMenuHandling();
164 
165 		if ( DGTInstance == m_eGroup )
166 			SetDragDropMode( SV_DRAGDROP_CTRL_MOVE |SV_DRAGDROP_CTRL_COPY | SV_DRAGDROP_APP_COPY );
167 	}
168 
169 	DataTreeListBox::~DataTreeListBox()
170 	{
171 		DeleteAndClear();
172 	}
173 
174 	sal_Int8 DataTreeListBox::AcceptDrop( const AcceptDropEvent& /*rEvt*/ )
175 	{
176 		return DND_ACTION_NONE;
177 	}
178 	sal_Int8 DataTreeListBox::ExecuteDrop( const ExecuteDropEvent& /*rEvt*/ )
179 	{
180 		return DND_ACTION_NONE;
181 	}
182 	void DataTreeListBox::StartDrag( sal_Int8 /*_nAction*/, const Point& /*_rPosPixel*/ )
183 	{
184 		SvLBoxEntry* pSelected = FirstSelected();
185 		if ( !pSelected )
186 			// no drag without an entry
187 			return;
188 
189         if ( m_eGroup == DGTBinding )
190             // for the moment, bindings cannot be dragged.
191             // #i59395# / 2005-12-15 / frank.schoenheit@sun.com
192             return;
193 
194 		// GetServiceNameForNode() requires a datatype repository which
195 		// will be automatically build if requested???
196 		Reference< css::xforms::XModel > xModel( m_pXFormsPage->GetXFormsHelper(), UNO_QUERY );
197         Reference< css::xforms::XDataTypeRepository > xDataTypes =
198             xModel->getDataTypeRepository();
199         if(!xDataTypes.is())
200 			return;
201 
202 		using namespace ::com::sun::star::uno;
203 		typedef com::sun::star::form::binding::XValueBinding XValueBinding_t;
204 
205 		ItemNode *pItemNode = static_cast<ItemNode*>(pSelected->GetUserData());
206 
207         if ( !pItemNode )
208         {
209             // the only known (and allowed?) case where this happens are sub-entries of a submission
210             // entry
211             DBG_ASSERT( DGTSubmission == m_eGroup, "DataTreeListBox::StartDrag: how this?" );
212             pSelected = GetParent( pSelected );
213             DBG_ASSERT( pSelected && !GetParent( pSelected ), "DataTreeListBox::StartDrag: what kind of entry *is* this?" );
214                 // on the submission page, we have only top-level entries (the submission themself)
215                 // plus direct children of those (facets of a submission)
216             pItemNode = pSelected ? static_cast< ItemNode* >( pSelected->GetUserData() ) : NULL;
217             if ( !pItemNode )
218                 return;
219         }
220 
221 		OXFormsDescriptor desc;
222 		desc.szName = GetEntryText(pSelected);
223 		if(pItemNode->m_xNode.is()) {
224 			// a valid node interface tells us that we need to create a control from a binding
225 			desc.szServiceName = m_pXFormsPage->GetServiceNameForNode(pItemNode->m_xNode);
226 			desc.xPropSet = m_pXFormsPage->GetBindingForNode(pItemNode->m_xNode);
227 			DBG_ASSERT( desc.xPropSet.is(), "DataTreeListBox::StartDrag(): invalid node binding" );
228 		}
229 		else {
230 			desc.szServiceName = FM_COMPONENT_COMMANDBUTTON;
231 			desc.xPropSet = pItemNode->m_xPropSet;
232 		}
233 		OXFormsTransferable *pTransferable = new OXFormsTransferable(desc);
234 		Reference< XTransferable > xEnsureDelete = pTransferable;
235 		if(pTransferable) {
236 			EndSelection();
237 			pTransferable->StartDrag( this, DND_ACTION_COPY );
238 		}
239 	}
240 
241 	PopupMenu* DataTreeListBox::CreateContextMenu()
242 	{
243 		PopupMenu* pMenu = new PopupMenu( SVX_RES( RID_MENU_DATANAVIGATOR ) );
244 		if ( DGTInstance == m_eGroup )
245 		    pMenu->RemoveItem( pMenu->GetItemPos( TBI_ITEM_ADD ) );
246 		else
247 		{
248 		    pMenu->RemoveItem( pMenu->GetItemPos( TBI_ITEM_ADD_ELEMENT ) );
249 		    pMenu->RemoveItem( pMenu->GetItemPos( TBI_ITEM_ADD_ATTRIBUTE ) );
250 
251 			if ( DGTSubmission == m_eGroup )
252 			{
253 				pMenu->SetItemText( TBI_ITEM_ADD, SVX_RESSTR( RID_STR_DATANAV_ADD_SUBMISSION ) );
254 				pMenu->SetItemText( TBI_ITEM_EDIT, SVX_RESSTR( RID_STR_DATANAV_EDIT_SUBMISSION ) );
255 				pMenu->SetItemText( TBI_ITEM_REMOVE, SVX_RESSTR( RID_STR_DATANAV_REMOVE_SUBMISSION ) );
256 			}
257 			else
258 			{
259 				pMenu->SetItemText( TBI_ITEM_ADD, SVX_RESSTR( RID_STR_DATANAV_ADD_BINDING ) );
260 				pMenu->SetItemText( TBI_ITEM_EDIT, SVX_RESSTR( RID_STR_DATANAV_EDIT_BINDING ) );
261 				pMenu->SetItemText( TBI_ITEM_REMOVE, SVX_RESSTR( RID_STR_DATANAV_REMOVE_BINDING ) );
262 			}
263 		}
264 		m_pXFormsPage->EnableMenuItems( pMenu );
265 		return pMenu;
266 	}
267 
268 	void DataTreeListBox::ExcecuteContextMenuAction( sal_uInt16 _nSelectedPopupEntry )
269 	{
270 		m_pXFormsPage->DoMenuAction( _nSelectedPopupEntry );
271 	}
272 
273 	void DataTreeListBox::RemoveEntry( SvLBoxEntry* _pEntry )
274 	{
275 		if ( _pEntry )
276 		{
277 			delete static_cast< ItemNode* >( _pEntry->GetUserData() );
278 			SvTreeListBox::GetModel()->Remove( _pEntry );
279 		}
280 	}
281 
282 	void DataTreeListBox::DeleteAndClear()
283 	{
284 		sal_uIntPtr i, nCount = GetEntryCount();
285 		for ( i = 0; i < nCount; ++i )
286 		{
287 			SvLBoxEntry* pEntry = GetEntry(i);
288 			if ( pEntry )
289 				delete static_cast< ItemNode* >( pEntry->GetUserData() );
290 		}
291 
292 		Clear();
293 	}
294 
295 	//========================================================================
296 	// class XFormsPage
297 	//========================================================================
298 	XFormsPage::XFormsPage( Window* pParent, DataNavigatorWindow* _pNaviWin, DataGroupType _eGroup ) :
299 
300 		TabPage( pParent, SVX_RES( RID_SVX_XFORMS_TABPAGES ) ),
301 
302 		m_aToolBox		( this, SVX_RES( TB_ITEMS ) ),
303 		m_aItemList		( this, _eGroup, SVX_RES( LB_ITEMS ) ),
304 		m_pNaviWin		( _pNaviWin ),
305 		m_bHasModel		( false ),
306 		m_eGroup		( _eGroup ),
307 		m_TbxImageList	( SVX_RES( IL_TBX_BMPS ) ),
308 		m_TbxHCImageList( SVX_RES( IL_TBX_BMPS_HC ) )
309 
310 	{
311 		FreeResource();
312 
313 		const ImageList& rImageList =
314 			GetBackground().GetColor().IsDark() ? m_TbxHCImageList : m_TbxImageList;
315 		m_aToolBox.SetItemImage( TBI_ITEM_ADD, rImageList.GetImage( IID_ITEM_ADD ) );
316 		m_aToolBox.SetItemImage( TBI_ITEM_ADD_ELEMENT, rImageList.GetImage( IID_ITEM_ADD_ELEMENT ) );
317 		m_aToolBox.SetItemImage( TBI_ITEM_ADD_ATTRIBUTE, rImageList.GetImage( IID_ITEM_ADD_ATTRIBUTE ) );
318 		m_aToolBox.SetItemImage( TBI_ITEM_EDIT, rImageList.GetImage( IID_ITEM_EDIT ) );
319 		m_aToolBox.SetItemImage( TBI_ITEM_REMOVE, rImageList.GetImage( IID_ITEM_REMOVE ) );
320 
321 		if ( DGTInstance == m_eGroup )
322 		    m_aToolBox.RemoveItem( m_aToolBox.GetItemPos( TBI_ITEM_ADD ) );
323 		else
324 		{
325 		    m_aToolBox.RemoveItem( m_aToolBox.GetItemPos( TBI_ITEM_ADD_ELEMENT ) );
326 		    m_aToolBox.RemoveItem( m_aToolBox.GetItemPos( TBI_ITEM_ADD_ATTRIBUTE ) );
327 
328 			if ( DGTSubmission == m_eGroup )
329 			{
330 				m_aToolBox.SetItemText( TBI_ITEM_ADD, SVX_RESSTR( RID_STR_DATANAV_ADD_SUBMISSION ) );
331 				m_aToolBox.SetItemText( TBI_ITEM_EDIT, SVX_RESSTR( RID_STR_DATANAV_EDIT_SUBMISSION ) );
332 				m_aToolBox.SetItemText( TBI_ITEM_REMOVE, SVX_RESSTR( RID_STR_DATANAV_REMOVE_SUBMISSION ) );
333 			}
334 			else
335 			{
336 				m_aToolBox.SetItemText( TBI_ITEM_ADD, SVX_RESSTR( RID_STR_DATANAV_ADD_BINDING ) );
337 				m_aToolBox.SetItemText( TBI_ITEM_EDIT, SVX_RESSTR( RID_STR_DATANAV_EDIT_BINDING ) );
338 				m_aToolBox.SetItemText( TBI_ITEM_REMOVE, SVX_RESSTR( RID_STR_DATANAV_REMOVE_BINDING ) );
339 			}
340 		}
341 
342 		const Size aTbxSz( m_aToolBox.CalcWindowSizePixel() );
343 		m_aToolBox.SetSizePixel( aTbxSz );
344 	    m_aToolBox.SetOutStyle( SvtMiscOptions().GetToolboxStyle() );
345 		m_aToolBox.SetSelectHdl( LINK( this, XFormsPage, TbxSelectHdl ) );
346 		Point aPos = m_aItemList.GetPosPixel();
347 		aPos.Y() = aTbxSz.Height();
348 		m_aItemList.SetPosPixel( aPos );
349 
350 		m_aItemList.SetSelectHdl( LINK( this, XFormsPage, ItemSelectHdl ) );
351 		m_aItemList.SetNodeDefaultImages();
352 		WinBits nBits = WB_BORDER | WB_TABSTOP | WB_HIDESELECTION | WB_NOINITIALSELECTION;
353 		if ( DGTInstance == m_eGroup || DGTSubmission == m_eGroup )
354 			nBits |= WB_HASBUTTONS | WB_HASLINES | WB_HASLINESATROOT | WB_HASBUTTONSATROOT;
355 		m_aItemList.SetStyle( m_aItemList.GetStyle() | nBits  );
356 		m_aItemList.Show();
357 		ItemSelectHdl( &m_aItemList );
358 	}
359 	//------------------------------------------------------------------------
360 	XFormsPage::~XFormsPage()
361 	{
362 	}
363 	//------------------------------------------------------------------------
364 	IMPL_LINK( XFormsPage, TbxSelectHdl, ToolBox *, EMPTYARG )
365 	{
366 		DoToolBoxAction( m_aToolBox.GetCurItemId() );
367 		return 0;
368 	}
369 	//------------------------------------------------------------------------
370 	IMPL_LINK( XFormsPage, ItemSelectHdl, DataTreeListBox *, EMPTYARG )
371 	{
372 		EnableMenuItems( NULL );
373 		return 0;
374 	}
375 	//------------------------------------------------------------------------
376 	void XFormsPage::AddChildren(
377 		SvLBoxEntry* _pParent, const ImageList& _rImgLst,
378 		const Reference< css::xml::dom::XNode >& _xNode )
379 	{
380 		DBG_ASSERT( m_xUIHelper.is(), "XFormsPage::AddChildren(): invalid UIHelper" );
381 
382 		try
383 		{
384 			Reference< css::xml::dom::XNodeList > xNodeList = _xNode->getChildNodes();
385 			if ( xNodeList.is() )
386 			{
387 				bool bShowDetails = m_pNaviWin->IsShowDetails();
388 				sal_Int32 i, nNodeCount = xNodeList->getLength();
389 				for ( i = 0; i < nNodeCount; ++i )
390 				{
391 					Reference< css::xml::dom::XNode > xChild = xNodeList->item(i);
392 					css::xml::dom::NodeType eChildType = xChild->getNodeType();
393 					Image aExpImg, aCollImg;
394 					switch ( eChildType )
395 					{
396 					    case css::xml::dom::NodeType_ATTRIBUTE_NODE:
397 							aExpImg = aCollImg = _rImgLst.GetImage( IID_ATTRIBUTE );
398 							break;
399 					    case css::xml::dom::NodeType_ELEMENT_NODE:
400 							aExpImg = aCollImg = _rImgLst.GetImage( IID_ELEMENT );
401 							break;
402 						case css::xml::dom::NodeType_TEXT_NODE:
403 							aExpImg = aCollImg = _rImgLst.GetImage( IID_TEXT );
404 							break;
405 						default:
406 							aExpImg = aCollImg = _rImgLst.GetImage( IID_OTHER );
407 					}
408 
409 					::rtl::OUString sName = m_xUIHelper->getNodeDisplayName( xChild, bShowDetails );
410 					if ( sName.getLength() > 0 )
411 					{
412 						ItemNode* pNode = new ItemNode( xChild );
413 						SvLBoxEntry* pEntry = m_aItemList.InsertEntry(
414 							sName, aExpImg, aCollImg, _pParent, sal_False, LIST_APPEND, pNode );
415 						if ( xChild->hasAttributes() )
416 						{
417 							Reference< css::xml::dom::XNamedNodeMap > xMap = xChild->getAttributes();
418 							if ( xMap.is() )
419 							{
420 								aExpImg = aCollImg = _rImgLst.GetImage( IID_ATTRIBUTE );
421 								sal_Int32 j, nMapLen = xMap->getLength();
422 								for ( j = 0; j < nMapLen; ++j )
423 								{
424 									Reference< css::xml::dom::XNode > xAttr = xMap->item(j);
425 									pNode = new ItemNode( xAttr );
426 									::rtl::OUString sAttrName =
427 										m_xUIHelper->getNodeDisplayName( xAttr, bShowDetails );
428 									m_aItemList.InsertEntry(
429 										sAttrName, aExpImg, aCollImg,
430 										pEntry, sal_False, LIST_APPEND, pNode );
431 								}
432 							}
433 						}
434 						if ( xChild->hasChildNodes() )
435 							AddChildren( pEntry, _rImgLst, xChild );
436 					}
437 				}
438 			}
439 		}
440         catch( Exception& )
441 		{
442             DBG_UNHANDLED_EXCEPTION();
443 		}
444 	}
445 	//------------------------------------------------------------------------
446 	bool XFormsPage::DoToolBoxAction( sal_uInt16 _nToolBoxID ) {
447 
448 		bool bHandled = false;
449         bool bIsDocModified = false;
450         m_pNaviWin->DisableNotify( true );
451 
452         switch ( _nToolBoxID )
453         {
454         case TBI_ITEM_ADD:
455         case TBI_ITEM_ADD_ELEMENT:
456         case TBI_ITEM_ADD_ATTRIBUTE:
457 		{
458 			bHandled = true;
459 			Reference< css::xforms::XModel > xModel( m_xUIHelper, UNO_QUERY );
460 			DBG_ASSERT( xModel.is(), "XFormsPage::DoToolBoxAction(): Action without model" );
461 			if ( DGTSubmission == m_eGroup )
462 			{
463 				AddSubmissionDialog aDlg( this, NULL, m_xUIHelper );
464 				if ( aDlg.Execute() == RET_OK && aDlg.GetNewSubmission().is() )
465 				{
466 					try
467 					{
468 						Reference< css::xforms::XSubmission > xNewSubmission = aDlg.GetNewSubmission();
469 						Reference< XSet > xSubmissions( xModel->getSubmissions(), UNO_QUERY );
470 						xSubmissions->insert( makeAny( xNewSubmission ) );
471 						Reference< XPropertySet > xNewPropSet( xNewSubmission, UNO_QUERY );
472 						SvLBoxEntry* pEntry = AddEntry( xNewPropSet );
473 						m_aItemList.Select( pEntry, sal_True );
474                         bIsDocModified = true;
475 					}
476 					catch ( Exception& )
477 					{
478 						DBG_ERRORFILE( "XFormsPage::DoToolBoxAction(): exception while adding submission" );
479 					}
480 				}
481 			}
482 			else
483 			{
484 				DataItemType eType = DITElement;
485 				SvLBoxEntry* pEntry = m_aItemList.FirstSelected();
486 				ItemNode* pNode = NULL;
487 				Reference< css::xml::dom::XNode > xParentNode;
488 				Reference< XPropertySet > xNewBinding;
489 				sal_uInt16 nResId = 0;
490 				bool bIsElement = true;
491 				if ( DGTInstance == m_eGroup )
492 				{
493                     if ( m_sInstanceURL.Len() > 0 )
494                     {
495                         LinkedInstanceWarningBox aMsgBox( this );
496                         if ( aMsgBox.Execute() != RET_OK )
497                             return bHandled;
498                     }
499 
500                     DBG_ASSERT( pEntry, "XFormsPage::DoToolBoxAction(): no entry" );
501 					ItemNode* pParentNode = static_cast< ItemNode* >( pEntry->GetUserData() );
502 					DBG_ASSERT( pParentNode, "XFormsPage::DoToolBoxAction(): no parent node" );
503 					xParentNode = pParentNode->m_xNode;
504 					Reference< css::xml::dom::XNode > xNewNode;
505 					if ( TBI_ITEM_ADD_ELEMENT == _nToolBoxID )
506 					{
507 						try
508 						{
509 							nResId = RID_STR_DATANAV_ADD_ELEMENT;
510 							xNewNode = m_xUIHelper->createElement( xParentNode, NEW_ELEMENT );
511 						}
512 						catch ( Exception& )
513 						{
514 							DBG_ERRORFILE( "XFormsPage::DoToolBoxAction(): exception while create element" );
515 						}
516 					}
517 					else
518 					{
519 						nResId = RID_STR_DATANAV_ADD_ATTRIBUTE;
520 						bIsElement = false;
521 						eType = DITAttribute;
522 						try
523 						{
524 							xNewNode = m_xUIHelper->createAttribute( xParentNode, NEW_ATTRIBUTE );
525 						}
526 						catch ( Exception& )
527 						{
528 							DBG_ERRORFILE( "XFormsPage::DoToolBoxAction(): exception while create attribute" );
529 						}
530 					}
531 
532 					try
533 					{
534 						xNewNode = xParentNode->appendChild( xNewNode );
535 					}
536 					catch ( css::xml::dom::DOMException& e )
537 					{
538 						if ( e.Code == css::xml::dom::DOMExceptionType_DOMSTRING_SIZE_ERR )
539 						{
540 							DBG_ERRORFILE( "XFormsPage::DoToolBoxAction(): domexception: size error" );
541 						}
542 						DBG_ERRORFILE( "XFormsPage::DoToolBoxAction(): domexception while append child" );
543 					}
544 					catch ( Exception& )
545 					{
546 						DBG_ERRORFILE( "XFormsPage::DoToolBoxAction(): exception while append child" );
547 					}
548 
549 					try
550 					{
551 						Reference< css::xml::dom::XNode > xPNode;
552 						if ( xNewNode.is() )
553 						 	xPNode = xNewNode->getParentNode();
554                         // attributes don't have parents in the DOM model
555 						DBG_ASSERT( TBI_ITEM_ADD_ATTRIBUTE == _nToolBoxID
556 									|| xPNode.is(), "XFormsPage::DoToolboxAction(): node not added" );
557 					}
558 					catch ( Exception& )
559 					{
560                         DBG_ERRORFILE( "XFormsPage::DoToolboxAction(): exception caught" );
561 					}
562 
563 					try
564 					{
565 						m_xUIHelper->getBindingForNode( xNewNode, sal_True );
566 					}
567 					catch ( Exception& )
568 					{
569 						DBG_ERRORFILE( "XFormsPage::DoToolBoxAction(): exception while get binding for node" );
570 					}
571 					pNode = new ItemNode( xNewNode );
572 				}
573 				else
574 				{
575 					try
576 					{
577 						nResId = RID_STR_DATANAV_ADD_BINDING;
578 						xNewBinding = xModel->createBinding();
579 						Reference< XSet > xBindings( xModel->getBindings(), UNO_QUERY );
580 						xBindings->insert( makeAny( xNewBinding ) );
581 						pNode = new ItemNode( xNewBinding );
582 						eType = DITBinding;
583 					}
584 					catch ( Exception& )
585 					{
586 						DBG_ERRORFILE( "XFormsPage::DoToolBoxAction(): exception while adding binding" );
587 					}
588 				}
589 
590 				AddDataItemDialog aDlg( this, pNode, m_xUIHelper );
591 				aDlg.SetText( SVX_RESSTR( nResId ) );
592 				aDlg.InitText( eType );
593 				short nReturn = aDlg.Execute();
594 				if (  DGTInstance == m_eGroup )
595 				{
596 					if ( RET_OK == nReturn )
597 					{
598 						SvLBoxEntry* pNewEntry = AddEntry( pNode, bIsElement );
599 						m_aItemList.MakeVisible( pNewEntry );
600 						m_aItemList.Select( pNewEntry, sal_True );
601                         bIsDocModified = true;
602 					}
603 					else
604 					{
605 						try
606 						{
607 							Reference< css::xml::dom::XNode > xPNode;
608 							Reference< css::xml::dom::XNode > xNode =
609 								xParentNode->removeChild( pNode->m_xNode );
610 							if ( xNode.is() )
611 								xPNode = xNode->getParentNode();
612 							DBG_ASSERT( !xPNode.is(), "XFormsPage::RemoveEntry(): node not removed" );
613 							delete pNode;
614 						}
615 						catch ( Exception& )
616 						{
617                             DBG_ERRORFILE( "XFormsPage::DoToolboxAction(): exception caught" );
618 						}
619 					}
620 				}
621 				else
622 				{
623 					if ( RET_OK == nReturn )
624 					{
625 						SvLBoxEntry* pNewEntry = AddEntry( xNewBinding );
626                         m_aItemList.Select( pNewEntry, sal_True );
627                         bIsDocModified = true;
628 					}
629 					else
630 					{
631 						try
632 						{
633 							Reference< XSet > xBindings( xModel->getBindings(), UNO_QUERY );
634 							xBindings->remove( makeAny( xNewBinding ) );
635 						}
636 						catch ( Exception& )
637 						{
638                             DBG_ERRORFILE( "XFormsPage::DoToolboxAction(): exception caught" );
639 						}
640 					}
641 					delete pNode;
642 				}
643 			}
644 		}
645         break;
646 
647         case TBI_ITEM_EDIT:
648 		{
649 			bHandled = true;
650 			SvLBoxEntry* pEntry = m_aItemList.FirstSelected();
651 			if ( pEntry )
652 			{
653 				if ( DGTSubmission == m_eGroup && m_aItemList.GetParent( pEntry ) )
654 					pEntry = m_aItemList.GetParent( pEntry );
655 				ItemNode* pNode = static_cast< ItemNode* >( pEntry->GetUserData() );
656 				if ( DGTInstance == m_eGroup || DGTBinding == m_eGroup )
657 				{
658                     if ( DGTInstance == m_eGroup && m_sInstanceURL.Len() > 0 )
659                     {
660                         LinkedInstanceWarningBox aMsgBox( this );
661                         if ( aMsgBox.Execute() != RET_OK )
662                             return bHandled;
663                     }
664 
665 					AddDataItemDialog aDlg( this, pNode, m_xUIHelper );
666 					DataItemType eType = DITElement;
667 					sal_uInt16 nResId = RID_STR_DATANAV_EDIT_ELEMENT;
668 					if ( pNode && pNode->m_xNode.is() )
669 					{
670 						try
671 						{
672 							css::xml::dom::NodeType eChildType = pNode->m_xNode->getNodeType();
673 							if ( eChildType == css::xml::dom::NodeType_ATTRIBUTE_NODE )
674 							{
675 								nResId = RID_STR_DATANAV_EDIT_ATTRIBUTE;
676 								eType = DITAttribute;
677 							}
678 						}
679 						catch ( Exception& )
680 						{
681                             DBG_ERRORFILE( "XFormsPage::DoToolboxAction(): exception caught" );
682 						}
683 					}
684 					else if ( DGTBinding == m_eGroup )
685 					{
686 						nResId = RID_STR_DATANAV_EDIT_BINDING;
687 						eType = DITBinding;
688 					}
689 					aDlg.SetText( SVX_RESSTR( nResId ) );
690 					aDlg.InitText( eType );
691 					if ( aDlg.Execute() == RET_OK )
692 					{
693 						// Set the new name
694 						String sNewName;
695 						if ( DGTInstance == m_eGroup )
696 						{
697 							try
698 							{
699 								sNewName = m_xUIHelper->getNodeDisplayName(
700 									pNode->m_xNode, m_pNaviWin->IsShowDetails() );
701 							}
702 							catch ( Exception& )
703 							{
704                                 DBG_ERRORFILE( "XFormsPage::DoToolboxAction(): exception caught" );
705 							}
706 						}
707 						else
708 						{
709 							try
710 							{
711 								String sDelim( RTL_CONSTASCII_STRINGPARAM( ": " ) );
712 								::rtl::OUString sTemp;
713 								pNode->m_xPropSet->getPropertyValue( PN_BINDING_ID ) >>= sTemp;
714 								sNewName += String( sTemp );
715 								sNewName += sDelim;
716 								pNode->m_xPropSet->getPropertyValue( PN_BINDING_EXPR ) >>= sTemp;
717 								sNewName += String( sTemp );
718 							}
719 							catch ( Exception& )
720 							{
721                                 DBG_ERRORFILE( "XFormsPage::DoToolboxAction(): exception caught" );
722 							}
723 						}
724 
725 						m_aItemList.SetEntryText( pEntry, sNewName );
726                         bIsDocModified = true;
727 					}
728 				}
729 				else
730 				{
731 					AddSubmissionDialog aDlg( this, pNode, m_xUIHelper );
732 					aDlg.SetText( SVX_RESSTR( RID_STR_DATANAV_EDIT_SUBMISSION ) );
733 					if ( aDlg.Execute() == RET_OK )
734                     {
735 						EditEntry( pNode->m_xPropSet );
736                         bIsDocModified = true;
737                     }
738 				}
739 			}
740 		}
741         break;
742 
743         case TBI_ITEM_REMOVE:
744         {
745 			bHandled = true;
746             if ( DGTInstance == m_eGroup && m_sInstanceURL.Len() > 0 )
747             {
748                 LinkedInstanceWarningBox aMsgBox( this );
749                 if ( aMsgBox.Execute() != RET_OK )
750                     return bHandled;
751             }
752             bIsDocModified = RemoveEntry();
753         }
754         break;
755 
756         case MID_INSERT_CONTROL:
757         {
758             OSL_ENSURE( false, "XFormsPage::DoToolboxAction: MID_INSERT_CONTROL not implemented, yet!" );
759         }
760         break;
761 
762         default:
763             OSL_ENSURE( false, "XFormsPage::DoToolboxAction: unknown ID!" );
764             break;
765         }
766 
767         m_pNaviWin->DisableNotify( false );
768 		EnableMenuItems( NULL );
769         if ( bIsDocModified )
770             m_pNaviWin->SetDocModified();
771 		return bHandled;
772 	}
773 
774 	//------------------------------------------------------------------------
775 	SvLBoxEntry* XFormsPage::AddEntry( ItemNode* _pNewNode, bool _bIsElement )
776 	{
777 		SvLBoxEntry* pParent = m_aItemList.FirstSelected();
778 		const ImageList& rImageList = GetSettings().GetStyleSettings().GetHighContrastMode()
779 			? m_pNaviWin->GetItemHCImageList()
780 			: m_pNaviWin->GetItemImageList();
781 		sal_uInt16 nImageID = ( _bIsElement ) ? IID_ELEMENT : IID_ATTRIBUTE;
782 		Image aImage = rImageList.GetImage( nImageID );
783 		::rtl::OUString sName;
784 		try
785 		{
786 			sName = m_xUIHelper->getNodeDisplayName(
787 				_pNewNode->m_xNode, m_pNaviWin->IsShowDetails() );
788 		}
789 		catch ( Exception& )
790 		{
791             DBG_UNHANDLED_EXCEPTION();
792 		}
793 		return m_aItemList.InsertEntry(
794 			sName, aImage, aImage, pParent, sal_False, LIST_APPEND, _pNewNode );
795 	}
796 	//------------------------------------------------------------------------
797     class lcl_ResourceString
798     {
799     protected:
800         lcl_ResourceString()
801         {
802         }
803 
804         lcl_ResourceString( const lcl_ResourceString& );
805 
806         virtual ~lcl_ResourceString()
807         {
808         }
809 
810         // load UI resources from resource file
811         void init()
812         {
813             // create a resource manager, for the svx resource file
814             // and the UI locale
815             ByteString aResourceFile( "svx" );
816             ResMgr* pResMgr = ResMgr::CreateResMgr(
817                 aResourceFile.GetBuffer(),
818                 Application::GetSettings().GetUILocale() );
819 
820             // load the resources for the AddSubmission modal dialog.
821             // This will create our own resource context.
822             ResId aRes( RID_SVXDLG_ADD_SUBMISSION, *pResMgr );
823             aRes.SetRT( RSC_MODALDIALOG );
824             pResMgr->GetResource( aRes );
825 
826             // now, we can access the local resources from the dialog's
827             // resource context
828             _initResources(pResMgr);
829 
830             // clean up: remove context, and delete the resource manager
831             // ( Increment(..) is needed since PopContext() requires that
832             //   the file pointer is at the end. )
833             pResMgr->Increment( pResMgr->GetRemainSize() );
834             pResMgr->PopContext();
835             delete pResMgr;
836         }
837 
838         // load resources... to be overloaded in sub-classes
839         virtual void _initResources( ResMgr* pMgr ) = 0;
840     };
841 
842     class lcl_ReplaceString : public lcl_ResourceString
843     {
844         rtl::OUString m_sDoc_UI;
845         rtl::OUString m_sInstance_UI;
846         rtl::OUString m_sNone_UI;
847 
848         rtl::OUString m_sDoc_API;
849         rtl::OUString m_sInstance_API;
850         rtl::OUString m_sNone_API;
851 
852         lcl_ReplaceString() :
853             lcl_ResourceString(),
854             m_sDoc_API(      RTL_CONSTASCII_USTRINGPARAM("all") ),
855             m_sInstance_API( RTL_CONSTASCII_USTRINGPARAM("instance") ),
856             m_sNone_API(     RTL_CONSTASCII_USTRINGPARAM("none") )
857         {
858             init();
859         }
860 
861         lcl_ReplaceString( const lcl_ReplaceString& );
862 
863         virtual ~lcl_ReplaceString()
864         {
865         }
866 
867         // load UI resources from resource file
868         virtual void _initResources( ResMgr * pMgr )
869         {
870             // now, we can access the local resources from the dialog's
871             // resource context
872             m_sDoc_UI      = String( ResId( STR_REPLACE_DOC, *pMgr ) );
873             m_sInstance_UI = String( ResId( STR_REPLACE_INST, *pMgr ) );
874             m_sNone_UI     = String( ResId( STR_REPLACE_NONE, *pMgr ) );
875         }
876 
877     public:
878 
879         /** create and obtain the singleton instance */
880         static const lcl_ReplaceString& get()
881         {
882             // keep the singleton instance here
883             static lcl_ReplaceString* m_pInstance = NULL;
884 
885             if( m_pInstance == NULL )
886                 m_pInstance = new lcl_ReplaceString();
887             return *m_pInstance;
888         }
889 
890         /** convert submission replace string from API value to UI value.
891             Use 'none' as default. */
892         rtl::OUString toUI( const rtl::OUString& rStr ) const
893         {
894             if( rStr == m_sDoc_API )
895                 return m_sDoc_UI;
896             else if( rStr == m_sInstance_API )
897                 return m_sInstance_UI;
898             else
899                 return m_sNone_UI;
900         }
901 
902         /** convert submission replace string from UI to API.
903             Use 'none' as default. */
904         rtl::OUString toAPI( const rtl::OUString& rStr ) const
905         {
906             if( rStr == m_sDoc_UI )
907                 return m_sDoc_API;
908             else if( rStr == m_sInstance_UI )
909                 return m_sInstance_API;
910             else
911                 return m_sNone_API;
912         }
913     };
914 
915     class lcl_MethodString : public lcl_ResourceString
916     {
917         rtl::OUString m_sPost_UI;
918         rtl::OUString m_sPut_UI;
919         rtl::OUString m_sGet_UI;
920 
921         rtl::OUString m_sPost_API;
922         rtl::OUString m_sPut_API;
923         rtl::OUString m_sGet_API;
924 
925         lcl_MethodString() :
926             lcl_ResourceString(),
927             m_sPost_API( RTL_CONSTASCII_USTRINGPARAM("post") ),
928             m_sPut_API(  RTL_CONSTASCII_USTRINGPARAM("put") ),
929             m_sGet_API(  RTL_CONSTASCII_USTRINGPARAM("get") )
930         {
931             init();
932         }
933 
934         lcl_MethodString( const lcl_MethodString& );
935 
936         virtual ~lcl_MethodString()
937         {
938         }
939 
940         // load UI resources from resource file
941         virtual void _initResources(ResMgr* pMgr)
942         {
943             m_sPost_UI = String( ResId( STR_METHOD_POST, *pMgr ) );
944             m_sPut_UI  = String( ResId( STR_METHOD_PUT, *pMgr ) );
945             m_sGet_UI  = String( ResId( STR_METHOD_GET, *pMgr ) );
946         }
947 
948     public:
949 
950         /** create and obtain the singleton instance */
951         static const lcl_MethodString& get()
952         {
953             // keep the singleton instance here
954             static lcl_MethodString* m_pInstance = NULL;
955 
956             if( m_pInstance == NULL )
957                 m_pInstance = new lcl_MethodString();
958             return *m_pInstance;
959         }
960 
961         /** convert from API to UI; put is default. */
962         rtl::OUString toUI( const rtl::OUString& rStr ) const
963         {
964             if( rStr == m_sGet_API )
965                 return m_sGet_UI;
966             else if( rStr == m_sPost_API )
967                 return m_sPost_UI;
968             else
969                 return m_sPut_UI;
970         }
971 
972         /** convert from UI to API; put is default */
973         rtl::OUString toAPI( const rtl::OUString& rStr ) const
974         {
975             if( rStr == m_sGet_UI )
976                 return m_sGet_API;
977             else if( rStr == m_sPost_UI )
978                 return m_sPost_API;
979             else
980                 return m_sPut_API;
981         }
982     };
983 
984 	//------------------------------------------------------------------------
985 	SvLBoxEntry* XFormsPage::AddEntry( const Reference< XPropertySet >& _rEntry )
986 	{
987 		SvLBoxEntry* pEntry = NULL;
988 		const ImageList& rImageList = GetSettings().GetStyleSettings().GetHighContrastMode()
989 			? m_pNaviWin->GetItemHCImageList()
990 			: m_pNaviWin->GetItemImageList();
991 		Image aImage = rImageList.GetImage( IID_ELEMENT );
992 
993 		ItemNode* pNode = new ItemNode( _rEntry );
994 		rtl::OUString sTemp;
995 
996 		if ( DGTSubmission == m_eGroup )
997 		{
998 			try
999 			{
1000 				// ID
1001 				_rEntry->getPropertyValue( PN_SUBMISSION_ID ) >>= sTemp;
1002 				pEntry = m_aItemList.InsertEntry( sTemp, aImage, aImage, NULL, sal_False, LIST_APPEND, pNode );
1003 				// Action
1004 				_rEntry->getPropertyValue( PN_SUBMISSION_ACTION ) >>= sTemp;
1005 				String sEntry = SVX_RESSTR( RID_STR_DATANAV_SUBM_ACTION );
1006 				sEntry += String( sTemp );
1007 				m_aItemList.InsertEntry( sEntry, aImage, aImage, pEntry );
1008 				// Method
1009 				_rEntry->getPropertyValue( PN_SUBMISSION_METHOD ) >>= sTemp;
1010 				sEntry = SVX_RESSTR( RID_STR_DATANAV_SUBM_METHOD );
1011 				sEntry += String( lcl_MethodString::get().toUI( sTemp ) );
1012 				m_aItemList.InsertEntry( sEntry, aImage, aImage, pEntry );
1013 				// Ref
1014 				_rEntry->getPropertyValue( PN_SUBMISSION_REF ) >>= sTemp;
1015 				sEntry = SVX_RESSTR( RID_STR_DATANAV_SUBM_REF );
1016 				sEntry += String( sTemp );
1017 				m_aItemList.InsertEntry( sEntry, aImage, aImage, pEntry );
1018 				// Bind
1019 				_rEntry->getPropertyValue( PN_SUBMISSION_BIND ) >>= sTemp;
1020 				sEntry = SVX_RESSTR( RID_STR_DATANAV_SUBM_BIND );
1021 				sEntry += String( sTemp );
1022 				m_aItemList.InsertEntry( sEntry, aImage, aImage, pEntry );
1023 				// Replace
1024 				_rEntry->getPropertyValue( PN_SUBMISSION_REPLACE ) >>= sTemp;
1025 				sEntry = SVX_RESSTR( RID_STR_DATANAV_SUBM_REPLACE );
1026 				sEntry += String( lcl_ReplaceString::get().toUI( sTemp ) );
1027 				m_aItemList.InsertEntry( sEntry, aImage, aImage, pEntry );
1028 			}
1029 			catch ( Exception& )
1030 			{
1031                 DBG_ERRORFILE( "XFormsPage::AddEntry(Ref): exception caught" );
1032 			}
1033 		}
1034 		else // then Binding Page
1035 		{
1036 			try
1037 			{
1038 				String sDelim( RTL_CONSTASCII_STRINGPARAM( ": " ) );
1039 				::rtl::OUString sName;
1040 				_rEntry->getPropertyValue( PN_BINDING_ID ) >>= sTemp;
1041 				sName += String( sTemp );
1042 				sName += sDelim;
1043 				_rEntry->getPropertyValue( PN_BINDING_EXPR ) >>= sTemp;
1044 				sName += String( sTemp );
1045 				pEntry = m_aItemList.InsertEntry(
1046 					sName, aImage, aImage, NULL, sal_False, LIST_APPEND, pNode );
1047 			}
1048 			catch ( Exception& )
1049 			{
1050                 DBG_ERRORFILE( "XFormsPage::AddEntry(Ref): exception caught" );
1051 			}
1052 		}
1053 
1054 		return pEntry;
1055 	}
1056 
1057 	//------------------------------------------------------------------------
1058 	void XFormsPage::EditEntry( const Reference< XPropertySet >& _rEntry )
1059 	{
1060 		SvLBoxEntry* pEntry = NULL;
1061 		rtl::OUString sTemp;
1062 
1063 		if ( DGTSubmission == m_eGroup )
1064 		{
1065 			try
1066 			{
1067 				pEntry = m_aItemList.FirstSelected();
1068 
1069                 // #i36262# may be called for submission entry *or* for
1070                 // submission children. If we don't have any children, we
1071                 // assume the latter case and use the parent
1072                 if( m_aItemList.GetEntry( pEntry, 0 ) == NULL )
1073                 {
1074                     pEntry = m_aItemList.GetModel()->GetParent( pEntry );
1075                 }
1076 
1077 				_rEntry->getPropertyValue( PN_SUBMISSION_ID ) >>= sTemp;
1078 				m_aItemList.SetEntryText( pEntry, sTemp );
1079 
1080 				_rEntry->getPropertyValue( PN_SUBMISSION_BIND ) >>= sTemp;
1081 				String sEntry = SVX_RESSTR( RID_STR_DATANAV_SUBM_BIND );
1082 				sEntry += String( sTemp );
1083 				sal_uIntPtr nPos = 0;
1084 				SvLBoxEntry* pChild = m_aItemList.GetEntry( pEntry, nPos++ );
1085 				m_aItemList.SetEntryText( pChild, sEntry );
1086 				_rEntry->getPropertyValue( PN_SUBMISSION_REF ) >>= sTemp;
1087 				sEntry = SVX_RESSTR( RID_STR_DATANAV_SUBM_REF );
1088 				sEntry += String( sTemp );
1089 				pChild = m_aItemList.GetEntry( pEntry, nPos++ );
1090 				m_aItemList.SetEntryText( pChild, sEntry );
1091 				_rEntry->getPropertyValue( PN_SUBMISSION_ACTION ) >>= sTemp;
1092 				sEntry = SVX_RESSTR( RID_STR_DATANAV_SUBM_ACTION );
1093 				sEntry += String( sTemp );
1094 				pChild = m_aItemList.GetEntry( pEntry, nPos++ );
1095 				m_aItemList.SetEntryText( pChild, sEntry );
1096 				_rEntry->getPropertyValue( PN_SUBMISSION_METHOD ) >>= sTemp;
1097 				sEntry = SVX_RESSTR( RID_STR_DATANAV_SUBM_METHOD );
1098 				sEntry += String( lcl_MethodString::get().toUI( sTemp ) );
1099 				pChild = m_aItemList.GetEntry( pEntry, nPos++ );
1100 				m_aItemList.SetEntryText( pChild, sEntry );
1101 				_rEntry->getPropertyValue( PN_SUBMISSION_REPLACE ) >>= sTemp;
1102 				sEntry = SVX_RESSTR( RID_STR_DATANAV_SUBM_REPLACE );
1103 				sEntry += String( lcl_ReplaceString::get().toUI( sTemp ) );
1104 				pChild = m_aItemList.GetEntry( pEntry, nPos++ );
1105 				m_aItemList.SetEntryText( pChild, sEntry );
1106 			}
1107 			catch ( Exception& )
1108 			{
1109                 DBG_ERRORFILE( "XFormsPage::EditEntry(): exception caught" );
1110 			}
1111 		}
1112 	}
1113 
1114 	//------------------------------------------------------------------------
1115     bool XFormsPage::RemoveEntry()
1116 	{
1117         bool bRet = false;
1118 		SvLBoxEntry* pEntry = m_aItemList.FirstSelected();
1119 		if ( pEntry &&
1120              ( DGTInstance != m_eGroup || m_aItemList.GetParent( pEntry ) ) )
1121 		{
1122 			Reference< css::xforms::XModel > xModel( m_xUIHelper, UNO_QUERY );
1123 			DBG_ASSERT( xModel.is(), "XFormsPage::RemoveEntry(): no model" );
1124 			ItemNode* pNode = static_cast< ItemNode* >( pEntry->GetUserData() );
1125 			DBG_ASSERT( pNode, "XFormsPage::RemoveEntry(): no node" );
1126 
1127 			if ( DGTInstance == m_eGroup )
1128 			{
1129 				try
1130 				{
1131 					DBG_ASSERT( pNode->m_xNode.is(), "XFormsPage::RemoveEntry(): no XNode" );
1132 					css::xml::dom::NodeType eChildType = pNode->m_xNode->getNodeType();
1133 					bool bIsElement = ( eChildType == css::xml::dom::NodeType_ELEMENT_NODE );
1134 					sal_uInt16 nResId = bIsElement ? RID_QRY_REMOVE_ELEMENT : RID_QRY_REMOVE_ATTRIBUTE;
1135 					String sVar = bIsElement ? ELEMENTNAME : ATTRIBUTENAME;
1136 					QueryBox aQBox( this, SVX_RES( nResId ) );
1137 					String sMessText = aQBox.GetMessText();
1138 					sMessText.SearchAndReplace(
1139 						sVar, m_xUIHelper->getNodeDisplayName( pNode->m_xNode, sal_False ) );
1140 					aQBox.SetMessText( sMessText );
1141 					if ( aQBox.Execute() == RET_YES )
1142 					{
1143 						SvLBoxEntry* pParent = m_aItemList.GetParent( pEntry );
1144 						DBG_ASSERT( pParent, "XFormsPage::RemoveEntry(): no parent entry" );
1145 						ItemNode* pParentNode = static_cast< ItemNode* >( pParent->GetUserData() );
1146 						DBG_ASSERT( pParentNode && pParentNode->m_xNode.is(), "XFormsPage::RemoveEntry(): no parent XNode" );
1147 
1148 						Reference< css::xml::dom::XNode > xPNode;
1149 						Reference< css::xml::dom::XNode > xNode =
1150 							pParentNode->m_xNode->removeChild( pNode->m_xNode );
1151 						if ( xNode.is() )
1152 							xPNode = xNode->getParentNode();
1153 						DBG_ASSERT( !xPNode.is(), "XFormsPage::RemoveEntry(): node not removed" );
1154                         bRet = true;
1155 					}
1156 				}
1157 				catch ( Exception& )
1158 				{
1159                     DBG_ERRORFILE( "XFormsPage::RemoveEntry(): exception caught" );
1160 				}
1161 			}
1162 			else
1163 			{
1164                 DBG_ASSERT( pNode->m_xPropSet.is(), "XFormsPage::RemoveEntry(): no propset" );
1165                 bool bSubmission = ( DGTSubmission == m_eGroup );
1166                 sal_uInt16 nResId = bSubmission ? RID_QRY_REMOVE_SUBMISSION : RID_QRY_REMOVE_BINDING;
1167                 rtl::OUString sProperty = bSubmission ? PN_SUBMISSION_ID : PN_BINDING_ID;
1168                 String sSearch = bSubmission ? SUBMISSIONNAME : BINDINGNAME;
1169                 rtl::OUString sName;
1170                 try
1171                 {
1172                     pNode->m_xPropSet->getPropertyValue( sProperty ) >>= sName;
1173                 }
1174                 catch ( Exception& )
1175                 {
1176                     DBG_ERRORFILE( "XFormsPage::RemoveEntry(): exception caught" );
1177                 }
1178                 QueryBox aQBox( this, SVX_RES( nResId ) );
1179                 String sMessText = aQBox.GetMessText();
1180                 sMessText.SearchAndReplace( sSearch, String( sName ) );
1181                 aQBox.SetMessText( sMessText );
1182                 if ( aQBox.Execute() == RET_YES )
1183                 {
1184                     try
1185                     {
1186                         if ( bSubmission )
1187                             xModel->getSubmissions()->remove( makeAny( pNode->m_xPropSet ) );
1188                         else // then Binding Page
1189                             xModel->getBindings()->remove( makeAny( pNode->m_xPropSet ) );
1190                         bRet = true;
1191                     }
1192                     catch ( Exception& )
1193                     {
1194                         DBG_ERRORFILE( "XFormsPage::RemoveEntry(): exception caught" );
1195                     }
1196                 }
1197 			}
1198 
1199             if ( bRet )
1200                 m_aItemList.RemoveEntry( pEntry );
1201 		}
1202 
1203         return bRet;
1204 	}
1205 
1206 	//------------------------------------------------------------------------
1207 	long XFormsPage::Notify( NotifyEvent& rNEvt )
1208 	{
1209 		long nHandled = 0;
1210 
1211 		if ( rNEvt.GetType() == EVENT_KEYINPUT )
1212 		{
1213 			sal_uInt16 nCode = rNEvt.GetKeyEvent()->GetKeyCode().GetCode();
1214 
1215 			switch ( nCode )
1216 			{
1217 				case KEY_DELETE:
1218 					nHandled = DoMenuAction( TBI_ITEM_REMOVE );
1219 					break;
1220 			}
1221 		}
1222 
1223 		return nHandled ? nHandled : Window::Notify( rNEvt );
1224 	}
1225 	//------------------------------------------------------------------------
1226 	void XFormsPage::Resize()
1227 	{
1228 		Size aSize = GetOutputSizePixel();
1229 		Size aTbxSize = m_aToolBox.GetSizePixel();
1230 		aTbxSize.Width() = aSize.Width();
1231 		m_aToolBox.SetSizePixel( aTbxSize );
1232 		aSize.Width() -= 4;
1233 		aSize.Height() -= ( 4 + aTbxSize.Height() );
1234 		m_aItemList.SetPosSizePixel( Point( 2, 2 + aTbxSize.Height() ), aSize );
1235 	}
1236 	//------------------------------------------------------------------------
1237     String XFormsPage::SetModel( const Reference< css::xforms::XModel >& _xModel, sal_uInt16 _nPagePos )
1238 	{
1239 		DBG_ASSERT( _xModel.is(), "XFormsPage::SetModel(): invalid model" );
1240 
1241 		m_xUIHelper = Reference< css::xforms::XFormsUIHelper1 >( _xModel, UNO_QUERY );
1242 		String sRet;
1243 		m_bHasModel = true;
1244 		const ImageList& rImageList = GetSettings().GetStyleSettings().GetHighContrastMode()
1245 			? m_pNaviWin->GetItemHCImageList()
1246 			: m_pNaviWin->GetItemImageList();
1247 
1248 		switch ( m_eGroup )
1249 		{
1250 			case DGTInstance :
1251 			{
1252                 DBG_ASSERT( _nPagePos != TAB_PAGE_NOTFOUND, "XFormsPage::SetModel(): invalid page position" );
1253 				try
1254 				{
1255                     Reference< XContainer > xContainer( _xModel->getInstances(), UNO_QUERY );
1256                     if ( xContainer.is() )
1257                         m_pNaviWin->AddContainerBroadcaster( xContainer );
1258 
1259 					sal_uInt16 nIter = 0;
1260 					Reference< XEnumerationAccess > xNumAccess( _xModel->getInstances(), UNO_QUERY );
1261 					if ( xNumAccess.is() )
1262 					{
1263 						Reference < XEnumeration > xNum = xNumAccess->createEnumeration();
1264 						if ( xNum.is() && xNum->hasMoreElements() )
1265 						{
1266 							while ( xNum->hasMoreElements() )
1267 							{
1268                                 if ( nIter == _nPagePos )
1269 								{
1270 									Sequence< PropertyValue > xPropSeq;
1271 									Any aAny = xNum->nextElement();
1272 									if ( aAny >>= xPropSeq )
1273 										sRet = LoadInstance( xPropSeq, rImageList );
1274 									else
1275 									{
1276 										DBG_ERRORFILE( "XFormsPage::SetModel(): invalid instance" );
1277 									}
1278 									break;
1279 								}
1280 								else
1281 								{
1282 									xNum->nextElement();
1283 									nIter++;
1284 								}
1285 							}
1286 						}
1287 					}
1288 				}
1289 			    catch( Exception& )
1290 				{
1291 					DBG_ERRORFILE( "XFormsPage::SetModel(): exception caught" );
1292 				}
1293 				break;
1294 			}
1295 
1296 			case DGTSubmission :
1297 			{
1298                 DBG_ASSERT( TAB_PAGE_NOTFOUND == _nPagePos, "XFormsPage::SetModel(): invalid page position" );
1299 				try
1300 				{
1301                     Reference< XContainer > xContainer( _xModel->getSubmissions(), UNO_QUERY );
1302                     if ( xContainer.is() )
1303                         m_pNaviWin->AddContainerBroadcaster( xContainer );
1304 
1305                     Reference< XEnumerationAccess > xNumAccess( _xModel->getSubmissions(), UNO_QUERY );
1306 					if ( xNumAccess.is() )
1307 					{
1308 						Reference < XEnumeration > xNum = xNumAccess->createEnumeration();
1309 						if ( xNum.is() && xNum->hasMoreElements() )
1310 						{
1311 							while ( xNum->hasMoreElements() )
1312 							{
1313 								Reference< XPropertySet > xPropSet;
1314 								Any aAny = xNum->nextElement();
1315 								if ( aAny >>= xPropSet )
1316 									AddEntry( xPropSet );
1317 							}
1318 						}
1319 					}
1320 				}
1321 			    catch( Exception& )
1322 				{
1323 					DBG_ERRORFILE( "XFormsPage::SetModel(): exception caught" );
1324 				}
1325 				break;
1326 			}
1327 
1328 			case DGTBinding :
1329 			{
1330                 DBG_ASSERT( TAB_PAGE_NOTFOUND == _nPagePos, "XFormsPage::SetModel(): invalid page position" );
1331 				try
1332 				{
1333                     Reference< XContainer > xContainer( _xModel->getBindings(), UNO_QUERY );
1334                     if ( xContainer.is() )
1335                         m_pNaviWin->AddContainerBroadcaster( xContainer );
1336 
1337 					Reference< XEnumerationAccess > xNumAccess( _xModel->getBindings(), UNO_QUERY );
1338 					if ( xNumAccess.is() )
1339 					{
1340 						Reference < XEnumeration > xNum = xNumAccess->createEnumeration();
1341 						if ( xNum.is() && xNum->hasMoreElements() )
1342 						{
1343 							Image aImage1 = rImageList.GetImage( IID_ELEMENT );
1344 							Image aImage2 = rImageList.GetImage( IID_ELEMENT );
1345 							String sDelim( RTL_CONSTASCII_STRINGPARAM( ": " ) );
1346 							while ( xNum->hasMoreElements() )
1347 							{
1348 								Reference< XPropertySet > xPropSet;
1349 								Any aAny = xNum->nextElement();
1350 								if ( aAny >>= xPropSet )
1351 								{
1352 									String sEntry;
1353 									rtl::OUString sTemp;
1354 									xPropSet->getPropertyValue( PN_BINDING_ID ) >>= sTemp;
1355 									sEntry += String( sTemp );
1356 									sEntry += sDelim;
1357 									xPropSet->getPropertyValue( PN_BINDING_EXPR ) >>= sTemp;
1358 									sEntry += String( sTemp );
1359 
1360 									ItemNode* pNode = new ItemNode( xPropSet );
1361 									m_aItemList.InsertEntry(
1362 										sEntry, aImage1, aImage2, NULL, sal_False, LIST_APPEND, pNode );
1363 								}
1364 							}
1365 						}
1366 					}
1367 				}
1368 			    catch( Exception& )
1369 				{
1370 					DBG_ERRORFILE( "XFormsPage::SetModel(): exception caught" );
1371 				}
1372 				break;
1373 			}
1374             default:
1375                 DBG_ERROR( "XFormsPage::SetModel: unknown group!" );
1376                 break;
1377 		}
1378 
1379         EnableMenuItems( NULL );
1380 
1381         return sRet;
1382 	}
1383 	//------------------------------------------------------------------------
1384 	void XFormsPage::ClearModel()
1385 	{
1386 		m_bHasModel = false;
1387 		m_aItemList.DeleteAndClear();
1388 	}
1389 	//------------------------------------------------------------------------
1390 	String XFormsPage::LoadInstance(
1391 		const Sequence< PropertyValue >& _xPropSeq, const ImageList& _rImgLst )
1392 	{
1393 		String sRet;
1394 		rtl::OUString sTemp;
1395 		rtl::OUString sInstModel = PN_INSTANCE_MODEL;
1396 		rtl::OUString sInstName = PN_INSTANCE_ID;
1397         rtl::OUString sInstURL = PN_INSTANCE_URL;
1398 		const PropertyValue* pProps = _xPropSeq.getConstArray();
1399 		const PropertyValue* pPropsEnd = pProps + _xPropSeq.getLength();
1400 		for ( ; pProps != pPropsEnd; ++pProps )
1401 		{
1402 			if ( sInstModel.compareTo( pProps->Name ) == 0 )
1403 			{
1404 				Reference< css::xml::dom::XNode > xRoot;
1405 				if ( pProps->Value >>= xRoot )
1406 				{
1407 					try
1408 					{
1409                         Reference< XEventTarget > xTarget( xRoot, UNO_QUERY );
1410                         if ( xTarget.is() )
1411                             m_pNaviWin->AddEventBroadcaster( xTarget );
1412 
1413                     #if OSL_DEBUG_LEVEL > 0
1414 						css::xml::dom::NodeType eNodeType = xRoot->getNodeType(); (void)eNodeType;
1415                     #endif
1416 						::rtl::OUString sNodeName =
1417 							m_xUIHelper->getNodeDisplayName( xRoot, m_pNaviWin->IsShowDetails() );
1418 						if ( sNodeName.getLength() == 0 )
1419 							sNodeName = xRoot->getNodeName();
1420 						if ( xRoot->hasChildNodes() )
1421 							AddChildren( NULL, _rImgLst, xRoot );
1422 					}
1423 					catch ( Exception& )
1424 					{
1425                         DBG_ERRORFILE( "XFormsPage::LoadInstance(): exception caught" );
1426 					}
1427 				}
1428 			}
1429 			else if ( sInstName.compareTo( pProps->Name ) == 0 && ( pProps->Value >>= sTemp ) )
1430 				m_sInstanceName = sRet = sTemp;
1431 			else if ( sInstURL.compareTo( pProps->Name ) == 0 && ( pProps->Value >>= sTemp ) )
1432 				m_sInstanceURL = sTemp;
1433 		}
1434 
1435 		return sRet;
1436 	}
1437 
1438 	//------------------------------------------------------------------------
1439 	bool XFormsPage::DoMenuAction( sal_uInt16 _nMenuID )
1440 	{
1441 		return DoToolBoxAction( _nMenuID );
1442 	}
1443 
1444 	//------------------------------------------------------------------------
1445 	void XFormsPage::EnableMenuItems( Menu* _pMenu )
1446 	{
1447 		sal_Bool bEnableAdd = sal_False;
1448 		sal_Bool bEnableEdit = sal_False;
1449 		sal_Bool bEnableRemove = sal_False;
1450 
1451 		SvLBoxEntry* pEntry = m_aItemList.FirstSelected();
1452 		if ( pEntry )
1453 		{
1454 			bEnableAdd = sal_True;
1455 			bool bSubmitChild = false;
1456 			if ( DGTSubmission == m_eGroup && m_aItemList.GetParent( pEntry ) )
1457 			{
1458 				pEntry = m_aItemList.GetParent( pEntry );
1459 				bSubmitChild = true;
1460 			}
1461 			ItemNode* pNode = static_cast< ItemNode* >( pEntry->GetUserData() );
1462 			if ( pNode && ( pNode->m_xNode.is() || pNode->m_xPropSet.is() ) )
1463 			{
1464 				bEnableEdit = sal_True;
1465 				bEnableRemove = ( bSubmitChild != true );
1466 				if ( DGTInstance == m_eGroup && !m_aItemList.GetParent( pEntry ) )
1467 					bEnableRemove = sal_False;
1468 				if ( pNode->m_xNode.is() )
1469 				{
1470 					try
1471 					{
1472 						css::xml::dom::NodeType eChildType = pNode->m_xNode->getNodeType();
1473 						if ( eChildType != css::xml::dom::NodeType_ELEMENT_NODE
1474 							&& eChildType != css::xml::dom::NodeType_DOCUMENT_NODE )
1475 						{
1476 							bEnableAdd = sal_False;
1477 						}
1478 					}
1479 					catch ( Exception& )
1480 					{
1481                        DBG_ERRORFILE( "XFormsPage::EnableMenuItems(): exception caught" );
1482 					}
1483 				}
1484 			}
1485 		}
1486 		else if ( m_eGroup != DGTInstance )
1487 			bEnableAdd = sal_True;
1488 
1489 		m_aToolBox.EnableItem( TBI_ITEM_ADD, bEnableAdd );
1490 		m_aToolBox.EnableItem( TBI_ITEM_ADD_ELEMENT, bEnableAdd );
1491 		m_aToolBox.EnableItem( TBI_ITEM_ADD_ATTRIBUTE, bEnableAdd );
1492 		m_aToolBox.EnableItem( TBI_ITEM_EDIT, bEnableEdit );
1493 		m_aToolBox.EnableItem( TBI_ITEM_REMOVE, bEnableRemove );
1494 
1495 		if ( _pMenu )
1496 		{
1497 			_pMenu->EnableItem( TBI_ITEM_ADD, bEnableAdd );
1498 			_pMenu->EnableItem( TBI_ITEM_ADD_ELEMENT, bEnableAdd );
1499 			_pMenu->EnableItem( TBI_ITEM_ADD_ATTRIBUTE, bEnableAdd );
1500 			_pMenu->EnableItem( TBI_ITEM_EDIT, bEnableEdit );
1501 			_pMenu->EnableItem( TBI_ITEM_REMOVE, bEnableRemove );
1502 		}
1503 		if ( DGTInstance == m_eGroup )
1504 		{
1505 			sal_uInt16 nResId1 = RID_STR_DATANAV_EDIT_ELEMENT;
1506 			sal_uInt16 nResId2 = RID_STR_DATANAV_REMOVE_ELEMENT;
1507 			if ( pEntry )
1508 			{
1509 				ItemNode* pNode = static_cast< ItemNode* >( pEntry->GetUserData() );
1510 				if ( pNode && pNode->m_xNode.is() )
1511 				{
1512 					try
1513 					{
1514 						css::xml::dom::NodeType eChildType = pNode->m_xNode->getNodeType();
1515 						if ( eChildType == css::xml::dom::NodeType_ATTRIBUTE_NODE )
1516 						{
1517 							nResId1 = RID_STR_DATANAV_EDIT_ATTRIBUTE;
1518 							nResId2 = RID_STR_DATANAV_REMOVE_ATTRIBUTE;
1519 						}
1520 					}
1521 					catch ( Exception& )
1522 					{
1523                        DBG_ERRORFILE( "XFormsPage::EnableMenuItems(): exception caught" );
1524 					}
1525 				}
1526 			}
1527 			m_aToolBox.SetItemText( TBI_ITEM_EDIT, SVX_RESSTR( nResId1 ) );
1528 			m_aToolBox.SetItemText( TBI_ITEM_REMOVE, SVX_RESSTR( nResId2 ) );
1529 			if ( _pMenu )
1530 			{
1531 				_pMenu->SetItemText( TBI_ITEM_EDIT, SVX_RESSTR( nResId1 ) );
1532 				_pMenu->SetItemText( TBI_ITEM_REMOVE, SVX_RESSTR( nResId2 ) );
1533 			}
1534 		}
1535 	}
1536 
1537 
1538 	//========================================================================
1539 	// class DataNavigatorWindow
1540 	//========================================================================
1541 	DataNavigatorWindow::DataNavigatorWindow( Window* pParent, SfxBindings* pBindings ) :
1542 
1543 		Window( pParent, SVX_RES( RID_SVXWIN_DATANAVIGATOR ) ),
1544 
1545 		m_aModelsBox		( this, SVX_RES( LB_MODELS ) ),
1546 		m_aModelBtn			( this, SVX_RES( MB_MODELS ) ),
1547 		m_aTabCtrl			( this, SVX_RES( TC_ITEMS ) ),
1548 		m_aInstanceBtn		( this, SVX_RES( MB_INSTANCES ) ),
1549 
1550 		m_pInstPage			( NULL ),
1551 		m_pSubmissionPage	( NULL ),
1552 		m_pBindingPage		( NULL ),
1553 
1554 		m_nMinWidth			( 0 ),
1555 		m_nMinHeight		( 0 ),
1556 		m_nBorderHeight		( 0 ),
1557 		m_nLastSelectedPos	( LISTBOX_ENTRY_NOTFOUND ),
1558 		m_bShowDetails		( false ),
1559         m_bIsNotifyDisabled ( false ),
1560 
1561 		m_aItemImageList	(		SVX_RES( IL_ITEM_BMPS ) ),
1562         m_aItemHCImageList  (       SVX_RES( IL_ITEM_BMPS_HC ) ),
1563         m_xDataListener     ( new DataListener( this ) )
1564 
1565 	{
1566 		FreeResource();
1567 
1568 		// init minimal metric
1569 		m_a2Size = LogicToPixel( Size( 2, 2 ), MAP_APPFONT );
1570 		m_a3Size = LogicToPixel( Size( 3, 3 ), MAP_APPFONT );
1571 		Size aOutSz = GetOutputSizePixel();
1572 		Size aLogSize = PixelToLogic( aOutSz, MAP_APPFONT );
1573 		m_nMinWidth = aLogSize.Width();
1574 		m_nMinHeight = aLogSize.Height();
1575 		m_nBorderHeight = 4*m_a3Size.Height() +
1576 			m_aModelBtn.GetSizePixel().Height() + m_aInstanceBtn.GetSizePixel().Height();
1577 
1578 		// handler
1579 		m_aModelsBox.SetSelectHdl( LINK( this, DataNavigatorWindow, ModelSelectHdl ) );
1580 		Link aLink = LINK( this, DataNavigatorWindow, MenuSelectHdl );
1581 		m_aModelBtn.SetSelectHdl( aLink );
1582 		m_aInstanceBtn.SetSelectHdl( aLink );
1583 		aLink = LINK( this, DataNavigatorWindow, MenuActivateHdl );
1584 		m_aModelBtn.SetActivateHdl( aLink );
1585 		m_aInstanceBtn.SetActivateHdl( aLink );
1586 		m_aTabCtrl.SetActivatePageHdl( LINK( this, DataNavigatorWindow, ActivatePageHdl ) );
1587         m_aUpdateTimer.SetTimeout( 2000 );
1588         m_aUpdateTimer.SetTimeoutHdl( LINK( this, DataNavigatorWindow, UpdateHdl ) );
1589 
1590 		// init tabcontrol
1591 		m_aTabCtrl.Show();
1592 		sal_Int32 nPageId = TID_INSTANCE;
1593 		SvtViewOptions aViewOpt( E_TABDIALOG, CFGNAME_DATANAVIGATOR );
1594 		if ( aViewOpt.Exists() )
1595 		{
1596 			nPageId = aViewOpt.GetPageID();
1597 			aViewOpt.GetUserItem(CFGNAME_SHOWDETAILS) >>= m_bShowDetails;
1598 		}
1599 
1600 		Menu* pMenu = m_aInstanceBtn.GetPopupMenu();
1601 		pMenu->SetItemBits( MID_SHOW_DETAILS, MIB_CHECKABLE );
1602 		pMenu->CheckItem( MID_SHOW_DETAILS, m_bShowDetails );
1603 
1604 		m_aTabCtrl.SetCurPageId( static_cast< sal_uInt16 >( nPageId ) );
1605 		ActivatePageHdl( &m_aTabCtrl );
1606 
1607         // get our frame
1608         DBG_ASSERT( pBindings != NULL,
1609                     "DataNavigatorWindow::LoadModels(): no SfxBindings; can't get frame" );
1610         m_xFrame = Reference<XFrame>(
1611             pBindings->GetDispatcher()->GetFrame()->GetFrame().GetFrameInterface(),
1612             UNO_QUERY );
1613         DBG_ASSERT( m_xFrame.is(), "DataNavigatorWindow::LoadModels(): no frame" );
1614         // add frameaction listener
1615         Reference< XFrameActionListener > xListener(
1616             static_cast< XFrameActionListener* >( m_xDataListener.get() ), UNO_QUERY );
1617         m_xFrame->addFrameActionListener( xListener );
1618 
1619         // load xforms models of the current document
1620 		LoadModels();
1621 	}
1622 	//------------------------------------------------------------------------
1623 	DataNavigatorWindow::~DataNavigatorWindow()
1624 	{
1625 		SvtViewOptions aViewOpt( E_TABDIALOG, CFGNAME_DATANAVIGATOR );
1626 		aViewOpt.SetPageID( static_cast< sal_Int32 >( m_aTabCtrl.GetCurPageId() ) );
1627 		Any aAny;
1628 		aAny <<= m_bShowDetails;
1629 		aViewOpt.SetUserItem(CFGNAME_SHOWDETAILS,aAny);
1630 
1631 		delete m_pInstPage;
1632 		delete m_pSubmissionPage;
1633 		delete m_pBindingPage;
1634 
1635 		sal_Int32 i, nCount = m_aPageList.size();
1636 		for ( i = 0; i < nCount; ++i )
1637 			delete m_aPageList[i];
1638         Reference< XFrameActionListener > xListener(
1639             static_cast< XFrameActionListener* >( m_xDataListener.get() ), UNO_QUERY );
1640         m_xFrame->removeFrameActionListener( xListener );
1641         RemoveBroadcaster();
1642         m_xDataListener.clear();
1643     }
1644 
1645 	// -----------------------------------------------------------------------
1646 	IMPL_LINK( DataNavigatorWindow, ModelSelectHdl, ListBox *, pBox )
1647 	{
1648 		sal_uInt16 nPos = m_aModelsBox.GetSelectEntryPos();
1649         // pBox == NULL, if you want to force a new fill.
1650 		if ( nPos != m_nLastSelectedPos || !pBox )
1651 		{
1652 			m_nLastSelectedPos = nPos;
1653             ClearAllPageModels( pBox != NULL );
1654 			InitPages();
1655 			SetPageModel();
1656 		}
1657 
1658 		return 0;
1659 	}
1660 	// -----------------------------------------------------------------------
1661 	IMPL_LINK( DataNavigatorWindow, MenuSelectHdl, MenuButton *, pBtn )
1662 	{
1663         bool bIsDocModified = false;
1664 		Reference< css::xforms::XFormsUIHelper1 > xUIHelper;
1665 		sal_uInt16 nSelectedPos = m_aModelsBox.GetSelectEntryPos();
1666         ::rtl::OUString sSelectedModel( m_aModelsBox.GetEntry( nSelectedPos ) );
1667 		Reference< css::xforms::XModel > xModel;
1668 		try
1669 		{
1670 			Any aAny = m_xDataContainer->getByName( sSelectedModel );
1671 			if ( aAny >>= xModel )
1672 				xUIHelper = Reference< css::xforms::XFormsUIHelper1 >( xModel, UNO_QUERY );
1673 		}
1674 		catch ( Exception& )
1675 		{
1676             DBG_ERRORFILE( "DataNavigatorWindow::MenuSelectHdl(): exception caught" );
1677 		}
1678 		DBG_ASSERT( xUIHelper.is(), "DataNavigatorWindow::MenuSelectHdl(): no UIHelper" );
1679 
1680         m_bIsNotifyDisabled = true;
1681 
1682         if ( &m_aModelBtn == pBtn )
1683 		{
1684 			switch ( pBtn->GetCurItemId() )
1685 			{
1686 				case MID_MODELS_ADD :
1687 				{
1688                     AddModelDialog aDlg( this, false );
1689 					bool bShowDialog = true;
1690 					while ( bShowDialog )
1691 					{
1692 						bShowDialog = false;
1693 						if ( aDlg.Execute() == RET_OK )
1694 						{
1695 							String sNewName = aDlg.GetName();
1696                             sal_Bool bDocumentData = aDlg.GetModifyDoc();
1697 
1698 							if ( m_aModelsBox.GetEntryPos( sNewName ) != LISTBOX_ENTRY_NOTFOUND )
1699 							{
1700 								// error: model name already exists
1701 								ErrorBox aErrBox( this, SVX_RES( RID_ERR_DOUBLE_MODELNAME ) );
1702 								String sMessText = aErrBox.GetMessText();
1703 								sMessText.SearchAndReplace( MSG_VARIABLE, sNewName );
1704 								aErrBox.SetMessText( sMessText );
1705 								aErrBox.Execute();
1706 								bShowDialog = true;
1707 							}
1708 							else
1709 							{
1710 								try
1711 								{
1712 									// add new model to frame model
1713 									Reference< css::xforms::XModel > xNewModel(
1714                                         xUIHelper->newModel( m_xFrameModel, sNewName ), UNO_SET_THROW );
1715 
1716                                     Reference< XPropertySet > xModelProps( xNewModel, UNO_QUERY_THROW );
1717                                     xModelProps->setPropertyValue(
1718                                         ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ExternalData" ) ),
1719                                         makeAny( sal_Bool( !bDocumentData ) ) );
1720 
1721                                     sal_uInt16 nNewPos = m_aModelsBox.InsertEntry( sNewName );
1722 									m_aModelsBox.SelectEntryPos( nNewPos );
1723 									ModelSelectHdl( &m_aModelsBox );
1724                                     bIsDocModified = true;
1725 								}
1726 								catch ( Exception& )
1727 								{
1728                                     DBG_ERRORFILE( "DataNavigatorWindow::MenuSelectHdl(): exception caught" );
1729 								}
1730 							}
1731 						}
1732 					}
1733 					break;
1734 				}
1735 				case MID_MODELS_EDIT :
1736 				{
1737                     AddModelDialog aDlg( this, true );
1738 					aDlg.SetName( sSelectedModel );
1739 
1740                     bool bDocumentData( false );
1741                     try
1742                     {
1743 				        Reference< css::xforms::XFormsSupplier > xFormsSupp( m_xFrameModel, UNO_QUERY_THROW );
1744 				        Reference< XNameContainer > xXForms( xFormsSupp->getXForms(), UNO_SET_THROW );
1745                         Reference< XPropertySet > xModelProps( xXForms->getByName( sSelectedModel ), UNO_QUERY_THROW );
1746                         sal_Bool bExternalData = sal_False;
1747                         OSL_VERIFY( xModelProps->getPropertyValue(
1748                             ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ExternalData" ) ) ) >>= bExternalData );
1749                         bDocumentData = ( bExternalData == sal_False );
1750                     }
1751                     catch( const Exception& )
1752                     {
1753                     	DBG_UNHANDLED_EXCEPTION();
1754                     }
1755                     aDlg.SetModifyDoc( bDocumentData );
1756 
1757 					if ( aDlg.Execute() == RET_OK )
1758 					{
1759                         if ( aDlg.GetModifyDoc() != bool( bDocumentData ) )
1760                         {
1761                             bDocumentData = aDlg.GetModifyDoc();
1762                             try
1763                             {
1764 				                Reference< css::xforms::XFormsSupplier > xFormsSupp( m_xFrameModel, UNO_QUERY_THROW );
1765 				                Reference< XNameContainer > xXForms( xFormsSupp->getXForms(), UNO_SET_THROW );
1766                                 Reference< XPropertySet > xModelProps( xXForms->getByName( sSelectedModel ), UNO_QUERY_THROW );
1767                                 xModelProps->setPropertyValue(
1768                                     ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ExternalData" ) ),
1769                                     makeAny( sal_Bool( !bDocumentData ) ) );
1770                                 bIsDocModified = true;
1771                             }
1772                             catch( const Exception& )
1773                             {
1774                             	DBG_UNHANDLED_EXCEPTION();
1775                             }
1776                         }
1777 
1778                         String sNewName = aDlg.GetName();
1779 						if ( sNewName.Len() > 0 && ( sNewName != String( sSelectedModel ) ) )
1780 						{
1781 							try
1782 							{
1783 								xUIHelper->renameModel( m_xFrameModel, sSelectedModel, sNewName );
1784 
1785 								m_aModelsBox.RemoveEntry( nSelectedPos );
1786 								nSelectedPos = m_aModelsBox.InsertEntry( sNewName );
1787 								m_aModelsBox.SelectEntryPos( nSelectedPos );
1788                                 bIsDocModified = true;
1789 							}
1790 							catch ( Exception& )
1791 							{
1792 								DBG_ERRORFILE( "DataNavigatorWindow::MenuSelectHdl(): exception caught" );
1793 							}
1794 						}
1795 					}
1796 					break;
1797 				}
1798 				case MID_MODELS_REMOVE :
1799 				{
1800 					QueryBox aQBox( this, SVX_RES( RID_QRY_REMOVE_MODEL ) );
1801 					String sText = aQBox.GetMessText();
1802 					sText.SearchAndReplace( MODELNAME, sSelectedModel );
1803 					aQBox.SetMessText( sText );
1804 					if ( aQBox.Execute() == RET_YES )
1805 					{
1806 						try
1807 						{
1808 							xUIHelper->removeModel( m_xFrameModel, sSelectedModel );
1809 						}
1810 						catch ( Exception& )
1811 						{
1812                             DBG_ERRORFILE( "DataNavigatorWindow::MenuSelectHdl(): exception caught" );
1813 						}
1814 						m_aModelsBox.RemoveEntry( nSelectedPos );
1815 						if ( m_aModelsBox.GetEntryCount() <= nSelectedPos )
1816 							nSelectedPos = m_aModelsBox.GetEntryCount() - 1;
1817 						m_aModelsBox.SelectEntryPos( nSelectedPos );
1818 						ModelSelectHdl( &m_aModelsBox );
1819                         bIsDocModified = true;
1820 					}
1821 					break;
1822 				}
1823 				default:
1824 				{
1825 					DBG_ERRORFILE( "DataNavigatorWindow::MenuSelectHdl(): wrong menu item" );
1826 				}
1827 			}
1828 		}
1829 		else if ( &m_aInstanceBtn == pBtn )
1830 		{
1831 			switch ( pBtn->GetCurItemId() )
1832 			{
1833 				case MID_INSTANCES_ADD :
1834 				{
1835                     AddInstanceDialog aDlg( this, false );
1836 					if ( aDlg.Execute() == RET_OK )
1837 					{
1838                         sal_uInt16 nInst = GetNewPageId();
1839 						::rtl::OUString sName = aDlg.GetName();
1840 						::rtl::OUString sURL = aDlg.GetURL();
1841 						bool bLinkOnce = aDlg.IsLinkInstance();
1842 						try
1843 						{
1844 							Reference< css::xml::dom::XDocument > xNewInst =
1845 								xUIHelper->newInstance( sName, sURL, !bLinkOnce );
1846 						}
1847 						catch ( Exception& )
1848 						{
1849                             DBG_ERRORFILE( "DataNavigatorWindow::MenuSelectHdl(): exception caught" );
1850 						}
1851 						ModelSelectHdl( NULL );
1852 						m_aTabCtrl.SetCurPageId( nInst );
1853 						XFormsPage* pPage = GetCurrentPage( nInst );
1854 						pPage->SetInstanceName(sName);
1855 						pPage->SetInstanceURL(sURL);
1856 						pPage->SetLinkOnce(bLinkOnce);
1857 						ActivatePageHdl( &m_aTabCtrl );
1858                         bIsDocModified = true;
1859 					}
1860 					break;
1861 				}
1862 				case MID_INSTANCES_EDIT :
1863 				{
1864 					sal_uInt16 nId = 0;
1865 					XFormsPage* pPage = GetCurrentPage( nId );
1866 					if ( pPage )
1867 					{
1868                         AddInstanceDialog aDlg( this, true );
1869 						aDlg.SetName( pPage->GetInstanceName() );
1870 						aDlg.SetURL( pPage->GetInstanceURL() );
1871 						aDlg.SetLinkInstance( pPage->GetLinkOnce() );
1872 						String sOldName = aDlg.GetName();
1873 						if ( aDlg.Execute() == RET_OK )
1874 						{
1875 							String sNewName = aDlg.GetName();
1876 							::rtl::OUString sURL = aDlg.GetURL();
1877 							bool bLinkOnce = aDlg.IsLinkInstance();
1878 							try
1879 							{
1880 								xUIHelper->renameInstance( sOldName,
1881 														   sNewName,
1882 														   sURL,
1883 														   !bLinkOnce );
1884 							}
1885 							catch ( Exception& )
1886 							{
1887                                 DBG_ERRORFILE( "DataNavigatorWindow::MenuSelectHdl(): exception caught" );
1888 							}
1889 							pPage->SetInstanceName(sNewName);
1890 							pPage->SetInstanceURL(sURL);
1891 							pPage->SetLinkOnce(bLinkOnce);
1892 							m_aTabCtrl.SetPageText( nId, sNewName );
1893                             bIsDocModified = true;
1894 						}
1895 					}
1896 					break;
1897 				}
1898 				case MID_INSTANCES_REMOVE :
1899 				{
1900 					sal_uInt16 nId = 0;
1901 					XFormsPage* pPage = GetCurrentPage( nId );
1902 					if ( pPage )
1903 					{
1904 						String sInstName = pPage->GetInstanceName();
1905 						QueryBox aQBox( this, SVX_RES( RID_QRY_REMOVE_INSTANCE ) );
1906 						String sMessText = aQBox.GetMessText();
1907 						sMessText.SearchAndReplace( INSTANCENAME, sInstName );
1908 						aQBox.SetMessText( sMessText );
1909 						if ( aQBox.Execute() == RET_YES )
1910 						{
1911 							bool bDoRemove = false;
1912 							if ( nId > TID_INSTANCE )
1913 							{
1914 								PageList::iterator aPageListEnd = m_aPageList.end();
1915 								PageList::iterator aFoundPage =
1916 									std::find( m_aPageList.begin(), aPageListEnd, pPage );
1917 								if ( aFoundPage != aPageListEnd )
1918 								{
1919 									m_aPageList.erase( aFoundPage );
1920 									delete pPage;
1921 									bDoRemove = true;
1922 								}
1923 							}
1924 							else
1925 							{
1926 								DELETEZ( m_pInstPage );
1927 								bDoRemove = true;
1928 							}
1929 
1930 							if ( bDoRemove )
1931 							{
1932 								try
1933 								{
1934 									xUIHelper->removeInstance( sInstName );
1935 								}
1936 								catch ( Exception& )
1937 								{
1938                                     DBG_ERRORFILE( "DataNavigatorWindow::MenuSelectHdl(): exception caught" );
1939 								}
1940 								m_aTabCtrl.RemovePage( nId );
1941 								m_aTabCtrl.SetCurPageId( TID_INSTANCE );
1942 								ModelSelectHdl( NULL );
1943                                 bIsDocModified = true;
1944 							}
1945 						}
1946 					}
1947 					break;
1948 				}
1949 				case MID_SHOW_DETAILS :
1950 				{
1951 					m_bShowDetails = !m_bShowDetails;
1952 					m_aInstanceBtn.GetPopupMenu()->CheckItem( MID_SHOW_DETAILS, m_bShowDetails );
1953                     ModelSelectHdl( &m_aModelsBox );
1954 					break;
1955 				}
1956 				default:
1957 				{
1958 					DBG_ERRORFILE( "DataNavigatorWindow::MenuSelectHdl(): wrong menu item" );
1959 				}
1960 			}
1961 		}
1962 		else
1963 		{
1964 			DBG_ERRORFILE( "DataNavigatorWindow::MenuSelectHdl(): wrong button" );
1965 		}
1966 
1967         m_bIsNotifyDisabled = false;
1968 
1969         if ( bIsDocModified )
1970             SetDocModified();
1971         return 0;
1972 	}
1973 	// -----------------------------------------------------------------------
1974 	IMPL_LINK( DataNavigatorWindow, MenuActivateHdl, MenuButton *, pBtn )
1975 	{
1976 		Menu* pMenu = pBtn->GetPopupMenu();
1977 
1978 		if ( &m_aInstanceBtn == pBtn )
1979 		{
1980 			bool bIsInstPage = ( m_aTabCtrl.GetCurPageId() >= TID_INSTANCE );
1981 			pMenu->EnableItem( MID_INSTANCES_EDIT, bIsInstPage );
1982 			pMenu->EnableItem( MID_INSTANCES_REMOVE,
1983 				bIsInstPage && m_aTabCtrl.GetPageCount() > MIN_PAGE_COUNT );
1984 			pMenu->EnableItem( MID_SHOW_DETAILS, bIsInstPage );
1985 		}
1986 		else if ( &m_aModelBtn == pBtn )
1987 		{
1988 			// we need at least one model!
1989 			pMenu->EnableItem( MID_MODELS_REMOVE, m_aModelsBox.GetEntryCount() > 1 );
1990 		}
1991 		else
1992 		{
1993 			DBG_ERRORFILE( "DataNavigatorWindow::MenuActivateHdl(): wrong button" );
1994 		}
1995 		return 0;
1996 	}
1997     // -----------------------------------------------------------------------
1998     IMPL_LINK( DataNavigatorWindow, ActivatePageHdl, TabControl *, EMPTYARG )
1999     {
2000         sal_uInt16 nId = 0;
2001         XFormsPage* pPage = GetCurrentPage( nId );
2002         if ( pPage )
2003         {
2004             m_aTabCtrl.SetTabPage( nId, pPage );
2005             if ( m_xDataContainer.is() && !pPage->HasModel() )
2006                 SetPageModel();
2007         }
2008 
2009         return 0;
2010     }
2011     // -----------------------------------------------------------------------
2012     IMPL_LINK( DataNavigatorWindow, UpdateHdl, Timer *, EMPTYARG )
2013     {
2014         ModelSelectHdl( NULL );
2015         return 0;
2016     }
2017 	// -----------------------------------------------------------------------
2018 	XFormsPage* DataNavigatorWindow::GetCurrentPage( sal_uInt16& rCurId )
2019 	{
2020 		rCurId = m_aTabCtrl.GetCurPageId();
2021 		XFormsPage* pPage = NULL;
2022 		switch ( rCurId )
2023 		{
2024 			case TID_SUBMISSION:
2025 			{
2026 				if ( !m_pSubmissionPage )
2027 					m_pSubmissionPage = new XFormsPage( &m_aTabCtrl, this, DGTSubmission );
2028 				pPage = m_pSubmissionPage;
2029 				break;
2030 			}
2031 
2032 			case TID_BINDINGS:
2033 			{
2034 				if ( !m_pBindingPage )
2035 					m_pBindingPage = new XFormsPage( &m_aTabCtrl, this, DGTBinding );
2036 				pPage = m_pBindingPage;
2037 				break;
2038 			}
2039 
2040 			case TID_INSTANCE:
2041 			{
2042 				if ( !m_pInstPage )
2043 					m_pInstPage = new XFormsPage( &m_aTabCtrl, this, DGTInstance );
2044 				pPage = m_pInstPage;
2045 				break;
2046 			}
2047 		}
2048 
2049 		if ( rCurId > TID_INSTANCE )
2050 		{
2051             sal_uInt16 nPos = m_aTabCtrl.GetPagePos( rCurId );
2052             if ( HasFirstInstancePage() && nPos > 0 )
2053                 nPos--;
2054 			if ( m_aPageList.size() > nPos )
2055 				pPage = m_aPageList[nPos];
2056 			else
2057 			{
2058 				pPage = new XFormsPage( &m_aTabCtrl, this, DGTInstance );
2059 				m_aPageList.push_back( pPage );
2060 			}
2061 		}
2062 
2063 		return pPage;
2064 	}
2065 	// -----------------------------------------------------------------------
2066 	void DataNavigatorWindow::LoadModels()
2067 	{
2068 		if ( !m_xFrameModel.is() )
2069 		{
2070             // get model of active frame
2071             Reference< XController > xCtrl = m_xFrame->getController();
2072 	        if ( xCtrl.is() )
2073 			{
2074 				try
2075 				{
2076 				    m_xFrameModel = xCtrl->getModel();
2077 				}
2078 				catch ( Exception& )
2079 				{
2080 					DBG_ERRORFILE( "DataNavigatorWindow::LoadModels(): exception caught" );
2081 				}
2082 			}
2083 		}
2084 
2085 		if ( m_xFrameModel.is() )
2086 		{
2087 			try
2088 			{
2089 				::rtl::OUString sURL = m_xFrameModel->getURL();
2090 				Reference< css::xforms::XFormsSupplier > xFormsSupp( m_xFrameModel, UNO_QUERY );
2091 				if ( xFormsSupp.is() )
2092 				{
2093 					Reference< XNameContainer > xContainer = xFormsSupp->getXForms();
2094 					if ( xContainer.is() )
2095 					{
2096 						m_xDataContainer = xContainer;
2097 						Sequence< ::rtl::OUString > aNameList = m_xDataContainer->getElementNames();
2098 						sal_Int32 i, nCount = aNameList.getLength();
2099 						::rtl::OUString* pNames = aNameList.getArray();
2100 						for ( i = 0; i < nCount; ++i )
2101 						{
2102 							Any aAny = m_xDataContainer->getByName( pNames[i] );
2103 							Reference< css::xforms::XModel > xFormsModel;
2104 							if ( aAny >>= xFormsModel )
2105 								m_aModelsBox.InsertEntry( xFormsModel->getID() );
2106 						}
2107 					}
2108 				}
2109 			}
2110 			catch( Exception& )
2111 			{
2112 				DBG_ERRORFILE( "DataNavigatorWindow::LoadModels(): exception caught" );
2113 			}
2114 		}
2115 
2116 		if ( m_aModelsBox.GetEntryCount() > 0 )
2117 		{
2118 			m_aModelsBox.SelectEntryPos(0);
2119 			ModelSelectHdl( &m_aModelsBox );
2120 		}
2121 	}
2122 	// -----------------------------------------------------------------------
2123 	void DataNavigatorWindow::SetPageModel()
2124 	{
2125 		rtl::OUString sModel( m_aModelsBox.GetSelectEntry() );
2126 		try
2127 		{
2128 			Any aAny = m_xDataContainer->getByName( sModel );
2129 			Reference< css::xforms::XModel > xFormsModel;
2130 			if ( aAny >>= xFormsModel )
2131 			{
2132                 sal_uInt16 nPagePos = TAB_PAGE_NOTFOUND;
2133 				sal_uInt16 nId = 0;
2134 				XFormsPage* pPage = GetCurrentPage( nId );
2135                 DBG_ASSERT( pPage, "DataNavigatorWindow::SetPageModel(): no page" );
2136                 if ( nId >= TID_INSTANCE )
2137                     // instance page
2138                     nPagePos = m_aTabCtrl.GetPagePos( nId );
2139                 m_bIsNotifyDisabled = true;
2140                 String sText = pPage->SetModel( xFormsModel, nPagePos );
2141                 m_bIsNotifyDisabled = false;
2142 				if ( sText.Len() > 0 )
2143 					m_aTabCtrl.SetPageText( nId, sText );
2144 			}
2145 		}
2146 		catch ( NoSuchElementException& )
2147 		{
2148 			DBG_ERRORFILE( "DataNavigatorWindow::SetPageModel(): no such element" );
2149 		}
2150         catch( Exception& )
2151 		{
2152 			DBG_ERRORFILE( "DataNavigatorWindow::SetPageModel(): unexpected exception" );
2153 		}
2154 	}
2155 	// -----------------------------------------------------------------------
2156 	void DataNavigatorWindow::InitPages()
2157 	{
2158 		rtl::OUString sModel( m_aModelsBox.GetSelectEntry() );
2159 		try
2160 		{
2161 			Any aAny = m_xDataContainer->getByName( sModel );
2162 			Reference< css::xforms::XModel > xModel;
2163 			if ( aAny >>= xModel )
2164 			{
2165 				Reference< XEnumerationAccess > xNumAccess( xModel->getInstances(), UNO_QUERY );
2166 				if ( xNumAccess.is() )
2167 				{
2168 					Reference < XEnumeration > xNum = xNumAccess->createEnumeration();
2169 					if ( xNum.is() && xNum->hasMoreElements() )
2170 					{
2171 						sal_Int32 nAlreadyLoadedCount = m_aPageList.size();
2172                         if ( !HasFirstInstancePage() && nAlreadyLoadedCount > 0 )
2173                             nAlreadyLoadedCount--;
2174 						sal_Int32 nIdx = 0;
2175 						while ( xNum->hasMoreElements() )
2176 						{
2177 							if ( nIdx > nAlreadyLoadedCount )
2178 							{
2179 								Sequence< PropertyValue > xPropSeq;
2180 								if ( xNum->nextElement() >>= xPropSeq )
2181 									CreateInstancePage( xPropSeq );
2182 								else
2183 								{
2184 									DBG_ERRORFILE( "DataNavigator::InitPages(): invalid instance" );
2185 								}
2186 							}
2187 							else
2188 								xNum->nextElement();
2189 							nIdx++;
2190 						}
2191 					}
2192 				}
2193 			}
2194 		}
2195 		catch ( NoSuchElementException& )
2196 		{
2197 			DBG_ERRORFILE( "DataNavigatorWindow::SetPageModel(): no such element" );
2198 		}
2199         catch( Exception& )
2200 		{
2201 			DBG_ERRORFILE( "DataNavigatorWindow::SetPageModel(): unexpected exception" );
2202 		}
2203 	}
2204 	// -----------------------------------------------------------------------
2205     void DataNavigatorWindow::ClearAllPageModels( bool bClearPages )
2206 	{
2207 		if ( m_pInstPage )
2208 			m_pInstPage->ClearModel();
2209 		if ( m_pSubmissionPage )
2210 			m_pSubmissionPage->ClearModel();
2211 		if ( m_pBindingPage )
2212 			m_pBindingPage->ClearModel();
2213 
2214 		sal_Int32 i, nCount = m_aPageList.size();
2215         for ( i = 0; i < nCount; ++i )
2216         {
2217             XFormsPage* pPage = m_aPageList[i];
2218             pPage->ClearModel();
2219             if ( bClearPages )
2220                 delete pPage;
2221         }
2222 
2223         if ( bClearPages )
2224         {
2225             m_aPageList.clear();
2226             while ( m_aTabCtrl.GetPageCount() > MIN_PAGE_COUNT )
2227                 m_aTabCtrl.RemovePage( m_aTabCtrl.GetPageId( 1 ) );
2228         }
2229 	}
2230 	// -----------------------------------------------------------------------
2231 	void DataNavigatorWindow::CreateInstancePage( const Sequence< PropertyValue >& _xPropSeq )
2232 	{
2233 		rtl::OUString sInstName;
2234 		rtl::OUString sID( PN_INSTANCE_ID );
2235 		const PropertyValue* pProps = _xPropSeq.getConstArray();
2236 		const PropertyValue* pPropsEnd = pProps + _xPropSeq.getLength();
2237 		for ( ; pProps != pPropsEnd; ++pProps )
2238 		{
2239 			if ( sID.compareTo( pProps->Name ) == 0 )
2240 			{
2241 				pProps->Value >>= sInstName;
2242 				break;
2243 			}
2244 		}
2245 
2246         sal_uInt16 nPageId = GetNewPageId();
2247 		if ( sInstName.getLength() == 0 )
2248 		{
2249             DBG_ERRORFILE( "DataNavigatorWindow::CreateInstancePage(): instance without name" );
2250             String sTemp = String::CreateFromAscii( "untitled" );
2251             sTemp += String::CreateFromInt32( nPageId );
2252 			sInstName = sTemp;
2253 		}
2254         m_aTabCtrl.InsertPage( nPageId, sInstName, m_aTabCtrl.GetPageCount() - 2 );
2255 	}
2256 
2257     //------------------------------------------------------------------------
2258     bool DataNavigatorWindow::HasFirstInstancePage() const
2259     {
2260         return ( m_aTabCtrl.GetPageId( 0 ) == TID_INSTANCE );
2261     }
2262 
2263     //------------------------------------------------------------------------
2264     sal_uInt16 DataNavigatorWindow::GetNewPageId() const
2265     {
2266         sal_uInt16 i, nMax = 0, nCount = m_aTabCtrl.GetPageCount();
2267         for ( i = 0; i < nCount; ++i )
2268         {
2269             if ( nMax < m_aTabCtrl.GetPageId(i) )
2270                 nMax = m_aTabCtrl.GetPageId(i);
2271         }
2272         return ( nMax + 1 );
2273     }
2274 
2275 	//------------------------------------------------------------------------
2276 	void DataNavigatorWindow::Resize()
2277 	{
2278 		Window::Resize();
2279 
2280 		Size aOutSz = GetOutputSizePixel();
2281 		long nWidth = Max( aOutSz.Width(), m_nMinWidth );
2282 		long nHeight = Max( aOutSz.Height(), m_nMinHeight );
2283 
2284 		Size aSz = m_aModelsBox.GetSizePixel();
2285 		aSz.Width() = nWidth - 3*m_a3Size.Width() - m_aModelBtn.GetSizePixel().Width();
2286 		m_aModelsBox.SetSizePixel( aSz );
2287 		Point aPos = m_aModelBtn.GetPosPixel();
2288 		aPos.X() = m_aModelsBox.GetPosPixel().X() + aSz.Width() + m_a3Size.Width();
2289 		m_aModelBtn.SetPosPixel( aPos );
2290 
2291 		aSz = m_aTabCtrl.GetSizePixel();
2292 		aSz.Width() = nWidth - 2*m_a3Size.Width();
2293 		aSz.Height() = nHeight - m_nBorderHeight;
2294 		m_aTabCtrl.SetSizePixel( aSz );
2295 		// Instance button positioning
2296 		aPos = m_aInstanceBtn.GetPosPixel();
2297 		// right aligned
2298 		aPos.X() = nWidth - m_aInstanceBtn.GetSizePixel().Width() - m_a3Size.Width();
2299 		// under the tabcontrol
2300 		aPos.Y() = m_aTabCtrl.GetPosPixel().Y() + aSz.Height() + m_a3Size.Height();
2301 		m_aInstanceBtn.SetPosPixel( aPos );
2302 	}
2303 
2304     //------------------------------------------------------------------------
2305     void DataNavigatorWindow::SetDocModified()
2306     {
2307         SfxObjectShell* pCurrentDoc = SfxObjectShell::Current();
2308         DBG_ASSERT( pCurrentDoc, "DataNavigatorWindow::SetDocModified(): no objectshell" );
2309         if ( !pCurrentDoc->IsModified() && pCurrentDoc->IsEnableSetModified() )
2310             pCurrentDoc->SetModified();
2311     }
2312 
2313     //------------------------------------------------------------------------
2314     void DataNavigatorWindow::NotifyChanges( bool _bLoadAll )
2315     {
2316         if ( !m_bIsNotifyDisabled )
2317         {
2318             if ( _bLoadAll )
2319             {
2320                 // reset all members
2321                 RemoveBroadcaster();
2322                 m_xDataContainer.clear();
2323                 m_xFrameModel.clear();
2324                 m_aModelsBox.Clear();
2325                 m_nLastSelectedPos = LISTBOX_ENTRY_NOTFOUND;
2326                 // for a reload
2327                 LoadModels();
2328             }
2329             else
2330                 m_aUpdateTimer.Start();
2331         }
2332     }
2333 
2334     //------------------------------------------------------------------------
2335     void DataNavigatorWindow::AddContainerBroadcaster( const XContainer_ref& xContainer )
2336     {
2337         Reference< XContainerListener > xListener(
2338             static_cast< XContainerListener* >( m_xDataListener.get() ), UNO_QUERY );
2339         xContainer->addContainerListener( xListener );
2340         m_aContainerList.push_back( xContainer );
2341     }
2342 
2343     //------------------------------------------------------------------------
2344     void DataNavigatorWindow::AddEventBroadcaster( const XEventTarget_ref& xTarget )
2345     {
2346         Reference< XEventListener > xListener(
2347             static_cast< XEventListener* >( m_xDataListener.get() ), UNO_QUERY );
2348         xTarget->addEventListener( EVENTTYPE_CHARDATA, xListener, true );
2349         xTarget->addEventListener( EVENTTYPE_CHARDATA, xListener, false );
2350         xTarget->addEventListener( EVENTTYPE_ATTR, xListener, true );
2351         xTarget->addEventListener( EVENTTYPE_ATTR, xListener, false );
2352         m_aEventTargetList.push_back( xTarget );
2353     }
2354 
2355     //------------------------------------------------------------------------
2356     void DataNavigatorWindow::RemoveBroadcaster()
2357     {
2358         Reference< XContainerListener > xContainerListener(
2359             static_cast< XContainerListener* >( m_xDataListener.get() ), UNO_QUERY );
2360         sal_Int32 i, nCount = m_aContainerList.size();
2361         for ( i = 0; i < nCount; ++i )
2362             m_aContainerList[i]->removeContainerListener( xContainerListener );
2363         Reference< XEventListener > xEventListener(
2364             static_cast< XEventListener* >( m_xDataListener.get() ), UNO_QUERY );
2365         nCount = m_aEventTargetList.size();
2366         for ( i = 0; i < nCount; ++i )
2367         {
2368             m_aEventTargetList[i]->removeEventListener( EVENTTYPE_CHARDATA, xEventListener, true );
2369             m_aEventTargetList[i]->removeEventListener( EVENTTYPE_CHARDATA, xEventListener, false );
2370             m_aEventTargetList[i]->removeEventListener( EVENTTYPE_ATTR, xEventListener, true );
2371             m_aEventTargetList[i]->removeEventListener( EVENTTYPE_ATTR, xEventListener, false );
2372         }
2373     }
2374 
2375     //========================================================================
2376 	// class DataNavigator
2377 	//========================================================================
2378 	DBG_NAME(DataNavigator)
2379 	//------------------------------------------------------------------------
2380 	DataNavigator::DataNavigator( SfxBindings* _pBindings, SfxChildWindow* _pMgr, Window* _pParent ) :
2381 
2382 		SfxDockingWindow( _pBindings, _pMgr, _pParent,
2383 						  WinBits(WB_STDMODELESS|WB_SIZEABLE|WB_ROLLABLE|WB_3DLOOK|WB_DOCKABLE) ),
2384 		SfxControllerItem( SID_FM_DATANAVIGATOR_CONTROL, *_pBindings ),
2385 
2386 		m_aDataWin( this, _pBindings )
2387 
2388 	{
2389 		DBG_CTOR(DataNavigator,NULL);
2390 
2391 		SetHelpId( HID_DATA_NAVIGATOR_WIN );
2392 		SetText( SVX_RES( RID_STR_DATANAVIGATOR ) );
2393 
2394 		Size aSize = m_aDataWin.GetOutputSizePixel();
2395 		Size aLogSize = PixelToLogic( aSize, MAP_APPFONT );
2396 		SfxDockingWindow::SetFloatingSize( aLogSize );
2397 
2398 		m_aDataWin.Show();
2399 	}
2400 
2401 	//------------------------------------------------------------------------
2402 	DataNavigator::~DataNavigator()
2403 	{
2404 		DBG_DTOR(DataNavigator,NULL);
2405 	}
2406 
2407 	//-----------------------------------------------------------------------
2408 	void DataNavigator::Update( FmFormShell* /*pFormShell*/ )
2409 	{
2410 	}
2411 	//-----------------------------------------------------------------------
2412 	void DataNavigator::StateChanged( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState )
2413 	{
2414 		if ( !pState  || SID_FM_DATANAVIGATOR_CONTROL != nSID )
2415 			return;
2416 
2417 		if ( eState >= SFX_ITEM_AVAILABLE )
2418 		{
2419 			FmFormShell* pShell = PTR_CAST( FmFormShell,((SfxObjectItem*)pState)->GetShell() );
2420 			Update( pShell );
2421 		}
2422 		else
2423 			Update( NULL );
2424 	}
2425 
2426 	//-----------------------------------------------------------------------
2427 	void DataNavigator::GetFocus()
2428 	{
2429 		SfxDockingWindow::GetFocus();
2430 	}
2431 
2432 	//-----------------------------------------------------------------------
2433 	sal_Bool DataNavigator::Close()
2434 	{
2435 		Update( NULL );
2436 		return SfxDockingWindow::Close();
2437 	}
2438 
2439 	//-----------------------------------------------------------------------
2440 	Size DataNavigator::CalcDockingSize( SfxChildAlignment eAlign )
2441 	{
2442         if ( ( eAlign == SFX_ALIGN_TOP ) || ( eAlign == SFX_ALIGN_BOTTOM ) )
2443 			return Size();
2444 
2445 		return SfxDockingWindow::CalcDockingSize( eAlign );
2446 	}
2447 
2448 	//-----------------------------------------------------------------------
2449 	SfxChildAlignment DataNavigator::CheckAlignment( SfxChildAlignment eActAlign, SfxChildAlignment eAlign )
2450 	{
2451 		switch ( eAlign )
2452 		{
2453 			case SFX_ALIGN_LEFT:
2454 			case SFX_ALIGN_RIGHT:
2455 			case SFX_ALIGN_NOALIGNMENT:
2456 				return eAlign;
2457             default:
2458                 break;
2459 		}
2460 		return eActAlign;
2461 	}
2462 
2463 	//------------------------------------------------------------------------
2464 	void DataNavigator::Resize()
2465 	{
2466 		SfxDockingWindow::Resize();
2467 
2468 		Size aLogOutputSize = PixelToLogic( GetOutputSizePixel(), MAP_APPFONT );
2469 		Size aLogExplSize = aLogOutputSize;
2470 		aLogExplSize.Width() -= 2;
2471 		aLogExplSize.Height() -= 2;
2472 
2473 		Point aExplPos = LogicToPixel( Point(1,1), MAP_APPFONT );
2474 		Size aExplSize = LogicToPixel( aLogExplSize, MAP_APPFONT );
2475 
2476 		m_aDataWin.SetPosSizePixel( aExplPos, aExplSize );
2477 	}
2478 
2479 
2480 	//========================================================================
2481 	// class NavigatorFrameManager
2482 	//========================================================================
2483 
2484 	//-----------------------------------------------------------------------
2485 	SFX_IMPL_DOCKINGWINDOW( DataNavigatorManager, SID_FM_SHOW_DATANAVIGATOR )
2486 
2487 	//-----------------------------------------------------------------------
2488 	DataNavigatorManager::DataNavigatorManager(
2489 		Window* _pParent, sal_uInt16 _nId, SfxBindings* _pBindings, SfxChildWinInfo* _pInfo ) :
2490 
2491 		SfxChildWindow( _pParent, _nId )
2492 
2493 	{
2494 		pWindow = new DataNavigator( _pBindings, this, _pParent );
2495 		eChildAlignment = SFX_ALIGN_RIGHT;
2496         pWindow->SetSizePixel( Size( 250, 400 ) );
2497 		( (SfxDockingWindow*)pWindow )->Initialize( _pInfo );
2498 	}
2499 
2500 	//========================================================================
2501 	// class AddDataItemDialog
2502 	//========================================================================
2503 
2504 	AddDataItemDialog::AddDataItemDialog(
2505 		Window* pParent, ItemNode* _pNode,
2506 		const Reference< css::xforms::XFormsUIHelper1 >& _rUIHelper ) :
2507 
2508 		ModalDialog( pParent, SVX_RES( RID_SVXDLG_ADD_DATAITEM ) ),
2509 
2510 		m_aItemFL		( this, SVX_RES( FL_ITEM ) ),
2511 		m_aNameFT		( this, SVX_RES( FT_NAME ) ),
2512 		m_aNameED		( this, SVX_RES( ED_NAME ) ),
2513 		m_aDefaultFT	( this, SVX_RES( FT_DEFAULT ) ),
2514 		m_aDefaultED	( this, SVX_RES( ED_DEFAULT ) ),
2515 		m_aDefaultBtn	( this, SVX_RES( PB_DEFAULT ) ),
2516 		m_aSettingsFL	( this, SVX_RES( FL_SETTINGS ) ),
2517 		m_aDataTypeFT	( this, SVX_RES( FT_DATATYPE ) ),
2518 		m_aDataTypeLB	( this, SVX_RES( LB_DATATYPE ) ),
2519 		m_aRequiredCB	( this, SVX_RES( CB_REQUIRED ) ),
2520 		m_aRequiredBtn	( this, SVX_RES( PB_REQUIRED ) ),
2521 		m_aRelevantCB	( this, SVX_RES( CB_RELEVANT ) ),
2522 		m_aRelevantBtn	( this, SVX_RES( PB_RELEVANT ) ),
2523 		m_aConstraintCB	( this, SVX_RES( CB_CONSTRAINT ) ),
2524 		m_aConstraintBtn( this, SVX_RES( PB_CONSTRAINT ) ),
2525 		m_aReadonlyCB	( this, SVX_RES( CB_READONLY ) ),
2526 		m_aReadonlyBtn	( this, SVX_RES( PB_READONLY ) ),
2527 		m_aCalculateCB	( this, SVX_RES( CB_CALCULATE ) ),
2528 		m_aCalculateBtn	( this, SVX_RES( PB_CALCULATE ) ),
2529 		m_aButtonsFL	( this, SVX_RES( FL_DATANAV_BTN ) ),
2530 		m_aOKBtn		( this, SVX_RES( BTN_DATANAV_OK ) ),
2531 		m_aEscBtn		( this, SVX_RES( BTN_DATANAV_ESC ) ),
2532 		m_aHelpBtn		( this, SVX_RES( BTN_DATANAV_HELP ) ),
2533 
2534 		m_xUIHelper		( _rUIHelper ),
2535 		m_pItemNode		( _pNode ),
2536 		m_eItemType		( DITNone ),
2537 		m_sFL_Element	( SVX_RES( STR_FIXEDLINE_ELEMENT ) ),
2538 		m_sFL_Attribute	( SVX_RES( STR_FIXEDLINE_ATTRIBUTE ) ),
2539         m_sFL_Binding   ( SVX_RES( STR_FIXEDLINE_BINDING ) ),
2540         m_sFT_BindingExp( SVX_RES( STR_FIXEDTEXT_BINDING ) )
2541 
2542 	{
2543 		FreeResource();
2544         m_aDataTypeLB.SetDropDownLineCount( 10 );
2545 
2546         InitDialog();
2547 		InitFromNode();
2548 		InitDataTypeBox();
2549 		CheckHdl( NULL );
2550 	}
2551 
2552 	//------------------------------------------------------------------------
2553 	AddDataItemDialog::~AddDataItemDialog()
2554 	{
2555 		if ( m_xTempBinding.is() )
2556 		{
2557 			Reference< css::xforms::XModel > xModel( m_xUIHelper, UNO_QUERY );
2558 			if ( xModel.is() )
2559 			{
2560 				try
2561 				{
2562 					Reference < XSet > xBindings = xModel->getBindings();
2563 					if ( xBindings.is() )
2564 						xBindings->remove( makeAny( m_xTempBinding ) );
2565 				}
2566 				catch ( Exception& )
2567 				{
2568 					DBG_ERRORFILE( "AddDataItemDialog::Dtor(): exception caught" );
2569 				}
2570 			}
2571 		}
2572         if( m_xUIHelper.is()  &&  m_xBinding.is() )
2573         {
2574             // remove binding, if it does not convey 'useful' information
2575             m_xUIHelper->removeBindingIfUseless( m_xBinding );
2576         }
2577 	}
2578 
2579 	//------------------------------------------------------------------------
2580 	IMPL_LINK( AddDataItemDialog, CheckHdl, CheckBox *, pBox )
2581 	{
2582 		// Condition buttons are only enable if their check box is checked
2583 		m_aReadonlyBtn.Enable( m_aReadonlyCB.IsChecked() );
2584 		m_aRequiredBtn.Enable( m_aRequiredCB.IsChecked() );
2585 		m_aRelevantBtn.Enable( m_aRelevantCB.IsChecked() );
2586 		m_aConstraintBtn.Enable( m_aConstraintCB.IsChecked() );
2587 		m_aCalculateBtn.Enable( m_aCalculateCB.IsChecked() );
2588 
2589 		if ( pBox && m_xTempBinding.is() )
2590 		{
2591 			::rtl::OUString sTemp, sPropName;
2592 			if ( &m_aRequiredCB == pBox )
2593 				sPropName = PN_REQUIRED_EXPR;
2594 			else if ( &m_aRelevantCB == pBox )
2595 				sPropName = PN_RELEVANT_EXPR;
2596 			else if ( &m_aConstraintCB == pBox )
2597 				sPropName = PN_CONSTRAINT_EXPR;
2598 			else if ( &m_aReadonlyCB == pBox )
2599 				sPropName = PN_READONLY_EXPR;
2600 			else if ( &m_aCalculateCB == pBox )
2601 				sPropName = PN_CALCULATE_EXPR;
2602 			bool bIsChecked = ( pBox->IsChecked() != sal_False );
2603 			m_xTempBinding->getPropertyValue( sPropName ) >>= sTemp;
2604 			if ( bIsChecked && sTemp.getLength() == 0 )
2605 				sTemp = TRUE_VALUE;
2606 			else if ( !bIsChecked && sTemp.getLength() > 0 )
2607 				sTemp = ::rtl::OUString();
2608 			m_xTempBinding->setPropertyValue( sPropName, makeAny( sTemp ) );
2609 		}
2610 
2611 		return 0;
2612 	}
2613 
2614 	//------------------------------------------------------------------------
2615 	IMPL_LINK( AddDataItemDialog, ConditionHdl, PushButton *, pBtn )
2616 	{
2617 		::rtl::OUString sTemp, sPropName;
2618 		if ( &m_aDefaultBtn == pBtn )
2619 			sPropName = PN_BINDING_EXPR;
2620 		else if ( &m_aRequiredBtn == pBtn )
2621 			sPropName = PN_REQUIRED_EXPR;
2622 		else if ( &m_aRelevantBtn == pBtn )
2623 			sPropName = PN_RELEVANT_EXPR;
2624 		else if ( &m_aConstraintBtn == pBtn )
2625 			sPropName = PN_CONSTRAINT_EXPR;
2626 		else if ( &m_aReadonlyBtn == pBtn )
2627 			sPropName = PN_READONLY_EXPR;
2628 		else if ( &m_aCalculateBtn == pBtn )
2629 			sPropName = PN_CALCULATE_EXPR;
2630 		AddConditionDialog aDlg( this, sPropName, m_xTempBinding );
2631 		bool bIsDefBtn = ( &m_aDefaultBtn == pBtn );
2632 		String sCondition;
2633 		if ( bIsDefBtn )
2634 			sCondition = m_aDefaultED.GetText();
2635 		else
2636 		{
2637 			m_xTempBinding->getPropertyValue( sPropName ) >>= sTemp;
2638 			if ( sTemp.getLength() == 0 )
2639 				sTemp = TRUE_VALUE;
2640 			sCondition = sTemp;
2641 		}
2642 		aDlg.SetCondition( sCondition );
2643 
2644 		if ( aDlg.Execute() == RET_OK )
2645 		{
2646 			String sNewCondition = aDlg.GetCondition();
2647 			if ( bIsDefBtn )
2648 				m_aDefaultED.SetText( sNewCondition );
2649 			else
2650 			{
2651 
2652 				m_xTempBinding->setPropertyValue(
2653 					sPropName, makeAny( ::rtl::OUString( sNewCondition ) ) );
2654 			}
2655 		}
2656 		return 0;
2657 	}
2658 
2659 	void copyPropSet( const Reference< XPropertySet >& xFrom, Reference< XPropertySet >& xTo )
2660 	{
2661 	    DBG_ASSERT( xFrom.is(), "copyPropSet(): no source" );
2662 	    DBG_ASSERT( xTo.is(), "copyPropSet(): no target" );
2663 
2664 		try
2665 		{
2666 		    // get property names & infos, and iterate over target properties
2667 		    Sequence< Property > aProperties = xTo->getPropertySetInfo()->getProperties();
2668 		    sal_Int32 nProperties = aProperties.getLength();
2669 		    const Property* pProperties = aProperties.getConstArray();
2670 		    Reference< XPropertySetInfo > xFromInfo = xFrom->getPropertySetInfo();
2671 		    for ( sal_Int32 i = 0; i < nProperties; ++i )
2672 		    {
2673 		        const ::rtl::OUString& rName = pProperties[i].Name;
2674 
2675 		        // if both set have the property, copy the value
2676 		        // (catch and ignore exceptions, if any)
2677 		        if ( xFromInfo->hasPropertyByName( rName ) )
2678 		        {
2679 					// don't set readonly properties
2680 		            Property aProperty = xFromInfo->getPropertyByName( rName );
2681 		            if ( ( aProperty.Attributes & PropertyAttribute::READONLY ) == 0 )
2682 		                xTo->setPropertyValue(rName, xFrom->getPropertyValue( rName ));
2683 		        }
2684 		        // else: no property? then ignore.
2685 		    }
2686 		}
2687 		catch ( Exception& )
2688 		{
2689             DBG_ERRORFILE( "copyPropSet(): exception caught" );
2690 		}
2691 	}
2692 
2693 	//------------------------------------------------------------------------
2694 	IMPL_LINK( AddDataItemDialog, OKHdl, OKButton *, EMPTYARG )
2695 	{
2696         bool bIsHandleBinding = ( DITBinding == m_eItemType );
2697         bool bIsHandleText = ( DITText == m_eItemType );
2698 		::rtl::OUString sNewName( m_aNameED.GetText() );
2699 
2700         if ( ( !bIsHandleBinding && !bIsHandleText && !m_xUIHelper->isValidXMLName( sNewName ) ) ||
2701 			 ( bIsHandleBinding && sNewName.getLength() == 0 ) )
2702 		{
2703 			// Error and don't close the dialog
2704 			ErrorBox aErrBox( this, SVX_RES( RID_ERR_INVALID_XMLNAME ) );
2705 			String sMessText = aErrBox.GetMessText();
2706 			sMessText.SearchAndReplace( MSG_VARIABLE, sNewName );
2707 			aErrBox.SetMessText( sMessText );
2708 			aErrBox.Execute();
2709 			return 0;
2710 		}
2711 
2712         ::rtl::OUString sDataType( m_aDataTypeLB.GetSelectEntry() );
2713         m_xTempBinding->setPropertyValue( PN_BINDING_TYPE, makeAny( sDataType ) );
2714 
2715         if ( bIsHandleBinding )
2716 		{
2717 			// copy properties from temp binding to original binding
2718             copyPropSet( m_xTempBinding, m_pItemNode->m_xPropSet );
2719 			try
2720 			{
2721                 ::rtl::OUString sValue = m_aNameED.GetText();
2722 				m_pItemNode->m_xPropSet->setPropertyValue( PN_BINDING_ID, makeAny( sValue ) );
2723 				sValue = m_aDefaultED.GetText();
2724 				m_pItemNode->m_xPropSet->setPropertyValue( PN_BINDING_EXPR, makeAny( sValue ) );
2725 			}
2726 			catch ( Exception& )
2727 			{
2728                 DBG_ERRORFILE( "AddDataDialog::OKHdl(): exception caught" );
2729 			}
2730 		}
2731 		else
2732 		{
2733 			// copy properties from temp binding to original binding
2734 			copyPropSet( m_xTempBinding, m_xBinding );
2735 			try
2736 			{
2737                 if ( bIsHandleText )
2738                     m_xUIHelper->setNodeValue( m_pItemNode->m_xNode, m_aDefaultED.GetText() );
2739                 else
2740                 {
2741                     Reference< css::xml::dom::XNode > xNewNode =
2742                         m_xUIHelper->renameNode( m_pItemNode->m_xNode, m_aNameED.GetText() );
2743                     m_xUIHelper->setNodeValue( xNewNode, m_aDefaultED.GetText() );
2744                     m_pItemNode->m_xNode = xNewNode;
2745                 }
2746 			}
2747 			catch ( Exception& )
2748 			{
2749                 DBG_ERRORFILE( "AddDataDialog::OKHdl(): exception caught" );
2750 			}
2751 		}
2752 		// then close the dialog
2753 		EndDialog( RET_OK );
2754 		return 0;
2755 	}
2756 
2757 	//------------------------------------------------------------------------
2758 	void AddDataItemDialog::InitDialog()
2759 	{
2760 		// set handler
2761 		Link aLink = LINK( this, AddDataItemDialog, CheckHdl );
2762 		m_aRequiredCB.SetClickHdl( aLink );
2763 		m_aRelevantCB.SetClickHdl( aLink );
2764 		m_aConstraintCB.SetClickHdl( aLink );
2765 		m_aReadonlyCB.SetClickHdl( aLink );
2766 		m_aCalculateCB.SetClickHdl( aLink );
2767 
2768 		aLink = LINK( this, AddDataItemDialog, ConditionHdl );
2769 		m_aDefaultBtn.SetClickHdl( aLink );
2770 		m_aRequiredBtn.SetClickHdl( aLink );
2771 		m_aRelevantBtn.SetClickHdl( aLink );
2772 		m_aConstraintBtn.SetClickHdl( aLink );
2773 		m_aReadonlyBtn.SetClickHdl( aLink );
2774 		m_aCalculateBtn.SetClickHdl( aLink );
2775 
2776 		m_aOKBtn.SetClickHdl( LINK( this, AddDataItemDialog, OKHdl ) );
2777 	}
2778 
2779 	//------------------------------------------------------------------------
2780 	void AddDataItemDialog::InitFromNode()
2781 	{
2782 		if ( m_pItemNode )
2783 		{
2784 			if ( m_pItemNode->m_xNode.is() )
2785 			{
2786 				try
2787 				{
2788 					// detect type of the node
2789 					css::xml::dom::NodeType eChildType = m_pItemNode->m_xNode->getNodeType();
2790 					switch ( eChildType )
2791 					{
2792 						case css::xml::dom::NodeType_ATTRIBUTE_NODE:
2793 							m_eItemType = DITAttribute;
2794 							break;
2795 						case css::xml::dom::NodeType_ELEMENT_NODE:
2796 							m_eItemType = DITElement;
2797 							break;
2798 						case css::xml::dom::NodeType_TEXT_NODE:
2799 							m_eItemType = DITText;
2800 							break;
2801                         default:
2802                             DBG_ERROR( "AddDataItemDialog::InitFronNode: cannot handle this node type!" );
2803                             break;
2804 					}
2805 
2806 					/** Get binding of the node and clone it
2807 						Then use this temporary binding in the dialog.
2808 						When the user click OK the temporary binding will be copied
2809 						into the original binding.
2810 					 */
2811 
2812 					Reference< css::xml::dom::XNode > xNode = m_pItemNode->m_xNode;
2813                     m_xBinding = m_xUIHelper->getBindingForNode( xNode, sal_True );
2814                     if ( m_xBinding.is() )
2815                     {
2816                         Reference< css::xforms::XModel > xModel( m_xUIHelper, UNO_QUERY );
2817                         if ( xModel.is() )
2818                         {
2819                             m_xTempBinding = m_xUIHelper->cloneBindingAsGhost( m_xBinding );
2820                             Reference < XSet > xBindings = xModel->getBindings();
2821                             if ( xBindings.is() )
2822                                 xBindings->insert( makeAny( m_xTempBinding ) );
2823                         }
2824                     }
2825 
2826                     if ( m_eItemType != DITText )
2827                     {
2828                         ::rtl::OUString sName( m_xUIHelper->getNodeName( m_pItemNode->m_xNode ) );
2829                         m_aNameED.SetText( sName );
2830                     }
2831 					m_aDefaultED.SetText( m_pItemNode->m_xNode->getNodeValue() );
2832 				}
2833 				catch( Exception& )
2834 				{
2835 					DBG_ERRORFILE( "AddDataItemDialog::InitFromNode(): exception caught" );
2836 				}
2837 			}
2838 			else if ( m_pItemNode->m_xPropSet.is() )
2839 			{
2840 				m_eItemType = DITBinding;
2841 				Reference< css::xforms::XModel > xModel( m_xUIHelper, UNO_QUERY );
2842 				if ( xModel.is() )
2843                 {
2844 					try
2845 					{
2846 						m_xTempBinding = m_xUIHelper->cloneBindingAsGhost( m_pItemNode->m_xPropSet );
2847 						Reference < XSet > xBindings = xModel->getBindings();
2848 						if ( xBindings.is() )
2849 							xBindings->insert( makeAny( m_xTempBinding ) );
2850 					}
2851 					catch ( Exception& )
2852 					{
2853                         DBG_ERRORFILE( "AddDataItemDialog::InitFromNode(): exception caught" );
2854 					}
2855                 }
2856 				rtl::OUString sTemp;
2857 				try
2858 				{
2859 					Reference< XPropertySetInfo > xInfo = m_pItemNode->m_xPropSet->getPropertySetInfo();
2860 					if ( xInfo->hasPropertyByName( PN_BINDING_ID ) )
2861 					{
2862 						m_pItemNode->m_xPropSet->getPropertyValue( PN_BINDING_ID ) >>= sTemp;
2863 						m_aNameED.SetText( sTemp );
2864 						m_pItemNode->m_xPropSet->getPropertyValue( PN_BINDING_EXPR ) >>= sTemp;
2865 						m_aDefaultED.SetText( sTemp );
2866 					}
2867 					else if ( xInfo->hasPropertyByName( PN_SUBMISSION_BIND ) )
2868 					{
2869 						m_pItemNode->m_xPropSet->getPropertyValue( PN_SUBMISSION_ID ) >>= sTemp;
2870 						m_aNameED.SetText( sTemp );
2871 					}
2872 				}
2873 				catch( Exception& )
2874 				{
2875 					DBG_ERRORFILE( "AddDataItemDialog::InitFromNode(): exception caught" );
2876 				}
2877 
2878 				Size a3and1Sz = LogicToPixel( Size( 3, 1 ), MAP_APPFONT );
2879 				Size aNewSz = m_aDefaultED.GetSizePixel();
2880 				Point aNewPnt = m_aDefaultED.GetPosPixel();
2881 				aNewPnt.Y() += a3and1Sz.Height();
2882 				aNewSz.Width() -= ( m_aDefaultBtn.GetSizePixel().Width() + a3and1Sz.Width() );
2883 				m_aDefaultED.SetPosSizePixel( aNewPnt, aNewSz );
2884 				m_aDefaultBtn.Show();
2885 			}
2886 
2887             if ( m_xTempBinding.is() )
2888 			{
2889 				::rtl::OUString sTemp;
2890 				try
2891 				{
2892 					if ( ( m_xTempBinding->getPropertyValue( PN_REQUIRED_EXPR ) >>= sTemp )
2893 	    				&& sTemp.getLength() > 0 )
2894 						m_aRequiredCB.Check( sal_True );
2895 					if ( ( m_xTempBinding->getPropertyValue( PN_RELEVANT_EXPR ) >>= sTemp )
2896 						&& sTemp.getLength() > 0 )
2897 						m_aRelevantCB.Check( sal_True );
2898 					if ( ( m_xTempBinding->getPropertyValue( PN_CONSTRAINT_EXPR ) >>= sTemp )
2899 						&& sTemp.getLength() > 0 )
2900 						m_aConstraintCB.Check( sal_True );
2901 					if ( ( m_xTempBinding->getPropertyValue( PN_READONLY_EXPR ) >>= sTemp )
2902 						&& sTemp.getLength() > 0 )
2903 						m_aReadonlyCB.Check( sal_True );
2904 					if ( ( m_xTempBinding->getPropertyValue( PN_CALCULATE_EXPR ) >>= sTemp )
2905 						&& sTemp.getLength() > 0 )
2906 						m_aCalculateCB.Check( sal_True );
2907 				}
2908 				catch ( Exception& )
2909 				{
2910                     DBG_ERRORFILE( "AddDataItemDialog::InitFromNode(): exception caught" );
2911 				}
2912 			}
2913 		}
2914 
2915         if ( DITText == m_eItemType )
2916         {
2917             long nDelta = m_aButtonsFL.GetPosPixel().Y() - m_aSettingsFL.GetPosPixel().Y();
2918             size_t i = 0;
2919             Window* pWinsForHide[] =
2920             {
2921                 &m_aSettingsFL, &m_aDataTypeFT, &m_aDataTypeLB, &m_aRequiredCB,
2922                 &m_aRequiredBtn, &m_aRelevantCB, &m_aRelevantBtn, &m_aConstraintCB,
2923                 &m_aConstraintBtn, &m_aReadonlyCB, &m_aReadonlyBtn, &m_aCalculateCB,
2924                 &m_aCalculateBtn
2925             };
2926             Window** pCurrent = pWinsForHide;
2927             for ( ; i < sizeof( pWinsForHide ) / sizeof( pWinsForHide[ 0 ] ); ++i, ++pCurrent )
2928                 (*pCurrent)->Hide();
2929 
2930             Window* pWinsForMove[] =
2931             {
2932                 &m_aButtonsFL, &m_aOKBtn, &m_aEscBtn, &m_aHelpBtn
2933             };
2934             pCurrent = pWinsForMove;
2935             for ( i = 0; i < sizeof( pWinsForMove ) / sizeof( pWinsForMove[ 0 ] ); ++i, ++pCurrent )
2936             {
2937                 Point aNewPos = (*pCurrent)->GetPosPixel();
2938                 aNewPos.Y() -= nDelta;
2939                 (*pCurrent)->SetPosPixel( aNewPos );
2940             }
2941             Size aNewWinSz = GetSizePixel();
2942             aNewWinSz.Height() -= nDelta;
2943             SetSizePixel( aNewWinSz );
2944 
2945             m_aNameFT.Disable();
2946             m_aNameED.Disable();
2947         }
2948 	}
2949 
2950 	//------------------------------------------------------------------------
2951 	void AddDataItemDialog::InitDataTypeBox()
2952 	{
2953         if ( m_eItemType != DITText )
2954         {
2955             Reference< css::xforms::XModel > xModel( m_xUIHelper, UNO_QUERY );
2956             if ( xModel.is() )
2957             {
2958                 try
2959                 {
2960                     Reference< css::xforms::XDataTypeRepository > xDataTypes =
2961                         xModel->getDataTypeRepository();
2962                     if ( xDataTypes.is() )
2963                     {
2964                         Sequence< ::rtl::OUString > aNameList = xDataTypes->getElementNames();
2965                         sal_Int32 i, nCount = aNameList.getLength();
2966                         ::rtl::OUString* pNames = aNameList.getArray();
2967                         for ( i = 0; i < nCount; ++i )
2968                             m_aDataTypeLB.InsertEntry( pNames[i] );
2969                     }
2970 
2971                     if ( m_xTempBinding.is() )
2972                     {
2973                         rtl::OUString sTemp;
2974                         if ( m_xTempBinding->getPropertyValue( PN_BINDING_TYPE ) >>= sTemp )
2975                         {
2976                             sal_uInt16 nPos = m_aDataTypeLB.GetEntryPos( String( sTemp ) );
2977                             if ( LISTBOX_ENTRY_NOTFOUND == nPos )
2978                                 nPos = m_aDataTypeLB.InsertEntry( sTemp );
2979                             m_aDataTypeLB.SelectEntryPos( nPos );
2980                         }
2981                     }
2982                 }
2983                 catch ( Exception& )
2984                 {
2985                     DBG_ERRORFILE( "AddDataItemDialog::InitDataTypeBox(): exception caught" );
2986                 }
2987             }
2988         }
2989 	}
2990 
2991 	void AddDataItemDialog::InitText( DataItemType _eType )
2992 	{
2993 		String sText;
2994 
2995 		switch ( _eType )
2996 		{
2997 			case DITAttribute :
2998 			{
2999 				sText = m_sFL_Attribute;
3000 				break;
3001 			}
3002 
3003 			case DITBinding :
3004 			{
3005 				sText = m_sFL_Binding;
3006                 m_aDefaultFT.SetText( m_sFT_BindingExp );
3007 				break;
3008 			}
3009 
3010 			default:
3011 			{
3012 				sText = m_sFL_Element;
3013 			}
3014 		}
3015 
3016 		m_aItemFL.SetText( sText );
3017 	}
3018 
3019 	//========================================================================
3020 	// class AddConditionDialog
3021 	//========================================================================
3022 
3023 	AddConditionDialog::AddConditionDialog(
3024 		Window* pParent, const ::rtl::OUString& _rPropertyName,
3025 		const Reference< XPropertySet >& _rPropSet ) :
3026 
3027 		ModalDialog( pParent, SVX_RES( RID_SVXDLG_ADD_CONDITION ) ),
3028 
3029 		m_aConditionFT		( this, SVX_RES( FT_CONDITION ) ),
3030 		m_aConditionED		( this, SVX_RES( ED_CONDITION ) ),
3031 		m_aResultFT			( this, SVX_RES( FT_RESULT ) ),
3032 		m_aResultWin		( this, SVX_RES( FT_RESULT_PREVIEW ) ),
3033 		m_aEditNamespacesBtn( this, SVX_RES( PB_EDIT_NAMESPACES ) ),
3034 		m_aButtonsFL		( this, SVX_RES( FL_DATANAV_BTN ) ),
3035 		m_aOKBtn			( this, SVX_RES( BTN_DATANAV_OK ) ),
3036 		m_aEscBtn			( this, SVX_RES( BTN_DATANAV_ESC ) ),
3037 		m_aHelpBtn			( this, SVX_RES( BTN_DATANAV_HELP ) ),
3038 
3039 		m_sPropertyName		( _rPropertyName ),
3040 		m_xBinding			( _rPropSet )
3041 
3042 	{
3043 		FreeResource();
3044 
3045 		DBG_ASSERT( m_xBinding.is(), "AddConditionDialog::Ctor(): no Binding" );
3046 
3047 		m_aResultWin.SetBackground( m_aConditionED.GetBackground() );
3048 		m_aConditionED.SetModifyHdl( LINK( this, AddConditionDialog, ModifyHdl ) );
3049 		m_aEditNamespacesBtn.SetClickHdl( LINK( this, AddConditionDialog, EditHdl ) );
3050 		m_aOKBtn.SetClickHdl( LINK( this, AddConditionDialog, OKHdl ) );
3051 		m_aResultTimer.SetTimeout( 500 );
3052 		m_aResultTimer.SetTimeoutHdl( LINK( this, AddConditionDialog, ResultHdl ) );
3053 
3054 		if ( m_sPropertyName.getLength() > 0 )
3055 		{
3056 			try
3057 			{
3058 				rtl::OUString sTemp;
3059 				if ( ( m_xBinding->getPropertyValue( m_sPropertyName ) >>= sTemp )
3060 					&& sTemp.getLength() > 0 )
3061 				{
3062 					m_aConditionED.SetText( sTemp );
3063 				}
3064 				else
3065 				{
3066 //!					m_xBinding->setPropertyValue( m_sPropertyName, makeAny( TRUE_VALUE ) );
3067 					m_aConditionED.SetText( TRUE_VALUE );
3068 				}
3069 
3070 				Reference< css::xforms::XModel > xModel;
3071 				if ( ( m_xBinding->getPropertyValue( PN_BINDING_MODEL ) >>= xModel ) && xModel.is() )
3072 					m_xUIHelper = Reference< css::xforms::XFormsUIHelper1 >( xModel, UNO_QUERY );
3073 			}
3074 			catch ( Exception& )
3075 			{
3076 				DBG_ERRORFILE( "AddConditionDialog::Ctor(): exception caught" );
3077 			}
3078 		}
3079 
3080 		DBG_ASSERT( m_xUIHelper.is(), "AddConditionDialog::Ctor(): no UIHelper" );
3081 		ResultHdl( &m_aResultTimer );
3082 	}
3083 
3084 	//------------------------------------------------------------------------
3085 	AddConditionDialog::~AddConditionDialog()
3086 	{
3087 	}
3088 
3089 	//------------------------------------------------------------------------
3090 	IMPL_LINK( AddConditionDialog, EditHdl, PushButton *, EMPTYARG )
3091 	{
3092 		Reference< XNameContainer > xNameContnr;
3093 		try
3094 		{
3095 			m_xBinding->getPropertyValue( PN_BINDING_NAMESPACES ) >>= xNameContnr;
3096 		}
3097 		catch ( Exception& )
3098 		{
3099             DBG_ERRORFILE( "AddDataItemDialog::EditHdl(): exception caught" );
3100 		}
3101 		NamespaceItemDialog aDlg( this, xNameContnr );
3102 		aDlg.Execute();
3103 		try
3104 		{
3105 			m_xBinding->setPropertyValue( PN_BINDING_NAMESPACES, makeAny( xNameContnr ) );
3106 		}
3107 		catch ( Exception& )
3108 		{
3109 			DBG_ERRORFILE( "AddDataItemDialog::EditHdl(): exception caught" );
3110 		}
3111 		return 0;
3112 	}
3113 
3114 	//------------------------------------------------------------------------
3115 	IMPL_LINK( AddConditionDialog, OKHdl, OKButton *, EMPTYARG )
3116 	{
3117 /*!!!
3118         try
3119         {
3120             if ( m_xBinding.is() )
3121                 m_xBinding->setPropertyValue( m_sPropertyName, makeAny( ::rtl::OUString( m_aConditionED.GetText() ) ) );
3122         }
3123         catch( const Exception& )
3124         {
3125         	DBG_ERRORFILE( "AddConditionDialog, OKHdl: caught an exception!" );
3126         }
3127 */
3128 		EndDialog( RET_OK );
3129 		return 0;
3130 	}
3131 
3132 	//------------------------------------------------------------------------
3133 	IMPL_LINK( AddConditionDialog, ModifyHdl, MultiLineEdit *, EMPTYARG )
3134 	{
3135 		m_aResultTimer.Start();
3136 		return 0;
3137 	}
3138 
3139 	//------------------------------------------------------------------------
3140 	IMPL_LINK( AddConditionDialog, ResultHdl, Timer *, EMPTYARG )
3141 	{
3142 		String sCondition = m_aConditionED.GetText().EraseLeadingChars().EraseTrailingChars();
3143 		String sResult;
3144 		if ( sCondition.Len() > 0 )
3145 		{
3146 			try
3147 			{
3148 				sResult = m_xUIHelper->getResultForExpression( m_xBinding, ( m_sPropertyName == PN_BINDING_EXPR ), sCondition );
3149 			}
3150 			catch ( Exception& )
3151 			{
3152 				DBG_ERRORFILE( "AddConditionDialog::ResultHdl(): exception caught" );
3153 			}
3154 		}
3155 		m_aResultWin.SetText( sResult );
3156 		return 0;
3157 	}
3158 
3159 	//========================================================================
3160 	// class NamespaceItemDialog
3161 	//========================================================================
3162 
3163 	NamespaceItemDialog::NamespaceItemDialog(
3164 		AddConditionDialog* _pCondDlg, Reference< XNameContainer >& _rContainer ) :
3165 
3166 		ModalDialog( _pCondDlg, SVX_RES( RID_SVXDLG_NAMESPACE_ITEM ) ),
3167 
3168 		m_aNamespacesFT			( this, SVX_RES( FT_NAMESPACES ) ),
3169 		m_aNamespacesList		( this, SVX_RES( LB_NAMESPACES ) ),
3170 		m_aAddNamespaceBtn		( this, SVX_RES( PB_ADD_NAMESPACE ) ),
3171 		m_aEditNamespaceBtn		( this, SVX_RES( PB_EDIT_NAMESPACE ) ),
3172 		m_aDeleteNamespaceBtn	( this, SVX_RES( PB_DELETE_NAMESPACE ) ),
3173 		m_aButtonsFL			( this, SVX_RES( FL_DATANAV_BTN ) ),
3174 		m_aOKBtn				( this, SVX_RES( BTN_DATANAV_OK ) ),
3175 		m_aEscBtn				( this, SVX_RES( BTN_DATANAV_ESC ) ),
3176 		m_aHelpBtn				( this, SVX_RES( BTN_DATANAV_HELP ) ),
3177 
3178 		m_pConditionDlg			( _pCondDlg ),
3179 		m_rNamespaces			( _rContainer )
3180 
3181 	{
3182 		static long aStaticTabs[]= { 3, 0, 35, 200 };
3183 		m_aNamespacesList.SvxSimpleTable::SetTabs( aStaticTabs );
3184 		String sHeader = String( SVX_RES( STR_HEADER_PREFIX ) );
3185 		sHeader += '\t';
3186 		sHeader += String( SVX_RES( STR_HEADER_URL ) );
3187 		m_aNamespacesList.InsertHeaderEntry(
3188 			sHeader, HEADERBAR_APPEND, HIB_LEFT /*| HIB_FIXEDPOS | HIB_FIXED*/ );
3189 
3190 		FreeResource();
3191 
3192 		m_aNamespacesList.SetSelectHdl( LINK( this, NamespaceItemDialog, SelectHdl ) );
3193 		Link aLink = LINK( this, NamespaceItemDialog, ClickHdl );
3194 		m_aAddNamespaceBtn.SetClickHdl( aLink );
3195 		m_aEditNamespaceBtn.SetClickHdl( aLink );
3196 		m_aDeleteNamespaceBtn.SetClickHdl( aLink );
3197 		m_aOKBtn.SetClickHdl( LINK( this, NamespaceItemDialog, OKHdl ) );
3198 
3199 		LoadNamespaces();
3200 		SelectHdl( &m_aNamespacesList );
3201 	}
3202 
3203 	//------------------------------------------------------------------------
3204 	NamespaceItemDialog::~NamespaceItemDialog()
3205 	{
3206 	}
3207 
3208 	//------------------------------------------------------------------------
3209 	IMPL_LINK( NamespaceItemDialog, SelectHdl, SvxSimpleTable *,  EMPTYARG )
3210 	{
3211 		sal_Bool bEnable = ( m_aNamespacesList.FirstSelected() != NULL );
3212 		m_aEditNamespaceBtn.Enable( bEnable );
3213 		m_aDeleteNamespaceBtn.Enable( bEnable );
3214 
3215 		return 0;
3216 	}
3217 
3218 	//------------------------------------------------------------------------
3219 	IMPL_LINK( NamespaceItemDialog, ClickHdl, PushButton *, pBtn )
3220 	{
3221 		if ( &m_aAddNamespaceBtn == pBtn )
3222 		{
3223 			ManageNamespaceDialog aDlg( this, m_pConditionDlg, false );
3224 			if ( aDlg.Execute() == RET_OK )
3225 			{
3226 				String sEntry = aDlg.GetPrefix();
3227 				sEntry += '\t';
3228 				sEntry += aDlg.GetURL();
3229 				m_aNamespacesList.InsertEntry( sEntry );
3230 			}
3231 		}
3232 		else if ( &m_aEditNamespaceBtn == pBtn )
3233 		{
3234 			ManageNamespaceDialog aDlg( this, m_pConditionDlg, true );
3235 			SvLBoxEntry* pEntry = m_aNamespacesList.FirstSelected();
3236 			DBG_ASSERT( pEntry, "NamespaceItemDialog::ClickHdl(): no entry" );
3237 			String sPrefix( m_aNamespacesList.GetEntryText( pEntry, 0 ) );
3238 			aDlg.SetNamespace(
3239 				sPrefix,
3240 				m_aNamespacesList.GetEntryText( pEntry, 1 ) );
3241 			if ( aDlg.Execute() == RET_OK )
3242 			{
3243                 // if a prefix was changed, mark the old prefix as 'removed'
3244                 if( sPrefix != aDlg.GetPrefix() )
3245                     m_aRemovedList.push_back( sPrefix );
3246 
3247 				m_aNamespacesList.SetEntryText( aDlg.GetPrefix(), pEntry, 0 );
3248 				m_aNamespacesList.SetEntryText( aDlg.GetURL(), pEntry, 1 );
3249 			}
3250 		}
3251 		else if ( &m_aDeleteNamespaceBtn == pBtn )
3252 		{
3253 			SvLBoxEntry* pEntry = m_aNamespacesList.FirstSelected();
3254 			DBG_ASSERT( pEntry, "NamespaceItemDialog::ClickHdl(): no entry" );
3255 			::rtl::OUString sPrefix( m_aNamespacesList.GetEntryText( pEntry, 0 ) );
3256 			m_aRemovedList.push_back( sPrefix );
3257 			m_aNamespacesList.GetModel()->Remove( pEntry );
3258 		}
3259 		else
3260 		{
3261 			DBG_ERRORFILE( "NamespaceItemDialog::ClickHdl(): invalid button" );
3262 		}
3263 
3264 		SelectHdl( &m_aNamespacesList );
3265 		return 0;
3266 	}
3267 
3268 	//------------------------------------------------------------------------
3269 	IMPL_LINK( NamespaceItemDialog, OKHdl, OKButton *, EMPTYARG )
3270 	{
3271 		try
3272 		{
3273 			// update namespace container
3274 			sal_Int32 i, nRemovedCount = m_aRemovedList.size();
3275 			for( i = 0; i < nRemovedCount; ++i )
3276 				m_rNamespaces->removeByName( m_aRemovedList[i] );
3277 
3278 			sal_Int32 nEntryCount = m_aNamespacesList.GetEntryCount();
3279 			for( i = 0; i < nEntryCount; ++i )
3280 			{
3281 				SvLBoxEntry* pEntry = m_aNamespacesList.GetEntry(i);
3282 				::rtl::OUString sPrefix( m_aNamespacesList.GetEntryText( pEntry, 0 ) );
3283 				::rtl::OUString sURL( m_aNamespacesList.GetEntryText( pEntry, 1 ) );
3284 
3285 				if ( m_rNamespaces->hasByName( sPrefix ) )
3286 					m_rNamespaces->replaceByName( sPrefix, makeAny( sURL ) );
3287 				else
3288 					m_rNamespaces->insertByName( sPrefix, makeAny( sURL ) );
3289 			}
3290 		}
3291 		catch ( Exception& )
3292 		{
3293             DBG_ERRORFILE( "NamespaceItemDialog::OKHdl(): exception caught" );
3294 		}
3295 		// and close the dialog
3296 		EndDialog( RET_OK );
3297 		return 0;
3298 	}
3299 
3300 	//------------------------------------------------------------------------
3301 	void NamespaceItemDialog::LoadNamespaces()
3302 	{
3303 		try
3304 		{
3305 			Sequence< ::rtl::OUString > aAllNames = m_rNamespaces->getElementNames();
3306 			const ::rtl::OUString* pAllNames = aAllNames.getConstArray();
3307 			const ::rtl::OUString* pAllNamesEnd = pAllNames + aAllNames.getLength();
3308 			for ( ; pAllNames != pAllNamesEnd; ++pAllNames )
3309 			{
3310 				::rtl::OUString sURL;
3311 				::rtl::OUString sPrefix = *pAllNames;
3312 				if ( m_rNamespaces->hasByName( sPrefix ) )
3313 				{
3314 					Any aAny = m_rNamespaces->getByName( sPrefix );
3315 					if ( aAny >>= sURL )
3316 					{
3317 						String sEntry( sPrefix );
3318 						sEntry += '\t';
3319 						sEntry += String( sURL );
3320 
3321 						m_aNamespacesList.InsertEntry( sEntry );
3322 					}
3323 				}
3324 			}
3325 		}
3326 		catch ( Exception& )
3327 		{
3328             DBG_ERRORFILE( "NamespaceItemDialog::LoadNamespaces(): exception caught" );
3329 		}
3330 	}
3331 
3332 	//========================================================================
3333 	// class ManageNamespaceDialog
3334 	//========================================================================
3335 
3336 	ManageNamespaceDialog::ManageNamespaceDialog(
3337 		Window* pParent, AddConditionDialog* _pCondDlg, bool _bIsEdit ) :
3338 
3339 		ModalDialog( pParent, SVX_RES( RID_SVXDLG_MANAGE_NAMESPACE ) ),
3340 
3341 		m_aPrefixFT		( this, SVX_RES( FT_PREFIX ) ),
3342 		m_aPrefixED		( this, SVX_RES( ED_PREFIX ) ),
3343 		m_aUrlFT		( this, SVX_RES( FT_URL ) ),
3344 		m_aUrlED		( this, SVX_RES( ED_URL ) ),
3345 		m_aButtonsFL	( this, SVX_RES( FL_DATANAV_BTN ) ),
3346 		m_aOKBtn		( this, SVX_RES( BTN_DATANAV_OK ) ),
3347 		m_aEscBtn		( this, SVX_RES( BTN_DATANAV_ESC ) ),
3348 		m_aHelpBtn		( this, SVX_RES( BTN_DATANAV_HELP ) ),
3349 
3350 		m_pConditionDlg	( _pCondDlg )
3351 
3352 	{
3353 		if ( _bIsEdit )
3354 			SetText( String( SVX_RES( STR_EDIT_TEXT ) ) );
3355 
3356 		FreeResource();
3357 
3358 		m_aOKBtn.SetClickHdl( LINK( this, ManageNamespaceDialog, OKHdl ) );
3359 	}
3360 
3361 	//------------------------------------------------------------------------
3362 	ManageNamespaceDialog::~ManageNamespaceDialog()
3363 	{
3364 	}
3365 
3366 	//------------------------------------------------------------------------
3367 	IMPL_LINK( ManageNamespaceDialog, OKHdl, OKButton *, EMPTYARG )
3368 	{
3369 		String sPrefix = m_aPrefixED.GetText();
3370 
3371 		try
3372 		{
3373 			if ( !m_pConditionDlg->GetUIHelper()->isValidPrefixName( sPrefix ) )
3374 			{
3375 				ErrorBox aErrBox( this, SVX_RES( RID_ERR_INVALID_XMLPREFIX ) );
3376 				String sMessText = aErrBox.GetMessText();
3377 				sMessText.SearchAndReplace( MSG_VARIABLE, sPrefix );
3378 				aErrBox.SetMessText( sMessText );
3379 				aErrBox.Execute();
3380 				return 0;
3381 			}
3382 		}
3383 		catch ( Exception& )
3384 		{
3385             DBG_ERRORFILE( "ManageNamespacesDialog::OKHdl(): exception caught" );
3386 		}
3387 
3388 		// no error so close the dialog
3389 		EndDialog( RET_OK );
3390 		return 0;
3391 	}
3392 
3393 	//========================================================================
3394 	// class AddSubmissionDialog
3395 	//========================================================================
3396 
3397 	AddSubmissionDialog::AddSubmissionDialog(
3398 		Window* pParent, ItemNode* _pNode,
3399 		const Reference< css::xforms::XFormsUIHelper1 >& _rUIHelper ) :
3400 
3401 		ModalDialog( pParent, SVX_RES( RID_SVXDLG_ADD_SUBMISSION ) ),
3402 
3403 		m_aSubmissionFL	( this, SVX_RES( FL_SUBMISSION ) ),
3404 		m_aNameFT		( this, SVX_RES( FT_SUBMIT_NAME ) ),
3405 		m_aNameED		( this, SVX_RES( ED_SUBMIT_NAME ) ),
3406 		m_aActionFT		( this, SVX_RES( FT_SUBMIT_ACTION ) ),
3407 		m_aActionED		( this, SVX_RES( ED_SUBMIT_ACTION ) ),
3408 		m_aMethodFT		( this, SVX_RES( FT_SUBMIT_METHOD ) ),
3409 		m_aMethodLB		( this, SVX_RES( LB_SUBMIT_METHOD ) ),
3410 		m_aRefFT		( this, SVX_RES( FT_SUBMIT_REF ) ),
3411 		m_aRefED		( this, SVX_RES( ED_SUBMIT_REF ) ),
3412 		m_aRefBtn		( this, SVX_RES( PB_SUBMIT_REF ) ),
3413 		m_aBindFT		( this, SVX_RES( FT_SUBMIT_BIND ) ),
3414 		m_aBindLB		( this, SVX_RES( LB_SUBMIT_BIND ) ),
3415 		m_aReplaceFT	( this, SVX_RES( FT_SUBMIT_REPLACE ) ),
3416 		m_aReplaceLB	( this, SVX_RES( LB_SUBMIT_REPLACE ) ),
3417 
3418 		m_aButtonsFL	( this, SVX_RES( FL_DATANAV_BTN ) ),
3419 		m_aOKBtn		( this, SVX_RES( BTN_DATANAV_OK ) ),
3420 		m_aEscBtn		( this, SVX_RES( BTN_DATANAV_ESC ) ),
3421 		m_aHelpBtn		( this, SVX_RES( BTN_DATANAV_HELP ) ),
3422 
3423 		m_pItemNode		( _pNode ),
3424 		m_xUIHelper		( _rUIHelper )
3425 
3426 	{
3427 		FillAllBoxes(); // we need local resources here, so call before FreeResource!!!
3428 
3429 		FreeResource();
3430 
3431 		m_aRefBtn.SetClickHdl( LINK( this, AddSubmissionDialog, RefHdl ) );
3432 		m_aOKBtn.SetClickHdl( LINK( this, AddSubmissionDialog, OKHdl ) );
3433 	}
3434 
3435 	//------------------------------------------------------------------------
3436 	AddSubmissionDialog::~AddSubmissionDialog()
3437 	{
3438         // #i38991# if we have added a binding, we need to remove it as well.
3439         if( m_xCreatedBinding.is() && m_xUIHelper.is() )
3440             m_xUIHelper->removeBindingIfUseless( m_xCreatedBinding );
3441 	}
3442 
3443 	//------------------------------------------------------------------------
3444 	IMPL_LINK( AddSubmissionDialog, RefHdl, PushButton *, EMPTYARG )
3445 	{
3446 		AddConditionDialog aDlg( this, PN_BINDING_EXPR, m_xTempBinding );
3447 		aDlg.SetCondition( m_aRefED.GetText() );
3448 		if ( aDlg.Execute() == RET_OK )
3449 			m_aRefED.SetText( aDlg.GetCondition() );
3450 
3451 		return 0;
3452 	}
3453 
3454 	//------------------------------------------------------------------------
3455 	IMPL_LINK( AddSubmissionDialog, OKHdl, OKButton *, EMPTYARG )
3456 	{
3457 		rtl::OUString sName(m_aNameED.GetText());
3458 		if(!sName.getLength()) {
3459 
3460 	        ErrorBox aErrorBox(this,SVX_RES(RID_ERR_EMPTY_SUBMISSIONNAME));
3461 			aErrorBox.SetText( Application::GetDisplayName() );
3462 			aErrorBox.Execute();
3463 			return 0;
3464 		}
3465 
3466 		if ( !m_xSubmission.is() )
3467 		{
3468 			DBG_ASSERT( !m_xNewSubmission.is(),
3469 				"AddSubmissionDialog::OKHdl(): new submission already exists" );
3470 
3471 			// add a new submission
3472 			Reference< css::xforms::XModel > xModel( m_xUIHelper, UNO_QUERY );
3473 			if ( xModel.is() )
3474 			{
3475 				try
3476 				{
3477 					m_xNewSubmission = xModel->createSubmission();
3478 					m_xSubmission = Reference< XPropertySet >( m_xNewSubmission, UNO_QUERY );
3479 				}
3480 				catch ( Exception& )
3481 				{
3482                     DBG_ERRORFILE( "AddSubmissionDialog::OKHdl(): exception caught" );
3483 				}
3484 			}
3485 		}
3486 
3487 		if ( m_xSubmission.is() )
3488 		{
3489 			rtl::OUString sTemp = m_aNameED.GetText();
3490 			try
3491 			{
3492 				m_xSubmission->setPropertyValue( PN_SUBMISSION_ID, makeAny( sTemp ) );
3493 				sTemp = m_aActionED.GetText();
3494 				m_xSubmission->setPropertyValue( PN_SUBMISSION_ACTION, makeAny( sTemp ) );
3495 				sTemp = lcl_MethodString::get().toAPI( m_aMethodLB.GetSelectEntry() );
3496 				m_xSubmission->setPropertyValue( PN_SUBMISSION_METHOD, makeAny( sTemp ) );
3497 				sTemp = m_aRefED.GetText();
3498 				m_xSubmission->setPropertyValue( PN_SUBMISSION_REF, makeAny( sTemp ) );
3499                 String sEntry = m_aBindLB.GetSelectEntry();
3500                 sEntry.Erase( sEntry.Search( ':' ) );
3501                 sTemp = sEntry;
3502 				m_xSubmission->setPropertyValue( PN_SUBMISSION_BIND, makeAny( sTemp ) );
3503 				sTemp = lcl_ReplaceString::get().toAPI( m_aReplaceLB.GetSelectEntry() );
3504 				m_xSubmission->setPropertyValue( PN_SUBMISSION_REPLACE, makeAny( sTemp ) );
3505 			}
3506 			catch ( Exception& )
3507 			{
3508 				DBG_ERRORFILE( "AddSubmissionDialog::OKHdl(): exception caught" );
3509 			}
3510 		}
3511 
3512 		EndDialog( RET_OK );
3513 		return 0;
3514 	}
3515 
3516 	//------------------------------------------------------------------------
3517 	void AddSubmissionDialog::FillAllBoxes()
3518 	{
3519 		// method box
3520 		m_aMethodLB.InsertEntry( String( SVX_RES( STR_METHOD_POST	) ) );
3521 		m_aMethodLB.InsertEntry( String( SVX_RES( STR_METHOD_PUT ) ) );
3522 		m_aMethodLB.InsertEntry( String( SVX_RES( STR_METHOD_GET ) ) );
3523 		m_aMethodLB.SelectEntryPos(0);
3524 
3525 		// binding box
3526 		Reference< css::xforms::XModel > xModel( m_xUIHelper, UNO_QUERY );
3527 		if ( xModel.is() )
3528 		{
3529 			try
3530 			{
3531 				Reference< XEnumerationAccess > xNumAccess( xModel->getBindings(), UNO_QUERY );
3532 				if ( xNumAccess.is() )
3533 				{
3534 					Reference < XEnumeration > xNum = xNumAccess->createEnumeration();
3535 					if ( xNum.is() && xNum->hasMoreElements() )
3536 					{
3537 						String sDelim( RTL_CONSTASCII_STRINGPARAM( ": " ) );
3538 						while ( xNum->hasMoreElements() )
3539 						{
3540 							Reference< XPropertySet > xPropSet;
3541 							Any aAny = xNum->nextElement();
3542 							if ( aAny >>= xPropSet )
3543 							{
3544 								String sEntry;
3545 								rtl::OUString sTemp;
3546 								xPropSet->getPropertyValue( PN_BINDING_ID ) >>= sTemp;
3547 								sEntry += String( sTemp );
3548 								sEntry += sDelim;
3549 								xPropSet->getPropertyValue( PN_BINDING_EXPR ) >>= sTemp;
3550 								sEntry += String( sTemp );
3551 								m_aBindLB.InsertEntry( sEntry );
3552 
3553 								if ( !m_xTempBinding.is() )
3554 									m_xTempBinding = xPropSet;
3555 							}
3556 						}
3557 					}
3558 				}
3559 			}
3560 			catch ( Exception& )
3561 			{
3562                 DBG_ERRORFILE( "AddSubmissionDialog::FillAllBoxes(): exception caught" );
3563 			}
3564 		}
3565 
3566         // #i36342# we need a temporary binding; create one if no existing binding
3567         // is found
3568         if( !m_xTempBinding.is() )
3569         {
3570             m_xCreatedBinding = m_xUIHelper->getBindingForNode(
3571                 Reference<css::xml::dom::XNode>(
3572                     xModel->getDefaultInstance()->getDocumentElement(),
3573                     UNO_QUERY_THROW ),
3574                 sal_True );
3575             m_xTempBinding = m_xCreatedBinding;
3576         }
3577 
3578 		// replace box
3579 		m_aReplaceLB.InsertEntry( String( SVX_RES( STR_REPLACE_NONE ) ) );
3580 		m_aReplaceLB.InsertEntry( String( SVX_RES( STR_REPLACE_INST ) ) );
3581 		m_aReplaceLB.InsertEntry( String( SVX_RES( STR_REPLACE_DOC ) ) );
3582 
3583 
3584 		// init the controls with the values of the submission
3585 		if ( m_pItemNode && m_pItemNode->m_xPropSet.is() )
3586 		{
3587 			m_xSubmission = m_pItemNode->m_xPropSet;
3588 			rtl::OUString sTemp;
3589 			try
3590 			{
3591 				m_xSubmission->getPropertyValue( PN_SUBMISSION_ID ) >>= sTemp;
3592 				m_aNameED.SetText( sTemp );
3593 				m_xSubmission->getPropertyValue( PN_SUBMISSION_ACTION ) >>= sTemp;
3594 				m_aActionED.SetText( sTemp );
3595 				m_xSubmission->getPropertyValue( PN_SUBMISSION_REF ) >>= sTemp;
3596 				m_aRefED.SetText( sTemp );
3597 
3598 				m_xSubmission->getPropertyValue( PN_SUBMISSION_METHOD ) >>= sTemp;
3599                 sTemp = lcl_MethodString::get().toUI( sTemp );
3600 				sal_uInt16 nPos = m_aMethodLB.GetEntryPos( String( sTemp ) );
3601 				if ( LISTBOX_ENTRY_NOTFOUND == nPos )
3602 					nPos = m_aMethodLB.InsertEntry( sTemp );
3603 				m_aMethodLB.SelectEntryPos( nPos );
3604 
3605 				m_xSubmission->getPropertyValue( PN_SUBMISSION_BIND ) >>= sTemp;
3606 				nPos = m_aBindLB.GetEntryPos( String( sTemp ) );
3607 				if ( LISTBOX_ENTRY_NOTFOUND == nPos )
3608 					nPos = m_aBindLB.InsertEntry( sTemp );
3609 				m_aBindLB.SelectEntryPos( nPos );
3610 
3611 				m_xSubmission->getPropertyValue( PN_SUBMISSION_REPLACE ) >>= sTemp;
3612                 sTemp = lcl_ReplaceString::get().toUI( sTemp );
3613 				if ( sTemp.getLength() == 0 )
3614 					sTemp = m_aReplaceLB.GetEntry(0); // first entry == "none"
3615 				nPos = m_aReplaceLB.GetEntryPos( String( sTemp ) );
3616 				if ( LISTBOX_ENTRY_NOTFOUND == nPos )
3617 					nPos = m_aReplaceLB.InsertEntry( sTemp );
3618 				m_aReplaceLB.SelectEntryPos( nPos );
3619 			}
3620 			catch ( Exception& )
3621 			{
3622 				DBG_ERRORFILE( "AddSubmissionDialog::FillAllBoxes(): exception caught" );
3623 			}
3624 		}
3625 
3626         m_aRefBtn.Enable( m_xTempBinding.is() );
3627 	}
3628 
3629 	//========================================================================
3630 	// class AddModelDialog
3631 	//========================================================================
3632 
3633     AddModelDialog::AddModelDialog( Window* pParent, bool _bEdit ) :
3634 
3635 		ModalDialog( pParent, SVX_RES( RID_SVXDLG_ADD_MODEL ) ),
3636 
3637 		m_aModelFL		( this, SVX_RES( FL_MODEL ) ),
3638 		m_aNameFT		( this, SVX_RES( FT_MODEL_NAME ) ),
3639 		m_aNameED		( this, SVX_RES( ED_MODEL_NAME ) ),
3640         m_aModifyCB     ( this, SVX_RES( CB_MODIFIES_DOCUMENT ) ),
3641 		m_aButtonsFL	( this, SVX_RES( FL_DATANAV_BTN ) ),
3642 		m_aOKBtn		( this, SVX_RES( BTN_DATANAV_OK ) ),
3643 		m_aEscBtn		( this, SVX_RES( BTN_DATANAV_ESC ) ),
3644 		m_aHelpBtn		( this, SVX_RES( BTN_DATANAV_HELP ) )
3645 
3646 	{
3647         if ( _bEdit )
3648             SetText( String( SVX_RES( STR_EDIT_TEXT ) ) );
3649 
3650         FreeResource();
3651 	}
3652 
3653 	AddModelDialog::~AddModelDialog()
3654 	{
3655 	}
3656 
3657 	//========================================================================
3658 	// class AddInstanceDialog
3659 	//========================================================================
3660 
3661     AddInstanceDialog::AddInstanceDialog( Window* pParent, bool _bEdit ) :
3662 
3663 		ModalDialog( pParent, SVX_RES( RID_SVXDLG_ADD_INSTANCE ) ),
3664 
3665 		m_aInstanceFL		( this, SVX_RES( FL_INSTANCE ) ),
3666 		m_aNameFT			( this, SVX_RES( FT_INST_NAME ) ),
3667 		m_aNameED			( this, SVX_RES( ED_INST_NAME ) ),
3668 		m_aURLFT			( this, SVX_RES( FT_INST_URL ) ),
3669 		m_aURLED			( this, SVX_RES( ED_INST_URL ) ),
3670 		m_aFilePickerBtn	( this, SVX_RES( PB_FILEPICKER ) ),
3671 		m_aLinkInstanceCB	( this, SVX_RES( CB_INST_LINKINST ) ),
3672 		m_aButtonsFL		( this, SVX_RES( FL_DATANAV_BTN ) ),
3673 		m_aOKBtn			( this, SVX_RES( BTN_DATANAV_OK ) ),
3674 		m_aEscBtn			( this, SVX_RES( BTN_DATANAV_ESC ) ),
3675 		m_aHelpBtn			( this, SVX_RES( BTN_DATANAV_HELP ) )
3676 
3677 	{
3678         if ( _bEdit )
3679             SetText( String( SVX_RES( STR_EDIT_TEXT ) ) );
3680 
3681         FreeResource();
3682 
3683 		m_aURLED.DisableHistory();
3684 		m_aFilePickerBtn.SetClickHdl( LINK( this, AddInstanceDialog, FilePickerHdl ) );
3685 
3686 		// load the filter name from fps_office resource
3687 		m_sAllFilterName = String( ResId( STR_FILTERNAME_ALL, *CREATEVERSIONRESMGR(fps_office) ) );
3688 	}
3689 
3690 	AddInstanceDialog::~AddInstanceDialog()
3691 	{
3692 	}
3693 
3694 	//------------------------------------------------------------------------
3695 	IMPL_LINK( AddInstanceDialog, FilePickerHdl, PushButton *, EMPTYARG )
3696 	{
3697     	::sfx2::FileDialogHelper aDlg(
3698             css::ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE, 0 );
3699 		INetURLObject aFile( SvtPathOptions().GetWorkPath() );
3700 
3701 		aDlg.AddFilter( m_sAllFilterName, DEFINE_CONST_UNICODE(FILEDIALOG_FILTER_ALL) );
3702 		String sFilterName( DEFINE_CONST_UNICODE("XML") );
3703 		aDlg.AddFilter( sFilterName, DEFINE_CONST_UNICODE("*.xml") );
3704 		aDlg.SetCurrentFilter( sFilterName );
3705 		aDlg.SetDisplayDirectory( aFile.GetMainURL( INetURLObject::NO_DECODE ) );
3706 
3707 		if( aDlg.Execute() == ERRCODE_NONE )
3708 			m_aURLED.SetText( aDlg.GetPath() );
3709 
3710 		return 0;
3711 	}
3712 
3713     //========================================================================
3714     // class LinkedInstanceWarningBox
3715     //========================================================================
3716 
3717     LinkedInstanceWarningBox::LinkedInstanceWarningBox( Window* pParent ) :
3718 
3719         MessBox( pParent, SVX_RES( RID_QRY_LINK_WARNING ) )
3720 
3721     {
3722         SetText( Application::GetDisplayName() );
3723         SetImage( QueryBox::GetStandardImage() );
3724         AddButton( SVX_RESSTR( RID_STR_DATANAV_LINKWARN_BUTTON ), BUTTONID_OK, BUTTONDIALOG_DEFBUTTON );
3725         AddButton( BUTTON_CANCEL, BUTTONID_CANCEL, BUTTONDIALOG_CANCELBUTTON );
3726     }
3727 
3728 //............................................................................
3729 }	// namespace svxform
3730 //............................................................................
3731 
3732 
3733