summaryrefslogtreecommitdiff
path: root/sfx2
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2018-05-22 10:38:34 +0100
committerCaolán McNamara <caolanm@redhat.com>2018-05-24 14:24:06 +0200
commiteeaf6dee2d278eaa037d95a756ad0ffab3314bc2 (patch)
treea997fee717ad079fb59ff0901d418938ab7585f7 /sfx2
parentc10928e703366341ab912c42e8959a087a7fa9ff (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.cxx70
-rw-r--r--sfx2/source/doc/new.cxx29
-rw-r--r--sfx2/source/inc/preview.hxx13
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);
};