xref: /trunk/main/sc/source/ui/formdlg/privsplt.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sc.hxx"
30 
31 
32 
33 #include "privsplt.hxx"
34 
35 /*************************************************************************
36 #*  Member:     ScPrivatSplit                               Datum:13.10.97
37 #*------------------------------------------------------------------------
38 #*
39 #*  Klasse:     MD_Test
40 #*
41 #*  Funktion:   Konstruktor der Klasse ScPrivatSplit
42 #*
43 #*  Input:      ---
44 #*
45 #*  Output:     ---
46 #*
47 #************************************************************************/
48 
49 ScPrivatSplit::ScPrivatSplit( Window* pParent, const ResId& rResId,
50                              SC_SPLIT_DIRECTION eSplit):
51                         Control( pParent, rResId )
52 {
53     Point aPos=GetPosPixel();
54     nOldX=(short)aPos.X();
55     nOldY=(short)aPos.Y();
56     nNewX=(short)aPos.X();
57     nNewY=(short)aPos.Y();
58     eScSplit=eSplit;
59     aXMovingRange.Min()=nNewX;
60     aXMovingRange.Max()=nNewX;
61     aYMovingRange.Min()=nNewY;
62     aYMovingRange.Max()=nNewY;
63 
64     aWinPointer=GetPointer();
65 
66     aMovingFlag=sal_False;
67     if(eScSplit==SC_SPLIT_HORZ)
68     {
69         aWinPointer=Pointer(POINTER_HSPLIT);
70     }
71     else
72     {
73         aWinPointer=Pointer(POINTER_VSPLIT);
74     }
75     SetPointer(aWinPointer);
76 }
77 
78 
79 /*************************************************************************
80 #*  Member:     MouseButtonDown                         Datum:13.10.97
81 #*------------------------------------------------------------------------
82 #*
83 #*  Klasse:     ScPrivatSplit
84 #*
85 #*  Funktion:   Reagiert auf einen einzelnen Mouse-Event. Nach Aufruf
86 #*              werden alle Mauseingaben an dieses Control weitergeleitet.
87 #*
88 #*  Input:      ---
89 #*
90 #*  Output:     ---
91 #*
92 #************************************************************************/
93 
94 void ScPrivatSplit::MouseButtonDown( const MouseEvent& rMEvt )
95 {
96     Point aPos=LogicToPixel(rMEvt.GetPosPixel());
97 
98     nOldX=(short)aPos.X();
99     nOldY=(short)aPos.Y();
100 
101     CaptureMouse();
102 }
103 
104 /*************************************************************************
105 #*  Member:     MouseButtonUp                           Datum:13.10.97
106 #*------------------------------------------------------------------------
107 #*
108 #*  Klasse:     ScPrivatSplit
109 #*
110 #*  Funktion:   Ende einer Benutzeraktion mit der Maus. Es werden
111 #*              die aktuelle Maus- Koordinaten ermittelt und fuer
112 #*              die Verschiebung des Fensters verwendet.
113 #*
114 #*  Input:      ---
115 #*
116 #*  Output:     ---
117 #*
118 #************************************************************************/
119 
120 void ScPrivatSplit::MouseButtonUp( const MouseEvent& rMEvt )
121 {
122     ReleaseMouse();
123 
124     Point aPos=LogicToPixel(rMEvt.GetPosPixel());
125     Point a2Pos=GetPosPixel();
126     Point a3Pos=a2Pos;
127 
128     if(eScSplit==SC_SPLIT_HORZ)
129     {
130         nNewX=(short)aPos.X();
131         nDeltaX=nNewX-nOldX;
132         a2Pos.X()+=nDeltaX;
133         if(a2Pos.X()<aXMovingRange.Min())
134         {
135             nDeltaX=(short)(aXMovingRange.Min()-a3Pos.X());
136             a2Pos.X()=aXMovingRange.Min();
137         }
138         else if(a2Pos.X()>aXMovingRange.Max())
139         {
140             nDeltaX=(short)(aXMovingRange.Max()-a3Pos.X());
141             a2Pos.X()=aXMovingRange.Max();
142         }
143     }
144     else
145     {
146         nNewY=(short)aPos.Y();
147         nDeltaY=nNewY-nOldY;
148         a2Pos.Y()+=nDeltaY;
149         if(a2Pos.Y()<aYMovingRange.Min())
150         {
151             nDeltaY=(short)(aYMovingRange.Min()-a3Pos.Y());
152             a2Pos.Y()=aYMovingRange.Min();
153         }
154         else if(a2Pos.Y()>aYMovingRange.Max())
155         {
156             nDeltaY=(short)(aYMovingRange.Max()-a3Pos.Y());
157             a2Pos.Y()=aYMovingRange.Max();
158         }
159     }
160     SetPosPixel(a2Pos);
161     Invalidate();
162     Update();
163     CtrModified();
164 }
165 
166 /*************************************************************************
167 #*  Member:     MouseMove                                   Datum:13.10.97
168 #*------------------------------------------------------------------------
169 #*
170 #*  Klasse:     ScPrivatSplit
171 #*
172 #*  Funktion:   Reagiert kontinuierlich auf Mausbewegungen. Es werden
173 #*              die aktuelle Maus- Koordinaten ermittelt und fuer
174 #*              die Verschiebung des Fensters verwendet.
175 #*
176 #*  Input:      ---
177 #*
178 #*  Output:     ---
179 #*
180 #************************************************************************/
181 
182 void ScPrivatSplit::MouseMove( const MouseEvent& rMEvt )
183 {
184     Point aPos=LogicToPixel(rMEvt.GetPosPixel());
185     Point a2Pos=GetPosPixel();
186     Point a3Pos=a2Pos;
187     if(rMEvt.IsLeft())
188     {
189         if(eScSplit==SC_SPLIT_HORZ)
190         {
191             nNewX=(short)aPos.X();
192             nDeltaX=nNewX-nOldX;
193             a2Pos.X()+=nDeltaX;
194 
195             if(a2Pos.X()<aXMovingRange.Min())
196             {
197                 nDeltaX=(short)(aXMovingRange.Min()-a3Pos.X());
198                 a2Pos.X()=aXMovingRange.Min();
199             }
200             else if(a2Pos.X()>aXMovingRange.Max())
201             {
202                 nDeltaX=(short)(aXMovingRange.Max()-a3Pos.X());
203                 a2Pos.X()=aXMovingRange.Max();
204             }
205         }
206         else
207         {
208             nNewY=(short)aPos.Y();
209             nDeltaY=nNewY-nOldY;
210             a2Pos.Y()+=nDeltaY;
211             if(a2Pos.Y()<aYMovingRange.Min())
212             {
213                 nDeltaY=(short)(aYMovingRange.Min()-a3Pos.Y());
214                 a2Pos.Y()=aYMovingRange.Min();
215             }
216             else if(a2Pos.Y()>aYMovingRange.Max())
217             {
218                 nDeltaY=(short)(aYMovingRange.Max()-a3Pos.Y());
219                 a2Pos.Y()=aYMovingRange.Max();
220             }
221         }
222 
223         SetPosPixel(a2Pos);
224 
225         CtrModified();
226         Invalidate();
227         Update();
228     }
229 }
230 
231 /*************************************************************************
232 #*  Member:     SetYRange                                   Datum:14.10.97
233 #*------------------------------------------------------------------------
234 #*
235 #*  Klasse:     ScPrivatSplit
236 #*
237 #*  Funktion:   Setzt den Range fuer die Y- Verschiebung
238 #*
239 #*  Input:      neuer Bereich
240 #*
241 #*  Output:     ---
242 #*
243 #************************************************************************/
244 void ScPrivatSplit::SetYRange(Range cRgeY)
245 {
246     aYMovingRange=cRgeY;
247 }
248 
249 
250 
251 /*************************************************************************
252 #*  Member:     GetDeltaY                                   Datum:13.10.97
253 #*------------------------------------------------------------------------
254 #*
255 #*  Klasse:     ScPrivatSplit
256 #*
257 #*  Funktion:   Liefert die relative x-Verschiebung zurueck
258 #*
259 #*  Input:      ---
260 #*
261 #*  Output:     ---
262 #*
263 #************************************************************************/
264 short ScPrivatSplit::GetDeltaX()
265 {
266     return nDeltaX;
267 }
268 
269 /*************************************************************************
270 #*  Member:     GetDeltaY                                   Datum:13.10.97
271 #*------------------------------------------------------------------------
272 #*
273 #*  Klasse:     ScPrivatSplit
274 #*
275 #*  Funktion:   Liefert die relative y-Verschiebung zurueck
276 #*
277 #*  Input:      ---
278 #*
279 #*  Output:     ---
280 #*
281 #************************************************************************/
282 short ScPrivatSplit::GetDeltaY()
283 {
284     return nDeltaY;
285 }
286 
287 /*************************************************************************
288 #*  Member:     CtrModified                                 Datum:13.10.97
289 #*------------------------------------------------------------------------
290 #*
291 #*  Klasse:     ScPrivatSplit
292 #*
293 #*  Funktion:   Teilt einem installierten Handler mit, dass
294 #*              eine Veraenderung eingetreten ist.
295 #*
296 #*  Input:      ---
297 #*
298 #*  Output:     ---
299 #*
300 #************************************************************************/
301 void ScPrivatSplit::CtrModified()
302 {
303     aCtrModifiedLink.Call( this );
304 }
305 
306 void ScPrivatSplit::MoveSplitTo(Point aPos)
307 {
308     Point a2Pos=GetPosPixel();
309     nOldX=(short)a2Pos.X();
310     nOldY=(short)a2Pos.Y();
311     Point a3Pos=a2Pos;
312 
313     if(eScSplit==SC_SPLIT_HORZ)
314     {
315         nNewX=(short)aPos.X();
316         nDeltaX=nNewX-nOldX;
317         a2Pos.X()+=nDeltaX;
318         if(a2Pos.X()<aXMovingRange.Min())
319         {
320             nDeltaX=(short)(aXMovingRange.Min()-a3Pos.X());
321             a2Pos.X()=aXMovingRange.Min();
322         }
323         else if(a2Pos.X()>aXMovingRange.Max())
324         {
325             nDeltaX=(short)(aXMovingRange.Max()-a3Pos.X());
326             a2Pos.X()=aXMovingRange.Max();
327         }
328     }
329     else
330     {
331         nNewY=(short)aPos.Y();
332         nDeltaY=nNewY-nOldY;
333         a2Pos.Y()+=nDeltaY;
334         if(a2Pos.Y()<aYMovingRange.Min())
335         {
336             nDeltaY=(short)(aYMovingRange.Min()-a3Pos.Y());
337             a2Pos.Y()=aYMovingRange.Min();
338         }
339         else if(a2Pos.Y()>aYMovingRange.Max())
340         {
341             nDeltaY=(short)(aYMovingRange.Max()-a3Pos.Y());
342             a2Pos.Y()=aYMovingRange.Max();
343         }
344     }
345     SetPosPixel(a2Pos);
346     Invalidate();
347     Update();
348     CtrModified();
349 }
350 
351 
352 void ScPrivatSplit::ImplInitSettings( sal_Bool bFont, sal_Bool bForeground, sal_Bool bBackground )
353 {
354     const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
355 
356     if ( bFont )
357     {
358         Font aFont = rStyleSettings.GetAppFont();
359         if ( IsControlFont() )
360             aFont.Merge( GetControlFont() );
361         SetFont( aFont );
362     }
363 
364     if ( bFont || bForeground )
365     {
366         Color aTextColor = rStyleSettings.GetButtonTextColor();
367         if ( IsControlForeground() )
368             aTextColor = GetControlForeground();
369         SetTextColor( aTextColor );
370     }
371 
372     if ( bBackground )
373     {
374         SetBackground( rStyleSettings.GetFaceColor());
375     }
376     if ( IsBackground() )
377     {
378         SetFillColor( GetBackground().GetColor() );
379         SetBackground();
380     }
381     Invalidate();
382 }
383 
384 // -----------------------------------------------------------------------
385 
386 void ScPrivatSplit::StateChanged( StateChangedType nType )
387 {
388     if ( (nType == STATE_CHANGE_ZOOM) ||
389          (nType == STATE_CHANGE_CONTROLFONT) )
390     {
391         ImplInitSettings( sal_True, sal_False, sal_False );
392         Invalidate();
393     }
394     if ( nType == STATE_CHANGE_CONTROLFOREGROUND )
395     {
396         ImplInitSettings( sal_False, sal_True, sal_False );
397         Invalidate();
398     }
399     else if ( nType == STATE_CHANGE_CONTROLBACKGROUND )
400     {
401         ImplInitSettings( sal_False, sal_False, sal_True );
402         Invalidate();
403     }
404 
405     Control::StateChanged( nType );
406 }
407 
408 // -----------------------------------------------------------------------
409 
410 void ScPrivatSplit::DataChanged( const DataChangedEvent& rDCEvt )
411 {
412     if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
413          (rDCEvt.GetFlags() & SETTINGS_STYLE) )
414     {
415         ImplInitSettings( sal_True, sal_True, sal_True );
416         Invalidate();
417     }
418     else
419         Window::DataChanged( rDCEvt );
420 }
421 
422 
423