diff options
author | Caolán McNamara <caolanm@redhat.com> | 2018-05-22 10:38:34 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2018-05-24 14:24:06 +0200 |
commit | eeaf6dee2d278eaa037d95a756ad0ffab3314bc2 (patch) | |
tree | a997fee717ad079fb59ff0901d418938ab7585f7 /sfx2 | |
parent | c10928e703366341ab912c42e8959a087a7fa9ff (diff) |
rework custom widget welding to enable inheritence
Change-Id: I0d391b3fe9d2d610ae41e2a03cd2e195a866e103
Reviewed-on: https://gerrit.libreoffice.org/54681
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'sfx2')
-rw-r--r-- | sfx2/source/control/charwin.cxx | 70 | ||||
-rw-r--r-- | sfx2/source/doc/new.cxx | 29 | ||||
-rw-r--r-- | sfx2/source/inc/preview.hxx | 13 |
3 files changed, 49 insertions, 63 deletions
diff --git a/sfx2/source/control/charwin.cxx b/sfx2/source/control/charwin.cxx index a1c0abc6672d..a585361a3296 100644 --- a/sfx2/source/control/charwin.cxx +++ b/sfx2/source/control/charwin.cxx @@ -28,42 +28,39 @@ using namespace com::sun::star; -SvxCharView::SvxCharView(weld::Builder& rBuilder, const OString& rId, const VclPtr<VirtualDevice>& rVirDev) +SvxCharView::SvxCharView(const VclPtr<VirtualDevice>& rVirDev) : mxVirDev(rVirDev) - , mxDrawingArea(rBuilder.weld_drawing_area(rId)) , mnY(0) , maPosition(0,0) , maHasInsert(true) { - mxDrawingArea->connect_size_allocate(LINK(this, SvxCharView, DoResize)); - mxDrawingArea->connect_draw(LINK(this, SvxCharView, DoPaint)); - mxDrawingArea->connect_mouse_press(LINK(this, SvxCharView, DoMouseButtonDown)); - mxDrawingArea->connect_key_press(LINK(this, SvxCharView, DoKeyDown)); - mxDrawingArea->connect_focus_in(LINK(this, SvxCharView, DoGetFocus)); - mxDrawingArea->connect_focus_out(LINK(this, SvxCharView, DoLoseFocus)); +} +void SvxCharView::SetDrawingArea(weld::DrawingArea* pDrawingArea) +{ const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings(); vcl::Font aFont = rStyleSettings.GetLabelFont(); const Size aFontSize = aFont.GetFontSize(); aFont.SetFontSize(Size(aFontSize.Width() * 2.5, aFontSize.Height() * 2.5)); mxVirDev->Push(PUSH_ALLFONT); mxVirDev->SetFont(aFont); - mxDrawingArea->set_size_request(mxVirDev->approximate_digit_width() * 2, - mxVirDev->GetTextHeight()); + pDrawingArea->set_size_request(mxVirDev->approximate_digit_width() * 2, + mxVirDev->GetTextHeight()); mxVirDev->Pop(); + CustomWidgetController::SetDrawingArea(pDrawingArea); } -IMPL_LINK_NOARG(SvxCharView, DoGetFocus, weld::Widget&, void) +void SvxCharView::GetFocus() { - mxDrawingArea->queue_draw(); + Invalidate(); } -IMPL_LINK_NOARG(SvxCharView, DoLoseFocus, weld::Widget&, void) +void SvxCharView::LoseFocus() { - mxDrawingArea->queue_draw(); + Invalidate(); } -IMPL_LINK(SvxCharView, DoMouseButtonDown, const MouseEvent&, rMEvt, void) +void SvxCharView::MouseButtonDown(const MouseEvent& rMEvt) { if ( rMEvt.IsLeft() ) { @@ -79,13 +76,13 @@ IMPL_LINK(SvxCharView, DoMouseButtonDown, const MouseEvent&, rMEvt, void) { Point aPosition(rMEvt.GetPosPixel()); maPosition = aPosition; - mxDrawingArea->grab_focus(); - mxDrawingArea->queue_draw(); + GrabFocus(); + Invalidate(); createContextMenu(); } } -IMPL_LINK(SvxCharView, DoKeyDown, const KeyEvent&, rKEvt, bool) +bool SvxCharView::KeyInput(const KeyEvent& rKEvt) { bool bRet = false; vcl::KeyCode aCode = rKEvt.GetKeyCode(); @@ -119,10 +116,11 @@ void SvxCharView::InsertCharToDoc() void SvxCharView::createContextMenu() { - std::unique_ptr<weld::Builder> xBuilder(Application::CreateBuilder(mxDrawingArea.get(), "sfx/ui/charviewmenu.ui")); + weld::DrawingArea* pDrawingArea = GetDrawingArea(); + std::unique_ptr<weld::Builder> xBuilder(Application::CreateBuilder(pDrawingArea, "sfx/ui/charviewmenu.ui")); std::unique_ptr<weld::Menu> xItemMenu(xBuilder->weld_menu("charviewmenu")); - ContextMenuSelect(xItemMenu->popup_at_rect(mxDrawingArea.get(), tools::Rectangle(maPosition, Size(1,1)))); - queue_draw(); + ContextMenuSelect(xItemMenu->popup_at_rect(pDrawingArea, tools::Rectangle(maPosition, Size(1,1)))); + Invalidate(); } void SvxCharView::ContextMenuSelect(const OString& rMenuId) @@ -133,10 +131,8 @@ void SvxCharView::ContextMenuSelect(const OString& rMenuId) maClearAllClickHdl.Call(this); } -IMPL_LINK(SvxCharView, DoPaint, weld::DrawingArea::draw_args, aPayload, void) +void SvxCharView::Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle&) { - vcl::RenderContext& rRenderContext = aPayload.first; - rRenderContext.SetFont(maFont); const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings(); @@ -148,8 +144,9 @@ IMPL_LINK(SvxCharView, DoPaint, weld::DrawingArea::draw_args, aPayload, void) const OUString aText = GetText(); - long nAvailWidth = m_aSize.Width(); - long nWinHeight = m_aSize.Height(); + Size aSize(GetOutputSizePixel()); + long nAvailWidth = aSize.Width(); + long nWinHeight = aSize.Height(); bool bGotBoundary = true; bool bShrankFont = false; @@ -180,7 +177,7 @@ IMPL_LINK(SvxCharView, DoPaint, weld::DrawingArea::draw_args, aPayload, void) Point aPoint(2, mnY); if (!bGotBoundary) - aPoint.setX( (m_aSize.Width() - rRenderContext.GetTextWidth(aText)) / 2 ); + aPoint.setX( (aSize.Width() - rRenderContext.GetTextWidth(aText)) / 2 ); else { // adjust position @@ -188,20 +185,20 @@ IMPL_LINK(SvxCharView, DoPaint, weld::DrawingArea::draw_args, aPayload, void) // vertical adjustment int nYLDelta = aBoundRect.Top(); - int nYHDelta = m_aSize.Height() - aBoundRect.Bottom(); + int nYHDelta = aSize.Height() - aBoundRect.Bottom(); if( nYLDelta <= 0 ) aPoint.AdjustY( -(nYLDelta - 1) ); else if( nYHDelta <= 0 ) aPoint.AdjustY(nYHDelta - 1 ); // centrally align glyph - aPoint.setX( -aBoundRect.Left() + (m_aSize.Width() - aBoundRect.GetWidth()) / 2 ); + aPoint.setX( -aBoundRect.Left() + (aSize.Width() - aBoundRect.GetWidth()) / 2 ); } - if (mxDrawingArea->has_focus()) + if (HasFocus()) { rRenderContext.SetFillColor(aHighlightColor); - rRenderContext.DrawRect(tools::Rectangle(Point(0, 0), m_aSize)); + rRenderContext.DrawRect(tools::Rectangle(Point(0, 0), aSize)); rRenderContext.SetTextColor(aHighlightTextColor); rRenderContext.DrawText(aPoint, aText); @@ -209,7 +206,7 @@ IMPL_LINK(SvxCharView, DoPaint, weld::DrawingArea::draw_args, aPayload, void) else { rRenderContext.SetFillColor(aFillColor); - rRenderContext.DrawRect(tools::Rectangle(Point(0, 0), m_aSize)); + rRenderContext.DrawRect(tools::Rectangle(Point(0, 0), aSize)); rRenderContext.SetTextColor(aWindowTextColor); rRenderContext.DrawText(aPoint, aText); @@ -238,7 +235,7 @@ void SvxCharView::setClearAllClickHdl(const Link<SvxCharView*,void> &rLink) void SvxCharView::SetFont( const vcl::Font& rFont ) { - long nWinHeight = m_aSize.Height(); + long nWinHeight = GetOutputSizePixel().Height(); maFont = vcl::Font(rFont); maFont.SetWeight(WEIGHT_NORMAL); maFont.SetAlignment(ALIGN_TOP); @@ -250,19 +247,18 @@ void SvxCharView::SetFont( const vcl::Font& rFont ) mnY = (nWinHeight - mxVirDev->GetTextHeight()) / 2; mxVirDev->Pop(); - queue_draw(); + Invalidate(); } -IMPL_LINK(SvxCharView, DoResize, const Size&, rSize, void) +void SvxCharView::Resize() { - m_aSize = rSize; SetFont(GetFont()); //force recalculation of size } void SvxCharView::SetText( const OUString& rText ) { m_sText = rText; - queue_draw(); + Invalidate(); } void SvxCharView::SetHasInsert( bool bInsert ) diff --git a/sfx2/source/doc/new.cxx b/sfx2/source/doc/new.cxx index 1d860d18275e..af26dab03b42 100644 --- a/sfx2/source/doc/new.cxx +++ b/sfx2/source/doc/new.cxx @@ -47,19 +47,11 @@ void SfxPreviewWin_Impl::SetObjectShell(SfxObjectShell const * pObj) ? pObj->GetPreviewMetaFile() : std::shared_ptr<GDIMetaFile>(); xMetaFile = xFile; - m_xDrawingArea->queue_draw(); + Invalidate(); } -SfxPreviewWin_Impl::SfxPreviewWin_Impl(weld::DrawingArea* pDrawingArea) - : m_xDrawingArea(pDrawingArea) +SfxPreviewWin_Impl::SfxPreviewWin_Impl() { - m_xDrawingArea->connect_size_allocate(LINK(this, SfxPreviewWin_Impl, DoResize)); - m_xDrawingArea->connect_draw(LINK(this, SfxPreviewWin_Impl, DoPaint)); -} - -IMPL_LINK_NOARG(SfxPreviewWin_Impl, DoResize, const Size&, void) -{ - m_xDrawingArea->queue_draw(); } void SfxPreviewWin_Impl::ImpPaint(vcl::RenderContext& rRenderContext, GDIMetaFile* pFile) @@ -104,9 +96,9 @@ void SfxPreviewWin_Impl::ImpPaint(vcl::RenderContext& rRenderContext, GDIMetaFil } } -IMPL_LINK(SfxPreviewWin_Impl, DoPaint, weld::DrawingArea::draw_args, aPayload, void) +void SfxPreviewWin_Impl::Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle&) { - ImpPaint(aPayload.first, xMetaFile.get()); + ImpPaint(rRenderContext, xMetaFile.get()); } IMPL_LINK_NOARG(SfxNewFileDialog, Update, Timer*, void) @@ -121,8 +113,8 @@ IMPL_LINK_NOARG(SfxNewFileDialog, Update, Timer*, void) const sal_uInt16 nEntry = GetSelectedTemplatePos(); if (!nEntry) { - m_xPreviewWin->queue_draw(); - m_xPreviewWin->SetObjectShell(nullptr); + m_xPreviewController->Invalidate(); + m_xPreviewController->SetObjectShell(nullptr); return; } @@ -164,12 +156,12 @@ IMPL_LINK_NOARG(SfxNewFileDialog, Update, Timer*, void) ErrorHandler::HandleError(lErr); if (!m_xDocShell.Is()) { - m_xPreviewWin->SetObjectShell(nullptr); + m_xPreviewController->SetObjectShell(nullptr); return; } } - m_xPreviewWin->SetObjectShell(m_xDocShell); + m_xPreviewController->SetObjectShell(m_xDocShell); } } @@ -238,6 +230,8 @@ sal_uInt16 SfxNewFileDialog::GetSelectedTemplatePos() const SfxNewFileDialog::SfxNewFileDialog(weld::Window *pParent, SfxNewFileDialogMode nFlags) : GenericDialogController(pParent, "sfx/ui/loadtemplatedialog.ui", "LoadTemplateDialog") + , m_nFlags(nFlags) + , m_xPreviewController(new SfxPreviewWin_Impl) , m_xRegionLb(m_xBuilder->weld_tree_view("categories")) , m_xTemplateLb(m_xBuilder->weld_tree_view("templates")) , m_xTextStyleCB(m_xBuilder->weld_check_button("text")) @@ -247,9 +241,8 @@ SfxNewFileDialog::SfxNewFileDialog(weld::Window *pParent, SfxNewFileDialogMode n , 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_xPreviewWin(new weld::CustomWeld(*m_xBuilder, "image", *m_xPreviewController)) , m_xAltTitleFt(m_xBuilder->weld_label("alttitle")) - , m_nFlags(nFlags) { const int nWidth = m_xRegionLb->get_approximate_digit_width() * 32; const int nHeight = m_xRegionLb->get_height_rows(8); diff --git a/sfx2/source/inc/preview.hxx b/sfx2/source/inc/preview.hxx index 8b39231c31a8..328fc005330d 100644 --- a/sfx2/source/inc/preview.hxx +++ b/sfx2/source/inc/preview.hxx @@ -20,23 +20,20 @@ #define INCLUDED_SFX2_SOURCE_INC_PREVIEW_HXX #include <tools/link.hxx> +#include <vcl/customweld.hxx> class SfxObjectShell; class GDIMetaFile; -class SfxPreviewWin_Impl +class SfxPreviewWin_Impl : public weld::CustomWidgetController { +private: + virtual void Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle&) override; protected: std::shared_ptr<GDIMetaFile> xMetaFile; - std::unique_ptr<weld::DrawingArea> m_xDrawingArea; public: - SfxPreviewWin_Impl(weld::DrawingArea* pArea); + SfxPreviewWin_Impl(); void SetObjectShell( SfxObjectShell const * pObj ); - DECL_LINK(DoPaint, weld::DrawingArea::draw_args, 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); }; |