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