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