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