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