summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--extras/source/glade/libreoffice-catalog.xml.in3
-rw-r--r--include/sfx2/new.hxx52
-rw-r--r--include/vcl/weld.hxx30
-rw-r--r--sd/source/ui/dlg/sdpreslt.cxx11
-rw-r--r--sfx2/source/doc/new.cxx354
-rw-r--r--sfx2/source/inc/preview.hxx26
-rw-r--r--sfx2/uiconfig/ui/loadtemplatedialog.ui129
-rw-r--r--sw/source/ui/dbui/mmdocselectpage.cxx6
-rw-r--r--sw/source/uibase/app/docsh2.cxx11
-rw-r--r--vcl/source/app/salvtables.cxx58
-rw-r--r--vcl/unx/gtk3/gtk3gtkinst.cxx59
11 files changed, 417 insertions, 322 deletions
diff --git a/extras/source/glade/libreoffice-catalog.xml.in b/extras/source/glade/libreoffice-catalog.xml.in
index 3f7c5a71dc9c..c0a89747cb8a 100644
--- a/extras/source/glade/libreoffice-catalog.xml.in
+++ b/extras/source/glade/libreoffice-catalog.xml.in
@@ -247,9 +247,6 @@
<glade-widget-class title="Token Window" name="swuilo-SwTokenWindow"
generic-name="Token Window" parent="GtkDrawingArea"
icon-name="widget-gtk-drawingarea"/>
- <glade-widget-class title="Template Preview Window" name="sfxlo-SfxPreviewWin"
- generic-name="Template Preview Window" parent="GtkDrawingArea"
- icon-name="widget-gtk-drawingarea"/>
<glade-widget-class title="Template Local View" name="sfxlo-TemplateLocalView"
generic-name="Template Local View" parent="GtkDrawingArea"
icon-name="widget-gtk-drawingarea"/>
diff --git a/include/sfx2/new.hxx b/include/sfx2/new.hxx
index 200a15e186bb..91539cb7a048 100644
--- a/include/sfx2/new.hxx
+++ b/include/sfx2/new.hxx
@@ -22,18 +22,17 @@
#include <memory>
#include <sal/config.h>
#include <sfx2/dllapi.h>
+#include <sfx2/objsh.hxx>
-#include <vcl/button.hxx>
-#include <vcl/lstbox.hxx>
-#include <vcl/edit.hxx>
-#include <vcl/fixed.hxx>
-#include <sfx2/basedlgs.hxx>
+#include <vcl/idle.hxx>
+#include <vcl/weld.hxx>
+#include <sfx2/doctempl.hxx>
#include <o3tl/typed_flags_set.hxx>
class SfxObjectShellLock;
class SfxObjectShell;
-
+class SfxPreviewWin_Impl;
enum class SfxNewFileDialogMode {
NONE, Preview, LoadTemplate
@@ -55,19 +54,42 @@ namespace o3tl
#define RET_TEMPLATE_LOAD 100
-class SfxNewFileDialog_Impl;
-class SFX2_DLLPUBLIC SfxNewFileDialog : public SfxModalDialog
+class SFX2_DLLPUBLIC SfxNewFileDialog
{
- friend class SfxNewFileDialog_Impl;
-
private:
- std::unique_ptr< SfxNewFileDialog_Impl > pImpl;
+ std::unique_ptr<weld::Builder> m_xBuilder;
+ std::unique_ptr<weld::Dialog> m_xDialog;
+ std::unique_ptr<weld::TreeView> m_xRegionLb;
+ std::unique_ptr<weld::TreeView> m_xTemplateLb;
+ std::unique_ptr<weld::CheckButton> m_xTextStyleCB;
+ std::unique_ptr<weld::CheckButton> m_xFrameStyleCB;
+ std::unique_ptr<weld::CheckButton> m_xPageStyleCB;
+ std::unique_ptr<weld::CheckButton> m_xNumStyleCB;
+ std::unique_ptr<weld::CheckButton> m_xMergeStyleCB;
+ std::unique_ptr<weld::Button> m_xLoadFilePB;
+ std::unique_ptr<weld::Expander> m_xMoreBt;
+ std::unique_ptr<SfxPreviewWin_Impl> m_xPreviewWin;
+ std::unique_ptr<weld::Label> m_xAltTitleFt;
+ Idle m_aPrevIdle;
+ OUString m_sLoadTemplate;
+
+ SfxNewFileDialogMode m_nFlags;
+ SfxDocumentTemplates m_aTemplates;
+ SfxObjectShellLock m_xDocShell;
+
+ DECL_LINK( Update, Timer *, void );
+
+ DECL_LINK(RegionSelect, weld::TreeView&, void);
+ DECL_LINK(TemplateSelect, weld::TreeView&, void);
+ DECL_LINK(DoubleClick, weld::TreeView&, void);
+ DECL_LINK(Expand, weld::Expander&, void);
+ sal_uInt16 GetSelectedTemplatePos() const;
public:
-
- SfxNewFileDialog(vcl::Window *pParent, SfxNewFileDialogMode nFlags);
- virtual ~SfxNewFileDialog() override;
- virtual void dispose() override;
+ SfxNewFileDialog(weld::Window *pParent, SfxNewFileDialogMode nFlags);
+ void set_title(const OUString& rTitle) { m_xDialog->set_title(rTitle); }
+ short run() { return m_xDialog->run(); }
+ ~SfxNewFileDialog();
// Returns false, when '- No -' is set as Template
// Template names can only be obtained when IsTemplate() returns true.
diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx
index 9a46a191e7a0..b861b848e84c 100644
--- a/include/vcl/weld.hxx
+++ b/include/vcl/weld.hxx
@@ -99,10 +99,25 @@ protected:
public:
virtual void set_title(const OUString& rTitle) = 0;
virtual OUString get_title() const = 0;
+ virtual void set_busy_cursor(bool bBusy) = 0;
void connect_help(const Link<Widget&, bool>& rLink) { m_aHelpRequestHdl = rLink; }
};
+class VCL_DLLPUBLIC WaitObject
+{
+private:
+ weld::Window* m_pWindow;
+
+public:
+ WaitObject(weld::Window* pWindow)
+ : m_pWindow(pWindow)
+ {
+ m_pWindow->set_busy_cursor(true);
+ }
+ ~WaitObject() { m_pWindow->set_busy_cursor(false); }
+};
+
class VCL_DLLPUBLIC Dialog : virtual public Window
{
public:
@@ -455,6 +470,20 @@ public:
virtual void set_selection(const Selection&) = 0;
};
+class VCL_DLLPUBLIC Expander : virtual public Container
+{
+protected:
+ Link<Expander&, void> m_aExpandedHdl;
+
+ void signal_expanded() { m_aExpandedHdl.Call(*this); }
+
+public:
+ virtual bool get_expanded() const = 0;
+ virtual void set_expanded(bool bExpand) = 0;
+
+ void connect_expanded(const Link<Expander&, void>& rLink) { m_aExpandedHdl = rLink; }
+};
+
class VCL_DLLPUBLIC DrawingArea : virtual public Widget
{
protected:
@@ -500,6 +529,7 @@ public:
virtual TreeView* weld_tree_view(const OString& id, bool bTakeOwnership = false) = 0;
virtual Label* weld_label(const OString& id, bool bTakeOwnership = false) = 0;
virtual TextView* weld_text_view(const OString& id, bool bTakeOwnership = false) = 0;
+ virtual Expander* weld_expander(const OString& id, bool bTakeOwnership = false) = 0;
virtual Entry* weld_entry(const OString& id, bool bTakeOwnership = false) = 0;
virtual DrawingArea* weld_drawing_area(const OString& id, bool bTakeOwnership = false) = 0;
virtual ~Builder() {}
diff --git a/sd/source/ui/dlg/sdpreslt.cxx b/sd/source/ui/dlg/sdpreslt.cxx
index 28c06f6e4982..7853e84c501e 100644
--- a/sd/source/ui/dlg/sdpreslt.cxx
+++ b/sd/source/ui/dlg/sdpreslt.cxx
@@ -179,13 +179,13 @@ IMPL_LINK_NOARG(SdPresLayoutDlg, ClickLayoutHdl, ValueSet*, void)
*/
IMPL_LINK_NOARG(SdPresLayoutDlg, ClickLoadHdl, Button*, void)
{
- VclPtrInstance< SfxNewFileDialog > pDlg(this, SfxNewFileDialogMode::Preview);
- pDlg->SetText(SdResId(STR_LOAD_PRESENTATION_LAYOUT));
+ SfxNewFileDialog aDlg(GetFrameWeld(), SfxNewFileDialogMode::Preview);
+ aDlg.set_title(SdResId(STR_LOAD_PRESENTATION_LAYOUT));
if(!IsReallyVisible())
return;
- sal_uInt16 nResult = pDlg->Execute();
+ sal_uInt16 nResult = aDlg.run();
// Inserted update to force repaint
Update();
@@ -195,9 +195,9 @@ IMPL_LINK_NOARG(SdPresLayoutDlg, ClickLoadHdl, Button*, void)
{
case RET_OK:
{
- if (pDlg->IsTemplate())
+ if (aDlg.IsTemplate())
{
- maName = pDlg->GetTemplateFileName();
+ maName = aDlg.GetTemplateFileName();
}
else
{
@@ -210,7 +210,6 @@ IMPL_LINK_NOARG(SdPresLayoutDlg, ClickLoadHdl, Button*, void)
default:
bCancel = true;
}
- pDlg.reset();
if( !bCancel )
{
diff --git a/sfx2/source/doc/new.cxx b/sfx2/source/doc/new.cxx
index 67c6b73a31da..2a50c964bc71 100644
--- a/sfx2/source/doc/new.cxx
+++ b/sfx2/source/doc/new.cxx
@@ -39,31 +39,28 @@
#include <sfx2/docfile.hxx>
#include <preview.hxx>
#include <sfx2/printer.hxx>
+#include <unotools/viewoptions.hxx>
#include <vcl/waitobj.hxx>
-void SfxPreviewBase_Impl::SetObjectShell(SfxObjectShell const * pObj)
+void SfxPreviewWin_Impl::SetObjectShell(SfxObjectShell const * pObj)
{
std::shared_ptr<GDIMetaFile> xFile = pObj
? pObj->GetPreviewMetaFile()
: std::shared_ptr<GDIMetaFile>();
xMetaFile = xFile;
- Invalidate();
+ m_xDrawingArea->queue_draw();
}
-SfxPreviewBase_Impl::SfxPreviewBase_Impl(vcl::Window* pParent, WinBits nStyle)
- : Window(pParent, nStyle)
- , xMetaFile()
+SfxPreviewWin_Impl::SfxPreviewWin_Impl(weld::DrawingArea* pDrawingArea)
+ : m_xDrawingArea(pDrawingArea)
{
+ m_xDrawingArea->connect_size_allocate(LINK(this, SfxPreviewWin_Impl, DoResize));
+ m_xDrawingArea->connect_draw(LINK(this, SfxPreviewWin_Impl, DoPaint));
}
-void SfxPreviewBase_Impl::Resize()
+IMPL_LINK_NOARG(SfxPreviewWin_Impl, DoResize, const Size&, void)
{
- Invalidate();
-}
-
-Size SfxPreviewBase_Impl::GetOptimalSize() const
-{
- return LogicToPixel(Size(127, 129), MapMode(MapUnit::MapAppFont));
+ m_xDrawingArea->queue_draw();
}
void SfxPreviewWin_Impl::ImpPaint(vcl::RenderContext& rRenderContext, GDIMetaFile* pFile)
@@ -108,84 +105,31 @@ void SfxPreviewWin_Impl::ImpPaint(vcl::RenderContext& rRenderContext, GDIMetaFil
}
}
-void SfxPreviewWin_Impl::Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle& /*rRect*/)
+IMPL_LINK(SfxPreviewWin_Impl, DoPaint, vcl::RenderContext&, rRenderContext, void)
{
ImpPaint(rRenderContext, xMetaFile.get());
}
-extern "C" SAL_DLLPUBLIC_EXPORT void makeSfxPreviewWin(VclPtr<vcl::Window> & rRet, VclPtr<vcl::Window> & pParent, VclBuilder::stringmap &)
+IMPL_LINK_NOARG(SfxNewFileDialog, Update, Timer*, void)
{
- rRet = VclPtr<SfxPreviewWin_Impl>::Create(pParent, 0);
-}
-
-class SfxNewFileDialog_Impl
-{
- VclPtr<ListBox> m_pRegionLb;
- VclPtr<ListBox> m_pTemplateLb;
-
- VclPtr<SfxPreviewWin_Impl> m_pPreviewWin;
-
- VclPtr<CheckBox> m_pTextStyleCB;
- VclPtr<CheckBox> m_pFrameStyleCB;
- VclPtr<CheckBox> m_pPageStyleCB;
- VclPtr<CheckBox> m_pNumStyleCB;
- VclPtr<CheckBox> m_pMergeStyleCB;
- VclPtr<PushButton> m_pLoadFilePB;
-
- VclPtr<VclExpander> m_pMoreBt;
- Idle aPrevIdle;
- OUString aNone;
- OUString sLoadTemplate;
-
- SfxNewFileDialogMode nFlags;
- SfxDocumentTemplates aTemplates;
- SfxObjectShellLock xDocShell;
- VclPtr<SfxNewFileDialog> pAntiImpl;
-
- DECL_LINK( Update, Timer *, void );
-
- DECL_LINK(RegionSelect, ListBox&, void);
- DECL_LINK(TemplateSelect, ListBox&, void);
- DECL_LINK(DoubleClick, ListBox&, void);
- DECL_LINK(Expand, VclExpander&, void);
- DECL_LINK(LoadFile, Button*, void);
- sal_uInt16 GetSelectedTemplatePos() const;
-
-public:
-
- SfxNewFileDialog_Impl(SfxNewFileDialog* pAntiImplP, SfxNewFileDialogMode nFlags);
- ~SfxNewFileDialog_Impl();
-
- // Returns sal_False if '- No -' is set as a template
- // Template name can only be obtained if IsTemplate() is TRUE
- bool IsTemplate() const;
- OUString GetTemplateFileName() const;
-
- SfxTemplateFlags GetTemplateFlags() const;
- void SetTemplateFlags(SfxTemplateFlags nSet);
-};
-
-IMPL_LINK_NOARG(SfxNewFileDialog_Impl, Update, Timer*, void)
-{
- if (xDocShell.Is())
+ if (m_xDocShell.Is())
{
- if (xDocShell->GetProgress())
+ if (m_xDocShell->GetProgress())
return;
- xDocShell.Clear();
+ m_xDocShell.Clear();
}
const sal_uInt16 nEntry = GetSelectedTemplatePos();
if (!nEntry)
{
- m_pPreviewWin->Invalidate();
- m_pPreviewWin->SetObjectShell( nullptr);
+ m_xPreviewWin->queue_draw();
+ m_xPreviewWin->SetObjectShell(nullptr);
return;
}
- if (m_pMoreBt->get_expanded() && (nFlags == SfxNewFileDialogMode::Preview))
+ if (m_xMoreBt->get_expanded() && (m_nFlags == SfxNewFileDialogMode::Preview))
{
-
- OUString aFileName = aTemplates.GetPath(m_pRegionLb->GetSelectedEntryPos(), nEntry - 1);
+ OUString aFileName = m_aTemplates.GetPath(m_xRegionLb->get_selected_index(), nEntry - 1);
INetURLObject aTestObj(aFileName);
if (aTestObj.GetProtocol() == INetProtocol::NotValid)
{
@@ -204,254 +148,212 @@ IMPL_LINK_NOARG(SfxNewFileDialog_Impl, Update, Timer*, void)
// ??? HasName() MM
if (INetURLObject( pTmp->GetMedium()->GetName() ) == aObj)
{
- xDocShell = pTmp;
+ m_xDocShell = pTmp;
break;
}
}
- if (!xDocShell.Is())
+ if (!m_xDocShell.Is())
{
- SfxErrorContext eEC(ERRCTX_SFX_LOADTEMPLATE, pAntiImpl->GetFrameWeld());
+ SfxErrorContext eEC(ERRCTX_SFX_LOADTEMPLATE, m_xDialog.get());
SfxApplication *pSfxApp = SfxGetpApp();
SfxItemSet* pSet = new SfxAllItemSet(pSfxApp->GetPool());
pSet->Put(SfxBoolItem(SID_TEMPLATE, true));
pSet->Put(SfxBoolItem(SID_PREVIEW, true));
- ErrCode lErr = pSfxApp->LoadTemplate(xDocShell, aFileName, pSet);
+ ErrCode lErr = pSfxApp->LoadTemplate(m_xDocShell, aFileName, pSet);
if (lErr)
ErrorHandler::HandleError(lErr);
- if (!xDocShell.Is())
+ if (!m_xDocShell.Is())
{
- m_pPreviewWin->SetObjectShell(nullptr);
+ m_xPreviewWin->SetObjectShell(nullptr);
return;
}
}
- m_pPreviewWin->SetObjectShell(xDocShell);
+ m_xPreviewWin->SetObjectShell(m_xDocShell);
}
}
-IMPL_LINK( SfxNewFileDialog_Impl, RegionSelect, ListBox&, rBox, void )
+IMPL_LINK( SfxNewFileDialog, RegionSelect, weld::TreeView&, rBox, void )
{
- if (xDocShell.Is() && xDocShell->GetProgress())
+ if (m_xDocShell.Is() && m_xDocShell->GetProgress())
return;
- const sal_uInt16 nRegion = rBox.GetSelectedEntryPos();
- const sal_uInt16 nCount = aTemplates.GetRegionCount()? aTemplates.GetCount(nRegion): 0;
- m_pTemplateLb->SetUpdateMode(false);
- m_pTemplateLb->Clear();
- OUString aSel = m_pRegionLb->GetSelectedEntry();
+ const sal_uInt16 nRegion = rBox.get_selected_index();
+ const sal_uInt16 nCount = m_aTemplates.GetRegionCount() ? m_aTemplates.GetCount(nRegion): 0;
+ m_xTemplateLb->freeze();
+ m_xTemplateLb->clear();
+ OUString aSel = m_xRegionLb->get_selected();
sal_Int32 nc = aSel.indexOf('(');
if (nc != -1 && nc != 0)
aSel = aSel.replaceAt(nc-1, 1, "");
if ( aSel.compareToIgnoreAsciiCase( SfxResId(STR_STANDARD) ) == 0 )
- m_pTemplateLb->InsertEntry(aNone);
+ m_xTemplateLb->append(SfxResId(STR_NONE));
for (sal_uInt16 i = 0; i < nCount; ++i)
- m_pTemplateLb->InsertEntry(aTemplates.GetName(nRegion, i));
- m_pTemplateLb->SelectEntryPos(0);
- m_pTemplateLb->SetUpdateMode(true);
- m_pTemplateLb->Invalidate();
- m_pTemplateLb->Update();
- TemplateSelect(*m_pTemplateLb);
+ m_xTemplateLb->append(m_aTemplates.GetName(nRegion, i));
+ m_xTemplateLb->thaw();
+ m_xTemplateLb->select(0);
}
-IMPL_LINK_NOARG(SfxNewFileDialog_Impl, Expand, VclExpander&, void)
+IMPL_LINK_NOARG(SfxNewFileDialog, Expand, weld::Expander&, void)
{
- TemplateSelect(*m_pTemplateLb);
+ TemplateSelect(*m_xTemplateLb);
}
-IMPL_LINK_NOARG(SfxNewFileDialog_Impl, TemplateSelect, ListBox&, void)
+IMPL_LINK_NOARG(SfxNewFileDialog, TemplateSelect, weld::TreeView&, void)
{
// Still loading
- if ( xDocShell && xDocShell->GetProgress() )
+ if (m_xDocShell && m_xDocShell->GetProgress())
return;
- if (!m_pMoreBt->get_expanded())
+ if (!m_xMoreBt->get_expanded())
+ {
// Dialog is not opened
return;
+ }
- aPrevIdle.Start();
+ m_aPrevIdle.Start();
}
-IMPL_LINK_NOARG( SfxNewFileDialog_Impl, DoubleClick, ListBox&, void )
+IMPL_LINK_NOARG( SfxNewFileDialog, DoubleClick, weld::TreeView&, void )
{
// Still loading
- if ( !xDocShell.Is() || !xDocShell->GetProgress() )
- pAntiImpl->EndDialog(RET_OK);
+ if (!m_xDocShell.Is() || !m_xDocShell->GetProgress())
+ m_xDialog->response(RET_OK);
}
-IMPL_LINK_NOARG(SfxNewFileDialog_Impl, LoadFile, Button*, void)
+sal_uInt16 SfxNewFileDialog::GetSelectedTemplatePos() const
{
- pAntiImpl->EndDialog(RET_TEMPLATE_LOAD);
-}
-
-sal_uInt16 SfxNewFileDialog_Impl::GetSelectedTemplatePos() const
-{
- sal_uInt16 nEntry = m_pTemplateLb->GetSelectedEntryPos();
- OUString aSel = m_pRegionLb->GetSelectedEntry();
+ int nEntry = m_xTemplateLb->get_selected_index();
+ if (nEntry == -1)
+ return 0;
+ OUString aSel = m_xRegionLb->get_selected();
sal_Int32 nc = aSel.indexOf('(');
if (nc != -1 && nc != 0)
aSel = aSel.replaceAt(nc-1, 1, "");
if ( aSel.compareToIgnoreAsciiCase(SfxResId(STR_STANDARD)) != 0 )
nEntry++;
- if (!m_pTemplateLb->GetSelectedEntryCount())
- nEntry = 0;
return nEntry;
}
-bool SfxNewFileDialog_Impl::IsTemplate() const
-{
- return GetSelectedTemplatePos()!=0;
-
-}
-
-OUString SfxNewFileDialog_Impl::GetTemplateFileName() const
-{
- if(!IsTemplate() || !aTemplates.GetRegionCount())
- return OUString();
- return aTemplates.GetPath(m_pRegionLb->GetSelectedEntryPos(),
- GetSelectedTemplatePos()-1);
-}
-
-SfxTemplateFlags SfxNewFileDialog_Impl::GetTemplateFlags()const
+SfxNewFileDialog::SfxNewFileDialog(weld::Window *pParent, SfxNewFileDialogMode nFlags)
+ : m_xBuilder(Application::CreateBuilder(pParent, "sfx/ui/loadtemplatedialog.ui"))
+ , m_xDialog(m_xBuilder->weld_dialog("LoadTemplateDialog"))
+ , m_xRegionLb(m_xBuilder->weld_tree_view("categories"))
+ , m_xTemplateLb(m_xBuilder->weld_tree_view("templates"))
+ , m_xTextStyleCB(m_xBuilder->weld_check_button("text"))
+ , m_xFrameStyleCB(m_xBuilder->weld_check_button("frame"))
+ , m_xPageStyleCB(m_xBuilder->weld_check_button("pages"))
+ , m_xNumStyleCB(m_xBuilder->weld_check_button("numbering"))
+ , m_xMergeStyleCB(m_xBuilder->weld_check_button("overwrite"))
+ , m_xLoadFilePB(m_xBuilder->weld_button("fromfile"))
+ , m_xMoreBt(m_xBuilder->weld_expander("expander"))
+ , m_xPreviewWin(new SfxPreviewWin_Impl(m_xBuilder->weld_drawing_area("image")))
+ , m_xAltTitleFt(m_xBuilder->weld_label("alttitle"))
+ , m_sLoadTemplate(m_xAltTitleFt->get_label())
+ , m_nFlags(nFlags)
{
- SfxTemplateFlags nRet = m_pTextStyleCB->IsChecked() ? SfxTemplateFlags::LOAD_TEXT_STYLES : SfxTemplateFlags::NONE;
- if(m_pFrameStyleCB->IsChecked())
- nRet |= SfxTemplateFlags::LOAD_FRAME_STYLES;
- if(m_pPageStyleCB->IsChecked())
- nRet |= SfxTemplateFlags::LOAD_PAGE_STYLES;
- if(m_pNumStyleCB->IsChecked())
- nRet |= SfxTemplateFlags::LOAD_NUM_STYLES;
- if(m_pMergeStyleCB->IsChecked())
- nRet |= SfxTemplateFlags::MERGE_STYLES;
- return nRet;
-}
-
-void SfxNewFileDialog_Impl::SetTemplateFlags(SfxTemplateFlags nSet)
-{
- m_pTextStyleCB->Check( bool(nSet & SfxTemplateFlags::LOAD_TEXT_STYLES ));
- m_pFrameStyleCB->Check( bool(nSet & SfxTemplateFlags::LOAD_FRAME_STYLES));
- m_pPageStyleCB->Check( bool(nSet & SfxTemplateFlags::LOAD_PAGE_STYLES ));
- m_pNumStyleCB->Check( bool(nSet & SfxTemplateFlags::LOAD_NUM_STYLES ));
- m_pMergeStyleCB->Check( bool(nSet & SfxTemplateFlags::MERGE_STYLES ));
-}
-
-
-SfxNewFileDialog_Impl::SfxNewFileDialog_Impl(
- SfxNewFileDialog* pAntiImplP, SfxNewFileDialogMode nFl)
- : aNone(SfxResId(STR_NONE))
- , nFlags(nFl)
- , pAntiImpl(pAntiImplP)
-{
- pAntiImplP->get(m_pRegionLb, "categories");
- pAntiImplP->get(m_pTemplateLb, "templates");
-
- Size aSize(m_pRegionLb->LogicToPixel(Size(127, 72), MapMode(MapUnit::MapAppFont)));
- m_pRegionLb->set_width_request(aSize.Width());
- m_pRegionLb->set_height_request(aSize.Height());
- m_pTemplateLb->set_width_request(aSize.Width());
- m_pTemplateLb->set_height_request(aSize.Height());
-
- pAntiImplP->get(m_pTextStyleCB, "text");
- pAntiImplP->get(m_pFrameStyleCB, "frame");
- pAntiImplP->get(m_pPageStyleCB, "pages");
- pAntiImplP->get(m_pNumStyleCB, "numbering");
- pAntiImplP->get(m_pMergeStyleCB, "overwrite");
- pAntiImplP->get(m_pMoreBt, "expander");
- pAntiImplP->get(m_pPreviewWin, "image");
- pAntiImplP->get(m_pLoadFilePB, "fromfile");
- sLoadTemplate = pAntiImplP->get<FixedText>("alttitle")->GetText();
+ const int nWidth = m_xRegionLb->get_approximate_char_width() * 32;
+ const int nHeight = m_xRegionLb->get_height_rows(8);
+ m_xRegionLb->set_size_request(nWidth, nHeight);
+ m_xTemplateLb->set_size_request(nWidth, nHeight);
+ m_xPreviewWin->set_size_request(nWidth, nWidth);
if (nFlags == SfxNewFileDialogMode::NONE)
- m_pMoreBt->Hide();
+ m_xMoreBt->hide();
else if(SfxNewFileDialogMode::LoadTemplate == nFlags)
{
- m_pLoadFilePB->SetClickHdl(LINK(this, SfxNewFileDialog_Impl, LoadFile));
- m_pLoadFilePB->Show();
- m_pTextStyleCB->Show();
- m_pFrameStyleCB->Show();
- m_pPageStyleCB->Show();
- m_pNumStyleCB->Show();
- m_pMergeStyleCB->Show();
- m_pMoreBt->Hide();
- m_pTextStyleCB->Check();
- pAntiImplP->SetText(sLoadTemplate);
+ m_xLoadFilePB->show();
+ m_xTextStyleCB->show();
+ m_xFrameStyleCB->show();
+ m_xPageStyleCB->show();
+ m_xNumStyleCB->show();
+ m_xMergeStyleCB->show();
+ m_xMoreBt->hide();
+ m_xTextStyleCB->set_active(true);
+ m_xDialog->set_title(m_sLoadTemplate);
}
else
{
- m_pMoreBt->SetExpandedHdl(LINK(this, SfxNewFileDialog_Impl, Expand));
- m_pPreviewWin->Show();
+ m_xMoreBt->connect_expanded(LINK(this, SfxNewFileDialog, Expand));
+ m_xPreviewWin->show();
}
- OUString &rExtra = pAntiImplP->GetExtraData();
- bool bExpand = !rExtra.isEmpty() && rExtra[0] == 'Y';
- m_pMoreBt->set_expanded(bExpand && (nFlags != SfxNewFileDialogMode::NONE));
+ OUString sExtraData;
+ SvtViewOptions aDlgOpt(EViewType::Dialog, OStringToOUString(m_xDialog->get_help_id(), RTL_TEXTENCODING_UTF8));
+ if (aDlgOpt.Exists())
+ {
+ css::uno::Any aUserItem = aDlgOpt.GetUserItem("UserItem");
+ aUserItem >>= sExtraData;
+ }
- m_pTemplateLb->SetSelectHdl(LINK(this, SfxNewFileDialog_Impl, TemplateSelect));
- m_pTemplateLb->SetDoubleClickHdl(LINK(this, SfxNewFileDialog_Impl, DoubleClick));
+ bool bExpand = !sExtraData.isEmpty() && sExtraData[0] == 'Y';
+ m_xMoreBt->set_expanded(bExpand && (nFlags != SfxNewFileDialogMode::NONE));
+
+ m_xTemplateLb->connect_changed(LINK(this, SfxNewFileDialog, TemplateSelect));
+ m_xTemplateLb->connect_row_activated(LINK(this, SfxNewFileDialog, DoubleClick));
// update the template configuration if necessary
{
- WaitObject aWaitCursor( pAntiImplP->GetParent() );
- aTemplates.Update();
+ weld::WaitObject aWaitCursor(m_xDialog.get());
+ m_aTemplates.Update();
}
// fill the list boxes
- const sal_uInt16 nCount = aTemplates.GetRegionCount();
+ const sal_uInt16 nCount = m_aTemplates.GetRegionCount();
if (nCount)
{
for(sal_uInt16 i = 0; i < nCount; ++i)
- m_pRegionLb->InsertEntry(aTemplates.GetFullRegionName(i));
- m_pRegionLb->SetSelectHdl(LINK(this, SfxNewFileDialog_Impl, RegionSelect));
+ m_xRegionLb->append(m_aTemplates.GetFullRegionName(i));
+ m_xRegionLb->connect_changed(LINK(this, SfxNewFileDialog, RegionSelect));
}
- aPrevIdle.SetPriority( TaskPriority::LOWEST );
- aPrevIdle.SetInvokeHandler( LINK( this, SfxNewFileDialog_Impl, Update));
+ m_aPrevIdle.SetPriority( TaskPriority::LOWEST );
+ m_aPrevIdle.SetInvokeHandler( LINK( this, SfxNewFileDialog, Update));
- m_pRegionLb->SelectEntryPos(0);
- RegionSelect(*m_pRegionLb);
-}
-
-SfxNewFileDialog_Impl::~SfxNewFileDialog_Impl()
-{
- OUString &rExtra = pAntiImpl->GetExtraData();
- rExtra = m_pMoreBt->get_expanded() ? OUString("Y") : OUString("N");
-}
-
-SfxNewFileDialog::SfxNewFileDialog(vcl::Window *pParent, SfxNewFileDialogMode nFlags)
- : SfxModalDialog(pParent, "LoadTemplateDialog",
- "sfx/ui/loadtemplatedialog.ui"),
- pImpl( new SfxNewFileDialog_Impl(this, nFlags) )
-{
+ m_xRegionLb->select(0);
+ RegionSelect(*m_xRegionLb);
}
SfxNewFileDialog::~SfxNewFileDialog()
{
- disposeOnce();
-}
-
-void SfxNewFileDialog::dispose()
-{
- pImpl.reset();
- SfxModalDialog::dispose();
+ SvtViewOptions aDlgOpt(EViewType::Dialog, OStringToOUString(m_xDialog->get_help_id(), RTL_TEXTENCODING_UTF8));
+ aDlgOpt.SetUserItem("UserItem", css::uno::makeAny(m_xMoreBt->get_expanded() ? OUString("Y") : OUString("N")));
}
bool SfxNewFileDialog::IsTemplate() const
{
- return pImpl->IsTemplate();
+ return GetSelectedTemplatePos()!=0;
}
OUString SfxNewFileDialog::GetTemplateFileName() const
{
- return pImpl->GetTemplateFileName();
+ if (!IsTemplate() || !m_aTemplates.GetRegionCount())
+ return OUString();
+ return m_aTemplates.GetPath(m_xRegionLb->get_selected_index(),
+ GetSelectedTemplatePos()-1);
}
SfxTemplateFlags SfxNewFileDialog::GetTemplateFlags()const
{
- return pImpl->GetTemplateFlags();
+ SfxTemplateFlags nRet = m_xTextStyleCB->get_active() ? SfxTemplateFlags::LOAD_TEXT_STYLES : SfxTemplateFlags::NONE;
+ if(m_xFrameStyleCB->get_active())
+ nRet |= SfxTemplateFlags::LOAD_FRAME_STYLES;
+ if(m_xPageStyleCB->get_active())
+ nRet |= SfxTemplateFlags::LOAD_PAGE_STYLES;
+ if(m_xNumStyleCB->get_active())
+ nRet |= SfxTemplateFlags::LOAD_NUM_STYLES;
+ if(m_xMergeStyleCB->get_active())
+ nRet |= SfxTemplateFlags::MERGE_STYLES;
+ return nRet;
}
void SfxNewFileDialog::SetTemplateFlags(SfxTemplateFlags nSet)
{
- pImpl->SetTemplateFlags(nSet);
+ m_xTextStyleCB->set_active( bool(nSet & SfxTemplateFlags::LOAD_TEXT_STYLES ));
+ m_xFrameStyleCB->set_active( bool(nSet & SfxTemplateFlags::LOAD_FRAME_STYLES));
+ m_xPageStyleCB->set_active( bool(nSet & SfxTemplateFlags::LOAD_PAGE_STYLES ));
+ m_xNumStyleCB->set_active( bool(nSet & SfxTemplateFlags::LOAD_NUM_STYLES ));
+ m_xMergeStyleCB->set_active( bool(nSet & SfxTemplateFlags::MERGE_STYLES ));
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sfx2/source/inc/preview.hxx b/sfx2/source/inc/preview.hxx
index 890d9b2298df..3a747db969f2 100644
--- a/sfx2/source/inc/preview.hxx
+++ b/sfx2/source/inc/preview.hxx
@@ -19,32 +19,24 @@
#ifndef INCLUDED_SFX2_SOURCE_INC_PREVIEW_HXX
#define INCLUDED_SFX2_SOURCE_INC_PREVIEW_HXX
-#include <sfx2/doctempl.hxx>
-#include <sfx2/basedlgs.hxx>
+#include <tools/link.hxx>
class SfxObjectShell;
class GDIMetaFile;
-class SfxPreviewBase_Impl : public vcl::Window
+class SfxPreviewWin_Impl
{
protected:
std::shared_ptr<GDIMetaFile> xMetaFile;
+ std::unique_ptr<weld::DrawingArea> m_xDrawingArea;
public:
- SfxPreviewBase_Impl(vcl::Window* pParent, WinBits nStyle);
+ SfxPreviewWin_Impl(weld::DrawingArea* pArea);
void SetObjectShell( SfxObjectShell const * pObj );
- virtual void Resize() override;
- virtual Size GetOptimalSize() const override;
-};
-
-class SfxPreviewWin_Impl: public SfxPreviewBase_Impl
-{
-protected:
- virtual void Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect) override;
-public:
- SfxPreviewWin_Impl(vcl::Window* pParent, WinBits nStyle)
- : SfxPreviewBase_Impl(pParent, nStyle)
- {}
-
+ DECL_LINK(DoPaint, vcl::RenderContext&, void);
+ DECL_LINK(DoResize, const Size& rSize, void);
+ void queue_draw() { m_xDrawingArea->queue_draw(); }
+ void show() { m_xDrawingArea->show(); }
+ void set_size_request(int nWidth, int nHeight) { m_xDrawingArea->set_size_request(nWidth, nHeight); }
static void ImpPaint(vcl::RenderContext& rRenderContext, GDIMetaFile* pFile);
};
diff --git a/sfx2/uiconfig/ui/loadtemplatedialog.ui b/sfx2/uiconfig/ui/loadtemplatedialog.ui
index 38ea3f9fb9d4..e33497f2f6d6 100644
--- a/sfx2/uiconfig/ui/loadtemplatedialog.ui
+++ b/sfx2/uiconfig/ui/loadtemplatedialog.ui
@@ -1,8 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.16.1 -->
+<!-- Generated with glade 3.20.2 -->
<interface domain="sfx">
<requires lib="gtk+" version="3.18"/>
- <!-- interface-requires LibreOffice 1.0 -->
+ <object class="GtkListStore" id="liststore1">
+ <columns>
+ <!-- column-name text -->
+ <column type="gchararray"/>
+ </columns>
+ </object>
+ <object class="GtkListStore" id="liststore2">
+ <columns>
+ <!-- column-name text -->
+ <column type="gchararray"/>
+ </columns>
+ </object>
<object class="GtkDialog" id="LoadTemplateDialog">
<property name="can_focus">False</property>
<property name="border_width">6</property>
@@ -20,14 +31,12 @@
<property name="can_focus">False</property>
<property name="layout_style">end</property>
<child>
- <object class="GtkButton" id="ok">
- <property name="label">gtk-ok</property>
- <property name="visible">True</property>
+ <object class="GtkButton" id="fromfile">
+ <property name="label" translatable="yes" context="loadtemplatedialog|fromfile">From File...</property>
<property name="can_focus">True</property>
- <property name="can_default">True</property>
- <property name="has_default">True</property>
<property name="receives_default">True</property>
- <property name="use_stock">True</property>
+ <property name="no_show_all">True</property>
+ <property name="use_underline">True</property>
</object>
<packing>
<property name="expand">False</property>
@@ -51,11 +60,12 @@
</packing>
</child>
<child>
- <object class="GtkButton" id="help">
- <property name="label">gtk-help</property>
+ <object class="GtkButton" id="ok">
+ <property name="label">gtk-ok</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
+ <property name="has_default">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
@@ -66,12 +76,13 @@
</packing>
</child>
<child>
- <object class="GtkButton" id="fromfile">
- <property name="label" translatable="yes" context="loadtemplatedialog|fromfile">From File...</property>
+ <object class="GtkButton" id="help">
+ <property name="label">gtk-help</property>
+ <property name="visible">True</property>
<property name="can_focus">True</property>
+ <property name="can_default">True</property>
<property name="receives_default">True</property>
- <property name="no_show_all">True</property>
- <property name="use_underline">True</property>
+ <property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
@@ -111,11 +122,36 @@
<property name="top_padding">6</property>
<property name="left_padding">12</property>
<child>
- <object class="GtkTreeView" id="categories:border">
+ <object class="GtkScrolledWindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
- <child internal-child="selection">
- <object class="GtkTreeSelection" id="treeview-selection1"/>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTreeView" id="categories">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="vexpand">True</property>
+ <property name="model">liststore1</property>
+ <property name="headers_visible">False</property>
+ <property name="headers_clickable">False</property>
+ <property name="enable_search">False</property>
+ <property name="show_expanders">False</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection" id="treeview-selection1"/>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="treeviewcolumn1">
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderertext1"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ </object>
</child>
</object>
</child>
@@ -135,8 +171,6 @@
<packing>
<property name="left_attach">0</property>
<property name="top_attach">0</property>
- <property name="width">1</property>
- <property name="height">1</property>
</packing>
</child>
<child>
@@ -155,11 +189,36 @@
<property name="top_padding">6</property>
<property name="left_padding">12</property>
<child>
- <object class="GtkTreeView" id="templates:border">
+ <object class="GtkScrolledWindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
- <child internal-child="selection">
- <object class="GtkTreeSelection" id="treeview-selection3"/>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTreeView" id="templates">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="vexpand">True</property>
+ <property name="model">liststore2</property>
+ <property name="headers_visible">False</property>
+ <property name="headers_clickable">False</property>
+ <property name="enable_search">False</property>
+ <property name="show_expanders">False</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection" id="treeview-selection2"/>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="treeviewcolumn2">
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderertext2"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ </object>
</child>
</object>
</child>
@@ -179,8 +238,6 @@
<packing>
<property name="left_attach">1</property>
<property name="top_attach">0</property>
- <property name="width">1</property>
- <property name="height">1</property>
</packing>
</child>
<child>
@@ -203,8 +260,6 @@
<packing>
<property name="left_attach">0</property>
<property name="top_attach">0</property>
- <property name="width">1</property>
- <property name="height">1</property>
</packing>
</child>
<child>
@@ -220,8 +275,6 @@
<packing>
<property name="left_attach">1</property>
<property name="top_attach">0</property>
- <property name="width">1</property>
- <property name="height">1</property>
</packing>
</child>
<child>
@@ -237,8 +290,6 @@
<packing>
<property name="left_attach">2</property>
<property name="top_attach">0</property>
- <property name="width">1</property>
- <property name="height">1</property>
</packing>
</child>
<child>
@@ -254,8 +305,6 @@
<packing>
<property name="left_attach">0</property>
<property name="top_attach">1</property>
- <property name="width">1</property>
- <property name="height">1</property>
</packing>
</child>
<child>
@@ -271,8 +320,6 @@
<packing>
<property name="left_attach">1</property>
<property name="top_attach">1</property>
- <property name="width">1</property>
- <property name="height">1</property>
</packing>
</child>
<child>
@@ -283,7 +330,6 @@
<property name="left_attach">0</property>
<property name="top_attach">1</property>
<property name="width">2</property>
- <property name="height">1</property>
</packing>
</child>
<child>
@@ -296,20 +342,20 @@
<property name="left_attach">0</property>
<property name="top_attach">3</property>
<property name="width">2</property>
- <property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkExpander" id="expander">
<property name="visible">True</property>
<property name="can_focus">True</property>
+ <property name="resize_toplevel">True</property>
<child>
<object class="GtkGrid" id="previewgrid">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_top">6</property>
<child>
- <object class="sfxlo-SfxPreviewWin" id="image">
+ <object class="GtkDrawingArea" id="image">
<property name="can_focus">False</property>
<property name="no_show_all">True</property>
<property name="halign">start</property>
@@ -318,8 +364,6 @@
<packing>
<property name="left_attach">0</property>
<property name="top_attach">0</property>
- <property name="width">1</property>
- <property name="height">1</property>
</packing>
</child>
</object>
@@ -337,7 +381,6 @@
<property name="left_attach">0</property>
<property name="top_attach">2</property>
<property name="width">2</property>
- <property name="height">1</property>
</packing>
</child>
</object>
@@ -350,9 +393,13 @@
</object>
</child>
<action-widgets>
- <action-widget response="-5">ok</action-widget>
+ <action-widget response="100">fromfile</action-widget>
<action-widget response="-6">cancel</action-widget>
+ <action-widget response="-5">ok</action-widget>
<action-widget response="-11">help</action-widget>
</action-widgets>
+ <child>
+ <placeholder/>
+ </child>
</object>
</interface>
diff --git a/sw/source/ui/dbui/mmdocselectpage.cxx b/sw/source/ui/dbui/mmdocselectpage.cxx
index 5f1c0ffc1314..b869e40cd5c7 100644
--- a/sw/source/ui/dbui/mmdocselectpage.cxx
+++ b/sw/source/ui/dbui/mmdocselectpage.cxx
@@ -123,12 +123,12 @@ IMPL_LINK(SwMailMergeDocSelectPage, FileSelectHdl, Button*, pButton, void)
if(bTemplate)
{
m_pLoadTemplateRB->Check();
- VclPtrInstance< SfxNewFileDialog > pNewFileDlg(this, SfxNewFileDialogMode::NONE);
- sal_uInt16 nRet = pNewFileDlg->Execute();
+ SfxNewFileDialog aNewFileDlg(GetFrameWeld(), SfxNewFileDialogMode::NONE);
+ sal_uInt16 nRet = aNewFileDlg.run();
if(RET_TEMPLATE_LOAD == nRet)
bTemplate = false;
else if(RET_CANCEL != nRet)
- m_sLoadTemplateName = pNewFileDlg->GetTemplateFileName();
+ m_sLoadTemplateName = aNewFileDlg.GetTemplateFileName();
}
else
m_pLoadDocRB->Check();
diff --git a/sw/source/uibase/app/docsh2.cxx b/sw/source/uibase/app/docsh2.cxx
index 65b718c52f67..3f72351acd3d 100644
--- a/sw/source/uibase/app/docsh2.cxx
+++ b/sw/source/uibase/app/docsh2.cxx
@@ -500,11 +500,10 @@ void SwDocShell::Execute(SfxRequest& rReq)
if ( aFileName.isEmpty() )
{
SvtPathOptions aPathOpt;
- ScopedVclPtr<SfxNewFileDialog> pNewFileDlg(
- VclPtr<SfxNewFileDialog>::Create(&GetView()->GetViewFrame()->GetWindow(), SfxNewFileDialogMode::LoadTemplate));
- pNewFileDlg->SetTemplateFlags(nFlags);
+ SfxNewFileDialog aNewFileDlg(GetView()->GetViewFrame()->GetWindow().GetFrameWeld(), SfxNewFileDialogMode::LoadTemplate);
+ aNewFileDlg.SetTemplateFlags(nFlags);
- nRet = pNewFileDlg->Execute();
+ nRet = aNewFileDlg.run();
if(RET_TEMPLATE_LOAD == nRet)
{
FileDialogHelper aDlgHelper(TemplateDescription::FILEOPEN_SIMPLE,
@@ -560,10 +559,10 @@ void SwDocShell::Execute(SfxRequest& rReq)
}
else if( RET_OK == nRet)
{
- aFileName = pNewFileDlg->GetTemplateFileName();
+ aFileName = aNewFileDlg.GetTemplateFileName();
}
- nFlags = pNewFileDlg->GetTemplateFlags();
+ nFlags = aNewFileDlg.GetTemplateFlags();
rReq.AppendItem( SfxStringItem( SID_TEMPLATE_NAME, aFileName ) );
rReq.AppendItem( SfxInt32Item( SID_TEMPLATE_LOAD, static_cast<long>(nFlags) ) );
}
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index 02626e61b2d2..b01cff2f25b9 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -399,6 +399,14 @@ public:
return false;
}
+ virtual void set_busy_cursor(bool bBusy) override
+ {
+ if (bBusy)
+ m_xWindow->EnterWait();
+ else
+ m_xWindow->LeaveWait();
+ }
+
virtual ~SalInstanceWindow() override
{
clear_child_help(m_xWindow);
@@ -861,12 +869,12 @@ public:
virtual void select(int pos) override
{
+ assert(m_xTreeView->IsUpdateMode() && "don't select when frozen");
if (pos == -1)
- {
m_xTreeView->SetNoSelection();
- return;
- }
- m_xTreeView->SelectEntryPos(pos);
+ else
+ m_xTreeView->SelectEntryPos(pos);
+ m_xTreeView->Select();
}
virtual OUString get_selected() override
@@ -1063,6 +1071,42 @@ public:
}
};
+class SalInstanceExpander : public SalInstanceContainer, public virtual weld::Expander
+{
+private:
+ VclPtr<VclExpander> m_xExpander;
+
+ DECL_LINK(ExpandedHdl, VclExpander&, void);
+
+public:
+ SalInstanceExpander(VclExpander* pExpander, bool bTakeOwnership)
+ : SalInstanceContainer(pExpander, bTakeOwnership)
+ , m_xExpander(pExpander)
+ {
+ m_xExpander->SetExpandedHdl(LINK(this, SalInstanceExpander, ExpandedHdl));
+ }
+
+ virtual bool get_expanded() const override
+ {
+ return m_xExpander->get_expanded();
+ }
+
+ virtual void set_expanded(bool bExpand) override
+ {
+ m_xExpander->set_expanded(bExpand);
+ }
+
+ virtual ~SalInstanceExpander() override
+ {
+ m_xExpander->SetExpandedHdl(Link<VclExpander&, void>());
+ }
+};
+
+IMPL_LINK_NOARG(SalInstanceExpander, ExpandedHdl, VclExpander&, void)
+{
+ signal_expanded();
+}
+
class SalInstanceDrawingArea : public SalInstanceWidget, public virtual weld::DrawingArea
{
private:
@@ -1365,6 +1409,12 @@ public:
return pTextView ? new SalInstanceTextView(pTextView, bTakeOwnership) : nullptr;
}
+ virtual weld::Expander* weld_expander(const OString &id, bool bTakeOwnership) override
+ {
+ VclExpander* pExpander = m_xBuilder->get<VclExpander>(id);
+ return pExpander ? new SalInstanceExpander(pExpander, bTakeOwnership) : nullptr;
+ }
+
virtual weld::DrawingArea* weld_drawing_area(const OString &id, bool bTakeOwnership) override
{
VclDrawingArea* pDrawingArea = m_xBuilder->get<VclDrawingArea>(id);
diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx
index b3071c9a4ee4..ef8060662269 100644
--- a/vcl/unx/gtk3/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/gtk3gtkinst.cxx
@@ -1404,6 +1404,17 @@ public:
const gchar* pStr = gtk_window_get_title(m_pWindow);
return OUString(pStr, pStr ? strlen(pStr) : 0, RTL_TEXTENCODING_UTF8);
}
+
+ virtual void set_busy_cursor(bool bBusy) override
+ {
+ gtk_widget_realize(m_pWidget);
+ GdkDisplay *pDisplay = gtk_widget_get_display(m_pWidget);
+ GdkCursor *pCursor = bBusy ? gdk_cursor_new_from_name(pDisplay, "progress") : nullptr;
+ gdk_window_set_cursor(gtk_widget_get_window(m_pWidget), pCursor);
+ gdk_display_flush(pDisplay);
+ if (pCursor)
+ g_object_unref(pCursor);
+ }
};
namespace
@@ -2027,6 +2038,7 @@ public:
virtual void select(int pos) override
{
+ assert(gtk_tree_view_get_model(m_pTreeView) && "don't select when frozen");
if (pos != -1)
{
GtkTreePath* path = gtk_tree_path_new_from_indices(pos, -1);
@@ -2406,7 +2418,7 @@ public:
GtkInstanceComboBoxText(GtkComboBoxText* pComboBoxText, bool bTakeOwnership)
: GtkInstanceContainer(GTK_CONTAINER(pComboBoxText), bTakeOwnership)
, m_pComboBoxText(pComboBoxText)
- , m_nSignalId(g_signal_connect(pComboBoxText, "changed", G_CALLBACK(signalChanged), this))
+ , m_nSignalId(g_signal_connect(m_pComboBoxText, "changed", G_CALLBACK(signalChanged), this))
{
}
@@ -2527,6 +2539,42 @@ public:
}
};
+class GtkInstanceExpander : public GtkInstanceContainer, public virtual weld::Expander
+{
+private:
+ GtkExpander* m_pExpander;
+ gulong m_nSignalId;
+
+ static void signalExpanded(GtkExpander*, GParamSpec *, gpointer widget)
+ {
+ GtkInstanceExpander* pThis = static_cast<GtkInstanceExpander*>(widget);
+ pThis->signal_expanded();
+ }
+
+public:
+ GtkInstanceExpander(GtkExpander* pExpander, bool bTakeOwnership)
+ : GtkInstanceContainer(GTK_CONTAINER(pExpander), bTakeOwnership)
+ , m_pExpander(pExpander)
+ , m_nSignalId(g_signal_connect(m_pExpander, "notify::expanded", G_CALLBACK(signalExpanded), this))
+ {
+ }
+
+ virtual bool get_expanded() const override
+ {
+ return gtk_expander_get_expanded(m_pExpander);
+ }
+
+ virtual void set_expanded(bool bExpand) override
+ {
+ gtk_expander_set_expanded(m_pExpander, bExpand);
+ }
+
+ virtual ~GtkInstanceExpander() override
+ {
+ g_signal_handler_disconnect(m_pExpander, m_nSignalId);
+ }
+};
+
namespace
{
gboolean signalTooltipQuery(GtkWidget* pWidget, gint /*x*/, gint /*y*/,
@@ -2810,6 +2858,15 @@ public:
return new GtkInstanceTextView(pTextView, bTakeOwnership);
}
+ virtual weld::Expander* weld_expander(const OString &id, bool bTakeOwnership) override
+ {
+ GtkExpander* pExpander = GTK_EXPANDER(gtk_builder_get_object(m_pBuilder, id.getStr()));
+ if (!pExpander)
+ return nullptr;
+ auto_add_parentless_widgets_to_container(GTK_WIDGET(pExpander));
+ return new GtkInstanceExpander(pExpander, bTakeOwnership);
+ }
+
virtual weld::DrawingArea* weld_drawing_area(const OString &id, bool bTakeOwnership) override
{
GtkDrawingArea* pDrawingArea = GTK_DRAWING_AREA(gtk_builder_get_object(m_pBuilder, id.getStr()));