summaryrefslogtreecommitdiffstats
path: root/include/svx/svdview.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'include/svx/svdview.hxx')
-rw-r--r--include/svx/svdview.hxx281
1 files changed, 281 insertions, 0 deletions
diff --git a/include/svx/svdview.hxx b/include/svx/svdview.hxx
new file mode 100644
index 0000000000..aeb364a985
--- /dev/null
+++ b/include/svx/svdview.hxx
@@ -0,0 +1,281 @@
+/* -*- 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/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#pragma once
+
+// HACK to avoid too deep includes and to have some
+// levels free in svdmark itself (MS compiler include depth limit)
+#include <svx/svdhdl.hxx>
+#include <tools/weakbase.h>
+#include <svtools/accessibilityoptions.hxx>
+#include <svx/svxdllapi.h>
+#include <svx/svdcrtv.hxx>
+#include <vcl/event.hxx>
+#include <unotools/options.hxx>
+#include <basegfx/polygon/b2dpolypolygon.hxx>
+
+// class hierarchy of View:
+// SfxListener
+// SdrPaintView PntV Action ModChg Attr Notify
+// SdrSnapView SnpV Action
+//
+// SdrMarkView MrkV Action MrkChg ModChg Notify
+//
+// SdrEditView EdtV MrkChg ModChg Attr
+// SdrPolyEditView PoEV
+// SdrGlueEditView GlEV
+// SdrObjEditView EdxV Action ModChg Attr Notify
+//
+// SdrExchangeView XcgV
+// SdrDragView DrgV Action
+//
+// SdrCreateView CrtV Action
+// SdrView View
+
+class SvxURLField;
+namespace sdr::contact { class ObjectContact; }
+
+enum class SdrViewContext {
+ Standard,
+ PointEdit,
+ GluePointEdit,
+ Graphic,
+ Media,
+ Table
+};
+
+enum class SdrEventKind {
+ NONE,
+ TextEdit,
+ MoveAction,
+ EndAction,
+ BackAction,
+ EndCreate,
+ EndDrag,
+ MarkObj,
+ MarkPoint,
+ MarkGluePoint,
+ BeginMark,
+ BeginInsertObjPoint,
+ EndInsertObjPoint,
+ BeginInsertGluePoint,
+ BeginDragHelpline,
+ BeginDragObj,
+ BeginCreateObj,
+ BeginMacroObj,
+ BeginTextEdit,
+ EndMark,
+ BrkMark,
+ ExecuteUrl
+};
+
+/* for PickAnything() */
+enum class SdrMouseEventKind
+{
+ BUTTONDOWN = 1,
+ MOVE = 2,
+ BUTTONUP = 3,
+};
+
+// helper class SdrViewEvent
+struct SVXCORE_DLLPUBLIC SdrViewEvent
+{
+ SdrHdl* mpHdl;
+ SdrObject* mpObj;
+ SdrObject* mpRootObj; // mark this when SdrBeginTextEdit is executed
+ SdrPageView* mpPV;
+ const SvxURLField* mpURLField;
+
+ Point maLogicPos;
+ SdrHitKind meHit;
+ SdrEventKind meEvent;
+
+ sal_uInt16 mnMouseClicks;
+ MouseEventModifiers mnMouseMode;
+ sal_uInt16 mnMouseCode;
+ sal_uInt16 mnHlplIdx;
+ sal_uInt16 mnGlueId;
+
+ bool mbMouseDown : 1;
+ bool mbMouseUp : 1;
+ bool mbIsAction : 1; // Action is active
+ bool mbIsTextEdit : 1; // TextEdit runs currently
+ bool mbAddMark : 1;
+ bool mbUnmark : 1;
+ bool mbPrevNextMark : 1;
+ bool mbMarkPrev : 1;
+
+public:
+ SdrViewEvent();
+};
+
+// helper class for all D&D overlays
+class SVXCORE_DLLPUBLIC SdrDropMarkerOverlay
+{
+ // The OverlayObjects
+ sdr::overlay::OverlayObjectList maObjects;
+
+ void ImplCreateOverlays(
+ const SdrView& rView,
+ const basegfx::B2DPolyPolygon& rLinePolyPolygon);
+
+public:
+ SdrDropMarkerOverlay(const SdrView& rView, const SdrObject& rObject);
+ SdrDropMarkerOverlay(const SdrView& rView, const tools::Rectangle& rRectangle);
+ SdrDropMarkerOverlay(const SdrView& rView, const Point& rStart, const Point& rEnd);
+ ~SdrDropMarkerOverlay();
+};
+
+
+class SVXCORE_DLLPUBLIC SdrView : public SdrCreateView, public tools::WeakBase
+{
+ friend class SdrPageView;
+
+ bool mbNoExtendedMouseDispatcher : 1;
+ bool mbNoExtendedKeyDispatcher : 1;
+ bool mbMasterPagePaintCaching : 1;
+
+ SvtAccessibilityOptions maAccessibilityOptions;
+
+public:
+ explicit SdrView(
+ SdrModel& rSdrModel,
+ OutputDevice* pOut = nullptr);
+
+ virtual ~SdrView() override;
+
+ virtual bool IsSdrView() const final { return true; }
+
+ // The default value for all dispatchers is activated. If the app for example
+ // wants to intervene in MouseDispatcher for special treatment, you have to
+ // deactivate the MouseDispatcher with the help of the method below and you have
+ // to implement it yourself. Example for MouseButtonDown:
+ // SdrViewEvent aVEvt;
+ // SdrHitKind eHit=pSdrView->PickAnything(rMEvt,SdrMouseEventKind::BUTTONDOWN,aVEvt);
+ // ... here application-specific intervention ...
+ // pSdrView->DoMouseEvent(aVEvt);
+ // SetPointer(GetPreferredPointer(...))
+ // CaptureMouse(...)
+ void EnableExtendedMouseEventDispatcher(bool bOn) { mbNoExtendedMouseDispatcher = !bOn; }
+ bool IsExtendedMouseEventDispatcherEnabled() const { return mbNoExtendedMouseDispatcher; }
+
+ void EnableExtendedKeyInputDispatcher(bool bOn) { mbNoExtendedKeyDispatcher=!bOn; }
+ bool IsExtendedKeyInputDispatcherEnabled() const { return mbNoExtendedKeyDispatcher; }
+
+ void SetMasterPagePaintCaching(bool bOn);
+ bool IsMasterPagePaintCaching() const { return mbMasterPagePaintCaching; }
+
+ bool KeyInput(const KeyEvent& rKEvt, vcl::Window* pWin) override;
+ virtual bool MouseButtonDown(const MouseEvent& rMEvt, OutputDevice* pWin) override;
+ virtual bool MouseButtonUp(const MouseEvent& rMEvt, OutputDevice* pWin) override;
+ virtual bool MouseMove(const MouseEvent& rMEvt, OutputDevice* pWin) override;
+ using SdrCreateView::RequestHelp;
+ virtual bool Command(const CommandEvent& rCEvt, vcl::Window* pWin) override;
+
+ virtual void ConfigurationChanged( utl::ConfigurationBroadcaster*, ConfigurationHints ) override;
+
+ bool SetAttributes(const SfxItemSet& rSet, bool bReplaceAll=false) { return SdrCreateView::SetAttributes(rSet,bReplaceAll); }
+
+ /* new interface src537 */
+ void GetAttributes(SfxItemSet& rTargetSet, bool bOnlyHardAttr=false) const;
+
+ // incomplete implementation:
+ // OutputDevice is necessary to determine HandleSize.
+ // If NULL the first signed on Win is used.
+ PointerStyle GetPreferredPointer(const Point& rMousePos, const OutputDevice* pOut, sal_uInt16 nModifier=0, bool bLeftDown=false) const;
+ SdrHitKind PickAnything(const MouseEvent& rMEvt, SdrMouseEventKind nMouseDownOrMoveOrUp, SdrViewEvent& rVEvt) const;
+ SdrHitKind PickAnything(const Point& rLogicPos, SdrViewEvent& rVEvt) const;
+ bool DoMouseEvent(const SdrViewEvent& rVEvt);
+ virtual SdrViewContext GetContext() const;
+
+ // The methods consider the particular context:
+ // - simple drawing
+ // - mode for editing points
+ // - mode for editing gluepoints
+ // - TextEdit
+ // - ... to be continued
+ void MarkAll();
+ void UnmarkAll();
+
+ const tools::Rectangle& GetMarkedRect() const;
+
+ virtual void DeleteMarked();
+
+ // Marking objects, traverse stations or gluepoints (depending on view-
+ // context) by enveloping the selection frame.
+ // bAddMark=TRUE: add to existing selection (->Shift)
+ // bUnmark=TRUE: remove objects from selection which are inside of
+ // the enveloped frame.
+ bool BegMark(const Point& rPnt, bool bAddMark, bool bUnmark);
+
+ // The following actions are possible:
+ // - ObjectCreating
+ // - ObjectMarking
+ // - Object-specific dragging
+ // - General dragging
+ // and more...
+ OUString GetStatusText();
+
+ virtual void onAccessibilityOptionsChanged();
+
+ // Do not create ObjectContact locally, but offer a call to allow override
+ // and to create own derivations of ObjectContact
+ virtual sdr::contact::ObjectContact* createViewSpecificObjectContact(
+ SdrPageWindow& rPageWindow,
+ const char* pDebugName) const;
+
+ // Interactive Move Action programmatically
+ bool MoveShapeHandle(const sal_uInt32 handleNum, const Point& aEndPoint, const sal_Int32 aObjectOrdNum = -1);
+};
+
+// First of all the app creates a SdrModel.
+// Then it opens a Win and creates a SdrView.
+// ShowSdrPage() announces a page at SdrView.
+// It's possible to show SdrView in any Wins at once.
+// internal:
+// SdrView can show as many Wins as it wants at once. Pages are announced
+// or checked out with the help of ShowSdrPage()/HideSdrPage(). For every announced
+// page there is a SdrPageView instance in container aPages. If more than one page
+// is showed, you have to pay attention that the offset parameter of ShowSdrPage()
+// is conformed to the size of the page (to prevent overlapping of two pages).
+//
+// elementary methods:
+// ~~~~~~~~~~~~~~~~~~~~
+// simple events:
+// ~~~~~~~~~~~~~~~~
+// bool KeyInput(const KeyEvent& rKEvt, vcl::Window* pWin);
+// bool MouseButtonDown(const MouseEvent& rMEvt, vcl::Window* pWin);
+// bool MouseButtonUp(const MouseEvent& rMEvt, vcl::Window* pWin);
+// bool MouseMove(const MouseEvent& rMEvt, vcl::Window* pWin);
+// bool Command(const CommandEvent& rCEvt, vcl::Window* pWin);
+//
+// SfxItems:
+// ~~~~~~~~~
+// sal_Bool GetAttributes(SfxItemSet& rTargetSet, sal_Bool bOnlyHardAttr=sal_False) const;
+// sal_Bool SetAttributes(const SfxItemSet& rSet, sal_Bool bReplaceAll);
+// SfxStyleSheet* GetStyleSheet() const;
+// sal_Bool SetStyleSheet(SfxStyleSheet* pStyleSheet, sal_Bool bDontRemoveHardAttr);
+//
+// others:
+// ~~~~~~~~~~
+// Pointer GetPreferredPointer(const Point& rMousePos, const OutputDevice* pOut, sal_uInt16 nTol=0) const;
+// OUString GetStatusText();
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */