1
0
Fork 0
libreoffice/svx/source/inc/datanavi.hxx
Daniel Baumann 8e63e14cf6
Adding upstream version 4:25.2.3.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-22 16:20:04 +02:00

585 lines
23 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#ifndef INCLUDED_SVX_SOURCE_INC_DATANAVI_HXX
#define INCLUDED_SVX_SOURCE_INC_DATANAVI_HXX
#include <config_options.h>
#include <o3tl/sorted_vector.hxx>
#include <vcl/builderpage.hxx>
#include <vcl/idle.hxx>
#include <vcl/transfer.hxx>
#include <vcl/weld.hxx>
#include <svtools/inettbc.hxx>
#include <sfx2/dockwin.hxx>
#include <sfx2/childwin.hxx>
#include <sfx2/ctrlitem.hxx>
#include <svx/dialmgr.hxx>
#include <svx/strings.hrc>
#include <svx/svxdllapi.h>
#include <rtl/ref.hxx>
#include <com/sun/star/beans/XPropertySet.hpp>
#include <com/sun/star/container/XContainer.hpp>
#include <com/sun/star/container/XNameContainer.hpp>
#include <com/sun/star/frame/XFrame.hpp>
#include <com/sun/star/xforms/XFormsUIHelper1.hpp>
#include <com/sun/star/xforms/XModel.hpp>
#include <com/sun/star/xforms/XSubmission.hpp>
#include <com/sun/star/xml/dom/XNode.hpp>
#include <com/sun/star/xml/dom/events/XEventTarget.hpp>
#include "datalistener.hxx"
#include <memory>
#include <string_view>
#include <vector>
class FmFormShell;
namespace svxform
{
enum DataGroupType
{
DGTUnknown = 0,
DGTInstance,
DGTSubmission,
DGTBinding
};
enum DataItemType
{
DITNone = 0,
DITText,
DITAttribute,
DITElement,
DITBinding
};
struct ItemNode;
class XFormsPage;
class DataNavigatorWindow;
class AddInstanceDialog;
class ReplaceString
{
OUString m_sDoc_UI;
OUString m_sInstance_UI;
OUString m_sNone_UI;
static constexpr OUString m_sDoc_API = u"all"_ustr;
static constexpr OUString m_sInstance_API = u"instance"_ustr;
static constexpr OUString m_sNone_API = u"none"_ustr;
ReplaceString( const ReplaceString& ) = delete;
public:
ReplaceString()
{
m_sDoc_UI = SvxResId(RID_STR_REPLACE_DOC);
m_sInstance_UI = SvxResId(RID_STR_REPLACE_INST);
m_sNone_UI = SvxResId(RID_STR_REPLACE_NONE);
}
/** convert submission replace string from API value to UI value.
Use 'none' as default. */
OUString const & toUI( std::u16string_view rStr ) const
{
if( rStr == m_sDoc_API )
return m_sDoc_UI;
else if( rStr == m_sInstance_API )
return m_sInstance_UI;
else
return m_sNone_UI;
}
/** convert submission replace string from UI to API.
Use 'none' as default. */
const OUString & toAPI( std::u16string_view rStr ) const
{
if( rStr == m_sDoc_UI )
return m_sDoc_API;
else if( rStr == m_sInstance_UI )
return m_sInstance_API;
else
return m_sNone_API;
}
};
class MethodString
{
OUString m_sPost_UI;
OUString m_sPut_UI;
OUString m_sGet_UI;
static constexpr OUString m_sPost_API = u"post"_ustr;
static constexpr OUString m_sPut_API = u"put"_ustr;
static constexpr OUString m_sGet_API = u"get"_ustr;
MethodString( const MethodString& ) = delete;
public:
MethodString()
{
m_sPost_UI = SvxResId(RID_STR_METHOD_POST);
m_sPut_UI = SvxResId(RID_STR_METHOD_PUT);
m_sGet_UI = SvxResId(RID_STR_METHOD_GET);
}
/** convert from API to UI; put is default. */
OUString const & toUI( std::u16string_view rStr ) const
{
if( rStr == m_sGet_API )
return m_sGet_UI;
else if( rStr == m_sPost_API )
return m_sPost_UI;
else
return m_sPut_UI;
}
/** convert from UI to API; put is default */
const OUString & toAPI( std::u16string_view rStr ) const
{
if( rStr == m_sGet_UI )
return m_sGet_API;
else if( rStr == m_sPost_UI )
return m_sPost_API;
else
return m_sPut_API;
}
};
class DataTreeDropTarget final : public DropTargetHelper
{
private:
virtual sal_Int8 AcceptDrop(const AcceptDropEvent& rEvt) override;
virtual sal_Int8 ExecuteDrop(const ExecuteDropEvent& rEvt) override;
public:
DataTreeDropTarget(weld::TreeView& rWidget);
};
class XFormsPage final : public BuilderPage
{
private:
MethodString m_aMethodString;
ReplaceString m_aReplaceString;
weld::Container* m_pParent;
std::unique_ptr<weld::Toolbar> m_xToolBox;
std::unique_ptr<weld::Menu> m_xMenu;
std::unique_ptr<weld::TreeView> m_xItemList;
std::unique_ptr<weld::TreeIter> m_xScratchIter;
o3tl::sorted_vector<OUString> m_aRemovedMenuEntries;
DataTreeDropTarget m_aDropHelper;
css::uno::Reference< css::xforms::XFormsUIHelper1 >
m_xUIHelper;
DataNavigatorWindow* m_pNaviWin;
bool m_bHasModel;
DataGroupType m_eGroup;
// these strings are not valid on the Submission and Binding Page
// mb: furthermore these are properties of an instance, thus
// it would be much better to get/set them through the UIHelper
// interface.
OUString m_sInstanceName;
OUString m_sInstanceURL;
bool m_bLinkOnce;
DECL_LINK(TbxSelectHdl, const OUString&, void);
DECL_LINK(ItemSelectHdl, weld::TreeView&, void);
DECL_LINK(KeyInputHdl, const KeyEvent&, bool);
DECL_LINK(PopupMenuHdl, const CommandEvent&, bool);
void AddChildren(const weld::TreeIter* _pParent,
const css::uno::Reference< css::xml::dom::XNode >& _xNode);
bool DoToolBoxAction(std::u16string_view rToolBoxID);
void AddEntry(std::unique_ptr<ItemNode> _pNewNode, bool _bIsElement, weld::TreeIter* pRet = nullptr);
void AddEntry(const css::uno::Reference< css::beans::XPropertySet >& _rPropSet, weld::TreeIter* pRet = nullptr);
void EditEntry( const css::uno::Reference< css::beans::XPropertySet >& _rPropSet );
bool RemoveEntry();
void PrepDnD();
void DeleteAndClearTree();
void SetMenuEntrySensitive(const OUString& rIdent, bool bSensitive);
public:
XFormsPage(weld::Container* pParent, DataNavigatorWindow* _pNaviWin, DataGroupType _eGroup);
virtual ~XFormsPage() override;
bool HasModel() const { return m_bHasModel; }
OUString SetModel( const css::uno::Reference< css::xforms::XModel > & _xModel, int _nPagePos );
void ClearModel();
OUString LoadInstance(const css::uno::Sequence< css::beans::PropertyValue >& _xPropSeq);
bool DoMenuAction(std::u16string_view rMenuID);
void EnableMenuItems();
void SelectFirstEntry();
const OUString& GetInstanceName() const { return m_sInstanceName; }
const OUString& GetInstanceURL() const { return m_sInstanceURL; }
bool GetLinkOnce() const { return m_bLinkOnce; }
void SetInstanceName( const OUString &name ) { m_sInstanceName=name; }
void SetInstanceURL( const OUString &url ) { m_sInstanceURL=url; }
void SetLinkOnce( bool bLinkOnce ) { m_bLinkOnce=bLinkOnce; }
css::uno::Reference<css::beans::XPropertySet>
GetBindingForNode( const css::uno::Reference<css::xml::dom::XNode> &xNode ) { return m_xUIHelper->getBindingForNode(xNode,true); }
OUString GetServiceNameForNode( const css::uno::Reference<css::xml::dom::XNode> &xNode ) { return m_xUIHelper->getDefaultServiceNameForNode(xNode); }
const css::uno::Reference< css::xforms::XFormsUIHelper1 >&
GetXFormsHelper() const { return m_xUIHelper; }
};
class DataNavigatorWindow final
{
private:
VclPtr<vcl::Window> m_xParent;
std::unique_ptr<weld::ComboBox> m_xModelsBox;
std::unique_ptr<weld::MenuButton> m_xModelBtn;
std::unique_ptr<weld::Notebook> m_xTabCtrl;
std::unique_ptr<weld::MenuButton> m_xInstanceBtn;
std::unique_ptr<XFormsPage> m_xInstPage;
std::unique_ptr<XFormsPage> m_xSubmissionPage;
std::unique_ptr<XFormsPage> m_xBindingPage;
sal_Int32 m_nLastSelectedPos;
bool m_bShowDetails;
bool m_bIsNotifyDisabled;
std::vector< std::unique_ptr<XFormsPage> >
m_aPageList;
std::vector< css::uno::Reference< css::container::XContainer > >
m_aContainerList;
std::vector< css::uno::Reference< css::xml::dom::events::XEventTarget > >
m_aEventTargetList;
Timer m_aUpdateTimer;
::rtl::Reference < DataListener >
m_xDataListener;
css::uno::Reference< css::container::XNameContainer >
m_xDataContainer;
css::uno::Reference< css::frame::XFrame >
m_xFrame;
css::uno::Reference< css::frame::XModel >
m_xFrameModel;
DECL_LINK( ModelSelectListBoxHdl, weld::ComboBox&, void );
DECL_LINK( MenuSelectHdl, const OUString&, void );
DECL_LINK( MenuActivateHdl, weld::Toggleable&, void );
DECL_LINK( ActivatePageHdl, const OUString&, void);
DECL_LINK( UpdateHdl, Timer *, void);
void ModelSelectHdl(const weld::ComboBox*);
OUString GetCurrentPage() const;
XFormsPage* GetPage(const OUString& rCurId);
void LoadModels();
void SetPageModel(const OUString& rCurId);
void ClearAllPageModels( bool bClearPages );
void InitPages();
void CreateInstancePage( const css::uno::Sequence< css::beans::PropertyValue >& _xPropSeq );
bool HasFirstInstancePage() const;
OUString GetNewPageId() const;
static bool IsAdditionalPage(std::u16string_view rIdent);
public:
DataNavigatorWindow(vcl::Window* pParent, weld::Builder& rBuilder, SfxBindings const * pBindings);
~DataNavigatorWindow();
static void SetDocModified();
void NotifyChanges( bool _bLoadAll = false );
void AddContainerBroadcaster( const css::uno::Reference< css::container::XContainer > & xContainer );
void AddEventBroadcaster( const css::uno::Reference< css::xml::dom::events::XEventTarget >& xTarget );
void RemoveBroadcaster();
weld::Window* GetFrameWeld() const { return m_xParent->GetFrameWeld(); }
bool IsShowDetails() const { return m_bShowDetails; }
void DisableNotify( bool _bDisable ) { m_bIsNotifyDisabled = _bDisable; }
};
class DataNavigator final : public SfxDockingWindow, public SfxControllerItem
{
private:
std::unique_ptr<DataNavigatorWindow> m_xDataWin;
virtual Size CalcDockingSize( SfxChildAlignment ) override;
virtual SfxChildAlignment CheckAlignment( SfxChildAlignment, SfxChildAlignment ) override;
public:
DataNavigator( SfxBindings* pBindings, SfxChildWindow* pMgr, vcl::Window* pParent );
virtual ~DataNavigator() override;
virtual void dispose() override;
using SfxDockingWindow::StateChanged;
void StateChangedAtToolBoxControl( sal_uInt16 nSID, SfxItemState eState,
const SfxPoolItem* pState ) override;
};
class UNLESS_MERGELIBS(SVXCORE_DLLPUBLIC) DataNavigatorManager final : public SfxChildWindow
{
public:
SVX_DLLPRIVATE DataNavigatorManager( vcl::Window* pParent, sal_uInt16 nId,
SfxBindings* pBindings, SfxChildWinInfo* pInfo );
SFX_DECL_CHILDWINDOW( DataNavigatorManager );
};
class AddDataItemDialog final : public weld::GenericDialogController
{
private:
css::uno::Reference< css::xforms::XFormsUIHelper1 >
m_xUIHelper;
css::uno::Reference< css::beans::XPropertySet >
m_xBinding;
css::uno::Reference< css::beans::XPropertySet >
m_xTempBinding;
ItemNode* m_pItemNode;
DataItemType m_eItemType;
OUString m_sFL_Element;
OUString m_sFL_Attribute;
OUString m_sFL_Binding;
OUString m_sFT_BindingExp;
std::unique_ptr<weld::Frame> m_xItemFrame;
std::unique_ptr<weld::Label> m_xNameFT;
std::unique_ptr<weld::Entry> m_xNameED;
std::unique_ptr<weld::Label> m_xDefaultFT;
std::unique_ptr<weld::Entry> m_xDefaultED;
std::unique_ptr<weld::Button> m_xDefaultBtn;
std::unique_ptr<weld::Widget> m_xSettingsFrame;
std::unique_ptr<weld::ComboBox> m_xDataTypeLB;
std::unique_ptr<weld::CheckButton> m_xRequiredCB;
std::unique_ptr<weld::Button> m_xRequiredBtn;
std::unique_ptr<weld::CheckButton> m_xRelevantCB;
std::unique_ptr<weld::Button> m_xRelevantBtn;
std::unique_ptr<weld::CheckButton> m_xConstraintCB;
std::unique_ptr<weld::Button> m_xConstraintBtn;
std::unique_ptr<weld::CheckButton> m_xReadonlyCB;
std::unique_ptr<weld::Button> m_xReadonlyBtn;
std::unique_ptr<weld::CheckButton> m_xCalculateCB;
std::unique_ptr<weld::Button> m_xCalculateBtn;
std::unique_ptr<weld::Button> m_xOKBtn;
void Check(const weld::Toggleable* pBox);
DECL_LINK(CheckHdl, weld::Toggleable&, void);
DECL_LINK(ConditionHdl, weld::Button&, void);
DECL_LINK(OKHdl, weld::Button&, void);
void InitDialog();
void InitFromNode();
void InitDataTypeBox();
public:
AddDataItemDialog(
weld::Window* pParent, ItemNode* _pNode,
const css::uno::Reference< css::xforms::XFormsUIHelper1 >& _rUIHelper );
virtual ~AddDataItemDialog() override;
void InitText( DataItemType _eType );
};
class AddConditionDialog final : public weld::GenericDialogController
{
private:
Idle m_aResultIdle;
OUString m_sPropertyName;
css::uno::Reference< css::xforms::XFormsUIHelper1 >
m_xUIHelper;
css::uno::Reference< css::beans::XPropertySet >
m_xBinding;
std::unique_ptr<weld::TextView> m_xConditionED;
std::unique_ptr<weld::TextView> m_xResultWin;
std::unique_ptr<weld::Button> m_xEditNamespacesBtn;
std::unique_ptr<weld::Button> m_xOKBtn;
DECL_LINK(ModifyHdl, weld::TextView&, void);
DECL_LINK(ResultHdl, Timer *, void);
DECL_LINK(EditHdl, weld::Button&, void);
DECL_LINK(OKHdl, weld::Button&, void);
public:
AddConditionDialog(weld::Window* pParent,
OUString _aPropertyName, const css::uno::Reference< css::beans::XPropertySet >& _rBinding);
virtual ~AddConditionDialog() override;
const css::uno::Reference< css::xforms::XFormsUIHelper1 >& GetUIHelper() const { return m_xUIHelper; }
OUString GetCondition() const { return m_xConditionED->get_text(); }
void SetCondition(const OUString& _rCondition)
{
m_xConditionED->set_text(_rCondition);
m_aResultIdle.Start();
}
};
class NamespaceItemDialog final : public weld::GenericDialogController
{
private:
AddConditionDialog* m_pConditionDlg;
std::vector< OUString > m_aRemovedList;
css::uno::Reference< css::container::XNameContainer >&
m_rNamespaces;
std::unique_ptr<weld::TreeView> m_xNamespacesList;
std::unique_ptr<weld::Button> m_xAddNamespaceBtn;
std::unique_ptr<weld::Button> m_xEditNamespaceBtn;
std::unique_ptr<weld::Button> m_xDeleteNamespaceBtn;
std::unique_ptr<weld::Button> m_xOKBtn;
DECL_LINK(SelectHdl, weld::TreeView&, void);
DECL_LINK(ClickHdl, weld::Button&, void);
DECL_LINK(OKHdl, weld::Button&, void);
void LoadNamespaces();
public:
NamespaceItemDialog(AddConditionDialog* pParent, css::uno::Reference< css::container::XNameContainer >& _rContainer);
virtual ~NamespaceItemDialog() override;
};
class ManageNamespaceDialog final : public weld::GenericDialogController
{
private:
AddConditionDialog* m_pConditionDlg;
std::unique_ptr<weld::Entry> m_xPrefixED;
std::unique_ptr<weld::Entry> m_xUrlED;
std::unique_ptr<weld::Button> m_xOKBtn;
std::unique_ptr<weld::Label> m_xAltTitle;
DECL_LINK(OKHdl, weld::Button&, void);
public:
ManageNamespaceDialog(weld::Window* pParent, AddConditionDialog* _pCondDlg, bool bIsEdit);
virtual ~ManageNamespaceDialog() override;
void SetNamespace(const OUString& _rPrefix, const OUString& _rURL)
{
m_xPrefixED->set_text(_rPrefix);
m_xUrlED->set_text(_rURL);
}
OUString GetPrefix() const { return m_xPrefixED->get_text(); }
OUString GetURL() const { return m_xUrlED->get_text(); }
};
class AddSubmissionDialog final : public weld::GenericDialogController
{
private:
MethodString m_aMethodString;
ReplaceString m_aReplaceString;
ItemNode* m_pItemNode;
css::uno::Reference< css::xforms::XFormsUIHelper1 >
m_xUIHelper;
css::uno::Reference< css::xforms::XSubmission >
m_xNewSubmission;
css::uno::Reference< css::beans::XPropertySet >
m_xSubmission;
css::uno::Reference< css::beans::XPropertySet >
m_xTempBinding;
css::uno::Reference< css::beans::XPropertySet >
m_xCreatedBinding;
std::unique_ptr<weld::Entry> m_xNameED;
std::unique_ptr<weld::Entry> m_xActionED;
std::unique_ptr<weld::ComboBox> m_xMethodLB;
std::unique_ptr<weld::Entry> m_xRefED;
std::unique_ptr<weld::Button> m_xRefBtn;
std::unique_ptr<weld::ComboBox> m_xBindLB;
std::unique_ptr<weld::ComboBox> m_xReplaceLB;
std::unique_ptr<weld::Button> m_xOKBtn;
DECL_LINK(RefHdl, weld::Button&, void);
DECL_LINK(OKHdl, weld::Button&, void);
void FillAllBoxes();
public:
AddSubmissionDialog(weld::Window* pParent, ItemNode* pNode,
const css::uno::Reference< css::xforms::XFormsUIHelper1 >& rUIHelper);
virtual ~AddSubmissionDialog() override;
const css::uno::Reference< css::xforms::XSubmission >& GetNewSubmission() const { return m_xNewSubmission; }
};
class AddModelDialog final : public weld::GenericDialogController
{
private:
std::unique_ptr<weld::Entry> m_xNameED;
std::unique_ptr<weld::CheckButton> m_xModifyCB;
std::unique_ptr<weld::Label> m_xAltTitle;
public:
AddModelDialog(weld::Window* pParent, bool _bEdit);
virtual ~AddModelDialog() override;
OUString GetName() const { return m_xNameED->get_text(); }
void SetName( const OUString& _rName ) { m_xNameED->set_text( _rName );}
bool GetModifyDoc() const { return m_xModifyCB->get_active(); }
void SetModifyDoc( const bool bModify ) { m_xModifyCB->set_active(bModify); }
};
class AddInstanceDialog final : public weld::GenericDialogController
{
private:
OUString m_sAllFilterName;
std::unique_ptr<weld::Entry> m_xNameED;
std::unique_ptr<SvtURLBox> m_xURLED;
std::unique_ptr<weld::Button> m_xFilePickerBtn;
std::unique_ptr<weld::CheckButton> m_xLinkInstanceCB;
std::unique_ptr<weld::Label> m_xAltTitle;
DECL_LINK(FilePickerHdl, weld::Button&, void);
public:
AddInstanceDialog(weld::Window* pParent, bool _bEdit);
virtual ~AddInstanceDialog() override;
OUString GetName() const { return m_xNameED->get_text(); }
void SetName( const OUString& rName ) { m_xNameED->set_text( rName );}
OUString GetURL() const { return m_xURLED->get_active_text(); }
void SetURL( const OUString& rURL ) { m_xURLED->set_entry_text( rURL );}
bool IsLinkInstance() const { return m_xLinkInstanceCB->get_active(); }
void SetLinkInstance( bool bLink ) { m_xLinkInstanceCB->set_active(bLink); }
};
class LinkedInstanceWarningBox final : public weld::MessageDialogController
{
public:
LinkedInstanceWarningBox(weld::Widget* pParent);
};
}
#endif // INCLUDED_SVX_SOURCE_INC_DATANAVI_HXX
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */