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