LibreOffice Module svx (master) 1
datanavi.cxx
Go to the documentation of this file.
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#include <sal/config.h>
21
22#include <memory>
23
24#include <sal/log.hxx>
25#include <datanavi.hxx>
26#include <fmservs.hxx>
27
28#include <bitmaps.hlst>
29#include <fpicker/strings.hrc>
30#include <o3tl/safeint.hxx>
31#include <o3tl/string_view.hxx>
32#include <svx/svxids.hrc>
34#include <unotools/resmgr.hxx>
35#include <svx/xmlexchg.hxx>
38#include <sfx2/viewfrm.hxx>
39#include <sfx2/objsh.hxx>
40#include <sfx2/bindings.hxx>
41#include <sfx2/dispatch.hxx>
42#include <utility>
43#include <vcl/commandevent.hxx>
44#include <vcl/event.hxx>
45#include <vcl/weld.hxx>
46#include <com/sun/star/beans/PropertyAttribute.hpp>
47#include <com/sun/star/container/XSet.hpp>
48#include <com/sun/star/frame/XController.hpp>
49#include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
50#include <com/sun/star/xforms/XFormsSupplier.hpp>
51#include <com/sun/star/xml/dom/XDocument.hpp>
52#include <comphelper/string.hxx>
53
54using namespace ::com::sun::star::beans;
55using namespace ::com::sun::star::container;
56using namespace ::com::sun::star::datatransfer;
57using namespace ::com::sun::star::frame;
58using namespace ::com::sun::star::uno;
59using namespace ::com::sun::star::xml::dom::events;
60using namespace ::svx;
61
62constexpr OUStringLiteral CFGNAME_DATANAVIGATOR = u"DataNavigator";
63constexpr OUStringLiteral CFGNAME_SHOWDETAILS = u"ShowDetails";
64constexpr OUStringLiteral MSG_VARIABLE = u"%1";
65constexpr OUStringLiteral MODELNAME = u"$MODELNAME";
66constexpr OUStringLiteral INSTANCENAME = u"$INSTANCENAME";
67constexpr OUStringLiteral ELEMENTNAME = u"$ELEMENTNAME";
68constexpr OUStringLiteral ATTRIBUTENAME = u"$ATTRIBUTENAME";
69constexpr OUStringLiteral SUBMISSIONNAME = u"$SUBMISSIONNAME";
70constexpr OUStringLiteral BINDINGNAME = u"$BINDINGNAME";
71
72
73namespace svxform
74{
75
76 // properties of instance
77 constexpr OUStringLiteral PN_INSTANCE_MODEL = u"Instance";
78 constexpr OUStringLiteral PN_INSTANCE_ID = u"ID";
79 constexpr OUStringLiteral PN_INSTANCE_URL = u"URL";
80
81 // properties of binding
82 constexpr OUStringLiteral PN_BINDING_ID = u"BindingID";
83 constexpr OUStringLiteral PN_BINDING_EXPR = u"BindingExpression";
84 constexpr OUStringLiteral PN_BINDING_MODEL = u"Model";
85 constexpr OUStringLiteral PN_BINDING_NAMESPACES = u"ModelNamespaces";
86 constexpr OUStringLiteral PN_READONLY_EXPR = u"ReadonlyExpression";
87 constexpr OUStringLiteral PN_RELEVANT_EXPR = u"RelevantExpression";
88 constexpr OUStringLiteral PN_REQUIRED_EXPR = u"RequiredExpression";
89 constexpr OUStringLiteral PN_CONSTRAINT_EXPR = u"ConstraintExpression";
90 constexpr OUStringLiteral PN_CALCULATE_EXPR = u"CalculateExpression";
91 constexpr OUStringLiteral PN_BINDING_TYPE = u"Type";
92
93 // properties of submission
94 constexpr OUStringLiteral PN_SUBMISSION_ID = u"ID";
95 constexpr OUStringLiteral PN_SUBMISSION_BIND = u"Bind";
96 constexpr OUStringLiteral PN_SUBMISSION_REF = u"Ref";
97 constexpr OUStringLiteral PN_SUBMISSION_ACTION = u"Action";
98 constexpr OUStringLiteral PN_SUBMISSION_METHOD = u"Method";
99 constexpr OUStringLiteral PN_SUBMISSION_REPLACE = u"Replace";
100
101 // other const strings
102 constexpr OUStringLiteral TRUE_VALUE = u"true()";
103 constexpr OUStringLiteral NEW_ELEMENT = u"newElement";
104 constexpr OUStringLiteral NEW_ATTRIBUTE = u"newAttribute";
105 constexpr OUStringLiteral EVENTTYPE_CHARDATA = u"DOMCharacterDataModified";
106 constexpr OUStringLiteral EVENTTYPE_ATTR = u"DOMAttrModified";
107
108 #define MIN_PAGE_COUNT 3 // at least one instance, one submission and one binding page
109
110 struct ItemNode
111 {
112 Reference< css::xml::dom::XNode > m_xNode;
113 Reference< XPropertySet > m_xPropSet;
114
115 explicit ItemNode( const Reference< css::xml::dom::XNode >& _rxNode ) :
116 m_xNode( _rxNode ) {}
117 explicit ItemNode( const Reference< XPropertySet >& _rxSet ) :
118 m_xPropSet( _rxSet ) {}
119 };
120
122 : DropTargetHelper(rWidget.get_drop_target())
123 {
124 }
125
127 {
128 return DND_ACTION_NONE;
129 }
130
132 {
133 return DND_ACTION_NONE;
134 }
135
136 IMPL_LINK(XFormsPage, PopupMenuHdl, const CommandEvent&, rCEvt, bool)
137 {
138 if (rCEvt.GetCommand() != CommandEventId::ContextMenu)
139 return false;
140
141 Point aPos(rCEvt.GetMousePosPixel());
142
143 if (m_xItemList->get_dest_row_at_pos(aPos, m_xScratchIter.get(), false) && !m_xItemList->is_selected(*m_xScratchIter))
144 {
145 m_xItemList->select(*m_xScratchIter);
146 ItemSelectHdl(*m_xItemList);
147 }
148
149 std::unique_ptr<weld::Builder> xBuilder(Application::CreateBuilder(m_xItemList.get(), "svx/ui/formdatamenu.ui"));
150 m_xMenu = xBuilder->weld_menu("menu");
151 m_aRemovedMenuEntries.clear();
152
153 if (DGTInstance == m_eGroup)
154 m_aRemovedMenuEntries.insert("additem");
155 else
156 {
157 m_aRemovedMenuEntries.insert("addelement");
158 m_aRemovedMenuEntries.insert("addattribute");
159
160 if (DGTSubmission == m_eGroup)
161 {
162 m_xMenu->set_label("additem", SvxResId(RID_STR_DATANAV_ADD_SUBMISSION));
163 m_xMenu->set_label("edit", SvxResId(RID_STR_DATANAV_EDIT_SUBMISSION));
164 m_xMenu->set_label("delete", SvxResId(RID_STR_DATANAV_REMOVE_SUBMISSION));
165 }
166 else
167 {
168 m_xMenu->set_label("additem", SvxResId(RID_STR_DATANAV_ADD_BINDING));
169 m_xMenu->set_label("edit", SvxResId(RID_STR_DATANAV_EDIT_BINDING));
170 m_xMenu->set_label("delete", SvxResId(RID_STR_DATANAV_REMOVE_BINDING));
171 }
172 }
173 for (const auto& rRemove : m_aRemovedMenuEntries)
174 m_xMenu->remove(rRemove);
175 EnableMenuItems();
176 OString sCommand = m_xMenu->popup_at_rect(m_xItemList.get(), tools::Rectangle(aPos, Size(1,1)));
177 if (!sCommand.isEmpty())
178 DoMenuAction(sCommand);
179 m_xMenu.reset();
180 return true;
181 }
182
184 {
185 m_xItemList->all_foreach([this](weld::TreeIter& rEntry) {
186 delete weld::fromId<ItemNode*>(m_xItemList->get_id(rEntry));
187 return false;
188 });
189 m_xItemList->clear();
190 }
191
193 {
194 if (m_xItemList->get_iter_first(*m_xScratchIter))
195 {
196 m_xItemList->select(*m_xScratchIter);
197 ItemSelectHdl(*m_xItemList);
198 }
199 }
200
202 : BuilderPage(pPage, nullptr, "svx/ui/xformspage.ui", "XFormsPage")
203 , m_pParent(pPage)
204 , m_xToolBox(m_xBuilder->weld_toolbar("toolbar"))
205 , m_xItemList(m_xBuilder->weld_tree_view("items"))
206 , m_xScratchIter(m_xItemList->make_iterator())
207 , m_aDropHelper(*m_xItemList)
208 , m_pNaviWin(_pNaviWin)
209 , m_bHasModel(false)
210 , m_eGroup(_eGroup)
211 , m_bLinkOnce(false)
212 {
213 m_xItemList->set_show_expanders(DGTInstance == m_eGroup || DGTSubmission == m_eGroup);
214
215 if ( DGTInstance == m_eGroup )
216 m_xToolBox->set_item_visible("additem", false);
217 else
218 {
219 m_xToolBox->set_item_visible("addelement", false);
220 m_xToolBox->set_item_visible("addattribute", false);
221
222 if ( DGTSubmission == m_eGroup )
223 {
224 m_xToolBox->set_item_label("additem", SvxResId(RID_STR_DATANAV_ADD_SUBMISSION));
225 m_xToolBox->set_item_label("edit", SvxResId(RID_STR_DATANAV_EDIT_SUBMISSION));
226 m_xToolBox->set_item_label("delete", SvxResId(RID_STR_DATANAV_REMOVE_SUBMISSION));
227 }
228 else
229 {
230 m_xToolBox->set_item_label("additem", SvxResId(RID_STR_DATANAV_ADD_BINDING));
231 m_xToolBox->set_item_label("edit", SvxResId(RID_STR_DATANAV_EDIT_BINDING));
232 m_xToolBox->set_item_label("delete", SvxResId(RID_STR_DATANAV_REMOVE_BINDING));
233 }
234 }
235
236 m_xToolBox->connect_clicked(LINK(this, XFormsPage, TbxSelectHdl));
237
238 m_xItemList->connect_changed(LINK(this, XFormsPage, ItemSelectHdl));
239 m_xItemList->connect_key_press(LINK(this, XFormsPage, KeyInputHdl));
240 m_xItemList->connect_popup_menu(LINK(this, XFormsPage, PopupMenuHdl));
241 ItemSelectHdl(*m_xItemList);
242 }
243
245 {
247 m_pNaviWin = nullptr;
248 m_pParent->move(m_xContainer.get(), nullptr);
249 }
250
251 IMPL_LINK(XFormsPage, TbxSelectHdl, const OString&, rIdent, void)
252 {
253 DoToolBoxAction(rIdent);
254 }
255
257 {
258 EnableMenuItems();
259 PrepDnD();
260 }
261
263 {
265 m_xItemList->enable_drag_source(xTransferable, DND_ACTION_NONE);
266
267 if (!m_xItemList->get_selected(m_xScratchIter.get()))
268 {
269 // no drag without an entry
270 return;
271 }
272
273 if ( m_eGroup == DGTBinding )
274 {
275 // for the moment, bindings cannot be dragged.
276 // #i59395# / 2005-12-15 / frank.schoenheit@sun.com
277 return;
278 }
279
280 // GetServiceNameForNode() requires a datatype repository which
281 // will be automatically build if requested???
282 Reference< css::xforms::XModel > xModel( GetXFormsHelper(), UNO_QUERY );
283 Reference< css::xforms::XDataTypeRepository > xDataTypes =
284 xModel->getDataTypeRepository();
285 if(!xDataTypes.is())
286 return;
287
288 ItemNode *pItemNode = weld::fromId<ItemNode*>(m_xItemList->get_id(*m_xScratchIter));
289 if (!pItemNode)
290 {
291 // the only known (and allowed?) case where this happens are sub-entries of a submission
292 // entry
293 DBG_ASSERT( DGTSubmission == m_eGroup, "DataTreeListBox::StartDrag: how this?" );
294 bool bSelected = m_xItemList->iter_parent(*m_xScratchIter);
295 DBG_ASSERT(bSelected && !m_xItemList->get_iter_depth(*m_xScratchIter), "DataTreeListBox::StartDrag: what kind of entry *is* this?");
296 // on the submission page, we have only top-level entries (the submission themself)
297 // plus direct children of those (facets of a submission)
298 pItemNode = bSelected ? weld::fromId<ItemNode*>(m_xItemList->get_id(*m_xScratchIter)) : nullptr;
299 if (!pItemNode)
300 return;
301 }
302
303 OXFormsDescriptor desc;
304 desc.szName = m_xItemList->get_text(*m_xScratchIter);
305 if(pItemNode->m_xNode.is()) {
306 // a valid node interface tells us that we need to create a control from a binding
307 desc.szServiceName = GetServiceNameForNode(pItemNode->m_xNode);
308 desc.xPropSet = GetBindingForNode(pItemNode->m_xNode);
309 DBG_ASSERT( desc.xPropSet.is(), "DataTreeListBox::StartDrag(): invalid node binding" );
310 }
311 else {
312 desc.szServiceName = FM_COMPONENT_COMMANDBUTTON;
313 desc.xPropSet = pItemNode->m_xPropSet;
314 }
315 xTransferable = rtl::Reference<TransferDataContainer>(new OXFormsTransferable(desc));
316 m_xItemList->enable_drag_source(xTransferable, DND_ACTION_COPY);
317 }
318
320 const Reference< css::xml::dom::XNode >& _xNode)
321 {
322 DBG_ASSERT( m_xUIHelper.is(), "XFormsPage::AddChildren(): invalid UIHelper" );
323
324 try
325 {
326 Reference< css::xml::dom::XNodeList > xNodeList = _xNode->getChildNodes();
327 if ( xNodeList.is() )
328 {
329 bool bShowDetails = m_pNaviWin->IsShowDetails();
330 sal_Int32 i, nNodeCount = xNodeList->getLength();
331 for ( i = 0; i < nNodeCount; ++i )
332 {
333 Reference< css::xml::dom::XNode > xChild = xNodeList->item(i);
334 css::xml::dom::NodeType eChildType = xChild->getNodeType();
335 OUString aExpImg;
336 switch ( eChildType )
337 {
338 case css::xml::dom::NodeType_ATTRIBUTE_NODE:
339 aExpImg = RID_SVXBMP_ATTRIBUTE;
340 break;
341 case css::xml::dom::NodeType_ELEMENT_NODE:
342 aExpImg = RID_SVXBMP_ELEMENT;
343 break;
344 case css::xml::dom::NodeType_TEXT_NODE:
345 aExpImg = RID_SVXBMP_TEXT;
346 break;
347 default:
348 aExpImg = RID_SVXBMP_OTHER;
349 }
350
351 OUString sName = m_xUIHelper->getNodeDisplayName( xChild, bShowDetails );
352 if ( !sName.isEmpty() )
353 {
354 ItemNode* pNode = new ItemNode( xChild );
355 OUString sId(weld::toId(pNode));
356 std::unique_ptr<weld::TreeIter> xEntry = m_xItemList->make_iterator();
357 m_xItemList->insert(_pParent, -1, &sName, &sId, nullptr, nullptr, false, xEntry.get());
358 m_xItemList->set_image(*xEntry, aExpImg);
359
360 if ( xChild->hasAttributes() )
361 {
362 Reference< css::xml::dom::XNamedNodeMap > xMap = xChild->getAttributes();
363 if ( xMap.is() )
364 {
365 aExpImg = RID_SVXBMP_ATTRIBUTE;
366 sal_Int32 j, nMapLen = xMap->getLength();
367 for ( j = 0; j < nMapLen; ++j )
368 {
369 Reference< css::xml::dom::XNode > xAttr = xMap->item(j);
370 pNode = new ItemNode( xAttr );
371 OUString sSubId(weld::toId(pNode));
372 OUString sAttrName = m_xUIHelper->getNodeDisplayName( xAttr, bShowDetails );
373 m_xItemList->insert(xEntry.get(), -1, &sAttrName, &sSubId, nullptr, nullptr, false, m_xScratchIter.get());
374 m_xItemList->set_image(*m_xScratchIter, aExpImg);
375 }
376 }
377 }
378 if ( xChild->hasChildNodes() )
379 AddChildren(xEntry.get(), xChild);
380 }
381 }
382 }
383 }
384 catch( Exception& )
385 {
387 }
388 }
389
390 bool XFormsPage::DoToolBoxAction(std::string_view rToolBoxID)
391 {
392 bool bHandled = false;
393 bool bIsDocModified = false;
394 m_pNaviWin->DisableNotify( true );
395
396 if (rToolBoxID == "additem" || rToolBoxID == "addelement" || rToolBoxID == "addattribute")
397 {
398 bHandled = true;
399 Reference< css::xforms::XModel > xModel( m_xUIHelper, UNO_QUERY );
400 DBG_ASSERT( xModel.is(), "XFormsPage::DoToolBoxAction(): Action without model" );
401 if ( DGTSubmission == m_eGroup )
402 {
404 if ( aDlg.run() == RET_OK && aDlg.GetNewSubmission().is() )
405 {
406 try
407 {
408 Reference< css::xforms::XSubmission > xNewSubmission = aDlg.GetNewSubmission();
409 Reference< XSet > xSubmissions = xModel->getSubmissions();
410 xSubmissions->insert( Any( xNewSubmission ) );
411 AddEntry(xNewSubmission, m_xScratchIter.get());
412 m_xItemList->select(*m_xScratchIter);
413 bIsDocModified = true;
414 }
415 catch ( Exception const & )
416 {
417 TOOLS_WARN_EXCEPTION( "svx.form", "XFormsPage::DoToolBoxAction()" );
418 }
419 }
420 }
421 else
422 {
424
425 std::unique_ptr<weld::TreeIter> xEntry(m_xItemList->make_iterator());
426 bool bEntry = m_xItemList->get_selected(xEntry.get());
427
428 std::unique_ptr<ItemNode> pNode;
429 Reference< css::xml::dom::XNode > xParentNode;
430 Reference< XPropertySet > xNewBinding;
431 TranslateId pResId;
432 bool bIsElement = true;
433 if ( DGTInstance == m_eGroup )
434 {
435 if ( !m_sInstanceURL.isEmpty() )
436 {
438 if (aMsgBox.run() != RET_OK)
439 return bHandled;
440 }
441
442 DBG_ASSERT( bEntry, "XFormsPage::DoToolBoxAction(): no entry" );
443 ItemNode* pParentNode = weld::fromId<ItemNode*>(m_xItemList->get_id(*xEntry));
444 DBG_ASSERT( pParentNode, "XFormsPage::DoToolBoxAction(): no parent node" );
445 xParentNode = pParentNode->m_xNode;
446 Reference< css::xml::dom::XNode > xNewNode;
447 if (rToolBoxID == "addelement")
448 {
449 try
450 {
451 pResId = RID_STR_DATANAV_ADD_ELEMENT;
452 xNewNode = m_xUIHelper->createElement( xParentNode, NEW_ELEMENT );
453 }
454 catch ( Exception const & )
455 {
456 TOOLS_WARN_EXCEPTION( "svx.form", "XFormsPage::DoToolBoxAction(): exception while create element" );
457 }
458 }
459 else
460 {
461 pResId = RID_STR_DATANAV_ADD_ATTRIBUTE;
462 bIsElement = false;
464 try
465 {
466 xNewNode = m_xUIHelper->createAttribute( xParentNode, NEW_ATTRIBUTE );
467 }
468 catch ( Exception const & )
469 {
470 TOOLS_WARN_EXCEPTION( "svx.form", "XFormsPage::DoToolBoxAction(): exception while create attribute" );
471 }
472 }
473
474 try
475 {
476 xNewNode = xParentNode->appendChild( xNewNode );
477 }
478 catch ( Exception const & )
479 {
480 TOOLS_WARN_EXCEPTION( "svx.form", "XFormsPage::DoToolBoxAction(): exception while append child" );
481 }
482
483 try
484 {
485 Reference< css::xml::dom::XNode > xPNode;
486 if ( xNewNode.is() )
487 xPNode = xNewNode->getParentNode();
488 // attributes don't have parents in the DOM model
489 DBG_ASSERT( rToolBoxID == "addattribute"
490 || xPNode.is(), "XFormsPage::DoToolboxAction(): node not added" );
491 }
492 catch ( Exception const & )
493 {
494 TOOLS_WARN_EXCEPTION( "svx.form", "XFormsPage::DoToolboxAction()" );
495 }
496
497 try
498 {
499 m_xUIHelper->getBindingForNode( xNewNode, true );
500 }
501 catch ( Exception const & )
502 {
503 TOOLS_WARN_EXCEPTION( "svx.form", "XFormsPage::DoToolBoxAction(): exception while get binding for node" );
504 }
505 pNode.reset(new ItemNode( xNewNode ));
506 }
507 else
508 {
509 try
510 {
511 pResId = RID_STR_DATANAV_ADD_BINDING;
512 xNewBinding = xModel->createBinding();
513 Reference< XSet > xBindings = xModel->getBindings();
514 xBindings->insert( Any( xNewBinding ) );
515 pNode.reset(new ItemNode( xNewBinding ));
517 }
518 catch ( Exception const & )
519 {
520 TOOLS_WARN_EXCEPTION( "svx.form", "XFormsPage::DoToolBoxAction(): exception while adding binding" );
521 }
522 }
523
525 aDlg.set_title(SvxResId(pResId));
526 aDlg.InitText( eType );
527 short nReturn = aDlg.run();
528 if ( DGTInstance == m_eGroup )
529 {
530 if ( RET_OK == nReturn )
531 {
532 AddEntry( std::move(pNode), bIsElement, m_xScratchIter.get());
533 m_xItemList->scroll_to_row(*m_xScratchIter);
534 m_xItemList->select(*m_xScratchIter);
535 bIsDocModified = true;
536 }
537 else
538 {
539 try
540 {
541 Reference< css::xml::dom::XNode > xPNode;
542 Reference< css::xml::dom::XNode > xNode =
543 xParentNode->removeChild( pNode->m_xNode );
544 if ( xNode.is() )
545 xPNode = xNode->getParentNode();
546 DBG_ASSERT( !xPNode.is(), "XFormsPage::RemoveEntry(): node not removed" );
547 }
548 catch ( Exception const & )
549 {
550 TOOLS_WARN_EXCEPTION( "svx.form", "XFormsPage::DoToolboxAction()" );
551 }
552 }
553 }
554 else
555 {
556 if ( RET_OK == nReturn )
557 {
558 AddEntry(xNewBinding, m_xScratchIter.get());
559 m_xItemList->select(*m_xScratchIter);
560 bIsDocModified = true;
561 }
562 else
563 {
564 try
565 {
566 Reference< XSet > xBindings = xModel->getBindings();
567 xBindings->remove( Any( xNewBinding ) );
568 }
569 catch ( Exception const & )
570 {
571 TOOLS_WARN_EXCEPTION( "svx.form", "XFormsPage::DoToolboxAction()" );
572 }
573 }
574 }
575 }
576 }
577 else if (rToolBoxID == "edit")
578 {
579 bHandled = true;
580
581 std::unique_ptr<weld::TreeIter> xEntry(m_xItemList->make_iterator());
582 bool bEntry = m_xItemList->get_selected(xEntry.get());
583 if ( bEntry )
584 {
585 if ( DGTSubmission == m_eGroup && m_xItemList->get_iter_depth(*xEntry) )
586 {
587 m_xItemList->iter_parent(*xEntry);
588 }
589 ItemNode* pNode = weld::fromId<ItemNode*>(m_xItemList->get_id(*xEntry));
591 {
592 if ( DGTInstance == m_eGroup && !m_sInstanceURL.isEmpty() )
593 {
595 if (aMsgBox.run() != RET_OK)
596 return bHandled;
597 }
598
601 TranslateId pResId = RID_STR_DATANAV_EDIT_ELEMENT;
602 if ( pNode && pNode->m_xNode.is() )
603 {
604 try
605 {
606 css::xml::dom::NodeType eChildType = pNode->m_xNode->getNodeType();
607 if ( eChildType == css::xml::dom::NodeType_ATTRIBUTE_NODE )
608 {
609 pResId = RID_STR_DATANAV_EDIT_ATTRIBUTE;
611 }
612 }
613 catch ( Exception const & )
614 {
615 TOOLS_WARN_EXCEPTION( "svx.form", "XFormsPage::DoToolboxAction()" );
616 }
617 }
618 else if ( DGTBinding == m_eGroup )
619 {
620 pResId = RID_STR_DATANAV_EDIT_BINDING;
622 }
623 aDlg.set_title(SvxResId(pResId));
624 aDlg.InitText( eType );
625 if (aDlg.run() == RET_OK)
626 {
627 // Set the new name
628 OUString sNewName;
629 if ( DGTInstance == m_eGroup )
630 {
631 try
632 {
633 sNewName = m_xUIHelper->getNodeDisplayName(
634 pNode->m_xNode, m_pNaviWin->IsShowDetails() );
635 }
636 catch ( Exception const & )
637 {
638 TOOLS_WARN_EXCEPTION( "svx.form", "XFormsPage::DoToolboxAction()" );
639 }
640 }
641 else if (pNode)
642 {
643 try
644 {
645 OUString sTemp;
646 pNode->m_xPropSet->getPropertyValue( PN_BINDING_ID ) >>= sTemp;
647 sNewName += sTemp + ": ";
648 pNode->m_xPropSet->getPropertyValue( PN_BINDING_EXPR ) >>= sTemp;
649 sNewName += sTemp;
650 }
651 catch ( Exception const & )
652 {
653 TOOLS_WARN_EXCEPTION( "svx.form", "XFormsPage::DoToolboxAction()" );
654 }
655 }
656
657 m_xItemList->set_text(*xEntry, sNewName);
658 bIsDocModified = true;
659 }
660 }
661 else
662 {
664 aDlg.set_title(SvxResId(RID_STR_DATANAV_EDIT_SUBMISSION));
665 if (aDlg.run() == RET_OK)
666 {
667 EditEntry( pNode->m_xPropSet );
668 bIsDocModified = true;
669 }
670 }
671 }
672 }
673 else if (rToolBoxID == "delete")
674 {
675 bHandled = true;
676 if ( DGTInstance == m_eGroup && !m_sInstanceURL.isEmpty() )
677 {
679 if (aMsgBox.run() != RET_OK)
680 return bHandled;
681 }
682 bIsDocModified = RemoveEntry();
683 }
684 else
685 {
686 OSL_FAIL( "XFormsPage::DoToolboxAction: unknown ID!" );
687 }
688
689 m_pNaviWin->DisableNotify( false );
691 if ( bIsDocModified )
693 return bHandled;
694 }
695
696 void XFormsPage::AddEntry(std::unique_ptr<ItemNode> _pNewNode, bool _bIsElement, weld::TreeIter* pRet)
697 {
698 if (!pRet)
699 pRet = m_xScratchIter.get();
700
701 std::unique_ptr<weld::TreeIter> xParent(m_xItemList->make_iterator());
702 if (!m_xItemList->get_selected(xParent.get()))
703 xParent.reset();
704 OUString aImage(_bIsElement ? OUString(RID_SVXBMP_ELEMENT) : OUString(RID_SVXBMP_ATTRIBUTE));
705 OUString sName;
706 try
707 {
708 sName = m_xUIHelper->getNodeDisplayName(
709 _pNewNode->m_xNode, m_pNaviWin->IsShowDetails() );
710 }
711 catch ( Exception& )
712 {
714 }
715 OUString sId(weld::toId(_pNewNode.release()));
716 m_xItemList->insert(xParent.get(), -1, &sName, &sId, nullptr, nullptr, false, pRet);
717 m_xItemList->set_image(*pRet, aImage);
718 if (xParent && !m_xItemList->get_row_expanded(*xParent) && m_xItemList->iter_has_child(*xParent))
719 m_xItemList->expand_row(*xParent);
720 }
721
722 void XFormsPage::AddEntry(const Reference< XPropertySet >& _rEntry, weld::TreeIter* pRet)
723 {
724 if (!pRet)
725 pRet = m_xScratchIter.get();
726
727 OUString aImage(RID_SVXBMP_ELEMENT);
728
729 ItemNode* pNode = new ItemNode( _rEntry );
730 OUString sTemp;
731
732 if ( DGTSubmission == m_eGroup )
733 {
734 try
735 {
736 // ID
737 _rEntry->getPropertyValue( PN_SUBMISSION_ID ) >>= sTemp;
738 OUString sId(weld::toId(pNode));
739 m_xItemList->insert(nullptr, -1, &sTemp, &sId, nullptr, nullptr, false, pRet);
740 m_xItemList->set_image(*pRet, aImage);
741 std::unique_ptr<weld::TreeIter> xRes(m_xItemList->make_iterator());
742 // Action
743 _rEntry->getPropertyValue( PN_SUBMISSION_ACTION ) >>= sTemp;
744 OUString sEntry = SvxResId( RID_STR_DATANAV_SUBM_ACTION ) + sTemp;
745 m_xItemList->insert(pRet, -1, &sEntry, nullptr, nullptr, nullptr, false, xRes.get());
746 m_xItemList->set_image(*xRes, aImage);
747 // Method
748 _rEntry->getPropertyValue( PN_SUBMISSION_METHOD ) >>= sTemp;
749 sEntry = SvxResId( RID_STR_DATANAV_SUBM_METHOD ) +
750 m_aMethodString.toUI( sTemp );
751 m_xItemList->insert(pRet, -1, &sEntry, nullptr, nullptr, nullptr, false, xRes.get());
752 m_xItemList->set_image(*xRes, aImage);
753 // Ref
754 _rEntry->getPropertyValue( PN_SUBMISSION_REF ) >>= sTemp;
755 sEntry = SvxResId( RID_STR_DATANAV_SUBM_REF ) + sTemp;
756 m_xItemList->insert(pRet, -1, &sEntry, nullptr, nullptr, nullptr, false, xRes.get());
757 m_xItemList->set_image(*xRes, aImage);
758 // Bind
759 _rEntry->getPropertyValue( PN_SUBMISSION_BIND ) >>= sTemp;
760 sEntry = SvxResId( RID_STR_DATANAV_SUBM_BIND ) + sTemp;
761 m_xItemList->insert(pRet, -1, &sEntry, nullptr, nullptr, nullptr, false, xRes.get());
762 m_xItemList->set_image(*xRes, aImage);
763 // Replace
764 _rEntry->getPropertyValue( PN_SUBMISSION_REPLACE ) >>= sTemp;
765 sEntry = SvxResId( RID_STR_DATANAV_SUBM_REPLACE ) +
766 m_aReplaceString.toUI( sTemp );
767 m_xItemList->insert(pRet, -1, &sEntry, nullptr, nullptr, nullptr, false, xRes.get());
768 m_xItemList->set_image(*xRes, aImage);
769 }
770 catch ( Exception const & )
771 {
772 TOOLS_WARN_EXCEPTION( "svx.form", "XFormsPage::AddEntry(Ref)" );
773 }
774 }
775 else // then Binding Page
776 {
777 try
778 {
779 OUString sName;
780 _rEntry->getPropertyValue( PN_BINDING_ID ) >>= sTemp;
781 sName += sTemp + ": ";
782 _rEntry->getPropertyValue( PN_BINDING_EXPR ) >>= sTemp;
783 sName += sTemp;
784
785 OUString sId(weld::toId(pNode));
786 m_xItemList->insert(nullptr, -1, &sName, &sId, nullptr, nullptr, false, pRet);
787 m_xItemList->set_image(*pRet, aImage);
788 }
789 catch ( Exception const & )
790 {
791 TOOLS_WARN_EXCEPTION( "svx.form", "XFormsPage::AddEntry(Ref)" );
792 }
793 }
794 }
795
796 void XFormsPage::EditEntry( const Reference< XPropertySet >& _rEntry )
797 {
798 if ( DGTSubmission != m_eGroup )
799 return;
800
801 try
802 {
803 std::unique_ptr<weld::TreeIter> xEntry(m_xItemList->make_iterator());
804 if (!m_xItemList->get_selected(xEntry.get()))
805 {
806 SAL_WARN( "svx.form", "corrupt tree" );
807 return;
808 }
809
810 // #i36262# may be called for submission entry *or* for
811 // submission children. If we don't have any children, we
812 // assume the latter case and use the parent
813 if (!m_xItemList->iter_has_child(*xEntry))
814 m_xItemList->iter_parent(*xEntry);
815
816 OUString sTemp;
817 _rEntry->getPropertyValue( PN_SUBMISSION_ID ) >>= sTemp;
818 m_xItemList->set_text(*xEntry, sTemp);
819
820 _rEntry->getPropertyValue( PN_SUBMISSION_BIND ) >>= sTemp;
821 OUString sEntry = SvxResId( RID_STR_DATANAV_SUBM_BIND ) + sTemp;
822 if (!m_xItemList->iter_children(*xEntry))
823 {
824 SAL_WARN( "svx.form", "corrupt tree" );
825 return;
826 }
827 m_xItemList->set_text(*xEntry, sEntry);
828 _rEntry->getPropertyValue( PN_SUBMISSION_REF ) >>= sTemp;
829 sEntry = SvxResId( RID_STR_DATANAV_SUBM_REF ) + sTemp;
830 if (!m_xItemList->iter_next_sibling(*xEntry))
831 {
832 SAL_WARN( "svx.form", "corrupt tree" );
833 return;
834 }
835 m_xItemList->set_text(*xEntry, sEntry);
836 _rEntry->getPropertyValue( PN_SUBMISSION_ACTION ) >>= sTemp;
837 sEntry = SvxResId( RID_STR_DATANAV_SUBM_ACTION ) + sTemp;
838 if (!m_xItemList->iter_next_sibling(*xEntry))
839 {
840 SAL_WARN( "svx.form", "corrupt tree" );
841 return;
842 }
843 _rEntry->getPropertyValue( PN_SUBMISSION_METHOD ) >>= sTemp;
844 sEntry = SvxResId( RID_STR_DATANAV_SUBM_METHOD ) +
845 m_aMethodString.toUI( sTemp );
846 if (!m_xItemList->iter_next_sibling(*xEntry))
847 {
848 SAL_WARN( "svx.form", "corrupt tree" );
849 return;
850 }
851 m_xItemList->set_text(*xEntry, sEntry);
852 _rEntry->getPropertyValue( PN_SUBMISSION_REPLACE ) >>= sTemp;
853 sEntry = SvxResId( RID_STR_DATANAV_SUBM_REPLACE ) +
854 m_aReplaceString.toUI( sTemp );
855 if (!m_xItemList->iter_next_sibling(*xEntry))
856 {
857 SAL_WARN( "svx.form", "corrupt tree" );
858 return;
859 }
860 m_xItemList->set_text(*xEntry, sEntry);
861 }
862 catch ( Exception const & )
863 {
864 TOOLS_WARN_EXCEPTION( "svx.form", "XFormsPage::EditEntry()" );
865 }
866 }
867
869 {
870 bool bRet = false;
871
872 std::unique_ptr<weld::TreeIter> xEntry(m_xItemList->make_iterator());
873 bool bEntry = m_xItemList->get_selected(xEntry.get());
874 if ( bEntry &&
875 ( DGTInstance != m_eGroup || m_xItemList->get_iter_depth(*xEntry) ) )
876 {
877 Reference< css::xforms::XModel > xModel( m_xUIHelper, UNO_QUERY );
878 DBG_ASSERT( xModel.is(), "XFormsPage::RemoveEntry(): no model" );
879 ItemNode* pNode = weld::fromId<ItemNode*>(m_xItemList->get_id(*xEntry));
880 DBG_ASSERT( pNode, "XFormsPage::RemoveEntry(): no node" );
881
882 if ( DGTInstance == m_eGroup )
883 {
884 try
885 {
886 DBG_ASSERT( pNode->m_xNode.is(), "XFormsPage::RemoveEntry(): no XNode" );
887 css::xml::dom::NodeType eChildType = pNode->m_xNode->getNodeType();
888 bool bIsElement = ( eChildType == css::xml::dom::NodeType_ELEMENT_NODE );
889 TranslateId pResId = bIsElement ? RID_STR_QRY_REMOVE_ELEMENT : RID_STR_QRY_REMOVE_ATTRIBUTE;
890 OUString sVar = bIsElement ? OUString(ELEMENTNAME) : OUString(ATTRIBUTENAME);
891 std::unique_ptr<weld::MessageDialog> xQBox(Application::CreateMessageDialog(m_pNaviWin->GetFrameWeld(),
892 VclMessageType::Question, VclButtonsType::YesNo,
893 SvxResId(pResId)));
894 OUString sMessText = xQBox->get_primary_text();
895 sMessText = sMessText.replaceFirst(
896 sVar, m_xUIHelper->getNodeDisplayName( pNode->m_xNode, false ) );
897 xQBox->set_primary_text(sMessText);
898 if (xQBox->run() == RET_YES)
899 {
900 std::unique_ptr<weld::TreeIter> xParent(m_xItemList->make_iterator(xEntry.get()));
901 bool bParent = m_xItemList->iter_parent(*xParent); (void)bParent;
902 assert(bParent && "XFormsPage::RemoveEntry(): no parent entry");
903 ItemNode* pParentNode = weld::fromId<ItemNode*>(m_xItemList->get_id(*xParent));
904 DBG_ASSERT( pParentNode && pParentNode->m_xNode.is(), "XFormsPage::RemoveEntry(): no parent XNode" );
905
906 Reference< css::xml::dom::XNode > xPNode;
907 Reference< css::xml::dom::XNode > xNode =
908 pParentNode->m_xNode->removeChild( pNode->m_xNode );
909 if ( xNode.is() )
910 xPNode = xNode->getParentNode();
911 DBG_ASSERT( !xPNode.is(), "XFormsPage::RemoveEntry(): node not removed" );
912 bRet = true;
913 }
914 }
915 catch ( Exception const & )
916 {
917 TOOLS_WARN_EXCEPTION( "svx.form", "XFormsPage::RemoveEntry()" );
918 }
919 }
920 else
921 {
922 DBG_ASSERT( pNode->m_xPropSet.is(), "XFormsPage::RemoveEntry(): no propset" );
923 bool bSubmission = ( DGTSubmission == m_eGroup );
924 TranslateId pResId = bSubmission ? RID_STR_QRY_REMOVE_SUBMISSION : RID_STR_QRY_REMOVE_BINDING;
925 OUString sProperty = bSubmission ? OUString(PN_SUBMISSION_ID) : OUString(PN_BINDING_ID);
926 OUString sSearch = bSubmission ? OUString(SUBMISSIONNAME) : OUString(BINDINGNAME);
927 OUString sName;
928 try
929 {
930 pNode->m_xPropSet->getPropertyValue( sProperty ) >>= sName;
931 }
932 catch ( Exception const & )
933 {
934 TOOLS_WARN_EXCEPTION( "svx.form", "XFormsPage::RemoveEntry()" );
935 }
936 std::unique_ptr<weld::MessageDialog> xQBox(Application::CreateMessageDialog(m_pNaviWin->GetFrameWeld(),
937 VclMessageType::Question, VclButtonsType::YesNo,
938 SvxResId(pResId)));
939 OUString sMessText = xQBox->get_primary_text();
940 sMessText = sMessText.replaceFirst( sSearch, sName);
941 xQBox->set_primary_text(sMessText);
942 if (xQBox->run() == RET_YES)
943 {
944 try
945 {
946 if ( bSubmission )
947 xModel->getSubmissions()->remove( Any( pNode->m_xPropSet ) );
948 else // then Binding Page
949 xModel->getBindings()->remove( Any( pNode->m_xPropSet ) );
950 bRet = true;
951 }
952 catch ( Exception const & )
953 {
954 TOOLS_WARN_EXCEPTION( "svx.form", "XFormsPage::RemoveEntry()" );
955 }
956 }
957 }
958
959 if (bRet)
960 {
961 m_xItemList->remove(*xEntry);
962 delete pNode;
963 }
964 }
965
966 return bRet;
967 }
968
969 IMPL_LINK(XFormsPage, KeyInputHdl, const KeyEvent&, rKEvt, bool)
970 {
971 bool bHandled = false;
972
973 sal_uInt16 nCode = rKEvt.GetKeyCode().GetCode();
974 if (nCode == KEY_DELETE)
975 bHandled = DoMenuAction("delete");
976
977 return bHandled;
978 }
979
980 OUString XFormsPage::SetModel( const Reference< css::xforms::XModel >& _xModel, int _nPagePos )
981 {
982 DBG_ASSERT( _xModel.is(), "XFormsPage::SetModel(): invalid model" );
983
984 m_xUIHelper.set( _xModel, UNO_QUERY );
985 OUString sRet;
986 m_bHasModel = true;
987
988 switch ( m_eGroup )
989 {
990 case DGTInstance :
991 {
992 DBG_ASSERT( _nPagePos != -1, "XFormsPage::SetModel(): invalid page position" );
993 try
994 {
995 Reference< XContainer > xContainer( _xModel->getInstances(), UNO_QUERY );
996 if ( xContainer.is() )
997 m_pNaviWin->AddContainerBroadcaster( xContainer );
998
999 Reference< XEnumerationAccess > xNumAccess = _xModel->getInstances();
1000 if ( xNumAccess.is() )
1001 {
1002 Reference < XEnumeration > xNum = xNumAccess->createEnumeration();
1003 if ( xNum.is() && xNum->hasMoreElements() )
1004 {
1005 int nIter = 0;
1006 while ( xNum->hasMoreElements() )
1007 {
1008 if ( nIter == _nPagePos )
1009 {
1010 Sequence< PropertyValue > xPropSeq;
1011 Any aAny = xNum->nextElement();
1012 if ( aAny >>= xPropSeq )
1013 sRet = LoadInstance(xPropSeq);
1014 else
1015 {
1016 SAL_WARN( "svx.form", "XFormsPage::SetModel(): invalid instance" );
1017 }
1018 break;
1019 }
1020 else
1021 {
1022 xNum->nextElement();
1023 ++nIter;
1024 }
1025 }
1026 }
1027 }
1028 }
1029 catch( Exception const & )
1030 {
1031 TOOLS_WARN_EXCEPTION( "svx.form", "XFormsPage::SetModel()" );
1032 }
1033 break;
1034 }
1035
1036 case DGTSubmission :
1037 {
1038 DBG_ASSERT( _nPagePos == -1, "XFormsPage::SetModel(): invalid page position" );
1039 try
1040 {
1041 Reference< XContainer > xContainer( _xModel->getSubmissions(), UNO_QUERY );
1042 if ( xContainer.is() )
1043 m_pNaviWin->AddContainerBroadcaster( xContainer );
1044
1045 Reference< XEnumerationAccess > xNumAccess = _xModel->getSubmissions();
1046 if ( xNumAccess.is() )
1047 {
1048 Reference < XEnumeration > xNum = xNumAccess->createEnumeration();
1049 if ( xNum.is() && xNum->hasMoreElements() )
1050 {
1051 while ( xNum->hasMoreElements() )
1052 {
1053 Reference< XPropertySet > xPropSet;
1054 Any aAny = xNum->nextElement();
1055 if ( aAny >>= xPropSet )
1056 AddEntry( xPropSet );
1057 }
1058 }
1059 }
1060 }
1061 catch( Exception const & )
1062 {
1063 TOOLS_WARN_EXCEPTION( "svx.form", "XFormsPage::SetModel()" );
1064 }
1065 break;
1066 }
1067
1068 case DGTBinding :
1069 {
1070 DBG_ASSERT( _nPagePos == -1, "XFormsPage::SetModel(): invalid page position" );
1071 try
1072 {
1073 Reference< XContainer > xContainer( _xModel->getBindings(), UNO_QUERY );
1074 if ( xContainer.is() )
1075 m_pNaviWin->AddContainerBroadcaster( xContainer );
1076
1077 Reference< XEnumerationAccess > xNumAccess = _xModel->getBindings();
1078 if ( xNumAccess.is() )
1079 {
1080 Reference < XEnumeration > xNum = xNumAccess->createEnumeration();
1081 if ( xNum.is() && xNum->hasMoreElements() )
1082 {
1083 OUString aImage(RID_SVXBMP_ELEMENT);
1084 std::unique_ptr<weld::TreeIter> xRes(m_xItemList->make_iterator());
1085 while ( xNum->hasMoreElements() )
1086 {
1087 Reference< XPropertySet > xPropSet;
1088 Any aAny = xNum->nextElement();
1089 if ( aAny >>= xPropSet )
1090 {
1091 OUString sEntry;
1092 OUString sTemp;
1093 xPropSet->getPropertyValue( PN_BINDING_ID ) >>= sTemp;
1094 sEntry += sTemp + ": ";
1095 xPropSet->getPropertyValue( PN_BINDING_EXPR ) >>= sTemp;
1096 sEntry += sTemp;
1097
1098 ItemNode* pNode = new ItemNode( xPropSet );
1099
1100 OUString sId(weld::toId(pNode));
1101 m_xItemList->insert(nullptr, -1, &sEntry, &sId, nullptr, nullptr, false, xRes.get());
1102 m_xItemList->set_image(*xRes, aImage);
1103 }
1104 }
1105 }
1106 }
1107 }
1108 catch( Exception const & )
1109 {
1110 TOOLS_WARN_EXCEPTION( "svx.form", "XFormsPage::SetModel()" );
1111 }
1112 break;
1113 }
1114 default:
1115 OSL_FAIL( "XFormsPage::SetModel: unknown group!" );
1116 break;
1117 }
1118
1120
1121 return sRet;
1122 }
1123
1125 {
1126 m_bHasModel = false;
1128 }
1129
1130 OUString XFormsPage::LoadInstance(const Sequence< PropertyValue >& _xPropSeq)
1131 {
1132 OUString sRet;
1133 OUString sTemp;
1134 OUString sInstModel = PN_INSTANCE_MODEL;
1135 OUString sInstName = PN_INSTANCE_ID;
1136 OUString sInstURL = PN_INSTANCE_URL;
1137 for ( const PropertyValue& rProp : _xPropSeq )
1138 {
1139 if ( sInstModel == rProp.Name )
1140 {
1141 Reference< css::xml::dom::XNode > xRoot;
1142 if ( rProp.Value >>= xRoot )
1143 {
1144 try
1145 {
1146 Reference< XEventTarget > xTarget( xRoot, UNO_QUERY );
1147 if ( xTarget.is() )
1149
1150 OUString sNodeName =
1151 m_xUIHelper->getNodeDisplayName( xRoot, m_pNaviWin->IsShowDetails() );
1152 if ( sNodeName.isEmpty() )
1153 sNodeName = xRoot->getNodeName();
1154 if ( xRoot->hasChildNodes() )
1155 AddChildren(nullptr, xRoot);
1156 }
1157 catch ( Exception const & )
1158 {
1159 TOOLS_WARN_EXCEPTION( "svx.form", "XFormsPage::LoadInstance()" );
1160 }
1161 }
1162 }
1163 else if ( sInstName == rProp.Name && ( rProp.Value >>= sTemp ) )
1164 m_sInstanceName = sRet = sTemp;
1165 else if ( sInstURL == rProp.Name && ( rProp.Value >>= sTemp ) )
1166 m_sInstanceURL = sTemp;
1167 }
1168
1169 return sRet;
1170 }
1171
1172 bool XFormsPage::DoMenuAction(std::string_view rMenuID)
1173 {
1174 return DoToolBoxAction(rMenuID);
1175 }
1176
1177 void XFormsPage::SetMenuEntrySensitive(const OString& rIdent, bool bSensitive)
1178 {
1180 return;
1181 m_xMenu->set_sensitive(rIdent, bSensitive);
1182 }
1183
1185 {
1186 bool bEnableAdd = false;
1187 bool bEnableEdit = false;
1188 bool bEnableRemove = false;
1189
1190 std::unique_ptr<weld::TreeIter> xEntry(m_xItemList->make_iterator());
1191 bool bEntry = m_xItemList->get_selected(xEntry.get());
1192 if (bEntry)
1193 {
1194 bEnableAdd = true;
1195 bool bSubmitChild = false;
1196 if (DGTSubmission == m_eGroup && m_xItemList->get_iter_depth(*xEntry))
1197 {
1198 m_xItemList->iter_parent(*xEntry);
1199 bSubmitChild = true;
1200 }
1201 ItemNode* pNode = weld::fromId<ItemNode*>(m_xItemList->get_id(*xEntry));
1202 if ( pNode && ( pNode->m_xNode.is() || pNode->m_xPropSet.is() ) )
1203 {
1204 bEnableEdit = true;
1205 bEnableRemove = !bSubmitChild;
1206 if ( DGTInstance == m_eGroup && !m_xItemList->get_iter_depth(*xEntry) )
1207 bEnableRemove = false;
1208 if ( pNode->m_xNode.is() )
1209 {
1210 try
1211 {
1212 css::xml::dom::NodeType eChildType = pNode->m_xNode->getNodeType();
1213 if ( eChildType != css::xml::dom::NodeType_ELEMENT_NODE
1214 && eChildType != css::xml::dom::NodeType_DOCUMENT_NODE )
1215 {
1216 bEnableAdd = false;
1217 }
1218 }
1219 catch ( Exception const & )
1220 {
1221 TOOLS_WARN_EXCEPTION( "svx.form", "XFormsPage::EnableMenuItems()" );
1222 }
1223 }
1224 }
1225 }
1226 else if ( m_eGroup != DGTInstance )
1227 bEnableAdd = true;
1228
1229 m_xToolBox->set_item_sensitive("additem", bEnableAdd);
1230 m_xToolBox->set_item_sensitive("addelement", bEnableAdd);
1231 m_xToolBox->set_item_sensitive("addattribute", bEnableAdd);
1232 m_xToolBox->set_item_sensitive("edit", bEnableEdit);
1233 m_xToolBox->set_item_sensitive("delete", bEnableRemove);
1234
1235 if (m_xMenu)
1236 {
1237 SetMenuEntrySensitive("additem", bEnableAdd);
1238 SetMenuEntrySensitive("addelement", bEnableAdd);
1239 SetMenuEntrySensitive("addattribute", bEnableAdd);
1240 SetMenuEntrySensitive("edit", bEnableEdit);
1241 SetMenuEntrySensitive("delete", bEnableRemove);
1242 }
1243 if ( DGTInstance != m_eGroup )
1244 return;
1245
1246 TranslateId pResId1 = RID_STR_DATANAV_EDIT_ELEMENT;
1247 TranslateId pResId2 = RID_STR_DATANAV_REMOVE_ELEMENT;
1248 if (bEntry)
1249 {
1250 ItemNode* pNode = weld::fromId<ItemNode*>(m_xItemList->get_id(*xEntry));
1251 if ( pNode && pNode->m_xNode.is() )
1252 {
1253 try
1254 {
1255 css::xml::dom::NodeType eChildType = pNode->m_xNode->getNodeType();
1256 if ( eChildType == css::xml::dom::NodeType_ATTRIBUTE_NODE )
1257 {
1258 pResId1 = RID_STR_DATANAV_EDIT_ATTRIBUTE;
1259 pResId2 = RID_STR_DATANAV_REMOVE_ATTRIBUTE;
1260 }
1261 }
1262 catch ( Exception const & )
1263 {
1264 TOOLS_WARN_EXCEPTION( "svx.form", "XFormsPage::EnableMenuItems()" );
1265 }
1266 }
1267 }
1268 m_xToolBox->set_item_label("edit", SvxResId(pResId1));
1269 m_xToolBox->set_item_label("delete", SvxResId(pResId2));
1270 if (m_xMenu)
1271 {
1272 m_xMenu->set_label("edit", SvxResId( pResId1 ) );
1273 m_xMenu->set_label("delete", SvxResId( pResId2 ) );
1274 }
1275 }
1276
1278 : m_xParent(pParent)
1279 , m_xModelsBox(rBuilder.weld_combo_box("modelslist"))
1280 , m_xModelBtn(rBuilder.weld_menu_button("modelsbutton"))
1281 , m_xTabCtrl(rBuilder.weld_notebook("tabcontrol"))
1282 , m_xInstanceBtn(rBuilder.weld_menu_button("instances"))
1283 , m_nLastSelectedPos(-1)
1284 , m_bShowDetails(false)
1285 , m_bIsNotifyDisabled(false)
1286 , m_aUpdateTimer("svx DataNavigatorWindow m_aUpdateTimer")
1287 , m_xDataListener(new DataListener(this))
1288 {
1289 // handler
1290 m_xModelsBox->connect_changed( LINK( this, DataNavigatorWindow, ModelSelectListBoxHdl ) );
1291 Link<const OString&, void> aLink1 = LINK( this, DataNavigatorWindow, MenuSelectHdl );
1292 m_xModelBtn->connect_selected(aLink1);
1293 m_xInstanceBtn->connect_selected(aLink1);
1294 Link<weld::Toggleable&,void> aLink2 = LINK( this, DataNavigatorWindow, MenuActivateHdl );
1295 m_xModelBtn->connect_toggled( aLink2 );
1296 m_xInstanceBtn->connect_toggled( aLink2 );
1297 m_xTabCtrl->connect_enter_page( LINK( this, DataNavigatorWindow, ActivatePageHdl ) );
1298 m_aUpdateTimer.SetTimeout( 2000 );
1300
1301 // init tabcontrol
1302 OString sPageId("instance");
1303 SvtViewOptions aViewOpt( EViewType::TabDialog, CFGNAME_DATANAVIGATOR );
1304 if ( aViewOpt.Exists() )
1305 {
1306 OString sNewPageId = aViewOpt.GetPageID();
1307 if (m_xTabCtrl->get_page_index(sNewPageId) != -1)
1308 sPageId = sNewPageId;
1310 }
1311
1312 m_xInstanceBtn->set_item_active("instancesdetails", m_bShowDetails);
1313
1314 m_xTabCtrl->set_current_page(sPageId);
1315 ActivatePageHdl(sPageId);
1316
1317 // get our frame
1318 DBG_ASSERT( pBindings != nullptr,
1319 "DataNavigatorWindow::LoadModels(): no SfxBindings; can't get frame" );
1321 DBG_ASSERT( m_xFrame.is(), "DataNavigatorWindow::LoadModels(): no frame" );
1322 // add frameaction listener
1323 Reference< XFrameActionListener > xListener = m_xDataListener;
1324 m_xFrame->addFrameActionListener( xListener );
1325
1326 // load xforms models of the current document
1327 LoadModels();
1328
1329 // tdf#154322 select the first entry of the current page by default
1330 if (XFormsPage* pPage = GetPage(sPageId))
1331 pPage->SelectFirstEntry();
1332 }
1333
1335 {
1336 Reference< XFrameActionListener > xListener = m_xDataListener;
1337 m_xFrame->removeFrameActionListener( xListener );
1338
1339 SvtViewOptions aViewOpt( EViewType::TabDialog, CFGNAME_DATANAVIGATOR );
1340 aViewOpt.SetPageID(m_xTabCtrl->get_current_page_ident());
1342
1343 m_xInstPage.reset();
1344 m_xSubmissionPage.reset();
1345 m_xBindingPage.reset();
1346
1347 sal_Int32 i, nCount = m_aPageList.size();
1348 for ( i = 0; i < nCount; ++i )
1349 m_aPageList[i].reset();
1350 m_aPageList.clear();
1351
1353 m_xDataListener.clear();
1354 }
1355
1356 IMPL_LINK( DataNavigatorWindow, ModelSelectListBoxHdl, weld::ComboBox&, rBox, void )
1357 {
1358 ModelSelectHdl(&rBox);
1359 }
1360
1362 {
1363 sal_Int32 nPos = m_xModelsBox->get_active();
1364 // pBox == NULL, if you want to force a new fill.
1365 if ( nPos != m_nLastSelectedPos || !pBox )
1366 {
1368 ClearAllPageModels( pBox != nullptr );
1369 InitPages();
1371 }
1372 }
1373
1374 IMPL_LINK(DataNavigatorWindow, MenuSelectHdl, const OString&, rIdent, void)
1375 {
1376 bool bIsDocModified = false;
1377 Reference< css::xforms::XFormsUIHelper1 > xUIHelper;
1378 sal_Int32 nSelectedPos = m_xModelsBox->get_active();
1379 OUString sSelectedModel(m_xModelsBox->get_text(nSelectedPos));
1380 Reference< css::xforms::XModel > xModel;
1381 try
1382 {
1383 Any aAny = m_xDataContainer->getByName( sSelectedModel );
1384 if ( aAny >>= xModel )
1385 xUIHelper.set( xModel, UNO_QUERY );
1386 }
1387 catch ( Exception const & )
1388 {
1389 TOOLS_WARN_EXCEPTION( "svx.form", "DataNavigatorWindow::MenuSelectHdl()" );
1390 }
1391 DBG_ASSERT( xUIHelper.is(), "DataNavigatorWindow::MenuSelectHdl(): no UIHelper" );
1392
1393 m_bIsNotifyDisabled = true;
1394
1395 if (rIdent == "modelsadd")
1396 {
1397 AddModelDialog aDlg(GetFrameWeld(), false);
1398 bool bShowDialog = true;
1399 while ( bShowDialog )
1400 {
1401 bShowDialog = false;
1402 if (aDlg.run() == RET_OK)
1403 {
1404 OUString sNewName = aDlg.GetName();
1405 bool bDocumentData = aDlg.GetModifyDoc();
1406
1407 if (m_xModelsBox->find_text(sNewName) != -1)
1408 {
1409 // error: model name already exists
1410 std::unique_ptr<weld::MessageDialog> xErrBox(Application::CreateMessageDialog(GetFrameWeld(),
1411 VclMessageType::Warning, VclButtonsType::Ok,
1412 SvxResId(RID_STR_DOUBLE_MODELNAME)));
1413 xErrBox->set_primary_text(xErrBox->get_primary_text().replaceFirst(MSG_VARIABLE, sNewName));
1414 xErrBox->run();
1415 bShowDialog = true;
1416 }
1417 else
1418 {
1419 try
1420 {
1421 // add new model to frame model
1422 Reference< css::xforms::XModel > xNewModel(
1423 xUIHelper->newModel( m_xFrameModel, sNewName ), UNO_SET_THROW );
1424
1425 Reference< XPropertySet > xModelProps( xNewModel, UNO_QUERY_THROW );
1426 xModelProps->setPropertyValue("ExternalData", Any( !bDocumentData ) );
1427
1428 m_xModelsBox->append_text(sNewName);
1429 m_xModelsBox->set_active(m_xModelsBox->get_count() - 1);
1430 ModelSelectHdl(m_xModelsBox.get());
1431 bIsDocModified = true;
1432 }
1433 catch ( Exception const & )
1434 {
1435 TOOLS_WARN_EXCEPTION( "svx.form", "DataNavigatorWindow::MenuSelectHdl()" );
1436 }
1437 }
1438 }
1439 }
1440 }
1441 else if (rIdent == "modelsedit")
1442 {
1443 AddModelDialog aDlg(GetFrameWeld(), true);
1444 aDlg.SetName( sSelectedModel );
1445
1446 bool bDocumentData( false );
1447 try
1448 {
1449 Reference< css::xforms::XFormsSupplier > xFormsSupp( m_xFrameModel, UNO_QUERY_THROW );
1450 Reference< XNameContainer > xXForms( xFormsSupp->getXForms(), UNO_SET_THROW );
1451 Reference< XPropertySet > xModelProps( xXForms->getByName( sSelectedModel ), UNO_QUERY_THROW );
1452 bool bExternalData = false;
1453 OSL_VERIFY( xModelProps->getPropertyValue( "ExternalData" ) >>= bExternalData );
1454 bDocumentData = !bExternalData;
1455 }
1456 catch( const Exception& )
1457 {
1459 }
1460 aDlg.SetModifyDoc( bDocumentData );
1461
1462 if (aDlg.run() == RET_OK)
1463 {
1464 if ( aDlg.GetModifyDoc() != bDocumentData )
1465 {
1466 bDocumentData = aDlg.GetModifyDoc();
1467 try
1468 {
1469 Reference< css::xforms::XFormsSupplier > xFormsSupp( m_xFrameModel, UNO_QUERY_THROW );
1470 Reference< XNameContainer > xXForms( xFormsSupp->getXForms(), UNO_SET_THROW );
1471 Reference< XPropertySet > xModelProps( xXForms->getByName( sSelectedModel ), UNO_QUERY_THROW );
1472 xModelProps->setPropertyValue( "ExternalData", Any( !bDocumentData ) );
1473 bIsDocModified = true;
1474 }
1475 catch( const Exception& )
1476 {
1478 }
1479 }
1480
1481 OUString sNewName = aDlg.GetName();
1482 if ( !sNewName.isEmpty() && ( sNewName != sSelectedModel ) )
1483 {
1484 try
1485 {
1486 xUIHelper->renameModel( m_xFrameModel, sSelectedModel, sNewName );
1487
1488 m_xModelsBox->remove(nSelectedPos);
1489 m_xModelsBox->append_text(sNewName);
1490 m_xModelsBox->set_active(m_xModelsBox->get_count() - 1);
1491 bIsDocModified = true;
1492 }
1493 catch ( Exception const & )
1494 {
1495 TOOLS_WARN_EXCEPTION( "svx.form", "DataNavigatorWindow::MenuSelectHdl()" );
1496 }
1497 }
1498 }
1499 }
1500 else if (rIdent == "modelsremove")
1501 {
1502 std::unique_ptr<weld::MessageDialog> xQBox(Application::CreateMessageDialog(GetFrameWeld(),
1503 VclMessageType::Question, VclButtonsType::YesNo,
1504 SvxResId( RID_STR_QRY_REMOVE_MODEL)));
1505 OUString sText = xQBox->get_primary_text();
1506 sText = sText.replaceFirst( MODELNAME, sSelectedModel );
1507 xQBox->set_primary_text(sText);
1508 if (xQBox->run() == RET_YES)
1509 {
1510 try
1511 {
1512 xUIHelper->removeModel( m_xFrameModel, sSelectedModel );
1513 }
1514 catch ( Exception const & )
1515 {
1516 TOOLS_WARN_EXCEPTION( "svx.form", "DataNavigatorWindow::MenuSelectHdl()" );
1517 }
1518 m_xModelsBox->remove(nSelectedPos);
1519 if (m_xModelsBox->get_count() <= nSelectedPos)
1520 nSelectedPos = m_xModelsBox->get_count() - 1;
1521 m_xModelsBox->set_active(nSelectedPos);
1522 ModelSelectHdl(m_xModelsBox.get());
1523 bIsDocModified = true;
1524 }
1525 }
1526 else if (rIdent == "instancesadd")
1527 {
1528 AddInstanceDialog aDlg(GetFrameWeld(), false);
1529 if (aDlg.run() == RET_OK)
1530 {
1531 OString sPageId = GetNewPageId(); // ModelSelectHdl will cause a page of this id to be created
1532
1533 OUString sName = aDlg.GetName();
1534 if (sName.isEmpty())
1535 {
1536 SAL_WARN( "svx.form", "DataNavigatorWindow::CreateInstancePage(): instance without name" );
1537 sName = "untitled";
1538 }
1539
1540 OUString sURL = aDlg.GetURL();
1541 bool bLinkOnce = aDlg.IsLinkInstance();
1542 try
1543 {
1544 xUIHelper->newInstance( sName, sURL, !bLinkOnce );
1545 }
1546 catch ( Exception const & )
1547 {
1548 TOOLS_WARN_EXCEPTION( "svx.form", "DataNavigatorWindow::MenuSelectHdl()" );
1549 }
1550 ModelSelectHdl( nullptr );
1551
1552 XFormsPage* pPage = GetPage(sPageId);
1553 pPage->SetInstanceName(sName);
1554 pPage->SetInstanceURL(sURL);
1555 pPage->SetLinkOnce(bLinkOnce);
1556 ActivatePageHdl(sPageId);
1557
1558 bIsDocModified = true;
1559 }
1560 }
1561 else if (rIdent == "instancesedit")
1562 {
1563 OString sIdent = GetCurrentPage();
1564 XFormsPage* pPage = GetPage(sIdent);
1565 if ( pPage )
1566 {
1567 AddInstanceDialog aDlg(GetFrameWeld(), true);
1568 aDlg.SetName( pPage->GetInstanceName() );
1569 aDlg.SetURL( pPage->GetInstanceURL() );
1570 aDlg.SetLinkInstance( pPage->GetLinkOnce() );
1571 OUString sOldName = aDlg.GetName();
1572 if (aDlg.run() == RET_OK)
1573 {
1574 OUString sNewName = aDlg.GetName();
1575 OUString sURL = aDlg.GetURL();
1576 bool bLinkOnce = aDlg.IsLinkInstance();
1577 try
1578 {
1579 xUIHelper->renameInstance( sOldName,
1580 sNewName,
1581 sURL,
1582 !bLinkOnce );
1583 }
1584 catch ( Exception const & )
1585 {
1586 TOOLS_WARN_EXCEPTION( "svx.form", "DataNavigatorWindow::MenuSelectHdl()" );
1587 }
1588 pPage->SetInstanceName(sNewName);
1589 pPage->SetInstanceURL(sURL);
1590 pPage->SetLinkOnce(bLinkOnce);
1591 m_xTabCtrl->set_tab_label_text(sIdent, sNewName);
1592 bIsDocModified = true;
1593 }
1594 }
1595 }
1596 else if (rIdent == "instancesremove")
1597 {
1598 OString sIdent = GetCurrentPage();
1599 XFormsPage* pPage = GetPage(sIdent);
1600 if (pPage)
1601 {
1602 OUString sInstName = pPage->GetInstanceName();
1603 std::unique_ptr<weld::MessageDialog> xQBox(Application::CreateMessageDialog(GetFrameWeld(),
1604 VclMessageType::Question, VclButtonsType::YesNo,
1605 SvxResId(RID_STR_QRY_REMOVE_INSTANCE)));
1606 OUString sMessText = xQBox->get_primary_text();
1607 sMessText = sMessText.replaceFirst( INSTANCENAME, sInstName );
1608 xQBox->set_primary_text(sMessText);
1609 if (xQBox->run() == RET_YES)
1610 {
1611 bool bDoRemove = false;
1612 if (IsAdditionalPage(sIdent))
1613 {
1614 auto aPageListEnd = m_aPageList.end();
1615 auto aFoundPage = std::find_if(m_aPageList.begin(), aPageListEnd,
1616 [pPage](const auto&elem) { return elem.get() == pPage; });
1617 if ( aFoundPage != aPageListEnd )
1618 {
1619 m_aPageList.erase( aFoundPage );
1620 bDoRemove = true;
1621 }
1622 }
1623 else
1624 {
1625 m_xInstPage.reset();
1626 bDoRemove = true;
1627 }
1628
1629 if ( bDoRemove )
1630 {
1631 try
1632 {
1633 xUIHelper->removeInstance( sInstName );
1634 }
1635 catch (const Exception&)
1636 {
1637 TOOLS_WARN_EXCEPTION( "svx.form", "DataNavigatorWindow::MenuSelectHdl()" );
1638 }
1639 m_xTabCtrl->remove_page(sIdent);
1640 m_xTabCtrl->set_current_page("instance");
1641 ModelSelectHdl( nullptr );
1642 bIsDocModified = true;
1643 }
1644 }
1645 }
1646 }
1647 else if (rIdent == "instancesdetails")
1648 {
1649 m_bShowDetails = !m_bShowDetails;
1650 m_xInstanceBtn->set_item_active("instancesdetails", m_bShowDetails);
1651 ModelSelectHdl(m_xModelsBox.get());
1652 }
1653 else
1654 {
1655 SAL_WARN( "svx.form", "DataNavigatorWindow::MenuSelectHdl(): wrong menu item" );
1656 }
1657
1658 m_bIsNotifyDisabled = false;
1659
1660 if ( bIsDocModified )
1661 SetDocModified();
1662 }
1663
1664 bool DataNavigatorWindow::IsAdditionalPage(std::string_view rIdent)
1665 {
1666 return o3tl::starts_with(rIdent, "additional");
1667 }
1668
1669 IMPL_LINK( DataNavigatorWindow, MenuActivateHdl, weld::Toggleable&, rBtn, void )
1670 {
1671 if (m_xInstanceBtn.get() == &rBtn)
1672 {
1673 OString sIdent(m_xTabCtrl->get_current_page_ident());
1674 bool bIsInstPage = (IsAdditionalPage(sIdent) || sIdent == "instance");
1675 m_xInstanceBtn->set_item_sensitive( "instancesedit", bIsInstPage );
1676 m_xInstanceBtn->set_item_sensitive( "instancesremove",
1677 bIsInstPage && m_xTabCtrl->get_n_pages() > MIN_PAGE_COUNT );
1678 m_xInstanceBtn->set_item_sensitive( "instancesdetails", bIsInstPage );
1679 }
1680 else if (m_xModelBtn.get() == &rBtn)
1681 {
1682 // we need at least one model!
1683 m_xModelBtn->set_item_sensitive("modelsremove", m_xModelsBox->get_count() > 1 );
1684 }
1685 else
1686 {
1687 SAL_WARN( "svx.form", "DataNavigatorWindow::MenuActivateHdl(): wrong button" );
1688 }
1689 }
1690
1691 IMPL_LINK(DataNavigatorWindow, ActivatePageHdl, const OString&, rIdent, void)
1692 {
1693 XFormsPage* pPage = GetPage(rIdent);
1694 if (!pPage)
1695 return;
1696 if (m_xDataContainer.is() && !pPage->HasModel())
1697 SetPageModel(rIdent);
1698 }
1699
1701 {
1702 ModelSelectHdl( nullptr );
1703 }
1704
1706 {
1707 XFormsPage* pPage = nullptr;
1708 if (rCurId == "submissions")
1709 {
1710 if (!m_xSubmissionPage)
1711 m_xSubmissionPage.reset(new XFormsPage(m_xTabCtrl->get_page(rCurId), this, DGTSubmission));
1712 pPage = m_xSubmissionPage.get();
1713 }
1714 else if (rCurId == "bindings")
1715 {
1716 if (!m_xBindingPage)
1717 m_xBindingPage.reset(new XFormsPage(m_xTabCtrl->get_page(rCurId), this, DGTBinding));
1718 pPage = m_xBindingPage.get();
1719 }
1720 else if (rCurId == "instance")
1721 {
1722 if (!m_xInstPage)
1723 m_xInstPage.reset(new XFormsPage(m_xTabCtrl->get_page(rCurId), this, DGTInstance));
1724 pPage = m_xInstPage.get();
1725 }
1726 else
1727 {
1728 sal_uInt16 nPos = m_xTabCtrl->get_page_index(rCurId);
1729 if (HasFirstInstancePage() && nPos > 0)
1730 nPos--;
1731 if (m_aPageList.size() > nPos)
1732 pPage = m_aPageList[nPos].get();
1733 else
1734 {
1735 m_aPageList.emplace_back(std::make_unique<XFormsPage>(m_xTabCtrl->get_page(rCurId), this, DGTInstance));
1736 pPage = m_aPageList.back().get();
1737 }
1738 }
1739 return pPage;
1740 }
1741
1743 {
1744 return m_xTabCtrl->get_current_page_ident();
1745 }
1746
1748 {
1749 if ( !m_xFrameModel.is() )
1750 {
1751 // get model of active frame
1752 Reference< XController > xCtrl = m_xFrame->getController();
1753 if ( xCtrl.is() )
1754 {
1755 try
1756 {
1757 m_xFrameModel = xCtrl->getModel();
1758 }
1759 catch ( Exception const & )
1760 {
1761 TOOLS_WARN_EXCEPTION( "svx.form", "DataNavigatorWindow::LoadModels()" );
1762 }
1763 }
1764 }
1765
1766 if ( m_xFrameModel.is() )
1767 {
1768 try
1769 {
1770 Reference< css::xforms::XFormsSupplier > xFormsSupp( m_xFrameModel, UNO_QUERY );
1771 if ( xFormsSupp.is() )
1772 {
1773 Reference< XNameContainer > xContainer = xFormsSupp->getXForms();
1774 if ( xContainer.is() )
1775 {
1776 m_xDataContainer = xContainer;
1777 const Sequence< OUString > aNameList = m_xDataContainer->getElementNames();
1778 for ( const OUString& rName : aNameList )
1779 {
1780 Any aAny = m_xDataContainer->getByName( rName );
1781 Reference< css::xforms::XModel > xFormsModel;
1782 if ( aAny >>= xFormsModel )
1783 m_xModelsBox->append_text(xFormsModel->getID());
1784 }
1785 }
1786 }
1787 }
1788 catch( Exception const & )
1789 {
1790 TOOLS_WARN_EXCEPTION( "svx.form", "DataNavigatorWindow::LoadModels()" );
1791 }
1792 }
1793
1794 if (m_xModelsBox->get_count() > 0)
1795 {
1796 m_xModelsBox->set_active(0);
1798 }
1799 }
1800
1801 void DataNavigatorWindow::SetPageModel(const OString& rIdent)
1802 {
1803 OUString sModel(m_xModelsBox->get_active_text());
1804 try
1805 {
1806 Any aAny = m_xDataContainer->getByName( sModel );
1807 Reference< css::xforms::XModel > xFormsModel;
1808 if ( aAny >>= xFormsModel )
1809 {
1810 int nPagePos = -1;
1811 XFormsPage* pPage = GetPage(rIdent);
1812 DBG_ASSERT( pPage, "DataNavigatorWindow::SetPageModel(): no page" );
1813 if (IsAdditionalPage(rIdent) || rIdent == "instance")
1814 {
1815 // instance page
1816 nPagePos = m_xTabCtrl->get_page_index(rIdent);
1817 }
1818 m_bIsNotifyDisabled = true;
1819 OUString sText = pPage->SetModel( xFormsModel, nPagePos );
1820 m_bIsNotifyDisabled = false;
1821 if (!sText.isEmpty())
1822 m_xTabCtrl->set_tab_label_text(rIdent, sText);
1823 }
1824 }
1825 catch (const NoSuchElementException& )
1826 {
1827 SAL_WARN( "svx.form", "DataNavigatorWindow::SetPageModel(): no such element" );
1828 }
1829 catch( Exception const & )
1830 {
1831 TOOLS_WARN_EXCEPTION( "svx.form", "DataNavigatorWindow::SetPageModel()" );
1832 }
1833 }
1834
1836 {
1837 OUString sModel(m_xModelsBox->get_active_text());
1838 try
1839 {
1840 Any aAny = m_xDataContainer->getByName( sModel );
1841 Reference< css::xforms::XModel > xModel;
1842 if ( aAny >>= xModel )
1843 {
1844 Reference< XEnumerationAccess > xNumAccess = xModel->getInstances();
1845 if ( xNumAccess.is() )
1846 {
1847 Reference < XEnumeration > xNum = xNumAccess->createEnumeration();
1848 if ( xNum.is() && xNum->hasMoreElements() )
1849 {
1850 sal_Int32 nAlreadyLoadedCount = m_aPageList.size();
1851 if ( !HasFirstInstancePage() && nAlreadyLoadedCount > 0 )
1852 nAlreadyLoadedCount--;
1853 sal_Int32 nIdx = 0;
1854 while ( xNum->hasMoreElements() )
1855 {
1856 if ( nIdx > nAlreadyLoadedCount )
1857 {
1858 Sequence< PropertyValue > xPropSeq;
1859 if ( xNum->nextElement() >>= xPropSeq )
1860 CreateInstancePage( xPropSeq );
1861 else
1862 {
1863 SAL_WARN( "svx.form", "DataNavigator::InitPages(): invalid instance" );
1864 }
1865 }
1866 else
1867 xNum->nextElement();
1868 nIdx++;
1869 }
1870 }
1871 }
1872 }
1873 }
1874 catch ( NoSuchElementException& )
1875 {
1876 SAL_WARN( "svx.form", "DataNavigatorWindow::SetPageModel(): no such element" );
1877 }
1878 catch( Exception const & )
1879 {
1880 TOOLS_WARN_EXCEPTION( "svx.form", "DataNavigatorWindow::SetPageModel()" );
1881 }
1882 }
1883
1885 {
1886 if ( m_xInstPage )
1887 m_xInstPage->ClearModel();
1888 if ( m_xSubmissionPage )
1889 m_xSubmissionPage->ClearModel();
1890 if ( m_xBindingPage )
1891 m_xBindingPage->ClearModel();
1892
1893 sal_Int32 nCount = m_aPageList.size();
1894 for (sal_Int32 i = 0; i < nCount; ++i)
1895 {
1896 XFormsPage* pPage = m_aPageList[i].get();
1897 pPage->ClearModel();
1898 }
1899
1900 if ( bClearPages )
1901 {
1902 m_aPageList.clear();
1903 while ( m_xTabCtrl->get_n_pages() > MIN_PAGE_COUNT )
1904 m_xTabCtrl->remove_page(m_xTabCtrl->get_page_ident(1));
1905 }
1906 }
1907
1908 void DataNavigatorWindow::CreateInstancePage( const Sequence< PropertyValue >& _xPropSeq )
1909 {
1910 OUString sInstName;
1911 auto pProp = std::find_if(_xPropSeq.begin(), _xPropSeq.end(),
1912 [](const PropertyValue& rProp) { return PN_INSTANCE_ID == rProp.Name; });
1913 if (pProp != _xPropSeq.end())
1914 pProp->Value >>= sInstName;
1915
1916 OString sPageId = GetNewPageId();
1917 if ( sInstName.isEmpty() )
1918 {
1919 SAL_WARN( "svx.form", "DataNavigatorWindow::CreateInstancePage(): instance without name" );
1920 sInstName = "untitled";
1921 }
1922 m_xTabCtrl->insert_page(sPageId, sInstName, m_xTabCtrl->get_n_pages() - 2);
1923 }
1924
1926 {
1927 return m_xTabCtrl->get_page_ident(0) == "instance";
1928 }
1929
1931 {
1932 int nMax = 0;
1933
1934 int nCount = m_xTabCtrl->get_n_pages();
1935 for (int i = 0; i < nCount; ++i)
1936 {
1937 OString sIdent = m_xTabCtrl->get_page_ident(i);
1938 OString sNumber;
1939 if (!sIdent.startsWith("additional", &sNumber))
1940 continue;
1941 int nPageId = sNumber.toInt32();
1942 if (nMax < nPageId)
1943 nMax = nPageId;
1944 }
1945
1946 return "additional" + OString::number(nMax + 1);
1947 }
1948
1950 {
1951 SfxObjectShell* pCurrentDoc = SfxObjectShell::Current();
1952 DBG_ASSERT( pCurrentDoc, "DataNavigatorWindow::SetDocModified(): no objectshell" );
1953 if (pCurrentDoc && !pCurrentDoc->IsModified() && pCurrentDoc->IsEnableSetModified())
1954 pCurrentDoc->SetModified();
1955 }
1956
1958 {
1959 if ( m_bIsNotifyDisabled )
1960 return;
1961
1962 if ( _bLoadAll )
1963 {
1964 // reset all members
1966 m_xDataContainer.clear();
1967 m_xFrameModel.clear();
1968 m_xModelsBox->clear();
1969 m_nLastSelectedPos = -1;
1970 // for a reload
1971 LoadModels();
1972 }
1973 else
1975 }
1976
1977 void DataNavigatorWindow::AddContainerBroadcaster( const css::uno::Reference< css::container::XContainer >& xContainer )
1978 {
1979 Reference< XContainerListener > xListener = m_xDataListener;
1980 xContainer->addContainerListener( xListener );
1981 m_aContainerList.push_back( xContainer );
1982 }
1983
1984
1985 void DataNavigatorWindow::AddEventBroadcaster( const css::uno::Reference< css::xml::dom::events::XEventTarget >& xTarget )
1986 {
1987 Reference< XEventListener > xListener = m_xDataListener;
1988 xTarget->addEventListener( EVENTTYPE_CHARDATA, xListener, true );
1989 xTarget->addEventListener( EVENTTYPE_CHARDATA, xListener, false );
1990 xTarget->addEventListener( EVENTTYPE_ATTR, xListener, true );
1991 xTarget->addEventListener( EVENTTYPE_ATTR, xListener, false );
1992 m_aEventTargetList.push_back( xTarget );
1993 }
1994
1996 {
1997 Reference< XContainerListener > xContainerListener = m_xDataListener;
1998 sal_Int32 i, nCount = m_aContainerList.size();
1999 for ( i = 0; i < nCount; ++i )
2000 m_aContainerList[i]->removeContainerListener( xContainerListener );
2001 Reference< XEventListener > xEventListener = m_xDataListener;
2002 nCount = m_aEventTargetList.size();
2003 for ( i = 0; i < nCount; ++i )
2004 {
2005 m_aEventTargetList[i]->removeEventListener( EVENTTYPE_CHARDATA, xEventListener, true );
2006 m_aEventTargetList[i]->removeEventListener( EVENTTYPE_CHARDATA, xEventListener, false );
2007 m_aEventTargetList[i]->removeEventListener( EVENTTYPE_ATTR, xEventListener, true );
2008 m_aEventTargetList[i]->removeEventListener( EVENTTYPE_ATTR, xEventListener, false );
2009 }
2010 }
2011
2013 : SfxDockingWindow(_pBindings, _pMgr, _pParent, "DataNavigator", "svx/ui/datanavigator.ui")
2014 , SfxControllerItem(SID_FM_DATANAVIGATOR_CONTROL, *_pBindings)
2015 , m_xDataWin(new DataNavigatorWindow(this, *m_xBuilder, _pBindings))
2016 {
2017 SetText( SvxResId( RID_STR_DATANAVIGATOR ) );
2018
2019 Size aSize = GetOptimalSize();
2020 Size aLogSize = PixelToLogic(aSize, MapMode(MapUnit::MapAppFont));
2022 }
2023
2025 {
2026 disposeOnce();
2027 }
2028
2030 {
2031 m_xDataWin.reset();
2034 }
2035
2037 {
2038 }
2039
2041 {
2042 if ( ( eAlign == SfxChildAlignment::TOP ) || ( eAlign == SfxChildAlignment::BOTTOM ) )
2043 return Size();
2044
2045 return SfxDockingWindow::CalcDockingSize( eAlign );
2046 }
2047
2049 {
2050 switch ( eAlign )
2051 {
2052 case SfxChildAlignment::LEFT:
2053 case SfxChildAlignment::RIGHT:
2054 case SfxChildAlignment::NOALIGNMENT:
2055 return eAlign;
2056 default:
2057 break;
2058 }
2059 return eActAlign;
2060 }
2061
2062 SFX_IMPL_DOCKINGWINDOW( DataNavigatorManager, SID_FM_SHOW_DATANAVIGATOR )
2063
2064 DataNavigatorManager::DataNavigatorManager(
2065 vcl::Window* _pParent, sal_uInt16 _nId, SfxBindings* _pBindings, SfxChildWinInfo* _pInfo ) :
2066
2067 SfxChildWindow( _pParent, _nId )
2068
2069 {
2070 SetWindow( VclPtr<DataNavigator>::Create( _pBindings, this, _pParent ) );
2071 SetAlignment(SfxChildAlignment::RIGHT);
2072 GetWindow()->SetSizePixel( Size( 250, 400 ) );
2073 static_cast<SfxDockingWindow*>(GetWindow())->Initialize( _pInfo );
2074 }
2075
2077 const Reference< css::xforms::XFormsUIHelper1 >& _rUIHelper)
2078 : GenericDialogController(pParent, "svx/ui/adddataitemdialog.ui", "AddDataItemDialog")
2079 , m_xUIHelper(_rUIHelper)
2080 , m_pItemNode(_pNode)
2081 , m_eItemType(DITNone)
2082 , m_sFL_Element(SvxResId(RID_STR_ELEMENT))
2083 , m_sFL_Attribute(SvxResId(RID_STR_ATTRIBUTE))
2084 , m_sFL_Binding(SvxResId(RID_STR_BINDING))
2085 , m_sFT_BindingExp(SvxResId(RID_STR_BINDING_EXPR))
2086 , m_xItemFrame(m_xBuilder->weld_frame("itemframe"))
2087 , m_xNameFT(m_xBuilder->weld_label("nameft"))
2088 , m_xNameED(m_xBuilder->weld_entry("name"))
2089 , m_xDefaultFT(m_xBuilder->weld_label("valueft"))
2090 , m_xDefaultED(m_xBuilder->weld_entry("value"))
2091 , m_xDefaultBtn(m_xBuilder->weld_button("browse"))
2092 , m_xSettingsFrame(m_xBuilder->weld_widget("settingsframe"))
2093 , m_xDataTypeLB(m_xBuilder->weld_combo_box("datatype"))
2094 , m_xRequiredCB(m_xBuilder->weld_check_button("required"))
2095 , m_xRequiredBtn(m_xBuilder->weld_button("requiredcond"))
2096 , m_xRelevantCB(m_xBuilder->weld_check_button("relevant"))
2097 , m_xRelevantBtn(m_xBuilder->weld_button("relevantcond"))
2098 , m_xConstraintCB(m_xBuilder->weld_check_button("constraint"))
2099 , m_xConstraintBtn(m_xBuilder->weld_button("constraintcond"))
2100 , m_xReadonlyCB(m_xBuilder->weld_check_button("readonly"))
2101 , m_xReadonlyBtn(m_xBuilder->weld_button("readonlycond"))
2102 , m_xCalculateCB(m_xBuilder->weld_check_button("calculate"))
2103 , m_xCalculateBtn(m_xBuilder->weld_button("calculatecond"))
2104 , m_xOKBtn(m_xBuilder->weld_button("ok"))
2105 {
2106 InitDialog();
2107 InitFromNode();
2109 Check(nullptr);
2110 }
2111
2113 {
2114 if ( m_xTempBinding.is() )
2115 {
2116 Reference< css::xforms::XModel > xModel( m_xUIHelper, UNO_QUERY );
2117 if ( xModel.is() )
2118 {
2119 try
2120 {
2121 Reference < XSet > xBindings = xModel->getBindings();
2122 if ( xBindings.is() )
2123 xBindings->remove( Any( m_xTempBinding ) );
2124 }
2125 catch (const Exception&)
2126 {
2127 TOOLS_WARN_EXCEPTION( "svx.form", "AddDataItemDialog::Dtor()" );
2128 }
2129 }
2130 }
2131 if( m_xUIHelper.is() && m_xBinding.is() )
2132 {
2133 // remove binding, if it does not convey 'useful' information
2134 m_xUIHelper->removeBindingIfUseless( m_xBinding );
2135 }
2136 }
2137
2139 {
2140 Check(&rBox);
2141 }
2142
2144 {
2145 // Condition buttons are only enable if their check box is checked
2146 m_xReadonlyBtn->set_sensitive( m_xReadonlyCB->get_active() );
2147 m_xRequiredBtn->set_sensitive( m_xRequiredCB->get_active() );
2148 m_xRelevantBtn->set_sensitive( m_xRelevantCB->get_active() );
2149 m_xConstraintBtn->set_sensitive( m_xConstraintCB->get_active() );
2150 m_xCalculateBtn->set_sensitive( m_xCalculateCB->get_active() );
2151
2152 if ( !(pBox && m_xTempBinding.is()) )
2153 return;
2154
2155 OUString sTemp, sPropName;
2156 if ( m_xRequiredCB.get() == pBox )
2157 sPropName = PN_REQUIRED_EXPR;
2158 else if ( m_xRelevantCB.get() == pBox )
2159 sPropName = PN_RELEVANT_EXPR;
2160 else if ( m_xConstraintCB.get() == pBox )
2161 sPropName = PN_CONSTRAINT_EXPR;
2162 else if ( m_xReadonlyCB.get() == pBox )
2163 sPropName = PN_READONLY_EXPR;
2164 else if ( m_xCalculateCB.get() == pBox )
2165 sPropName = PN_CALCULATE_EXPR;
2166 bool bIsChecked = pBox->get_active();
2167 m_xTempBinding->getPropertyValue( sPropName ) >>= sTemp;
2168 if ( bIsChecked && sTemp.isEmpty() )
2169 sTemp = TRUE_VALUE;
2170 else if ( !bIsChecked && !sTemp.isEmpty() )
2171 sTemp.clear();
2172 m_xTempBinding->setPropertyValue( sPropName, Any( sTemp ) );
2173 }
2174
2175 IMPL_LINK(AddDataItemDialog, ConditionHdl, weld::Button&, rBtn, void)
2176 {
2177 OUString sPropName;
2178 if ( m_xDefaultBtn.get() == &rBtn )
2179 sPropName = PN_BINDING_EXPR;
2180 else if ( m_xRequiredBtn.get() == &rBtn )
2181 sPropName = PN_REQUIRED_EXPR;
2182 else if ( m_xRelevantBtn.get() == &rBtn )
2183 sPropName = PN_RELEVANT_EXPR;
2184 else if ( m_xConstraintBtn.get() == &rBtn )
2185 sPropName = PN_CONSTRAINT_EXPR;
2186 else if (m_xReadonlyBtn.get() == &rBtn)
2187 sPropName = PN_READONLY_EXPR;
2188 else if (m_xCalculateBtn.get() == &rBtn)
2189 sPropName = PN_CALCULATE_EXPR;
2190 AddConditionDialog aDlg(m_xDialog.get(), sPropName, m_xTempBinding);
2191 bool bIsDefBtn = ( m_xDefaultBtn.get() == &rBtn );
2192 OUString sCondition;
2193 if ( bIsDefBtn )
2194 sCondition = m_xDefaultED->get_text();
2195 else
2196 {
2197 OUString sTemp;
2198 m_xTempBinding->getPropertyValue( sPropName ) >>= sTemp;
2199 if ( sTemp.isEmpty() )
2200 sTemp = TRUE_VALUE;
2201 sCondition = sTemp;
2202 }
2203 aDlg.SetCondition( sCondition );
2204
2205 if (aDlg.run() == RET_OK)
2206 {
2207 OUString sNewCondition = aDlg.GetCondition();
2208 if ( bIsDefBtn )
2209 m_xDefaultED->set_text(sNewCondition);
2210 else
2211 {
2212
2213 m_xTempBinding->setPropertyValue(
2214 sPropName, Any( sNewCondition ) );
2215 }
2216 }
2217 }
2218
2219 static void copyPropSet( const Reference< XPropertySet >& xFrom, Reference< XPropertySet > const & xTo )
2220 {
2221 DBG_ASSERT( xFrom.is(), "copyPropSet(): no source" );
2222 DBG_ASSERT( xTo.is(), "copyPropSet(): no target" );
2223
2224 try
2225 {
2226 // get property names & infos, and iterate over target properties
2227 const Sequence< Property > aProperties = xTo->getPropertySetInfo()->getProperties();
2228 Reference< XPropertySetInfo > xFromInfo = xFrom->getPropertySetInfo();
2229 for ( const Property& rProperty : aProperties )
2230 {
2231 const OUString& rName = rProperty.Name;
2232
2233 // if both set have the property, copy the value
2234 // (catch and ignore exceptions, if any)
2235 if ( xFromInfo->hasPropertyByName( rName ) )
2236 {
2237 // don't set readonly properties
2238 Property aProperty = xFromInfo->getPropertyByName( rName );
2239 if ( ( aProperty.Attributes & PropertyAttribute::READONLY ) == 0 )
2240 xTo->setPropertyValue(rName, xFrom->getPropertyValue( rName ));
2241 }
2242 // else: no property? then ignore.
2243 }
2244 }
2245 catch ( Exception const & )
2246 {
2247 TOOLS_WARN_EXCEPTION( "svx.form", "copyPropSet()" );
2248 }
2249 }
2250
2252 {
2253 bool bIsHandleBinding = ( DITBinding == m_eItemType );
2254 bool bIsHandleText = ( DITText == m_eItemType );
2255 OUString sNewName( m_xNameED->get_text() );
2256
2257 if ( ( !bIsHandleBinding && !bIsHandleText && !m_xUIHelper->isValidXMLName( sNewName ) ) ||
2258 ( bIsHandleBinding && sNewName.isEmpty() ) )
2259 {
2260 // Error and don't close the dialog
2261 std::unique_ptr<weld::MessageDialog> xErrBox(Application::CreateMessageDialog(m_xDialog.get(),
2262 VclMessageType::Warning, VclButtonsType::Ok,
2263 SvxResId(RID_STR_INVALID_XMLNAME)));
2264 xErrBox->set_primary_text(xErrBox->get_primary_text().replaceFirst(MSG_VARIABLE, sNewName));
2265 xErrBox->run();
2266 return;
2267 }
2268
2269 OUString sDataType( m_xDataTypeLB->get_active_text() );
2270 m_xTempBinding->setPropertyValue( PN_BINDING_TYPE, Any( sDataType ) );
2271
2272 if ( bIsHandleBinding )
2273 {
2274 // copy properties from temp binding to original binding
2275 copyPropSet( m_xTempBinding, m_pItemNode->m_xPropSet );
2276 try
2277 {
2278 OUString sValue = m_xNameED->get_text();
2279 m_pItemNode->m_xPropSet->setPropertyValue( PN_BINDING_ID, Any( sValue ) );
2280 sValue = m_xDefaultED->get_text();
2281 m_pItemNode->m_xPropSet->setPropertyValue( PN_BINDING_EXPR, Any( sValue ) );
2282 }
2283 catch ( Exception const & )
2284 {
2285 TOOLS_WARN_EXCEPTION( "svx.form", "AddDataDialog::OKHdl()" );
2286 }
2287 }
2288 else
2289 {
2290 // copy properties from temp binding to original binding
2291 copyPropSet( m_xTempBinding, m_xBinding );
2292 try
2293 {
2294 if ( bIsHandleText )
2295 m_xUIHelper->setNodeValue( m_pItemNode->m_xNode, m_xDefaultED->get_text() );
2296 else
2297 {
2298 Reference< css::xml::dom::XNode > xNewNode =
2299 m_xUIHelper->renameNode( m_pItemNode->m_xNode, m_xNameED->get_text() );
2300 m_xUIHelper->setNodeValue( xNewNode, m_xDefaultED->get_text() );
2301 m_pItemNode->m_xNode = xNewNode;
2302 }
2303 }
2304 catch ( Exception const & )
2305 {
2306 TOOLS_WARN_EXCEPTION( "svx.form", "AddDataDialog::OKHdl()" );
2307 }
2308 }
2309 // then close the dialog
2310 m_xDialog->response(RET_OK);
2311 }
2312
2314 {
2315 // set handler
2316 Link<weld::Toggleable&,void> aLink = LINK( this, AddDataItemDialog, CheckHdl );
2317 m_xRequiredCB->connect_toggled( aLink );
2318 m_xRelevantCB->connect_toggled( aLink );
2319 m_xConstraintCB->connect_toggled( aLink );
2320 m_xReadonlyCB->connect_toggled( aLink );
2321 m_xCalculateCB->connect_toggled( aLink );
2322
2323 Link<weld::Button&,void> aLink2 = LINK( this, AddDataItemDialog, ConditionHdl );
2324 m_xDefaultBtn->connect_clicked( aLink2 );
2325 m_xRequiredBtn->connect_clicked( aLink2 );
2326 m_xRelevantBtn->connect_clicked( aLink2 );
2327 m_xConstraintBtn->connect_clicked( aLink2 );
2328 m_xReadonlyBtn->connect_clicked( aLink2 );
2329 m_xCalculateBtn->connect_clicked( aLink2 );
2330
2331 m_xOKBtn->connect_clicked( LINK( this, AddDataItemDialog, OKHdl ) );
2332 }
2333
2335 {
2336 if ( m_pItemNode )
2337 {
2338 if ( m_pItemNode->m_xNode.is() )
2339 {
2340 try
2341 {
2342 // detect type of the node
2343 css::xml::dom::NodeType eChildType = m_pItemNode->m_xNode->getNodeType();
2344 switch ( eChildType )
2345 {
2346 case css::xml::dom::NodeType_ATTRIBUTE_NODE:
2348 break;
2349 case css::xml::dom::NodeType_ELEMENT_NODE:
2351 break;
2352 case css::xml::dom::NodeType_TEXT_NODE:
2354 break;
2355 default:
2356 OSL_FAIL( "AddDataItemDialog::InitFronNode: cannot handle this node type!" );
2357 break;
2358 }
2359
2366 Reference< css::xml::dom::XNode > xNode = m_pItemNode->m_xNode;
2367 m_xBinding = m_xUIHelper->getBindingForNode( xNode, true );
2368 if ( m_xBinding.is() )
2369 {
2370 Reference< css::xforms::XModel > xModel( m_xUIHelper, UNO_QUERY );
2371 if ( xModel.is() )
2372 {
2373 m_xTempBinding = m_xUIHelper->cloneBindingAsGhost( m_xBinding );
2374 Reference < XSet > xBindings = xModel->getBindings();
2375 if ( xBindings.is() )
2376 xBindings->insert( Any( m_xTempBinding ) );
2377 }
2378 }
2379
2380 if ( m_eItemType != DITText )
2381 {
2382 OUString sName( m_xUIHelper->getNodeName( m_pItemNode->m_xNode ) );
2383 m_xNameED->set_text( sName );
2384 }
2385 m_xDefaultED->set_text( m_pItemNode->m_xNode->getNodeValue() );
2386 }
2387 catch( Exception const & )
2388 {
2389 TOOLS_WARN_EXCEPTION( "svx.form", "AddDataItemDialog::InitFromNode()" );
2390 }
2391 }
2392 else if ( m_pItemNode->m_xPropSet.is() )
2393 {
2395 Reference< css::xforms::XModel > xModel( m_xUIHelper, UNO_QUERY );
2396 if ( xModel.is() )
2397 {
2398 try
2399 {
2400 m_xTempBinding = m_xUIHelper->cloneBindingAsGhost( m_pItemNode->m_xPropSet );
2401 Reference < XSet > xBindings = xModel->getBindings();
2402 if ( xBindings.is() )
2403 xBindings->insert( Any( m_xTempBinding ) );
2404 }
2405 catch ( Exception const & )
2406 {
2407 TOOLS_WARN_EXCEPTION( "svx.form", "AddDataItemDialog::InitFromNode()" );
2408 }
2409 }
2410 try
2411 {
2412 Reference< XPropertySetInfo > xInfo = m_pItemNode->m_xPropSet->getPropertySetInfo();
2413 OUString sTemp;
2414 if ( xInfo->hasPropertyByName( PN_BINDING_ID ) )
2415 {
2416 m_pItemNode->m_xPropSet->getPropertyValue( PN_BINDING_ID ) >>= sTemp;
2417 m_xNameED->set_text( sTemp );
2418 m_pItemNode->m_xPropSet->getPropertyValue( PN_BINDING_EXPR ) >>= sTemp;
2419 m_xDefaultED->set_text( sTemp );
2420 }
2421 else if ( xInfo->hasPropertyByName( PN_SUBMISSION_BIND ) )
2422 {
2423 m_pItemNode->m_xPropSet->getPropertyValue( PN_SUBMISSION_ID ) >>= sTemp;
2424 m_xNameED->set_text( sTemp );
2425 }
2426 }
2427 catch( Exception const & )
2428 {
2429 TOOLS_WARN_EXCEPTION( "svx.form", "AddDataItemDialog::InitFromNode()" );
2430 }
2431
2432 m_xDefaultBtn->show();
2433 }
2434
2435 if ( m_xTempBinding.is() )
2436 {
2437 try
2438 {
2439 OUString sTemp;
2440 if ( ( m_xTempBinding->getPropertyValue( PN_REQUIRED_EXPR ) >>= sTemp )
2441 && !sTemp.isEmpty() )
2442 m_xRequiredCB->set_active(true);
2443 if ( ( m_xTempBinding->getPropertyValue( PN_RELEVANT_EXPR ) >>= sTemp )
2444 && !sTemp.isEmpty() )
2445 m_xRelevantCB->set_active(true);
2446 if ( ( m_xTempBinding->getPropertyValue( PN_CONSTRAINT_EXPR ) >>= sTemp )
2447 && !sTemp.isEmpty() )
2448 m_xConstraintCB->set_active(true);
2449 if ( ( m_xTempBinding->getPropertyValue( PN_READONLY_EXPR ) >>= sTemp )
2450 && !sTemp.isEmpty() )
2451 m_xReadonlyCB->set_active(true);
2452 if ( ( m_xTempBinding->getPropertyValue( PN_CALCULATE_EXPR ) >>= sTemp )
2453 && !sTemp.isEmpty() )
2454 m_xCalculateCB->set_active(true);
2455 }
2456 catch (const Exception&)
2457 {
2458 TOOLS_WARN_EXCEPTION( "svx.form", "AddDataItemDialog::InitFromNode()" );
2459 }
2460 }
2461 }
2462
2463 if ( DITText == m_eItemType )
2464 {
2465 m_xSettingsFrame->hide();
2466 m_xNameFT->set_sensitive(false);
2467 m_xNameED->set_sensitive(false);
2468 }
2469 }
2470
2472 {
2473 if ( m_eItemType == DITText )
2474 return;
2475
2476 Reference< css::xforms::XModel > xModel( m_xUIHelper, UNO_QUERY );
2477 if ( !xModel.is() )
2478 return;
2479
2480 try
2481 {
2482 Reference< css::xforms::XDataTypeRepository > xDataTypes =
2483 xModel->getDataTypeRepository();
2484 if ( xDataTypes.is() )
2485 {
2486 const Sequence< OUString > aNameList = xDataTypes->getElementNames();
2487 for ( const OUString& rName : aNameList )
2488 m_xDataTypeLB->append_text(rName);
2489 }
2490
2491 if ( m_xTempBinding.is() )
2492 {
2493 OUString sTemp;
2494 if ( m_xTempBinding->getPropertyValue( PN_BINDING_TYPE ) >>= sTemp )
2495 {
2496 int nPos = m_xDataTypeLB->find_text(sTemp);
2497 if (nPos == -1)
2498 {
2499 m_xDataTypeLB->append_text(sTemp);
2500 nPos = m_xDataTypeLB->get_count() - 1;
2501 }
2502 m_xDataTypeLB->set_active(nPos);
2503 }
2504 }
2505 }
2506 catch ( Exception const & )
2507 {
2508 TOOLS_WARN_EXCEPTION( "svx.form", "AddDataItemDialog::InitDataTypeBox()" );
2509 }
2510 }
2511
2513 {
2514 OUString sText;
2515
2516 switch ( _eType )
2517 {
2518 case DITAttribute :
2519 {
2520 sText = m_sFL_Attribute;
2521 break;
2522 }
2523
2524 case DITBinding :
2525 {
2526 sText = m_sFL_Binding;
2527 m_xDefaultFT->set_label(m_sFT_BindingExp);
2528 break;
2529 }
2530
2531 default:
2532 {
2533 sText = m_sFL_Element;
2534 }
2535 }
2536
2537 m_xItemFrame->set_label(sText);
2538 }
2539
2541 OUString _aPropertyName,
2542 const Reference< XPropertySet >& _rPropSet)
2543 : GenericDialogController(pParent, "svx/ui/addconditiondialog.ui", "AddConditionDialog")
2544 , m_aResultIdle("svx AddConditionDialog m_aResultIdle")
2545 , m_sPropertyName(std::move(_aPropertyName))
2546 , m_xBinding(_rPropSet)
2547 , m_xConditionED(m_xBuilder->weld_text_view("condition"))
2548 , m_xResultWin(m_xBuilder->weld_text_view("result"))
2549 , m_xEditNamespacesBtn(m_xBuilder->weld_button("edit"))
2550 , m_xOKBtn(m_xBuilder->weld_button("ok"))
2551 {
2552 DBG_ASSERT( m_xBinding.is(), "AddConditionDialog::Ctor(): no Binding" );
2553
2554 m_xConditionED->set_size_request(m_xConditionED->get_approximate_digit_width() * 52,
2555 m_xConditionED->get_height_rows(4));
2556 m_xResultWin->set_size_request(m_xResultWin->get_approximate_digit_width() * 52,
2557 m_xResultWin->get_height_rows(4));
2558
2559 m_xConditionED->connect_changed( LINK( this, AddConditionDialog, ModifyHdl ) );
2560 m_xEditNamespacesBtn->connect_clicked( LINK( this, AddConditionDialog, EditHdl ) );
2561 m_xOKBtn->connect_clicked( LINK( this, AddConditionDialog, OKHdl ) );
2562 m_aResultIdle.SetPriority( TaskPriority::LOWEST );
2564
2565 if ( !m_sPropertyName.isEmpty() )
2566 {
2567 try
2568 {
2569 OUString sTemp;
2570 if ( ( m_xBinding->getPropertyValue( m_sPropertyName ) >>= sTemp )
2571 && !sTemp.isEmpty() )
2572 {
2573 m_xConditionED->set_text( sTemp );
2574 }
2575 else
2576 {
2578 m_xConditionED->set_text( TRUE_VALUE );
2579 }
2580
2581 Reference< css::xforms::XModel > xModel;
2582 if ( ( m_xBinding->getPropertyValue( PN_BINDING_MODEL ) >>= xModel ) && xModel.is() )
2583 m_xUIHelper.set( xModel, UNO_QUERY );
2584 }
2585 catch (const Exception&)
2586 {
2587 TOOLS_WARN_EXCEPTION( "svx.form", "AddConditionDialog::Ctor()" );
2588 }
2589 }
2590
2591 DBG_ASSERT( m_xUIHelper.is(), "AddConditionDialog::Ctor(): no UIHelper" );
2592 ResultHdl( &m_aResultIdle );
2593 }
2594
2596 {
2597 }
2598
2600 {
2601 Reference< XNameContainer > xNameContnr;
2602 try
2603 {
2604 m_xBinding->getPropertyValue( PN_BINDING_NAMESPACES ) >>= xNameContnr;
2605 }
2606 catch ( Exception const & )
2607 {
2608 TOOLS_WARN_EXCEPTION( "svx.form", "AddDataItemDialog::EditHdl()" );
2609 }
2610 NamespaceItemDialog aDlg(this, xNameContnr);
2611 aDlg.run();
2612 try
2613 {
2614 m_xBinding->setPropertyValue( PN_BINDING_NAMESPACES, Any( xNameContnr ) );
2615 }
2616 catch ( Exception const & )
2617 {
2618 TOOLS_WARN_EXCEPTION( "svx.form", "AddDataItemDialog::EditHdl()" );
2619 }
2620 }
2621
2623 {
2624 m_xDialog->response(RET_OK);
2625 }
2626
2628 {
2629 m_aResultIdle.Start();
2630 }
2631
2633 {
2634 OUString sCondition = comphelper::string::strip(m_xConditionED->get_text(), ' ');
2635 OUString sResult;
2636 if ( !sCondition.isEmpty() )
2637 {
2638 try
2639 {
2640 sResult = m_xUIHelper->getResultForExpression( m_xBinding, ( m_sPropertyName == PN_BINDING_EXPR ), sCondition );
2641 }
2642 catch ( Exception const & )
2643 {
2644 TOOLS_WARN_EXCEPTION( "svx.form", "AddConditionDialog::ResultHdl()" );
2645 }
2646 }
2647 m_xResultWin->set_text(sResult);
2648 }
2649
2650 NamespaceItemDialog::NamespaceItemDialog(AddConditionDialog* pCondDlg, Reference<XNameContainer>& rContainer)
2651 : GenericDialogController(pCondDlg->getDialog(), "svx/ui/namespacedialog.ui", "NamespaceDialog")
2652 , m_pConditionDlg(pCondDlg)
2653 , m_rNamespaces(rContainer)
2654 , m_xNamespacesList(m_xBuilder->weld_tree_view("namespaces"))
2655 , m_xAddNamespaceBtn(m_xBuilder->weld_button("add"))
2656 , m_xEditNamespaceBtn(m_xBuilder->weld_button("edit"))
2657 , m_xDeleteNamespaceBtn(m_xBuilder->weld_button("delete"))
2658 , m_xOKBtn(m_xBuilder->weld_button("ok"))
2659 {
2660 m_xNamespacesList->set_size_request(m_xNamespacesList->get_approximate_digit_width() * 80,
2661 m_xNamespacesList->get_height_rows(8));
2662
2663 std::vector<int> aWidths
2664 {
2665 o3tl::narrowing<int>(m_xNamespacesList->get_approximate_digit_width() * 20)
2666 };
2667 m_xNamespacesList->set_column_fixed_widths(aWidths);
2668
2669 m_xNamespacesList->connect_changed( LINK( this, NamespaceItemDialog, SelectHdl ) );
2670 Link<weld::Button&,void> aLink = LINK( this, NamespaceItemDialog, ClickHdl );
2671 m_xAddNamespaceBtn->connect_clicked( aLink );
2672 m_xEditNamespaceBtn->connect_clicked( aLink );
2673 m_xDeleteNamespaceBtn->connect_clicked( aLink );
2674 m_xOKBtn->connect_clicked( LINK( this, NamespaceItemDialog, OKHdl ) );
2675
2677 SelectHdl(*m_xNamespacesList);
2678 }
2679
2681 {
2682 }
2683
2685 {
2686 bool bEnable = m_xNamespacesList->get_selected_index() != -1;
2687 m_xEditNamespaceBtn->set_sensitive( bEnable );
2688 m_xDeleteNamespaceBtn->set_sensitive( bEnable );
2689 }
2690
2691 IMPL_LINK( NamespaceItemDialog, ClickHdl, weld::Button&, rButton, void )
2692 {
2693 if (m_xAddNamespaceBtn.get() == &rButton)
2694 {
2695 ManageNamespaceDialog aDlg(m_xDialog.get(), m_pConditionDlg, false);
2696 if (aDlg.run() == RET_OK)
2697 {
2698 m_xNamespacesList->append_text(aDlg.GetPrefix());
2699 int nRow = m_xNamespacesList->n_children();
2700 m_xNamespacesList->set_text(nRow - 1, aDlg.GetURL(), 1);
2701 }
2702 }
2703 else if (m_xEditNamespaceBtn.get() == &rButton)
2704 {
2705 ManageNamespaceDialog aDlg(m_xDialog.get(), m_pConditionDlg, true);
2706 int nEntry = m_xNamespacesList->get_selected_index();
2707 DBG_ASSERT( nEntry != -1, "NamespaceItemDialog::ClickHdl(): no entry" );
2708 OUString sPrefix(m_xNamespacesList->get_text(nEntry, 0));
2709 aDlg.SetNamespace(sPrefix, m_xNamespacesList->get_text(nEntry, 1));
2710 if (aDlg.run() == RET_OK)
2711 {
2712 // if a prefix was changed, mark the old prefix as 'removed'
2713 if( sPrefix != aDlg.GetPrefix() )
2714 m_aRemovedList.push_back( sPrefix );
2715
2716 m_xNamespacesList->set_text(nEntry, aDlg.GetPrefix(), 0);
2717 m_xNamespacesList->set_text(nEntry, aDlg.GetURL(), 1);
2718 }
2719 }
2720 else if (m_xDeleteNamespaceBtn.get() == &rButton)
2721 {
2722 int nEntry = m_xNamespacesList->get_selected_index();
2723 DBG_ASSERT( nEntry != -1, "NamespaceItemDialog::ClickHdl(): no entry" );
2724 OUString sPrefix(m_xNamespacesList->get_text(nEntry, 0));
2725 m_aRemovedList.push_back( sPrefix );
2726 m_xNamespacesList->remove(nEntry);
2727 }
2728 else
2729 {
2730 SAL_WARN( "svx.form", "NamespaceItemDialog::ClickHdl(): invalid button" );
2731 }
2732
2733 SelectHdl(*m_xNamespacesList);
2734 }
2735
2737 {
2738 try
2739 {
2740 // update namespace container
2741 sal_Int32 i, nRemovedCount = m_aRemovedList.size();
2742 for( i = 0; i < nRemovedCount; ++i )
2743 m_rNamespaces->removeByName( m_aRemovedList[i] );
2744
2745 sal_Int32 nEntryCount = m_xNamespacesList->n_children();
2746 for( i = 0; i < nEntryCount; ++i )
2747 {
2748 OUString sPrefix(m_xNamespacesList->get_text(i, 0));
2749 OUString sURL(m_xNamespacesList->get_text(i, 1));
2750
2751 if ( m_rNamespaces->hasByName( sPrefix ) )
2752 m_rNamespaces->replaceByName( sPrefix, Any( sURL ) );
2753 else
2754 m_rNamespaces->insertByName( sPrefix, Any( sURL ) );
2755 }
2756 }
2757 catch ( Exception const & )
2758 {
2759 TOOLS_WARN_EXCEPTION( "svx.form", "NamespaceItemDialog::OKHdl()" );
2760 }
2761 // and close the dialog
2762 m_xDialog->response(RET_OK);
2763 }
2764
2766 {
2767 try
2768 {
2769 int nRow = 0;
2770 const Sequence< OUString > aAllNames = m_rNamespaces->getElementNames();
2771 for ( const OUString& sPrefix : aAllNames )
2772 {
2773 if ( m_rNamespaces->hasByName( sPrefix ) )
2774 {
2775 OUString sURL;
2776 Any aAny = m_rNamespaces->getByName( sPrefix );
2777 if (aAny >>= sURL)
2778 {
2779 m_xNamespacesList->append_text(sPrefix);
2780 m_xNamespacesList->set_text(nRow, sURL, 1);
2781 ++nRow;
2782 }
2783 }
2784 }
2785 }
2786 catch ( Exception const & )
2787 {
2788 TOOLS_WARN_EXCEPTION( "svx.form", "NamespaceItemDialog::LoadNamespaces()" );
2789 }
2790 }
2791
2793 : GenericDialogController(pParent, "svx/ui/addnamespacedialog.ui", "AddNamespaceDialog")
2794 , m_pConditionDlg(pCondDlg)
2795 , m_xPrefixED(m_xBuilder->weld_entry("prefix"))
2796 , m_xUrlED(m_xBuilder->weld_entry("url"))
2797 , m_xOKBtn(m_xBuilder->weld_button("ok"))
2798 , m_xAltTitle(m_xBuilder->weld_label("alttitle"))
2799 {
2800 if (bIsEdit)
2801 m_xDialog->set_title(m_xAltTitle->get_label());
2802
2803 m_xOKBtn->connect_clicked(LINK(this, ManageNamespaceDialog, OKHdl));
2804 }
2805
2807 {
2808 }
2809
2811 {
2812 OUString sPrefix = m_xPrefixED->get_text();
2813
2814 try
2815 {
2816 if (!m_pConditionDlg->GetUIHelper()->isValidPrefixName(sPrefix))
2817 {
2818 std::unique_ptr<weld::MessageDialog> xErrBox(Application::CreateMessageDialog(m_xDialog.get(),
2819 VclMessageType::Warning, VclButtonsType::Ok,
2820 SvxResId(RID_STR_INVALID_XMLPREFIX)));
2821 xErrBox->set_primary_text(xErrBox->get_primary_text().replaceFirst(MSG_VARIABLE, sPrefix));
2822 xErrBox->run();
2823 return;
2824 }
2825 }
2826 catch ( Exception const & )
2827 {
2828 TOOLS_WARN_EXCEPTION( "svx.form", "ManageNamespacesDialog::OKHdl()" );
2829 }
2830
2831 // no error so close the dialog
2832 m_xDialog->response(RET_OK);
2833 }
2834
2836 weld::Window* pParent, ItemNode* _pNode,
2837 const Reference< css::xforms::XFormsUIHelper1 >& _rUIHelper)
2838 : GenericDialogController(pParent, "svx/ui/addsubmissiondialog.ui", "AddSubmissionDialog")
2839 , m_pItemNode(_pNode)
2840 , m_xUIHelper(_rUIHelper)
2841 , m_xNameED(m_xBuilder->weld_entry("name"))
2842 , m_xActionED(m_xBuilder->weld_entry("action"))
2843 , m_xMethodLB(m_xBuilder->weld_combo_box("method"))
2844 , m_xRefED(m_xBuilder->weld_entry("expression"))
2845 , m_xRefBtn(m_xBuilder->weld_button("browse"))
2846 , m_xBindLB(m_xBuilder->weld_combo_box("binding"))
2847 , m_xReplaceLB(m_xBuilder->weld_combo_box("replace"))
2848 , m_xOKBtn(m_xBuilder->weld_button("ok"))
2849 {
2850 FillAllBoxes();
2851
2852 m_xRefBtn->connect_clicked( LINK( this, AddSubmissionDialog, RefHdl ) );
2853 m_xOKBtn->connect_clicked( LINK( this, AddSubmissionDialog, OKHdl ) );
2854 }
2855
2857 {
2858 // #i38991# if we have added a binding, we need to remove it as well.
2859 if( m_xCreatedBinding.is() && m_xUIHelper.is() )
2860 m_xUIHelper->removeBindingIfUseless( m_xCreatedBinding );
2861 }
2862
2864 {
2865 AddConditionDialog aDlg(m_xDialog.get(), PN_BINDING_EXPR, m_xTempBinding );
2866 aDlg.SetCondition( m_xRefED->get_text() );
2867 if ( aDlg.run() == RET_OK )
2868 m_xRefED->set_text(aDlg.GetCondition());
2869 }
2870
2872 {
2873 OUString sName(m_xNameED->get_text());
2874 if(sName.isEmpty())
2875 {
2876 std::unique_ptr<weld::MessageDialog> xErrorBox(Application::CreateMessageDialog(m_xDialog.get(),
2877 VclMessageType::Warning, VclButtonsType::Ok,
2878 SvxResId(RID_STR_EMPTY_SUBMISSIONNAME)));
2879 xErrorBox->run();
2880 return;
2881 }
2882
2883 if ( !m_xSubmission.is() )
2884 {
2885 DBG_ASSERT( !m_xNewSubmission.is(),
2886 "AddSubmissionDialog::OKHdl(): new submission already exists" );
2887
2888 // add a new submission
2889 Reference< css::xforms::XModel > xModel( m_xUIHelper, UNO_QUERY );
2890 if ( xModel.is() )
2891 {
2892 try
2893 {
2894 m_xNewSubmission = xModel->createSubmission();
2895 m_xSubmission = m_xNewSubmission;
2896 }
2897 catch ( Exception const & )
2898 {
2899 TOOLS_WARN_EXCEPTION( "svx.form", "AddSubmissionDialog::OKHdl()" );
2900 }
2901 }
2902 }
2903
2904 if ( m_xSubmission.is() )
2905 {
2906 OUString sTemp = m_xNameED->get_text();
2907 try
2908 {
2909 m_xSubmission->setPropertyValue( PN_SUBMISSION_ID, Any( sTemp ) );
2910 sTemp = m_xActionED->get_text();
2911 m_xSubmission->setPropertyValue( PN_SUBMISSION_ACTION, Any( sTemp ) );
2912 sTemp = m_aMethodString.toAPI( m_xMethodLB->get_active_text() );
2913 m_xSubmission->setPropertyValue( PN_SUBMISSION_METHOD, Any( sTemp ) );
2914 sTemp = m_xRefED->get_text();
2915 m_xSubmission->setPropertyValue( PN_SUBMISSION_REF, Any( sTemp ) );
2916 OUString sEntry = m_xBindLB->get_active_text();
2917 sal_Int32 nColonIdx = sEntry.indexOf(':');
2918 if (nColonIdx != -1)
2919 sEntry = sEntry.copy(0, nColonIdx);
2920 sTemp = sEntry;
2921 m_xSubmission->setPropertyValue( PN_SUBMISSION_BIND, Any( sTemp ) );
2922 sTemp = m_aReplaceString.toAPI( m_xReplaceLB->get_active_text() );
2923 m_xSubmission->setPropertyValue( PN_SUBMISSION_REPLACE, Any( sTemp ) );
2924 }
2925 catch ( Exception const & )
2926 {
2927 TOOLS_WARN_EXCEPTION( "svx.form", "AddSubmissionDialog::OKHdl()" );
2928 }
2929 }
2930
2931 m_xDialog->response(RET_OK);
2932 }
2933
2935 {
2936 // method box
2937 m_xMethodLB->append_text(SvxResId(RID_STR_METHOD_POST));
2938 m_xMethodLB->append_text(SvxResId(RID_STR_METHOD_PUT));
2939 m_xMethodLB->append_text(SvxResId(RID_STR_METHOD_GET));
2940 m_xMethodLB->set_active(0);
2941
2942 // binding box
2943 Reference< css::xforms::XModel > xModel( m_xUIHelper, UNO_QUERY );
2944 if ( xModel.is() )
2945 {
2946 try
2947 {
2948 Reference< XEnumerationAccess > xNumAccess = xModel->getBindings();
2949 if ( xNumAccess.is() )
2950 {
2951 Reference < XEnumeration > xNum = xNumAccess->createEnumeration();
2952 if ( xNum.is() && xNum->hasMoreElements() )
2953 {
2954 while ( xNum->hasMoreElements() )
2955 {
2956 Reference< XPropertySet > xPropSet;
2957 Any aAny = xNum->nextElement();
2958 if ( aAny >>= xPropSet )
2959 {
2960 OUString sEntry;
2961 OUString sTemp;
2962 xPropSet->getPropertyValue( PN_BINDING_ID ) >>= sTemp;
2963 sEntry += sTemp + ": ";
2964 xPropSet->getPropertyValue( PN_BINDING_EXPR ) >>= sTemp;
2965 sEntry += sTemp;
2966 m_xBindLB->append_text(sEntry);
2967
2968 if ( !m_xTempBinding.is() )
2969 m_xTempBinding = xPropSet;
2970 }
2971 }
2972 }
2973 }
2974 }
2975 catch ( Exception const & )
2976 {
2977 TOOLS_WARN_EXCEPTION( "svx.form", "AddSubmissionDialog::FillAllBoxes()" );
2978 }
2979 }
2980
2981 // #i36342# we need a temporary binding; create one if no existing binding
2982 // is found
2983 if( !m_xTempBinding.is() )
2984 {
2985 m_xCreatedBinding = m_xUIHelper->getBindingForNode(
2986 Reference<css::xml::dom::XNode>(
2987 xModel->getDefaultInstance()->getDocumentElement(),
2988 UNO_QUERY_THROW ),
2989 true );
2991 }
2992
2993 // replace box
2994 m_xReplaceLB->append_text(SvxResId(RID_STR_REPLACE_NONE));
2995 m_xReplaceLB->append_text(SvxResId(RID_STR_REPLACE_INST));
2996 m_xReplaceLB->append_text(SvxResId(RID_STR_REPLACE_DOC));
2997
2998
2999 // init the controls with the values of the submission
3000 if ( m_pItemNode && m_pItemNode->m_xPropSet.is() )
3001 {
3003 try
3004 {
3005 OUString sTemp;
3006 m_xSubmission->getPropertyValue( PN_SUBMISSION_ID ) >>= sTemp;
3007 m_xNameED->set_text( sTemp );
3008 m_xSubmission->getPropertyValue( PN_SUBMISSION_ACTION ) >>= sTemp;
3009 m_xActionED->set_text( sTemp );
3010 m_xSubmission->getPropertyValue( PN_SUBMISSION_REF ) >>= sTemp;
3011 m_xRefED->set_text(sTemp);
3012
3013 m_xSubmission->getPropertyValue( PN_SUBMISSION_METHOD ) >>= sTemp;
3014 sTemp = m_aMethodString.toUI( sTemp );
3015 sal_Int32 nPos = m_xMethodLB->find_text( sTemp );
3016 if (nPos == -1)
3017 {
3018 m_xMethodLB->append_text( sTemp );
3019 nPos = m_xMethodLB->get_count() - 1;
3020 }
3021 m_xMethodLB->set_active( nPos );
3022
3023 m_xSubmission->getPropertyValue( PN_SUBMISSION_BIND ) >>= sTemp;
3024 nPos = m_xBindLB->find_text(sTemp);
3025 if (nPos == -1)
3026 {
3027 m_xBindLB->append_text(sTemp);
3028 nPos = m_xBindLB->get_count() - 1;
3029 }
3030 m_xBindLB->set_active(nPos);
3031
3032 m_xSubmission->getPropertyValue( PN_SUBMISSION_REPLACE ) >>= sTemp;
3033 sTemp = m_aReplaceString.toUI( sTemp );
3034 if ( sTemp.isEmpty() )
3035 sTemp = m_xReplaceLB->get_text(0); // first entry == "none"
3036 nPos = m_xReplaceLB->find_text(sTemp);
3037 if (nPos == -1)
3038 {
3039 m_xReplaceLB->append_text(sTemp);
3040 nPos = m_xReplaceLB->get_count() - 1;
3041 }
3042 m_xReplaceLB->set_active(nPos);
3043 }
3044 catch ( Exception const & )
3045 {
3046 TOOLS_WARN_EXCEPTION( "svx.form", "AddSubmissionDialog::FillAllBoxes()" );
3047 }
3048 }
3049
3050 m_xRefBtn->set_sensitive(m_xTempBinding.is());
3051 }
3052
3054 : GenericDialogController(pParent, "svx/ui/addmodeldialog.ui", "AddModelDialog")
3055 , m_xNameED(m_xBuilder->weld_entry("name"))
3056 , m_xModifyCB(m_xBuilder->weld_check_button("modify"))
3057 , m_xAltTitle(m_xBuilder->weld_label("alttitle"))
3058 {
3059 if (bIsEdit)
3060 m_xDialog->set_title(m_xAltTitle->get_label());
3061 }
3062
3064 {
3065 }
3066
3068 : GenericDialogController(pParent, "svx/ui/addinstancedialog.ui", "AddInstanceDialog")
3069 , m_xNameED(m_xBuilder->weld_entry("name"))
3070 , m_xURLED(new SvtURLBox(m_xBuilder->weld_combo_box("url")))
3071 , m_xFilePickerBtn(m_xBuilder->weld_button("browse"))
3072 , m_xLinkInstanceCB(m_xBuilder->weld_check_button("link"))
3073 , m_xAltTitle(m_xBuilder->weld_label("alttitle"))
3074 {
3075 if (_bEdit)
3076 m_xDialog->set_title(m_xAltTitle->get_label());
3077
3078 m_xURLED->DisableHistory();
3079 m_xFilePickerBtn->connect_clicked(LINK(this, AddInstanceDialog, FilePickerHdl));
3080
3081 // load the filter name from fps resource
3082 m_sAllFilterName = Translate::get(STR_FILTERNAME_ALL, Translate::Create("fps"));
3083 }
3084
3086 {
3087 }
3088
3090 {
3092 css::ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE,
3093 FileDialogFlags::NONE, m_xDialog.get());
3095
3096 aDlg.AddFilter( m_sAllFilterName, FILEDIALOG_FILTER_ALL );
3097 OUString sFilterName( "XML" );
3098 aDlg.AddFilter( sFilterName, "*.xml" );
3099 aDlg.SetCurrentFilter( sFilterName );
3100
3101 if (aDlg.Execute() == ERRCODE_NONE)
3102 m_xURLED->set_entry_text(aDlg.GetPath());
3103 }
3104
3106 : MessageDialogController(pParent, "svx/ui/formlinkwarndialog.ui",
3107 "FormLinkWarnDialog")
3108 {
3109 }
3110
3111}
3112
3113/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
PropertiesInfo aProperties
constexpr OUStringLiteral sModel
Reference< XExecutableDialog > m_xDialog
sal_uInt16 nPageId
SfxChildAlignment
static std::unique_ptr< weld::Builder > CreateBuilder(weld::Widget *pParent, const OUString &rUIFile, bool bMobile=false, sal_uInt64 nLOKWindowId=0)
static weld::MessageDialog * CreateMessageDialog(weld::Widget *pParent, VclMessageType eMessageType, VclButtonsType eButtonType, const OUString &rPrimaryMessage, const ILibreOfficeKitNotifier *pNotifier=nullptr)
std::unique_ptr< weld::Container > m_xContainer
SfxDispatcher * GetDispatcher() const
virtual void dispose()
SfxViewFrame * GetFrame() const
void Initialize(SfxChildWinInfo *pInfo)
void SetAlignment(SfxChildAlignment eAlign)
void SetFloatingSize(const Size &rSize)
virtual Size CalcDockingSize(SfxChildAlignment)
virtual void dispose() override
const css::uno::Reference< css::frame::XFrame > & GetFrameInterface() const
bool IsEnableSetModified() const
bool IsModified() const
static SAL_WARN_UNUSED_RESULT SfxObjectShell * Current()
virtual void SetModified(bool bModified=true)
SfxFrame & GetFrame() const
css::uno::Any GetUserItem(const OUString &sName) const
void SetUserItem(const OUString &sName, const css::uno::Any &aValue)
void SetPageID(std::string_view rID)
OString GetPageID() const
bool Exists() const
void SetPriority(TaskPriority ePriority)
void SetTimeout(sal_uInt64 nTimeoutMs)
void SetInvokeHandler(const Link< Timer *, void > &rLink)
virtual void Start(bool bStartTimer=true) override
const_iterator find(const Value &x) const
const_iterator end() const
OUString GetPath() const
void AddFilter(const OUString &rFilterName, const OUString &rExtension)
void SetCurrentFilter(const OUString &rFilter)
void SetContext(Context _eNewContext)
std::unique_ptr< weld::TextView > m_xConditionED
Definition: datanavi.hxx:416
AddConditionDialog(weld::Window *pParent, OUString _aPropertyName, const css::uno::Reference< css::beans::XPropertySet > &_rBinding)
Definition: datanavi.cxx:2540
OUString GetCondition() const
Definition: datanavi.hxx:432
css::uno::Reference< css::xforms::XFormsUIHelper1 > m_xUIHelper
Definition: datanavi.hxx:412
std::unique_ptr< weld::Button > m_xOKBtn
Definition: datanavi.hxx:419
std::unique_ptr< weld::TextView > m_xResultWin
Definition: datanavi.hxx:417
std::unique_ptr< weld::Button > m_xEditNamespacesBtn
Definition: datanavi.hxx:418
css::uno::Reference< css::beans::XPropertySet > m_xBinding
Definition: datanavi.hxx:414
virtual ~AddConditionDialog() override
Definition: datanavi.cxx:2595
void SetCondition(const OUString &_rCondition)
Definition: datanavi.hxx:433
std::unique_ptr< weld::Button > m_xRelevantBtn
Definition: datanavi.hxx:378
css::uno::Reference< css::beans::XPropertySet > m_xBinding
Definition: datanavi.hxx:356
std::unique_ptr< weld::Widget > m_xSettingsFrame
Definition: datanavi.hxx:373
css::uno::Reference< css::xforms::XFormsUIHelper1 > m_xUIHelper
Definition: datanavi.hxx:354
std::unique_ptr< weld::ComboBox > m_xDataTypeLB
Definition: datanavi.hxx:374
std::unique_ptr< weld::Button > m_xCalculateBtn
Definition: datanavi.hxx:384
std::unique_ptr< weld::CheckButton > m_xReadonlyCB
Definition: datanavi.hxx:381
css::uno::Reference< css::beans::XPropertySet > m_xTempBinding
Definition: datanavi.hxx:358
std::unique_ptr< weld::Button > m_xOKBtn
Definition: datanavi.hxx:385
std::unique_ptr< weld::Button > m_xConstraintBtn
Definition: datanavi.hxx:380
std::unique_ptr< weld::Button > m_xRequiredBtn
Definition: datanavi.hxx:376
std::unique_ptr< weld::Entry > m_xDefaultED
Definition: datanavi.hxx:371
std::unique_ptr< weld::CheckButton > m_xCalculateCB
Definition: datanavi.hxx:383
void InitText(DataItemType _eType)
Definition: datanavi.cxx:2512
void Check(const weld::Toggleable *pBox)
Definition: datanavi.cxx:2143
std::unique_ptr< weld::Label > m_xNameFT
Definition: datanavi.hxx:368
AddDataItemDialog(weld::Window *pParent, ItemNode *_pNode, const css::uno::Reference< css::xforms::XFormsUIHelper1 > &_rUIHelper)
Definition: datanavi.cxx:2076
std::unique_ptr< weld::CheckButton > m_xRequiredCB
Definition: datanavi.hxx:375
std::unique_ptr< weld::Button > m_xDefaultBtn
Definition: datanavi.hxx:372
std::unique_ptr< weld::Frame > m_xItemFrame
Definition: datanavi.hxx:367
std::unique_ptr< weld::Label > m_xDefaultFT
Definition: datanavi.hxx:370
std::unique_ptr< weld::Button > m_xReadonlyBtn
Definition: datanavi.hxx:382
std::unique_ptr< weld::CheckButton > m_xConstraintCB
Definition: datanavi.hxx:379
std::unique_ptr< weld::Entry > m_xNameED
Definition: datanavi.hxx:369
virtual ~AddDataItemDialog() override
Definition: datanavi.cxx:2112
std::unique_ptr< weld::CheckButton > m_xRelevantCB
Definition: datanavi.hxx:377
void SetName(const OUString &rName)
Definition: datanavi.hxx:568
std::unique_ptr< SvtURLBox > m_xURLED
Definition: datanavi.hxx:556
void SetLinkInstance(bool bLink)
Definition: datanavi.hxx:572
void SetURL(const OUString &rURL)
Definition: datanavi.hxx:570
std::unique_ptr< weld::Button > m_xFilePickerBtn
Definition: datanavi.hxx:557
virtual ~AddInstanceDialog() override
Definition: datanavi.cxx:3085
OUString GetURL() const
Definition: datanavi.hxx:569
std::unique_ptr< weld::Label > m_xAltTitle
Definition: datanavi.hxx:559
bool IsLinkInstance() const
Definition: datanavi.hxx:571
AddInstanceDialog(weld::Window *pParent, bool _bEdit)
Definition: datanavi.cxx:3067
OUString GetName() const
Definition: datanavi.hxx:567
void SetModifyDoc(const bool bModify)
Definition: datanavi.hxx:547
AddModelDialog(weld::Window *pParent, bool _bEdit)
Definition: datanavi.cxx:3053
virtual ~AddModelDialog() override
Definition: datanavi.cxx:3063
bool GetModifyDoc() const
Definition: datanavi.hxx:546
std::unique_ptr< weld::Label > m_xAltTitle
Definition: datanavi.hxx:537
OUString GetName() const
Definition: datanavi.hxx:543
void SetName(const OUString &_rName)
Definition: datanavi.hxx:544
std::unique_ptr< weld::Button > m_xRefBtn
Definition: datanavi.hxx:514
std::unique_ptr< weld::ComboBox > m_xMethodLB
Definition: datanavi.hxx:512
const css::uno::Reference< css::xforms::XSubmission > & GetNewSubmission() const
Definition: datanavi.hxx:529
ReplaceString m_aReplaceString
Definition: datanavi.hxx:495
css::uno::Reference< css::xforms::XFormsUIHelper1 > m_xUIHelper
Definition: datanavi.hxx:500
std::unique_ptr< weld::Entry > m_xActionED
Definition: datanavi.hxx:511
std::unique_ptr< weld::ComboBox > m_xBindLB
Definition: datanavi.hxx:515
css::uno::Reference< css::beans::XPropertySet > m_xCreatedBinding
Definition: datanavi.hxx:508
std::unique_ptr< weld::ComboBox > m_xReplaceLB
Definition: datanavi.hxx:516
css::uno::Reference< css::beans::XPropertySet > m_xTempBinding
Definition: datanavi.hxx:506
AddSubmissionDialog(weld::Window *pParent, ItemNode *pNode, const css::uno::Reference< css::xforms::XFormsUIHelper1 > &rUIHelper)
Definition: datanavi.cxx:2835
std::unique_ptr< weld::Entry > m_xNameED
Definition: datanavi.hxx:510
std::unique_ptr< weld::Entry > m_xRefED
Definition: datanavi.hxx:513
virtual ~AddSubmissionDialog() override
Definition: datanavi.cxx:2856
css::uno::Reference< css::beans::XPropertySet > m_xSubmission
Definition: datanavi.hxx:504
std::unique_ptr< weld::Button > m_xOKBtn
Definition: datanavi.hxx:517
weld::Window * GetFrameWeld() const
Definition: datanavi.hxx:317
DataNavigatorWindow(vcl::Window *pParent, weld::Builder &rBuilder, SfxBindings const *pBindings)
Definition: datanavi.cxx:1277
XFormsPage * GetPage(const OString &rCurId)
Definition: datanavi.cxx:1705
void NotifyChanges(bool _bLoadAll=false)
Definition: datanavi.cxx:1957
void CreateInstancePage(const css::uno::Sequence< css::beans::PropertyValue > &_xPropSeq)
Definition: datanavi.cxx:1908
std::unique_ptr< weld::MenuButton > m_xModelBtn
Definition: datanavi.hxx:261
void DisableNotify(bool _bDisable)
Definition: datanavi.hxx:320
css::uno::Reference< css::frame::XFrame > m_xFrame
Definition: datanavi.hxx:285
std::unique_ptr< XFormsPage > m_xSubmissionPage
Definition: datanavi.hxx:266
std::unique_ptr< weld::ComboBox > m_xModelsBox
Definition: datanavi.hxx:260
void ClearAllPageModels(bool bClearPages)
Definition: datanavi.cxx:1884
std::unique_ptr< weld::Notebook > m_xTabCtrl
Definition: datanavi.hxx:262
std::vector< std::unique_ptr< XFormsPage > > m_aPageList
Definition: datanavi.hxx:273
css::uno::Reference< css::frame::XModel > m_xFrameModel
Definition: datanavi.hxx:287
void ModelSelectHdl(const weld::ComboBox *)
Definition: datanavi.cxx:1361
void SetPageModel(const OString &rCurId)
Definition: datanavi.cxx:1801
std::unique_ptr< XFormsPage > m_xBindingPage
Definition: datanavi.hxx:267
std::vector< css::uno::Reference< css::xml::dom::events::XEventTarget > > m_aEventTargetList
Definition: datanavi.hxx:277
::rtl::Reference< DataListener > m_xDataListener
Definition: datanavi.hxx:281
void AddContainerBroadcaster(const css::uno::Reference< css::container::XContainer > &xContainer)
Definition: datanavi.cxx:1977
OString GetCurrentPage() const
Definition: datanavi.cxx:1742
css::uno::Reference< css::container::XNameContainer > m_xDataContainer
Definition: datanavi.hxx:283
void AddEventBroadcaster(const css::uno::Reference< css::xml::dom::events::XEventTarget > &xTarget)
Definition: datanavi.cxx:1985
OString GetNewPageId() const
Definition: datanavi.cxx:1930
std::unique_ptr< XFormsPage > m_xInstPage
Definition: datanavi.hxx:265
std::vector< css::uno::Reference< css::container::XContainer > > m_aContainerList
Definition: datanavi.hxx:275
bool HasFirstInstancePage() const
Definition: datanavi.cxx:1925
static bool IsAdditionalPage(std::string_view rIdent)
Definition: datanavi.cxx:1664
std::unique_ptr< weld::MenuButton > m_xInstanceBtn
Definition: datanavi.hxx:263
virtual Size CalcDockingSize(SfxChildAlignment) override
Definition: datanavi.cxx:2040
void StateChangedAtToolBoxControl(sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem *pState) override
Definition: datanavi.cxx:2036
virtual void dispose() override
Definition: datanavi.cxx:2029
virtual ~DataNavigator() override
Definition: datanavi.cxx:2024
std::unique_ptr< DataNavigatorWindow > m_xDataWin
Definition: datanavi.hxx:326
DataNavigator(SfxBindings *pBindings, SfxChildWindow *pMgr, vcl::Window *pParent)
Definition: datanavi.cxx:2012
virtual SfxChildAlignment CheckAlignment(SfxChildAlignment, SfxChildAlignment) override
Definition: datanavi.cxx:2048
DataTreeDropTarget(weld::TreeView &rWidget)
Definition: datanavi.cxx:121
virtual sal_Int8 ExecuteDrop(const ExecuteDropEvent &rEvt) override
Definition: datanavi.cxx:131
virtual sal_Int8 AcceptDrop(const AcceptDropEvent &rEvt) override
Definition: datanavi.cxx:126
LinkedInstanceWarningBox(weld::Widget *pParent)
Definition: datanavi.cxx:3105
OUString GetPrefix() const
Definition: datanavi.hxx:487
ManageNamespaceDialog(weld::Window *pParent, AddConditionDialog *_pCondDlg, bool bIsEdit)
Definition: datanavi.cxx:2792
virtual ~ManageNamespaceDialog() override
Definition: datanavi.cxx:2806
void SetNamespace(const OUString &_rPrefix, const OUString &_rURL)
Definition: datanavi.hxx:482
std::unique_ptr< weld::Button > m_xOKBtn
Definition: datanavi.hxx:473
std::unique_ptr< weld::Label > m_xAltTitle
Definition: datanavi.hxx:474
OUString const & toUI(std::u16string_view rStr) const
convert from API to UI; put is default.
Definition: datanavi.hxx:148
std::unique_ptr< weld::TreeView > m_xNamespacesList
Definition: datanavi.hxx:449
virtual ~NamespaceItemDialog() override
Definition: datanavi.cxx:2680
std::unique_ptr< weld::Button > m_xOKBtn
Definition: datanavi.hxx:453
std::unique_ptr< weld::Button > m_xAddNamespaceBtn
Definition: datanavi.hxx:450
std::unique_ptr< weld::Button > m_xEditNamespaceBtn
Definition: datanavi.hxx:451
css::uno::Reference< css::container::XNameContainer > & m_rNamespaces
Definition: datanavi.hxx:447
std::unique_ptr< weld::Button > m_xDeleteNamespaceBtn
Definition: datanavi.hxx:452
NamespaceItemDialog(AddConditionDialog *pParent, css::uno::Reference< css::container::XNameContainer > &_rContainer)
Definition: datanavi.cxx:2650
OUString const & toUI(std::u16string_view rStr) const
convert submission replace string from API value to UI value.
Definition: datanavi.hxx:103
OUString LoadInstance(const css::uno::Sequence< css::beans::PropertyValue > &_xPropSeq)
Definition: datanavi.cxx:1130
o3tl::sorted_vector< OString > m_aRemovedMenuEntries
Definition: datanavi.hxx:192
std::unique_ptr< weld::Toolbar > m_xToolBox
Definition: datanavi.hxx:187
std::unique_ptr< weld::Menu > m_xMenu
Definition: datanavi.hxx:188
void AddEntry(std::unique_ptr< ItemNode > _pNewNode, bool _bIsElement, weld::TreeIter *pRet=nullptr)
Definition: datanavi.cxx:696
void SetInstanceName(const OUString &name)
Definition: datanavi.hxx:245
OUString SetModel(const css::uno::Reference< css::xforms::XModel > &_xModel, int _nPagePos)
Definition: datanavi.cxx:980
css::uno::Reference< css::xforms::XFormsUIHelper1 > m_xUIHelper
Definition: datanavi.hxx:197
void AddChildren(const weld::TreeIter *_pParent, const css::uno::Reference< css::xml::dom::XNode > &_xNode)
Definition: datanavi.cxx:319
void SetMenuEntrySensitive(const OString &rIdent, bool bSensitive)
Definition: datanavi.cxx:1177
DataNavigatorWindow * m_pNaviWin
Definition: datanavi.hxx:199
std::unique_ptr< weld::TreeView > m_xItemList
Definition: datanavi.hxx:189
void SetLinkOnce(bool bLinkOnce)
Definition: datanavi.hxx:247
const OUString & GetInstanceName() const
Definition: datanavi.hxx:242
void EditEntry(const css::uno::Reference< css::beans::XPropertySet > &_rPropSet)
Definition: datanavi.cxx:796
OUString GetServiceNameForNode(const css::uno::Reference< css::xml::dom::XNode > &xNode)
Definition: datanavi.hxx:251
ReplaceString m_aReplaceString
Definition: datanavi.hxx:184
XFormsPage(weld::Container *pParent, DataNavigatorWindow *_pNaviWin, DataGroupType _eGroup)
Definition: datanavi.cxx:201
css::uno::Reference< css::beans::XPropertySet > GetBindingForNode(const css::uno::Reference< css::xml::dom::XNode > &xNode)
Definition: datanavi.hxx:250
bool DoToolBoxAction(std::string_view rToolBoxID)
Definition: datanavi.cxx:390
bool HasModel() const
Definition: datanavi.hxx:233
bool GetLinkOnce() const
Definition: datanavi.hxx:244
DataGroupType m_eGroup
Definition: datanavi.hxx:201
weld::Container * m_pParent
Definition: datanavi.hxx:186
OUString m_sInstanceURL
Definition: datanavi.hxx:207
virtual ~XFormsPage() override
Definition: datanavi.cxx:244
bool DoMenuAction(std::string_view rMenuID)
Definition: datanavi.cxx:1172
void SetInstanceURL(const OUString &url)
Definition: datanavi.hxx:246
const css::uno::Reference< css::xforms::XFormsUIHelper1 > & GetXFormsHelper() const
Definition: datanavi.hxx:253
MethodString m_aMethodString
Definition: datanavi.hxx:183
const OUString & GetInstanceURL() const
Definition: datanavi.hxx:243
OUString m_sInstanceName
Definition: datanavi.hxx:206
void DeleteAndClearTree()
Definition: datanavi.cxx:183
std::unique_ptr< weld::TreeIter > m_xScratchIter
Definition: datanavi.hxx:190
virtual void move(weld::Widget *pWidget, weld::Container *pNewParent)=0
virtual short run()
void set_title(const OUString &rTitle)
std::shared_ptr< weld::Dialog > m_xDialog
virtual bool get_active() const=0
int nCount
constexpr OUStringLiteral MODELNAME
Definition: datanavi.cxx:65
constexpr OUStringLiteral INSTANCENAME
Definition: datanavi.cxx:66
constexpr OUStringLiteral SUBMISSIONNAME
Definition: datanavi.cxx:69
#define MIN_PAGE_COUNT
Definition: datanavi.cxx:108
constexpr OUStringLiteral ATTRIBUTENAME
Definition: datanavi.cxx:68
constexpr OUStringLiteral CFGNAME_SHOWDETAILS
Definition: datanavi.cxx:63
constexpr OUStringLiteral BINDINGNAME
Definition: datanavi.cxx:70
constexpr OUStringLiteral ELEMENTNAME
Definition: datanavi.cxx:67
constexpr OUStringLiteral MSG_VARIABLE
Definition: datanavi.cxx:64
constexpr OUStringLiteral CFGNAME_DATANAVIGATOR
Definition: datanavi.cxx:62
#define DBG_ASSERT(sCon, aError)
#define TOOLS_WARN_EXCEPTION(area, stream)
#define DBG_UNHANDLED_EXCEPTION(...)
OUString SvxResId(TranslateId aId)
Definition: dialmgr.cxx:24
weld::Window * GetFrameWeld(const SfxFrame *pFrame)
virtual void SetText(const OUString &rStr) override
float u
#define ERRCODE_NONE
Reference< XInterface > xTarget
DocumentType eType
constexpr OUStringLiteral FM_COMPONENT_COMMANDBUTTON
Definition: fmservs.hxx:36
OUString sName
constexpr OUStringLiteral FILEDIALOG_FILTER_ALL
OUString sPrefix
constexpr sal_uInt16 KEY_DELETE
sal_uInt16 nPos
#define SAL_WARN(area, stream)
sal_uInt16 nCode
std::locale Create(std::string_view aPrefixName, const LanguageTag &rLocale)
OUString get(TranslateId sContextAndId, const std::locale &loc)
@ Exception
OString strip(const OString &rIn, char c)
int i
constexpr bool starts_with(std::basic_string_view< charT, traits > sv, std::basic_string_view< charT, traits > x) noexcept
class FmSearchEngine - Impl class for FmSearchDialog
constexpr OUStringLiteral PN_CONSTRAINT_EXPR
Definition: datanavi.cxx:89
constexpr OUStringLiteral PN_RELEVANT_EXPR
Definition: datanavi.cxx:87
constexpr OUStringLiteral PN_SUBMISSION_ACTION
Definition: datanavi.cxx:97
DataItemType
Definition: datanavi.hxx:68
@ DITAttribute
Definition: datanavi.hxx:71
@ DITElement
Definition: datanavi.hxx:72
@ DITNone
Definition: datanavi.hxx:69
@ DITBinding
Definition: datanavi.hxx:73
@ DITText
Definition: datanavi.hxx:70
constexpr OUStringLiteral PN_REQUIRED_EXPR
Definition: datanavi.cxx:88
constexpr OUStringLiteral PN_SUBMISSION_BIND
Definition: datanavi.cxx:95
constexpr OUStringLiteral PN_INSTANCE_MODEL
Definition: datanavi.cxx:77
constexpr OUStringLiteral NEW_ELEMENT
Definition: datanavi.cxx:103
constexpr OUStringLiteral TRUE_VALUE
Definition: datanavi.cxx:102
IMPL_LINK_NOARG(XFormsPage, ItemSelectHdl, weld::TreeView &, void)
Definition: datanavi.cxx:256
constexpr OUStringLiteral PN_SUBMISSION_ID
Definition: datanavi.cxx:94
constexpr OUStringLiteral PN_BINDING_MODEL
Definition: datanavi.cxx:84
constexpr OUStringLiteral PN_SUBMISSION_REPLACE
Definition: datanavi.cxx:99
constexpr OUStringLiteral PN_BINDING_TYPE
Definition: datanavi.cxx:91
constexpr OUStringLiteral NEW_ATTRIBUTE
Definition: datanavi.cxx:104
constexpr OUStringLiteral EVENTTYPE_ATTR
Definition: datanavi.cxx:106
constexpr OUStringLiteral PN_BINDING_EXPR
Definition: datanavi.cxx:83
constexpr OUStringLiteral EVENTTYPE_CHARDATA
Definition: datanavi.cxx:105
constexpr OUStringLiteral PN_READONLY_EXPR
Definition: datanavi.cxx:86
constexpr OUStringLiteral PN_BINDING_ID
Definition: datanavi.cxx:82
constexpr OUStringLiteral PN_INSTANCE_ID
Definition: datanavi.cxx:78
constexpr OUStringLiteral PN_SUBMISSION_METHOD
Definition: datanavi.cxx:98
IMPL_LINK(XFormsPage, PopupMenuHdl, const CommandEvent &, rCEvt, bool)
Definition: datanavi.cxx:136
constexpr OUStringLiteral PN_INSTANCE_URL
Definition: datanavi.cxx:79
DataGroupType
Definition: datanavi.hxx:60
@ DGTSubmission
Definition: datanavi.hxx:63
@ DGTBinding
Definition: datanavi.hxx:64
@ DGTInstance
Definition: datanavi.hxx:62
constexpr OUStringLiteral PN_SUBMISSION_REF
Definition: datanavi.cxx:96
constexpr OUStringLiteral PN_BINDING_NAMESPACES
Definition: datanavi.cxx:85
static void copyPropSet(const Reference< XPropertySet > &xFrom, Reference< XPropertySet > const &xTo)
Definition: datanavi.cxx:2219
constexpr OUStringLiteral PN_CALCULATE_EXPR
Definition: datanavi.cxx:90
OUString toId(const void *pValue)
SFX_IMPL_DOCKINGWINDOW(SwNavigatorWrapper, SID_NAVIGATOR)
SfxItemState
Reference< css::xml::dom::XNode > m_xNode
Definition: datanavi.cxx:112
Reference< XPropertySet > m_xPropSet
Definition: datanavi.cxx:113
ItemNode(const Reference< css::xml::dom::XNode > &_rxNode)
Definition: datanavi.cxx:115
ItemNode(const Reference< XPropertySet > &_rxSet)
Definition: datanavi.cxx:117
Reference< XModel > xModel
#define DND_ACTION_COPY
#define DND_ACTION_NONE
signed char sal_Int8
OUString sId
RET_OK
RET_YES