summaryrefslogtreecommitdiffstats
path: root/include/vcl/customweld.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'include/vcl/customweld.hxx')
-rw-r--r--include/vcl/customweld.hxx191
1 files changed, 191 insertions, 0 deletions
diff --git a/include/vcl/customweld.hxx b/include/vcl/customweld.hxx
new file mode 100644
index 000000000..e37555b36
--- /dev/null
+++ b/include/vcl/customweld.hxx
@@ -0,0 +1,191 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_VCL_CUSTOMWELD_HXX
+#define INCLUDED_VCL_CUSTOMWELD_HXX
+
+#include <vcl/weld.hxx>
+
+class InputContext;
+
+namespace weld
+{
+class VCL_DLLPUBLIC CustomWidgetController
+{
+private:
+ Size m_aSize;
+ weld::DrawingArea* m_pDrawingArea;
+ DECL_LINK(DragBeginHdl, weld::DrawingArea&, bool);
+
+public:
+ virtual css::uno::Reference<css::accessibility::XAccessible> CreateAccessible()
+ {
+ return css::uno::Reference<css::accessibility::XAccessible>();
+ }
+ // rRect is in Logical units rather than Pixels
+ virtual void Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect) = 0;
+ virtual void Resize() {}
+ virtual bool MouseButtonDown(const MouseEvent&) { return false; }
+ virtual bool MouseMove(const MouseEvent&) { return false; }
+ virtual bool MouseButtonUp(const MouseEvent&) { return false; }
+ virtual void GetFocus() {}
+ virtual void LoseFocus() {}
+ virtual void StyleUpdated() { Invalidate(); }
+ virtual bool Command(const CommandEvent&) { return false; }
+ virtual bool KeyInput(const KeyEvent&) { return false; }
+ virtual tools::Rectangle GetFocusRect() { return tools::Rectangle(); }
+ virtual FactoryFunction GetUITestFactory() const { return nullptr; }
+ virtual OUString RequestHelp(tools::Rectangle&) { return OUString(); }
+ virtual OUString GetHelpText() const { return m_pDrawingArea->get_tooltip_text(); }
+ Size const& GetOutputSizePixel() const { return m_aSize; }
+ void SetOutputSizePixel(const Size& rSize) { m_aSize = rSize; }
+ virtual void SetDrawingArea(weld::DrawingArea* pDrawingArea) { m_pDrawingArea = pDrawingArea; }
+ weld::DrawingArea* GetDrawingArea() const { return m_pDrawingArea; }
+ void Invalidate()
+ {
+ if (!m_pDrawingArea)
+ return;
+ m_pDrawingArea->queue_draw();
+ }
+ static bool IsUpdateMode() { return true; }
+ void Invalidate(const tools::Rectangle& rRect)
+ {
+ if (!m_pDrawingArea)
+ return;
+ m_pDrawingArea->queue_draw_area(rRect.Left(), rRect.Top(), rRect.GetWidth(),
+ rRect.GetHeight());
+ }
+ virtual void Show() { m_pDrawingArea->show(); }
+ virtual void Hide() { m_pDrawingArea->hide(); }
+ void GrabFocus() { m_pDrawingArea->grab_focus(); }
+ bool HasFocus() const { return m_pDrawingArea->has_focus(); }
+ bool HasChildFocus() const { return m_pDrawingArea->has_child_focus(); }
+ bool IsVisible() const { return m_pDrawingArea->get_visible(); }
+ bool IsReallyVisible() const { return m_pDrawingArea->is_visible(); }
+ bool IsEnabled() const { return m_pDrawingArea->get_sensitive(); }
+ void Enable() const { m_pDrawingArea->set_sensitive(true); }
+ void Disable() const { m_pDrawingArea->set_sensitive(false); }
+ bool IsActive() const { return m_pDrawingArea->is_active(); }
+ int GetTextHeight() const { return m_pDrawingArea->get_text_height(); }
+ int GetTextWidth(const OUString& rText) const
+ {
+ return m_pDrawingArea->get_pixel_size(rText).Width();
+ }
+ OUString GetAccessibleName() const { return m_pDrawingArea->get_accessible_name(); }
+ OUString GetAccessibleDescription() const
+ {
+ return m_pDrawingArea->get_accessible_description();
+ }
+ void CaptureMouse() { m_pDrawingArea->grab_add(); }
+ bool IsMouseCaptured() const { return m_pDrawingArea->has_grab(); }
+ Point GetPointerPosPixel() const { return m_pDrawingArea->get_pointer_position(); }
+ void EnableRTL(bool bEnable) { m_pDrawingArea->set_direction(bEnable); }
+ bool IsRTLEnabled() const { return m_pDrawingArea->get_direction(); }
+ void ReleaseMouse() { m_pDrawingArea->grab_remove(); }
+ void SetPointer(PointerStyle ePointerStyle) { m_pDrawingArea->set_cursor(ePointerStyle); }
+ void SetHelpId(const OString& rHelpId) { m_pDrawingArea->set_help_id(rHelpId); }
+ void SetAccessibleName(const OUString& rName) { m_pDrawingArea->set_accessible_name(rName); }
+ void SetInputContext(const InputContext& rInputContext)
+ {
+ m_pDrawingArea->set_input_context(rInputContext);
+ }
+ void SetCursorRect(const tools::Rectangle& rCursorRect, int nExtTextInputWidth)
+ {
+ m_pDrawingArea->im_context_set_cursor_location(rCursorRect, nExtTextInputWidth);
+ }
+ virtual int GetSurroundingText(OUString& /*rSurrounding*/) { return -1; }
+ virtual bool DeleteSurroundingText(const Selection& /*rRange*/) { return false; }
+ css::uno::Reference<css::datatransfer::dnd::XDropTarget> GetDropTarget()
+ {
+ return m_pDrawingArea->get_drop_target();
+ }
+ css::uno::Reference<css::datatransfer::clipboard::XClipboard> GetClipboard() const
+ {
+ return m_pDrawingArea->get_clipboard();
+ }
+ void SetDragDataTransferrable(rtl::Reference<TransferDataContainer>& rTransferrable,
+ sal_uInt8 eDNDConstants)
+ {
+ m_pDrawingArea->enable_drag_source(rTransferrable, eDNDConstants);
+ m_pDrawingArea->connect_drag_begin(LINK(this, CustomWidgetController, DragBeginHdl));
+ }
+ // return true to disallow drag, false to allow
+ virtual bool StartDrag() { return false; }
+ void set_size_request(int nWidth, int nHeight)
+ {
+ m_pDrawingArea->set_size_request(nWidth, nHeight);
+ }
+ void queue_resize()
+ {
+ if (!m_pDrawingArea)
+ return;
+ m_pDrawingArea->queue_resize();
+ }
+ CustomWidgetController()
+ : m_pDrawingArea(nullptr)
+ {
+ }
+ virtual ~CustomWidgetController();
+
+ CustomWidgetController(CustomWidgetController const&) = default;
+ CustomWidgetController(CustomWidgetController&&) = default;
+ CustomWidgetController& operator=(CustomWidgetController const&) = default;
+ CustomWidgetController& operator=(CustomWidgetController&&) = default;
+};
+
+class VCL_DLLPUBLIC CustomWeld final
+{
+private:
+ weld::CustomWidgetController& m_rWidgetController;
+ std::unique_ptr<weld::DrawingArea> m_xDrawingArea;
+
+ DECL_DLLPRIVATE_LINK(DoResize, const Size& rSize, void);
+ DECL_DLLPRIVATE_LINK(DoPaint, weld::DrawingArea::draw_args, void);
+ DECL_DLLPRIVATE_LINK(DoMouseButtonDown, const MouseEvent&, bool);
+ DECL_DLLPRIVATE_LINK(DoMouseMove, const MouseEvent&, bool);
+ DECL_DLLPRIVATE_LINK(DoMouseButtonUp, const MouseEvent&, bool);
+ DECL_DLLPRIVATE_LINK(DoGetFocus, weld::Widget&, void);
+ DECL_DLLPRIVATE_LINK(DoLoseFocus, weld::Widget&, void);
+ DECL_DLLPRIVATE_LINK(DoKeyPress, const KeyEvent&, bool);
+ DECL_DLLPRIVATE_LINK(DoFocusRect, weld::Widget&, tools::Rectangle);
+ DECL_DLLPRIVATE_LINK(DoCommand, const CommandEvent&, bool);
+ DECL_DLLPRIVATE_LINK(DoStyleUpdated, weld::Widget&, void);
+ DECL_DLLPRIVATE_LINK(DoRequestHelp, tools::Rectangle&, OUString);
+ DECL_DLLPRIVATE_LINK(DoGetSurrounding, OUString&, int);
+ DECL_DLLPRIVATE_LINK(DoDeleteSurrounding, const Selection&, bool);
+
+public:
+ CustomWeld(weld::Builder& rBuilder, const OString& rDrawingId,
+ CustomWidgetController& rWidgetController);
+ void queue_draw() { m_xDrawingArea->queue_draw(); }
+ void queue_draw_area(int x, int y, int width, int height)
+ {
+ m_xDrawingArea->queue_draw_area(x, y, width, height);
+ }
+ void set_size_request(int nWidth, int nHeight)
+ {
+ m_xDrawingArea->set_size_request(nWidth, nHeight);
+ }
+ void show() { m_xDrawingArea->show(); }
+ void hide() { m_xDrawingArea->hide(); }
+ void set_margin_top(int nMargin) { m_xDrawingArea->set_margin_top(nMargin); }
+ void set_margin_bottom(int nMargin) { m_xDrawingArea->set_margin_bottom(nMargin); }
+ void set_sensitive(bool bSensitive) { m_xDrawingArea->set_sensitive(bSensitive); }
+ bool get_sensitive() const { return m_xDrawingArea->get_sensitive(); }
+ bool get_visible() const { return m_xDrawingArea->get_visible(); }
+ void set_visible(bool bVisible) { m_xDrawingArea->set_visible(bVisible); }
+ void set_grid_left_attach(int nAttach) { m_xDrawingArea->set_grid_left_attach(nAttach); }
+ int get_grid_left_attach() const { return m_xDrawingArea->get_grid_left_attach(); }
+ void set_help_id(const OString& rHelpId) { m_xDrawingArea->set_help_id(rHelpId); }
+ void set_tooltip_text(const OUString& rTip) { m_xDrawingArea->set_tooltip_text(rTip); }
+};
+}
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */