xref: /trunk/main/svx/source/form/datanavi.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
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