office-gobmx/include/svtools/ruler.hxx
Caolán McNamara cf828ae143 rename one ImplHitTest so using window::ImplHitTest can be dropped
Change-Id: I8a77654d4c6629ee76d57fc26bb022c69dab0b9a
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/111559
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
2021-02-26 11:55:20 +01:00

799 lines
33 KiB
C++

/* -*- 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
#include <memory>
#include <map>
#include <vector>
#include <svtools/svtdllapi.h>
#include <rtl/ref.hxx>
#include <tools/fldunit.hxx>
#include <tools/link.hxx>
#include <tools/fract.hxx>
#include <vcl/window.hxx>
#include <vcl/glyphitem.hxx>
class MouseEvent;
class TrackingEvent;
class DataChangedEvent;
class SvtRulerAccessible;
/*************************************************************************
Description
============
class Ruler
This class is used for displaying a ruler, but it can also be used
for setting or moving tabs and margins.
--------------------------------------------------------------------------
WinBits
WB_HORZ ruler is displayed horizontally
WB_VERT ruler is displayed vertically
WB_3DLOOK 3D look
WB_BORDER border at the bottom/right margin
WB_EXTRAFIELD Field in the upper left corner for
displaying and selecting tabs, origin of coordinates, ...
WB_RIGHT_ALIGNED Marks the vertical ruler as right aligned
--------------------------------------------------------------------------
All ruler parameters are set in pixel units. This way double conversions
and rounding errors are avoided and the ruler displays the margins
at their actual position in the document. Because of this, the application can,
for example in tables, do its own roundings and the positions on the ruler will
still match those in the document. However, for the ruler to know how the
document is displayed on the screen, some additional values have to be configured
SetWinPos() sets the offset of the ruler's edit window. In doing so,
the width of the window can also be configured. If there is a 0 among the
values passed to the function, the position/width is automatically set to
the width of the ruler.
SetPagePos() sets the offset of the page relative to the edit window and the
width of the page. If there is a 0 among the values passed to the function,
the position/width is automatically set as if the page filled the whole edit window.
SetBorderPos() sets the offset of the border. The position is relative to
the upper/left margin of the window. This is needed when there are a horizontal
and a vertical ruler visible at the same time. Example:
aHRuler.SetBorderPos( aVRuler.GetSizePixel().Width()-1 );
SetNullOffset() sets the origin relative to the page.
All the other values (margins, indentation, tabs, ...) refer to the origin,
which is set with SetNullOffset().
The values are computed as described below:
- WinPos (if both windows have the same parent)
Point aHRulerPos = aHRuler.GetPosPixel();
Point aEditWinPos = aEditWin.GetPosPixel();
aHRuler.SetWinPos( aEditWinPos().X() - aHRulerPos.X() );
- PagePos
Point aPagePos = aEditWin.LogicToPixel( aEditWin.GetPagePos() );
aHRuler.SetPagePos( aPagePos().X() );
- All other values
Add the logical values, recompute as position and subtract the
previously saved pixel positions (of PagePos and Null Offset).
--------------------------------------------------------------------------
SetUnit() and SetZoom() configure which unit is used to display
the values on the ruler. The following units are accepted:
FieldUnit::MM
FieldUnit::CM (Default)
FieldUnit::M
FieldUnit::KM
FieldUnit::INCH
FieldUnit::FOOT
FieldUnit::MILE
FieldUnit::POINT
FieldUnit::PICA
--------------------------------------------------------------------------
SetMargin1() sets the upper/left margin and SetMargin2() sets the
bottom/right margin. If these methods are called without arguments,
no margins are displayed. Otherwise, the following arguments can be passed:
long nPos - offset in pixels relative to the origin
sal_uInt16 nStyle - bit style:
RULER_MARGIN_SIZEABLE
margin size can be changed
The following bits can be set in addition
to these styles:
RULER_STYLE_INVISIBLE
SetBorders() sets an array of margins. To do this, an array of type RulerBorder
has to be passed. In the array, the following values have to be initialized:
long nPos - offset in pixels relative to the origin
long nWidth - column spacing in pixels (can also be 0, for example,
for table columns)
sal_uInt16 nStyle - bit style:
RulerBorderStyle::Sizeable
Column spacing can be changed. This flag should
only be set if the size of the spacing is changed,
not that of a cell.
RulerBorderStyle::Moveable
Column spacing/border can be moved. Whenever
table borders are to be moved, this flag should
be set instead of SIZEABLE (SIZEABLE indicates
that the size of a spacing, not that of a single
cell can be changed).
RulerBorderStyle::Variable
Not all of the column spacings are equal
RulerBorderStyle::Table
Table border. Whenever this style is set, the column
width must be 0.
RulerBorderStyle::Snap
Auxiliary line. Whenever this style is set, the
column width must be 0.
RulerBorderStyle::Margin
Margin. Whenever this style is set, the column
width must be 0.
The following bits can be set in addition
to these styles:
RULER_STYLE_INVISIBLE
SetIndents() sets an array of indents. This method may only be used for horizontal
rulers. A Ruler Indent must be passed as an argument, with the following values
initialized:
long nPos - offset relative to the origin in pixels
sal_uInt16 nStyle - bit style:
RulerIndentStyle::Top (indent of the first line)
RulerIndentStyle::Bottom (left/right indent)
RulerIndentStyle::Border (Vertical line that shows the border distance)
The following bits can be set in addition
to these styles:
RULER_STYLE_DONTKNOW (for old position or for
ambiguity)
RULER_STYLE_INVISIBLE
SetTabs() sets an array of tabs. This method may only be used for horizontal rulers.
An array of type RulerTab must be passed as an argument, with the following values
initialized:
long nPos - offset relative to the origin in pixels
sal_uInt16 nStyle - bit style:
RULER_TAB_DEFAULT (can't be selected)
RULER_TAB_LEFT
RULER_TAB_CENTER
RULER_TAB_RIGHT
RULER_TAB_DECIMAL
The following bits can be set in addition
to these styles:
RULER_STYLE_DONTKNOW (for old position of for
ambiguity)
RULER_STYLE_INVISIBLE
SetLines() displays position lines in the ruler. An array of type RulerLine must be passed, with
the following values initialized:
long nPos - offset relative to the origin in pixels
sal_uInt16 nStyle - bit style (has to be 0 currently)
--------------------------------------------------------------------------
If the user should also be able to change the margins tabs, borders, ...
in the ruler, a bit more effort is necessary. In this case, the StartDrag(),
Drag() and EndDrag() methods have to be overridden. For the StartDrag() method
it is possible to prevent dragging by returning FALSE. In the drag handler,
the drag position must be queried and the values must be moved to the new
position. This is done by calling the particular Set methods. While in the
drag handler, the values are just cached and only afterward the ruler is redrawn.
All the handlers can also be set as links with the particular Set..Hdl() methods.
- StartDrag()
Is called when dragging is started. If FALSE is returned, the dragging.
won't be executed. If TRUE is returned, the dragging will be permitted.
If the handler isn't overridden, FALSE will be returned.
- EndDrag()
Is called at the end of dragging.
- Drag()
Is called when dragging takes place.
- Click()
This handler is called when no element has been clicked on.
The position can be queried with GetClickPos(). This way it is possible
to, for example, ser tabs in the ruler. After calling the click handler,
the drag, if any, is immediately triggered. This makes it possible to
set a new tab in the click handler and then immediately move it.
- DoubleClick()
This handler is called when a double-click has been performed outside
the special panel. The methods GetClickType(), GetClickAryPos() and
GetClickPos() can be used to query what has been clicked on.
This way you can, for example, show the tab dialog when a double-click
is performed on a tab.
In the drag handler it is possible to query what has been dragged and where
it has been dragged. There are the following query methods:
- GetDragType()
Returns what has been dragged.
RulerType::Margin1
RulerType::Margin2
RulerType::Border
RulerType::Indent
RulerType::Tab
- GetDragPos()
Returns the pixel position to which the user has moved the mouse
relative to the set zero-offset.
- GetDragAryPos()
Returns the index in the array if a border, an indent or a tab
is being dragged. Attention: During a drag process, the array position
of the item that has been set before the drag is returned.
Therefore, it is for example also possible, to no longer show a tab
if the mouse is dragged out of the ruler in bottom/right direction.
- GetDragSize()
If Borders are dragged, this can be used to query whether the size
resp. which side or the position should be changed.
RulerDragSize::Move or 0 - Move
RulerDragSize::N1 - left/upper border
RulerDragSize::N2 - right/bottom border
- IsDragDelete()
This method can be used to query whether the mouse has been
moved out of the window at the bottom/right while dragging.
By this, it can for example be determined whether the user
wants to delete a tab.
- IsDragCanceled()
Using this Handler, it can be queried in the EndDrag handler
whether the action was canceled by the user releasing the
mouse at the top/left of the window or by pressing ESC.
In this case, the values are not applied. If during the
dragging, the mouse is dragged out of the window at the
top/left, the old values are displayed automatically without
the Drag handler being called.
But if the user has moved the value to the old position, the
method returns 'false' nevertheless.
If this should be avoided, the application must remember the
old value in the StartDrag handler and compare the value in the
EndDrag handler.
- GetDragModifier()
Returns the modifier keys that were pressed when the Drag process
was started. See MouseEvent.
- GetClickPos()
Returns the pixel position at which the user has pressed the mouse
with respect to the configured null-offset.
- GetClickType()
Returns what is applied by double click:
RulerType::DontKnow (no element in the ruler area)
RulerType::Outside (outside of the ruler area)
RulerType::Margin1 (only Margin1 border)
RulerType::Margin2 (only Margin2 border)
RulerType::Border (Border: GetClickAryPos())
RulerType::Indent (indent: GetClickAryPos())
RulerType::Tab (Tab: GetClickAryPos())
- GetClickAryPos()
Returns the index in the array if a Border, an Indent or a Tab
is applied via DoubleClick.
- GetType()
This method can be used to carry out a HitTest,
in order to possibly also apply sth to an Item using the right
mouse button by catching the MouseButtonDown handler. As
parameters, the window position and possibly a pointer to a
sal_uInt16 are passed, in order to determine the array position
of a Tab, an Indent, or a Border. The following values are
returned as type:
RulerType::DontKnow (no element in the ruler area)
RulerType::Outside (outside of the ruler area)
RulerType::Margin1 (only Margin1 border)
RulerType::Margin2 (only Margin2 border)
RulerType::Border (Border: GetClickAryPos())
RulerType::Indent (indent: GetClickAryPos())
RulerType::Tab (Tab: GetClickAryPos())
If the drag process should be canceled, this can be done using CancelDrag().
There are the following methods for controlling the Drag:
- IsDrag()
Returns 'true' if the ruler is in a drag process.
- CancelDrag()
Cancels the drag process, if one is being carried out. During this,
the old values are restored and the Drag and the EndDrag handlers
are called.
In order to trigger a Drag from the document, there are the following
methods:
- StartDocDrag()
This method is passed the MouseEvent of the document window
and what should be dragged. If RulerType::DontKnow is passed
as DragType, the ruler decides what should be dragged. In case
of the other types, the Drag is only started if a respective
element was found at the given position.
This is for example necessary if indents and columns are located
at the same X position.
The return value indicates whether the Drag has been triggered.
If a Drag is triggered, the ruler takes over the normal drag
control and behaves as if the ruler had been clicked directly.
Thus, the ruler captures the mouse and also takes over control
of the Cancel (via keyboard, or if the mouse is moved outside
of the ruler above it or left of it). All handlers are called,
too (including the StartDrag handler). If a MouseEvent with
ClickCount 2 is passed, the DoubleClick handler is also called,
respectively.
--------------------------------------------------------------------------
For the extra field, the content can be determined and there are handlers
that can be used to handle specific actions.
- ExtraDown()
This handler is called when the mouse is pressed in the extra field.
- SetExtraType()
With this method, it can be defined what should be displayed in
the extra field.
- ExtraType what should be displayed in the extra field
RulerExtra::DontKnow (nothing)
RulerExtra::NullOffset (coordinate axes)
RulerExtra::Tab (Tab)
- sal_uInt16 nStyle bit field as style:
RULER_STYLE_HIGHLIGHT (selected)
RULER_TAB_... (a Tab style)
- GetExtraClick()
Returns the number of mouse clicks. By this, it is for example
also possible to trigger an action by a DoubleClick in the
extra field.
- GetExtraModifier()
Returns the modifier keys that were pressed when the extra field
was clicked. See MouseEvent.
--------------------------------------------------------------------------
Further helper functions:
- static Ruler::DrawTab()
With this method, a Tab can be output on an OutputDevice.
By this, it is also possible to show the Tabs in dialogs like
they are drawn in the ruler.
This method outputs the Tab centred at the given position. The size
of the tabs can be defined by the defines RULER_TAB_WIDTH and
RULER_TAB_HEIGHT.
--------------------------------------------------------------------------
Tips for the use of the ruler:
- For the ruler, neither in the Drag mode nor elsewhere, the setting
of the values must be bracketed in SetUpdateMode(). The ruler itself
takes care that, if multiple values are set, they are automatically
grouped together and output flicker-free.
- Initially, the sizes, positions and values should be set first for the
ruler, before it is displayed. This is important because otherwise
many values are calculated unnecessarily.
- When the document window, in which the ruler resides, becomes active
resp. unactive, the methods Activate() and Deactivate() should be
called by the ruler. That is so because the display is switched according
to the settings and the system.
- For example, while dragging Tabs and Indents, the old positions should
also be shown if possible. For that, while setting the Tabs and Indents,
the old positions should be inserted first into the array in addition
and be linked with the style RULER_STYLE_DONTKNOW. After that, the
remaining values should be set in the array.
- In case of multiple selected paragraphs and table cells, the Tabs and
Indents should be displayed in grey in front of the first cell resp.
the first paragraph. This can also be achieved by the style
RULER_STYLE_DONTKNOW.
- The measuring arrow should always be shown when the Alt key (WW-Like)
is pressed during the drag. Maybe, this setting should be configurable
always and possibly the measuring arrows always be shown while
dragging. For all settings, the values should always be rounded to the
multiple of one value because the screen resolution is very imprecise.
- DoubleClicks should be handled in the following way (GetClickType()):
- RulerType::DontKnow
RulerType::Margin1
RulerType::Margin2
If the conditions GetClickPos() <= GetMargin1() or
GetClickPos() >= GetMargin2() are met or the type is equal to
RulerType::Margin1 or RulerType::Margin2, a side dialog should
be displayed in which the focus is at the respective border.
- RulerType::Border
A column or table dialog should be shown in which the focus
is at the respective column that can be queried using
GetClickAryPos().
- RulerType::Indent
The dialog, in which the indents can be configured, should be
shown. In this, the focus should be on the indent which can
be queried using GetClickAryPos().
- RulerType::Tab
A TabDialog should be displayed in which the Tab, that can be
queried using GetClickAryPos(), should be selected.
*************************************************************************/
constexpr WinBits WB_EXTRAFIELD = 0x00004000;
constexpr WinBits WB_RIGHT_ALIGNED = 0x00008000;
constexpr auto WB_STDRULER = WB_HORZ;
enum class RulerType { DontKnow, Outside,
Margin1, Margin2,
Border, Indent, Tab };
enum class RulerExtra { DontKnow, NullOffset, Tab };
constexpr sal_uInt16 RULER_STYLE_HIGHLIGHT = 0x8000;
constexpr sal_uInt16 RULER_STYLE_DONTKNOW = 0x4000;
constexpr sal_uInt16 RULER_STYLE_INVISIBLE = 0x2000;
enum class RulerDragSize {
Move,
N1,
N2
};
constexpr auto RULER_MOUSE_BORDERMOVE = 5;
constexpr auto RULER_MOUSE_BORDERWIDTH = 5;
constexpr auto RULER_MOUSE_MARGINWIDTH = 3;
enum class RulerMarginStyle {
NONE = 0x0000,
Sizeable = 0x0001,
Invisible = 0x0002
};
namespace o3tl {
template<> struct typed_flags<RulerMarginStyle> : is_typed_flags<RulerMarginStyle, 0x0003> {};
}
enum class RulerBorderStyle {
Sizeable = 0x0001,
Moveable = 0x0002,
Variable = 0x0004,
Invisible = 0x0008
};
namespace o3tl {
template<> struct typed_flags<RulerBorderStyle> : is_typed_flags<RulerBorderStyle, 0x000f> {};
}
struct RulerBorder
{
tools::Long nPos;
tools::Long nWidth;
RulerBorderStyle nStyle;
tools::Long nMinPos; //minimum/maximum position, supported for table borders/rows
tools::Long nMaxPos;
};
enum class RulerIndentStyle {
Top, Bottom
};
struct RulerIndent
{
tools::Long nPos;
RulerIndentStyle nStyle;
bool bInvisible;
};
constexpr sal_uInt16 RULER_TAB_LEFT = 0x0000;
constexpr sal_uInt16 RULER_TAB_RIGHT = 0x0001;
constexpr sal_uInt16 RULER_TAB_CENTER = 0x0002;
constexpr sal_uInt16 RULER_TAB_DECIMAL = 0x0003;
constexpr sal_uInt16 RULER_TAB_DEFAULT = 0x0004;
constexpr sal_uInt16 RULER_TAB_STYLE = 0x000F;
constexpr sal_uInt16 RULER_TAB_RTL = 0x0010;
struct RulerTab
{
tools::Long nPos;
sal_uInt16 nStyle;
};
struct RulerLine
{
tools::Long nPos;
};
struct RulerSelection
{
tools::Long nPos;
RulerType eType;
sal_uInt16 nAryPos;
RulerDragSize mnDragSize;
bool bSize;
bool bSizeBar;
bool bExpandTest;
RulerSelection()
: nPos(0)
, eType(RulerType::DontKnow)
, nAryPos(0)
, mnDragSize(RulerDragSize::Move)
, bSize(false)
, bSizeBar(false)
, bExpandTest( false )
{}
};
struct RulerUnitData
{
MapUnit eMapUnit; // MAP_UNIT for calculation
tools::Long nTickUnit; // Unit divider
double nTick1; // Minimal step
double nTick2; // Tick quarter unit
double nTick3; // Tick half unit
double nTick4; // Tick whole unit
char aUnitStr[8]; // Unit string
};
// Data for drawing ruler tabstops
struct RulerTabData
{
sal_uInt16 DPIScaleFactor;
sal_uInt16 width;
sal_uInt16 height;
sal_uInt16 height2;
sal_uInt16 width2;
sal_uInt16 cwidth;
sal_uInt16 cwidth2;
sal_uInt16 cwidth3;
sal_uInt16 cwidth4;
sal_uInt16 dheight;
sal_uInt16 dheight2;
sal_uInt16 dwidth;
sal_uInt16 dwidth2;
sal_uInt16 dwidth3;
sal_uInt16 dwidth4;
sal_uInt16 textoff;
};
class ImplRulerData;
class SVT_DLLPUBLIC Ruler : public vcl::Window
{
private:
ScopedVclPtr<VirtualDevice> maVirDev;
MapMode maMapMode;
tools::Long mnBorderOff;
tools::Long mnWinOff;
tools::Long mnWinWidth;
tools::Long mnWidth;
tools::Long mnHeight;
tools::Long mnVirOff;
tools::Long mnVirWidth;
tools::Long mnVirHeight;
tools::Long mnBorderWidth;
tools::Long mnStartDragPos;
tools::Long mnDragPos;
std::unique_ptr<ImplRulerData> mpSaveData;
ImplRulerData* mpData;
std::unique_ptr<ImplRulerData> mpDragData;
tools::Rectangle maExtraRect;
WinBits mnWinStyle;
sal_uInt16 mnUnitIndex;
sal_uInt16 mnDragAryPos;
RulerDragSize mnDragSize;
sal_uInt16 mnDragModifier;
sal_uInt16 mnExtraStyle;
tools::Long mnCharWidth;
tools::Long mnLineHeight;
RulerExtra meExtraType;
RulerType meDragType;
FieldUnit meUnit;
Fraction maZoom;
bool mbCalc;
bool mbFormat;
bool mbDrag;
bool mbDragDelete;
bool mbDragCanceled;
bool mbAutoWinWidth;
bool mbActive;
sal_uInt8 mnUpdateFlags;
RulerSelection maHoverSelection;
Link<Ruler*,void> maDoubleClickHdl;
std::unique_ptr<RulerSelection> mxCurrentHitTest;
std::unique_ptr<RulerSelection> mxPreviousHitTest;
rtl::Reference<SvtRulerAccessible> mxAccContext;
std::map<OUString, SalLayoutGlyphs> maTextGlyphs;
SVT_DLLPRIVATE void ImplVDrawLine(vcl::RenderContext& rRenderContext, tools::Long nX1, tools::Long nY1, tools::Long nX2, tools::Long nY2 );
SVT_DLLPRIVATE void ImplVDrawRect(vcl::RenderContext& rRenderContext, tools::Long nX1, tools::Long nY1, tools::Long nX2, tools::Long nY2 );
SVT_DLLPRIVATE void ImplVDrawText(vcl::RenderContext& rRenderContext, tools::Long nX, tools::Long nY, const OUString& rText,
tools::Long nMin = LONG_MIN, tools::Long nMax = LONG_MAX );
SVT_DLLPRIVATE void ImplDrawTicks(vcl::RenderContext& rRenderContext,
tools::Long nMin, tools::Long nMax, tools::Long nStart, tools::Long nVirTop, tools::Long nVirBottom);
SVT_DLLPRIVATE void ImplDrawBorders(vcl::RenderContext& rRenderContext,
tools::Long nMin, tools::Long nMax, tools::Long nVirTop, tools::Long nVirBottom);
SVT_DLLPRIVATE static void ImplDrawIndent(vcl::RenderContext& rRenderContext,
const tools::Polygon& rPoly, bool bIsHit);
SVT_DLLPRIVATE void ImplDrawIndents(vcl::RenderContext& rRenderContext,
tools::Long nMin, tools::Long nMax, tools::Long nVirTop, tools::Long nVirBottom);
SVT_DLLPRIVATE void ImplDrawTab(vcl::RenderContext& rRenderContext, const Point& rPos, sal_uInt16 nStyle);
SVT_DLLPRIVATE void ImplDrawTabs(vcl::RenderContext& rRenderContext,
tools::Long nMin, tools::Long nMax, tools::Long nVirTop, tools::Long nVirBottom);
using Window::ImplInit;
SVT_DLLPRIVATE void ImplInit( WinBits nWinBits );
SVT_DLLPRIVATE void ImplInitSettings( bool bFont, bool bForeground, bool bBackground );
SVT_DLLPRIVATE void ImplCalc();
SVT_DLLPRIVATE void ImplFormat(vcl::RenderContext const & rRenderContext);
SVT_DLLPRIVATE void ImplInitExtraField( bool bUpdate );
SVT_DLLPRIVATE void ImplInvertLines(vcl::RenderContext& rRenderContext);
SVT_DLLPRIVATE void ImplDraw(vcl::RenderContext& rRenderContext);
SVT_DLLPRIVATE void ImplDrawExtra(vcl::RenderContext& rRenderContext);
SVT_DLLPRIVATE void ImplUpdate( bool bMustCalc = false );
virtual void ApplySettings(vcl::RenderContext& rRenderContext) override;
SVT_DLLPRIVATE bool ImplDoHitTest( const Point& rPosition,
RulerSelection* pHitTest,
bool bRequiredStyle = false,
RulerIndentStyle nRequiredStyle = RulerIndentStyle::Top ) const;
SVT_DLLPRIVATE bool ImplDocHitTest( const Point& rPos, RulerType eDragType, RulerSelection* pHitTest ) const;
SVT_DLLPRIVATE bool ImplStartDrag( RulerSelection const * pHitTest, sal_uInt16 nModifier );
SVT_DLLPRIVATE void ImplDrag( const Point& rPos );
SVT_DLLPRIVATE void ImplEndDrag();
Ruler (const Ruler &) = delete;
Ruler& operator= (const Ruler &) = delete;
protected:
tools::Long GetRulerVirHeight() const { return mnVirHeight;}
const MapMode& GetCurrentMapMode() const { return maMapMode; }
const RulerUnitData& GetCurrentRulerUnit() const;
public:
Ruler( vcl::Window* pParent, WinBits nWinStyle = WB_STDRULER );
virtual ~Ruler() override;
virtual void dispose() override;
virtual void MouseButtonDown( const MouseEvent& rMEvt ) override;
virtual void MouseMove( const MouseEvent& rMEvt ) override;
virtual void Tracking( const TrackingEvent& rTEvt ) override;
virtual void Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect) override;
virtual void Resize() override;
virtual void StateChanged( StateChangedType nStateChange ) override;
virtual void DataChanged( const DataChangedEvent& rDCEvt ) override;
virtual bool StartDrag();
virtual void Drag();
virtual void EndDrag();
virtual void Click();
void DoubleClick();
virtual void ExtraDown();
void Activate() override;
void Deactivate() override;
void SetWinPos( tools::Long nOff, tools::Long nWidth = 0 );
tools::Long GetWinOffset() const { return mnWinOff; }
void SetPagePos( tools::Long nOff = 0, tools::Long nWidth = 0 );
tools::Long GetPageOffset() const;
void SetBorderPos( tools::Long nOff = 0 );
tools::Long GetBorderOffset() const { return mnBorderOff; }
const tools::Rectangle& GetExtraRect() const { return maExtraRect; }
void SetUnit( FieldUnit eNewUnit );
FieldUnit GetUnit() const { return meUnit; }
void SetZoom( const Fraction& rNewZoom );
void SetExtraType( RulerExtra eNewExtraType, sal_uInt16 nStyle = 0 );
bool StartDocDrag( const MouseEvent& rMEvt,
RulerType eDragType );
RulerType GetDragType() const { return meDragType; }
tools::Long GetDragPos() const { return mnDragPos; }
sal_uInt16 GetDragAryPos() const { return mnDragAryPos; }
RulerDragSize GetDragSize() const { return mnDragSize; }
bool IsDragDelete() const { return mbDragDelete; }
bool IsDragCanceled() const { return mbDragCanceled; }
sal_uInt16 GetDragModifier() const { return mnDragModifier; }
bool IsDrag() const { return mbDrag; }
void CancelDrag();
tools::Long GetClickPos() const { return mnDragPos; }
RulerType GetClickType() const { return meDragType; }
const RulerSelection& GetHoverSelection() const { return maHoverSelection; }
RulerType GetRulerType( const Point& rPos, sal_uInt16* pAryPos = nullptr );
void SetNullOffset( tools::Long nPos );
tools::Long GetNullOffset() const;
void SetMargin1() { SetMargin1( 0, RulerMarginStyle::Invisible ); }
void SetMargin1( tools::Long nPos, RulerMarginStyle nMarginStyle = RulerMarginStyle::Sizeable );
tools::Long GetMargin1() const;
void SetMargin2() { SetMargin2( 0, RulerMarginStyle::Invisible ); }
void SetMargin2( tools::Long nPos, RulerMarginStyle nMarginStyle = RulerMarginStyle::Sizeable );
tools::Long GetMargin2() const;
void SetLeftFrameMargin( tools::Long nPos );
void SetRightFrameMargin( tools::Long nPos );
void SetLines( sal_uInt32 n = 0, const RulerLine* pLineAry = nullptr );
void SetBorders( sal_uInt32 n = 0, const RulerBorder* pBrdAry = nullptr );
void SetIndents( sal_uInt32 n = 0, const RulerIndent* pIndentAry = nullptr );
void SetTabs( sal_uInt32 n = 0, const RulerTab* pTabAry = nullptr );
const std::vector<RulerTab>& GetTabs() const;
static void DrawTab(vcl::RenderContext& rRenderContext, const Color &rFillColor,
const Point& rPos, sal_uInt16 nStyle);
void SetStyle( WinBits nStyle );
WinBits GetStyle() const { return mnWinStyle; }
void SetDoubleClickHdl( const Link<Ruler*,void>& rLink ) { maDoubleClickHdl = rLink; }
void SetTextRTL(bool bRTL);
bool GetTextRTL() const;
void SetCharWidth( tools::Long nWidth ) { mnCharWidth = nWidth ; }
void SetLineHeight( tools::Long nHeight ) { mnLineHeight = nHeight ; }
void DrawTicks();
virtual css::uno::Reference< css::accessibility::XAccessible > CreateAccessible() override;
};
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */