xref: /aoo4110/main/svx/inc/svx/ruler.hxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski #ifndef _SVX_RULER_HXX
24*b1cdbd2cSJim Jagielski #define _SVX_RULER_HXX
25*b1cdbd2cSJim Jagielski 
26*b1cdbd2cSJim Jagielski #include <vcl/menu.hxx>
27*b1cdbd2cSJim Jagielski #include <svtools/ruler.hxx>
28*b1cdbd2cSJim Jagielski #include <svl/lstner.hxx>
29*b1cdbd2cSJim Jagielski #include "svx/svxdllapi.h"
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski class SvxProtectItem;
32*b1cdbd2cSJim Jagielski class SvxRulerItem;
33*b1cdbd2cSJim Jagielski class SfxBindings;
34*b1cdbd2cSJim Jagielski class SvxLongLRSpaceItem;
35*b1cdbd2cSJim Jagielski class SvxLongULSpaceItem;
36*b1cdbd2cSJim Jagielski class SvxTabStopItem;
37*b1cdbd2cSJim Jagielski class SvxLRSpaceItem;
38*b1cdbd2cSJim Jagielski class SvxPagePosSizeItem;
39*b1cdbd2cSJim Jagielski class SvxColumnItem;
40*b1cdbd2cSJim Jagielski class SfxRectangleItem;
41*b1cdbd2cSJim Jagielski class SvxObjectItem;
42*b1cdbd2cSJim Jagielski class SfxBoolItem;
43*b1cdbd2cSJim Jagielski struct SvxRuler_Impl;
44*b1cdbd2cSJim Jagielski 
45*b1cdbd2cSJim Jagielski class SVX_DLLPUBLIC SvxRuler: public Ruler, public SfxListener
46*b1cdbd2cSJim Jagielski {
47*b1cdbd2cSJim Jagielski 	friend class SvxRulerItem;
48*b1cdbd2cSJim Jagielski 	using Window::Notify;
49*b1cdbd2cSJim Jagielski 
50*b1cdbd2cSJim Jagielski 	SvxRulerItem **pCtrlItem;
51*b1cdbd2cSJim Jagielski 	SvxLongLRSpaceItem *pLRSpaceItem;  //Linker und Rechter Rand
52*b1cdbd2cSJim Jagielski 	SfxRectangleItem *pMinMaxItem; //Maxima fuers Draggen
53*b1cdbd2cSJim Jagielski 	SvxLongULSpaceItem *pULSpaceItem;  //Oberer und Unterer Rand
54*b1cdbd2cSJim Jagielski 	SvxTabStopItem *pTabStopItem;  //Tabstops
55*b1cdbd2cSJim Jagielski 	SvxLRSpaceItem *pParaItem;     //Absaetze
56*b1cdbd2cSJim Jagielski     SvxLRSpaceItem *pParaBorderItem; //Border distance
57*b1cdbd2cSJim Jagielski 	SvxPagePosSizeItem *pPagePosItem; //Seitenabstaende zum Lineal
58*b1cdbd2cSJim Jagielski 	SvxColumnItem *pColumnItem;    //Spalten
59*b1cdbd2cSJim Jagielski 	SvxObjectItem *pObjectItem;    //Objekt
60*b1cdbd2cSJim Jagielski 	Window *pEditWin;
61*b1cdbd2cSJim Jagielski 	SvxRuler_Impl *pRuler_Imp;
62*b1cdbd2cSJim Jagielski 	sal_Bool bAppSetNullOffset :1;
63*b1cdbd2cSJim Jagielski 	sal_Bool bHorz :1;
64*b1cdbd2cSJim Jagielski     long lLogicNullOffset;      // in logischen Koordinaten
65*b1cdbd2cSJim Jagielski 	long lAppNullOffset;        // in logischen Koordinaten
66*b1cdbd2cSJim Jagielski 	long lMinFrame;             // minimale Framebreite in Pixel
67*b1cdbd2cSJim Jagielski 	long lInitialDragPos;
68*b1cdbd2cSJim Jagielski 	sal_uInt16 nFlags;
69*b1cdbd2cSJim Jagielski 	enum {
70*b1cdbd2cSJim Jagielski 		NONE = 0x0000,
71*b1cdbd2cSJim Jagielski 		DRAG_OBJECT =  0x0001,
72*b1cdbd2cSJim Jagielski 		// letzte Spalte verkleinern, Shift
73*b1cdbd2cSJim Jagielski 		DRAG_OBJECT_SIZE_LINEAR = 0x0002,
74*b1cdbd2cSJim Jagielski 		DRAG_OBJECT_SIZE_PROPORTIONAL = 0x0004, // proportional, Ctrl
75*b1cdbd2cSJim Jagielski 		// nur aktuelle Zeile (Tabelle; Shift-Ctrl)
76*b1cdbd2cSJim Jagielski 		DRAG_OBJECT_ACTLINE_ONLY = 0x0008,
77*b1cdbd2cSJim Jagielski 		// aktuell gleiche Tastenbelegung
78*b1cdbd2cSJim Jagielski 		DRAG_OBJECT_LEFT_INDENT_ONLY = DRAG_OBJECT_SIZE_PROPORTIONAL
79*b1cdbd2cSJim Jagielski 		}
80*b1cdbd2cSJim Jagielski 	nDragType;
81*b1cdbd2cSJim Jagielski 	sal_uInt16 nDefTabType;
82*b1cdbd2cSJim Jagielski 	sal_uInt16 nTabCount;
83*b1cdbd2cSJim Jagielski 	sal_uInt16 nTabBufSize;
84*b1cdbd2cSJim Jagielski 	long lDefTabDist;
85*b1cdbd2cSJim Jagielski 	long lTabPos;
86*b1cdbd2cSJim Jagielski 	RulerTab *pTabs;            // Tabpositionen in Pixel
87*b1cdbd2cSJim Jagielski 	RulerIndent *pIndents;      // Absatzraender in Pixel
88*b1cdbd2cSJim Jagielski 	RulerBorder *pBorders;
89*b1cdbd2cSJim Jagielski 	sal_uInt16 nBorderCount;
90*b1cdbd2cSJim Jagielski 	RulerBorder *pObjectBorders;
91*b1cdbd2cSJim Jagielski 	SfxBindings *pBindings;
92*b1cdbd2cSJim Jagielski 	long nDragOffset;
93*b1cdbd2cSJim Jagielski 	long nMaxLeft;
94*b1cdbd2cSJim Jagielski 	long nMaxRight;
95*b1cdbd2cSJim Jagielski 	sal_Bool bValid;
96*b1cdbd2cSJim Jagielski 	sal_Bool bListening;
97*b1cdbd2cSJim Jagielski 	sal_Bool bActive;
98*b1cdbd2cSJim Jagielski //#if 0 // _SOLAR__PRIVATE
99*b1cdbd2cSJim Jagielski     void StartListening_Impl();
100*b1cdbd2cSJim Jagielski 	long GetCorrectedDragPos( sal_Bool bLeft = sal_True, sal_Bool bRight = sal_True );
101*b1cdbd2cSJim Jagielski 	void DrawLine_Impl(long &lTabPos, int, sal_Bool Hori=sal_True);
102*b1cdbd2cSJim Jagielski 	sal_uInt16 GetObjectBordersOff(sal_uInt16 nIdx) const;
103*b1cdbd2cSJim Jagielski 
104*b1cdbd2cSJim Jagielski 	// Seitenr"ander oder umgebender Rahmen
105*b1cdbd2cSJim Jagielski 	void UpdateFrame(const SvxLongLRSpaceItem *);
106*b1cdbd2cSJim Jagielski 	void UpdateFrame(const SvxLongULSpaceItem *);
107*b1cdbd2cSJim Jagielski 	void UpdateFrameMinMax(const SfxRectangleItem *);
108*b1cdbd2cSJim Jagielski 	// Absatzeinzuege
109*b1cdbd2cSJim Jagielski 	void UpdatePara(const SvxLRSpaceItem *);
110*b1cdbd2cSJim Jagielski     // Border distance
111*b1cdbd2cSJim Jagielski     void UpdateParaBorder(const SvxLRSpaceItem *);
112*b1cdbd2cSJim Jagielski     // Tabs
113*b1cdbd2cSJim Jagielski 	void Update(const SvxTabStopItem *);
114*b1cdbd2cSJim Jagielski 	// Seitenposition und -breite
115*b1cdbd2cSJim Jagielski 	void Update(const SvxPagePosSizeItem *);
116*b1cdbd2cSJim Jagielski 	// Spalten
117*b1cdbd2cSJim Jagielski     void Update(const SvxColumnItem *, sal_uInt16 nSID);
118*b1cdbd2cSJim Jagielski 	// Object Selektion
119*b1cdbd2cSJim Jagielski 	void Update(const SvxObjectItem *);
120*b1cdbd2cSJim Jagielski 	// Protect
121*b1cdbd2cSJim Jagielski 	void Update( const SvxProtectItem* );
122*b1cdbd2cSJim Jagielski     // left-to-right text
123*b1cdbd2cSJim Jagielski     void UpdateTextRTL( const SfxBoolItem* );
124*b1cdbd2cSJim Jagielski 	// Absatzeinzuege
125*b1cdbd2cSJim Jagielski 	void UpdatePara();
126*b1cdbd2cSJim Jagielski 	void UpdateTabs();
127*b1cdbd2cSJim Jagielski 	void UpdatePage();
128*b1cdbd2cSJim Jagielski 	void UpdateFrame();
129*b1cdbd2cSJim Jagielski 	void UpdateColumns();
130*b1cdbd2cSJim Jagielski 	void UpdateObject();
131*b1cdbd2cSJim Jagielski 
132*b1cdbd2cSJim Jagielski 	long PixelHAdjust(long lPos, long lPos2) const;
133*b1cdbd2cSJim Jagielski 	long PixelVAdjust(long lPos, long lPos2) const;
134*b1cdbd2cSJim Jagielski 	long PixelAdjust(long lPos, long lPos2) const;
135*b1cdbd2cSJim Jagielski 
136*b1cdbd2cSJim Jagielski 	long ConvertHPosPixel(long lPos) const;
137*b1cdbd2cSJim Jagielski 	long ConvertVPosPixel(long lPos) const;
138*b1cdbd2cSJim Jagielski 	long ConvertHSizePixel(long lSize) const;
139*b1cdbd2cSJim Jagielski 	long ConvertVSizePixel(long lSize) const;
140*b1cdbd2cSJim Jagielski 
141*b1cdbd2cSJim Jagielski 	long ConvertPosPixel(long lPos) const;
142*b1cdbd2cSJim Jagielski 	long ConvertSizePixel(long lSize) const;
143*b1cdbd2cSJim Jagielski 
144*b1cdbd2cSJim Jagielski 	long ConvertHPosLogic(long lPos) const;
145*b1cdbd2cSJim Jagielski 	long ConvertVPosLogic(long lPos) const;
146*b1cdbd2cSJim Jagielski 	long ConvertHSizeLogic(long lSize) const;
147*b1cdbd2cSJim Jagielski 	long ConvertVSizeLogic(long lSize) const;
148*b1cdbd2cSJim Jagielski 
149*b1cdbd2cSJim Jagielski 	long ConvertPosLogic(long lPos) const;
150*b1cdbd2cSJim Jagielski 	long ConvertSizeLogic(long lSize) const;
151*b1cdbd2cSJim Jagielski 
152*b1cdbd2cSJim Jagielski 	long GetFirstLineIndent() const;
153*b1cdbd2cSJim Jagielski //  long GetLogicFirstLineIndent() const;
154*b1cdbd2cSJim Jagielski 	long GetLeftIndent() const;
155*b1cdbd2cSJim Jagielski //  long GetLogicLeftIndent() const;
156*b1cdbd2cSJim Jagielski 	long GetRightIndent() const;
157*b1cdbd2cSJim Jagielski 	long GetLogicRightIndent() const;
158*b1cdbd2cSJim Jagielski 	long GetPageWidth() const;
159*b1cdbd2cSJim Jagielski 
160*b1cdbd2cSJim Jagielski 	inline long GetLeftFrameMargin() const;
161*b1cdbd2cSJim Jagielski 	long GetRightFrameMargin() const;
162*b1cdbd2cSJim Jagielski 
163*b1cdbd2cSJim Jagielski 	void CalcMinMax();
164*b1cdbd2cSJim Jagielski 
165*b1cdbd2cSJim Jagielski 	void EvalModifier();
166*b1cdbd2cSJim Jagielski 	void DragMargin1();
167*b1cdbd2cSJim Jagielski     //adjust the left margin either after DragMargin1() or after DragBorders()
168*b1cdbd2cSJim Jagielski     void AdjustMargin1(long lDiff);
169*b1cdbd2cSJim Jagielski     void DragMargin2();
170*b1cdbd2cSJim Jagielski 	void DragIndents();
171*b1cdbd2cSJim Jagielski 	void DragTabs();
172*b1cdbd2cSJim Jagielski 	void DragBorders();
173*b1cdbd2cSJim Jagielski 	void DragObjectBorder();
174*b1cdbd2cSJim Jagielski 
175*b1cdbd2cSJim Jagielski 	void ApplyMargins();
176*b1cdbd2cSJim Jagielski 	void ApplyIndents();
177*b1cdbd2cSJim Jagielski 	void ApplyTabs();
178*b1cdbd2cSJim Jagielski 	void ApplyBorders();
179*b1cdbd2cSJim Jagielski 	void ApplyObject();
180*b1cdbd2cSJim Jagielski 
181*b1cdbd2cSJim Jagielski 	long GetFrameLeft() const;
182*b1cdbd2cSJim Jagielski 	void SetFrameLeft(long);
183*b1cdbd2cSJim Jagielski 
184*b1cdbd2cSJim Jagielski 	long GetLeftMin() const;
185*b1cdbd2cSJim Jagielski 	long GetRightMax() const;
186*b1cdbd2cSJim Jagielski 
187*b1cdbd2cSJim Jagielski 	DECL_LINK( TabMenuSelect, Menu * );
188*b1cdbd2cSJim Jagielski 	DECL_LINK( MenuSelect, Menu * );
189*b1cdbd2cSJim Jagielski 	void PrepareProportional_Impl(RulerType);
190*b1cdbd2cSJim Jagielski 
191*b1cdbd2cSJim Jagielski 	sal_uInt16 GetNextVisible(sal_uInt16 nColumn);
192*b1cdbd2cSJim Jagielski 	sal_uInt16 GetPrevVisible(sal_uInt16 nColumn);
193*b1cdbd2cSJim Jagielski //#endif
194*b1cdbd2cSJim Jagielski 
195*b1cdbd2cSJim Jagielski 	void Update();
196*b1cdbd2cSJim Jagielski 
197*b1cdbd2cSJim Jagielski enum UpdateType {
198*b1cdbd2cSJim Jagielski 	MOVE_ALL,
199*b1cdbd2cSJim Jagielski 	MOVE_LEFT,
200*b1cdbd2cSJim Jagielski 	MOVE_RIGHT
201*b1cdbd2cSJim Jagielski 	};
202*b1cdbd2cSJim Jagielski 	void UpdateParaContents_Impl(long lDiff, UpdateType = MOVE_ALL);
203*b1cdbd2cSJim Jagielski protected:
204*b1cdbd2cSJim Jagielski 	virtual void    Command( const CommandEvent& rCEvt );
205*b1cdbd2cSJim Jagielski 	virtual void    Click();
206*b1cdbd2cSJim Jagielski 	virtual long    StartDrag();
207*b1cdbd2cSJim Jagielski 	virtual void    Drag();
208*b1cdbd2cSJim Jagielski 	virtual void    EndDrag();
209*b1cdbd2cSJim Jagielski 	virtual void    ExtraDown();
210*b1cdbd2cSJim Jagielski 	virtual void	MouseMove( const MouseEvent& rMEvt );
211*b1cdbd2cSJim Jagielski 
212*b1cdbd2cSJim Jagielski 	virtual void    Notify( SfxBroadcaster& rBC, const SfxHint& rHint );
213*b1cdbd2cSJim Jagielski 
214*b1cdbd2cSJim Jagielski 	// Berechnung der Grenzwerte fuer Objectgrenzen
215*b1cdbd2cSJim Jagielski 	// Werte sind bezogen auf die Seite
216*b1cdbd2cSJim Jagielski 	virtual sal_Bool    CalcLimits(long &nMax1, long &nMax2, sal_Bool bFirst) const;
217*b1cdbd2cSJim Jagielski 	sal_Bool IsActLastColumn(
218*b1cdbd2cSJim Jagielski 		sal_Bool bForceDontConsiderHidden = sal_False, sal_uInt16 nAct=USHRT_MAX) const ;
219*b1cdbd2cSJim Jagielski 	sal_Bool IsActFirstColumn(
220*b1cdbd2cSJim Jagielski 		sal_Bool bForceDontConsiderHidden = sal_False, sal_uInt16 nAct=USHRT_MAX) const;
221*b1cdbd2cSJim Jagielski 	sal_uInt16 GetActLeftColumn(
222*b1cdbd2cSJim Jagielski 		sal_Bool bForceDontConsiderHidden = sal_False, sal_uInt16 nAct=USHRT_MAX ) const;
223*b1cdbd2cSJim Jagielski 	sal_uInt16 GetActRightColumn (
224*b1cdbd2cSJim Jagielski 		sal_Bool bForceDontConsiderHidden = sal_False, sal_uInt16 nAct=USHRT_MAX ) const;
225*b1cdbd2cSJim Jagielski 	long CalcPropMaxRight(sal_uInt16 nCol=USHRT_MAX) const;
226*b1cdbd2cSJim Jagielski 
227*b1cdbd2cSJim Jagielski public:
228*b1cdbd2cSJim Jagielski #define     SVXRULER_SUPPORT_TABS                       0x0001
229*b1cdbd2cSJim Jagielski #define     SVXRULER_SUPPORT_PARAGRAPH_MARGINS          0x0002
230*b1cdbd2cSJim Jagielski #define     SVXRULER_SUPPORT_BORDERS                    0x0004
231*b1cdbd2cSJim Jagielski #define     SVXRULER_SUPPORT_OBJECT                     0x0008
232*b1cdbd2cSJim Jagielski #define     SVXRULER_SUPPORT_SET_NULLOFFSET             0x0010
233*b1cdbd2cSJim Jagielski #define     SVXRULER_SUPPORT_NEGATIVE_MARGINS           0x0020
234*b1cdbd2cSJim Jagielski #define     SVXRULER_SUPPORT_PARAGRAPH_MARGINS_VERTICAL 0x0040
235*b1cdbd2cSJim Jagielski #define     SVXRULER_SUPPORT_REDUCED_METRIC             0x0080 //shorten the context menu to select metric
236*b1cdbd2cSJim Jagielski 
237*b1cdbd2cSJim Jagielski 	SvxRuler(Window* pParent,
238*b1cdbd2cSJim Jagielski 			 Window *pEditWin,
239*b1cdbd2cSJim Jagielski 			 sal_uInt16 nRulerFlags,
240*b1cdbd2cSJim Jagielski 			 SfxBindings &rBindings,
241*b1cdbd2cSJim Jagielski 			 WinBits nWinStyle = WB_STDRULER);
242*b1cdbd2cSJim Jagielski 	~SvxRuler();
243*b1cdbd2cSJim Jagielski 
244*b1cdbd2cSJim Jagielski 	void SetMinFrameSize(long lSize);
245*b1cdbd2cSJim Jagielski 	long GetMinFrameSize() const ;
246*b1cdbd2cSJim Jagielski 
GetRulerFlags() const247*b1cdbd2cSJim Jagielski 	sal_uInt16 GetRulerFlags() const { return nFlags; }
248*b1cdbd2cSJim Jagielski 
249*b1cdbd2cSJim Jagielski 	void SetDefTabDist(long);
250*b1cdbd2cSJim Jagielski 	long GetDefTabDist() const;
251*b1cdbd2cSJim Jagielski 
252*b1cdbd2cSJim Jagielski 	// Setzen / Erfragen NullOffset in logischen Einheiten
253*b1cdbd2cSJim Jagielski 	void SetNullOffsetLogic(long lOff = 0);
GetNullOffsetLogic() const254*b1cdbd2cSJim Jagielski 	long GetNullOffsetLogic() const { return lAppNullOffset; }
255*b1cdbd2cSJim Jagielski 
256*b1cdbd2cSJim Jagielski 	void SetActive(sal_Bool bOn = sal_True);
IsActive() const257*b1cdbd2cSJim Jagielski 	sal_Bool IsActive() const { return bActive; }
258*b1cdbd2cSJim Jagielski 
ForceUpdate()259*b1cdbd2cSJim Jagielski 	void ForceUpdate() { Update(); }
260*b1cdbd2cSJim Jagielski 
261*b1cdbd2cSJim Jagielski     //#i24363# tab stops relative to indent
262*b1cdbd2cSJim Jagielski     void SetTabsRelativeToIndent( sal_Bool bRel = sal_True );
263*b1cdbd2cSJim Jagielski };
264*b1cdbd2cSJim Jagielski 
265*b1cdbd2cSJim Jagielski #endif
266*b1cdbd2cSJim Jagielski 
267