summaryrefslogtreecommitdiff
path: root/sfx2
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2020-04-26 15:43:25 +0100
committerCaolán McNamara <caolanm@redhat.com>2020-04-29 09:46:08 +0200
commitfe9a13dc0e6d1384416c2a2343223b33925fc925 (patch)
treea43a8ea0cc46407b8932dced64cf34d595f3b3e9 /sfx2
parentcf36fe5eb41910c26d58fb25e54ccf2e0ee01365 (diff)
weld SfxTemplatePanelControl
Change-Id: Ib3f6d01ddec37afc3987423dc15ab84ad6475f37 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/92942 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'sfx2')
-rw-r--r--sfx2/UIConfig_sfx.mk5
-rw-r--r--sfx2/inc/bitmaps.hlst4
-rw-r--r--sfx2/source/dialog/styfitem.cxx2
-rw-r--r--sfx2/source/dialog/templdlg.cxx1532
-rw-r--r--sfx2/source/dialog/tplcitem.cxx6
-rw-r--r--sfx2/source/inc/templdgi.hxx211
-rw-r--r--sfx2/uiconfig/ui/templatepanel.ui326
7 files changed, 1031 insertions, 1055 deletions
diff --git a/sfx2/UIConfig_sfx.mk b/sfx2/UIConfig_sfx.mk
index 15ccbcc24116..c682be2b214b 100644
--- a/sfx2/UIConfig_sfx.mk
+++ b/sfx2/UIConfig_sfx.mk
@@ -18,9 +18,9 @@ $(eval $(call gb_UIConfig_add_uifiles,sfx,\
sfx2/uiconfig/ui/charmapcontrol \
sfx2/uiconfig/ui/charviewmenu \
sfx2/uiconfig/ui/checkin \
+ sfx2/uiconfig/ui/classificationbox \
sfx2/uiconfig/ui/cmisinfopage \
sfx2/uiconfig/ui/cmisline \
- sfx2/uiconfig/ui/classificationbox \
sfx2/uiconfig/ui/custominfopage \
sfx2/uiconfig/ui/descriptioninfopage \
sfx2/uiconfig/ui/dockingwindow \
@@ -51,6 +51,7 @@ $(eval $(call gb_UIConfig_add_uifiles,sfx,\
sfx2/uiconfig/ui/notebookbarpopup \
sfx2/uiconfig/ui/printeroptionsdialog \
sfx2/uiconfig/ui/querysavedialog \
+ sfx2/uiconfig/ui/saveastemplatedlg \
sfx2/uiconfig/ui/safemodequerydialog \
sfx2/uiconfig/ui/searchdialog \
sfx2/uiconfig/ui/securityinfopage \
@@ -58,8 +59,8 @@ $(eval $(call gb_UIConfig_add_uifiles,sfx,\
sfx2/uiconfig/ui/startcenter \
sfx2/uiconfig/ui/stylecontextmenu \
sfx2/uiconfig/ui/templatedlg \
- sfx2/uiconfig/ui/saveastemplatedlg \
sfx2/uiconfig/ui/templatecategorydlg \
+ sfx2/uiconfig/ui/templatepanel \
sfx2/uiconfig/ui/urlbox \
sfx2/uiconfig/ui/versionsofdialog \
sfx2/uiconfig/ui/versioncommentdialog \
diff --git a/sfx2/inc/bitmaps.hlst b/sfx2/inc/bitmaps.hlst
index 28e16d920513..6ec00cd863de 100644
--- a/sfx2/inc/bitmaps.hlst
+++ b/sfx2/inc/bitmaps.hlst
@@ -88,10 +88,6 @@
#define SFX_BMP_CLOSE_DOC "sfx2/res/closedoc.png"
-#define RID_SFXBMP_WATERCAN "res/sc05554.png"
-#define RID_SFXBMP_NEW_BY_EXAMPLE "res/sc05555.png"
-#define RID_SFXBMP_UPDATE_BY_EXAMPLE "res/sc05556.png"
-
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
diff --git a/sfx2/source/dialog/styfitem.cxx b/sfx2/source/dialog/styfitem.cxx
index 33b731691596..a1ff5ab78094 100644
--- a/sfx2/source/dialog/styfitem.cxx
+++ b/sfx2/source/dialog/styfitem.cxx
@@ -20,7 +20,7 @@
#include <sfx2/styfitem.hxx>
#include <unotools/resmgr.hxx>
-SfxStyleFamilyItem::SfxStyleFamilyItem(SfxStyleFamily nFamily_, const OUString &rName, const Image& rImage, const std::pair<const char*, SfxStyleSearchBits>* pStringArray, const std::locale& rResLocale)
+SfxStyleFamilyItem::SfxStyleFamilyItem(SfxStyleFamily nFamily_, const OUString &rName, const OUString& rImage, const std::pair<const char*, SfxStyleSearchBits>* pStringArray, const std::locale& rResLocale)
: nFamily(nFamily_)
, aText(rName)
, aImage(rImage)
diff --git a/sfx2/source/dialog/templdlg.cxx b/sfx2/source/dialog/templdlg.cxx
index 2f2e1541eca0..9fe35922cd39 100644
--- a/sfx2/source/dialog/templdlg.cxx
+++ b/sfx2/source/dialog/templdlg.cxx
@@ -22,12 +22,14 @@
#include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
#include <com/sun/star/beans/XPropertySet.hpp>
#include <com/sun/star/container/XNameAccess.hpp>
+#include <vcl/commandevent.hxx>
#include <vcl/commandinfoprovider.hxx>
#include <vcl/event.hxx>
#include <vcl/help.hxx>
#include <vcl/menu.hxx>
#include <vcl/settings.hxx>
#include <vcl/svapp.hxx>
+#include <vcl/weldutils.hxx>
#include <svl/intitem.hxx>
#include <svl/stritem.hxx>
#include <svl/style.hxx>
@@ -71,112 +73,11 @@
#include <sfx2/StyleManager.hxx>
#include <sfx2/StylePreviewRenderer.hxx>
-#define STD_ENTRY_HEIGHT 17
-
using namespace css;
using namespace css::beans;
using namespace css::frame;
using namespace css::uno;
-namespace
-{
-
-class StyleLBoxString : public SvLBoxString
-{
- SfxStyleFamily meStyleFamily;
- SvViewDataItem* mpViewData;
-
-public:
- StyleLBoxString(const OUString& sText,
- const SfxStyleFamily& eStyleFamily);
-
- virtual void Paint(const Point& aPos,
- SvTreeListBox& rDevice,
- vcl::RenderContext& rRenderContext,
- const SvViewDataEntry* pView,
- const SvTreeListEntry& rEntry) override;
-
- virtual void InitViewData(SvTreeListBox* pView,
- SvTreeListEntry* pEntry,
- SvViewDataItem* pViewData = nullptr) override;
-};
-
-
-StyleLBoxString::StyleLBoxString(const OUString& sText, const SfxStyleFamily& eStyleFamily)
- : SvLBoxString(sText)
- , meStyleFamily(eStyleFamily)
- , mpViewData(nullptr)
-{}
-
-void StyleLBoxString::InitViewData(SvTreeListBox* pView, SvTreeListEntry* pEntry, SvViewDataItem* pViewData)
-{
- if (!pViewData)
- {
- pViewData = pView->GetViewDataItem(pEntry, this);
- }
- mpViewData = pViewData;
-}
-
-void StyleLBoxString::Paint(
- const Point& aPos, SvTreeListBox& rDevice, vcl::RenderContext& rRenderContext,
- const SvViewDataEntry* pView, const SvTreeListEntry& rEntry)
-{
- bool bPainted = false;
-
- SfxObjectShell* pShell = SfxObjectShell::Current();
- sfx2::StyleManager* pStyleManager = pShell? pShell->GetStyleManager(): nullptr;
-
- if (pStyleManager)
- {
- SfxStyleSheetBase* pStyleSheet = pStyleManager->Search(GetText(), meStyleFamily);
-
- if (pStyleSheet)
- {
- sal_Int32 nSize = 32 * rRenderContext.GetDPIScaleFactor();
- std::unique_ptr<sfx2::StylePreviewRenderer> pStylePreviewRenderer(
- pStyleManager->CreateStylePreviewRenderer(rRenderContext, pStyleSheet, nSize));
-
- if (pStylePreviewRenderer)
- {
- if (pStylePreviewRenderer->recalculate())
- {
- Size aSize(pStylePreviewRenderer->getRenderSize());
- mpViewData->mnWidth = aSize.Width();
- mpViewData->mnHeight = aSize.Height();
- }
- else
- {
- SvLBoxString::InitViewData( &rDevice, const_cast<SvTreeListEntry*>(&rEntry), mpViewData);
- }
-
- tools::Rectangle aPaintRectangle = pView->GetPaintRectangle();
- bPainted = pStylePreviewRenderer->render(aPaintRectangle);
- }
- }
- }
-
- if (!bPainted)
- {
- rRenderContext.DrawText(aPos, GetText());
- }
-}
-
-} // end anonymous namespace
-
-// Window is now created dynamically. So here margins, etc.
-
-#define SFX_TEMPLDLG_HFRAME 3
-#define SFX_TEMPLDLG_VTOPFRAME 3
-
-#define SFX_TEMPLDLG_VBOTFRAME 3
-#define SFX_TEMPLDLG_MIDHSPACE 3
-#define SFX_TEMPLDLG_MIDVSPACE 3
-#define SFX_TEMPLDLG_FILTERHEIGHT 100
-
-// filter box has maximum 14 entries visible
-#define MAX_FILTER_ENTRIES 14
-
-
class SfxCommonTemplateDialog_Impl::DeletionWatcher
{
typedef void (DeletionWatcher::* bool_type)();
@@ -216,43 +117,38 @@ private:
DeletionWatcher *const m_pPrevious; /// let's add more epicycles!
};
-void DropListBox_Impl::MouseButtonDown( const MouseEvent& rMEvt )
-{
- nModifier = rMEvt.GetModifier();
-
- bool bHitEmptySpace = ( nullptr == GetEntry( rMEvt.GetPosPixel(), true ) );
- if( bHitEmptySpace && ( rMEvt.GetClicks() == 2 ) && rMEvt.IsMod1() )
- Control::MouseButtonDown( rMEvt );
- else
- SvTreeListBox::MouseButtonDown( rMEvt );
-}
-
/** Drop is enabled as long as it is allowed to create a new style by example, i.e. to
create a style out of the current selection.
*/
-sal_Int8 DropListBox_Impl::AcceptDrop( const AcceptDropEvent& rEvt )
+sal_Int8 SfxCommonTemplateDialog_Impl::AcceptDrop(const AcceptDropEvent& rEvt, const DropTargetHelper& rHelper)
{
- if ( IsDropFormatSupported( SotClipboardFormatId::OBJECTDESCRIPTOR ) )
+ if (rHelper.IsDropFormatSupported(SotClipboardFormatId::OBJECTDESCRIPTOR))
{
// special case: page styles are allowed to create new styles by example
// but not allowed to be created by drag and drop
- if (pDialog->GetActualFamily() == SfxStyleFamily::Page ||
- pDialog->bNewByExampleDisabled)
+ if (GetActualFamily() == SfxStyleFamily::Page || bNewByExampleDisabled)
return DND_ACTION_NONE;
else
return DND_ACTION_COPY;
}
- return SvTreeListBox::AcceptDrop( rEvt );
+
+ // to enable the autoscroll when we're close to the edges
+ weld::TreeView* pTreeView = mxTreeBox->get_visible() ? mxTreeBox.get() : mxFmtLb.get();
+ pTreeView->get_dest_row_at_pos(rEvt.maPosPixel, nullptr);
+ return DND_ACTION_MOVE;
}
-sal_Int8 DropListBox_Impl::ExecuteDrop( const ExecuteDropEvent& rEvt )
+sal_Int8 SfxCommonTemplateDialog_Impl::ExecuteDrop(const ExecuteDropEvent& rEvt)
{
- sal_Int8 nRet = DND_ACTION_NONE;
- SfxObjectShell* pDocShell = pDialog->GetObjectShell();
- TransferableDataHelper aHelper( rEvt.maDropEvent.Transferable );
- sal_uInt32 nFormatCount = aHelper.GetFormatCount();
- if ( pDocShell )
+ // handle drop of content into the treeview to create a new style
+ SfxObjectShell* pDocShell = GetObjectShell();
+ if (pDocShell)
{
+ TransferableDataHelper aHelper(rEvt.maDropEvent.Transferable);
+ sal_uInt32 nFormatCount = aHelper.GetFormatCount();
+
+ sal_Int8 nRet = DND_ACTION_NONE;
+
bool bFormatFound = false;
for ( sal_uInt32 i = 0; i < nFormatCount; ++i )
@@ -264,7 +160,7 @@ sal_Int8 DropListBox_Impl::ExecuteDrop( const ExecuteDropEvent& rEvt )
{
if ( aDesc.maClassName == pDocShell->GetFactory().GetClassId() )
{
- PostUserEvent( LINK( this, DropListBox_Impl, OnAsyncExecuteDrop ), nullptr, true );
+ Application::PostUserEvent(LINK(this, SfxCommonTemplateDialog_Impl, OnAsyncExecuteDrop));
bFormatFound = true;
nRet = rEvt.mnAction;
@@ -273,260 +169,211 @@ sal_Int8 DropListBox_Impl::ExecuteDrop( const ExecuteDropEvent& rEvt )
}
}
- if ( !bFormatFound )
- return SvTreeListBox::ExecuteDrop( rEvt );
+ if (bFormatFound)
+ return nRet;
}
- return nRet;
+ if (!mxTreeBox->get_visible())
+ return DND_ACTION_NONE;
+
+ if (!bAllowReParentDrop)
+ return DND_ACTION_NONE;
+
+ // otherwise if we're dragging with the treeview to set a new parent of the dragged style
+ weld::TreeView* pSource = mxTreeBox->get_drag_source();
+ // only dragging within the same widget allowed
+ if (!pSource || pSource != mxTreeBox.get())
+ return DND_ACTION_NONE;
+
+ std::unique_ptr<weld::TreeIter> xSource(mxTreeBox->make_iterator());
+ if (!mxTreeBox->get_selected(xSource.get()))
+ return DND_ACTION_NONE;
+
+ std::unique_ptr<weld::TreeIter> xTarget(mxTreeBox->make_iterator());
+ if (!mxTreeBox->get_dest_row_at_pos(rEvt.maPosPixel, xTarget.get()))
+ {
+ // if nothing under the mouse, use the last row
+ int nChildren = mxTreeBox->n_children();
+ if (!nChildren)
+ return DND_ACTION_NONE;
+ if (!mxTreeBox->get_iter_first(*xTarget) || !mxTreeBox->iter_nth_sibling(*xTarget, nChildren - 1))
+ return DND_ACTION_NONE;
+ while (mxTreeBox->get_row_expanded(*xTarget))
+ {
+ nChildren = mxTreeBox->iter_n_children(*xTarget);
+ if (!mxTreeBox->iter_children(*xTarget) || !mxTreeBox->iter_nth_sibling(*xTarget, nChildren - 1))
+ return DND_ACTION_NONE;
+ }
+ }
+ OUString aTargetStyle = mxTreeBox->get_text(*xTarget);
+ DropHdl(mxTreeBox->get_text(*xSource), aTargetStyle);
+ mxTreeBox->unset_drag_dest_row();
+ FillTreeBox();
+ SelectStyle(aTargetStyle, false);
+ return DND_ACTION_NONE;
}
-IMPL_LINK_NOARG(DropListBox_Impl, OnAsyncExecuteDrop, void*, void)
+IMPL_LINK(SfxCommonTemplateDialog_Impl, DragBeginHdl, bool&, rUnsetDragIcon, bool)
{
- pDialog->ActionSelect( SID_STYLE_NEW_BY_EXAMPLE );
+ rUnsetDragIcon = false;
+ // Allow normal processing. only if bAllowReParentDrop is true
+ return !bAllowReParentDrop;
}
-bool DropListBox_Impl::EventNotify( NotifyEvent& rNEvt )
+IMPL_LINK_NOARG(SfxCommonTemplateDialog_Impl, OnAsyncExecuteDrop, void*, void)
+{
+ ActionSelect("new");
+}
+
+IMPL_LINK(SfxCommonTemplateDialog_Impl, KeyInputHdl, const KeyEvent&, rKeyEvent, bool)
{
bool bRet = false;
- if( rNEvt.GetType() == MouseNotifyEvent::KEYINPUT )
+ const vcl::KeyCode& rKeyCode = rKeyEvent.GetKeyCode();
+ if (bCanDel && !rKeyCode.GetModifier() && rKeyCode.GetCode() == KEY_DELETE)
{
- const vcl::KeyCode& rKeyCode = rNEvt.GetKeyEvent()->GetKeyCode();
- if(!rKeyCode.GetModifier())
- {
- if( pDialog->bCanDel && KEY_DELETE == rKeyCode.GetCode())
- {
- pDialog->DeleteHdl();
- bRet = true;
- }
- else if( KEY_RETURN == rKeyCode.GetCode())
- {
- GetDoubleClickHdl().Call(this);
- bRet = true;
- }
- }
+ DeleteHdl();
+ bRet = true;
}
- if(!bRet)
- bRet = SvTreeListBox::EventNotify( rNEvt );
return bRet;
}
-void DropListBox_Impl::RequestHelp(const HelpEvent& rHEvt)
+IMPL_LINK(SfxCommonTemplateDialog_Impl, QueryTooltipHdl, const weld::TreeIter&, rEntry, OUString)
{
- if (rHEvt.GetMode() & HelpEventMode::QUICK)
- {
- Point aPos(ScreenToOutputPixel(rHEvt.GetMousePosPixel()));
- SvTreeListEntry* pEntry = GetEntry(aPos);
- if (pEntry)
- {
- const OUString aTemplName(GetEntryText(pEntry));
- OUString sQuickHelpText(aTemplName);
+ weld::TreeView* pTreeView = mxTreeBox->get_visible() ? mxTreeBox.get() : mxFmtLb.get();
+ const OUString aTemplName(pTreeView->get_text(rEntry));
+ OUString sQuickHelpText(aTemplName);
- const SfxStyleFamilyItem* pItem = pDialog->GetFamilyItem_Impl();
- SfxStyleSheetBase* pStyle = pDialog->pStyleSheetPool->Find(aTemplName, pItem->GetFamily());
-
- if (pStyle && pStyle->IsUsed()) // pStyle is in use in the document?
- {
- OUString sUsedBy;
- if (pStyle->GetFamily() == SfxStyleFamily::Pseudo)
- {
- sUsedBy = pStyle->GetUsedBy();
- }
+ const SfxStyleFamilyItem* pItem = GetFamilyItem_Impl();
+ SfxStyleSheetBase* pStyle = pStyleSheetPool->Find(aTemplName, pItem->GetFamily());
- if (!sUsedBy.isEmpty())
- {
- const sal_Int32 nMaxLen = 80;
- if (sUsedBy.getLength() > nMaxLen)
- {
- sUsedBy = sUsedBy.copy(0, nMaxLen) + "...";
- }
+ if (pStyle && pStyle->IsUsed()) // pStyle is in use in the document?
+ {
+ OUString sUsedBy;
+ if (pStyle->GetFamily() == SfxStyleFamily::Pseudo)
+ sUsedBy = pStyle->GetUsedBy();
- OUString aMessage = SfxResId(STR_STYLEUSEDBY);
- aMessage = aMessage.replaceFirst("%STYLELIST", sUsedBy);
- sQuickHelpText = aTemplName + " " + aMessage;
- }
+ if (!sUsedBy.isEmpty())
+ {
+ const sal_Int32 nMaxLen = 80;
+ if (sUsedBy.getLength() > nMaxLen)
+ {
+ sUsedBy = sUsedBy.copy(0, nMaxLen) + "...";
}
- Size aSize(GetOutputSizePixel().Width(), GetEntryHeight());
- tools::Rectangle aScreenRect(OutputToScreenPixel(GetEntryPosition(pEntry)), aSize);
-
- Help::ShowQuickHelp(this, aScreenRect,
- sQuickHelpText, QuickHelpFlags::Left | QuickHelpFlags::VCenter);
- return;
+ OUString aMessage = SfxResId(STR_STYLEUSEDBY);
+ aMessage = aMessage.replaceFirst("%STYLELIST", sUsedBy);
+ sQuickHelpText = aTemplName + " " + aMessage;
}
}
- SvTreeListBox::RequestHelp(rHEvt);
-}
-/** ListBox class that starts a PopupMenu (designer specific) in the
- command handler.
-*/
-SfxActionListBox::SfxActionListBox(SfxCommonTemplateDialog_Impl* pParent, WinBits nWinBits)
- : DropListBox_Impl(pParent->GetWindow(), nWinBits, pParent)
-{
- EnableContextMenuHandling();
+ return sQuickHelpText;
}
-void SfxActionListBox::Recalc()
+IMPL_STATIC_LINK(SfxCommonTemplateDialog_Impl, CustomGetSizeHdl, weld::TreeView::get_size_args, aPayload, Size)
{
- if (officecfg::Office::Common::StylesAndFormatting::Preview::get())
- SetEntryHeight(32 * GetDPIScaleFactor());
- else
- SetEntryHeight(STD_ENTRY_HEIGHT, true);
- RecalcViewData();
+ vcl::RenderContext& rRenderContext = aPayload.first;
+ return Size(42, 32 * rRenderContext.GetDPIScaleFactor());
}
-VclPtr<PopupMenu> SfxActionListBox::CreateContextMenu()
+IMPL_LINK(SfxCommonTemplateDialog_Impl, CustomRenderHdl, weld::TreeView::render_args, aPayload, void)
{
+ vcl::RenderContext& rRenderContext = std::get<0>(aPayload);
+ const ::tools::Rectangle& rRect = std::get<1>(aPayload);
+ bool bSelected = std::get<2>(aPayload);
+ const OUString& rId = std::get<3>(aPayload);
- if( GetSelectionCount() <= 0 )
- {
- pDialog->EnableEdit( false );
- pDialog->EnableDel( false );
- }
- return pDialog->CreateContextMenu();
-}
-
-SfxTemplatePanelControl::SfxTemplatePanelControl(SfxBindings* pBindings, vcl::Window* pParentWindow)
- : Window(pParentWindow, WB_DIALOGCONTROL)
- , pImpl(new SfxTemplateDialog_Impl(pBindings, this))
- , mpBindings(pBindings)
-{
- OSL_ASSERT(mpBindings!=nullptr);
-
- SetStyle(GetStyle() & ~WB_DOCKABLE);
-}
-
-SfxTemplatePanelControl::~SfxTemplatePanelControl()
-{
- disposeOnce();
-}
+ rRenderContext.Push(PushFlags::TEXTCOLOR);
+ const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
+ if (bSelected)
+ rRenderContext.SetTextColor(rStyleSettings.GetHighlightTextColor());
+ else
+ rRenderContext.SetTextColor(rStyleSettings.GetDialogTextColor());
-void SfxTemplatePanelControl::dispose()
-{
- pImpl.reset();
- Window::dispose();
-}
+ bool bSuccess = false;
-void SfxTemplatePanelControl::Resize()
-{
- if(pImpl)
- pImpl->Resize();
- Window::Resize();
-}
+ SfxObjectShell* pShell = SfxObjectShell::Current();
+ sfx2::StyleManager* pStyleManager = pShell ? pShell->GetStyleManager(): nullptr;
-void StyleTreeListBox_Impl::MakeExpanded_Impl(std::vector<OUString>& rEntries) const
-{
- SvTreeListEntry* pEntry;
- for (pEntry = FirstVisible(); pEntry; pEntry = NextVisible(pEntry))
+ if (pStyleManager)
{
- if (IsExpanded(pEntry))
+ const SfxStyleFamilyItem* pItem = GetFamilyItem_Impl();
+ SfxStyleSheetBase* pStyleSheet = pStyleManager->Search(rId, pItem->GetFamily());
+
+ if (pStyleSheet)
{
- rEntries.push_back(GetEntryText(pEntry));
+ rRenderContext.Push(PushFlags::ALL);
+ sal_Int32 nSize = rRect.GetHeight();
+ std::unique_ptr<sfx2::StylePreviewRenderer> pStylePreviewRenderer(
+ pStyleManager->CreateStylePreviewRenderer(rRenderContext, pStyleSheet, nSize));
+ bSuccess = pStylePreviewRenderer->recalculate() && pStylePreviewRenderer->render(rRect);
+ rRenderContext.Pop();
}
}
-}
-VclPtr<PopupMenu> StyleTreeListBox_Impl::CreateContextMenu()
-{
- return pDialog->CreateContextMenu();
-}
+ if (!bSuccess)
+ rRenderContext.DrawText(rRect, rId, DrawTextFlags::Left | DrawTextFlags::VCenter);
-/** DoubleClick-Handler; calls the link.
- SV virtual method.
-*/
-bool StyleTreeListBox_Impl::DoubleClickHdl()
-{
- aDoubleClickLink.Call(nullptr);
- return false;
+ rRenderContext.Pop();
}
-bool StyleTreeListBox_Impl::EventNotify( NotifyEvent& rNEvt )
+IMPL_LINK(SfxCommonTemplateDialog_Impl, PopupFlatMenuHdl, const CommandEvent&, rCEvt, bool)
{
- // handle <RETURN> as double click
+ if (rCEvt.GetCommand() != CommandEventId::ContextMenu)
+ return false;
- bool bRet = false;
- if ( rNEvt.GetType() == MouseNotifyEvent::KEYINPUT )
+ if (mxFmtLb->count_selected_rows() <= 0)
{
- const vcl::KeyCode& rKeyCode = rNEvt.GetKeyEvent()->GetKeyCode();
- if ( !rKeyCode.GetModifier() && KEY_RETURN == rKeyCode.GetCode() )
- {
- aDoubleClickLink.Call( nullptr );
- bRet = true;
- }
+ EnableEdit(false);
+ EnableDel(false);
}
- if ( !bRet )
- bRet = DropListBox_Impl::EventNotify( rNEvt );
-
- return bRet;
+ return PopupTreeMenuHdl(rCEvt);
}
-/** NotifyMoving Handler; This leads via a link on the event to the dialog.
- SV virtual method.
-*/
-TriState StyleTreeListBox_Impl::NotifyMoving(SvTreeListEntry* pTarget,
- SvTreeListEntry* pEntry,
- SvTreeListEntry*& rpNewParent,
- sal_uLong& lPos)
-{
- if(!pTarget || !pEntry)
- return TRISTATE_FALSE;
- aParent = GetEntryText(pTarget);
- aStyle = GetEntryText(pEntry);
- const bool bRet = aDropLink.Call(*this);
- rpNewParent = pTarget;
- lPos=0;
- IntlWrapper aIntlWrapper(SvtSysLocale().GetUILanguageTag());
- const CollatorWrapper* pCollator = aIntlWrapper.getCaseCollator();
- for(SvTreeListEntry *pTmpEntry=FirstChild(pTarget);
- pTmpEntry && pCollator->compareString(
- GetEntryText(pTmpEntry),GetEntryText(pEntry)) < 0;
- pTmpEntry=pTmpEntry->NextSibling(),lPos++) ;
-
- return bRet ? TRISTATE_INDET : TRISTATE_FALSE;
-}
-
-/** ExpandingHdl Handler; the current entry is noticed.
- SV virtual method.
-
- [Cross-reference]
- <StyleTreeListBox_Impl::ExpandedHdl()>
-*/
-bool StyleTreeListBox_Impl::ExpandingHdl()
+IMPL_LINK(SfxCommonTemplateDialog_Impl, PopupTreeMenuHdl, const CommandEvent&, rCEvt, bool)
{
- pCurEntry = GetCurEntry();
+ if (rCEvt.GetCommand() != CommandEventId::ContextMenu)
+ return false;
+
+ CreateContextMenu();
+
+ weld::TreeView* pTreeView = mxTreeBox->get_visible() ? mxTreeBox.get() : mxFmtLb.get();
+ OString sCommand(mxMenu->popup_at_rect(pTreeView, tools::Rectangle(rCEvt.GetMousePosPixel(), Size(1,1))));
+ MenuSelect(sCommand);
+
return true;
}
-/** ExpandedHdl Handler;
- SV virtual method.
+SfxTemplatePanelControl::SfxTemplatePanelControl(SfxBindings* pBindings, vcl::Window* pParentWindow)
+ : PanelLayout(pParentWindow, "TemplatePanel", "sfx/ui/templatepanel.ui", nullptr)
+ , pImpl(new SfxTemplateDialog_Impl(pBindings, this))
+ , mpBindings(pBindings)
+{
+ OSL_ASSERT(mpBindings!=nullptr);
+}
- [Cross-reference]
- <StyleTreeListBox_Impl::ExpandingHdl()>
-*/
-void StyleTreeListBox_Impl::ExpandedHdl()
+SfxTemplatePanelControl::~SfxTemplatePanelControl()
{
- SvTreeListEntry *pEntry = GetHdlEntry();
- if(!IsExpanded(pEntry) && pCurEntry != GetCurEntry())
- SelectAll( false );
- pCurEntry = nullptr;
+ disposeOnce();
}
-/** Constructor StyleTreeListBox_Impl */
-StyleTreeListBox_Impl::StyleTreeListBox_Impl(SfxCommonTemplateDialog_Impl* pParent, WinBits nWinStyle)
- : DropListBox_Impl(pParent->GetWindow(), nWinStyle, pParent)
- , pCurEntry(nullptr)
+void SfxTemplatePanelControl::dispose()
{
- EnableContextMenuHandling();
+ pImpl.reset();
+ PanelLayout::dispose();
}
-void StyleTreeListBox_Impl::Recalc()
+static void MakeExpanded_Impl(weld::TreeView& rBox, std::vector<OUString>& rEntries)
{
- if (officecfg::Office::Common::StylesAndFormatting::Preview::get())
- SetEntryHeight(32 * GetDPIScaleFactor());
- else
- SetEntryHeight(STD_ENTRY_HEIGHT, true);
- RecalcViewData();
+ std::unique_ptr<weld::TreeIter> xEntry = rBox.make_iterator();
+ if (rBox.get_iter_first(*xEntry))
+ {
+ do
+ {
+ if (rBox.get_row_expanded(*xEntry))
+ rEntries.push_back(rBox.get_text(*xEntry));
+ } while (rBox.iter_next(*xEntry));
+ }
}
/** Internal structure for the establishment of the hierarchical view */
@@ -615,29 +462,20 @@ static bool IsExpanded_Impl( const std::vector<OUString>& rEntries,
return false;
}
-static SvTreeListEntry* FillBox_Impl(SvTreeListBox* pBox,
- StyleTree_Impl* pEntry,
- const std::vector<OUString>& rEntries,
- SfxStyleFamily eStyleFamily,
- SvTreeListEntry* pParent)
+static void FillBox_Impl(weld::TreeView& rBox,
+ StyleTree_Impl* pEntry,
+ const std::vector<OUString>& rEntries,
+ SfxStyleFamily eStyleFamily,
+ weld::TreeIter* pParent)
{
- SvTreeListEntry* pTreeListEntry = pBox->InsertEntry(pEntry->getName(), pParent);
-
- if (officecfg::Office::Common::StylesAndFormatting::Preview::get())
- {
- pTreeListEntry->ReplaceItem(std::make_unique<StyleLBoxString>(pEntry->getName(), eStyleFamily), 1);
- }
+ std::unique_ptr<weld::TreeIter> xResult = rBox.make_iterator();
+ const OUString& rName = pEntry->getName();
+ rBox.insert(pParent, -1, &rName, &rName, nullptr, nullptr, nullptr, false, xResult.get());
- pBox->GetModel()->InvalidateEntry(pTreeListEntry);
-
- for(size_t i = 0; i < pEntry->getChildren().size(); ++i)
- {
- FillBox_Impl(pBox, pEntry->getChildren()[i].get(), rEntries, eStyleFamily, pTreeListEntry);
- }
- return pTreeListEntry;
+ for (size_t i = 0; i < pEntry->getChildren().size(); ++i)
+ FillBox_Impl(rBox, pEntry->getChildren()[i].get(), rEntries, eStyleFamily, xResult.get());
}
-
namespace SfxTemplate
{
// converts from SFX_STYLE_FAMILY Ids to 1-6
@@ -673,7 +511,7 @@ namespace SfxTemplate
// Constructor
-SfxCommonTemplateDialog_Impl::SfxCommonTemplateDialog_Impl( SfxBindings* pB, vcl::Window* pW )
+SfxCommonTemplateDialog_Impl::SfxCommonTemplateDialog_Impl(SfxBindings* pB, vcl::Window* pW, weld::Builder* pBuilder)
: pBindings(pB)
, pWindow(pW)
, pModule(nullptr)
@@ -681,18 +519,16 @@ SfxCommonTemplateDialog_Impl::SfxCommonTemplateDialog_Impl( SfxBindings* pB, vcl
, pCurObjShell(nullptr)
, xModuleManager(frame::ModuleManager::create(::comphelper::getProcessComponentContext()))
, m_pDeletionWatcher(nullptr)
-
- , aFmtLb( VclPtr<SfxActionListBox>::Create(this, WB_BORDER | WB_TABSTOP) )
- , pTreeBox( VclPtr<StyleTreeListBox_Impl>::Create(this, WB_HASBUTTONS | WB_HASLINES |
- WB_BORDER | WB_TABSTOP | WB_HASLINESATROOT |
- WB_HASBUTTONSATROOT | WB_HIDESELECTION) )
- , aPreviewCheckbox( VclPtr<CheckBox>::Create( pW, WB_VCENTER ))
- , aFilterLb( VclPtr<ListBox>::Create(pW, WB_BORDER | WB_DROPDOWN | WB_TABSTOP) )
+ , mxFmtLb(pBuilder->weld_tree_view("flatview"))
+ , mxTreeBox(pBuilder->weld_tree_view("treeview"))
+ , mxPreviewCheckbox(pBuilder->weld_check_button("showpreview"))
+ , mxFilterLb(pBuilder->weld_combo_box("filter"))
, nActFamily(0xffff)
, nActFilter(0)
, nAppFilter(SfxStyleSearchBits::Auto)
+ , m_nModifier(0)
, bDontUpdate(false)
, bIsWater(false)
, bUpdate(false)
@@ -706,24 +542,15 @@ SfxCommonTemplateDialog_Impl::SfxCommonTemplateDialog_Impl( SfxBindings* pB, vcl
, bNewByExampleDisabled(false)
, bUpdateByExampleDisabled(false)
, bTreeDrag(true)
+ , bAllowReParentDrop(false)
, bHierarchical(false)
, m_bWantHierarchical(false)
, bBindingUpdate(true)
+ , m_bNewHasMenu(false)
{
- aFmtLb->SetQuickSearch(true);
- aFmtLb->SetAccessibleName(SfxResId(STR_STYLE_ELEMTLIST));
- aFmtLb->SetHelpId( HID_TEMPLATE_FMT );
- aFilterLb->SetHelpId( HID_TEMPLATE_FILTER );
- aFmtLb->SetStyle( aFmtLb->GetStyle() | WB_HIDESELECTION );
- vcl::Font aFont = aFmtLb->GetFont();
- aFont.SetWeight( WEIGHT_NORMAL );
- aFmtLb->SetFont( aFont );
- pTreeBox->SetQuickSearch(true);
- pTreeBox->SetNodeDefaultImages();
- pTreeBox->SetOptimalImageIndent();
- pTreeBox->SetAccessibleName(SfxResId(STR_STYLE_ELEMTLIST));
- aPreviewCheckbox->Check(officecfg::Office::Common::StylesAndFormatting::Preview::get());
- aPreviewCheckbox->SetText( SfxResId(STR_PREVIEW_CHECKBOX) );
+ mxFmtLb->set_help_id(HID_TEMPLATE_FMT);
+ mxFilterLb->set_help_id(HID_TEMPLATE_FILTER);
+ mxPreviewCheckbox->set_active(officecfg::Office::Common::StylesAndFormatting::Preview::get());
}
sal_uInt16 SfxCommonTemplateDialog_Impl::StyleNrToInfoOffset(sal_uInt16 nId)
@@ -736,7 +563,7 @@ void SfxTemplateDialog_Impl::EnableEdit(bool bEnable)
{
SfxCommonTemplateDialog_Impl::EnableEdit( bEnable );
if( !bEnable || !bUpdateByExampleDisabled )
- EnableItem( SID_STYLE_UPDATE_BY_EXAMPLE, bEnable);
+ EnableItem("update", bEnable);
}
void SfxCommonTemplateDialog_Impl::ReadResource()
@@ -833,8 +660,6 @@ void SfxCommonTemplateDialog_Impl::ReadResource()
InsertFamilyItem(nId, rItem);
}
- LoadedFamilies();
-
for ( i = SID_STYLE_FAMILY1; i <= SID_STYLE_FAMILY4; i++ )
pBindings->Update(i);
}
@@ -864,6 +689,29 @@ SfxCommonTemplateDialog_Impl::impl_setDeletionWatcher(
return pRet;
}
+class TreeViewDropTarget final : public DropTargetHelper
+{
+private:
+ SfxCommonTemplateDialog_Impl& m_rParent;
+
+public:
+ TreeViewDropTarget(SfxCommonTemplateDialog_Impl& rDialog, weld::TreeView& rTreeView)
+ : DropTargetHelper(rTreeView.get_drop_target())
+ , m_rParent(rDialog)
+ {
+ }
+
+ virtual sal_Int8 AcceptDrop(const AcceptDropEvent& rEvt) override
+ {
+ return m_rParent.AcceptDrop(rEvt, *this);
+ }
+
+ virtual sal_Int8 ExecuteDrop(const ExecuteDropEvent& rEvt) override
+ {
+ return m_rParent.ExecuteDrop(rEvt);
+ }
+};
+
void SfxCommonTemplateDialog_Impl::Initialize()
{
// Read global user resource
@@ -871,22 +719,41 @@ void SfxCommonTemplateDialog_Impl::Initialize()
pBindings->Invalidate( SID_STYLE_FAMILY );
pBindings->Update( SID_STYLE_FAMILY );
- Update_Impl();
-
- aFilterLb->SetSelectHdl( LINK( this, SfxCommonTemplateDialog_Impl, FilterSelectHdl ) );
- aFmtLb->SetDoubleClickHdl( LINK( this, SfxCommonTemplateDialog_Impl, TreeListApplyHdl ) );
- aFmtLb->SetSelectHdl( LINK( this, SfxCommonTemplateDialog_Impl, FmtSelectHdl ) );
- aFmtLb->SetSelectionMode(SelectionMode::Multiple);
- pTreeBox->SetSelectHdl( LINK( this, SfxCommonTemplateDialog_Impl, FmtSelectHdl ) );
- pTreeBox->SetDoubleClickHdl( LINK( this, SfxCommonTemplateDialog_Impl, ApplyHdl ) );
- pTreeBox->SetDropHdl( LINK( this, SfxCommonTemplateDialog_Impl, DropHdl ) );
- aPreviewCheckbox->SetClickHdl( LINK(this, SfxCommonTemplateDialog_Impl, PreviewHdl));
+ mxFilterLb->connect_changed(LINK(this, SfxCommonTemplateDialog_Impl, FilterSelectHdl));
+ mxFmtLb->connect_row_activated(LINK( this, SfxCommonTemplateDialog_Impl, TreeListApplyHdl));
+ mxFmtLb->connect_mouse_press(LINK(this, SfxCommonTemplateDialog_Impl, MousePressHdl));
+ mxFmtLb->connect_query_tooltip(LINK(this, SfxCommonTemplateDialog_Impl, QueryTooltipHdl));
+ mxFmtLb->connect_changed(LINK(this, SfxCommonTemplateDialog_Impl, FmtSelectHdl));
+ mxFmtLb->connect_popup_menu(LINK(this, SfxCommonTemplateDialog_Impl, PopupFlatMenuHdl));
+ mxFmtLb->connect_key_press(LINK(this, SfxCommonTemplateDialog_Impl, KeyInputHdl));
+ mxFmtLb->set_selection_mode(SelectionMode::Multiple);
+ mxTreeBox->connect_changed(LINK(this, SfxCommonTemplateDialog_Impl, FmtSelectHdl));
+ mxTreeBox->connect_row_activated(LINK( this, SfxCommonTemplateDialog_Impl, TreeListApplyHdl));
+ mxTreeBox->connect_mouse_press(LINK(this, SfxCommonTemplateDialog_Impl, MousePressHdl));
+ mxTreeBox->connect_query_tooltip(LINK(this, SfxCommonTemplateDialog_Impl, QueryTooltipHdl));
+ mxTreeBox->connect_popup_menu(LINK(this, SfxCommonTemplateDialog_Impl, PopupTreeMenuHdl));
+ mxTreeBox->connect_key_press(LINK(this, SfxCommonTemplateDialog_Impl, KeyInputHdl));
+ mxTreeBox->connect_drag_begin(LINK(this, SfxCommonTemplateDialog_Impl, DragBeginHdl));
+ mxPreviewCheckbox->connect_clicked(LINK(this, SfxCommonTemplateDialog_Impl, PreviewHdl));
+ m_xTreeView1DropTargetHelper.reset(new TreeViewDropTarget(*this, *mxFmtLb));
+ m_xTreeView2DropTargetHelper.reset(new TreeViewDropTarget(*this, *mxTreeBox));
+
+ int nTreeHeight = mxFmtLb->get_height_rows(8);
+ mxFmtLb->set_size_request(-1, nTreeHeight);
+ mxTreeBox->set_size_request(-1, nTreeHeight);
+
+ mxFmtLb->connect_custom_get_size(LINK(this, SfxCommonTemplateDialog_Impl, CustomGetSizeHdl));
+ mxFmtLb->connect_custom_render(LINK(this, SfxCommonTemplateDialog_Impl, CustomRenderHdl));
+ mxTreeBox->connect_custom_get_size(LINK(this, SfxCommonTemplateDialog_Impl, CustomGetSizeHdl));
+ mxTreeBox->connect_custom_render(LINK(this, SfxCommonTemplateDialog_Impl, CustomRenderHdl));
+ bool bCustomPreview = officecfg::Office::Common::StylesAndFormatting::Preview::get();
+ mxFmtLb->set_column_custom_renderer(0, bCustomPreview);
+ mxTreeBox->set_column_custom_renderer(0, bCustomPreview);
+
+ mxFmtLb->set_visible(!bHierarchical);
+ mxTreeBox->set_visible(bHierarchical);
-
- aFilterLb->Show();
- if (!bHierarchical)
- aFmtLb->Show();
- aPreviewCheckbox->Show();
+ Update_Impl();
}
SfxCommonTemplateDialog_Impl::~SfxCommonTemplateDialog_Impl()
@@ -898,13 +765,15 @@ SfxCommonTemplateDialog_Impl::~SfxCommonTemplateDialog_Impl()
if ( pStyleSheetPool )
EndListening(*pStyleSheetPool);
pStyleSheetPool = nullptr;
- pTreeBox.disposeAndClear();
+ m_xTreeView1DropTargetHelper.reset();
+ m_xTreeView2DropTargetHelper.reset();
+ mxTreeBox.reset();
pIdle.reset();
if ( m_pDeletionWatcher )
m_pDeletionWatcher->signal();
- aFmtLb.disposeAndClear();
- aPreviewCheckbox.disposeAndClear();
- aFilterLb.disposeAndClear();
+ mxFmtLb.reset();
+ mxPreviewCheckbox.reset();
+ mxFilterLb.reset();
}
// Helper function: Access to the current family item
@@ -934,17 +803,17 @@ void SfxCommonTemplateDialog_Impl::GetSelectedStyle() const
* Is it safe to show the water-can / fill icon. If we've a
* hierarchical widget - we have only single select, otherwise
* we need to check if we have a multi-selection. We either have
- * a pTreeBox showing or an aFmtLb (which we hide when not shown)
+ * a mxTreeBox showing or an mxFmtLb (which we hide when not shown)
*/
bool SfxCommonTemplateDialog_Impl::IsSafeForWaterCan() const
{
- if ( pTreeBox->IsVisible() )
- return pTreeBox->FirstSelected() != nullptr;
+ if (mxTreeBox->get_visible())
+ return mxTreeBox->get_selected_index() != -1;
else
- return aFmtLb->GetSelectionCount() == 1;
+ return mxFmtLb->count_selected_rows() == 1;
}
-void SfxCommonTemplateDialog_Impl::SelectStyle(const OUString &rStr)
+void SfxCommonTemplateDialog_Impl::SelectStyle(const OUString &rStr, bool bIsCallback)
{
const SfxStyleFamilyItem* pItem = GetFamilyItem_Impl();
if ( !pItem )
@@ -960,93 +829,85 @@ void SfxCommonTemplateDialog_Impl::SelectStyle(const OUString &rStr)
}
else
{
- EnableEdit( false );
- EnableHide( false );
- EnableShow( false );
+ EnableEdit(false);
+ EnableHide(false);
+ EnableShow(false);
}
- if ( pTreeBox->IsVisible() )
+ if (!bIsCallback)
{
- if ( !rStr.isEmpty() )
+ if (mxTreeBox->get_visible())
{
- SvTreeListEntry* pEntry = pTreeBox->First();
- while ( pEntry )
+ if (!rStr.isEmpty())
{
- if ( pTreeBox->GetEntryText( pEntry ) == rStr )
+ std::unique_ptr<weld::TreeIter> xEntry = mxTreeBox->make_iterator();
+ bool bEntry = mxTreeBox->get_iter_first(*xEntry);
+ while (bEntry)
{
- pTreeBox->MakeVisible( pEntry );
- pTreeBox->Select( pEntry );
- return;
+ if (mxTreeBox->get_text(*xEntry) == rStr)
+ {
+ mxTreeBox->scroll_to_row(*xEntry);
+ mxTreeBox->select(*xEntry);
+ return;
+ }
+ bEntry = mxTreeBox->iter_next(*xEntry);
}
- pEntry = pTreeBox->Next( pEntry );
}
+ else
+ mxTreeBox->unselect_all();
}
else
- pTreeBox->SelectAll( false );
- }
- else
- {
- bool bSelect = ! rStr.isEmpty();
- if ( bSelect )
{
- SvTreeListEntry* pEntry = aFmtLb->FirstVisible();
- while ( pEntry && aFmtLb->GetEntryText( pEntry ) != rStr )
- pEntry = aFmtLb->NextVisible( pEntry );
- if ( !pEntry )
- bSelect = false;
- else
+ bool bSelect = !rStr.isEmpty();
+ if (bSelect)
{
- if (!aFmtLb->IsSelected(pEntry))
+ std::unique_ptr<weld::TreeIter> xEntry = mxFmtLb->make_iterator();
+ bool bEntry = mxFmtLb->get_iter_first(*xEntry);
+ while (bEntry && mxFmtLb->get_text(*xEntry) != rStr)
+ bEntry = mxFmtLb->iter_next(*xEntry);
+ if (!bEntry)
+ bSelect = false;
+ else
{
- aFmtLb->MakeVisible( pEntry );
- aFmtLb->SelectAll(false);
- aFmtLb->Select( pEntry );
- bWaterDisabled = !IsSafeForWaterCan();
- FmtSelectHdl( nullptr );
+ if (!mxFmtLb->is_selected(*xEntry))
+ {
+ mxFmtLb->unselect_all();
+ mxFmtLb->scroll_to_row(*xEntry);
+ mxFmtLb->select(*xEntry);
+ FmtSelect(nullptr, bIsCallback);
+ }
}
}
- }
- if ( !bSelect )
- {
- aFmtLb->SelectAll( false );
- EnableEdit(false);
- EnableHide( false );
- EnableShow( false );
+ if (!bSelect)
+ {
+ mxFmtLb->unselect_all();
+ EnableEdit(false);
+ EnableHide(false);
+ EnableShow(false);
+ }
}
}
+
+ bWaterDisabled = !IsSafeForWaterCan();
}
OUString SfxCommonTemplateDialog_Impl::GetSelectedEntry() const
{
OUString aRet;
- if ( pTreeBox->IsVisible() )
- {
- SvTreeListEntry* pEntry = pTreeBox->FirstSelected();
- if ( pEntry )
- aRet = pTreeBox->GetEntryText( pEntry );
- }
+ if (mxTreeBox->get_visible())
+ aRet = mxTreeBox->get_selected_text();
else
- {
- SvTreeListEntry* pEntry = aFmtLb->FirstSelected();
- if ( pEntry )
- aRet = aFmtLb->GetEntryText( pEntry );
- }
+ aRet = mxFmtLb->get_selected_text();
return aRet;
}
-void SfxCommonTemplateDialog_Impl::EnableTreeDrag( bool bEnable )
+void SfxCommonTemplateDialog_Impl::EnableTreeDrag(bool bEnable)
{
- if ( pStyleSheetPool )
+ if (pStyleSheetPool)
{
SfxStyleSheetBase* pStyle = pStyleSheetPool->First();
- if ( pTreeBox->IsVisible() )
- {
- if ( pStyle && pStyle->HasParentSupport() && bEnable )
- pTreeBox->SetDragDropMode(DragDropMode::CTRL_MOVE);
- else
- pTreeBox->SetDragDropMode(DragDropMode::NONE);
- }
+ bAllowReParentDrop = pStyle && pStyle->HasParentSupport() && bEnable;
}
bTreeDrag = bEnable;
}
@@ -1091,7 +952,7 @@ OUString SfxCommonTemplateDialog_Impl::getDefaultStyleName( const SfxStyleFamily
void SfxCommonTemplateDialog_Impl::FillTreeBox()
{
- OSL_ENSURE( pTreeBox, "FillTreeBox() without treebox");
+ assert(mxTreeBox && "FillTreeBox() without treebox");
if (!pStyleSheetPool || nActFamily == 0xffff)
return;
@@ -1103,10 +964,7 @@ void SfxCommonTemplateDialog_Impl::FillTreeBox()
StyleTreeArr_Impl aArr;
SfxStyleSheetBase* pStyle = pStyleSheetPool->First();
- if(pStyle && pStyle->HasParentSupport() && bTreeDrag )
- pTreeBox->SetDragDropMode(DragDropMode::CTRL_MOVE);
- else
- pTreeBox->SetDragDropMode(DragDropMode::NONE);
+ bAllowReParentDrop = pStyle && pStyle->HasParentSupport() && bTreeDrag;
while (pStyle)
{
@@ -1117,44 +975,46 @@ void SfxCommonTemplateDialog_Impl::FillTreeBox()
OUString aUIName = getDefaultStyleName(eFam);
MakeTree_Impl(aArr, aUIName);
std::vector<OUString> aEntries;
- pTreeBox->MakeExpanded_Impl(aEntries);
- pTreeBox->SetUpdateMode( false );
- pTreeBox->Clear();
+ MakeExpanded_Impl(*mxTreeBox, aEntries);
+ mxTreeBox->freeze();
+ mxTreeBox->clear();
const sal_uInt16 nCount = aArr.size();
for (sal_uInt16 i = 0; i < nCount; ++i)
{
- FillBox_Impl(pTreeBox, aArr[i].get(), aEntries, eFam, nullptr);
+ FillBox_Impl(*mxTreeBox, aArr[i].get(), aEntries, eFam, nullptr);
aArr[i].reset();
}
- pTreeBox->Recalc();
- EnableItem(SID_STYLE_WATERCAN, false);
+ EnableItem("watercan", false);
SfxTemplateItem* pState = pFamilyState[nActFamily - 1].get();
- if (nCount)
- pTreeBox->Expand(pTreeBox->First());
+ mxTreeBox->thaw();
+
+ std::unique_ptr<weld::TreeIter> xEntry = mxTreeBox->make_iterator();
+ bool bEntry = mxTreeBox->get_iter_first(*xEntry);
+ if (bEntry && nCount)
+ mxTreeBox->expand_row(*xEntry);
- for (SvTreeListEntry* pEntry = pTreeBox->First(); pEntry; pEntry = pTreeBox->Next(pEntry))
+ while (bEntry)
{
- if (IsExpanded_Impl(aEntries, pTreeBox->GetEntryText(pEntry)))
- pTreeBox->Expand(pEntry);
+ if (IsExpanded_Impl(aEntries, mxTreeBox->get_text(*xEntry)))
+ mxTreeBox->expand_row(*xEntry);
+ bEntry = mxTreeBox->iter_next(*xEntry);
}
- pTreeBox->SetUpdateMode( true );
-
OUString aStyle;
if(pState) // Select current entry
aStyle = pState->GetStyleName();
- SelectStyle(aStyle);
+ SelectStyle(aStyle, false);
EnableDelete();
}
bool SfxCommonTemplateDialog_Impl::HasSelectedStyle() const
{
- return pTreeBox->IsVisible()? pTreeBox->FirstSelected() != nullptr:
- aFmtLb->GetSelectionCount() != 0;
+ return mxTreeBox->get_visible() ? mxTreeBox->get_selected_index() != -1
+ : mxFmtLb->count_selected_rows() != 0;
}
// internal: Refresh the display
@@ -1192,58 +1052,58 @@ void SfxCommonTemplateDialog_Impl::UpdateStyles_Impl(StyleFlags nFlags)
pItem = GetFamilyItem_Impl();
if(nFlags & StyleFlags::UpdateFamily) // Update view type list (Hierarchical, All, etc.
{
- CheckItem(nActFamily); // check Button in Toolbox
- aFilterLb->SetUpdateMode(false);
- aFilterLb->Clear();
+ CheckItem(OString::number(nActFamily)); // check Button in Toolbox
+
+ mxFilterLb->freeze();
+ mxFilterLb->clear();
+
//insert hierarchical at the beginning
- sal_Int32 nPos = aFilterLb->InsertEntry(SfxResId(STR_STYLE_FILTER_HIERARCHICAL), 0);
- aFilterLb->SetEntryData( nPos, reinterpret_cast<void*>(SfxStyleSearchBits::All) );
+ mxFilterLb->append(OUString::number(static_cast<int>(SfxStyleSearchBits::All)), SfxResId(STR_STYLE_FILTER_HIERARCHICAL));
const SfxStyleFilter& rFilter = pItem->GetFilterList();
- for(const SfxFilterTuple& i : rFilter)
+ for (const SfxFilterTuple& i : rFilter)
{
SfxStyleSearchBits nFilterFlags = i.nFlags;
- nPos = aFilterLb->InsertEntry( i.aName );
- aFilterLb->SetEntryData( nPos, reinterpret_cast<void*>(nFilterFlags) );
+ mxFilterLb->append(OUString::number(static_cast<int>(nFilterFlags)), i.aName);
}
- if(nActFilter < aFilterLb->GetEntryCount() - 1)
- aFilterLb->SelectEntryPos(nActFilter + 1);
+ mxFilterLb->thaw();
+
+ if (nActFilter < mxFilterLb->get_count() - 1)
+ mxFilterLb->set_active(nActFilter + 1);
else
{
nActFilter = 0;
- aFilterLb->SelectEntryPos(1);
+ mxFilterLb->set_active(1);
SfxStyleSearchBits nFilterFlags = (nActFilter < rFilter.size()) ? rFilter[nActFilter].nFlags : SfxStyleSearchBits::Auto;
pStyleSheetPool->SetSearchMask(eFam, nFilterFlags);
}
// if the tree view again, select family hierarchy
- if (pTreeBox->IsVisible() || m_bWantHierarchical)
+ if (mxTreeBox->get_visible() || m_bWantHierarchical)
{
- aFilterLb->SelectEntry(SfxResId(STR_STYLE_FILTER_HIERARCHICAL));
+ mxFilterLb->set_active_text(SfxResId(STR_STYLE_FILTER_HIERARCHICAL));
EnableHierarchical(true);
}
-
- // show maximum 14 entries
- aFilterLb->SetDropDownLineCount( MAX_FILTER_ENTRIES );
- aFilterLb->SetUpdateMode(true);
}
else
{
- if (nActFilter < aFilterLb->GetEntryCount() - 1)
- aFilterLb->SelectEntryPos(nActFilter + 1);
+ if (nActFilter < mxFilterLb->get_count() - 1)
+ mxFilterLb->set_active(nActFilter + 1);
else
{
nActFilter = 0;
- aFilterLb->SelectEntryPos(1);
+ mxFilterLb->set_active(1);
}
}
if(!(nFlags & StyleFlags::UpdateFamilyList))
return;
- EnableItem(SID_STYLE_WATERCAN,false);
+ EnableItem("watercan", false);
SfxStyleSheetBase *pStyle = pStyleSheetPool->First();
- SvTreeListEntry* pEntry = aFmtLb->First();
+
+ std::unique_ptr<weld::TreeIter> xEntry = mxFmtLb->make_iterator();
+ bool bEntry = mxFmtLb->get_iter_first(*xEntry);
std::vector<OUString> aStrings;
comphelper::string::NaturalStringSorter aSorter(
@@ -1273,37 +1133,30 @@ void SfxCommonTemplateDialog_Impl::UpdateStyles_Impl(StyleFlags nFlags)
size_t nCount = aStrings.size();
size_t nPos = 0;
- while(nPos < nCount && pEntry &&
- aStrings[nPos] == aFmtLb->GetEntryText(pEntry))
+ while (nPos < nCount && bEntry &&
+ aStrings[nPos] == mxFmtLb->get_text(*xEntry))
{
++nPos;
- pEntry = aFmtLb->Next( pEntry );
+ bEntry = mxFmtLb->iter_next(*xEntry);
}
- if( nPos < nCount || pEntry )
+ if (nPos < nCount || bEntry)
{
// Fills the display box
- aFmtLb->SetUpdateMode(false);
- aFmtLb->Clear();
+ mxFmtLb->freeze();
+ mxFmtLb->clear();
- for(nPos = 0; nPos < nCount; ++nPos)
- {
- SvTreeListEntry* pTreeListEntry = aFmtLb->InsertEntry(aStrings[nPos], nullptr, false, nPos);
- if (officecfg::Office::Common::StylesAndFormatting::Preview::get())
- {
- pTreeListEntry->ReplaceItem(std::make_unique<StyleLBoxString>(aStrings[nPos], eFam), 1);
- }
- aFmtLb->GetModel()->InvalidateEntry(pTreeListEntry);
- }
- aFmtLb->Recalc();
- aFmtLb->SetUpdateMode(true);
+ for (nPos = 0; nPos < nCount; ++nPos)
+ mxFmtLb->append(aStrings[nPos], aStrings[nPos]);
+
+ mxFmtLb->thaw();
}
// Selects the current style if any
SfxTemplateItem *pState = pFamilyState[nActFamily-1].get();
OUString aStyle;
if(pState)
aStyle = pState->GetStyleName();
- SelectStyle(aStyle);
+ SelectStyle(aStyle, false);
EnableDelete();
}
@@ -1318,15 +1171,15 @@ void SfxCommonTemplateDialog_Impl::SetWaterCanState(const SfxBoolItem *pItem)
if(pItem && !bWaterDisabled)
{
- CheckItem(SID_STYLE_WATERCAN, pItem->GetValue());
- EnableItem( SID_STYLE_WATERCAN );
+ CheckItem("watercan", pItem->GetValue());
+ EnableItem("watercan");
}
else
{
if(!bWaterDisabled)
- EnableItem(SID_STYLE_WATERCAN);
+ EnableItem("watercan");
else
- EnableItem(SID_STYLE_WATERCAN, false);
+ EnableItem("watercan", false);
}
// Ignore while in watercan mode statusupdates
@@ -1411,7 +1264,7 @@ void SfxCommonTemplateDialog_Impl::Update_Impl()
// current region not within the allowed region or default
if(nActFamily == 0xffff || nullptr == (pItem = pFamilyState[nActFamily-1].get() ) )
{
- CheckItem(nActFamily, false);
+ CheckItem(OString::number(nActFamily), false);
const size_t nFamilyCount = pStyleFamilies->size();
size_t n;
for( n = 0; n < nFamilyCount; n++ )
@@ -1425,13 +1278,13 @@ void SfxCommonTemplateDialog_Impl::Update_Impl()
else if( bDocChanged )
{
// other DocShell -> all new
- CheckItem( nActFamily );
+ CheckItem(OString::number(nActFamily));
nActFilter = static_cast< sal_uInt16 >( LoadFactoryStyleFilter( pDocShell ) );
if ( 0xffff == nActFilter )
nActFilter = pDocShell->GetAutoStyleFilterIndex();
nAppFilter = pItem->GetValue();
- if(!pTreeBox->IsVisible())
+ if (!mxTreeBox->get_visible())
{
UpdateStyles_Impl(StyleFlags::UpdateFamilyList);
}
@@ -1441,13 +1294,13 @@ void SfxCommonTemplateDialog_Impl::Update_Impl()
else
{
// other filters for automatic
- CheckItem( nActFamily );
+ CheckItem(OString::number(nActFamily));
const SfxStyleFamilyItem *pStyleItem = GetFamilyItem_Impl();
if ( pStyleItem && SfxStyleSearchBits::Auto == pStyleItem->GetFilterList()[nActFilter].nFlags
&& nAppFilter != pItem->GetValue())
{
nAppFilter = pItem->GetValue();
- if(!pTreeBox->IsVisible())
+ if (!mxTreeBox->get_visible())
UpdateStyles_Impl(StyleFlags::UpdateFamilyList);
else
FillTreeBox();
@@ -1456,7 +1309,7 @@ void SfxCommonTemplateDialog_Impl::Update_Impl()
nAppFilter = pItem->GetValue();
}
const OUString aStyle(pItem->GetStyleName());
- SelectStyle(aStyle);
+ SelectStyle(aStyle, false);
EnableDelete();
EnableNew( bCanNew );
}
@@ -1466,7 +1319,7 @@ IMPL_LINK_NOARG( SfxCommonTemplateDialog_Impl, TimeOut, Timer *, void )
if(!bDontUpdate)
{
bDontUpdate=true;
- if(!pTreeBox->IsVisible())
+ if (!mxTreeBox->get_visible())
UpdateStyles_Impl(StyleFlags::UpdateFamilyList);
else
{
@@ -1474,7 +1327,7 @@ IMPL_LINK_NOARG( SfxCommonTemplateDialog_Impl, TimeOut, Timer *, void )
SfxTemplateItem *pState = pFamilyState[nActFamily-1].get();
if(pState)
{
- SelectStyle(pState->GetStyleName());
+ SelectStyle(pState->GetStyleName(), false);
EnableDelete();
}
}
@@ -1499,7 +1352,7 @@ void SfxCommonTemplateDialog_Impl::Notify(SfxBroadcaster& /*rBC*/, const SfxHint
if (
bUpdate &&
(
- !IsCheckedItem(SID_STYLE_WATERCAN) ||
+ !IsCheckedItem("watercan") ||
(pDocShell && pDocShell->GetStyleSheetPool() != pStyleSheetPool)
)
)
@@ -1642,7 +1495,7 @@ bool SfxCommonTemplateDialog_Impl::Execute_Impl(
if ( !pItem || aDeleted )
return false;
- if ( (nId == SID_STYLE_NEW || SID_STYLE_EDIT == nId) && (pTreeBox->IsVisible() || aFmtLb->GetSelectionCount() <= 1) )
+ if ( (nId == SID_STYLE_NEW || SID_STYLE_EDIT == nId) && (mxTreeBox->get_visible() || mxFmtLb->count_selected_rows() <= 1) )
{
const SfxUInt16Item *pFilterItem = dynamic_cast< const SfxUInt16Item* >(pItem);
assert(pFilterItem);
@@ -1676,29 +1529,27 @@ void SfxCommonTemplateDialog_Impl::EnableHierarchical(bool const bEnable)
m_bWantHierarchical = true;
SaveSelection(); // fdo#61429 store "hierarchical"
const OUString aSelectEntry( GetSelectedEntry());
- aFmtLb->Hide();
- pTreeBox->SetFont( aFmtLb->GetFont() );
- pTreeBox->SetPosSizePixel(aFmtLb->GetPosPixel(), aFmtLb->GetSizePixel());
+ mxFmtLb->hide();
FillTreeBox();
- SelectStyle(aSelectEntry);
- pTreeBox->Show();
+ SelectStyle(aSelectEntry, false);
+ mxTreeBox->show();
}
}
else
{
- pTreeBox->Hide();
- aFmtLb->Show();
+ mxTreeBox->hide();
+ mxFmtLb->show();
// If bHierarchical, then the family can have changed
// minus one since hierarchical is inserted at the start
m_bWantHierarchical = false; // before FilterSelect
- FilterSelect(aFilterLb->GetSelectedEntryPos() - 1, bHierarchical );
+ FilterSelect(mxFilterLb->get_active() - 1, bHierarchical );
bHierarchical=false;
}
}
-IMPL_LINK( SfxCommonTemplateDialog_Impl, FilterSelectHdl, ListBox&, rBox, void )
+IMPL_LINK(SfxCommonTemplateDialog_Impl, FilterSelectHdl, weld::ComboBox&, rBox, void)
{
- if (SfxResId(STR_STYLE_FILTER_HIERARCHICAL) == rBox.GetSelectedEntry())
+ if (SfxResId(STR_STYLE_FILTER_HIERARCHICAL) == rBox.get_active_text())
{
EnableHierarchical(true);
}
@@ -1714,7 +1565,7 @@ void SfxCommonTemplateDialog_Impl::FamilySelect(sal_uInt16 nEntry, bool bPreview
assert((0 < nEntry && nEntry <= MAX_FAMILIES) || 0xffff == nEntry);
if( nEntry != nActFamily || bPreviewRefresh )
{
- CheckItem( nActFamily, false );
+ CheckItem(OString::number(nActFamily), false);
nActFamily = nEntry;
SfxDispatcher* pDispat = pBindings->GetDispatcher_Impl();
SfxUInt16Item const aItem(SID_STYLE_FAMILY,
@@ -1726,80 +1577,74 @@ void SfxCommonTemplateDialog_Impl::FamilySelect(sal_uInt16 nEntry, bool bPreview
}
}
-void SfxCommonTemplateDialog_Impl::ActionSelect(sal_uInt16 nEntry)
+void SfxCommonTemplateDialog_Impl::ActionSelect(const OString& rEntry)
{
- switch(nEntry)
+ if (rEntry == "watercan")
{
- case SID_STYLE_WATERCAN:
+ const bool bOldState = !IsCheckedItem(rEntry);
+ bool bCheck;
+ SfxBoolItem aBool;
+ // when a template is chosen.
+ if (!bOldState && HasSelectedStyle())
{
- const bool bState = IsCheckedItem(nEntry);
- bool bCheck;
- SfxBoolItem aBool;
- // when a template is chosen.
- if (!bState && HasSelectedStyle())
- {
- const OUString aTemplName(
- GetSelectedEntry());
- Execute_Impl(
- SID_STYLE_WATERCAN, aTemplName, "",
- static_cast<sal_uInt16>(GetFamilyItem_Impl()->GetFamily()) );
- bCheck = true;
- }
- else
- {
- Execute_Impl(SID_STYLE_WATERCAN, "", "", 0);
- bCheck = false;
- }
- CheckItem(nEntry, bCheck);
- aBool.SetValue(bCheck);
- SetWaterCanState(&aBool);
- break;
+ const OUString aTemplName(
+ GetSelectedEntry());
+ Execute_Impl(
+ SID_STYLE_WATERCAN, aTemplName, "",
+ static_cast<sal_uInt16>(GetFamilyItem_Impl()->GetFamily()) );
+ bCheck = true;
}
- case SID_STYLE_NEW_BY_EXAMPLE:
+ else
+ {
+ Execute_Impl(SID_STYLE_WATERCAN, "", "", 0);
+ bCheck = false;
+ }
+ CheckItem(rEntry, bCheck);
+ aBool.SetValue(bCheck);
+ SetWaterCanState(&aBool);
+ }
+ else if (rEntry == "new" || rEntry == "newmenu")
+ {
+ if(pStyleSheetPool && nActFamily != 0xffff)
{
- if(pStyleSheetPool && nActFamily != 0xffff)
+ const SfxStyleFamily eFam=GetFamilyItem_Impl()->GetFamily();
+ const SfxStyleFamilyItem *pItem = GetFamilyItem_Impl();
+ SfxStyleSearchBits nFilter;
+ if( pItem && nActFilter != 0xffff )
{
- const SfxStyleFamily eFam=GetFamilyItem_Impl()->GetFamily();
- const SfxStyleFamilyItem *pItem = GetFamilyItem_Impl();
- SfxStyleSearchBits nFilter;
- if( pItem && nActFilter != 0xffff )
- {
- nFilter = pItem->GetFilterList()[nActFilter].nFlags;
- if(nFilter == SfxStyleSearchBits::Auto) // automatic
- nFilter = nAppFilter;
- }
- else
- nFilter=pStyleSheetPool->GetSearchMask();
- pStyleSheetPool->SetSearchMask( eFam, SfxStyleSearchBits::UserDefined );
+ nFilter = pItem->GetFilterList()[nActFilter].nFlags;
+ if(nFilter == SfxStyleSearchBits::Auto) // automatic
+ nFilter = nAppFilter;
+ }
+ else
+ nFilter=pStyleSheetPool->GetSearchMask();
+ pStyleSheetPool->SetSearchMask( eFam, SfxStyleSearchBits::UserDefined );
- // why? : FloatingWindow must not be parent of a modal dialog
- SfxNewStyleDlg aDlg(pWindow ? pWindow->GetFrameWeld() : nullptr, *pStyleSheetPool);
- if (aDlg.run() == RET_OK)
- {
- pStyleSheetPool->SetSearchMask(eFam, nFilter);
- const OUString aTemplName(aDlg.GetName());
- Execute_Impl(SID_STYLE_NEW_BY_EXAMPLE,
- aTemplName, "",
- static_cast<sal_uInt16>(GetFamilyItem_Impl()->GetFamily()),
- nFilter);
- UpdateFamily_Impl();
- }
- pStyleSheetPool->SetSearchMask( eFam, nFilter );
+ // why? : FloatingWindow must not be parent of a modal dialog
+ SfxNewStyleDlg aDlg(pWindow ? pWindow->GetFrameWeld() : nullptr, *pStyleSheetPool);
+ if (aDlg.run() == RET_OK)
+ {
+ pStyleSheetPool->SetSearchMask(eFam, nFilter);
+ const OUString aTemplName(aDlg.GetName());
+ Execute_Impl(SID_STYLE_NEW_BY_EXAMPLE,
+ aTemplName, "",
+ static_cast<sal_uInt16>(GetFamilyItem_Impl()->GetFamily()),
+ nFilter);
+ UpdateFamily_Impl();
}
- break;
- }
- case SID_STYLE_UPDATE_BY_EXAMPLE:
- {
- Execute_Impl(SID_STYLE_UPDATE_BY_EXAMPLE,
- "", "",
- static_cast<sal_uInt16>(GetFamilyItem_Impl()->GetFamily()));
- break;
+ pStyleSheetPool->SetSearchMask( eFam, nFilter );
}
- case SID_TEMPLATE_LOAD:
- SfxGetpApp()->GetDispatcher_Impl()->Execute(nEntry);
- break;
- default: OSL_FAIL("not implemented"); break;
}
+ else if (rEntry == "update")
+ {
+ Execute_Impl(SID_STYLE_UPDATE_BY_EXAMPLE,
+ "", "",
+ static_cast<sal_uInt16>(GetFamilyItem_Impl()->GetFamily()));
+ }
+ else if (rEntry == "load")
+ SfxGetpApp()->GetDispatcher_Impl()->Execute(SID_TEMPLATE_LOAD);
+ else
+ SAL_WARN("sfx", "not implemented: " << rEntry);
}
static OUString getModuleIdentifier( const Reference< XModuleManager2 >& i_xModMgr, SfxObjectShell const * i_pObjSh )
@@ -1860,20 +1705,19 @@ SfxObjectShell* SfxCommonTemplateDialog_Impl::SaveSelection()
return pDocShell;
}
-IMPL_LINK( SfxCommonTemplateDialog_Impl, DropHdl, StyleTreeListBox_Impl&, rBox, bool )
+void SfxCommonTemplateDialog_Impl::DropHdl(const OUString& rStyle, const OUString& rParent)
{
bDontUpdate = true;
const SfxStyleFamilyItem *pItem = GetFamilyItem_Impl();
const SfxStyleFamily eFam = pItem->GetFamily();
- bool ret = pStyleSheetPool->SetParent(eFam, rBox.GetStyle(), rBox.GetParent());
+ pStyleSheetPool->SetParent(eFam, rStyle, rParent);
bDontUpdate = false;
- return ret;
}
// Handler for the New-Buttons
void SfxCommonTemplateDialog_Impl::NewHdl()
{
- if ( nActFamily == 0xffff || !(pTreeBox->IsVisible() || aFmtLb->GetSelectionCount() <= 1))
+ if ( nActFamily == 0xffff || !(mxTreeBox->get_visible() || mxFmtLb->count_selected_rows() <= 1))
return;
const SfxStyleFamilyItem *pItem = GetFamilyItem_Impl();
@@ -1917,18 +1761,17 @@ void SfxCommonTemplateDialog_Impl::DeleteHdl()
bool bUsedStyle = false; // one of the selected styles are used in the document?
- std::vector<SvTreeListEntry*> aList;
- SvTreeListEntry* pEntry = pTreeBox->IsVisible() ? pTreeBox->FirstSelected() : aFmtLb->FirstSelected();
+ std::vector<std::unique_ptr<weld::TreeIter>> aList;
+ weld::TreeView* pTreeView = mxTreeBox->get_visible() ? mxTreeBox.get() : mxFmtLb.get();
const SfxStyleFamilyItem* pItem = GetFamilyItem_Impl();
OUStringBuffer aMsg;
aMsg.append(SfxResId(STR_DELETE_STYLE_USED)).append(SfxResId(STR_DELETE_STYLE));
- while (pEntry)
- {
- aList.push_back( pEntry );
+ pTreeView->selected_foreach([this, pTreeView, pItem, &aList, &bUsedStyle, &aMsg](weld::TreeIter& rEntry){
+ aList.emplace_back(pTreeView->make_iterator(&rEntry));
// check the style is used or not
- const OUString aTemplName(pTreeBox->IsVisible() ? pTreeBox->GetEntryText(pEntry) : aFmtLb->GetEntryText(pEntry));
+ const OUString aTemplName(pTreeView->get_text(rEntry));
SfxStyleSheetBase* pStyle = pStyleSheetPool->Find( aTemplName, pItem->GetFamily() );
@@ -1940,17 +1783,17 @@ void SfxCommonTemplateDialog_Impl::DeleteHdl()
bUsedStyle = true;
}
- pEntry = pTreeBox->IsVisible() ? pTreeBox->NextSelected(pEntry) : aFmtLb->NextSelected(pEntry);
- }
+ return false;
+ });
bool aApproved = false;
// we only want to show the dialog once and if we want to delete a style in use (UX-advice)
- if ( bUsedStyle )
+ if (bUsedStyle)
{
- std::unique_ptr<weld::MessageDialog> xBox(Application::CreateMessageDialog(GetFrameWeld(),
- VclMessageType::Question, VclButtonsType::YesNo,
- aMsg.makeStringAndClear()));
+ std::unique_ptr<weld::MessageDialog> xBox(Application::CreateMessageDialog(pTreeView,
+ VclMessageType::Question, VclButtonsType::YesNo,
+ aMsg.makeStringAndClear()));
aApproved = xBox->run() == RET_YES;
}
@@ -1960,14 +1803,14 @@ void SfxCommonTemplateDialog_Impl::DeleteHdl()
for (auto const& elem : aList)
{
- const OUString aTemplName(pTreeBox->IsVisible() ? pTreeBox->GetEntryText(elem) : aFmtLb->GetEntryText(elem));
+ const OUString aTemplName(pTreeView->get_text(*elem));
bDontUpdate = true; // To prevent the Treelistbox to shut down while deleting
Execute_Impl( SID_STYLE_DELETE, aTemplName,
OUString(), static_cast<sal_uInt16>(GetFamilyItem_Impl()->GetFamily()) );
- if ( pTreeBox->IsVisible() )
+ if (mxTreeBox->get_visible())
{
- pTreeBox->RemoveParentKeepChildren(elem);
+ weld::RemoveParentKeepChildren(*mxTreeBox, *elem);
bDontUpdate = false;
}
}
@@ -1980,17 +1823,15 @@ void SfxCommonTemplateDialog_Impl::HideHdl()
if ( !IsInitialized() || !HasSelectedStyle() )
return;
- SvTreeListEntry* pEntry = pTreeBox->IsVisible() ? pTreeBox->FirstSelected() : aFmtLb->FirstSelected();
-
- while (pEntry)
- {
- OUString aTemplName = pTreeBox->IsVisible() ? pTreeBox->GetEntryText(pEntry) : aFmtLb->GetEntryText(pEntry);
+ weld::TreeView* pTreeView = mxTreeBox->get_visible() ? mxTreeBox.get() : mxFmtLb.get();
+ pTreeView->selected_foreach([this, pTreeView](weld::TreeIter& rEntry){
+ OUString aTemplName = pTreeView->get_text(rEntry);
Execute_Impl( SID_STYLE_HIDE, aTemplName,
OUString(), static_cast<sal_uInt16>(GetFamilyItem_Impl()->GetFamily()) );
- pEntry = pTreeBox->IsVisible() ? pTreeBox->NextSelected(pEntry) : aFmtLb->NextSelected(pEntry);
- }
+ return false;
+ });
}
void SfxCommonTemplateDialog_Impl::ShowHdl()
@@ -1998,17 +1839,15 @@ void SfxCommonTemplateDialog_Impl::ShowHdl()
if ( !IsInitialized() || !HasSelectedStyle() )
return;
- SvTreeListEntry* pEntry = pTreeBox->IsVisible() ? pTreeBox->FirstSelected() : aFmtLb->FirstSelected();
-
- while (pEntry)
- {
- OUString aTemplName = pTreeBox->IsVisible() ? pTreeBox->GetEntryText(pEntry) : aFmtLb->GetEntryText(pEntry);
+ weld::TreeView* pTreeView = mxTreeBox->get_visible() ? mxTreeBox.get() : mxFmtLb.get();
+ pTreeView->selected_foreach([this, pTreeView](weld::TreeIter& rEntry){
+ OUString aTemplName = pTreeView->get_text(rEntry);
Execute_Impl( SID_STYLE_SHOW, aTemplName,
OUString(), static_cast<sal_uInt16>(GetFamilyItem_Impl()->GetFamily()) );
- pEntry = pTreeBox->IsVisible() ? pTreeBox->NextSelected(pEntry) : aFmtLb->NextSelected(pEntry);
- }
+ return false;
+ });
}
void SfxCommonTemplateDialog_Impl::EnableDelete()
@@ -2026,7 +1865,7 @@ void SfxCommonTemplateDialog_Impl::EnableDelete()
if(nFilter == SfxStyleSearchBits::Auto) // automatic
nFilter = nAppFilter;
const SfxStyleSheetBase *pStyle =
- pStyleSheetPool->Find(aTemplName,eFam, pTreeBox->IsVisible()? SfxStyleSearchBits::All : nFilter);
+ pStyleSheetPool->Find(aTemplName,eFam, mxTreeBox->get_visible() ? SfxStyleSearchBits::All : nFilter);
OSL_ENSURE(pStyle, "Style not found");
if (pStyle && pStyle->IsUserDefined())
@@ -2054,24 +1893,23 @@ void SfxCommonTemplateDialog_Impl::EnableDelete()
EnableDel(bEnableDelete);
}
-IMPL_LINK_NOARG( SfxCommonTemplateDialog_Impl, TreeListApplyHdl, SvTreeListBox *, bool )
+IMPL_LINK(SfxCommonTemplateDialog_Impl, MousePressHdl, const MouseEvent&, rMEvt, bool)
{
- ApplyHdl(nullptr);
+ m_nModifier = rMEvt.GetModifier();
return false;
}
// Double-click on a style sheet in the ListBox is applied.
-IMPL_LINK_NOARG( SfxCommonTemplateDialog_Impl, ApplyHdl, LinkParamNone*, void )
+IMPL_LINK_NOARG(SfxCommonTemplateDialog_Impl, TreeListApplyHdl, weld::TreeView&, bool)
{
// only if that region is allowed
if ( IsInitialized() && nullptr != pFamilyState[nActFamily-1] &&
!GetSelectedEntry().isEmpty() )
{
- sal_uInt16 nModifier = aFmtLb->GetModifier();
Execute_Impl(SID_STYLE_APPLY,
GetSelectedEntry(), OUString(),
static_cast<sal_uInt16>(GetFamilyItem_Impl()->GetFamily()),
- SfxStyleSearchBits::Auto, nullptr, &nModifier );
+ SfxStyleSearchBits::Auto, nullptr, &m_nModifier);
}
// After selecting a focused item if possible again on the app window
if ( dynamic_cast< const SfxTemplateDialog_Impl* >(this) != nullptr )
@@ -2082,43 +1920,49 @@ IMPL_LINK_NOARG( SfxCommonTemplateDialog_Impl, ApplyHdl, LinkParamNone*, void )
if(pAppWin)
pAppWin->GrabFocus();
}
+
+ return true;
}
-IMPL_LINK_NOARG( SfxCommonTemplateDialog_Impl, PreviewHdl, Button*, void)
+IMPL_LINK_NOARG(SfxCommonTemplateDialog_Impl, PreviewHdl, weld::Button&, void)
{
std::shared_ptr<comphelper::ConfigurationChanges> batch( comphelper::ConfigurationChanges::create() );
- officecfg::Office::Common::StylesAndFormatting::Preview::set( aPreviewCheckbox->IsChecked(), batch );
+ bool bCustomPreview = mxPreviewCheckbox->get_active();
+ officecfg::Office::Common::StylesAndFormatting::Preview::set(bCustomPreview, batch );
batch->commit();
- if(!bHierarchical)
- {
- sal_uInt16 nSize = aFmtLb->GetEntryCount();
- for (sal_uInt16 nPos = 0; nPos < nSize; ++nPos )
- {
- SvTreeListEntry* pTreeListEntry = aFmtLb->GetEntry(nPos);
- OUString aEntryStr = aFmtLb->GetEntryText(pTreeListEntry);
- const SfxStyleFamily eFam = aPreviewCheckbox->IsChecked() ? GetFamilyItem_Impl()->GetFamily(): SfxStyleFamily::None;
- pTreeListEntry->ReplaceItem(std::make_unique<StyleLBoxString>(aEntryStr, eFam), 1);
- aFmtLb->GetModel()->InvalidateEntry(pTreeListEntry);
- aFmtLb->Recalc();
- }
- }
- else
- {
- FamilySelect(nActFamily, true);
- }
+
+ mxFmtLb->clear();
+ mxFmtLb->set_column_custom_renderer(0, bCustomPreview);
+ mxTreeBox->clear();
+ mxTreeBox->set_column_custom_renderer(0, bCustomPreview);
+
+ FamilySelect(nActFamily, true);
}
// Selection of a template during the Watercan-Status
-IMPL_LINK( SfxCommonTemplateDialog_Impl, FmtSelectHdl, SvTreeListBox *, pListBox, void )
+IMPL_LINK(SfxCommonTemplateDialog_Impl, FmtSelectHdl, weld::TreeView&, rListBox, void)
{
+ FmtSelect(&rListBox, true);
+}
+
+void SfxCommonTemplateDialog_Impl::FmtSelect(weld::TreeView* pListBox, bool bIsCallback)
+{
+ std::unique_ptr<weld::TreeIter> xHdlEntry;
+ if (pListBox)
+ {
+ xHdlEntry = pListBox->make_iterator();
+ if (!pListBox->get_cursor(xHdlEntry.get()))
+ return;
+ }
+
// Trigger Help PI, if this is permitted of call handlers and field
- if( !pListBox || pListBox->IsSelected( pListBox->GetHdlEntry() ) )
+ if (!pListBox || pListBox->is_selected(*xHdlEntry))
{
// Only when the watercan is on
if ( IsInitialized() &&
- IsCheckedItem(SID_STYLE_WATERCAN) &&
+ IsCheckedItem("watercan") &&
// only if that region is allowed
- nullptr != pFamilyState[nActFamily-1] && (pTreeBox || aFmtLb->GetSelectionCount() <= 1) )
+ nullptr != pFamilyState[nActFamily-1] && (mxTreeBox || mxFmtLb->count_selected_rows() <= 1) )
{
Execute_Impl(SID_STYLE_WATERCAN,
"", "", 0);
@@ -2126,24 +1970,25 @@ IMPL_LINK( SfxCommonTemplateDialog_Impl, FmtSelectHdl, SvTreeListBox *, pListBox
GetSelectedEntry(), "",
static_cast<sal_uInt16>(GetFamilyItem_Impl()->GetFamily()));
}
- EnableItem(SID_STYLE_WATERCAN, !bWaterDisabled);
+ EnableItem("watercan", !bWaterDisabled);
EnableDelete();
}
if( !pListBox )
return;
- SelectStyle( pListBox->GetEntryText( pListBox->GetHdlEntry() ));
+ SelectStyle(pListBox->get_text(*xHdlEntry), bIsCallback);
}
-IMPL_LINK( SfxCommonTemplateDialog_Impl, MenuSelectHdl, Menu*, pMenu, bool )
+void SfxCommonTemplateDialog_Impl::MenuSelect(const OString& rIdent)
{
- sLastItemIdent = pMenu->GetCurItemIdent();
+ sLastItemIdent = rIdent;
+ if (sLastItemIdent.isEmpty())
+ return;
Application::PostUserEvent(
- LINK( this, SfxCommonTemplateDialog_Impl, MenuSelectAsyncHdl ) );
- return true;
+ LINK(this, SfxCommonTemplateDialog_Impl, MenuSelectAsyncHdl));
}
-IMPL_LINK_NOARG( SfxCommonTemplateDialog_Impl, MenuSelectAsyncHdl, void*, void )
+IMPL_LINK_NOARG(SfxCommonTemplateDialog_Impl, MenuSelectAsyncHdl, void*, void)
{
if (sLastItemIdent == "new")
NewHdl();
@@ -2169,15 +2014,20 @@ SfxStyleFamily SfxCommonTemplateDialog_Impl::GetActualFamily() const
void SfxCommonTemplateDialog_Impl::EnableExample_Impl(sal_uInt16 nId, bool bEnable)
{
bool bDisable = !bEnable || !IsSafeForWaterCan();
- if( nId == SID_STYLE_NEW_BY_EXAMPLE )
+ if (nId == SID_STYLE_NEW_BY_EXAMPLE)
+ {
bNewByExampleDisabled = bDisable;
+ EnableItem("new", bEnable);
+ EnableItem("newmenu", bEnable);
+ }
else if( nId == SID_STYLE_UPDATE_BY_EXAMPLE )
+ {
bUpdateByExampleDisabled = bDisable;
-
- EnableItem(nId, bEnable);
+ EnableItem("update", bEnable);
+ }
}
-VclPtr<PopupMenu> const & SfxCommonTemplateDialog_Impl::CreateContextMenu()
+void SfxCommonTemplateDialog_Impl::CreateContextMenu()
{
if ( bBindingUpdate )
{
@@ -2185,68 +2035,82 @@ VclPtr<PopupMenu> const & SfxCommonTemplateDialog_Impl::CreateContextMenu()
pBindings->Update( SID_STYLE_NEW );
bBindingUpdate = false;
}
- mxMenu.disposeAndClear();
- mxBuilder.reset(new VclBuilder(nullptr, VclBuilderContainer::getUIRootDir(), "sfx/ui/stylecontextmenu.ui", ""));
- mxMenu.set(mxBuilder->get_menu("menu"));
- mxMenu->SetMenuFlags(MenuFlags::AlwaysShowDisabledEntries);
- mxMenu->SetSelectHdl( LINK( this, SfxCommonTemplateDialog_Impl, MenuSelectHdl ) );
- mxMenu->EnableItem(mxMenu->GetItemId("edit"), bCanEdit);
- mxMenu->EnableItem(mxMenu->GetItemId("delete"), bCanDel);
- mxMenu->EnableItem(mxMenu->GetItemId("new"), bCanNew);
- mxMenu->EnableItem(mxMenu->GetItemId("hide"), bCanHide);
- mxMenu->EnableItem(mxMenu->GetItemId("show"), bCanShow);
+ mxMenu.reset();
+ mxMenuBuilder.reset(Application::CreateBuilder(nullptr, "sfx/ui/stylecontextmenu.ui"));
+ mxMenu = mxMenuBuilder->weld_menu("menu");
+ mxMenu->set_sensitive("edit", bCanEdit);
+ mxMenu->set_sensitive("delete", bCanDel);
+ mxMenu->set_sensitive("new", bCanNew);
+ mxMenu->set_sensitive("hide", bCanHide);
+ mxMenu->set_sensitive("show", bCanShow);
const SfxStyleFamilyItem* pItem = GetFamilyItem_Impl();
if (pItem && pItem->GetFamily() == SfxStyleFamily::Table) //tdf#101648, no ui for this yet
{
- mxMenu->EnableItem(mxMenu->GetItemId("edit"), false);
- mxMenu->EnableItem(mxMenu->GetItemId("new"), false);
+ mxMenu->set_sensitive("edit", false);
+ mxMenu->set_sensitive("new", false);
}
-
- return mxMenu;
}
SfxTemplateDialog_Impl::SfxTemplateDialog_Impl(SfxBindings* pB, SfxTemplatePanelControl* pDlgWindow)
- : SfxCommonTemplateDialog_Impl(pB, pDlgWindow)
- , m_pFloat(pDlgWindow)
- , m_aActionTbL(VclPtrInstance<DropToolBox_Impl>(pDlgWindow, this))
- , m_aActionTbR(VclPtrInstance<ToolBox>(pDlgWindow))
+ : SfxCommonTemplateDialog_Impl(pB, pDlgWindow, pDlgWindow->get_builder())
+ , m_xActionTbL(pDlgWindow->get_builder()->weld_toolbar("left"))
+ , m_xActionTbR(pDlgWindow->get_builder()->weld_toolbar("right"))
+ , m_xToolMenu(pDlgWindow->get_builder()->weld_menu("toolmenu"))
+ , m_nActionTbLVisible(0)
+{
+ m_xActionTbR->set_item_help_id("watercan", HID_TEMPLDLG_WATERCAN);
+ // shown/hidden in SfxTemplateDialog_Impl::ReplaceUpdateButtonByMenu()
+ m_xActionTbR->set_item_help_id("new", HID_TEMPLDLG_NEWBYEXAMPLE);
+ m_xActionTbR->set_item_help_id("newmenu", HID_TEMPLDLG_NEWBYEXAMPLE);
+ m_xActionTbR->set_item_menu("newmenu", m_xToolMenu.get());
+ m_xToolMenu->connect_activate(LINK(this, SfxTemplateDialog_Impl, ToolMenuSelectHdl));
+ m_xActionTbR->set_item_help_id("update", HID_TEMPLDLG_UPDATEBYEXAMPLE);
+
+ Initialize();
+}
+
+class ToolbarDropTarget final : public DropTargetHelper
{
- m_aActionTbR->InsertItem(SID_STYLE_WATERCAN, Image(StockImage::Yes, RID_SFXBMP_WATERCAN), SfxResId(STR_STYLE_FILL_FORMAT_MODE));
- m_aActionTbR->SetHelpId(SID_STYLE_WATERCAN, HID_TEMPLDLG_WATERCAN);
+private:
+ SfxTemplateDialog_Impl& m_rParent;
- m_aActionTbR->InsertItem(SID_STYLE_NEW_BY_EXAMPLE, Image(StockImage::Yes, RID_SFXBMP_NEW_BY_EXAMPLE), SfxResId(STR_STYLE_NEW_STYLE_FROM_SELECTION));
- //renamed to SID_STYLE_NEW_BY_EXAMPLE in SfxTemplateDialog_Impl::ReplaceUpdateButtonByMenu()
- m_aActionTbR->SetHelpId(SID_STYLE_NEW_BY_EXAMPLE, HID_TEMPLDLG_NEWBYEXAMPLE);
+public:
+ ToolbarDropTarget(SfxTemplateDialog_Impl& rDialog, weld::Toolbar& rToolbar)
+ : DropTargetHelper(rToolbar.get_drop_target())
+ , m_rParent(rDialog)
+ {
+ }
- m_aActionTbR->InsertItem(SID_STYLE_UPDATE_BY_EXAMPLE, Image(StockImage::Yes, RID_SFXBMP_UPDATE_BY_EXAMPLE), SfxResId(STR_STYLE_UPDATE_STYLE));
- m_aActionTbR->SetHelpId(SID_STYLE_UPDATE_BY_EXAMPLE, HID_TEMPLDLG_UPDATEBYEXAMPLE);
+ virtual sal_Int8 AcceptDrop(const AcceptDropEvent& rEvt) override
+ {
+ return m_rParent.AcceptToolbarDrop(rEvt, *this);
+ }
- Initialize();
-}
+ virtual sal_Int8 ExecuteDrop(const ExecuteDropEvent& rEvt) override
+ {
+ return m_rParent.ExecuteDrop(rEvt);
+ }
+};
void SfxTemplateDialog_Impl::Initialize()
{
SfxCommonTemplateDialog_Impl::Initialize();
- m_aActionTbL->SetSelectHdl(LINK(this, SfxTemplateDialog_Impl, ToolBoxLSelect));
- m_aActionTbR->SetSelectHdl(LINK(this, SfxTemplateDialog_Impl, ToolBoxRSelect));
- m_aActionTbR->SetDropdownClickHdl(LINK(this, SfxTemplateDialog_Impl, ToolBoxRClick));
- m_aActionTbL->Show();
- m_aActionTbR->Show();
- vcl::Font aFont = aFilterLb->GetFont();
- aFont.SetWeight( WEIGHT_NORMAL );
- aFilterLb->SetFont( aFont );
- m_aActionTbL->SetHelpId( HID_TEMPLDLG_TOOLBOX_LEFT );
+ m_xActionTbL->connect_clicked(LINK(this, SfxTemplateDialog_Impl, ToolBoxLSelect));
+ m_xActionTbR->connect_clicked(LINK(this, SfxTemplateDialog_Impl, ToolBoxRSelect));
+ m_xActionTbL->set_help_id(HID_TEMPLDLG_TOOLBOX_LEFT);
+
+ m_xToolbarDropTargetHelper.reset(new ToolbarDropTarget(*this, *m_xActionTbL));
}
-void SfxTemplateDialog_Impl::EnableFamilyItem( sal_uInt16 nId, bool bEnable )
+void SfxTemplateDialog_Impl::EnableFamilyItem(sal_uInt16 nId, bool bEnable)
{
- m_aActionTbL->EnableItem( nId, bEnable );
+ m_xActionTbL->set_item_sensitive(OString::number(nId), bEnable);
}
// Insert element into dropdown filter "Frame Styles", "List Styles", etc.
-void SfxTemplateDialog_Impl::InsertFamilyItem(sal_uInt16 nId,const SfxStyleFamilyItem &rItem)
+void SfxTemplateDialog_Impl::InsertFamilyItem(sal_uInt16 nId, const SfxStyleFamilyItem &rItem)
{
OString sHelpId;
switch( rItem.GetFamily() )
@@ -2256,25 +2120,32 @@ void SfxTemplateDialog_Impl::InsertFamilyItem(sal_uInt16 nId,const SfxStyleFamil
case SfxStyleFamily::Frame: sHelpId = ".uno:FrameStyle"; break;
case SfxStyleFamily::Page: sHelpId = ".uno:PageStyle"; break;
case SfxStyleFamily::Pseudo: sHelpId = ".uno:ListStyle"; break;
- case SfxStyleFamily::Table: sHelpId = ".uno:TableStyle"; break;
+ case SfxStyleFamily::Table: sHelpId = ".uno:TableStyle"; break;
default: OSL_FAIL("unknown StyleFamily"); break;
}
- m_aActionTbL->InsertItem( nId, rItem.GetImage(), rItem.GetText(), ToolBoxItemBits::NONE, 0);
- m_aActionTbL->SetHelpId( nId, sHelpId );
+
+ OString sId(OString::number(nId));
+ m_xActionTbL->set_item_visible(sId, true);
+ m_xActionTbL->set_item_icon_name(sId, rItem.GetImage());
+ m_xActionTbL->set_item_tooltip_text(sId, rItem.GetText());
+ m_xActionTbL->set_item_help_id(sId, sHelpId);
+ ++m_nActionTbLVisible;
}
void SfxTemplateDialog_Impl::ReplaceUpdateButtonByMenu()
{
- m_aActionTbR->HideItem(SID_STYLE_UPDATE_BY_EXAMPLE);
- m_aActionTbR->SetItemBits( SID_STYLE_NEW_BY_EXAMPLE,
- ToolBoxItemBits::DROPDOWNONLY|m_aActionTbR->GetItemBits( SID_STYLE_NEW_BY_EXAMPLE ));
- //rename menu in case of Writer
- m_aActionTbR->SetItemText(SID_STYLE_NEW_BY_EXAMPLE, SfxResId(STR_STYLE_NEW_STYLE_ACTION));
+ m_xActionTbR->set_item_visible("update", false);
+ m_xActionTbR->set_item_visible("new", false);
+ m_xActionTbR->set_item_visible("newmenu", true);
+ m_bNewHasMenu = true;
+ FillToolMenu();
}
void SfxTemplateDialog_Impl::ClearFamilyList()
{
- m_aActionTbL->Clear();
+ for (int i = 0, nCount = m_xActionTbL->get_n_items(); i < nCount; ++i)
+ m_xActionTbL->set_item_visible(m_xActionTbL->get_item_ident(i), false);
+
}
void SfxCommonTemplateDialog_Impl::InvalidateBindings()
@@ -2293,197 +2164,72 @@ void SfxCommonTemplateDialog_Impl::InvalidateBindings()
SfxTemplateDialog_Impl::~SfxTemplateDialog_Impl()
{
- m_pFloat.clear();
- m_aActionTbL.disposeAndClear();
- m_aActionTbR.disposeAndClear();
+ m_xToolbarDropTargetHelper.reset();
+ m_xActionTbL.reset();
+ m_xActionTbR.reset();
}
-void SfxTemplateDialog_Impl::LoadedFamilies()
+void SfxTemplateDialog_Impl::EnableItem(const OString& rMesId, bool bCheck)
{
- Resize();
-}
-
-// Override Resize-Handler ( StarView )
-// The size of the Listboxen is adjusted
-void SfxTemplateDialog_Impl::Resize()
-{
- if (m_pFloat == nullptr)
- return;
- Size aDlgSize=m_pFloat->PixelToLogic(m_pFloat->GetOutputSizePixel());
- Size aSizeATL=m_pFloat->PixelToLogic(m_aActionTbL->CalcWindowSizePixel());
- Size aSizeATR=m_pFloat->PixelToLogic(m_aActionTbR->CalcWindowSizePixel());
- Size aMinSize = GetMinOutputSizePixel();
-
- long nListHeight = m_pFloat->PixelToLogic( aFilterLb->GetSizePixel() ).Height();
- long nWidth = aDlgSize.Width()- 2 * SFX_TEMPLDLG_HFRAME;
-
- m_aActionTbL->SetPosSizePixel(m_pFloat->LogicToPixel(Point(SFX_TEMPLDLG_HFRAME,SFX_TEMPLDLG_VTOPFRAME)),
- m_pFloat->LogicToPixel(aSizeATL));
-
- // only change the position of the right toolbox, when the window is wide
- // enough
- Point aPosATR(aDlgSize.Width()-SFX_TEMPLDLG_HFRAME-aSizeATR.Width(),SFX_TEMPLDLG_VTOPFRAME);
- if(aDlgSize.Width() >= aMinSize.Width())
- m_aActionTbR->SetPosPixel(m_pFloat->LogicToPixel(aPosATR));
- else
- m_aActionTbR->SetPosPixel( m_pFloat->LogicToPixel(
- Point( SFX_TEMPLDLG_HFRAME + aSizeATL.Width() + SFX_TEMPLDLG_MIDHSPACE,
- SFX_TEMPLDLG_VTOPFRAME ) ) );
-
- m_aActionTbR->SetSizePixel(m_pFloat->LogicToPixel(aSizeATR));
-
- Point aFilterPos(
- m_pFloat->LogicToPixel(Point(SFX_TEMPLDLG_HFRAME,
- aDlgSize.Height()-SFX_TEMPLDLG_VBOTFRAME-nListHeight)) );
-
- Size aFilterSize(
- m_pFloat->LogicToPixel(Size(nWidth,SFX_TEMPLDLG_FILTERHEIGHT)) );
-
- Point aCheckBoxPos(
- m_pFloat->LogicToPixel(Point(SFX_TEMPLDLG_HFRAME,
- aDlgSize.Height()-SFX_TEMPLDLG_VBOTFRAME-2*nListHeight)) );
-
- Size aCheckBoxSize(
- m_pFloat->LogicToPixel(Size(nWidth, nListHeight)) );
-
- Point aFmtPos(
- m_pFloat->LogicToPixel(Point(SFX_TEMPLDLG_HFRAME, SFX_TEMPLDLG_VTOPFRAME +
- SFX_TEMPLDLG_MIDVSPACE+aSizeATL.Height())) );
- Size aFmtSize(
- m_pFloat->LogicToPixel(Size(nWidth,
- aDlgSize.Height() - SFX_TEMPLDLG_VBOTFRAME -
- SFX_TEMPLDLG_VTOPFRAME - 2*SFX_TEMPLDLG_MIDVSPACE-
- 2*nListHeight-aSizeATL.Height())) );
-
- // only change the position of the listbox, when the window is high enough
- if(aDlgSize.Height() >= aMinSize.Height())
- {
- aFilterLb->SetPosPixel(aFilterPos);
- aFmtLb->SetPosPixel( aFmtPos );
- aPreviewCheckbox->SetPosPixel(aCheckBoxPos);
- if(pTreeBox->IsVisible())
- pTreeBox->SetPosPixel(aFmtPos);
- }
- else
- aFmtSize.AdjustHeight(aFilterSize.Height() );
-
- aFilterLb->SetSizePixel(aFilterSize);
- aFmtLb->SetSizePixel( aFmtSize );
- aPreviewCheckbox->SetSizePixel( aCheckBoxSize );
- if(pTreeBox->IsVisible())
- pTreeBox->SetSizePixel(aFmtSize);
+ if (rMesId == "watercan" && !bCheck && IsCheckedItem("watercan"))
+ Execute_Impl(SID_STYLE_WATERCAN, "", "", 0);
+ m_xActionTbR->set_item_sensitive(rMesId, bCheck);
}
-Size SfxTemplateDialog_Impl::GetMinOutputSizePixel()
+void SfxTemplateDialog_Impl::CheckItem(const OString &rMesId, bool bCheck)
{
- if (m_pFloat != nullptr)
+ if (rMesId == "watercan")
{
- Size aSizeATL=m_pFloat->PixelToLogic(m_aActionTbL->CalcWindowSizePixel());
- Size aSizeATR=m_pFloat->PixelToLogic(m_aActionTbR->CalcWindowSizePixel());
- Size aMinSize(
- aSizeATL.Width()+aSizeATR.Width()+
- 2*SFX_TEMPLDLG_HFRAME + SFX_TEMPLDLG_MIDHSPACE,
- 4*aSizeATL.Height()+2*SFX_TEMPLDLG_MIDVSPACE);
- return aMinSize;
+ bIsWater=bCheck;
+ m_xActionTbR->set_item_active("watercan", bCheck);
}
else
- return Size(0,0);
-}
-
-void SfxTemplateDialog_Impl::EnableItem(sal_uInt16 nMesId, bool bCheck)
-{
- switch(nMesId)
- {
- case SID_STYLE_WATERCAN :
- if(!bCheck && IsCheckedItem(SID_STYLE_WATERCAN))
- Execute_Impl(SID_STYLE_WATERCAN, "", "", 0);
- [[fallthrough]];
- case SID_STYLE_NEW_BY_EXAMPLE:
- case SID_STYLE_UPDATE_BY_EXAMPLE:
- m_aActionTbR->EnableItem(nMesId,bCheck);
- break;
- }
-}
-
-void SfxTemplateDialog_Impl::CheckItem(sal_uInt16 nMesId, bool bCheck)
-{
- switch(nMesId)
- {
- case SID_STYLE_WATERCAN :
- bIsWater=bCheck;
- m_aActionTbR->CheckItem(SID_STYLE_WATERCAN,bCheck);
- break;
- default:
- m_aActionTbL->CheckItem(nMesId,bCheck); break;
- }
+ m_xActionTbL->set_item_active(rMesId, bCheck);
}
-bool SfxTemplateDialog_Impl::IsCheckedItem(sal_uInt16 nMesId)
+bool SfxTemplateDialog_Impl::IsCheckedItem(const OString& rMesId)
{
- switch(nMesId)
- {
- case SID_STYLE_WATERCAN :
- return m_aActionTbR->GetItemState(SID_STYLE_WATERCAN)==TRISTATE_TRUE;
- default:
- return m_aActionTbL->GetItemState(nMesId)==TRISTATE_TRUE;
- }
+ if (rMesId == "watercan")
+ return m_xActionTbR->get_item_active("watercan");
+ return m_xActionTbL->get_item_active(rMesId);
}
-IMPL_LINK( SfxTemplateDialog_Impl, ToolBoxLSelect, ToolBox *, pBox, void )
+IMPL_LINK( SfxTemplateDialog_Impl, ToolBoxLSelect, const OString&, rEntry, void)
{
- const sal_uInt16 nEntry = pBox->GetCurItemId();
- FamilySelect(nEntry);
+ FamilySelect(rEntry.toUInt32());
}
-IMPL_LINK( SfxTemplateDialog_Impl, ToolBoxRSelect, ToolBox *, pBox, void )
+IMPL_LINK(SfxTemplateDialog_Impl, ToolBoxRSelect, const OString&, rEntry, void)
{
- const sal_uInt16 nEntry = pBox->GetCurItemId();
- if(nEntry != SID_STYLE_NEW_BY_EXAMPLE ||
- ToolBoxItemBits::DROPDOWN != (pBox->GetItemBits(nEntry)&ToolBoxItemBits::DROPDOWN))
- ActionSelect(nEntry);
+ if (rEntry == "newmenu")
+ m_xActionTbR->set_menu_item_active(rEntry, !m_xActionTbR->get_menu_item_active(rEntry));
+ else
+ ActionSelect(rEntry);
}
-IMPL_LINK( SfxTemplateDialog_Impl, ToolBoxRClick, ToolBox *, pBox, void )
+void SfxTemplateDialog_Impl::FillToolMenu()
{
- const sal_uInt16 nEntry = pBox->GetCurItemId();
- if(nEntry != SID_STYLE_NEW_BY_EXAMPLE ||
- !(pBox->GetItemBits(nEntry) & ToolBoxItemBits::DROPDOWN))
- return;
-
//create a popup menu in Writer
- ScopedVclPtrInstance<PopupMenu> pMenu;
OUString sTextDoc("com.sun.star.text.TextDocument");
auto aProperties = vcl::CommandInfoProvider::GetCommandProperties(".uno:StyleNewByExample", sTextDoc);
OUString sLabel = vcl::CommandInfoProvider::GetPopupLabelForCommand(aProperties);
- pMenu->InsertItem( SID_STYLE_NEW_BY_EXAMPLE, sLabel );
- pMenu->SetHelpId(SID_STYLE_NEW_BY_EXAMPLE, HID_TEMPLDLG_NEWBYEXAMPLE);
-
+ m_xToolMenu->append("new", sLabel);
aProperties = vcl::CommandInfoProvider::GetCommandProperties(".uno:StyleUpdateByExample", sTextDoc);
sLabel = vcl::CommandInfoProvider::GetPopupLabelForCommand(aProperties);
- pMenu->InsertItem( SID_STYLE_UPDATE_BY_EXAMPLE, sLabel );
- pMenu->SetHelpId(SID_STYLE_UPDATE_BY_EXAMPLE, HID_TEMPLDLG_UPDATEBYEXAMPLE);
-
- pMenu->InsertSeparator();
+ m_xToolMenu->append("update", sLabel);
+ m_xToolMenu->append_separator("separator");
aProperties = vcl::CommandInfoProvider::GetCommandProperties(".uno:LoadStyles", sTextDoc);
sLabel = vcl::CommandInfoProvider::GetPopupLabelForCommand(aProperties);
- pMenu->InsertItem( SID_TEMPLATE_LOAD, sLabel );
- pMenu->SetHelpId(SID_TEMPLATE_LOAD, ".uno:LoadStyles");
-
- pMenu->SetSelectHdl(LINK(this, SfxTemplateDialog_Impl, MenuSelectHdl));
- pMenu->Execute( pBox,
- pBox->GetItemRect(nEntry),
- PopupMenuFlags::ExecuteDown );
- pBox->EndSelection();
- pBox->Invalidate();
+ m_xToolMenu->append("load", sLabel);
}
-IMPL_LINK( SfxTemplateDialog_Impl, MenuSelectHdl, Menu*, pMenu, bool)
+IMPL_LINK(SfxTemplateDialog_Impl, ToolMenuSelectHdl, const OString&, rMenuId, void)
{
- sal_uInt16 nMenuId = pMenu->GetCurItemId();
- ActionSelect(nMenuId);
- return false;
+ if (rMenuId.isEmpty())
+ return;
+ ActionSelect(rMenuId);
}
void SfxCommonTemplateDialog_Impl::SetFamily(SfxStyleFamily const nFamily)
@@ -2493,7 +2239,7 @@ void SfxCommonTemplateDialog_Impl::SetFamily(SfxStyleFamily const nFamily)
if ( nId != nActFamily )
{
if ( nActFamily != 0xFFFF )
- CheckItem( nActFamily, false );
+ CheckItem(OString::number(nActFamily), false);
nActFamily = nId;
if ( nId != 0xFFFF )
bUpdateFamily = true;
@@ -2519,13 +2265,13 @@ void SfxCommonTemplateDialog_Impl::UpdateFamily_Impl()
}
bWaterDisabled = false;
- bCanNew = pTreeBox->IsVisible() || aFmtLb->GetSelectionCount() <= 1;
+ bCanNew = mxTreeBox->get_visible() || mxFmtLb->count_selected_rows() <= 1;
bTreeDrag = true;
bUpdateByExampleDisabled = false;
if (pStyleSheetPool)
{
- if (!pTreeBox->IsVisible())
+ if (!mxTreeBox->get_visible())
UpdateStyles_Impl(StyleFlags::UpdateFamily | StyleFlags::UpdateFamilyList);
else
{
@@ -2536,7 +2282,7 @@ void SfxCommonTemplateDialog_Impl::UpdateFamily_Impl()
InvalidateBindings();
- if (IsCheckedItem(SID_STYLE_WATERCAN) &&
+ if (IsCheckedItem("watercan") &&
// only if that area is allowed
nullptr != pFamilyState[nActFamily - 1])
{
@@ -2552,36 +2298,28 @@ void SfxCommonTemplateDialog_Impl::ReplaceUpdateButtonByMenu()
//does nothing
}
-DropToolBox_Impl::DropToolBox_Impl(vcl::Window* pParent, SfxTemplateDialog_Impl* pTemplateDialog) :
- ToolBox(pParent),
- DropTargetHelper(this),
- rParent(*pTemplateDialog)
-{
-}
-
-sal_Int8 DropToolBox_Impl::AcceptDrop( const AcceptDropEvent& rEvt )
+sal_Int8 SfxTemplateDialog_Impl::AcceptToolbarDrop(const AcceptDropEvent& rEvt, const DropTargetHelper& rHelper)
{
sal_Int8 nReturn = DND_ACTION_NONE;
- sal_uInt16 nItemId = GetItemId( rEvt.maPosPixel );
- if(USHRT_MAX != nItemId && !IsItemChecked( nItemId ))
- {
- SetCurItemId(nItemId);
- GetSelectHdl().Call(this);
- }
+
+ // auto flip to the category under the mouse
+ int nIndex = m_xActionTbL->get_drop_index(rEvt.maPosPixel);
+ if (nIndex >= m_nActionTbLVisible)
+ nIndex = m_nActionTbLVisible - 1;
+
+ OString sIdent = m_xActionTbL->get_item_ident(nIndex);
+ if (!sIdent.isEmpty() && !m_xActionTbL->get_item_active(sIdent))
+ ToolBoxLSelect(sIdent);
+
// special case: page styles are allowed to create new styles by example
// but not allowed to be created by drag and drop
- if ( nItemId != SfxTemplate::SfxFamilyIdToNId( SfxStyleFamily::Page )&&
- IsDropFormatSupported( SotClipboardFormatId::OBJECTDESCRIPTOR ) &&
- !rParent.bNewByExampleDisabled )
+ if (sIdent.toUInt32() != SfxTemplate::SfxFamilyIdToNId(SfxStyleFamily::Page) &&
+ rHelper.IsDropFormatSupported(SotClipboardFormatId::OBJECTDESCRIPTOR) &&
+ !bNewByExampleDisabled)
{
nReturn = DND_ACTION_COPY;
}
return nReturn;
}
-sal_Int8 DropToolBox_Impl::ExecuteDrop( const ExecuteDropEvent& rEvt )
-{
- return rParent.aFmtLb->ExecuteDrop(rEvt);
-}
-
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sfx2/source/dialog/tplcitem.cxx b/sfx2/source/dialog/tplcitem.cxx
index fb4641914b58..2a1a1d28a55f 100644
--- a/sfx2/source/dialog/tplcitem.cxx
+++ b/sfx2/source/dialog/tplcitem.cxx
@@ -123,13 +123,11 @@ void SfxTemplateControllerItem::StateChanged( sal_uInt16 nSID, SfxItemState eSta
break;
case SID_STYLE_NEW_BY_EXAMPLE:
- rTemplateDlg.EnableExample_Impl(
- GetId(), SfxItemState::DISABLED != eState );
+ rTemplateDlg.EnableExample_Impl(nSID, SfxItemState::DISABLED != eState);
break;
case SID_STYLE_UPDATE_BY_EXAMPLE:
{
- rTemplateDlg.EnableExample_Impl(
- GetId(), eState != SfxItemState::DISABLED );
+ rTemplateDlg.EnableExample_Impl(nSID, eState != SfxItemState::DISABLED);
break;
}
case SID_STYLE_NEW:
diff --git a/sfx2/source/inc/templdgi.hxx b/sfx2/source/inc/templdgi.hxx
index d707202a58ab..3647dce09d22 100644
--- a/sfx2/source/inc/templdgi.hxx
+++ b/sfx2/source/inc/templdgi.hxx
@@ -26,12 +26,10 @@ class SfxTemplateControllerItem;
#include <array>
#include <memory>
-#include <vcl/button.hxx>
#include <vcl/toolbox.hxx>
-#include <vcl/lstbox.hxx>
+#include <vcl/transfer.hxx>
#include <vcl/weld.hxx>
#include <svl/lstner.hxx>
-#include <vcl/treelistbox.hxx>
#include <svl/eitem.hxx>
#include <svl/style.hxx>
@@ -55,97 +53,6 @@ namespace com { namespace sun { namespace star { namespace frame {
class XModuleManager2;
}}}}
-class DropListBox_Impl : public SvTreeListBox
-{
-private:
- DECL_LINK(OnAsyncExecuteDrop, void *, void);
-
-protected:
- SfxCommonTemplateDialog_Impl* pDialog;
- sal_uInt16 nModifier;
-
-public:
- DropListBox_Impl(vcl::Window* pParent, WinBits nWinBits, SfxCommonTemplateDialog_Impl* pD)
- : SvTreeListBox(pParent, nWinBits)
- , pDialog(pD)
- , nModifier(0)
- {
- SetHighlightRange();
- }
-
- virtual void MouseButtonDown(const MouseEvent& rMEvt) override;
- virtual sal_Int8 AcceptDrop(const AcceptDropEvent& rEvt) override;
- using SvTreeListBox::ExecuteDrop;
- virtual sal_Int8 ExecuteDrop(const ExecuteDropEvent& rEvt) override;
-
- sal_uInt16 GetModifier() const
- {
- return nModifier;
- }
-
- virtual bool EventNotify( NotifyEvent& rNEvt ) override;
- virtual void RequestHelp(const HelpEvent& rHEvt) override;
-};
-
-
-/** TreeListBox class for displaying the hierarchical view of the templates
-*/
-class StyleTreeListBox_Impl : public DropListBox_Impl
-{
-private:
- SvTreeListEntry* pCurEntry;
- Link<LinkParamNone*,void> aDoubleClickLink;
- Link<StyleTreeListBox_Impl&,bool> aDropLink;
- OUString aParent;
- OUString aStyle;
-
-protected:
- virtual bool EventNotify(NotifyEvent& rNEvt) override;
- virtual bool DoubleClickHdl() override;
- virtual bool ExpandingHdl() override;
- virtual void ExpandedHdl() override;
- virtual TriState NotifyMoving(
- SvTreeListEntry* pTarget, SvTreeListEntry* pEntry,
- SvTreeListEntry*& rpNewParent, sal_uLong& rNewChildPos) override;
-public:
- StyleTreeListBox_Impl( SfxCommonTemplateDialog_Impl* pParent, WinBits nWinStyle);
-
- void Recalc();
-
- void SetDoubleClickHdl(const Link<LinkParamNone*,void> &rLink)
- {
- aDoubleClickLink = rLink;
- }
- void SetDropHdl(const Link<StyleTreeListBox_Impl&,bool> &rLink)
- {
- aDropLink = rLink;
- }
-
- using SvTreeListBox::GetParent;
-
- const OUString& GetParent() const
- {
- return aParent;
- }
- const OUString& GetStyle() const
- {
- return aStyle;
- }
- void MakeExpanded_Impl(std::vector<OUString>& rEntries) const;
-
- virtual VclPtr<PopupMenu> CreateContextMenu() override;
-};
-
-class SfxActionListBox : public DropListBox_Impl
-{
-protected:
-public:
- SfxActionListBox( SfxCommonTemplateDialog_Impl* pParent, WinBits nWinBits );
-
- virtual VclPtr<PopupMenu> CreateContextMenu() override;
- void Recalc();
-};
-
enum class StyleFlags {
NONE=0, UpdateFamilyList=1, UpdateFamily=2
};
@@ -153,6 +60,8 @@ namespace o3tl {
template<> struct typed_flags<StyleFlags> : is_typed_flags<StyleFlags, 3> {};
}
+class TreeViewDropTarget;
+
class SfxCommonTemplateDialog_Impl : public SfxListener
{
private:
@@ -169,15 +78,14 @@ protected:
#define MAX_FAMILIES 6
#define COUNT_BOUND_FUNC 14
- friend class DropListBox_Impl;
friend class SfxTemplateControllerItem;
SfxBindings* pBindings;
std::array<std::unique_ptr<SfxTemplateControllerItem>, COUNT_BOUND_FUNC> pBoundItems;
VclPtr<vcl::Window> pWindow;
- std::unique_ptr<VclBuilder> mxBuilder;
- VclPtr<PopupMenu> mxMenu;
+ std::unique_ptr<weld::Builder> mxMenuBuilder;
+ std::unique_ptr<weld::Menu> mxMenu;
OString sLastItemIdent;
SfxModule* pModule;
std::unique_ptr<Idle> pIdle;
@@ -189,15 +97,18 @@ protected:
css::uno::Reference<css::frame::XModuleManager2> xModuleManager;
DeletionWatcher* m_pDeletionWatcher;
- VclPtr<SfxActionListBox> aFmtLb;
- VclPtr<StyleTreeListBox_Impl> pTreeBox;
- VclPtr<CheckBox> aPreviewCheckbox;
- VclPtr<ListBox> aFilterLb;
+ std::unique_ptr<weld::TreeView> mxFmtLb;
+ std::unique_ptr<weld::TreeView> mxTreeBox;
+ std::unique_ptr<weld::CheckButton> mxPreviewCheckbox;
+ std::unique_ptr<weld::ComboBox> mxFilterLb;
+ std::unique_ptr<TreeViewDropTarget> m_xTreeView1DropTargetHelper;
+ std::unique_ptr<TreeViewDropTarget> m_xTreeView2DropTargetHelper;
sal_uInt16 nActFamily; // Id in the ToolBox = Position - 1
sal_uInt16 nActFilter; // FilterIdx
SfxStyleSearchBits nAppFilter; // Filter, which has set the application (for automatic)
+ sal_uInt16 m_nModifier;
bool bDontUpdate :1;
bool bIsWater :1;
bool bUpdate :1;
@@ -211,32 +122,43 @@ protected:
bool bNewByExampleDisabled :1;
bool bUpdateByExampleDisabled :1;
bool bTreeDrag :1;
+ bool bAllowReParentDrop:1;
bool bHierarchical :1;
bool m_bWantHierarchical :1;
bool bBindingUpdate :1;
+ bool m_bNewHasMenu : 1;
+
+ void FmtSelect(weld::TreeView* pTreeView, bool bIsCallback);
+
+ DECL_LINK(FilterSelectHdl, weld::ComboBox&, void );
+ DECL_LINK(FmtSelectHdl, weld::TreeView&, void);
+ DECL_LINK(TreeListApplyHdl, weld::TreeView&, bool);
+ DECL_LINK(MousePressHdl, const MouseEvent&, bool);
+ DECL_LINK(TimeOut, Timer*, void );
+ DECL_LINK(PreviewHdl, weld::Button&, void);
+ DECL_LINK(PopupFlatMenuHdl, const CommandEvent&, bool);
+ DECL_LINK(PopupTreeMenuHdl, const CommandEvent&, bool);
+ DECL_LINK(KeyInputHdl, const KeyEvent&, bool);
+ DECL_LINK(QueryTooltipHdl, const weld::TreeIter&, OUString);
+ DECL_LINK(OnAsyncExecuteDrop, void *, void);
+ DECL_LINK(DragBeginHdl, bool&, bool);
+ DECL_LINK(CustomRenderHdl, weld::TreeView::render_args, void);
+ DECL_STATIC_LINK(SfxCommonTemplateDialog_Impl, CustomGetSizeHdl, weld::TreeView::get_size_args, Size);
- DECL_LINK( FilterSelectHdl, ListBox&, void );
- DECL_LINK( FmtSelectHdl, SvTreeListBox*, void );
- DECL_LINK( ApplyHdl, LinkParamNone*, void );
- DECL_LINK( TreeListApplyHdl, SvTreeListBox*, bool );
- DECL_LINK( DropHdl, StyleTreeListBox_Impl&, bool );
- DECL_LINK( TimeOut, Timer*, void );
- DECL_LINK( PreviewHdl, Button*, void);
+ void DropHdl(const OUString& rStyle, const OUString& rParent);
- virtual void EnableItem(sal_uInt16 /*nMesId*/, bool /*bCheck*/ = true)
+ virtual void EnableItem(const OString& /*rMesId*/, bool /*bCheck*/ = true)
{}
- virtual void CheckItem(sal_uInt16 /*nMesId*/, bool /*bCheck*/ = true)
+ virtual void CheckItem(const OString& /*rMesId*/, bool /*bCheck*/ = true)
{}
- virtual bool IsCheckedItem(sal_uInt16 /*nMesId*/ )
+ virtual bool IsCheckedItem(const OString& /*rMesId*/ )
{
return true;
}
- virtual void LoadedFamilies()
- {}
void InvalidateBindings();
- virtual void InsertFamilyItem( sal_uInt16 nId, const SfxStyleFamilyItem& rItem ) = 0;
- virtual void EnableFamilyItem( sal_uInt16 nId, bool bEnabled ) = 0;
+ virtual void InsertFamilyItem(sal_uInt16 nId, const SfxStyleFamilyItem& rItem) = 0;
+ virtual void EnableFamilyItem(sal_uInt16 nId, bool bEnabled) = 0;
virtual void ClearFamilyList() = 0;
virtual void ReplaceUpdateButtonByMenu();
@@ -265,7 +187,7 @@ protected:
void SetWaterCanState( const SfxBoolItem* pItem );
bool IsSafeForWaterCan() const;
- void SelectStyle( const OUString& rStyle );
+ void SelectStyle(const OUString& rStyle, bool bIsCallback);
bool HasSelectedStyle() const;
void GetSelectedStyle() const;
void FillTreeBox();
@@ -280,7 +202,7 @@ protected:
void FamilySelect( sal_uInt16 nId, bool bPreviewRefresh = false );
void SetFamily(SfxStyleFamily nFamily);
- void ActionSelect( sal_uInt16 nId );
+ void ActionSelect(const OString& rId);
sal_Int32 LoadFactoryStyleFilter( SfxObjectShell const * i_pObjSh );
void SaveFactoryStyleFilter( SfxObjectShell const * i_pObjSh, sal_Int32 i_nFilter );
@@ -288,10 +210,10 @@ protected:
public:
- SfxCommonTemplateDialog_Impl( SfxBindings* pB, vcl::Window* );
+ SfxCommonTemplateDialog_Impl(SfxBindings* pB, vcl::Window*, weld::Builder* pBuilder);
virtual ~SfxCommonTemplateDialog_Impl() override;
- DECL_LINK( MenuSelectHdl, Menu*, bool );
+ void MenuSelect(const OString& rIdent);
DECL_LINK( MenuSelectAsyncHdl, void*, void );
virtual void EnableEdit( bool b )
@@ -335,56 +257,51 @@ public:
return pCurObjShell;
}
- // normally for derivates from SvTreeListBoxes, but in this case the dialog handles context menus
- VclPtr<PopupMenu> const & CreateContextMenu();
-};
+ sal_Int8 AcceptDrop(const AcceptDropEvent& rEvt, const DropTargetHelper& rHelper);
+ sal_Int8 ExecuteDrop(const ExecuteDropEvent& rEvt);
-class DropToolBox_Impl : public ToolBox, public DropTargetHelper
-{
- SfxTemplateDialog_Impl& rParent;
-protected:
- virtual sal_Int8 AcceptDrop( const AcceptDropEvent& rEvt ) override;
- virtual sal_Int8 ExecuteDrop( const ExecuteDropEvent& rEvt ) override;
-public:
- DropToolBox_Impl(vcl::Window* pParent, SfxTemplateDialog_Impl* pTemplateDialog);
+ void CreateContextMenu();
};
+class ToolbarDropTarget;
+class DropTargetHelper;
+
class SfxTemplateDialog_Impl : public SfxCommonTemplateDialog_Impl
{
private:
friend class SfxTemplateControllerItem;
- friend class DropToolBox_Impl;
friend class SfxTemplatePanelControl;
- VclPtr<vcl::Window> m_pFloat;
- VclPtr<DropToolBox_Impl> m_aActionTbL;
- VclPtr<ToolBox> m_aActionTbR;
+ std::unique_ptr<ToolbarDropTarget> m_xToolbarDropTargetHelper;
+ std::unique_ptr<weld::Toolbar> m_xActionTbL;
+ std::unique_ptr<weld::Toolbar> m_xActionTbR;
+ std::unique_ptr<weld::Menu> m_xToolMenu;
+ int m_nActionTbLVisible;
- DECL_LINK( ToolBoxLSelect, ToolBox*, void );
- DECL_LINK( ToolBoxRSelect, ToolBox*, void );
- DECL_LINK( ToolBoxRClick, ToolBox*, void );
- DECL_LINK( MenuSelectHdl, Menu*, bool );
+ void FillToolMenu();
+
+ DECL_LINK(ToolBoxLSelect, const OString&, void);
+ DECL_LINK(ToolBoxRSelect, const OString&, void);
+ DECL_LINK(ToolMenuSelectHdl, const OString&, void);
protected:
virtual void EnableEdit( bool ) override;
- virtual void EnableItem( sal_uInt16 nMesId, bool bCheck = true ) override;
- virtual void CheckItem( sal_uInt16 nMesId, bool bCheck = true ) override;
- virtual bool IsCheckedItem( sal_uInt16 nMesId ) override;
- virtual void LoadedFamilies() override;
- virtual void InsertFamilyItem( sal_uInt16 nId, const SfxStyleFamilyItem& rItem ) override;
- virtual void EnableFamilyItem( sal_uInt16 nId, bool bEnabled ) override;
+ virtual void EnableItem(const OString& rMesId, bool bCheck = true) override;
+ virtual void CheckItem(const OString& rMesId, bool bCheck = true) override;
+ virtual bool IsCheckedItem(const OString& rMesId) override;
+ virtual void InsertFamilyItem(sal_uInt16 nId, const SfxStyleFamilyItem& rItem) override;
+ virtual void EnableFamilyItem(sal_uInt16 nId, bool bEnabled) override;
virtual void ClearFamilyList() override;
virtual void ReplaceUpdateButtonByMenu() override;
- void Resize();
- Size GetMinOutputSizePixel();
-
public:
friend class SfxTemplateDialog;
SfxTemplateDialog_Impl( SfxBindings*, SfxTemplatePanelControl* pDlgWindow );
virtual ~SfxTemplateDialog_Impl() override;
+ sal_Int8 AcceptToolbarDrop(const AcceptDropEvent& rEvt, const DropTargetHelper& rHelper);
+
void Initialize();
};
diff --git a/sfx2/uiconfig/ui/templatepanel.ui b/sfx2/uiconfig/ui/templatepanel.ui
new file mode 100644
index 000000000000..352925816b20
--- /dev/null
+++ b/sfx2/uiconfig/ui/templatepanel.ui
@@ -0,0 +1,326 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.2 -->
+<interface domain="svx">
+ <requires lib="gtk+" version="3.18"/>
+ <object class="GtkTreeStore" id="liststore1">
+ <columns>
+ <!-- column-name text -->
+ <column type="gchararray"/>
+ <!-- column-name id -->
+ <column type="gchararray"/>
+ </columns>
+ </object>
+ <object class="GtkTreeStore" id="liststore2">
+ <columns>
+ <!-- column-name text -->
+ <column type="gchararray"/>
+ <!-- column-name id -->
+ <column type="gchararray"/>
+ </columns>
+ </object>
+ <object class="GtkGrid" id="TemplatePanel">
+ <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">6</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">3</property>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkToolbar" id="left">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">text</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">2</property>
+ <child>
+ <object class="GtkToggleToolButton" id="2">
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToggleToolButton" id="1">
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToggleToolButton" id="3">
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToggleToolButton" id="4">
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToggleToolButton" id="5">
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToggleToolButton" id="6">
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToggleToolButton" id="65535">
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</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="GtkToolbar" id="right">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="toolbar_style">icons</property>
+ <property name="show_arrow">False</property>
+ <property name="icon_size">2</property>
+ <child>
+ <object class="GtkToggleToolButton" id="watercan">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes" context="templatepanel|STR_STYLE_FILL_FORMAT_MODE">Fill Format Mode</property>
+ <property name="use_underline">True</property>
+ <property name="icon_name">res/sc05554.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="new">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes" context="templatepanel|STR_STYLE_NEW_STYLE_FROM_SELECTION">New Style from Selection</property>
+ <property name="use_underline">True</property>
+ <property name="icon_name">res/sc05555.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkMenuToolButton" id="newmenu">
+ <property name="can_focus">False</property>
+ <property name="no_show_all">True</property>
+ <property name="tooltip_text" translatable="yes" context="templatepanel|STR_STYLE_NEW_STYLE_ACTION">Styles actions</property>
+ <property name="use_underline">True</property>
+ <property name="icon_name">res/sc05555.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="update">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes" context="templatepanel|STR_STYLE_UPDATE_STYLE">Update Style</property>
+ <property name="use_underline">True</property>
+ <property name="icon_name">res/sc05556.png</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</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="GtkScrolledWindow">
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTreeView" id="flatview">
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="no_show_all">True</property>
+ <property name="has_tooltip">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="search_column">0</property>
+ <property name="show_expanders">False</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection" id="Macro Library List-selection2"/>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="treeviewcolumn1">
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderertext1"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="flatview-atkobject">
+ <property name="AtkObject::accessible-name" translatable="yes" context="templatepanel|STR_STYLE_ELEMTLIST">Style List</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow">
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTreeView" id="treeview">
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="no_show_all">True</property>
+ <property name="has_tooltip">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="model">liststore2</property>
+ <property name="headers_visible">False</property>
+ <property name="reorderable">True</property>
+ <property name="search_column">0</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">
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderertext2"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="treeview-atkobject">
+ <property name="AtkObject::accessible-name" translatable="yes" context="templatepanel|STR_STYLE_ELEMTLIST">Style List</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="showpreview">
+ <property name="label" translatable="yes" context="commontemplate|STR_PREVIEW_CHECKBOX">Show previews</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="xalign">0</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="filter">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ </object>
+ <object class="GtkMenu" id="toolmenu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+</interface>