weld DataNavigator
Change-Id: I78241701de0756f5fe9bc9b793dadccd4ae119d7
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/96750
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
diff --git a/extras/source/glade/libreoffice-catalog.xml.in b/extras/source/glade/libreoffice-catalog.xml.in
index 9316bb2..f20ba840 100644
--- a/extras/source/glade/libreoffice-catalog.xml.in
+++ b/extras/source/glade/libreoffice-catalog.xml.in
@@ -35,10 +35,6 @@
generic-name="Template Icon View" parent="GtkIconView"
icon-name="widget-gtk-iconview"/>
<glade-widget-class title="DataTreeListBox" name="svxcorelo-DataTreeListBox"
generic-name="DataTreeListBox" parent="GtkTreeView"
icon-name="widget-gtk-treeview"/>
<glade-widget-class title="Notebook switching tabs depending on context" name="sfxlo-NotebookbarTabControl"
generic-name="NotebookbarTabControl" parent="GtkNotebook"
icon-name="widget-gtk-notebook"/>
diff --git a/include/svx/xmlexchg.hxx b/include/svx/xmlexchg.hxx
index 63ebd75..b29dec1 100644
--- a/include/svx/xmlexchg.hxx
+++ b/include/svx/xmlexchg.hxx
@@ -61,7 +61,7 @@ namespace svx
//= OXFormsTransferable
class SVXCORE_DLLPUBLIC OXFormsTransferable final : public TransferableHelper {
class SVXCORE_DLLPUBLIC OXFormsTransferable final : public TransferDataContainer {
// TransferableHelper overridables
virtual void AddSupportedFormats() override;
diff --git a/solenv/bin/native-code.py b/solenv/bin/native-code.py
index 661d648..dbd9cf7 100755
--- a/solenv/bin/native-code.py
+++ b/solenv/bin/native-code.py
@@ -522,7 +522,6 @@ constructor_map = {
custom_widgets = [
'ContextVBox',
'DataTreeListBox',
'DropdownBox',
'EmojiView',
'ManagedMenuButton',
diff --git a/svx/inc/bitmaps.hlst b/svx/inc/bitmaps.hlst
index fdb6080..4b5f021 100644
--- a/svx/inc/bitmaps.hlst
+++ b/svx/inc/bitmaps.hlst
@@ -78,11 +78,6 @@
#define RID_SVXBMP_LAMP_ON "svx/res/lighton.png"
#define RID_SVXBMP_LAMP_OFF "svx/res/light.png"
#define RID_SVXBMP_ADD "res/tb01.png"
#define RID_SVXBMP_ADD_ELEMENT "res/tb02.png"
#define RID_SVXBMP_ADD_ATTRIBUTE "res/tb03.png"
#define RID_SVXBMP_EDIT "res/tb04.png"
#define RID_SVXBMP_REMOVE "res/tb05.png"
#define RID_SVXBMP_ELEMENT "res/da03.png"
#define RID_SVXBMP_ATTRIBUTE "res/da04.png"
#define RID_SVXBMP_TEXT "res/da05.png"
diff --git a/svx/source/form/datanavi.cxx b/svx/source/form/datanavi.cxx
index 59ae4d1..ab8ff5c 100644
--- a/svx/source/form/datanavi.cxx
+++ b/svx/source/form/datanavi.cxx
@@ -34,16 +34,14 @@
#include <svtools/miscopt.hxx>
#include <unotools/pathoptions.hxx>
#include <unotools/viewoptions.hxx>
#include <vcl/treelistentry.hxx>
#include <sfx2/filedlghelper.hxx>
#include <sfx2/viewfrm.hxx>
#include <sfx2/objsh.hxx>
#include <sfx2/bindings.hxx>
#include <sfx2/dispatch.hxx>
#include <vcl/weld.hxx>
#include <vcl/builderfactory.hxx>
#include <vcl/commandevent.hxx>
#include <vcl/event.hxx>
#include <vcl/layout.hxx>
#include <vcl/weld.hxx>
#include <com/sun/star/beans/PropertyAttribute.hpp>
#include <com/sun/star/container/XSet.hpp>
#include <com/sun/star/frame/XController.hpp>
@@ -119,288 +117,192 @@ namespace svxform
m_xPropSet( _rxSet ) {}
};
DataTreeListBox::DataTreeListBox(vcl::Window* pParent, WinBits nBits)
: SvTreeListBox(pParent, nBits)
, m_pXFormsPage(nullptr)
, m_eGroup(DGTUnknown)
, m_nAddId(0)
, m_nAddElementId(0)
, m_nAddAttributeId(0)
, m_nEditId(0)
, m_nRemoveId(0)
DataTreeDropTarget::DataTreeDropTarget(weld::TreeView& rWidget)
: DropTargetHelper(rWidget.get_drop_target())
{
EnableContextMenuHandling();
}
sal_Int8 DataTreeDropTarget::AcceptDrop( const AcceptDropEvent& /*rEvt*/ )
{
return DND_ACTION_NONE;
}
sal_Int8 DataTreeDropTarget::ExecuteDrop( const ExecuteDropEvent& /*rEvt*/ )
{
return DND_ACTION_NONE;
}
IMPL_LINK(XFormsPage, PopupMenuHdl, const CommandEvent&, rCEvt, bool)
{
if (rCEvt.GetCommand() != CommandEventId::ContextMenu)
return false;
Point aPos(rCEvt.GetMousePosPixel());
if (m_xItemList->get_dest_row_at_pos(aPos, m_xScratchIter.get(), false) && !m_xItemList->is_selected(*m_xScratchIter))
{
m_xItemList->select(*m_xScratchIter);
ItemSelectHdl(*m_xItemList);
}
std::unique_ptr<weld::Builder> xBuilder(Application::CreateBuilder(m_xItemList.get(), "svx/ui/formdatamenu.ui"));
std::unique_ptr<weld::Menu> xMenu(xBuilder->weld_menu("menu"));
if (DGTInstance == m_eGroup)
xMenu->set_visible("additem", false);
else
{
xMenu->set_visible("addelement", false);
xMenu->set_visible("addattribute", false);
if (DGTSubmission == m_eGroup)
{
xMenu->set_label("additem", SvxResId(RID_STR_DATANAV_ADD_SUBMISSION));
xMenu->set_label("edit", SvxResId(RID_STR_DATANAV_EDIT_SUBMISSION));
xMenu->set_label("delete", SvxResId(RID_STR_DATANAV_REMOVE_SUBMISSION));
}
else
{
xMenu->set_label("additem", SvxResId(RID_STR_DATANAV_ADD_BINDING));
xMenu->set_label("edit", SvxResId(RID_STR_DATANAV_EDIT_BINDING));
xMenu->set_label("delete", SvxResId(RID_STR_DATANAV_REMOVE_BINDING));
}
}
EnableMenuItems(xMenu.get());
OString sCommand = xMenu->popup_at_rect(m_xItemList.get(), tools::Rectangle(aPos, Size(1,1)));
if (!sCommand.isEmpty())
DoMenuAction(sCommand);
return true;
}
void XFormsPage::DeleteAndClearTree()
{
m_xItemList->all_foreach([this](weld::TreeIter& rEntry) {
delete reinterpret_cast<ItemNode*>(m_xItemList->get_id(rEntry).toInt64());
return false;
});
m_xItemList->clear();
}
XFormsPage::XFormsPage(weld::Container* pPage, DataNavigatorWindow* _pNaviWin, DataGroupType _eGroup)
: BuilderPage(pPage, nullptr, "svx/ui/xformspage.ui", "XFormsPage")
, m_pParent(pPage)
, m_xToolBox(m_xBuilder->weld_toolbar("toolbar"))
, m_xItemList(m_xBuilder->weld_tree_view("items"))
, m_xScratchIter(m_xItemList->make_iterator())
, m_aDropHelper(*m_xItemList)
, m_pNaviWin(_pNaviWin)
, m_bHasModel(false)
, m_eGroup(_eGroup)
, m_bLinkOnce(false)
{
m_xItemList->set_show_expanders(DGTInstance == m_eGroup || DGTSubmission == m_eGroup);
if ( DGTInstance == m_eGroup )
SetDragDropMode( DragDropMode::CTRL_MOVE |DragDropMode::CTRL_COPY | DragDropMode::APP_COPY );
m_xToolBox->set_item_visible("additem", false);
else
{
m_xToolBox->set_item_visible("addelement", false);
m_xToolBox->set_item_visible("addattribute", false);
if ( DGTSubmission == m_eGroup )
{
m_xToolBox->set_item_label("additem", SvxResId(RID_STR_DATANAV_ADD_SUBMISSION));
m_xToolBox->set_item_label("edit", SvxResId(RID_STR_DATANAV_EDIT_SUBMISSION));
m_xToolBox->set_item_label("delete", SvxResId(RID_STR_DATANAV_REMOVE_SUBMISSION));
}
else
{
m_xToolBox->set_item_label("additem", SvxResId(RID_STR_DATANAV_ADD_BINDING));
m_xToolBox->set_item_label("edit", SvxResId(RID_STR_DATANAV_EDIT_BINDING));
m_xToolBox->set_item_label("delete", SvxResId(RID_STR_DATANAV_REMOVE_BINDING));
}
}
m_xToolBox->connect_clicked(LINK(this, XFormsPage, TbxSelectHdl));
m_xItemList->connect_changed(LINK(this, XFormsPage, ItemSelectHdl));
m_xItemList->connect_key_press(LINK(this, XFormsPage, KeyInputHdl));
m_xItemList->connect_popup_menu(LINK(this, XFormsPage, PopupMenuHdl));
ItemSelectHdl(*m_xItemList);
}
DataTreeListBox::~DataTreeListBox()
XFormsPage::~XFormsPage()
{
disposeOnce();
DeleteAndClearTree();
m_pNaviWin = nullptr;
m_pParent->move(m_xContainer.get(), nullptr);
}
void DataTreeListBox::dispose()
IMPL_LINK(XFormsPage, TbxSelectHdl, const OString&, rIdent, void)
{
DeleteAndClear();
m_xMenu.clear();
m_xBuilder.reset();
m_pXFormsPage.clear();
SvTreeListBox::dispose();
DoToolBoxAction(rIdent);
}
sal_Int8 DataTreeListBox::AcceptDrop( const AcceptDropEvent& /*rEvt*/ )
IMPL_LINK_NOARG(XFormsPage, ItemSelectHdl, weld::TreeView&, void)
{
return DND_ACTION_NONE;
EnableMenuItems(nullptr);
PrepDnD();
}
sal_Int8 DataTreeListBox::ExecuteDrop( const ExecuteDropEvent& /*rEvt*/ )
void XFormsPage::PrepDnD()
{
return DND_ACTION_NONE;
}
rtl::Reference<TransferDataContainer> xTransferable(new TransferDataContainer);
m_xItemList->enable_drag_source(xTransferable, DND_ACTION_NONE);
void DataTreeListBox::StartDrag( sal_Int8 /*_nAction*/, const Point& /*_rPosPixel*/ )
{
SvTreeListEntry* pSelected = FirstSelected();
if ( !pSelected )
if (!m_xItemList->get_selected(m_xScratchIter.get()))
{
// no drag without an entry
return;
}
if ( m_eGroup == DGTBinding )
{
// for the moment, bindings cannot be dragged.
// #i59395# / 2005-12-15 / frank.schoenheit@sun.com
return;
}
// GetServiceNameForNode() requires a datatype repository which
// will be automatically build if requested???
Reference< css::xforms::XModel > xModel( m_pXFormsPage->GetXFormsHelper(), UNO_QUERY );
Reference< css::xforms::XModel > xModel( GetXFormsHelper(), UNO_QUERY );
Reference< css::xforms::XDataTypeRepository > xDataTypes =
xModel->getDataTypeRepository();
if(!xDataTypes.is())
return;
ItemNode *pItemNode = static_cast<ItemNode*>(pSelected->GetUserData());
if ( !pItemNode )
ItemNode *pItemNode = reinterpret_cast<ItemNode*>(m_xItemList->get_id(*m_xScratchIter).toInt64());
if (!pItemNode)
{
// the only known (and allowed?) case where this happens are sub-entries of a submission
// entry
DBG_ASSERT( DGTSubmission == m_eGroup, "DataTreeListBox::StartDrag: how this?" );
pSelected = GetParent( pSelected );
DBG_ASSERT( pSelected && !GetParent( pSelected ), "DataTreeListBox::StartDrag: what kind of entry *is* this?" );
bool bSelected = m_xItemList->iter_parent(*m_xScratchIter);
DBG_ASSERT(bSelected && !m_xItemList->get_iter_depth(*m_xScratchIter), "DataTreeListBox::StartDrag: what kind of entry *is* this?");
// on the submission page, we have only top-level entries (the submission themself)
// plus direct children of those (facets of a submission)
pItemNode = pSelected ? static_cast< ItemNode* >( pSelected->GetUserData() ) : nullptr;
if ( !pItemNode )
pItemNode = bSelected ? reinterpret_cast<ItemNode*>(m_xItemList->get_id(*m_xScratchIter).toInt64()) : nullptr;
if (!pItemNode)
return;
}
OXFormsDescriptor desc;
desc.szName = GetEntryText(pSelected);
desc.szName = m_xItemList->get_text(*m_xScratchIter);
if(pItemNode->m_xNode.is()) {
// a valid node interface tells us that we need to create a control from a binding
desc.szServiceName = m_pXFormsPage->GetServiceNameForNode(pItemNode->m_xNode);
desc.xPropSet = m_pXFormsPage->GetBindingForNode(pItemNode->m_xNode);
desc.szServiceName = GetServiceNameForNode(pItemNode->m_xNode);
desc.xPropSet = GetBindingForNode(pItemNode->m_xNode);
DBG_ASSERT( desc.xPropSet.is(), "DataTreeListBox::StartDrag(): invalid node binding" );
}
else {
desc.szServiceName = FM_COMPONENT_COMMANDBUTTON;
desc.xPropSet = pItemNode->m_xPropSet;
}
rtl::Reference<OXFormsTransferable> pTransferable = new OXFormsTransferable(desc);
EndSelection();
pTransferable->StartDrag( this, DND_ACTION_COPY );
xTransferable = rtl::Reference<TransferDataContainer>(new OXFormsTransferable(desc));
m_xItemList->enable_drag_source(xTransferable, DND_ACTION_COPY);
}
VclPtr<PopupMenu> DataTreeListBox::CreateContextMenu()
{
m_xMenu.disposeAndClear();
m_xBuilder.reset(new VclBuilder(nullptr, VclBuilderContainer::getUIRootDir(), "svx/ui/formdatamenu.ui", ""));
m_xMenu.set(m_xBuilder->get_menu("menu"));
if ( DGTInstance == m_eGroup )
m_xMenu->RemoveItem(m_xMenu->GetItemPos(m_xMenu->GetItemId("additem")));
else
{
m_xMenu->RemoveItem(m_xMenu->GetItemPos(m_xMenu->GetItemId("addelement")));
m_xMenu->RemoveItem(m_xMenu->GetItemPos(m_xMenu->GetItemId("addattribute")));
if ( DGTSubmission == m_eGroup )
{
m_xMenu->SetItemText(m_xMenu->GetItemId("additem"), SvxResId(RID_STR_DATANAV_ADD_SUBMISSION));
m_xMenu->SetItemText(m_xMenu->GetItemId("edit"), SvxResId(RID_STR_DATANAV_EDIT_SUBMISSION));
m_xMenu->SetItemText(m_xMenu->GetItemId("delete"), SvxResId(RID_STR_DATANAV_REMOVE_SUBMISSION));
}
else
{
m_xMenu->SetItemText(m_xMenu->GetItemId("additem"), SvxResId(RID_STR_DATANAV_ADD_BINDING));
m_xMenu->SetItemText(m_xMenu->GetItemId("edit"), SvxResId(RID_STR_DATANAV_EDIT_BINDING));
m_xMenu->SetItemText(m_xMenu->GetItemId("delete"), SvxResId(RID_STR_DATANAV_REMOVE_BINDING));
}
}
m_pXFormsPage->EnableMenuItems(m_xMenu.get());
return m_xMenu;
}
void DataTreeListBox::ExecuteContextMenuAction( sal_uInt16 _nSelectedPopupEntry )
{
if (m_xMenu->GetItemId("additem") == _nSelectedPopupEntry)
m_pXFormsPage->DoMenuAction(m_nAddId);
else if (m_xMenu->GetItemId("addelement") == _nSelectedPopupEntry)
m_pXFormsPage->DoMenuAction(m_nAddElementId);
else if (m_xMenu->GetItemId("addattribute") == _nSelectedPopupEntry)
m_pXFormsPage->DoMenuAction(m_nAddAttributeId);
else if (m_xMenu->GetItemId("edit") == _nSelectedPopupEntry)
m_pXFormsPage->DoMenuAction(m_nEditId);
else if (m_xMenu->GetItemId("delete") == _nSelectedPopupEntry)
m_pXFormsPage->DoMenuAction(m_nRemoveId);
}
void DataTreeListBox::RemoveEntry( SvTreeListEntry const * _pEntry )
{
if ( _pEntry )
{
delete static_cast< ItemNode* >( _pEntry->GetUserData() );
SvTreeListBox::GetModel()->Remove( _pEntry );
}
}
void DataTreeListBox::SetGroup(DataGroupType _eGroup)
{
m_eGroup = _eGroup;
}
void DataTreeListBox::SetXFormsPage(XFormsPage* _pPage)
{
m_pXFormsPage = _pPage;
}
void DataTreeListBox::SetToolBoxItemIds(sal_uInt16 _nAddId,
sal_uInt16 _nAddElementId,
sal_uInt16 _nAddAttributeId,
sal_uInt16 _nEditId,
sal_uInt16 _nRemoveId)
{
m_nAddId = _nAddId;
m_nAddElementId = _nAddElementId;
m_nAddAttributeId = _nAddAttributeId;
m_nEditId = _nEditId;
m_nRemoveId = _nRemoveId;
}
void DataTreeListBox::DeleteAndClear()
{
sal_uIntPtr i, nCount = GetEntryCount();
for ( i = 0; i < nCount; ++i )
{
SvTreeListEntry* pEntry = GetEntry(i);
if ( pEntry )
delete static_cast< ItemNode* >( pEntry->GetUserData() );
}
Clear();
}
VCL_BUILDER_FACTORY_ARGS(DataTreeListBox, WB_BORDER)
XFormsPage::XFormsPage( vcl::Window* pParent, DataNavigatorWindow* _pNaviWin, DataGroupType _eGroup ) :
TabPage( pParent, "XFormsPage", "svx/ui/xformspage.ui" ),
m_pNaviWin ( _pNaviWin ),
m_bHasModel ( false ),
m_eGroup ( _eGroup ),
m_bLinkOnce ( false )
{
get(m_pToolBox, "toolbar");
get(m_pItemList, "items");
Size aSize(LogicToPixel(Size(63, 100), MapMode(MapUnit::MapAppFont)));
m_pItemList->set_width_request(aSize.Width());
m_pItemList->set_height_request(aSize.Height());
m_pItemList->SetGroup(_eGroup);
m_pItemList->SetXFormsPage( this );
m_nAddId = m_pToolBox->GetItemId("TBI_ITEM_ADD");
m_nAddElementId = m_pToolBox->GetItemId("TBI_ITEM_ADD_ELEMENT");
m_nAddAttributeId = m_pToolBox->GetItemId("TBI_ITEM_ADD_ATTRIBUTE");
m_nEditId = m_pToolBox->GetItemId("TBI_ITEM_EDIT");
m_nRemoveId = m_pToolBox->GetItemId("TBI_ITEM_REMOVE");
m_pItemList->SetToolBoxItemIds(m_nAddId, m_nAddElementId, m_nAddAttributeId, m_nEditId, m_nRemoveId);
m_pToolBox->InsertSeparator(4,5);
m_pToolBox->SetItemImage(m_nAddId, Image(StockImage::Yes, RID_SVXBMP_ADD));
m_pToolBox->SetItemImage(m_nAddElementId, Image(StockImage::Yes, RID_SVXBMP_ADD_ELEMENT));
m_pToolBox->SetItemImage(m_nAddAttributeId, Image(StockImage::Yes, RID_SVXBMP_ADD_ATTRIBUTE));
m_pToolBox->SetItemImage(m_nEditId, Image(StockImage::Yes, RID_SVXBMP_EDIT));
m_pToolBox->SetItemImage(m_nRemoveId, Image(StockImage::Yes, RID_SVXBMP_REMOVE));
if ( DGTInstance == m_eGroup )
m_pToolBox->RemoveItem( m_pToolBox->GetItemPos( m_nAddId ) );
else
{
m_pToolBox->RemoveItem( m_pToolBox->GetItemPos( m_nAddElementId ) );
m_pToolBox->RemoveItem( m_pToolBox->GetItemPos( m_nAddAttributeId ) );
if ( DGTSubmission == m_eGroup )
{
m_pToolBox->SetItemText( m_nAddId, SvxResId( RID_STR_DATANAV_ADD_SUBMISSION ) );
m_pToolBox->SetItemText( m_nEditId, SvxResId( RID_STR_DATANAV_EDIT_SUBMISSION ) );
m_pToolBox->SetItemText( m_nRemoveId, SvxResId( RID_STR_DATANAV_REMOVE_SUBMISSION ) );
}
else
{
m_pToolBox->SetItemText( m_nAddId, SvxResId( RID_STR_DATANAV_ADD_BINDING ) );
m_pToolBox->SetItemText( m_nEditId, SvxResId( RID_STR_DATANAV_EDIT_BINDING ) );
m_pToolBox->SetItemText( m_nRemoveId, SvxResId( RID_STR_DATANAV_REMOVE_BINDING ) );
}
}
const Size aTbxSz( m_pToolBox->CalcWindowSizePixel() );
m_pToolBox->SetSizePixel( aTbxSz );
m_pToolBox->SetOutStyle( SvtMiscOptions().GetToolboxStyle() );
m_pToolBox->SetSelectHdl( LINK( this, XFormsPage, TbxSelectHdl ) );
Point aPos = m_pItemList->GetPosPixel();
aPos.setY( aTbxSz.Height() );
m_pItemList->SetPosPixel( aPos );
m_pItemList->SetSelectHdl( LINK( this, XFormsPage, ItemSelectHdl ) );
m_pItemList->SetNodeDefaultImages();
WinBits nBits = WB_BORDER | WB_TABSTOP | WB_HIDESELECTION | WB_NOINITIALSELECTION;
if ( DGTInstance == m_eGroup || DGTSubmission == m_eGroup )
nBits |= WB_HASBUTTONS | WB_HASLINES | WB_HASLINESATROOT | WB_HASBUTTONSATROOT;
m_pItemList->SetStyle( m_pItemList->GetStyle() | nBits );
m_pItemList->Show();
ItemSelectHdl( m_pItemList );
}
XFormsPage::~XFormsPage()
{
disposeOnce();
}
void XFormsPage::dispose()
{
m_pToolBox.clear();
m_pItemList.clear();
m_pNaviWin.clear();
TabPage::dispose();
}
IMPL_LINK_NOARG(XFormsPage, TbxSelectHdl, ToolBox *, void)
{
DoToolBoxAction( m_pToolBox->GetCurItemId() );
}
IMPL_LINK_NOARG(XFormsPage, ItemSelectHdl, SvTreeListBox*, void)
{
EnableMenuItems( nullptr );
}
void XFormsPage::AddChildren(SvTreeListEntry* _pParent,
void XFormsPage::AddChildren(weld::TreeIter* _pParent,
const Reference< css::xml::dom::XNode >& _xNode)
{
DBG_ASSERT( m_xUIHelper.is(), "XFormsPage::AddChildren(): invalid UIHelper" );
@@ -416,49 +318,51 @@ namespace svxform
{
Reference< css::xml::dom::XNode > xChild = xNodeList->item(i);
css::xml::dom::NodeType eChildType = xChild->getNodeType();
Image aExpImg, aCollImg;
OUString aExpImg;
switch ( eChildType )
{
case css::xml::dom::NodeType_ATTRIBUTE_NODE:
aExpImg = aCollImg = Image(StockImage::Yes, RID_SVXBMP_ATTRIBUTE);
aExpImg = RID_SVXBMP_ATTRIBUTE;
break;
case css::xml::dom::NodeType_ELEMENT_NODE:
aExpImg = aCollImg = Image(StockImage::Yes, RID_SVXBMP_ELEMENT);
aExpImg = RID_SVXBMP_ELEMENT;
break;
case css::xml::dom::NodeType_TEXT_NODE:
aExpImg = aCollImg = Image(StockImage::Yes, RID_SVXBMP_TEXT);
aExpImg = RID_SVXBMP_TEXT;
break;
default:
aExpImg = aCollImg = Image(StockImage::Yes, RID_SVXBMP_OTHER);
aExpImg = RID_SVXBMP_OTHER;
}
OUString sName = m_xUIHelper->getNodeDisplayName( xChild, bShowDetails );
if ( !sName.isEmpty() )
{
ItemNode* pNode = new ItemNode( xChild );
SvTreeListEntry* pEntry = m_pItemList->InsertEntry(
sName, aExpImg, aCollImg, _pParent, false, TREELIST_APPEND, pNode );
OUString sId(OUString::number(reinterpret_cast<sal_uInt64>(pNode)));
std::unique_ptr<weld::TreeIter> xEntry = m_xItemList->make_iterator();
m_xItemList->insert(_pParent, -1, &sName, &sId, nullptr, nullptr, false, xEntry.get());
m_xItemList->set_image(*xEntry, aExpImg);
if ( xChild->hasAttributes() )
{
Reference< css::xml::dom::XNamedNodeMap > xMap = xChild->getAttributes();
if ( xMap.is() )
{
aExpImg = aCollImg = Image(StockImage::Yes, RID_SVXBMP_ATTRIBUTE);
aExpImg = RID_SVXBMP_ATTRIBUTE;
sal_Int32 j, nMapLen = xMap->getLength();
for ( j = 0; j < nMapLen; ++j )
{
Reference< css::xml::dom::XNode > xAttr = xMap->item(j);
pNode = new ItemNode( xAttr );
OUString sAttrName =
m_xUIHelper->getNodeDisplayName( xAttr, bShowDetails );
m_pItemList->InsertEntry(
sAttrName, aExpImg, aCollImg,
pEntry, false, TREELIST_APPEND, pNode );
OUString sSubId(OUString::number(reinterpret_cast<sal_uInt64>(pNode)));
OUString sAttrName = m_xUIHelper->getNodeDisplayName( xAttr, bShowDetails );
m_xItemList->insert(xEntry.get(), -1, &sAttrName, &sSubId, nullptr, nullptr, false, m_xScratchIter.get());
m_xItemList->set_image(*m_xScratchIter, aExpImg);
}
}
}
if ( xChild->hasChildNodes() )
AddChildren(pEntry, xChild);
AddChildren(xEntry.get(), xChild);
}
}
}
@@ -469,20 +373,20 @@ namespace svxform
}
}
bool XFormsPage::DoToolBoxAction( sal_uInt16 _nToolBoxID ) {
bool XFormsPage::DoToolBoxAction(const OString& rToolBoxID)
{
bool bHandled = false;
bool bIsDocModified = false;
m_pNaviWin->DisableNotify( true );
if(_nToolBoxID == m_nAddId || _nToolBoxID == m_nAddElementId || _nToolBoxID == m_nAddAttributeId)
if (rToolBoxID == "additem" || rToolBoxID == "addelement" || rToolBoxID == "addattribute")
{
bHandled = true;
Reference< css::xforms::XModel > xModel( m_xUIHelper, UNO_QUERY );
DBG_ASSERT( xModel.is(), "XFormsPage::DoToolBoxAction(): Action without model" );
if ( DGTSubmission == m_eGroup )
{
AddSubmissionDialog aDlg(GetFrameWeld(), nullptr, m_xUIHelper);
AddSubmissionDialog aDlg(m_pNaviWin->GetFrameWeld(), nullptr, m_xUIHelper);
if ( aDlg.run() == RET_OK && aDlg.GetNewSubmission().is() )
{
try
@@ -490,8 +394,8 @@ namespace svxform
Reference< css::xforms::XSubmission > xNewSubmission = aDlg.GetNewSubmission();
Reference< XSet > xSubmissions = xModel->getSubmissions();
xSubmissions->insert( makeAny( xNewSubmission ) );
SvTreeListEntry* pEntry = AddEntry( xNewSubmission );
m_pItemList->Select( pEntry );
AddEntry(xNewSubmission, m_xScratchIter.get());
m_xItemList->select(*m_xScratchIter);
bIsDocModified = true;
}
catch ( Exception const & )
@@ -503,7 +407,10 @@ namespace svxform
else
{
DataItemType eType = DITElement;
SvTreeListEntry* pEntry = m_pItemList->FirstSelected();
std::unique_ptr<weld::TreeIter> xEntry(m_xItemList->make_iterator());
bool bEntry = m_xItemList->get_selected(xEntry.get());
std::unique_ptr<ItemNode> pNode;
Reference< css::xml::dom::XNode > xParentNode;
Reference< XPropertySet > xNewBinding;
@@ -513,17 +420,17 @@ namespace svxform
{
if ( !m_sInstanceURL.isEmpty() )
{
LinkedInstanceWarningBox aMsgBox(GetFrameWeld());
LinkedInstanceWarningBox aMsgBox(m_pNaviWin->GetFrameWeld());
if (aMsgBox.run() != RET_OK)
return bHandled;
}
DBG_ASSERT( pEntry, "XFormsPage::DoToolBoxAction(): no entry" );
ItemNode* pParentNode = static_cast< ItemNode* >( pEntry->GetUserData() );
DBG_ASSERT( bEntry, "XFormsPage::DoToolBoxAction(): no entry" );
ItemNode* pParentNode = reinterpret_cast<ItemNode*>(m_xItemList->get_id(*xEntry).toInt64());
DBG_ASSERT( pParentNode, "XFormsPage::DoToolBoxAction(): no parent node" );
xParentNode = pParentNode->m_xNode;
Reference< css::xml::dom::XNode > xNewNode;
if ( m_nAddElementId == _nToolBoxID )
if (rToolBoxID == "addelement")
{
try
{
@@ -565,7 +472,7 @@ namespace svxform
if ( xNewNode.is() )
xPNode = xNewNode->getParentNode();
// attributes don't have parents in the DOM model
DBG_ASSERT( m_nAddAttributeId == _nToolBoxID
DBG_ASSERT( rToolBoxID == "addattribute"
|| xPNode.is(), "XFormsPage::DoToolboxAction(): node not added" );
}
catch ( Exception const & )
@@ -600,7 +507,7 @@ namespace svxform
}
}
AddDataItemDialog aDlg(GetFrameWeld(), pNode.get(), m_xUIHelper);
AddDataItemDialog aDlg(m_pNaviWin->GetFrameWeld(), pNode.get(), m_xUIHelper);
aDlg.set_title(SvxResId(pResId));
aDlg.InitText( eType );
short nReturn = aDlg.run();
@@ -608,9 +515,9 @@ namespace svxform
{
if ( RET_OK == nReturn )
{
SvTreeListEntry* pNewEntry = AddEntry( std::move(pNode), bIsElement );
m_pItemList->MakeVisible( pNewEntry );
m_pItemList->Select( pNewEntry );
AddEntry( std::move(pNode), bIsElement, m_xScratchIter.get());
m_xItemList->scroll_to_row(*m_xScratchIter);
m_xItemList->select(*m_xScratchIter);
bIsDocModified = true;
}
else
@@ -634,8 +541,8 @@ namespace svxform
{
if ( RET_OK == nReturn )
{
SvTreeListEntry* pNewEntry = AddEntry( xNewBinding );
m_pItemList->Select( pNewEntry );
AddEntry(xNewBinding, m_xScratchIter.get());
m_xItemList->select(*m_xScratchIter);
bIsDocModified = true;
}
else
@@ -653,25 +560,29 @@ namespace svxform
}
}
}
else if(_nToolBoxID == m_nEditId)
else if (rToolBoxID == "edit")
{
bHandled = true;
SvTreeListEntry* pEntry = m_pItemList->FirstSelected();
if ( pEntry )
std::unique_ptr<weld::TreeIter> xEntry(m_xItemList->make_iterator());
bool bEntry = m_xItemList->get_selected(xEntry.get());
if ( bEntry )
{
if ( DGTSubmission == m_eGroup && m_pItemList->GetParent( pEntry ) )
pEntry = m_pItemList->GetParent( pEntry );
ItemNode* pNode = static_cast< ItemNode* >( pEntry->GetUserData() );
if ( DGTSubmission == m_eGroup && m_xItemList->get_iter_depth(*xEntry) )
{
m_xItemList->iter_parent(*xEntry);
}
ItemNode* pNode = reinterpret_cast<ItemNode*>(m_xItemList->get_id(*xEntry).toInt64());
if ( DGTInstance == m_eGroup || DGTBinding == m_eGroup )
{
if ( DGTInstance == m_eGroup && !m_sInstanceURL.isEmpty() )
{
LinkedInstanceWarningBox aMsgBox(GetFrameWeld());
LinkedInstanceWarningBox aMsgBox(m_pNaviWin->GetFrameWeld());
if (aMsgBox.run() != RET_OK)
return bHandled;
}
AddDataItemDialog aDlg(GetFrameWeld(), pNode, m_xUIHelper);
AddDataItemDialog aDlg(m_pNaviWin->GetFrameWeld(), pNode, m_xUIHelper);
DataItemType eType = DITElement;
const char* pResId = RID_STR_DATANAV_EDIT_ELEMENT;
if ( pNode && pNode->m_xNode.is() )
@@ -729,13 +640,13 @@ namespace svxform
}
}
m_pItemList->SetEntryText( pEntry, sNewName );
m_xItemList->set_text(*xEntry, sNewName);
bIsDocModified = true;
}
}
else
{
AddSubmissionDialog aDlg(GetFrameWeld(), pNode, m_xUIHelper);
AddSubmissionDialog aDlg(m_pNaviWin->GetFrameWeld(), pNode, m_xUIHelper);
aDlg.set_title(SvxResId(RID_STR_DATANAV_EDIT_SUBMISSION));
if (aDlg.run() == RET_OK)
{
@@ -745,12 +656,12 @@ namespace svxform
}
}
}
else if(_nToolBoxID == m_nRemoveId)
else if (rToolBoxID == "delete")
{
bHandled = true;
if ( DGTInstance == m_eGroup && !m_sInstanceURL.isEmpty() )
{
LinkedInstanceWarningBox aMsgBox(GetFrameWeld());
LinkedInstanceWarningBox aMsgBox(m_pNaviWin->GetFrameWeld());
if (aMsgBox.run() != RET_OK)
return bHandled;
}
@@ -768,10 +679,15 @@ namespace svxform
return bHandled;
}
SvTreeListEntry* XFormsPage::AddEntry( std::unique_ptr<ItemNode> _pNewNode, bool _bIsElement )
void XFormsPage::AddEntry(std::unique_ptr<ItemNode> _pNewNode, bool _bIsElement, weld::TreeIter* pRet)
{
SvTreeListEntry* pParent = m_pItemList->FirstSelected();
Image aImage(StockImage::Yes, _bIsElement ? OUString(RID_SVXBMP_ELEMENT) : OUString(RID_SVXBMP_ATTRIBUTE));
if (!pRet)
pRet = m_xScratchIter.get();
std::unique_ptr<weld::TreeIter> xParent(m_xItemList->make_iterator());
if (!m_xItemList->get_selected(xParent.get()))
xParent.reset();
OUString aImage(_bIsElement ? OUString(RID_SVXBMP_ELEMENT) : OUString(RID_SVXBMP_ATTRIBUTE));
OUString sName;
try
{
@@ -782,14 +698,19 @@ namespace svxform
{
DBG_UNHANDLED_EXCEPTION("svx");
}
return m_pItemList->InsertEntry(
sName, aImage, aImage, pParent, false, TREELIST_APPEND, _pNewNode.release() );
OUString sId(OUString::number(reinterpret_cast<sal_uInt64>(_pNewNode.release())));
m_xItemList->insert(xParent.get(), -1, &sName, &sId, nullptr, nullptr, false, pRet);
m_xItemList->set_image(*pRet, aImage);
if (xParent && !m_xItemList->get_row_expanded(*xParent) && m_xItemList->iter_has_child(*xParent))
m_xItemList->expand_row(*xParent);
}
SvTreeListEntry* XFormsPage::AddEntry( const Reference< XPropertySet >& _rEntry )
void XFormsPage::AddEntry(const Reference< XPropertySet >& _rEntry, weld::TreeIter* pRet)
{
SvTreeListEntry* pEntry = nullptr;
Image aImage(StockImage::Yes, RID_SVXBMP_ELEMENT);
if (!pRet)
pRet = m_xScratchIter.get();
OUString aImage(RID_SVXBMP_ELEMENT);
ItemNode* pNode = new ItemNode( _rEntry );
OUString sTemp;
@@ -800,29 +721,37 @@ namespace svxform
{
// ID
_rEntry->getPropertyValue( PN_SUBMISSION_ID ) >>= sTemp;
pEntry = m_pItemList->InsertEntry( sTemp, aImage, aImage, nullptr, false, TREELIST_APPEND, pNode );
OUString sId(OUString::number(reinterpret_cast<sal_uInt64>(pNode)));
m_xItemList->insert(nullptr, -1, &sTemp, &sId, nullptr, nullptr, false, pRet);
m_xItemList->set_image(*pRet, aImage);
std::unique_ptr<weld::TreeIter> xRes(m_xItemList->make_iterator());
// Action
_rEntry->getPropertyValue( PN_SUBMISSION_ACTION ) >>= sTemp;
OUString sEntry = SvxResId( RID_STR_DATANAV_SUBM_ACTION ) + sTemp;
m_pItemList->InsertEntry( sEntry, aImage, aImage, pEntry );
m_xItemList->insert(pRet, -1, &sEntry, nullptr, nullptr, nullptr, false, xRes.get());
m_xItemList->set_image(*xRes, aImage);
// Method
_rEntry->getPropertyValue( PN_SUBMISSION_METHOD ) >>= sTemp;
sEntry = SvxResId( RID_STR_DATANAV_SUBM_METHOD ) +
m_aMethodString.toUI( sTemp );
m_pItemList->InsertEntry( sEntry, aImage, aImage, pEntry );
m_xItemList->insert(pRet, -1, &sEntry, nullptr, nullptr, nullptr, false, xRes.get());
m_xItemList->set_image(*xRes, aImage);
// Ref
_rEntry->getPropertyValue( PN_SUBMISSION_REF ) >>= sTemp;
sEntry = SvxResId( RID_STR_DATANAV_SUBM_REF ) + sTemp;
m_pItemList->InsertEntry( sEntry, aImage, aImage, pEntry );
m_xItemList->insert(pRet, -1, &sEntry, nullptr, nullptr, nullptr, false, xRes.get());
m_xItemList->set_image(*xRes, aImage);
// Bind
_rEntry->getPropertyValue( PN_SUBMISSION_BIND ) >>= sTemp;
sEntry = SvxResId( RID_STR_DATANAV_SUBM_BIND ) + sTemp;
m_pItemList->InsertEntry( sEntry, aImage, aImage, pEntry );
m_xItemList->insert(pRet, -1, &sEntry, nullptr, nullptr, nullptr, false, xRes.get());
m_xItemList->set_image(*xRes, aImage);
// Replace
_rEntry->getPropertyValue( PN_SUBMISSION_REPLACE ) >>= sTemp;
sEntry = SvxResId( RID_STR_DATANAV_SUBM_REPLACE ) +
m_aReplaceString.toUI( sTemp );
m_pItemList->InsertEntry( sEntry, aImage, aImage, pEntry );
m_xItemList->insert(pRet, -1, &sEntry, nullptr, nullptr, nullptr, false, xRes.get());
m_xItemList->set_image(*xRes, aImage);
}
catch ( Exception const & )
{
@@ -838,19 +767,18 @@ namespace svxform
sName += sTemp + ": ";
_rEntry->getPropertyValue( PN_BINDING_EXPR ) >>= sTemp;
sName += sTemp;
pEntry = m_pItemList->InsertEntry(
sName, aImage, aImage, nullptr, false, TREELIST_APPEND, pNode );
OUString sId(OUString::number(reinterpret_cast<sal_uInt64>(pNode)));
m_xItemList->insert(nullptr, -1, &sName, &sId, nullptr, nullptr, false, pRet);
m_xItemList->set_image(*pRet, aImage);
}
catch ( Exception const & )
{
TOOLS_WARN_EXCEPTION( "svx.form", "XFormsPage::AddEntry(Ref)" );
}
}
return pEntry;
}
void XFormsPage::EditEntry( const Reference< XPropertySet >& _rEntry )
{
OUString sTemp;
@@ -859,42 +787,39 @@ namespace svxform
{
try
{
SvTreeListEntry* pEntry = m_pItemList->FirstSelected();
std::unique_ptr<weld::TreeIter> xEntry(m_xItemList->make_iterator());
m_xItemList->get_selected(xEntry.get());
// #i36262# may be called for submission entry *or* for
// submission children. If we don't have any children, we
// assume the latter case and use the parent
if( m_pItemList->GetEntry( pEntry, 0 ) == nullptr )
{
pEntry = m_pItemList->GetModel()->GetParent( pEntry );
}
if (!m_xItemList->iter_has_child(*xEntry))
m_xItemList->iter_parent(*xEntry);
_rEntry->getPropertyValue( PN_SUBMISSION_ID ) >>= sTemp;
m_pItemList->SetEntryText( pEntry, sTemp );
m_xItemList->set_text(*xEntry, sTemp);
_rEntry->getPropertyValue( PN_SUBMISSION_BIND ) >>= sTemp;
OUString sEntry = SvxResId( RID_STR_DATANAV_SUBM_BIND ) + sTemp;
sal_uLong nPos = 0;
SvTreeListEntry* pChild = m_pItemList->GetEntry( pEntry, nPos++ );
m_pItemList->SetEntryText( pChild, sEntry );
m_xItemList->iter_children(*xEntry);
m_xItemList->set_text(*xEntry, sEntry);
_rEntry->getPropertyValue( PN_SUBMISSION_REF ) >>= sTemp;
sEntry = SvxResId( RID_STR_DATANAV_SUBM_REF ) + sTemp;
pChild = m_pItemList->GetEntry( pEntry, nPos++ );
m_pItemList->SetEntryText( pChild, sEntry );
m_xItemList->iter_next_sibling(*xEntry);
m_xItemList->set_text(*xEntry, sEntry);
_rEntry->getPropertyValue( PN_SUBMISSION_ACTION ) >>= sTemp;
sEntry = SvxResId( RID_STR_DATANAV_SUBM_ACTION ) + sTemp;
pChild = m_pItemList->GetEntry( pEntry, nPos++ );
m_pItemList->SetEntryText( pChild, sEntry );
m_xItemList->iter_next_sibling(*xEntry);
_rEntry->getPropertyValue( PN_SUBMISSION_METHOD ) >>= sTemp;
sEntry = SvxResId( RID_STR_DATANAV_SUBM_METHOD ) +
m_aMethodString.toUI( sTemp );
pChild = m_pItemList->GetEntry( pEntry, nPos++ );
m_pItemList->SetEntryText( pChild, sEntry );
m_xItemList->iter_next_sibling(*xEntry);
m_xItemList->set_text(*xEntry, sEntry);
_rEntry->getPropertyValue( PN_SUBMISSION_REPLACE ) >>= sTemp;
sEntry = SvxResId( RID_STR_DATANAV_SUBM_REPLACE ) +
m_aReplaceString.toUI( sTemp );
pChild = m_pItemList->GetEntry( pEntry, nPos++ );
m_pItemList->SetEntryText( pChild, sEntry );
m_xItemList->iter_next_sibling(*xEntry);
m_xItemList->set_text(*xEntry, sEntry);
}
catch ( Exception const & )
{
@@ -903,17 +828,18 @@ namespace svxform
}
}
bool XFormsPage::RemoveEntry()
{
bool bRet = false;
SvTreeListEntry* pEntry = m_pItemList->FirstSelected();
if ( pEntry &&
( DGTInstance != m_eGroup || m_pItemList->GetParent( pEntry ) ) )
std::unique_ptr<weld::TreeIter> xEntry(m_xItemList->make_iterator());
bool bEntry = m_xItemList->get_selected(xEntry.get());
if ( bEntry &&
( DGTInstance != m_eGroup || m_xItemList->get_iter_depth(*xEntry) ) )
{
Reference< css::xforms::XModel > xModel( m_xUIHelper, UNO_QUERY );
DBG_ASSERT( xModel.is(), "XFormsPage::RemoveEntry(): no model" );
ItemNode* pNode = static_cast< ItemNode* >( pEntry->GetUserData() );
ItemNode* pNode = reinterpret_cast<ItemNode*>(m_xItemList->get_id(*xEntry).toInt64());
DBG_ASSERT( pNode, "XFormsPage::RemoveEntry(): no node" );
if ( DGTInstance == m_eGroup )
@@ -925,7 +851,7 @@ namespace svxform
bool bIsElement = ( eChildType == css::xml::dom::NodeType_ELEMENT_NODE );
const char* pResId = bIsElement ? RID_STR_QRY_REMOVE_ELEMENT : RID_STR_QRY_REMOVE_ATTRIBUTE;
OUString sVar = bIsElement ? OUString(ELEMENTNAME) : OUString(ATTRIBUTENAME);
std::unique_ptr<weld::MessageDialog> xQBox(Application::CreateMessageDialog(GetFrameWeld(),
std::unique_ptr<weld::MessageDialog> xQBox(Application::CreateMessageDialog(m_pNaviWin->GetFrameWeld(),
VclMessageType::Question, VclButtonsType::YesNo,
SvxResId(pResId)));
OUString sMessText = xQBox->get_primary_text();
@@ -934,9 +860,10 @@ namespace svxform
xQBox->set_primary_text(sMessText);
if (xQBox->run() == RET_YES)
{
SvTreeListEntry* pParent = m_pItemList->GetParent( pEntry );
DBG_ASSERT( pParent, "XFormsPage::RemoveEntry(): no parent entry" );
ItemNode* pParentNode = static_cast< ItemNode* >( pParent->GetUserData() );
std::unique_ptr<weld::TreeIter> xParent(m_xItemList->make_iterator(xEntry.get()));
bool bParent = m_xItemList->iter_parent(*xParent); (void)bParent;
assert(bParent && "XFormsPage::RemoveEntry(): no parent entry");
ItemNode* pParentNode = reinterpret_cast<ItemNode*>((m_xItemList->get_id(*xParent).toInt64()));
DBG_ASSERT( pParentNode && pParentNode->m_xNode.is(), "XFormsPage::RemoveEntry(): no parent XNode" );
Reference< css::xml::dom::XNode > xPNode;
@@ -969,7 +896,7 @@ namespace svxform
{
TOOLS_WARN_EXCEPTION( "svx.form", "XFormsPage::RemoveEntry()" );
}
std::unique_ptr<weld::MessageDialog> xQBox(Application::CreateMessageDialog(GetFrameWeld(),
std::unique_ptr<weld::MessageDialog> xQBox(Application::CreateMessageDialog(m_pNaviWin->GetFrameWeld(),
VclMessageType::Question, VclButtonsType::YesNo,
SvxResId(pResId)));
OUString sMessText = xQBox->get_primary_text();
@@ -992,45 +919,28 @@ namespace svxform
}
}
if ( bRet )
m_pItemList->RemoveEntry( pEntry );
if (bRet)
{
m_xItemList->remove(*xEntry);
delete pNode;
}
}
return bRet;
}
bool XFormsPage::EventNotify( NotifyEvent& rNEvt )
IMPL_LINK(XFormsPage, KeyInputHdl, const KeyEvent&, rKEvt, bool)
{
bool bHandled = false;
if ( rNEvt.GetType() == MouseNotifyEvent::KEYINPUT )
{
sal_uInt16 nCode = rNEvt.GetKeyEvent()->GetKeyCode().GetCode();
sal_uInt16 nCode = rKEvt.GetKeyCode().GetCode();
if (nCode == KEY_DELETE)
bHandled = DoMenuAction("delete");
switch ( nCode )
{
case KEY_DELETE:
bHandled = DoMenuAction( m_nRemoveId );
break;
}
}
return bHandled || Window::EventNotify( rNEvt );
return bHandled;
}
void XFormsPage::Resize()
{
Size aSize = GetOutputSizePixel();
Size aTbxSize = m_pToolBox->GetSizePixel();
aTbxSize.setWidth( aSize.Width() );
m_pToolBox->SetSizePixel( aTbxSize );
aSize.AdjustWidth( -4 );
aSize.AdjustHeight( -( 4 + aTbxSize.Height() ) );
m_pItemList->SetPosSizePixel( Point( 2, 2 + aTbxSize.Height() ), aSize );
}
OUString XFormsPage::SetModel( const Reference< css::xforms::XModel >& _xModel, sal_uInt16 _nPagePos )
OUString XFormsPage::SetModel( const Reference< css::xforms::XModel >& _xModel, int _nPagePos )
{
DBG_ASSERT( _xModel.is(), "XFormsPage::SetModel(): invalid model" );
@@ -1042,7 +952,7 @@ namespace svxform
{
case DGTInstance :
{
DBG_ASSERT( _nPagePos != TAB_PAGE_NOTFOUND, "XFormsPage::SetModel(): invalid page position" );
DBG_ASSERT( _nPagePos != -1, "XFormsPage::SetModel(): invalid page position" );
try
{
Reference< XContainer > xContainer( _xModel->getInstances(), UNO_QUERY );
@@ -1055,7 +965,7 @@ namespace svxform
Reference < XEnumeration > xNum = xNumAccess->createEnumeration();
if ( xNum.is() && xNum->hasMoreElements() )
{
sal_uInt16 nIter = 0;
int nIter = 0;
while ( xNum->hasMoreElements() )
{
if ( nIter == _nPagePos )
@@ -1088,7 +998,7 @@ namespace svxform
case DGTSubmission :
{
DBG_ASSERT( TAB_PAGE_NOTFOUND == _nPagePos, "XFormsPage::SetModel(): invalid page position" );
DBG_ASSERT( _nPagePos == -1, "XFormsPage::SetModel(): invalid page position" );
try
{
Reference< XContainer > xContainer( _xModel->getSubmissions(), UNO_QUERY );
@@ -1120,7 +1030,7 @@ namespace svxform
case DGTBinding :
{
DBG_ASSERT( TAB_PAGE_NOTFOUND == _nPagePos, "XFormsPage::SetModel(): invalid page position" );
DBG_ASSERT( _nPagePos == -1, "XFormsPage::SetModel(): invalid page position" );
try
{
Reference< XContainer > xContainer( _xModel->getBindings(), UNO_QUERY );
@@ -1133,7 +1043,8 @@ namespace svxform
Reference < XEnumeration > xNum = xNumAccess->createEnumeration();
if ( xNum.is() && xNum->hasMoreElements() )
{
Image aImage(StockImage::Yes, RID_SVXBMP_ELEMENT);
OUString aImage(RID_SVXBMP_ELEMENT);
std::unique_ptr<weld::TreeIter> xRes(m_xItemList->make_iterator());
while ( xNum->hasMoreElements() )
{
Reference< XPropertySet > xPropSet;
@@ -1148,8 +1059,10 @@ namespace svxform
sEntry += sTemp;
ItemNode* pNode = new ItemNode( xPropSet );
m_pItemList->InsertEntry(
sEntry, aImage, aImage, nullptr, false, TREELIST_APPEND, pNode );
OUString sId(OUString::number(reinterpret_cast<sal_uInt64>(pNode)));
m_xItemList->insert(nullptr, -1, &sEntry, &sId, nullptr, nullptr, false, xRes.get());
m_xItemList->set_image(*xRes, aImage);
}
}
}
@@ -1174,7 +1087,7 @@ namespace svxform
void XFormsPage::ClearModel()
{
m_bHasModel = false;
m_pItemList->DeleteAndClear();
DeleteAndClearTree();
}
OUString XFormsPage::LoadInstance(const Sequence< PropertyValue >& _xPropSeq)
@@ -1219,35 +1132,34 @@ namespace svxform
return sRet;
}
bool XFormsPage::DoMenuAction( sal_uInt16 _nMenuID )
bool XFormsPage::DoMenuAction(const OString& rMenuID)
{
return DoToolBoxAction( _nMenuID );
return DoToolBoxAction(rMenuID);
}
void XFormsPage::EnableMenuItems( Menu* _pMenu )
void XFormsPage::EnableMenuItems(weld::Menu* pMenu)
{
bool bEnableAdd = false;
bool bEnableEdit = false;
bool bEnableRemove = false;
SvTreeListEntry* pEntry = m_pItemList->FirstSelected();
if ( pEntry )
std::unique_ptr<weld::TreeIter> xEntry(m_xItemList->make_iterator());
bool bEntry = m_xItemList->get_selected(xEntry.get());
if (bEntry)
{
bEnableAdd = true;
bool bSubmitChild = false;
if ( DGTSubmission == m_eGroup && m_pItemList->GetParent( pEntry ) )
if (DGTSubmission == m_eGroup && m_xItemList->get_iter_depth(*xEntry))
{
pEntry = m_pItemList->GetParent( pEntry );
m_xItemList->iter_parent(*xEntry);
bSubmitChild = true;
}
ItemNode* pNode = static_cast< ItemNode* >( pEntry->GetUserData() );
ItemNode* pNode = reinterpret_cast<ItemNode*>(m_xItemList->get_id(*xEntry).toInt64());
if ( pNode && ( pNode->m_xNode.is() || pNode->m_xPropSet.is() ) )
{
bEnableEdit = true;
bEnableRemove = !bSubmitChild;
if ( DGTInstance == m_eGroup && !m_pItemList->GetParent( pEntry ) )
if ( DGTInstance == m_eGroup && !m_xItemList->get_iter_depth(*xEntry) )
bEnableRemove = false;
if ( pNode->m_xNode.is() )
{
@@ -1270,27 +1182,27 @@ namespace svxform
else if ( m_eGroup != DGTInstance )
bEnableAdd = true;
m_pToolBox->EnableItem( m_nAddId, bEnableAdd );
m_pToolBox->EnableItem( m_nAddElementId, bEnableAdd );
m_pToolBox->EnableItem( m_nAddAttributeId, bEnableAdd );
m_pToolBox->EnableItem( m_nEditId, bEnableEdit );
m_pToolBox->EnableItem( m_nRemoveId, bEnableRemove );
m_xToolBox->set_item_sensitive("additem", bEnableAdd);
m_xToolBox->set_item_sensitive("addelement", bEnableAdd);
m_xToolBox->set_item_sensitive("addattribute", bEnableAdd);
m_xToolBox->set_item_sensitive("edit", bEnableEdit);
m_xToolBox->set_item_sensitive("delete", bEnableRemove);
if ( _pMenu )
if (pMenu)
{
_pMenu->EnableItem(_pMenu->GetItemId("additem"), bEnableAdd);
_pMenu->EnableItem(_pMenu->GetItemId("addelement"), bEnableAdd);
_pMenu->EnableItem(_pMenu->GetItemId("addattribute"), bEnableAdd);
_pMenu->EnableItem(_pMenu->GetItemId("edit"), bEnableEdit);
_pMenu->EnableItem(_pMenu->GetItemId("delete"), bEnableRemove);
pMenu->set_sensitive("additem", bEnableAdd);
pMenu->set_sensitive("addelement", bEnableAdd);
pMenu->set_sensitive("addattribute", bEnableAdd);
pMenu->set_sensitive("edit", bEnableEdit);
pMenu->set_sensitive("delete", bEnableRemove);
}
if ( DGTInstance == m_eGroup )
{
const char* pResId1 = RID_STR_DATANAV_EDIT_ELEMENT;
const char* pResId2 = RID_STR_DATANAV_REMOVE_ELEMENT;
if ( pEntry )
if (bEntry)
{
ItemNode* pNode = static_cast< ItemNode* >( pEntry->GetUserData() );
ItemNode* pNode = reinterpret_cast<ItemNode*>(m_xItemList->get_id(*xEntry).toInt64());
if ( pNode && pNode->m_xNode.is() )
{
try
@@ -1308,61 +1220,54 @@ namespace svxform
}
}
}
m_pToolBox->SetItemText( m_nEditId, SvxResId( pResId1 ) );
m_pToolBox->SetItemText( m_nRemoveId, SvxResId( pResId2 ) );
if ( _pMenu )
m_xToolBox->set_item_label("edit", SvxResId(pResId1));
m_xToolBox->set_item_label("delete", SvxResId(pResId2));
if (pMenu)
{
_pMenu->SetItemText(_pMenu->GetItemId("edit"), SvxResId( pResId1 ) );
_pMenu->SetItemText(_pMenu->GetItemId("delete"), SvxResId( pResId2 ) );
pMenu->set_label("edit", SvxResId( pResId1 ) );
pMenu->set_label("delete", SvxResId( pResId2 ) );
}
}
}
DataNavigatorWindow::DataNavigatorWindow(vcl::Window* pParent, SfxBindings const * pBindings)
: Window(pParent)
, m_pInstPage(nullptr)
, m_pSubmissionPage(nullptr)
, m_pBindingPage(nullptr)
, m_nLastSelectedPos(LISTBOX_ENTRY_NOTFOUND)
DataNavigatorWindow::DataNavigatorWindow(vcl::Window* pParent, weld::Builder& rBuilder, SfxBindings const * pBindings)
: m_xParent(pParent)
, m_xModelsBox(rBuilder.weld_combo_box("modelslist"))
, m_xModelBtn(rBuilder.weld_menu_button("modelsbutton"))
, m_xTabCtrl(rBuilder.weld_notebook("tabcontrol"))
, m_xInstanceBtn(rBuilder.weld_menu_button("instances"))
, m_nLastSelectedPos(-1)
, m_bShowDetails(false)
, m_bIsNotifyDisabled(false)
, m_xDataListener(new DataListener(this))
{
m_pUIBuilder.reset(new VclBuilder(this, getUIRootDir(), "svx/ui/datanavigator.ui", "DataNavigator"));
get(m_pModelsBox, "modelslist");
get(m_pModelBtn, "modelsbutton");
get(m_pTabCtrl, "tabcontrol");
get(m_pInstanceBtn, "instances");
// handler
m_pModelsBox->SetSelectHdl( LINK( this, DataNavigatorWindow, ModelSelectListBoxHdl ) );
Link<MenuButton *, void> aLink1 = LINK( this, DataNavigatorWindow, MenuSelectHdl );
m_pModelBtn->SetSelectHdl( aLink1 );
m_pInstanceBtn->SetSelectHdl( aLink1 );
Link<MenuButton*,void> aLink2 = LINK( this, DataNavigatorWindow, MenuActivateHdl );
m_pModelBtn->SetActivateHdl( aLink2 );
m_pInstanceBtn->SetActivateHdl( aLink2 );
m_pTabCtrl->SetActivatePageHdl( LINK( this, DataNavigatorWindow, ActivatePageHdl ) );
m_xModelsBox->connect_changed( LINK( this, DataNavigatorWindow, ModelSelectListBoxHdl ) );
Link<const OString&, void> aLink1 = LINK( this, DataNavigatorWindow, MenuSelectHdl );
m_xModelBtn->connect_selected(aLink1);
m_xInstanceBtn->connect_selected(aLink1);
Link<weld::ToggleButton&,void> aLink2 = LINK( this, DataNavigatorWindow, MenuActivateHdl );
m_xModelBtn->connect_toggled( aLink2 );
m_xInstanceBtn->connect_toggled( aLink2 );
m_xTabCtrl->connect_enter_page( LINK( this, DataNavigatorWindow, ActivatePageHdl ) );
m_aUpdateTimer.SetTimeout( 2000 );
m_aUpdateTimer.SetInvokeHandler( LINK( this, DataNavigatorWindow, UpdateHdl ) );
// init tabcontrol
m_pTabCtrl->Show();
OString sPageId("instance");
SvtViewOptions aViewOpt( EViewType::TabDialog, CFGNAME_DATANAVIGATOR );
if ( aViewOpt.Exists() )
{
sPageId = aViewOpt.GetPageID();
OString sNewPageId = aViewOpt.GetPageID();
if (m_xTabCtrl->get_page_index(sNewPageId) != -1)
sPageId = sNewPageId;
aViewOpt.GetUserItem(CFGNAME_SHOWDETAILS) >>= m_bShowDetails;
}
Menu* pMenu = m_pInstanceBtn->GetPopupMenu();
sal_uInt16 nInstancesDetailsId = pMenu->GetItemId("instancesdetails");
pMenu->SetItemBits(nInstancesDetailsId, MenuItemBits::CHECKABLE );
pMenu->CheckItem(nInstancesDetailsId, m_bShowDetails );
m_xInstanceBtn->set_item_active("instancesdetails", m_bShowDetails);
m_pTabCtrl->SetCurPageId(m_pTabCtrl->GetPageId(sPageId));
ActivatePageHdl(m_pTabCtrl);
m_xTabCtrl->set_current_page(sPageId);
ActivatePageHdl(sPageId);
// get our frame
DBG_ASSERT( pBindings != nullptr,
@@ -1380,22 +1285,17 @@ namespace svxform
DataNavigatorWindow::~DataNavigatorWindow()
{
disposeOnce();
}
void DataNavigatorWindow::dispose()
{
SvtViewOptions aViewOpt( EViewType::TabDialog, CFGNAME_DATANAVIGATOR );
aViewOpt.SetPageID(m_pTabCtrl->GetPageName(m_pTabCtrl->GetCurPageId()));
aViewOpt.SetPageID(m_xTabCtrl->get_current_page_ident());
aViewOpt.SetUserItem(CFGNAME_SHOWDETAILS, Any(m_bShowDetails));
m_pInstPage.disposeAndClear();
m_pSubmissionPage.disposeAndClear();
m_pBindingPage.disposeAndClear();
m_xInstPage.reset();
m_xSubmissionPage.reset();
m_xBindingPage.reset();
sal_Int32 i, nCount = m_aPageList.size();
for ( i = 0; i < nCount; ++i )
m_aPageList[i].disposeAndClear();
m_aPageList[i].reset();
m_aPageList.clear();
Reference< XFrameActionListener > xListener(
@@ -1403,38 +1303,32 @@ namespace svxform
m_xFrame->removeFrameActionListener( xListener );
RemoveBroadcaster();
m_xDataListener.clear();
disposeBuilder();
m_pModelsBox.clear();
m_pModelBtn.clear();
m_pTabCtrl.clear();
m_pInstanceBtn.clear();
vcl::Window::dispose();
}
IMPL_LINK( DataNavigatorWindow, ModelSelectListBoxHdl, ListBox&, rBox, void )
IMPL_LINK( DataNavigatorWindow, ModelSelectListBoxHdl, weld::ComboBox&, rBox, void )
{
ModelSelectHdl(&rBox);
}
void DataNavigatorWindow::ModelSelectHdl(ListBox const * pBox)
void DataNavigatorWindow::ModelSelectHdl(const weld::ComboBox* pBox)
{
sal_Int32 nPos = m_pModelsBox->GetSelectedEntryPos();
sal_Int32 nPos = m_xModelsBox->get_active();
// pBox == NULL, if you want to force a new fill.
if ( nPos != m_nLastSelectedPos || !pBox )
{
m_nLastSelectedPos = nPos;
ClearAllPageModels( pBox != nullptr );
InitPages();
SetPageModel();
SetPageModel(GetCurrentPage());
}
}
IMPL_LINK( DataNavigatorWindow, MenuSelectHdl, MenuButton *, pBtn, void )
IMPL_LINK(DataNavigatorWindow, MenuSelectHdl, const OString&, rIdent, void)
{
bool bIsDocModified = false;
Reference< css::xforms::XFormsUIHelper1 > xUIHelper;
sal_Int32 nSelectedPos = m_pModelsBox->GetSelectedEntryPos();
OUString sSelectedModel( m_pModelsBox->GetEntry( nSelectedPos ) );
sal_Int32 nSelectedPos = m_xModelsBox->get_active();
OUString sSelectedModel(m_xModelsBox->get_text(nSelectedPos));
Reference< css::xforms::XModel > xModel;
try
{
@@ -1450,105 +1344,42 @@ namespace svxform
m_bIsNotifyDisabled = true;
if (m_pModelBtn == pBtn)
if (rIdent == "modelsadd")
{
OString sIdent(pBtn->GetCurItemIdent());
if (sIdent == "modelsadd")
AddModelDialog aDlg(GetFrameWeld(), false);
bool bShowDialog = true;
while ( bShowDialog )
{
AddModelDialog aDlg(GetFrameWeld(), false);
bool bShowDialog = true;
while ( bShowDialog )
{
bShowDialog = false;
if (aDlg.run() == RET_OK)
{
OUString sNewName = aDlg.GetName();
bool bDocumentData = aDlg.GetModifyDoc();
if ( m_pModelsBox->GetEntryPos( sNewName ) != LISTBOX_ENTRY_NOTFOUND )
{
// error: model name already exists
std::unique_ptr<weld::MessageDialog> xErrBox(Application::CreateMessageDialog(GetFrameWeld(),
VclMessageType::Warning, VclButtonsType::Ok,
SvxResId(RID_STR_DOUBLE_MODELNAME)));
xErrBox->set_primary_text(xErrBox->get_primary_text().replaceFirst(MSG_VARIABLE, sNewName));
xErrBox->run();
bShowDialog = true;
}
else
{
try
{
// add new model to frame model
Reference< css::xforms::XModel > xNewModel(
xUIHelper->newModel( m_xFrameModel, sNewName ), UNO_SET_THROW );
Reference< XPropertySet > xModelProps( xNewModel, UNO_QUERY_THROW );
xModelProps->setPropertyValue("ExternalData", makeAny( !bDocumentData ) );
sal_Int32 nNewPos = m_pModelsBox->InsertEntry( sNewName );
m_pModelsBox->SelectEntryPos( nNewPos );
ModelSelectHdl(m_pModelsBox);
bIsDocModified = true;
}
catch ( Exception const & )
{
TOOLS_WARN_EXCEPTION( "svx.form", "DataNavigatorWindow::MenuSelectHdl()" );
}
}
}
}
}
else if (sIdent == "modelsedit")
{
AddModelDialog aDlg(GetFrameWeld(), true);
aDlg.SetName( sSelectedModel );
bool bDocumentData( false );
try
{
Reference< css::xforms::XFormsSupplier > xFormsSupp( m_xFrameModel, UNO_QUERY_THROW );
Reference< XNameContainer > xXForms( xFormsSupp->getXForms(), UNO_SET_THROW );
Reference< XPropertySet > xModelProps( xXForms->getByName( sSelectedModel ), UNO_QUERY_THROW );
bool bExternalData = false;
OSL_VERIFY( xModelProps->getPropertyValue( "ExternalData" ) >>= bExternalData );
bDocumentData = !bExternalData;
}
catch( const Exception& )
{
DBG_UNHANDLED_EXCEPTION("svx");
}
aDlg.SetModifyDoc( bDocumentData );
bShowDialog = false;
if (aDlg.run() == RET_OK)
{
if ( aDlg.GetModifyDoc() != bDocumentData )
{
bDocumentData = aDlg.GetModifyDoc();
try
{
Reference< css::xforms::XFormsSupplier > xFormsSupp( m_xFrameModel, UNO_QUERY_THROW );
Reference< XNameContainer > xXForms( xFormsSupp->getXForms(), UNO_SET_THROW );
Reference< XPropertySet > xModelProps( xXForms->getByName( sSelectedModel ), UNO_QUERY_THROW );
xModelProps->setPropertyValue( "ExternalData", makeAny( !bDocumentData ) );
bIsDocModified = true;
}
catch( const Exception& )
{
DBG_UNHANDLED_EXCEPTION("svx");
}
}
OUString sNewName = aDlg.GetName();
if ( !sNewName.isEmpty() && ( sNewName != sSelectedModel ) )
bool bDocumentData = aDlg.GetModifyDoc();
if (m_xModelsBox->find_text(sNewName) != -1)
{
// error: model name already exists
std::unique_ptr<weld::MessageDialog> xErrBox(Application::CreateMessageDialog(GetFrameWeld(),
VclMessageType::Warning, VclButtonsType::Ok,
SvxResId(RID_STR_DOUBLE_MODELNAME)));
xErrBox->set_primary_text(xErrBox->get_primary_text().replaceFirst(MSG_VARIABLE, sNewName));
xErrBox->run();
bShowDialog = true;
}
else
{
try
{
xUIHelper->renameModel( m_xFrameModel, sSelectedModel, sNewName );
// add new model to frame model
Reference< css::xforms::XModel > xNewModel(
xUIHelper->newModel( m_xFrameModel, sNewName ), UNO_SET_THROW );
m_pModelsBox->RemoveEntry( nSelectedPos );
nSelectedPos = m_pModelsBox->InsertEntry( sNewName );
m_pModelsBox->SelectEntryPos( nSelectedPos );
Reference< XPropertySet > xModelProps( xNewModel, UNO_QUERY_THROW );
xModelProps->setPropertyValue("ExternalData", makeAny( !bDocumentData ) );
m_xModelsBox->append_text(sNewName);
m_xModelsBox->set_active(m_xModelsBox->get_count() - 1);
ModelSelectHdl(m_xModelsBox.get());
bIsDocModified = true;
}
catch ( Exception const & )
@@ -1558,168 +1389,222 @@ namespace svxform
}
}
}
else if (sIdent == "modelsremove")
}
else if (rIdent == "modelsedit")
{
AddModelDialog aDlg(GetFrameWeld(), true);
aDlg.SetName( sSelectedModel );
bool bDocumentData( false );
try
{
std::unique_ptr<weld::MessageDialog> xQBox(Application::CreateMessageDialog(GetFrameWeld(),
VclMessageType::Question, VclButtonsType::YesNo,
SvxResId( RID_STR_QRY_REMOVE_MODEL)));
OUString sText = xQBox->get_primary_text();
sText = sText.replaceFirst( MODELNAME, sSelectedModel );
xQBox->set_primary_text(sText);
if (xQBox->run() == RET_YES)
Reference< css::xforms::XFormsSupplier > xFormsSupp( m_xFrameModel, UNO_QUERY_THROW );
Reference< XNameContainer > xXForms( xFormsSupp->getXForms(), UNO_SET_THROW );
Reference< XPropertySet > xModelProps( xXForms->getByName( sSelectedModel ), UNO_QUERY_THROW );
bool bExternalData = false;
OSL_VERIFY( xModelProps->getPropertyValue( "ExternalData" ) >>= bExternalData );
bDocumentData = !bExternalData;
}
catch( const Exception& )
{
DBG_UNHANDLED_EXCEPTION("svx");
}
aDlg.SetModifyDoc( bDocumentData );
if (aDlg.run() == RET_OK)
{
if ( aDlg.GetModifyDoc() != bDocumentData )
{
bDocumentData = aDlg.GetModifyDoc();
try
{
Reference< css::xforms::XFormsSupplier > xFormsSupp( m_xFrameModel, UNO_QUERY_THROW );
Reference< XNameContainer > xXForms( xFormsSupp->getXForms(), UNO_SET_THROW );
Reference< XPropertySet > xModelProps( xXForms->getByName( sSelectedModel ), UNO_QUERY_THROW );
xModelProps->setPropertyValue( "ExternalData", makeAny( !bDocumentData ) );
bIsDocModified = true;
}
catch( const Exception& )
{
DBG_UNHANDLED_EXCEPTION("svx");
}
}
OUString sNewName = aDlg.GetName();
if ( !sNewName.isEmpty() && ( sNewName != sSelectedModel ) )
{
try
{
xUIHelper->removeModel( m_xFrameModel, sSelectedModel );
xUIHelper->renameModel( m_xFrameModel, sSelectedModel, sNewName );
m_xModelsBox->remove(nSelectedPos);
m_xModelsBox->append_text(sNewName);
m_xModelsBox->set_active(m_xModelsBox->get_count() - 1);
bIsDocModified = true;
}
catch ( Exception const & )
{
TOOLS_WARN_EXCEPTION( "svx.form", "DataNavigatorWindow::MenuSelectHdl()" );
}
m_pModelsBox->RemoveEntry( nSelectedPos );
if ( m_pModelsBox->GetEntryCount() <= nSelectedPos )
nSelectedPos = m_pModelsBox->GetEntryCount() - 1;
m_pModelsBox->SelectEntryPos( nSelectedPos );
ModelSelectHdl(m_pModelsBox);
bIsDocModified = true;
}
}
else
}
else if (rIdent == "modelsremove")
{
std::unique_ptr<weld::MessageDialog> xQBox(Application::CreateMessageDialog(GetFrameWeld(),
VclMessageType::Question, VclButtonsType::YesNo,
SvxResId( RID_STR_QRY_REMOVE_MODEL)));
OUString sText = xQBox->get_primary_text();
sText = sText.replaceFirst( MODELNAME, sSelectedModel );
xQBox->set_primary_text(sText);
if (xQBox->run() == RET_YES)
{
SAL_WARN( "svx.form", "DataNavigatorWindow::MenuSelectHdl(): wrong menu item" );
try
{
xUIHelper->removeModel( m_xFrameModel, sSelectedModel );
}
catch ( Exception const & )
{
TOOLS_WARN_EXCEPTION( "svx.form", "DataNavigatorWindow::MenuSelectHdl()" );
}
m_xModelsBox->remove(nSelectedPos);
if (m_xModelsBox->get_count() <= nSelectedPos)
nSelectedPos = m_xModelsBox->get_count() - 1;
m_xModelsBox->set_active(nSelectedPos);
ModelSelectHdl(m_xModelsBox.get());
bIsDocModified = true;
}
}
else if (m_pInstanceBtn == pBtn)
else if (rIdent == "instancesadd")
{
OString sIdent(pBtn->GetCurItemIdent());
if (sIdent == "instancesadd")
AddInstanceDialog aDlg(GetFrameWeld(), false);
if (aDlg.run() == RET_OK)
{
AddInstanceDialog aDlg(GetFrameWeld(), false);
OString sPageId = GetNewPageId(); // ModelSelectHdl will cause a page of this id to be created
OUString sName = aDlg.GetName();
if (sName.isEmpty())
{
SAL_WARN( "svx.form", "DataNavigatorWindow::CreateInstancePage(): instance without name" );
sName = "untitled";
}
OUString sURL = aDlg.GetURL();
bool bLinkOnce = aDlg.IsLinkInstance();
try
{
xUIHelper->newInstance( sName, sURL, !bLinkOnce );
}
catch ( Exception const & )
{
TOOLS_WARN_EXCEPTION( "svx.form", "DataNavigatorWindow::MenuSelectHdl()" );
}
ModelSelectHdl( nullptr );
XFormsPage* pPage = GetPage(sPageId);
pPage->SetInstanceName(sName);
pPage->SetInstanceURL(sURL);
pPage->SetLinkOnce(bLinkOnce);
ActivatePageHdl(sPageId);
bIsDocModified = true;
}
}
else if (rIdent == "instancesedit")
{
OString sIdent = GetCurrentPage();
XFormsPage* pPage = GetPage(sIdent);
if ( pPage )
{
AddInstanceDialog aDlg(GetFrameWeld(), true);
aDlg.SetName( pPage->GetInstanceName() );
aDlg.SetURL( pPage->GetInstanceURL() );
aDlg.SetLinkInstance( pPage->GetLinkOnce() );
OUString sOldName = aDlg.GetName();
if (aDlg.run() == RET_OK)
{
sal_uInt16 nInst = GetNewPageId();
OUString sName = aDlg.GetName();
OUString sNewName = aDlg.GetName();
OUString sURL = aDlg.GetURL();
bool bLinkOnce = aDlg.IsLinkInstance();
try
{
xUIHelper->newInstance( sName, sURL, !bLinkOnce );
xUIHelper->renameInstance( sOldName,
sNewName,
sURL,
!bLinkOnce );
}
catch ( Exception const & )
{
TOOLS_WARN_EXCEPTION( "svx.form", "DataNavigatorWindow::MenuSelectHdl()" );
}
ModelSelectHdl( nullptr );
m_pTabCtrl->SetCurPageId( nInst );
XFormsPage* pPage = GetCurrentPage( nInst );
pPage->SetInstanceName(sName);
pPage->SetInstanceName(sNewName);
pPage->SetInstanceURL(sURL);
pPage->SetLinkOnce(bLinkOnce);
ActivatePageHdl(m_pTabCtrl);
m_xTabCtrl->set_tab_label_text(sIdent, sNewName);
bIsDocModified = true;
}
}
else if (sIdent == "instancesedit")
}
else if (rIdent == "instancesremove")
{
OString sIdent = GetCurrentPage();
XFormsPage* pPage = GetPage(sIdent);
if (pPage)
{
sal_uInt16 nId = 0;
XFormsPage* pPage = GetCurrentPage( nId );
if ( pPage )
OUString sInstName = pPage->GetInstanceName();
std::unique_ptr<weld::MessageDialog> xQBox(Application::CreateMessageDialog(GetFrameWeld(),
VclMessageType::Question, VclButtonsType::YesNo,
SvxResId(RID_STR_QRY_REMOVE_INSTANCE)));
OUString sMessText = xQBox->get_primary_text();
sMessText = sMessText.replaceFirst( INSTANCENAME, sInstName );
xQBox->set_primary_text(sMessText);
if (xQBox->run() == RET_YES)
{
AddInstanceDialog aDlg(GetFrameWeld(), true);
aDlg.SetName( pPage->GetInstanceName() );
aDlg.SetURL( pPage->GetInstanceURL() );
aDlg.SetLinkInstance( pPage->GetLinkOnce() );
OUString sOldName = aDlg.GetName();
if (aDlg.run() == RET_OK)
bool bDoRemove = false;
if (IsAdditionalPage(sIdent))
{
OUString sNewName = aDlg.GetName();
OUString sURL = aDlg.GetURL();
bool bLinkOnce = aDlg.IsLinkInstance();
auto aPageListEnd = m_aPageList.end();
auto aFoundPage = std::find_if(m_aPageList.begin(), aPageListEnd,
[pPage](const auto&elem) { return elem.get() == pPage; });
if ( aFoundPage != aPageListEnd )
{
m_aPageList.erase( aFoundPage );
bDoRemove = true;
}
}
else
{
m_xInstPage.reset();
bDoRemove = true;
}
if ( bDoRemove )
{
try
{
xUIHelper->renameInstance( sOldName,
sNewName,
sURL,
!bLinkOnce );
xUIHelper->removeInstance( sInstName );
}
catch ( Exception const & )
catch (const Exception&)
{
TOOLS_WARN_EXCEPTION( "svx.form", "DataNavigatorWindow::MenuSelectHdl()" );
}
pPage->SetInstanceName(sNewName);
pPage->SetInstanceURL(sURL);
pPage->SetLinkOnce(bLinkOnce);
m_pTabCtrl->SetPageText( nId, sNewName );
m_xTabCtrl->remove_page(sIdent);
m_xTabCtrl->set_current_page("instance");
ModelSelectHdl( nullptr );
bIsDocModified = true;
}
}
}
else if (sIdent == "instancesremove")
{
sal_uInt16 nId = 0;
VclPtr<XFormsPage> pPage = GetCurrentPage( nId );
if ( pPage )
{
OUString sInstName = pPage->GetInstanceName();
std::unique_ptr<weld::MessageDialog> xQBox(Application::CreateMessageDialog(GetFrameWeld(),
VclMessageType::Question, VclButtonsType::YesNo,
SvxResId(RID_STR_QRY_REMOVE_INSTANCE)));
OUString sMessText = xQBox->get_primary_text();
sMessText = sMessText.replaceFirst( INSTANCENAME, sInstName );
xQBox->set_primary_text(sMessText);
if (xQBox->run() == RET_YES)
{
bool bDoRemove = false;
if (IsAdditionalPage(nId))
{
auto aPageListEnd = m_aPageList.end();
auto aFoundPage = std::find( m_aPageList.begin(), aPageListEnd, pPage );
if ( aFoundPage != aPageListEnd )
{
m_aPageList.erase( aFoundPage );
pPage.disposeAndClear() ;
bDoRemove = true;
}
}
else
{
m_pInstPage.disposeAndClear();
bDoRemove = true;
}
if ( bDoRemove )
{
try
{
xUIHelper->removeInstance( sInstName );
}
catch (const Exception&)
{
TOOLS_WARN_EXCEPTION( "svx.form", "DataNavigatorWindow::MenuSelectHdl()" );
}
m_pTabCtrl->RemovePage( nId );
m_pTabCtrl->SetCurPageId(m_pTabCtrl->GetPageId("instance"));
ModelSelectHdl( nullptr );
bIsDocModified = true;
}
}
}
}
else if (sIdent == "instancesdetails")
{
m_bShowDetails = !m_bShowDetails;
PopupMenu* pMenu = m_pInstanceBtn->GetPopupMenu();
pMenu->CheckItem("instancesdetails", m_bShowDetails );
ModelSelectHdl(m_pModelsBox);
}
else
{
SAL_WARN( "svx.form", "DataNavigatorWindow::MenuSelectHdl(): wrong menu item" );
}
}
else if (rIdent == "instancesdetails")
{
m_bShowDetails = !m_bShowDetails;
m_xInstanceBtn->set_item_active("instancesdetails", m_bShowDetails);
ModelSelectHdl(m_xModelsBox.get());
}
else
{
SAL_WARN( "svx.form", "DataNavigatorWindow::MenuSelectHdl(): wrong button" );
SAL_WARN( "svx.form", "DataNavigatorWindow::MenuSelectHdl(): wrong menu item" );
}
m_bIsNotifyDisabled = false;
@@ -1728,28 +1613,26 @@ namespace svxform
SetDocModified();
}
bool DataNavigatorWindow::IsAdditionalPage(sal_uInt16 nId) const
bool DataNavigatorWindow::IsAdditionalPage(const OString& rIdent)
{
return m_pTabCtrl->GetPageName(nId).isEmpty();
return rIdent.startsWith("additional");
}
IMPL_LINK( DataNavigatorWindow, MenuActivateHdl, MenuButton *, pBtn, void )
IMPL_LINK( DataNavigatorWindow, MenuActivateHdl, weld::ToggleButton&, rBtn, void )
{
Menu* pMenu = pBtn->GetPopupMenu();
if (m_pInstanceBtn == pBtn)
if (m_xInstanceBtn.get() == &rBtn)
{
sal_uInt16 nId(m_pTabCtrl->GetCurPageId());
bool bIsInstPage = (IsAdditionalPage(nId) || m_pTabCtrl->GetPageName(nId) == "instance");
pMenu->EnableItem( "instancesedit", bIsInstPage );
pMenu->EnableItem( "instancesremove",
bIsInstPage && m_pTabCtrl->GetPageCount() > MIN_PAGE_COUNT );
pMenu->EnableItem( "instancesdetails", bIsInstPage );
OString sIdent(m_xTabCtrl->get_current_page_ident());
bool bIsInstPage = (IsAdditionalPage(sIdent) || sIdent == "instance");
m_xInstanceBtn->set_item_sensitive( "instancesedit", bIsInstPage );
m_xInstanceBtn->set_item_sensitive( "instancesremove",
bIsInstPage && m_xTabCtrl->get_n_pages() > MIN_PAGE_COUNT );
m_xInstanceBtn->set_item_sensitive( "instancesdetails", bIsInstPage );
}
else if (m_pModelBtn == pBtn)
else if (m_xModelBtn.get() == &rBtn)
{
// we need at least one model!
pMenu->EnableItem("modelsremove", m_pModelsBox->GetEntryCount() > 1 );
m_xModelBtn->set_item_sensitive("modelsremove", m_xModelsBox->get_count() > 1 );
}
else
{
@@ -1757,16 +1640,13 @@ namespace svxform
}
}
IMPL_LINK_NOARG(DataNavigatorWindow, ActivatePageHdl, TabControl*, void)
IMPL_LINK(DataNavigatorWindow, ActivatePageHdl, const OString&, rIdent, void)
{
sal_uInt16 nId = 0;
XFormsPage* pPage = GetCurrentPage( nId );
if ( pPage )
{
m_pTabCtrl->SetTabPage( nId, pPage );
if ( m_xDataContainer.is() && !pPage->HasModel() )
SetPageModel();
}
XFormsPage* pPage = GetPage(rIdent);
if (!pPage)
return;
if (m_xDataContainer.is() && !pPage->HasModel())
SetPageModel(rIdent);
}
IMPL_LINK_NOARG(DataNavigatorWindow, UpdateHdl, Timer *, void)
@@ -1774,46 +1654,48 @@ namespace svxform
ModelSelectHdl( nullptr );
}
XFormsPage* DataNavigatorWindow::GetCurrentPage( sal_uInt16& rCurId )
XFormsPage* DataNavigatorWindow::GetPage(const OString& rCurId)
{
rCurId = m_pTabCtrl->GetCurPageId();
VclPtr<XFormsPage> pPage;
OString sName(m_pTabCtrl->GetPageName(rCurId));
if (sName == "submissions")
XFormsPage* pPage = nullptr;
if (rCurId == "submissions")
{
if ( !m_pSubmissionPage )
m_pSubmissionPage = VclPtr<XFormsPage>::Create(m_pTabCtrl, this, DGTSubmission);
pPage = m_pSubmissionPage;
if (!m_xSubmissionPage)
m_xSubmissionPage.reset(new XFormsPage(m_xTabCtrl->get_page(rCurId), this, DGTSubmission));
pPage = m_xSubmissionPage.get();
}
else if (sName == "bindings")
else if (rCurId == "bindings")
{
if ( !m_pBindingPage )
m_pBindingPage = VclPtr<XFormsPage>::Create(m_pTabCtrl, this, DGTBinding);
pPage = m_pBindingPage;
if (!m_xBindingPage)
m_xBindingPage.reset(new XFormsPage(m_xTabCtrl->get_page(rCurId), this, DGTBinding));
pPage = m_xBindingPage.get();
}
else if (sName == "instance")
else if (rCurId == "instance")
{
if ( !m_pInstPage )
m_pInstPage = VclPtr<XFormsPage>::Create(m_pTabCtrl, this, DGTInstance);
pPage = m_pInstPage;
if (!m_xInstPage)
m_xInstPage.reset(new XFormsPage(m_xTabCtrl->get_page(rCurId), this, DGTInstance));
pPage = m_xInstPage.get();
}
else
{
sal_uInt16 nPos = m_pTabCtrl->GetPagePos( rCurId );
if ( HasFirstInstancePage() && nPos > 0 )
sal_uInt16 nPos = m_xTabCtrl->get_page_index(rCurId);
if (HasFirstInstancePage() && nPos > 0)
nPos--;
if ( m_aPageList.size() > nPos )
pPage = m_aPageList[nPos];
if (m_aPageList.size() > nPos)
pPage = m_aPageList[nPos].get();
else
{
pPage = VclPtr<XFormsPage>::Create(m_pTabCtrl, this, DGTInstance);
m_aPageList.push_back( pPage );
m_aPageList.emplace_back(std::make_unique<XFormsPage>(m_xTabCtrl->get_page(rCurId), this, DGTInstance));
pPage = m_aPageList.back().get();
}
}
return pPage;
}
OString DataNavigatorWindow::GetCurrentPage() const
{
return m_xTabCtrl->get_current_page_ident();
}
void DataNavigatorWindow::LoadModels()
{
if ( !m_xFrameModel.is() )
@@ -1850,7 +1732,7 @@ namespace svxform
Any aAny = m_xDataContainer->getByName( rName );
Reference< css::xforms::XModel > xFormsModel;
if ( aAny >>= xFormsModel )
m_pModelsBox->InsertEntry( xFormsModel->getID() );
m_xModelsBox->append_text(xFormsModel->getID());
}
}
}
@@ -1861,36 +1743,35 @@ namespace svxform
}
}
if ( m_pModelsBox->GetEntryCount() > 0 )
if (m_xModelsBox->get_count() > 0)
{
m_pModelsBox->SelectEntryPos(0);
ModelSelectHdl(m_pModelsBox);
m_xModelsBox->set_active(0);
ModelSelectHdl(m_xModelsBox.get());
}
}
void DataNavigatorWindow::SetPageModel()
void DataNavigatorWindow::SetPageModel(const OString& rIdent)
{
OUString sModel( m_pModelsBox->GetSelectedEntry() );
OUString sModel(m_xModelsBox->get_active_text());
try
{
Any aAny = m_xDataContainer->getByName( sModel );
Reference< css::xforms::XModel > xFormsModel;
if ( aAny >>= xFormsModel )
{
sal_uInt16 nPagePos = TAB_PAGE_NOTFOUND;
sal_uInt16 nId = 0;
XFormsPage* pPage = GetCurrentPage( nId );
int nPagePos = -1;
XFormsPage* pPage = GetPage(rIdent);
DBG_ASSERT( pPage, "DataNavigatorWindow::SetPageModel(): no page" );
if (IsAdditionalPage(nId) || m_pTabCtrl->GetPageName(nId) == "instance")
if (IsAdditionalPage(rIdent) || rIdent == "instance")
{
// instance page
nPagePos = m_pTabCtrl->GetPagePos( nId );
nPagePos = m_xTabCtrl->get_page_index(rIdent);
}
m_bIsNotifyDisabled = true;
OUString sText = pPage->SetModel( xFormsModel, nPagePos );
m_bIsNotifyDisabled = false;
if ( !sText.isEmpty() )
m_pTabCtrl->SetPageText( nId, sText );
if (!sText.isEmpty())
m_xTabCtrl->set_tab_label_text(rIdent, sText);
}
}
catch (const NoSuchElementException& )
@@ -1905,7 +1786,7 @@ namespace svxform
void DataNavigatorWindow::InitPages()
{
OUString sModel( m_pModelsBox->GetSelectedEntry() );
OUString sModel(m_xModelsBox->get_active_text());
try
{
Any aAny = m_xDataContainer->getByName( sModel );
@@ -1954,27 +1835,25 @@ namespace svxform
void DataNavigatorWindow::ClearAllPageModels( bool bClearPages )
{
if ( m_pInstPage )
m_pInstPage->ClearModel();
if ( m_pSubmissionPage )
m_pSubmissionPage->ClearModel();
if ( m_pBindingPage )
m_pBindingPage->ClearModel();
if ( m_xInstPage )
m_xInstPage->ClearModel();
if ( m_xSubmissionPage )
m_xSubmissionPage->ClearModel();
if ( m_xBindingPage )
m_xBindingPage->ClearModel();
sal_Int32 i, nCount = m_aPageList.size();
for ( i = 0; i < nCount; ++i )
sal_Int32 nCount = m_aPageList.size();
for (sal_Int32 i = 0; i < nCount; ++i)
{
VclPtr<XFormsPage> pPage = m_aPageList[i];
XFormsPage* pPage = m_aPageList[i].get();
pPage->ClearModel();
if ( bClearPages )
pPage.disposeAndClear();
}
if ( bClearPages )
{
m_aPageList.clear();
while ( m_pTabCtrl->GetPageCount() > MIN_PAGE_COUNT )
m_pTabCtrl->RemovePage( m_pTabCtrl->GetPageId( 1 ) );
while ( m_xTabCtrl->get_n_pages() > MIN_PAGE_COUNT )
m_xTabCtrl->remove_page(m_xTabCtrl->get_page_ident(1));
}
}
@@ -1986,45 +1865,37 @@ namespace svxform
if (pProp != _xPropSeq.end())
pProp->Value >>= sInstName;
sal_uInt16 nPageId = GetNewPageId();
OString sPageId = GetNewPageId();
if ( sInstName.isEmpty() )
{
SAL_WARN( "svx.form", "DataNavigatorWindow::CreateInstancePage(): instance without name" );
sInstName = "untitled" + OUString::number( nPageId );
sInstName = "untitled";
}
m_pTabCtrl->InsertPage( nPageId, sInstName, m_pTabCtrl->GetPageCount() - 2 );
m_xTabCtrl->insert_page(sPageId, sInstName, m_xTabCtrl->get_n_pages() - 2);
}
bool DataNavigatorWindow::HasFirstInstancePage() const
{
return (m_pTabCtrl->GetPageName(m_pTabCtrl->GetPageId(0)) == "instance");
return m_xTabCtrl->get_page_ident(0) == "instance";
}
sal_uInt16 DataNavigatorWindow::GetNewPageId() const
OString DataNavigatorWindow::GetNewPageId() const
{
sal_uInt16 i, nMax = 0, nCount = m_pTabCtrl->GetPageCount();
for ( i = 0; i < nCount; ++i )
int nMax = 0;
int nCount = m_xTabCtrl->get_n_pages();
for (int i = 0; i < nCount; ++i)
{
if ( nMax < m_pTabCtrl->GetPageId(i) )
nMax = m_pTabCtrl->GetPageId(i);
OString sIdent = m_xTabCtrl->get_page_ident(i);
OString sNumber;
if (!sIdent.startsWith("additional", &sNumber))
continue;
int nPageId = sNumber.toInt32();
if (nMax < nPageId)
nMax = nPageId;
}
return ( nMax + 1 );
}
void DataNavigatorWindow::Resize()
{
vcl::Window *pChild = GetWindow(GetWindowType::FirstChild);
if (!pChild)
return;
VclContainer::setLayoutAllocation(*pChild, Point(0,0), GetSizePixel());
}
Size DataNavigatorWindow::GetOptimalSize() const
{
const vcl::Window *pChild = GetWindow(GetWindowType::FirstChild);
if (!pChild)
return Window::GetOptimalSize();
return VclContainer::getLayoutRequisition(*pChild);
return "additional" + OString::number(nMax + 1);
}
void DataNavigatorWindow::SetDocModified()
@@ -2045,8 +1916,8 @@ namespace svxform
RemoveBroadcaster();
m_xDataContainer.clear();
m_xFrameModel.clear();
m_pModelsBox->Clear();
m_nLastSelectedPos = LISTBOX_ENTRY_NOTFOUND;
m_xModelsBox->clear();
m_nLastSelectedPos = -1;
// for a reload
LoadModels();
}
@@ -2055,7 +1926,6 @@ namespace svxform
}
}
void DataNavigatorWindow::AddContainerBroadcaster( const css::uno::Reference< css::container::XContainer >& xContainer )
{
Reference< XContainerListener > xListener(
@@ -2076,7 +1946,6 @@ namespace svxform
m_aEventTargetList.push_back( xTarget );
}
void DataNavigatorWindow::RemoveBroadcaster()
{
Reference< XContainerListener > xContainerListener(
@@ -2096,26 +1965,18 @@ namespace svxform
}
}
DataNavigator::DataNavigator( SfxBindings* _pBindings, SfxChildWindow* _pMgr, vcl::Window* _pParent ) :
SfxDockingWindow( _pBindings, _pMgr, _pParent,
WinBits(WB_STDMODELESS|WB_SIZEABLE|WB_ROLLABLE|WB_3DLOOK|WB_DOCKABLE) ),
SfxControllerItem( SID_FM_DATANAVIGATOR_CONTROL, *_pBindings ),
m_aDataWin( VclPtr<DataNavigatorWindow>::Create(this, _pBindings) )
DataNavigator::DataNavigator(SfxBindings* _pBindings, SfxChildWindow* _pMgr, vcl::Window* _pParent)
: SfxDockingWindow(_pBindings, _pMgr, _pParent, "DataNavigator", "svx/ui/datanavigator.ui")
, SfxControllerItem(SID_FM_DATANAVIGATOR_CONTROL, *_pBindings)
, m_xDataWin(new DataNavigatorWindow(this, *m_xBuilder, _pBindings))
{
SetText( SvxResId( RID_STR_DATANAVIGATOR ) );
Size aSize = m_aDataWin->GetOutputSizePixel();
Size aSize = GetOptimalSize();
Size aLogSize = PixelToLogic(aSize, MapMode(MapUnit::MapAppFont));
SfxDockingWindow::SetFloatingSize( aLogSize );
m_aDataWin->Show();
}
DataNavigator::~DataNavigator()
{
disposeOnce();
@@ -2123,7 +1984,7 @@ namespace svxform
void DataNavigator::dispose()
{
m_aDataWin.disposeAndClear();
m_xDataWin.reset();
::SfxControllerItem::dispose();
SfxDockingWindow::dispose();
}
@@ -2132,7 +1993,6 @@ namespace svxform
{
}
Size DataNavigator::CalcDockingSize( SfxChildAlignment eAlign )
{
if ( ( eAlign == SfxChildAlignment::TOP ) || ( eAlign == SfxChildAlignment::BOTTOM ) )
@@ -2141,7 +2001,6 @@ namespace svxform
return SfxDockingWindow::CalcDockingSize( eAlign );
}
SfxChildAlignment DataNavigator::CheckAlignment( SfxChildAlignment eActAlign, SfxChildAlignment eAlign )
{
switch ( eAlign )
@@ -2156,28 +2015,8 @@ namespace svxform
return eActAlign;
}
void DataNavigator::Resize()
{
SfxDockingWindow::Resize();
Size aLogOutputSize = PixelToLogic(GetOutputSizePixel(), MapMode(MapUnit::MapAppFont));
Size aLogExplSize = aLogOutputSize;
aLogExplSize.AdjustWidth( -2 );
aLogExplSize.AdjustHeight( -2 );
Point aExplPos = LogicToPixel(Point(1,1), MapMode(MapUnit::MapAppFont));
Size aExplSize = LogicToPixel(aLogExplSize, MapMode(MapUnit::MapAppFont));
m_aDataWin->SetPosSizePixel( aExplPos, aExplSize );
}
SFX_IMPL_DOCKINGWINDOW( DataNavigatorManager, SID_FM_SHOW_DATANAVIGATOR )
DataNavigatorManager::DataNavigatorManager(
vcl::Window* _pParent, sal_uInt16 _nId, SfxBindings* _pBindings, SfxChildWinInfo* _pInfo ) :
diff --git a/svx/source/inc/datalistener.hxx b/svx/source/inc/datalistener.hxx
index 2749c4e..9e023d9 100644
--- a/svx/source/inc/datalistener.hxx
+++ b/svx/source/inc/datalistener.hxx
@@ -40,7 +40,7 @@ namespace svxform
class DataListener : public DataListener_t
{
private:
VclPtr<DataNavigatorWindow> m_pNaviWin;
DataNavigatorWindow* m_pNaviWin;
public:
DataListener( DataNavigatorWindow* pNaviWin );
diff --git a/svx/source/inc/datanavi.hxx b/svx/source/inc/datanavi.hxx
index 45158ce..83c94dd 100644
--- a/svx/source/inc/datanavi.hxx
+++ b/svx/source/inc/datanavi.hxx
@@ -20,16 +20,11 @@
#define INCLUDED_SVX_SOURCE_INC_DATANAVI_HXX
#include <config_options.h>
#include <vcl/builder.hxx>
#include <vcl/lstbox.hxx>
#include <vcl/menubtn.hxx>
#include <vcl/tabctrl.hxx>
#include <vcl/tabpage.hxx>
#include <vcl/toolbox.hxx>
#include <vcl/builderpage.hxx>
#include <vcl/idle.hxx>
#include <vcl/transfer.hxx>
#include <vcl/weld.hxx>
#include <svtools/inettbc.hxx>
#include <vcl/treelistbox.hxx>
#include <sfx2/dockwin.hxx>
#include <sfx2/childwin.hxx>
#include <sfx2/ctrlitem.hxx>
@@ -81,44 +76,6 @@ namespace svxform
class DataNavigatorWindow;
class AddInstanceDialog;
class DataTreeListBox : public SvTreeListBox
{
private:
std::unique_ptr<VclBuilder> m_xBuilder;
VclPtr<PopupMenu> m_xMenu;
VclPtr<XFormsPage> m_pXFormsPage;
DataGroupType m_eGroup;
sal_uInt16 m_nAddId;
sal_uInt16 m_nAddElementId;
sal_uInt16 m_nAddAttributeId;
sal_uInt16 m_nEditId;
sal_uInt16 m_nRemoveId;
protected:
using SvTreeListBox::ExecuteDrop;
public:
DataTreeListBox( vcl::Window* pParent, WinBits nBits );
virtual ~DataTreeListBox() override;
virtual void dispose() override;
virtual VclPtr<PopupMenu> CreateContextMenu() override;
virtual void ExecuteContextMenuAction( sal_uInt16 _nSelectedPopupEntry ) override;
virtual sal_Int8 AcceptDrop( const AcceptDropEvent& rEvt ) override;
virtual sal_Int8 ExecuteDrop( const ExecuteDropEvent& rEvt ) override;
virtual void StartDrag( sal_Int8 nAction, const Point& rPosPixel ) override;
void SetGroup(DataGroupType _eGroup);
void SetXFormsPage(XFormsPage* _pPage);
void SetToolBoxItemIds(sal_uInt16 _nAddId,
sal_uInt16 _nAddElementId,
sal_uInt16 _nAddAttributeId,
sal_uInt16 _nEditId,
sal_uInt16 _nRemoveId);
void DeleteAndClear();
void RemoveEntry( SvTreeListEntry const * _pEntry );
};
class ReplaceString
{
OUString m_sDoc_UI;
@@ -208,24 +165,33 @@ namespace svxform
}
};
class XFormsPage : public TabPage
class DataTreeDropTarget : 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 : public BuilderPage
{
private:
MethodString m_aMethodString;
ReplaceString m_aReplaceString;
VclPtr<ToolBox> m_pToolBox;
VclPtr<DataTreeListBox> m_pItemList;
sal_uInt16 m_nAddId;
sal_uInt16 m_nAddElementId;
sal_uInt16 m_nAddAttributeId;
sal_uInt16 m_nEditId;
sal_uInt16 m_nRemoveId;
weld::Container* m_pParent;
std::unique_ptr<weld::Toolbar> m_xToolBox;
std::unique_ptr<weld::TreeView> m_xItemList;
std::unique_ptr<weld::TreeIter> m_xScratchIter;
DataTreeDropTarget m_aDropHelper;
css::uno::Reference< css::xforms::XFormsUIHelper1 >
m_xUIHelper;
VclPtr<DataNavigatorWindow> m_pNaviWin;
DataNavigatorWindow* m_pNaviWin;
bool m_bHasModel;
DataGroupType m_eGroup;
// these strings are not valid on the Submission and Binding Page
@@ -236,34 +202,34 @@ namespace svxform
OUString m_sInstanceURL;
bool m_bLinkOnce;
DECL_LINK(TbxSelectHdl, ToolBox *, void);
DECL_LINK(ItemSelectHdl, SvTreeListBox*, void);
DECL_LINK(TbxSelectHdl, const OString&, void);
DECL_LINK(ItemSelectHdl, weld::TreeView&, void);
DECL_LINK(KeyInputHdl, const KeyEvent&, bool);
DECL_LINK(PopupMenuHdl, const CommandEvent&, bool);
void AddChildren(SvTreeListEntry* _pParent,
void AddChildren(weld::TreeIter* _pParent,
const css::uno::Reference< css::xml::dom::XNode >& _xNode);
bool DoToolBoxAction( sal_uInt16 _nToolBoxID );
SvTreeListEntry* AddEntry( std::unique_ptr<ItemNode> _pNewNode, bool _bIsElement );
SvTreeListEntry* AddEntry( const css::uno::Reference< css::beans::XPropertySet >& _rPropSet );
bool DoToolBoxAction(const OString& 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();
protected:
virtual bool EventNotify( NotifyEvent& rNEvt ) override;
void PrepDnD();
void DeleteAndClearTree();
public:
XFormsPage( vcl::Window* pParent, DataNavigatorWindow* _pNaviWin, DataGroupType _eGroup );
XFormsPage(weld::Container* pParent, DataNavigatorWindow* _pNaviWin, DataGroupType _eGroup);
virtual ~XFormsPage() override;
virtual void dispose() override;
virtual void Resize() override;
bool HasModel() const { return m_bHasModel; }
OUString SetModel( const css::uno::Reference< css::xforms::XModel > & _xModel, sal_uInt16 _nPagePos );
void ClearModel();
OUString LoadInstance(const css::uno::Sequence< css::beans::PropertyValue >& _xPropSeq);
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( sal_uInt16 _nMenuID );
void EnableMenuItems( Menu* _pMenu );
bool DoMenuAction(const OString& rMenuID);
void EnableMenuItems(weld::Menu* pMenu);
const OUString& GetInstanceName() const { return m_sInstanceName; }
const OUString& GetInstanceURL() const { return m_sInstanceURL; }
@@ -279,22 +245,23 @@ namespace svxform
GetXFormsHelper() const { return m_xUIHelper; }
};
class DataNavigatorWindow : public vcl::Window, public VclBuilderContainer
class DataNavigatorWindow final
{
private:
VclPtr<ListBox> m_pModelsBox;
VclPtr<MenuButton> m_pModelBtn;
VclPtr<TabControl> m_pTabCtrl;
VclPtr<MenuButton> m_pInstanceBtn;
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;
VclPtr<XFormsPage> m_pInstPage;
VclPtr<XFormsPage> m_pSubmissionPage;
VclPtr<XFormsPage> m_pBindingPage;
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< VclPtr<XFormsPage> >
std::vector< std::unique_ptr<XFormsPage> >
m_aPageList;
std::vector< css::uno::Reference< css::container::XContainer > >
m_aContainerList;
@@ -311,31 +278,27 @@ namespace svxform
css::uno::Reference< css::frame::XModel >
m_xFrameModel;
DECL_LINK( ModelSelectListBoxHdl, ListBox&, void );
DECL_LINK( MenuSelectHdl, MenuButton *, void );
DECL_LINK( MenuActivateHdl, MenuButton *, void );
DECL_LINK( ActivatePageHdl, TabControl*, void);
DECL_LINK( ModelSelectListBoxHdl, weld::ComboBox&, void );
DECL_LINK( MenuSelectHdl, const OString&, void );
DECL_LINK( MenuActivateHdl, weld::ToggleButton&, void );
DECL_LINK( ActivatePageHdl, const OString&, void);
DECL_LINK( UpdateHdl, Timer *, void);
void ModelSelectHdl(ListBox const *);
XFormsPage* GetCurrentPage( sal_uInt16& rCurId );
void ModelSelectHdl(const weld::ComboBox*);
OString GetCurrentPage() const;
XFormsPage* GetPage(const OString& rCurId);
void LoadModels();
void SetPageModel();
void SetPageModel(const OString& rCurId);
void ClearAllPageModels( bool bClearPages );
void InitPages();
void CreateInstancePage( const css::uno::Sequence< css::beans::PropertyValue >& _xPropSeq );
bool HasFirstInstancePage() const;
sal_uInt16 GetNewPageId() const;
OString GetNewPageId() const;
bool IsAdditionalPage(sal_uInt16 nPageId) const;
protected:
virtual void Resize() override;
virtual Size GetOptimalSize() const override;
static bool IsAdditionalPage(const OString& rIdent);
public:
DataNavigatorWindow( vcl::Window* pParent, SfxBindings const * pBindings );
virtual ~DataNavigatorWindow() override;
virtual void dispose() override;
DataNavigatorWindow(vcl::Window* pParent, weld::Builder& rBuilder, SfxBindings const * pBindings);
~DataNavigatorWindow();
static void SetDocModified();
void NotifyChanges( bool _bLoadAll = false );
@@ -343,6 +306,8 @@ namespace svxform
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; }
};
@@ -350,10 +315,9 @@ namespace svxform
class DataNavigator : public SfxDockingWindow, public SfxControllerItem
{
private:
VclPtr<DataNavigatorWindow> m_aDataWin;
std::unique_ptr<DataNavigatorWindow> m_xDataWin;
protected:
virtual void Resize() override;
virtual Size CalcDockingSize( SfxChildAlignment ) override;
virtual SfxChildAlignment CheckAlignment( SfxChildAlignment, SfxChildAlignment ) override;
diff --git a/svx/uiconfig/ui/datanavigator.ui b/svx/uiconfig/ui/datanavigator.ui
index 26e8d39..92c9ae6 100644
--- a/svx/uiconfig/ui/datanavigator.ui
+++ b/svx/uiconfig/ui/datanavigator.ui
@@ -1,161 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.20.0 -->
<!-- Generated with glade 3.22.2 -->
<interface domain="svx">
<requires lib="gtk+" version="3.18"/>
<object class="GtkBox" id="DataNavigator">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<child>
<object class="GtkBox" id="box1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<property name="border_width">0</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkGrid" id="grid2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="column_spacing">12</property>
<child>
<object class="GtkComboBoxText" id="modelslist">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="modelsbutton:modelsmenu">
<property name="label" translatable="yes" context="datanavigator|modelsbutton">_Models</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="hexpand">True</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">0</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkNotebook" id="tabcontrol">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<property name="scrollable">True</property>
<property name="enable_popup">True</property>
<child>
<object class="GtkGrid">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<placeholder/>
</child>
</object>
</child>
<child type="tab">
<object class="GtkLabel" id="instance">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes" context="datanavigator|instance">Instance</property>
</object>
<packing>
<property name="tab_fill">False</property>
</packing>
</child>
<child>
<object class="GtkGrid">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
<child type="tab">
<object class="GtkLabel" id="submissions">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes" context="datanavigator|submissions">Submissions</property>
</object>
<packing>
<property name="position">1</property>
<property name="tab_fill">False</property>
</packing>
</child>
<child>
<object class="GtkGrid">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="position">2</property>
</packing>
</child>
<child type="tab">
<object class="GtkLabel" id="bindings">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes" context="datanavigator|bindings">Bindings</property>
</object>
<packing>
<property name="position">2</property>
<property name="tab_fill">False</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="instances:instancesmenu">
<property name="label" translatable="yes" context="datanavigator|instances">_Instances</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="halign">end</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
</object>
<object class="GtkMenu" id="instancesmenu">
<property name="visible">True</property>
<property name="can_focus">False</property>
@@ -164,6 +10,7 @@
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes" context="datanavigator|instancesadd">_Add...</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
@@ -171,6 +18,7 @@
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes" context="datanavigator|instancesedit">_Edit...</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
@@ -178,6 +26,7 @@
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes" context="datanavigator|instancesremove">_Remove...</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
@@ -187,7 +36,7 @@
</object>
</child>
<child>
<object class="GtkMenuItem" id="instancesdetails">
<object class="GtkCheckMenuItem" id="instancesdetails">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes" context="datanavigator|instancesdetails">_Show Details</property>
@@ -223,4 +72,242 @@
</object>
</child>
</object>
<object class="GtkBox" id="DataNavigator">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<child>
<object class="GtkBox" id="box1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<property name="border_width">0</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkGrid" id="grid2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="column_spacing">12</property>
<child>
<object class="GtkComboBoxText" id="modelslist">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">0</property>
</packing>
</child>
<child>
<object class="GtkMenuButton" id="modelsbutton">
<property name="label" translatable="yes" context="datanavigator|modelsbutton">_Models</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="hexpand">True</property>
<property name="use_underline">True</property>
<property name="draw_indicator">True</property>
<property name="popup">modelsmenu</property>
<property name="use_popover">False</property>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">0</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkNotebook" id="tabcontrol">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<property name="scrollable">True</property>
<property name="enable_popup">True</property>
<child>
<object class="GtkGrid">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
</object>
</child>
<child type="tab">
<object class="GtkLabel" id="instance">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes" context="datanavigator|instance">Instance</property>
</object>
<packing>
<property name="tab_fill">False</property>
</packing>
</child>
<child>
<object class="GtkGrid">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
<child type="tab">
<object class="GtkLabel" id="submissions">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes" context="datanavigator|submissions">Submissions</property>
</object>
<packing>
<property name="position">1</property>
<property name="tab_fill">False</property>
</packing>
</child>
<child>
<object class="GtkGrid">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="position">2</property>
</packing>
</child>
<child type="tab">
<object class="GtkLabel" id="bindings">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes" context="datanavigator|bindings">Bindings</property>
</object>
<packing>
<property name="position">2</property>
<property name="tab_fill">False</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkMenuButton" id="instances">
<property name="label" translatable="yes" context="datanavigator|instances">_Instances</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="halign">end</property>
<property name="use_underline">True</property>
<property name="draw_indicator">True</property>
<property name="popup">instancesmenu</property>
<property name="use_popover">False</property>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
</object>
</interface>
diff --git a/svx/uiconfig/ui/xformspage.ui b/svx/uiconfig/ui/xformspage.ui
index 3a42c8f..181298d 100644
--- a/svx/uiconfig/ui/xformspage.ui
+++ b/svx/uiconfig/ui/xformspage.ui
@@ -1,8 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.16.1 -->
<!-- Generated with glade 3.22.2 -->
<interface domain="svx">
<requires lib="gtk+" version="3.18"/>
<requires lib="LibreOffice" version="1.0"/>
<object class="GtkTreeStore" id="liststore1">
<columns>
<!-- column-name expander -->
<column type="GdkPixbuf"/>
<!-- column-name text -->
<column type="gchararray"/>
<!-- column-name id -->
<column type="gchararray"/>
</columns>
</object>
<object class="GtkBox" id="XFormsPage">
<property name="visible">True</property>
<property name="can_focus">False</property>
@@ -16,13 +25,17 @@
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="toolbar_style">icons</property>
<property name="show_arrow">False</property>
<property name="icon_size">2</property>
<child>
<object class="GtkToolButton" id="TBI_ITEM_ADD">
<object class="GtkToolButton" id="additem">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="valign">start</property>
<property name="action_name">TBI_ITEM_ADD</property>
<property name="label" translatable="yes" context="xformspage|TBI_ITEM_ADD">Add Item</property>
<property name="use_underline">True</property>
<property name="icon_name">res/tb01.png</property>
</object>
<packing>
<property name="expand">False</property>
@@ -30,12 +43,13 @@
</packing>
</child>
<child>
<object class="GtkToolButton" id="TBI_ITEM_ADD_ELEMENT">
<object class="GtkToolButton" id="addelement">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="valign">start</property>
<property name="action_name">TBI_ITEM_ADD_ELEMENT</property>
<property name="label" translatable="yes" context="xformspage|TBI_ITEM_ADD_ELEMENT">Add Element</property>
<property name="use_underline">True</property>
<property name="icon_name">res/tb02.png</property>
</object>
<packing>
<property name="expand">False</property>
@@ -43,12 +57,13 @@
</packing>
</child>
<child>
<object class="GtkToolButton" id="TBI_ITEM_ADD_ATTRIBUTE">
<object class="GtkToolButton" id="addattribute">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="valign">start</property>
<property name="action_name">TBI_ITEM_ADD_ATTRIBUTE</property>
<property name="label" translatable="yes" context="xformspage|TBI_ITEM_ADD_ATTRIBUTE">Add Attribute</property>
<property name="use_underline">True</property>
<property name="icon_name">res/tb03.png</property>
</object>
<packing>
<property name="expand">False</property>
@@ -56,12 +71,13 @@
</packing>
</child>
<child>
<object class="GtkToolButton" id="TBI_ITEM_EDIT">
<object class="GtkToolButton" id="edit">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="valign">start</property>
<property name="action_name">TBI_ITEM_EDIT</property>
<property name="label" translatable="yes" context="xformspage|TBI_ITEM_EDIT">Edit</property>
<property name="use_underline">True</property>
<property name="icon_name">res/tb04.png</property>
</object>
<packing>
<property name="expand">False</property>
@@ -69,12 +85,23 @@
</packing>
</child>
<child>
<object class="GtkToolButton" id="TBI_ITEM_REMOVE">
<object class="GtkSeparatorToolItem" id="separator">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
</packing>
</child>
<child>
<object class="GtkToolButton" id="delete">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="valign">start</property>
<property name="action_name">TBI_ITEM_REMOVE</property>
<property name="label" translatable="yes" context="xformspage|TBI_ITEM_REMOVE">Delete</property>
<property name="use_underline">True</property>
<property name="icon_name">res/tb05.png</property>
</object>
<packing>
<property name="expand">False</property>
@@ -89,13 +116,45 @@
</packing>
</child>
<child>
<object class="svxcorelo-DataTreeListBox" id="items:border">
<object class="GtkScrolledWindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<child internal-child="selection">
<object class="GtkTreeSelection" id="treeview-selection1"/>
<property name="shadow_type">in</property>
<child>
<object class="GtkTreeView" id="items">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<property name="model">liststore1</property>
<property name="headers_visible">False</property>
<property name="reorderable">True</property>
<property name="search_column">1</property>
<property name="enable_tree_lines">True</property>
<child internal-child="selection">
<object class="GtkTreeSelection" id="Macro Library List-selection1"/>
</child>
<child>
<object class="GtkTreeViewColumn" id="treeviewcolumn2">
<property name="spacing">6</property>
<child>
<object class="GtkCellRendererPixbuf" id="cellrenderertext4"/>
<attributes>
<attribute name="pixbuf">0</attribute>
</attributes>
</child>
<child>
<object class="GtkCellRendererText" id="cellrenderertext2"/>
<attributes>
<attribute name="text">1</attribute>
</attributes>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>