Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 : #ifndef INCLUDED_SVX_RULER_HXX
20 : #define INCLUDED_SVX_RULER_HXX
21 :
22 : #include <vcl/menu.hxx>
23 : #include <svtools/ruler.hxx>
24 : #include <svl/lstner.hxx>
25 : #include <svx/svxdllapi.h>
26 : #include <o3tl/typed_flags_set.hxx>
27 :
28 : #include <boost/scoped_array.hpp>
29 : #include <memory>
30 :
31 : class SvxProtectItem;
32 : class SvxRulerItem;
33 : class SfxBindings;
34 : class SvxLongLRSpaceItem;
35 : class SvxLongULSpaceItem;
36 : class SvxTabStopItem;
37 : class SvxLRSpaceItem;
38 : class SvxPagePosSizeItem;
39 : class SvxColumnItem;
40 : class SfxRectangleItem;
41 : class SvxObjectItem;
42 : class SfxBoolItem;
43 : struct SvxRuler_Impl;
44 :
45 : enum class SvxRulerDragFlags
46 : {
47 : NONE = 0x00,
48 : OBJECT = 0x01,
49 : // reduce size of the last column, shift
50 : OBJECT_SIZE_LINEAR = 0x02,
51 : OBJECT_SIZE_PROPORTIONAL = 0x04, // proportional, Ctrl
52 : // only current line (table; Shift-Ctrl)
53 : OBJECT_ACTLINE_ONLY = 0x08,
54 : // currently same key assignment
55 : OBJECT_LEFT_INDENT_ONLY = OBJECT_SIZE_PROPORTIONAL,
56 : };
57 : namespace o3tl
58 : {
59 : template<> struct typed_flags<SvxRulerDragFlags> : is_typed_flags<SvxRulerDragFlags, 0x0f> {};
60 : }
61 :
62 : enum class SvxRulerSupportFlags
63 : {
64 : TABS = 0x0001,
65 : PARAGRAPH_MARGINS = 0x0002,
66 : BORDERS = 0x0004,
67 : OBJECT = 0x0008,
68 : SET_NULLOFFSET = 0x0010,
69 : NEGATIVE_MARGINS = 0x0020,
70 : PARAGRAPH_MARGINS_VERTICAL = 0x0040,
71 : REDUCED_METRIC = 0x0080, //shorten the context menu to select metric
72 : };
73 : namespace o3tl
74 : {
75 : template<> struct typed_flags<SvxRulerSupportFlags> : is_typed_flags<SvxRulerSupportFlags, 0x00ff> {};
76 : }
77 :
78 : class SVX_DLLPUBLIC SvxRuler: public Ruler, public SfxListener
79 : {
80 : friend class SvxRulerItem;
81 : using Window::Notify;
82 :
83 : std::vector<std::unique_ptr<SvxRulerItem> > pCtrlItems;
84 :
85 : std::unique_ptr<SvxLongLRSpaceItem> mxLRSpaceItem; // left and right edge
86 : std::unique_ptr<SfxRectangleItem> mxMinMaxItem; // maxima for dragging
87 : std::unique_ptr<SvxLongULSpaceItem> mxULSpaceItem; // upper and lower edge
88 : std::unique_ptr<SvxTabStopItem> mxTabStopItem; // tab stops
89 : std::unique_ptr<SvxLRSpaceItem> mxParaItem; // paragraphs
90 : std::unique_ptr<SvxLRSpaceItem> mxParaBorderItem; // border distance
91 : std::unique_ptr<SvxPagePosSizeItem> mxPagePosItem; // page distance to the rule
92 : std::unique_ptr<SvxColumnItem> mxColumnItem; // columns
93 : std::unique_ptr<SvxObjectItem> mxObjectItem; // object
94 :
95 : VclPtr<vcl::Window> pEditWin;
96 :
97 : std::unique_ptr<SvxRuler_Impl> mxRulerImpl;
98 :
99 : bool bAppSetNullOffset :1;
100 : bool bHorz :1;
101 : long lLogicNullOffset; // in logic coordinates
102 : long lAppNullOffset; // in logic coordinates
103 : long lMinFrame; // minimal frame width in pixels
104 : long lInitialDragPos;
105 : SvxRulerSupportFlags nFlags;
106 : SvxRulerDragFlags nDragType;
107 : sal_uInt16 nDefTabType;
108 : sal_uInt16 nTabCount;
109 : sal_uInt16 nTabBufSize;
110 : long lDefTabDist;
111 : long lTabPos;
112 :
113 : std::vector<RulerTab> mpTabs; // tab positions in pixel
114 : std::vector<RulerIndent> mpIndents; // paragraph margins in pixel
115 : std::vector<RulerBorder> mpBorders;
116 : std::vector<RulerBorder> mpObjectBorders;
117 :
118 : SfxBindings* pBindings;
119 : long nDragOffset;
120 : long nMaxLeft;
121 : long nMaxRight;
122 : bool bValid;
123 : bool bListening;
124 : bool bActive;
125 :
126 : bool mbCoarseSnapping;
127 : bool mbSnapping;
128 :
129 : void StartListening_Impl();
130 : long GetCorrectedDragPos(bool bLeft = true, bool bRight = true );
131 : void DrawLine_Impl(long &lTabPos, int, bool Horizontal = true);
132 : sal_uInt16 GetObjectBordersOff(sal_uInt16 nIdx) const;
133 :
134 : // page borders or surrounding frame
135 : void UpdateFrame(const SvxLongLRSpaceItem* pItem);
136 : void UpdateFrame(const SvxLongULSpaceItem* pItem);
137 : void UpdateFrameMinMax(const SfxRectangleItem* pItem);
138 : // paragraph indentations
139 : void UpdatePara(const SvxLRSpaceItem* pItem);
140 : // Border distance
141 : void UpdateParaBorder(const SvxLRSpaceItem* pItem);
142 : // Tabs
143 : void Update(const SvxTabStopItem* pItem);
144 : // page position and width
145 : void Update(const SvxPagePosSizeItem* pItem);
146 : // columns
147 : void Update(const SvxColumnItem* pItem, sal_uInt16 nSID);
148 : // object selection
149 : void Update(const SvxObjectItem* pItem);
150 : // protect
151 : void Update(const SvxProtectItem* pItem );
152 : // left-to-right text
153 : void UpdateTextRTL(const SfxBoolItem* pItem);
154 : // paragraph indentations
155 : void UpdatePara();
156 : void UpdateTabs();
157 : void UpdatePage();
158 : void UpdateFrame();
159 : void UpdateColumns();
160 : void UpdateObject();
161 :
162 : // Convert position to stick to ruler ticks
163 : long MakePositionSticky(long rValue, long aPointOfReference, bool aSnapToFrameMargin = true) const;
164 :
165 : long PixelHAdjust(long lPos, long lPos2) const;
166 : long PixelVAdjust(long lPos, long lPos2) const;
167 : long PixelAdjust(long lPos, long lPos2) const;
168 :
169 : long ConvertHPosPixel(long lPos) const;
170 : long ConvertVPosPixel(long lPos) const;
171 : long ConvertHSizePixel(long lSize) const;
172 : long ConvertVSizePixel(long lSize) const;
173 :
174 : long ConvertPosPixel(long lPos) const;
175 : long ConvertSizePixel(long lSize) const;
176 :
177 : long ConvertHPosLogic(long lPos) const;
178 : long ConvertVPosLogic(long lPos) const;
179 : long ConvertHSizeLogic(long lSize) const;
180 : long ConvertVSizeLogic(long lSize) const;
181 :
182 : long ConvertPosLogic(long lPos) const;
183 : long ConvertSizeLogic(long lSize) const;
184 :
185 : long RoundToCurrentMapMode(long lValue) const;
186 :
187 : long GetFirstLineIndent() const;
188 : long GetLeftIndent() const;
189 : long GetRightIndent() const;
190 : long GetLogicRightIndent() const;
191 :
192 : long GetLeftFrameMargin() const;
193 : long GetRightFrameMargin() const;
194 :
195 : void CalcMinMax();
196 :
197 : void EvalModifier();
198 : void DragMargin1();
199 : //adjust the left margin either after DragMargin1() or after DragBorders()
200 : void AdjustMargin1(long lDiff);
201 : void DragMargin2();
202 : void DragIndents();
203 : void DragTabs();
204 : void DragBorders();
205 : void DragObjectBorder();
206 :
207 : void ApplyMargins();
208 : void ApplyIndents();
209 : void ApplyTabs();
210 : void ApplyBorders();
211 : void ApplyObject();
212 :
213 : long GetFrameLeft() const;
214 : void SetFrameLeft(long);
215 :
216 : long GetLeftMin() const;
217 : long GetRightMax() const;
218 :
219 : DECL_LINK( TabMenuSelect, Menu * );
220 : DECL_LINK( MenuSelect, Menu * );
221 : void PrepareProportional_Impl(RulerType);
222 :
223 : sal_uInt16 GetNextVisible(sal_uInt16 nColumn);
224 : sal_uInt16 GetPrevVisible(sal_uInt16 nColumn);
225 :
226 : enum UpdateType
227 : {
228 : MOVE_ALL,
229 : MOVE_LEFT,
230 : MOVE_RIGHT
231 : };
232 : void UpdateParaContents_Impl(long lDiff, UpdateType = MOVE_ALL);
233 :
234 : protected:
235 : virtual void Command( const CommandEvent& rCEvt ) SAL_OVERRIDE;
236 : virtual void Click() SAL_OVERRIDE;
237 : virtual bool StartDrag() SAL_OVERRIDE;
238 : virtual void Drag() SAL_OVERRIDE;
239 : virtual void EndDrag() SAL_OVERRIDE;
240 : virtual void ExtraDown() SAL_OVERRIDE;
241 : virtual void MouseMove( const MouseEvent& rMEvt ) SAL_OVERRIDE;
242 :
243 : virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) SAL_OVERRIDE;
244 :
245 : virtual void Update();
246 :
247 : // calculation of boundary values for object borders
248 : // values refer to the page
249 : static bool CalcLimits(long &nMax1, long &nMax2, bool bFirst);
250 : bool IsActLastColumn(
251 : bool bForceDontConsiderHidden = false,
252 : sal_uInt16 nAct=USHRT_MAX) const;
253 : bool IsActFirstColumn(
254 : bool bForceDontConsiderHidden = false,
255 : sal_uInt16 nAct=USHRT_MAX) const;
256 : sal_uInt16 GetActLeftColumn(
257 : bool bForceDontConsiderHidden = false,
258 : sal_uInt16 nAct=USHRT_MAX ) const;
259 : sal_uInt16 GetActRightColumn (
260 : bool bForceDontConsiderHidden = false,
261 : sal_uInt16 nAct=USHRT_MAX ) const;
262 : long CalcPropMaxRight(sal_uInt16 nCol = USHRT_MAX) const;
263 : long GetPageWidth() const;
264 :
265 : public:
266 :
267 : SvxRuler(vcl::Window* pParent, vcl::Window *pEditWin, SvxRulerSupportFlags nRulerFlags,
268 : SfxBindings &rBindings, WinBits nWinStyle = WB_STDRULER);
269 : virtual ~SvxRuler();
270 : virtual void dispose() SAL_OVERRIDE;
271 :
272 : void SetMinFrameSize(long lSize);
273 : long GetMinFrameSize() const ;
274 :
275 : SvxRulerSupportFlags GetRulerFlags() const
276 : {
277 : return nFlags;
278 : }
279 :
280 : void SetDefTabDist(long);
281 :
282 : // set/get NullOffset in logic units
283 : void SetNullOffsetLogic(long lOff = 0);
284 : long GetNullOffsetLogic() const
285 : {
286 : return lAppNullOffset;
287 : }
288 :
289 : void SetActive(bool bOn = true);
290 : bool IsActive() const
291 : {
292 : return bActive;
293 : }
294 :
295 56152 : void ForceUpdate()
296 : {
297 56152 : Update();
298 56152 : }
299 :
300 : //#i24363# tab stops relative to indent
301 : void SetTabsRelativeToIndent( bool bRel = true );
302 : };
303 :
304 : #endif
305 :
306 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|