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 :
20 :
21 : #include <string.h>
22 :
23 : #include <tools/debug.hxx>
24 : #include <tools/rcid.h>
25 :
26 : #include <vcl/event.hxx>
27 : #include <vcl/wall.hxx>
28 : #include <vcl/bitmap.hxx>
29 : #include <vcl/decoview.hxx>
30 : #include <vcl/symbol.hxx>
31 : #include <vcl/image.hxx>
32 : #include <vcl/help.hxx>
33 : #include <vcl/splitwin.hxx>
34 :
35 : #include <svdata.hxx>
36 : #include <svids.hrc>
37 :
38 : // =======================================================================
39 :
40 : // Attention: Must not contain non-PODs because array is enlarged/copied
41 : // with the use of memmove/memcpy.
42 : struct ImplSplitItem
43 : {
44 : long mnSize;
45 : long mnPixSize;
46 : long mnLeft;
47 : long mnTop;
48 : long mnWidth;
49 : long mnHeight;
50 : long mnSplitPos;
51 : long mnSplitSize;
52 : long mnOldSplitPos;
53 : long mnOldSplitSize;
54 : long mnOldWidth;
55 : long mnOldHeight;
56 : ImplSplitSet* mpSet;
57 : Window* mpWindow;
58 : Window* mpOrgParent;
59 : sal_uInt16 mnId;
60 : SplitWindowItemBits mnBits;
61 : sal_Bool mbFixed;
62 : sal_Bool mbSubSize;
63 : /// Minimal width or height of the item. -1 means no restriction.
64 : long mnMinSize;
65 : /// Maximal width or height of the item. -1 means no restriction.
66 : long mnMaxSize;
67 : };
68 :
69 : struct ImplSplitSet
70 : {
71 : ImplSplitItem* mpItems;
72 : Wallpaper* mpWallpaper;
73 : Bitmap* mpBitmap;
74 : long mnLastSize;
75 : long mnSplitSize;
76 : sal_uInt16 mnItems;
77 : sal_uInt16 mnId;
78 : sal_Bool mbCalcPix;
79 : };
80 :
81 :
82 :
83 : /** Check whether the given size is inside the valid range defined by
84 : [rItem.mnMinSize,rItem.mnMaxSize]. When it is not inside it then return
85 : the upper or lower bound, respectively. Otherwise return the given size
86 : unmodified.
87 : Note that either mnMinSize and/or mnMaxSize can be -1 in which case the
88 : size has not lower or upper bound.
89 : */
90 : namespace {
91 0 : long ValidateSize (const long nSize, const ImplSplitItem &rItem)
92 : {
93 0 : if (rItem.mnMinSize>=0 && nSize<rItem.mnMinSize)
94 0 : return rItem.mnMinSize;
95 0 : else if (rItem.mnMaxSize>0 && nSize>rItem.mnMaxSize)
96 0 : return rItem.mnMaxSize;
97 : else
98 0 : return nSize;
99 : }
100 : }
101 :
102 :
103 : #define SPLITWIN_SPLITSIZE 3
104 : #define SPLITWIN_SPLITSIZEEX 4
105 : #define SPLITWIN_SPLITSIZEEXLN 6
106 : #define SPLITWIN_SPLITSIZEAUTOHIDE 36
107 : #define SPLITWIN_SPLITSIZEFADE 36
108 :
109 : #define SPLIT_HORZ ((sal_uInt16)0x0001)
110 : #define SPLIT_VERT ((sal_uInt16)0x0002)
111 : #define SPLIT_WINDOW ((sal_uInt16)0x0004)
112 : #define SPLIT_NOSPLIT ((sal_uInt16)0x8000)
113 :
114 : // =======================================================================
115 :
116 3360 : static void ImplCalcBorder( WindowAlign eAlign, sal_Bool bNoAlign,
117 : long& rLeft, long& rTop,
118 : long& rRight, long& rBottom )
119 : {
120 3360 : if ( bNoAlign )
121 : {
122 0 : rLeft = 2;
123 0 : rTop = 2;
124 0 : rRight = 2;
125 0 : rBottom = 2;
126 : }
127 : else
128 : {
129 3360 : switch ( eAlign )
130 : {
131 : case WINDOWALIGN_TOP:
132 1920 : rLeft = 2;
133 1920 : rTop = 2;
134 1920 : rRight = 2;
135 1920 : rBottom = 0;
136 1920 : break;
137 : case WINDOWALIGN_LEFT:
138 480 : rLeft = 2;
139 480 : rTop = 2;
140 480 : rRight = 0;
141 480 : rBottom = 2;
142 480 : break;
143 : case WINDOWALIGN_BOTTOM:
144 480 : rLeft = 2;
145 480 : rTop = 0;
146 480 : rRight = 2;
147 480 : rBottom = 2;
148 480 : break;
149 : default:
150 480 : rLeft = 0;
151 480 : rTop = 2;
152 480 : rRight = 2;
153 480 : rBottom = 2;
154 480 : break;
155 : }
156 : }
157 3360 : }
158 :
159 : // -----------------------------------------------------------------------
160 :
161 0 : void SplitWindow::ImplDrawBorder( SplitWindow* pWin )
162 : {
163 0 : const StyleSettings& rStyleSettings = pWin->GetSettings().GetStyleSettings();
164 0 : long nDX = pWin->mnDX;
165 0 : long nDY = pWin->mnDY;
166 :
167 0 : if ( pWin->mbNoAlign )
168 : {
169 0 : DecorationView aDecoView( pWin );
170 0 : Point aTmpPoint;
171 0 : Rectangle aRect( aTmpPoint, Size( nDX, nDY ) );
172 0 : aDecoView.DrawFrame( aRect, FRAME_DRAW_DOUBLEIN );
173 : }
174 : else
175 : {
176 0 : switch ( pWin->meAlign )
177 : {
178 : case WINDOWALIGN_BOTTOM:
179 0 : pWin->SetLineColor( rStyleSettings.GetShadowColor() );
180 0 : pWin->DrawLine( Point( 0, nDY-2 ), Point( nDX-1, nDY-2 ) );
181 0 : pWin->DrawLine( Point( 0, 0 ), Point( 0, nDY-1 ) );
182 0 : pWin->DrawLine( Point( nDX-2, 0 ), Point( nDX-2, nDY-3 ) );
183 :
184 0 : pWin->SetLineColor( rStyleSettings.GetLightColor() );
185 0 : pWin->DrawLine( Point( 0, nDY-1 ), Point( nDX-1, nDY-1 ) );
186 0 : pWin->DrawLine( Point( 1, 1 ), Point( 1, nDY-3 ) );
187 0 : pWin->DrawLine( Point( nDX-1, 0 ), Point( nDX-1, nDY-1 ) );
188 0 : break;
189 : case WINDOWALIGN_TOP:
190 0 : pWin->SetLineColor( rStyleSettings.GetShadowColor() );
191 0 : pWin->DrawLine( Point( 0, 0 ), Point( nDX-1, 0 ) );
192 0 : pWin->DrawLine( Point( 0, 0 ), Point( 0, nDY-1 ) );
193 0 : pWin->DrawLine( Point( nDX-2, 0 ), Point( nDX-2, nDY-1 ) );
194 :
195 0 : pWin->SetLineColor( rStyleSettings.GetLightColor() );
196 0 : pWin->DrawLine( Point( 1, 1 ), Point( nDX-3, 1 ) );
197 0 : pWin->DrawLine( Point( 1, 1 ), Point( 1, nDY-1 ) );
198 0 : pWin->DrawLine( Point( nDX-1, 1 ), Point( nDX-1, nDY-1 ) );
199 0 : break;
200 : case WINDOWALIGN_LEFT:
201 0 : pWin->SetLineColor( rStyleSettings.GetShadowColor() );
202 0 : pWin->DrawLine( Point( 0, 0 ), Point( nDX-1, 0 ) );
203 0 : pWin->DrawLine( Point( 0, 0 ), Point( 0, nDY-1 ) );
204 0 : pWin->DrawLine( Point( 0, nDY-2 ), Point( nDX-1, nDY-2 ) );
205 :
206 0 : pWin->SetLineColor( rStyleSettings.GetLightColor() );
207 0 : pWin->DrawLine( Point( 1, 1 ), Point( nDX-1, 1 ) );
208 0 : pWin->DrawLine( Point( 1, 1 ), Point( 1, nDY-3 ) );
209 0 : pWin->DrawLine( Point( 1, nDY-1 ), Point( nDX-1, nDY-1 ) );
210 0 : break;
211 : default:
212 0 : pWin->SetLineColor( rStyleSettings.GetShadowColor() );
213 0 : pWin->DrawLine( Point( 0, 0 ), Point( nDX-2, 0 ) );
214 0 : pWin->DrawLine( Point( nDX-2, 0 ), Point( nDX-2, nDY-3 ) );
215 0 : pWin->DrawLine( Point( 0, nDY-2 ), Point( nDX-2, nDY-2 ) );
216 :
217 0 : pWin->SetLineColor( rStyleSettings.GetLightColor() );
218 0 : pWin->DrawLine( Point( 0, 1 ), Point( nDX-3, 1 ) );
219 0 : pWin->DrawLine( Point( nDX-1, 0 ), Point( nDX-1, nDY-1 ) );
220 0 : pWin->DrawLine( Point( 0, nDY-1 ), Point( nDX-1, nDY-1 ) );
221 0 : break;
222 : }
223 : }
224 0 : }
225 :
226 : // -----------------------------------------------------------------------
227 :
228 0 : void SplitWindow::ImplDrawBorderLine( SplitWindow* pWin )
229 : {
230 0 : if ( pWin->mbFadeOut || pWin->mbAutoHide )
231 : {
232 0 : const StyleSettings& rStyleSettings = pWin->GetSettings().GetStyleSettings();
233 0 : long nDX = pWin->mnDX;
234 0 : long nDY = pWin->mnDY;
235 :
236 0 : switch ( pWin->meAlign )
237 : {
238 : case WINDOWALIGN_LEFT:
239 0 : pWin->SetLineColor( rStyleSettings.GetShadowColor() );
240 0 : pWin->DrawLine( Point( nDX-SPLITWIN_SPLITSIZEEXLN-1, 0 ), Point( nDX-SPLITWIN_SPLITSIZEEXLN-1, nDY-3 ) );
241 0 : pWin->SetLineColor( rStyleSettings.GetLightColor() );
242 0 : pWin->DrawLine( Point( nDX-SPLITWIN_SPLITSIZEEXLN, 1 ), Point( nDX-SPLITWIN_SPLITSIZEEXLN, nDY-4 ) );
243 0 : break;
244 : case WINDOWALIGN_RIGHT:
245 0 : pWin->SetLineColor( rStyleSettings.GetShadowColor() );
246 0 : pWin->DrawLine( Point( SPLITWIN_SPLITSIZEEXLN-1, 0 ), Point( SPLITWIN_SPLITSIZEEXLN-1, nDY-3 ) );
247 0 : pWin->SetLineColor( rStyleSettings.GetLightColor() );
248 0 : pWin->DrawLine( Point( SPLITWIN_SPLITSIZEEXLN, 1 ), Point( SPLITWIN_SPLITSIZEEXLN, nDY-4 ) );
249 0 : break;
250 : case WINDOWALIGN_TOP:
251 0 : pWin->SetLineColor( rStyleSettings.GetShadowColor() );
252 0 : pWin->DrawLine( Point( 0, nDY-SPLITWIN_SPLITSIZEEXLN-1 ), Point( nDX-3, nDY-SPLITWIN_SPLITSIZEEXLN-1 ) );
253 0 : pWin->SetLineColor( rStyleSettings.GetLightColor() );
254 0 : pWin->DrawLine( Point( 1, nDY-SPLITWIN_SPLITSIZEEXLN ), Point( nDX-4, nDY-SPLITWIN_SPLITSIZEEXLN ) );
255 0 : break;
256 : case WINDOWALIGN_BOTTOM:
257 0 : pWin->SetLineColor( rStyleSettings.GetShadowColor() );
258 0 : pWin->DrawLine( Point( 0, SPLITWIN_SPLITSIZEEXLN-1 ), Point( nDX-3, SPLITWIN_SPLITSIZEEXLN-1 ) );
259 0 : pWin->SetLineColor( rStyleSettings.GetLightColor() );
260 0 : pWin->DrawLine( Point( 1, SPLITWIN_SPLITSIZEEXLN ), Point( nDX-4, SPLITWIN_SPLITSIZEEXLN ) );
261 0 : break;
262 : }
263 : }
264 0 : }
265 :
266 : // -----------------------------------------------------------------------
267 :
268 5256 : static ImplSplitSet* ImplFindSet( ImplSplitSet* pSet, sal_uInt16 nId )
269 : {
270 5256 : if ( pSet->mnId == nId )
271 5256 : return pSet;
272 :
273 : sal_uInt16 i;
274 0 : sal_uInt16 nItems = pSet->mnItems;
275 0 : ImplSplitItem* pItems = pSet->mpItems;
276 :
277 0 : for ( i = 0; i < nItems; i++ )
278 : {
279 0 : if ( pItems[i].mnId == nId )
280 0 : return pItems[i].mpSet;
281 : }
282 :
283 0 : for ( i = 0; i < nItems; i++ )
284 : {
285 0 : if ( pItems[i].mpSet )
286 : {
287 0 : ImplSplitSet* pFindSet = ImplFindSet( pItems[i].mpSet, nId );
288 0 : if ( pFindSet )
289 0 : return pFindSet;
290 : }
291 : }
292 :
293 0 : return NULL;
294 : }
295 :
296 : // -----------------------------------------------------------------------
297 :
298 0 : static ImplSplitSet* ImplFindItem( ImplSplitSet* pSet, sal_uInt16 nId, sal_uInt16& rPos )
299 : {
300 : sal_uInt16 i;
301 0 : sal_uInt16 nItems = pSet->mnItems;
302 0 : ImplSplitItem* pItems = pSet->mpItems;
303 :
304 0 : for ( i = 0; i < nItems; i++ )
305 : {
306 0 : if ( pItems[i].mnId == nId )
307 : {
308 0 : rPos = i;
309 0 : return pSet;
310 : }
311 : }
312 :
313 0 : for ( i = 0; i < nItems; i++ )
314 : {
315 0 : if ( pItems[i].mpSet )
316 : {
317 0 : ImplSplitSet* pFindSet = ImplFindItem( pItems[i].mpSet, nId, rPos );
318 0 : if ( pFindSet )
319 0 : return pFindSet;
320 : }
321 : }
322 :
323 0 : return NULL;
324 : }
325 :
326 : // -----------------------------------------------------------------------
327 :
328 0 : static sal_uInt16 ImplFindItem( ImplSplitSet* pSet, Window* pWindow )
329 : {
330 : sal_uInt16 i;
331 0 : sal_uInt16 nItems = pSet->mnItems;
332 0 : ImplSplitItem* pItems = pSet->mpItems;
333 :
334 0 : for ( i = 0; i < nItems; i++ )
335 : {
336 0 : if ( pItems[i].mpWindow == pWindow )
337 0 : return pItems[i].mnId;
338 : else
339 : {
340 0 : if ( pItems[i].mpSet )
341 : {
342 0 : sal_uInt16 nId = ImplFindItem( pItems[i].mpSet, pWindow );
343 0 : if ( nId )
344 0 : return nId;
345 : }
346 : }
347 : }
348 :
349 0 : return 0;
350 : }
351 :
352 : // -----------------------------------------------------------------------
353 :
354 0 : static sal_uInt16 ImplFindItem( ImplSplitSet* pSet, const Point& rPos,
355 : sal_Bool bRows, sal_Bool bDown = sal_True )
356 : {
357 : sal_uInt16 i;
358 0 : sal_uInt16 nItems = pSet->mnItems;
359 0 : ImplSplitItem* pItems = pSet->mpItems;
360 :
361 0 : for ( i = 0; i < nItems; i++ )
362 : {
363 0 : if ( pItems[i].mnWidth && pItems[i].mnHeight )
364 : {
365 : // Wegen ICC auftrennen
366 0 : Point aPoint( pItems[i].mnLeft, pItems[i].mnTop );
367 0 : Size aSize( pItems[i].mnWidth, pItems[i].mnHeight );
368 0 : Rectangle aRect( aPoint, aSize );
369 0 : if ( bRows )
370 : {
371 0 : if ( bDown )
372 0 : aRect.Bottom() += pSet->mnSplitSize;
373 : else
374 0 : aRect.Top() -= pSet->mnSplitSize;
375 : }
376 : else
377 : {
378 0 : if ( bDown )
379 0 : aRect.Right() += pSet->mnSplitSize;
380 : else
381 0 : aRect.Left() -= pSet->mnSplitSize;
382 : }
383 :
384 0 : if ( aRect.IsInside( rPos ) )
385 : {
386 0 : if ( pItems[i].mpSet && pItems[i].mpSet->mpItems )
387 : {
388 0 : return ImplFindItem( pItems[i].mpSet, rPos,
389 0 : ((pItems[i].mnBits & SWIB_COLSET) == 0) );
390 : }
391 : else
392 0 : return pItems[i].mnId;
393 : }
394 : }
395 : }
396 :
397 0 : return 0;
398 : }
399 :
400 : // -----------------------------------------------------------------------
401 :
402 504 : static void ImplDeleteSet( ImplSplitSet* pSet )
403 : {
404 : sal_uInt16 i;
405 504 : sal_uInt16 nItems = pSet->mnItems;
406 504 : ImplSplitItem* pItems = pSet->mpItems;
407 :
408 504 : for ( i = 0; i < nItems; i++ )
409 : {
410 0 : if ( pItems[i].mpSet )
411 0 : ImplDeleteSet( pItems[i].mpSet );
412 : }
413 :
414 504 : if ( pSet->mpWallpaper )
415 0 : delete pSet->mpWallpaper;
416 :
417 504 : if ( pSet->mpBitmap )
418 0 : delete pSet->mpBitmap;
419 :
420 504 : delete [] pItems;
421 504 : delete pSet;
422 504 : }
423 :
424 : // -----------------------------------------------------------------------
425 :
426 0 : static void ImplCalcSet( ImplSplitSet* pSet,
427 : long nSetLeft, long nSetTop,
428 : long nSetWidth, long nSetHeight,
429 : sal_Bool bRows, sal_Bool bDown = sal_True )
430 : {
431 0 : if ( !pSet->mpItems )
432 0 : return;
433 :
434 : sal_uInt16 i;
435 : sal_uInt16 j;
436 : sal_uInt16 nMins;
437 : sal_uInt16 nCalcItems;
438 0 : sal_uInt16 nItems = pSet->mnItems;
439 : sal_uInt16 nVisItems;
440 : sal_uInt16 nAbsItems;
441 : long nCalcSize;
442 : long nSizeDelta;
443 : long nCurSize;
444 : long nSizeWinSize;
445 : long nNewSizeWinSize;
446 : long nTemp;
447 : long nTempErr;
448 : long nErrorSum;
449 : long nCurSizeDelta;
450 : long nPos;
451 : long nMaxPos;
452 : long* pSize;
453 0 : ImplSplitItem* pItems = pSet->mpItems;
454 : sal_Bool bEmpty;
455 :
456 : // Anzahl sichtbarer Items ermitteln
457 0 : nVisItems = 0;
458 0 : for ( i = 0; i < nItems; i++ )
459 : {
460 0 : if ( !(pItems[i].mnBits & SWIB_INVISIBLE) )
461 0 : nVisItems++;
462 : }
463 :
464 : // Groessen berechnen
465 0 : if ( bRows )
466 0 : nCalcSize = nSetHeight;
467 : else
468 0 : nCalcSize = nSetWidth;
469 0 : nCalcSize -= (nVisItems-1)*pSet->mnSplitSize;
470 0 : nCurSize = 0;
471 0 : if ( pSet->mbCalcPix || (pSet->mnLastSize != nCalcSize) )
472 : {
473 0 : long nPercentFactor = 10;
474 0 : long nRelCount = 0;
475 0 : long nPercent = 0;
476 0 : long nRelPercent = 0;
477 0 : long nAbsSize = 0;
478 0 : for ( i = 0; i < nItems; i++ )
479 : {
480 0 : if ( !(pItems[i].mnBits & SWIB_INVISIBLE) )
481 : {
482 0 : if ( pItems[i].mnBits & SWIB_RELATIVESIZE )
483 0 : nRelCount += pItems[i].mnSize;
484 0 : else if ( pItems[i].mnBits & SWIB_PERCENTSIZE )
485 0 : nPercent += pItems[i].mnSize;
486 : else
487 0 : nAbsSize += pItems[i].mnSize;
488 : }
489 : }
490 : // Relative-Werte auf prozentual mappen (Percent bei uns 10tel Prozent)
491 0 : nPercent *= nPercentFactor;
492 0 : if ( nRelCount )
493 : {
494 0 : long nRelPercentBase = 1000;
495 0 : while ( (nRelCount > nRelPercentBase) && (nPercentFactor < 100000) )
496 : {
497 0 : nRelPercentBase *= 10;
498 0 : nPercentFactor *= 10;
499 : }
500 0 : if ( nPercent < nRelPercentBase )
501 : {
502 0 : nRelPercent = (nRelPercentBase-nPercent)/nRelCount;
503 0 : nPercent += nRelPercent*nRelCount;
504 : }
505 : else
506 0 : nRelPercent = 0;
507 : }
508 0 : if ( !nPercent )
509 0 : nPercent = 1;
510 0 : nSizeDelta = nCalcSize-nAbsSize;
511 0 : for ( i = 0; i < nItems; i++ )
512 : {
513 0 : if ( pItems[i].mnBits & SWIB_INVISIBLE )
514 0 : pItems[i].mnPixSize = 0;
515 0 : else if ( pItems[i].mnBits & SWIB_RELATIVESIZE )
516 : {
517 0 : if ( nSizeDelta <= 0 )
518 0 : pItems[i].mnPixSize = 0;
519 : else
520 0 : pItems[i].mnPixSize = (nSizeDelta*pItems[i].mnSize*nRelPercent)/nPercent;
521 : }
522 0 : else if ( pItems[i].mnBits & SWIB_PERCENTSIZE )
523 : {
524 0 : if ( nSizeDelta <= 0 )
525 0 : pItems[i].mnPixSize = 0;
526 : else
527 0 : pItems[i].mnPixSize = (nSizeDelta*pItems[i].mnSize*nPercentFactor)/nPercent;
528 : }
529 : else
530 0 : pItems[i].mnPixSize = pItems[i].mnSize;
531 0 : nCurSize += pItems[i].mnPixSize;
532 : }
533 :
534 0 : pSet->mbCalcPix = sal_False;
535 0 : pSet->mnLastSize = nCalcSize;
536 :
537 : // Fenster einpassen
538 0 : nSizeDelta = nCalcSize-nCurSize;
539 0 : if ( nSizeDelta )
540 : {
541 0 : nAbsItems = 0;
542 0 : nSizeWinSize = 0;
543 0 : nNewSizeWinSize = 0;
544 :
545 : // Zuerst die absoluten Items relativ resizen
546 0 : for ( i = 0; i < nItems; i++ )
547 : {
548 0 : if ( !(pItems[i].mnBits & SWIB_INVISIBLE) )
549 : {
550 0 : if ( !(pItems[i].mnBits & (SWIB_RELATIVESIZE | SWIB_PERCENTSIZE)) )
551 : {
552 0 : nAbsItems++;
553 0 : nSizeWinSize += pItems[i].mnPixSize;
554 : }
555 : }
556 : }
557 : // Rundungsfehler werden hier nicht ausgelichen
558 0 : if ( (nAbsItems < (sal_uInt16)(Abs( nSizeDelta ))) && nSizeWinSize )
559 : {
560 0 : for ( i = 0; i < nItems; i++ )
561 : {
562 0 : if ( !(pItems[i].mnBits & SWIB_INVISIBLE) )
563 : {
564 0 : if ( !(pItems[i].mnBits & (SWIB_RELATIVESIZE | SWIB_PERCENTSIZE)) )
565 : {
566 0 : pItems[i].mnPixSize += (nSizeDelta*pItems[i].mnPixSize)/nSizeWinSize;
567 0 : nNewSizeWinSize += pItems[i].mnPixSize;
568 : }
569 : }
570 : }
571 0 : nSizeDelta -= nNewSizeWinSize-nSizeWinSize;
572 : }
573 :
574 : // Jetzt die Rundunsfehler ausgleichen
575 0 : j = 0;
576 0 : nMins = 0;
577 0 : while ( nSizeDelta && (nItems != nMins) )
578 : {
579 : // Feststellen, welche Items berechnet werden duerfen
580 0 : nCalcItems = 0;
581 0 : while ( !nCalcItems )
582 : {
583 0 : for ( i = 0; i < nItems; i++ )
584 : {
585 0 : pItems[i].mbSubSize = sal_False;
586 :
587 0 : if ( j >= 2 )
588 0 : pItems[i].mbSubSize = sal_True;
589 : else
590 : {
591 0 : if ( !(pItems[i].mnBits & SWIB_INVISIBLE) )
592 : {
593 0 : if ( (nSizeDelta > 0) || pItems[i].mnPixSize )
594 : {
595 0 : if ( j >= 1 )
596 0 : pItems[i].mbSubSize = sal_True;
597 : else
598 : {
599 0 : if ( (j == 0) && (pItems[i].mnBits & (SWIB_RELATIVESIZE | SWIB_PERCENTSIZE)) )
600 0 : pItems[i].mbSubSize = sal_True;
601 : }
602 : }
603 : }
604 : }
605 :
606 0 : if ( pItems[i].mbSubSize )
607 0 : nCalcItems++;
608 : }
609 :
610 0 : j++;
611 : }
612 :
613 : // Groessen von den einzelnen Items abziehen
614 0 : nErrorSum = nSizeDelta % nCalcItems;
615 0 : nCurSizeDelta = nSizeDelta / nCalcItems;
616 0 : nMins = 0;
617 0 : for ( i = 0; i < nItems; i++ )
618 : {
619 0 : if ( pItems[i].mnBits & SWIB_INVISIBLE )
620 0 : nMins++;
621 0 : else if ( pItems[i].mbSubSize )
622 : {
623 0 : pSize = &(pItems[i].mnPixSize);
624 :
625 0 : if ( nErrorSum )
626 : {
627 0 : if ( nErrorSum < 0 )
628 0 : nTempErr = -1;
629 : else
630 0 : nTempErr = 1;
631 : }
632 : else
633 0 : nTempErr = 0;
634 :
635 0 : if ( (*pSize+nCurSizeDelta+nTempErr) <= 0 )
636 : {
637 0 : nTemp = *pSize;
638 0 : if ( nTemp )
639 : {
640 0 : *pSize -= nTemp;
641 0 : nSizeDelta += nTemp;
642 : }
643 0 : nMins++;
644 : }
645 : else
646 : {
647 0 : *pSize += nCurSizeDelta;
648 0 : nSizeDelta -= nCurSizeDelta;
649 0 : if ( nTempErr && (*pSize || (nTempErr > 0)) )
650 : {
651 0 : *pSize += nTempErr;
652 0 : nSizeDelta -= nTempErr;
653 0 : nErrorSum -= nTempErr;
654 : }
655 : }
656 : }
657 : }
658 : }
659 0 : }
660 : }
661 : else
662 : {
663 0 : for ( i = 0; i < nItems; i++ )
664 : {
665 0 : if ( !(pItems[i].mnBits & SWIB_INVISIBLE) )
666 0 : nCurSize += pItems[i].mnPixSize;
667 : }
668 : }
669 :
670 : // Maximale Groesse berechnen
671 0 : if ( bRows )
672 : {
673 0 : nPos = nSetTop;
674 0 : if ( !bDown )
675 0 : nMaxPos = nSetTop-nSetHeight;
676 : else
677 0 : nMaxPos = nSetTop+nSetHeight;
678 : }
679 : else
680 : {
681 0 : nPos = nSetLeft;
682 0 : if ( !bDown )
683 0 : nMaxPos = nSetLeft-nSetWidth;
684 : else
685 0 : nMaxPos = nSetLeft+nSetWidth;
686 : }
687 :
688 : // Fenster anordnen und Werte anpassen
689 0 : for ( i = 0; i < nItems; i++ )
690 : {
691 0 : pItems[i].mnOldSplitPos = pItems[i].mnSplitPos;
692 0 : pItems[i].mnOldSplitSize = pItems[i].mnSplitSize;
693 0 : pItems[i].mnOldWidth = pItems[i].mnWidth;
694 0 : pItems[i].mnOldHeight = pItems[i].mnHeight;
695 :
696 0 : if ( pItems[i].mnBits & SWIB_INVISIBLE )
697 0 : bEmpty = sal_True;
698 : else
699 : {
700 0 : bEmpty = sal_False;
701 0 : if ( bDown )
702 : {
703 0 : if ( nPos+pItems[i].mnPixSize > nMaxPos )
704 0 : bEmpty = sal_True;
705 : }
706 : else
707 : {
708 0 : nPos -= pItems[i].mnPixSize;
709 0 : if ( nPos < nMaxPos )
710 0 : bEmpty = sal_True;
711 : }
712 : }
713 :
714 0 : if ( bEmpty )
715 : {
716 0 : pItems[i].mnWidth = 0;
717 0 : pItems[i].mnHeight = 0;
718 0 : pItems[i].mnSplitSize = 0;
719 : }
720 : else
721 : {
722 0 : if ( bRows )
723 : {
724 0 : pItems[i].mnLeft = nSetLeft;
725 0 : pItems[i].mnTop = nPos;
726 0 : pItems[i].mnWidth = nSetWidth;
727 0 : pItems[i].mnHeight = pItems[i].mnPixSize;
728 : }
729 : else
730 : {
731 0 : pItems[i].mnLeft = nPos;
732 0 : pItems[i].mnTop = nSetTop;
733 0 : pItems[i].mnWidth = pItems[i].mnPixSize;
734 0 : pItems[i].mnHeight = nSetHeight;
735 : }
736 :
737 0 : if ( i > nItems-1 )
738 0 : pItems[i].mnSplitSize = 0;
739 : else
740 : {
741 0 : pItems[i].mnSplitSize = pSet->mnSplitSize;
742 0 : if ( bDown )
743 : {
744 0 : pItems[i].mnSplitPos = nPos+pItems[i].mnPixSize;
745 0 : if ( pItems[i].mnSplitPos+pItems[i].mnSplitSize > nMaxPos )
746 0 : pItems[i].mnSplitSize = nMaxPos-pItems[i].mnSplitPos;
747 : }
748 : else
749 : {
750 0 : pItems[i].mnSplitPos = nPos-pSet->mnSplitSize;
751 0 : if ( pItems[i].mnSplitPos < nMaxPos )
752 0 : pItems[i].mnSplitSize = pItems[i].mnSplitPos+pSet->mnSplitSize-nMaxPos;
753 : }
754 : }
755 : }
756 :
757 0 : if ( !(pItems[i].mnBits & SWIB_INVISIBLE) )
758 : {
759 0 : if ( !bDown )
760 0 : nPos -= pSet->mnSplitSize;
761 : else
762 0 : nPos += pItems[i].mnPixSize+pSet->mnSplitSize;
763 : }
764 : }
765 :
766 : // Sub-Set's berechnen
767 0 : for ( i = 0; i < nItems; i++ )
768 : {
769 0 : if ( pItems[i].mpSet && pItems[i].mnWidth && pItems[i].mnHeight )
770 : {
771 0 : ImplCalcSet( pItems[i].mpSet,
772 0 : pItems[i].mnLeft, pItems[i].mnTop,
773 0 : pItems[i].mnWidth, pItems[i].mnHeight,
774 0 : ((pItems[i].mnBits & SWIB_COLSET) == 0) );
775 : }
776 : }
777 :
778 : // Fixed setzen
779 0 : for ( i = 0; i < nItems; i++ )
780 : {
781 0 : pItems[i].mbFixed = sal_False;
782 0 : if ( pItems[i].mnBits & SWIB_FIXED )
783 0 : pItems[i].mbFixed = sal_True;
784 : else
785 : {
786 : // Wenn Child-Set vorhanden, ist dieses Item auch Fixed, wenn
787 : // ein Child fixed ist
788 0 : if ( pItems[i].mpSet )
789 : {
790 0 : for ( j = 0; j < pItems[i].mpSet->mnItems; j++ )
791 : {
792 0 : if ( pItems[i].mpSet->mpItems[j].mbFixed )
793 : {
794 0 : pItems[i].mbFixed = sal_True;
795 0 : break;
796 : }
797 : }
798 : }
799 : }
800 : }
801 : }
802 :
803 : // -----------------------------------------------------------------------
804 :
805 0 : void SplitWindow::ImplCalcSet2( SplitWindow* pWindow, ImplSplitSet* pSet, sal_Bool bHide,
806 : sal_Bool bRows, sal_Bool /*bDown*/ )
807 : {
808 : sal_uInt16 i;
809 0 : sal_uInt16 nItems = pSet->mnItems;
810 0 : ImplSplitItem* pItems = pSet->mpItems;
811 :
812 0 : if ( pWindow->IsReallyVisible() && pWindow->IsUpdateMode() && pWindow->mbInvalidate )
813 : {
814 0 : for ( i = 0; i < nItems; i++ )
815 : {
816 0 : if ( pItems[i].mnSplitSize )
817 : {
818 : // Evt. alles invalidieren oder nur einen kleinen Teil
819 0 : if ( (pItems[i].mnOldSplitPos != pItems[i].mnSplitPos) ||
820 0 : (pItems[i].mnOldSplitSize != pItems[i].mnSplitSize) ||
821 0 : (pItems[i].mnOldWidth != pItems[i].mnWidth) ||
822 0 : (pItems[i].mnOldHeight != pItems[i].mnHeight) )
823 : {
824 0 : Rectangle aRect;
825 :
826 : // Old Rect invalidieren
827 0 : if ( bRows )
828 : {
829 0 : aRect.Left() = pItems[i].mnLeft;
830 0 : aRect.Right() = pItems[i].mnLeft+pItems[i].mnOldWidth-1;
831 0 : aRect.Top() = pItems[i].mnOldSplitPos;
832 0 : aRect.Bottom() = aRect.Top() + pItems[i].mnOldSplitSize;
833 : }
834 : else
835 : {
836 0 : aRect.Top() = pItems[i].mnTop;
837 0 : aRect.Bottom() = pItems[i].mnTop+pItems[i].mnOldHeight-1;
838 0 : aRect.Left() = pItems[i].mnOldSplitPos;
839 0 : aRect.Right() = aRect.Left() + pItems[i].mnOldSplitSize;
840 : }
841 0 : pWindow->Invalidate( aRect );
842 : // New Rect invalidieren
843 0 : if ( bRows )
844 : {
845 0 : aRect.Left() = pItems[i].mnLeft;
846 0 : aRect.Right() = pItems[i].mnLeft+pItems[i].mnWidth-1;
847 0 : aRect.Top() = pItems[i].mnSplitPos;
848 0 : aRect.Bottom() = aRect.Top() + pItems[i].mnSplitSize;
849 : }
850 : else
851 : {
852 0 : aRect.Top() = pItems[i].mnTop;
853 0 : aRect.Bottom() = pItems[i].mnTop+pItems[i].mnHeight-1;
854 0 : aRect.Left() = pItems[i].mnSplitPos;
855 0 : aRect.Right() = aRect.Left() + pItems[i].mnSplitSize;
856 : }
857 0 : pWindow->Invalidate( aRect );
858 :
859 : // Leere Sets komplett invalidieren, da diese Flaechen
860 : // nicht von Fenstern ueberladen werden
861 0 : if ( pItems[i].mpSet && !pItems[i].mpSet->mpItems )
862 : {
863 0 : aRect.Left() = pItems[i].mnLeft;
864 0 : aRect.Top() = pItems[i].mnTop;
865 0 : aRect.Right() = pItems[i].mnLeft+pItems[i].mnWidth-1;
866 0 : aRect.Bottom() = pItems[i].mnTop+pItems[i].mnHeight-1;
867 0 : pWindow->Invalidate( aRect );
868 : }
869 : }
870 : }
871 : }
872 : }
873 :
874 : // Fenster positionieren
875 0 : for ( i = 0; i < nItems; i++ )
876 : {
877 0 : if ( pItems[i].mpSet )
878 : {
879 0 : sal_Bool bTempHide = bHide;
880 0 : if ( !pItems[i].mnWidth || !pItems[i].mnHeight )
881 0 : bTempHide = sal_True;
882 0 : ImplCalcSet2( pWindow, pItems[i].mpSet, bTempHide,
883 0 : ((pItems[i].mnBits & SWIB_COLSET) == 0) );
884 : }
885 : else
886 : {
887 0 : if ( pItems[i].mnWidth && pItems[i].mnHeight && !bHide )
888 : {
889 0 : Point aPos( pItems[i].mnLeft, pItems[i].mnTop );
890 0 : Size aSize( pItems[i].mnWidth, pItems[i].mnHeight );
891 0 : pItems[i].mpWindow->SetPosSizePixel( aPos, aSize );
892 : }
893 : else
894 0 : pItems[i].mpWindow->Hide();
895 : }
896 : }
897 :
898 : // Fenster anzeigen und Flag zuruecksetzen
899 0 : for ( i = 0; i < nItems; i++ )
900 : {
901 0 : if ( pItems[i].mpWindow && pItems[i].mnWidth && pItems[i].mnHeight && !bHide )
902 0 : pItems[i].mpWindow->Show();
903 : }
904 0 : }
905 :
906 : // -----------------------------------------------------------------------
907 :
908 0 : static void ImplCalcLogSize( ImplSplitItem* pItems, sal_uInt16 nItems )
909 : {
910 : // Original-Groessen updaten
911 : sal_uInt16 i;
912 0 : long nRelSize = 0;
913 0 : long nPerSize = 0;
914 0 : for ( i = 0; i < nItems; i++ )
915 : {
916 0 : if ( pItems[i].mnBits & SWIB_RELATIVESIZE )
917 0 : nRelSize += pItems[i].mnPixSize;
918 0 : else if ( pItems[i].mnBits & SWIB_PERCENTSIZE )
919 0 : nPerSize += pItems[i].mnPixSize;
920 : }
921 0 : nPerSize += nRelSize;
922 0 : for ( i = 0; i < nItems; i++ )
923 : {
924 0 : if ( pItems[i].mnBits & SWIB_RELATIVESIZE )
925 : {
926 0 : if ( nRelSize )
927 0 : pItems[i].mnSize = (pItems[i].mnPixSize+(nRelSize/2))/nRelSize;
928 : else
929 0 : pItems[i].mnSize = 1;
930 : }
931 0 : else if ( pItems[i].mnBits & SWIB_PERCENTSIZE )
932 : {
933 0 : if ( nPerSize )
934 0 : pItems[i].mnSize = (pItems[i].mnPixSize*100)/nPerSize;
935 : else
936 0 : pItems[i].mnSize = 1;
937 : }
938 : else
939 0 : pItems[i].mnSize = pItems[i].mnPixSize;
940 : }
941 0 : }
942 :
943 : // -----------------------------------------------------------------------
944 :
945 0 : void SplitWindow::ImplDrawBack( SplitWindow* pWindow, const Rectangle& rRect,
946 : const Wallpaper* pWall, const Bitmap* pBitmap )
947 : {
948 0 : if ( pBitmap )
949 : {
950 0 : Point aPos = rRect.TopLeft();
951 0 : Size aBmpSize = pBitmap->GetSizePixel();
952 0 : pWindow->Push( PUSH_CLIPREGION );
953 0 : pWindow->IntersectClipRegion( rRect );
954 0 : do
955 : {
956 0 : aPos.X() = rRect.Left();
957 0 : do
958 : {
959 0 : pWindow->DrawBitmap( aPos, *pBitmap );
960 0 : aPos.X() += aBmpSize.Width();
961 : }
962 0 : while ( aPos.X() < rRect.Right() );
963 0 : aPos.Y() += aBmpSize.Height();
964 : }
965 0 : while ( aPos.Y() < rRect.Bottom() );
966 0 : pWindow->Pop();
967 : }
968 : else
969 0 : pWindow->DrawWallpaper( rRect, *pWall );
970 0 : }
971 :
972 : // -----------------------------------------------------------------------
973 :
974 0 : void SplitWindow::ImplDrawBack( SplitWindow* pWindow, ImplSplitSet* pSet )
975 : {
976 : sal_uInt16 i;
977 0 : sal_uInt16 nItems = pSet->mnItems;
978 0 : ImplSplitItem* pItems = pSet->mpItems;
979 :
980 : // Beim Mainset auch den Hintergrund zeichnen
981 0 : if ( pSet->mnId == 0 )
982 : {
983 0 : if ( pSet->mpBitmap )
984 : {
985 : Rectangle aRect( pWindow->mnLeftBorder,
986 : pWindow->mnTopBorder,
987 : pWindow->mnDX-pWindow->mnRightBorder-1,
988 0 : pWindow->mnDY-pWindow->mnBottomBorder-1 );
989 0 : ImplDrawBack( pWindow, aRect, pSet->mpWallpaper, pSet->mpBitmap );
990 : }
991 : }
992 :
993 0 : for ( i = 0; i < nItems; i++ )
994 : {
995 0 : pSet = pItems[i].mpSet;
996 0 : if ( pSet )
997 : {
998 0 : if ( pSet->mpBitmap || pSet->mpWallpaper )
999 : {
1000 : // Wegen ICC auftrennen
1001 0 : Point aPoint( pItems[i].mnLeft, pItems[i].mnTop );
1002 0 : Size aSize( pItems[i].mnWidth, pItems[i].mnHeight );
1003 0 : Rectangle aRect( aPoint, aSize );
1004 0 : ImplDrawBack( pWindow, aRect, pSet->mpWallpaper, pSet->mpBitmap );
1005 : }
1006 : }
1007 : }
1008 :
1009 0 : for ( i = 0; i < nItems; i++ )
1010 : {
1011 0 : if ( pItems[i].mpSet )
1012 0 : ImplDrawBack( pWindow, pItems[i].mpSet );
1013 : }
1014 0 : }
1015 :
1016 : // -----------------------------------------------------------------------
1017 :
1018 0 : static void ImplDrawSplit( SplitWindow* pWindow, ImplSplitSet* pSet,
1019 : sal_Bool bRows, sal_Bool bDown = sal_True )
1020 : {
1021 0 : if ( !pSet->mpItems )
1022 0 : return;
1023 :
1024 : sal_uInt16 i;
1025 0 : sal_uInt16 nItems = pSet->mnItems;
1026 : long nPos;
1027 : long nTop;
1028 : long nBottom;
1029 0 : ImplSplitItem* pItems = pSet->mpItems;
1030 0 : const StyleSettings& rStyleSettings = pWindow->GetSettings().GetStyleSettings();
1031 :
1032 0 : sal_Bool bFlat = (pWindow->GetStyle() & WB_FLATSPLITDRAW) == WB_FLATSPLITDRAW;
1033 :
1034 0 : for ( i = 0; i < nItems-1; i++ )
1035 : {
1036 0 : if ( pItems[i].mnSplitSize )
1037 : {
1038 0 : nPos = pItems[i].mnSplitPos;
1039 :
1040 0 : long nItemSplitSize = pItems[i].mnSplitSize;
1041 0 : long nSplitSize = pSet->mnSplitSize;
1042 0 : if ( bRows )
1043 : {
1044 0 : nTop = pItems[i].mnLeft;
1045 0 : nBottom = pItems[i].mnLeft+pItems[i].mnWidth-1;
1046 :
1047 0 : if ( bFlat ) nPos--;
1048 :
1049 0 : if ( bDown || (nItemSplitSize >= nSplitSize) )
1050 : {
1051 0 : pWindow->SetLineColor( rStyleSettings.GetLightColor() );
1052 0 : pWindow->DrawLine( Point( nTop, nPos+1 ), Point( nBottom, nPos+1 ) );
1053 : }
1054 0 : nPos += nSplitSize-2;
1055 0 : if ( bFlat ) nPos+=2;
1056 0 : if ( (!bDown && (nItemSplitSize >= 2)) ||
1057 : (bDown && (nItemSplitSize >= nSplitSize-1)) )
1058 : {
1059 0 : pWindow->SetLineColor( rStyleSettings.GetShadowColor() );
1060 0 : pWindow->DrawLine( Point( nTop, nPos ), Point( nBottom, nPos ) );
1061 : }
1062 0 : if ( !bFlat )
1063 : {
1064 0 : nPos++;
1065 0 : if ( !bDown || (nItemSplitSize >= nSplitSize) )
1066 : {
1067 0 : pWindow->SetLineColor( rStyleSettings.GetDarkShadowColor() );
1068 0 : pWindow->DrawLine( Point( nTop, nPos ), Point( nBottom, nPos ) );
1069 : }
1070 : }
1071 : }
1072 : else
1073 : {
1074 0 : nTop = pItems[i].mnTop;
1075 0 : nBottom = pItems[i].mnTop+pSet->mpItems[i].mnHeight-1;
1076 :
1077 0 : if ( bFlat ) nPos--;
1078 0 : if ( bDown || (nItemSplitSize >= nSplitSize) )
1079 : {
1080 0 : pWindow->SetLineColor( rStyleSettings.GetLightColor() );
1081 0 : pWindow->DrawLine( Point( nPos+1, nTop ), Point( nPos+1, nBottom ) );
1082 : }
1083 0 : nPos += pSet->mnSplitSize-2;
1084 0 : if ( bFlat ) nPos+=2;
1085 0 : if ( (!bDown && (nItemSplitSize >= 2)) ||
1086 : (bDown && (nItemSplitSize >= nSplitSize-1)) )
1087 : {
1088 0 : pWindow->SetLineColor( rStyleSettings.GetShadowColor() );
1089 0 : pWindow->DrawLine( Point( nPos, nTop ), Point( nPos, nBottom ) );
1090 : }
1091 0 : if( !bFlat )
1092 : {
1093 0 : nPos++;
1094 0 : if ( !bDown || (nItemSplitSize >= nSplitSize) )
1095 : {
1096 0 : pWindow->SetLineColor( rStyleSettings.GetDarkShadowColor() );
1097 0 : pWindow->DrawLine( Point( nPos, nTop ), Point( nPos, nBottom ) );
1098 : }
1099 : }
1100 : }
1101 : }
1102 : }
1103 :
1104 0 : for ( i = 0; i < nItems; i++ )
1105 : {
1106 0 : if ( pItems[i].mpSet && pItems[i].mnWidth && pItems[i].mnHeight )
1107 0 : ImplDrawSplit( pWindow, pItems[i].mpSet, ((pItems[i].mnBits & SWIB_COLSET) == 0) );
1108 : }
1109 : }
1110 :
1111 : // -----------------------------------------------------------------------
1112 :
1113 0 : sal_uInt16 SplitWindow::ImplTestSplit( ImplSplitSet* pSet, const Point& rPos,
1114 : long& rMouseOff, ImplSplitSet** ppFoundSet, sal_uInt16& rFoundPos,
1115 : sal_Bool bRows, sal_Bool /*bDown*/ )
1116 : {
1117 0 : if ( !pSet->mpItems )
1118 0 : return 0;
1119 :
1120 : sal_uInt16 i;
1121 : sal_uInt16 nSplitTest;
1122 0 : sal_uInt16 nItems = pSet->mnItems;
1123 : long nMPos1;
1124 : long nMPos2;
1125 : long nPos;
1126 : long nTop;
1127 : long nBottom;
1128 0 : ImplSplitItem* pItems = pSet->mpItems;
1129 :
1130 0 : if ( bRows )
1131 : {
1132 0 : nMPos1 = rPos.X();
1133 0 : nMPos2 = rPos.Y();
1134 : }
1135 : else
1136 : {
1137 0 : nMPos1 = rPos.Y();
1138 0 : nMPos2 = rPos.X();
1139 : }
1140 :
1141 0 : for ( i = 0; i < nItems-1; i++ )
1142 : {
1143 0 : if ( pItems[i].mnSplitSize )
1144 : {
1145 0 : if ( bRows )
1146 : {
1147 0 : nTop = pItems[i].mnLeft;
1148 0 : nBottom = pItems[i].mnLeft+pItems[i].mnWidth-1;
1149 : }
1150 : else
1151 : {
1152 0 : nTop = pItems[i].mnTop;
1153 0 : nBottom = pItems[i].mnTop+pItems[i].mnHeight-1;
1154 : }
1155 0 : nPos = pItems[i].mnSplitPos;
1156 :
1157 0 : if ( (nMPos1 >= nTop) && (nMPos1 <= nBottom) &&
1158 0 : (nMPos2 >= nPos) && (nMPos2 <= nPos+pItems[i].mnSplitSize) )
1159 : {
1160 0 : if ( !pItems[i].mbFixed && !pItems[i+1].mbFixed )
1161 : {
1162 0 : rMouseOff = nMPos2-nPos;
1163 0 : *ppFoundSet = pSet;
1164 0 : rFoundPos = i;
1165 0 : if ( bRows )
1166 0 : return SPLIT_VERT;
1167 : else
1168 0 : return SPLIT_HORZ;
1169 : }
1170 : else
1171 0 : return SPLIT_NOSPLIT;
1172 : }
1173 : }
1174 : }
1175 :
1176 0 : for ( i = 0; i < nItems; i++ )
1177 : {
1178 0 : if ( pItems[i].mpSet )
1179 : {
1180 0 : nSplitTest = ImplTestSplit( pItems[i].mpSet, rPos,
1181 : rMouseOff, ppFoundSet, rFoundPos,
1182 0 : ((pItems[i].mnBits & SWIB_COLSET) == 0) );
1183 0 : if ( nSplitTest )
1184 0 : return nSplitTest;
1185 : }
1186 : }
1187 :
1188 0 : return 0;
1189 : }
1190 :
1191 : // -----------------------------------------------------------------------
1192 :
1193 0 : sal_uInt16 SplitWindow::ImplTestSplit( SplitWindow* pWindow, const Point& rPos,
1194 : long& rMouseOff, ImplSplitSet** ppFoundSet, sal_uInt16& rFoundPos )
1195 : {
1196 : // Resizeable SplitWindow muss anders behandelt werden
1197 0 : if ( pWindow->mnWinStyle & WB_SIZEABLE )
1198 : {
1199 : long nTPos;
1200 : long nPos;
1201 : long nBorder;
1202 :
1203 0 : if ( pWindow->mbHorz )
1204 : {
1205 0 : if ( pWindow->mbBottomRight )
1206 : {
1207 0 : nBorder = pWindow->mnBottomBorder;
1208 0 : nPos = 0;
1209 : }
1210 : else
1211 : {
1212 0 : nBorder = pWindow->mnTopBorder;
1213 0 : nPos = pWindow->mnDY-nBorder;
1214 : }
1215 0 : nTPos = rPos.Y();
1216 : }
1217 : else
1218 : {
1219 0 : if ( pWindow->mbBottomRight )
1220 : {
1221 0 : nBorder = pWindow->mnRightBorder;
1222 0 : nPos = 0;
1223 : }
1224 : else
1225 : {
1226 0 : nBorder = pWindow->mnLeftBorder;
1227 0 : nPos = pWindow->mnDX-nBorder;
1228 : }
1229 0 : nTPos = rPos.X();
1230 : }
1231 0 : long nSplitSize = pWindow->mpMainSet->mnSplitSize-2;
1232 0 : if ( pWindow->mbAutoHide || pWindow->mbFadeOut )
1233 0 : nSplitSize += SPLITWIN_SPLITSIZEEXLN;
1234 0 : if ( !pWindow->mbBottomRight )
1235 0 : nPos -= nSplitSize;
1236 0 : if ( (nTPos >= nPos) && (nTPos <= nPos+nSplitSize+nBorder) )
1237 : {
1238 0 : rMouseOff = nTPos-nPos;
1239 0 : *ppFoundSet = pWindow->mpMainSet;
1240 0 : if ( pWindow->mpMainSet->mpItems )
1241 0 : rFoundPos = pWindow->mpMainSet->mnItems-1;
1242 : else
1243 0 : rFoundPos = 0;
1244 0 : if ( pWindow->mbHorz )
1245 0 : return SPLIT_VERT | SPLIT_WINDOW;
1246 : else
1247 0 : return SPLIT_HORZ | SPLIT_WINDOW;
1248 : }
1249 : }
1250 :
1251 : return ImplTestSplit( pWindow->mpMainSet, rPos, rMouseOff, ppFoundSet, rFoundPos,
1252 0 : pWindow->mbHorz, !pWindow->mbBottomRight );
1253 : }
1254 :
1255 : // -----------------------------------------------------------------------
1256 :
1257 0 : void SplitWindow::ImplDrawSplitTracking( SplitWindow* pThis, const Point& rPos )
1258 : {
1259 0 : Rectangle aRect;
1260 :
1261 0 : if ( pThis->mnSplitTest & SPLIT_HORZ )
1262 : {
1263 0 : aRect.Top() = pThis->maDragRect.Top();
1264 0 : aRect.Bottom() = pThis->maDragRect.Bottom();
1265 0 : aRect.Left() = rPos.X();
1266 0 : aRect.Right() = aRect.Left()+pThis->mpSplitSet->mnSplitSize-1;
1267 0 : if ( !(pThis->mnWinStyle & WB_NOSPLITDRAW) )
1268 0 : aRect.Right()--;
1269 0 : if ( (pThis->mnSplitTest & SPLIT_WINDOW) &&
1270 : (pThis->mbAutoHide || pThis->mbFadeOut) )
1271 : {
1272 0 : aRect.Left() += SPLITWIN_SPLITSIZEEXLN;
1273 0 : aRect.Right() += SPLITWIN_SPLITSIZEEXLN;
1274 : }
1275 : }
1276 : else
1277 : {
1278 0 : aRect.Left() = pThis->maDragRect.Left();
1279 0 : aRect.Right() = pThis->maDragRect.Right();
1280 0 : aRect.Top() = rPos.Y();
1281 0 : aRect.Bottom() = aRect.Top()+pThis->mpSplitSet->mnSplitSize-1;
1282 0 : if ( !(pThis->mnWinStyle & WB_NOSPLITDRAW) )
1283 0 : aRect.Bottom()--;
1284 0 : if ( (pThis->mnSplitTest & SPLIT_WINDOW) &&
1285 : (pThis->mbAutoHide || pThis->mbFadeOut) )
1286 : {
1287 0 : aRect.Top() += SPLITWIN_SPLITSIZEEXLN;
1288 0 : aRect.Bottom() += SPLITWIN_SPLITSIZEEXLN;
1289 : }
1290 : }
1291 0 : pThis->ShowTracking( aRect, SHOWTRACK_SPLIT );
1292 0 : }
1293 :
1294 : // -----------------------------------------------------------------------
1295 :
1296 1920 : void SplitWindow::ImplInit( Window* pParent, WinBits nStyle )
1297 : {
1298 1920 : ImplSplitSet* pNewSet = new ImplSplitSet;
1299 1920 : pNewSet->mpItems = NULL;
1300 1920 : pNewSet->mpWallpaper = NULL;
1301 1920 : pNewSet->mpBitmap = NULL;
1302 1920 : pNewSet->mnLastSize = 0;
1303 1920 : pNewSet->mnItems = 0;
1304 1920 : pNewSet->mnId = 0;
1305 1920 : pNewSet->mnSplitSize = SPLITWIN_SPLITSIZE;
1306 1920 : pNewSet->mbCalcPix = sal_True;
1307 :
1308 1920 : mpMainSet = pNewSet;
1309 1920 : mpBaseSet = pNewSet;
1310 1920 : mpSplitSet = NULL;
1311 1920 : mpLastSizes = NULL;
1312 1920 : mnDX = 0;
1313 1920 : mnDY = 0;
1314 1920 : mnLeftBorder = 0;
1315 1920 : mnTopBorder = 0;
1316 1920 : mnRightBorder = 0;
1317 1920 : mnBottomBorder = 0;
1318 1920 : mnMaxSize = 0;
1319 1920 : mnMouseOff = 0;
1320 1920 : meAlign = WINDOWALIGN_TOP;
1321 1920 : mnWinStyle = nStyle;
1322 1920 : mnSplitTest = 0;
1323 1920 : mnSplitPos = 0;
1324 1920 : mnMouseModifier = 0;
1325 1920 : mnMStartPos = 0;
1326 1920 : mnMSplitPos = 0;
1327 1920 : mbDragFull = sal_False;
1328 1920 : mbHorz = sal_True;
1329 1920 : mbBottomRight = sal_False;
1330 1920 : mbCalc = sal_False;
1331 1920 : mbRecalc = sal_True;
1332 1920 : mbInvalidate = sal_True;
1333 1920 : mbAutoHide = sal_False;
1334 1920 : mbFadeIn = sal_False;
1335 1920 : mbFadeOut = sal_False;
1336 1920 : mbAutoHideIn = sal_False;
1337 1920 : mbAutoHideDown = sal_False;
1338 1920 : mbFadeInDown = sal_False;
1339 1920 : mbFadeOutDown = sal_False;
1340 1920 : mbAutoHidePressed = sal_False;
1341 1920 : mbFadeInPressed = sal_False;
1342 1920 : mbFadeOutPressed = sal_False;
1343 1920 : mbFadeNoButtonMode = sal_False;
1344 1920 : mbNoAlign = sal_False;
1345 :
1346 1920 : if ( nStyle & WB_NOSPLITDRAW )
1347 : {
1348 0 : pNewSet->mnSplitSize -= 2;
1349 0 : mbInvalidate = sal_False;
1350 : }
1351 :
1352 1920 : if ( nStyle & WB_BORDER )
1353 : {
1354 : ImplCalcBorder( meAlign, mbNoAlign, mnLeftBorder, mnTopBorder,
1355 1920 : mnRightBorder, mnBottomBorder );
1356 : }
1357 : else
1358 : {
1359 0 : mnLeftBorder = 0;
1360 0 : mnTopBorder = 0;
1361 0 : mnRightBorder = 0;
1362 0 : mnBottomBorder = 0;
1363 : }
1364 :
1365 1920 : DockingWindow::ImplInit( pParent, (nStyle | WB_CLIPCHILDREN) & ~(WB_BORDER | WB_SIZEABLE) );
1366 :
1367 1920 : ImplInitSettings();
1368 1920 : }
1369 :
1370 : // -----------------------------------------------------------------------
1371 :
1372 1920 : void SplitWindow::ImplInitSettings()
1373 : {
1374 : // Wenn fuer das MainSet eine Bitmap gesetzt wird, dann
1375 : // brauchen wir nicht mehr den Hintergrund loeschen
1376 : // Wenn MainSet Wallpaper hat, dann ist das der Hintergrund, ansonsten
1377 : // sind es die Standard-Farben
1378 1920 : if ( mpMainSet->mpBitmap )
1379 0 : SetBackground();
1380 1920 : else if ( mpMainSet->mpWallpaper )
1381 0 : SetBackground( *mpMainSet->mpWallpaper );
1382 : else
1383 : {
1384 1920 : const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
1385 :
1386 1920 : Color aColor;
1387 1920 : if ( IsControlBackground() )
1388 0 : aColor = GetControlBackground();
1389 1920 : else if ( Window::GetStyle() & WB_3DLOOK )
1390 1920 : aColor = rStyleSettings.GetFaceColor();
1391 : else
1392 0 : aColor = rStyleSettings.GetWindowColor();
1393 1920 : SetBackground( aColor );
1394 : }
1395 1920 : }
1396 :
1397 : // =======================================================================
1398 :
1399 1920 : SplitWindow::SplitWindow( Window* pParent, WinBits nStyle ) :
1400 1920 : DockingWindow( WINDOW_SPLITWINDOW )
1401 : {
1402 1920 : ImplInit( pParent, nStyle );
1403 1920 : }
1404 :
1405 : // -----------------------------------------------------------------------
1406 :
1407 1008 : SplitWindow::~SplitWindow()
1408 : {
1409 : // Sets loeschen
1410 504 : ImplDeleteSet( mpMainSet );
1411 504 : mpMainSet = NULL; //NULL for base-class callbacks during dtoring
1412 504 : }
1413 :
1414 : // -----------------------------------------------------------------------
1415 :
1416 0 : void SplitWindow::ImplSetWindowSize( long nDelta )
1417 : {
1418 0 : if ( !nDelta )
1419 0 : return;
1420 :
1421 0 : Size aSize = GetSizePixel();
1422 0 : switch ( meAlign )
1423 : {
1424 : case WINDOWALIGN_TOP:
1425 0 : aSize.Height() += nDelta;
1426 0 : SetSizePixel( aSize );
1427 0 : break;
1428 : case WINDOWALIGN_BOTTOM:
1429 : {
1430 0 : maDragRect.Top() += nDelta;
1431 0 : Point aPos = GetPosPixel();
1432 0 : aPos.Y() -= nDelta;
1433 0 : aSize.Height() += nDelta;
1434 0 : SetPosSizePixel( aPos, aSize );
1435 : break;
1436 : }
1437 : case WINDOWALIGN_LEFT:
1438 0 : aSize.Width() += nDelta;
1439 0 : SetSizePixel( aSize );
1440 0 : break;
1441 : case WINDOWALIGN_RIGHT:
1442 : default:
1443 : {
1444 0 : maDragRect.Left() += nDelta;
1445 0 : Point aPos = GetPosPixel();
1446 0 : aPos.X() -= nDelta;
1447 0 : aSize.Width() += nDelta;
1448 0 : SetPosSizePixel( aPos, aSize );
1449 : break;
1450 : }
1451 : }
1452 :
1453 0 : SplitResize();
1454 : }
1455 :
1456 : // -----------------------------------------------------------------------
1457 :
1458 0 : Size SplitWindow::CalcLayoutSizePixel( const Size& aNewSize )
1459 : {
1460 0 : Size aSize( aNewSize );
1461 0 : long nSplitSize = mpMainSet->mnSplitSize-2;
1462 :
1463 0 : if ( mbAutoHide || mbFadeOut )
1464 0 : nSplitSize += SPLITWIN_SPLITSIZEEXLN;
1465 :
1466 : // Wenn Fenster sizeable ist, wird die groesse automatisch nach
1467 : // dem MainSet festgelegt, wenn kein relatives Fenster enthalten
1468 : // ist
1469 0 : if ( mnWinStyle & WB_SIZEABLE )
1470 : {
1471 : long nCurSize;
1472 0 : long nCalcSize = 0;
1473 : sal_uInt16 i;
1474 :
1475 0 : for ( i = 0; i < mpMainSet->mnItems; i++ )
1476 : {
1477 0 : if ( mpMainSet->mpItems[i].mnBits & (SWIB_RELATIVESIZE | SWIB_PERCENTSIZE) )
1478 0 : break;
1479 : else
1480 0 : nCalcSize += mpMainSet->mpItems[i].mnSize;
1481 : }
1482 :
1483 0 : if ( i == mpMainSet->mnItems )
1484 : {
1485 0 : long nDelta = 0;
1486 0 : Point aPos = GetPosPixel();
1487 :
1488 0 : if ( mbHorz )
1489 0 : nCurSize = aNewSize.Height()-mnTopBorder-mnBottomBorder;
1490 : else
1491 0 : nCurSize = aNewSize.Width()-mnLeftBorder-mnRightBorder;
1492 0 : nCurSize -= nSplitSize;
1493 0 : nCurSize -= (mpMainSet->mnItems-1)*mpMainSet->mnSplitSize;
1494 :
1495 0 : nDelta = nCalcSize-nCurSize;
1496 0 : if ( !nDelta )
1497 : return aSize;
1498 :
1499 0 : switch ( meAlign )
1500 : {
1501 : case WINDOWALIGN_TOP:
1502 0 : aSize.Height() += nDelta;
1503 0 : break;
1504 : case WINDOWALIGN_BOTTOM:
1505 0 : aPos.Y() -= nDelta;
1506 0 : aSize.Height() += nDelta;
1507 0 : break;
1508 : case WINDOWALIGN_LEFT:
1509 0 : aSize.Width() += nDelta;
1510 0 : break;
1511 : case WINDOWALIGN_RIGHT:
1512 : default:
1513 0 : aPos.X() -= nDelta;
1514 0 : aSize.Width() += nDelta;
1515 0 : break;
1516 : }
1517 : }
1518 : }
1519 :
1520 0 : return aSize;
1521 : }
1522 :
1523 : // -----------------------------------------------------------------------
1524 :
1525 0 : void SplitWindow::ImplCalcLayout()
1526 : {
1527 0 : if ( !mbCalc || !mbRecalc || !mpMainSet->mpItems )
1528 0 : return;
1529 :
1530 0 : long nSplitSize = mpMainSet->mnSplitSize-2;
1531 0 : if ( mbAutoHide || mbFadeOut )
1532 0 : nSplitSize += SPLITWIN_SPLITSIZEEXLN;
1533 :
1534 : // Wenn Fenster sizeable ist, wird die groesse automatisch nach
1535 : // dem MainSet festgelegt, wenn kein relatives Fenster enthalten
1536 : // ist
1537 0 : if ( mnWinStyle & WB_SIZEABLE )
1538 : {
1539 : long nCurSize;
1540 0 : long nCalcSize = 0;
1541 : sal_uInt16 i;
1542 :
1543 0 : for ( i = 0; i < mpMainSet->mnItems; i++ )
1544 : {
1545 0 : if ( mpMainSet->mpItems[i].mnBits & (SWIB_RELATIVESIZE | SWIB_PERCENTSIZE) )
1546 0 : break;
1547 : else
1548 0 : nCalcSize += mpMainSet->mpItems[i].mnSize;
1549 : }
1550 :
1551 0 : if ( i == mpMainSet->mnItems )
1552 : {
1553 0 : if ( mbHorz )
1554 0 : nCurSize = mnDY-mnTopBorder-mnBottomBorder;
1555 : else
1556 0 : nCurSize = mnDX-mnLeftBorder-mnRightBorder;
1557 0 : nCurSize -= nSplitSize;
1558 0 : nCurSize -= (mpMainSet->mnItems-1)*mpMainSet->mnSplitSize;
1559 :
1560 0 : mbRecalc = sal_False;
1561 0 : ImplSetWindowSize( nCalcSize-nCurSize );
1562 0 : mbRecalc = sal_True;
1563 : }
1564 : }
1565 :
1566 0 : if ( (mnDX <= 0) || (mnDY <= 0) )
1567 0 : return;
1568 :
1569 : // Groessen/Position vorberechnen
1570 : long nL;
1571 : long nT;
1572 : long nW;
1573 : long nH;
1574 :
1575 0 : if ( mbHorz )
1576 : {
1577 0 : if ( mbBottomRight )
1578 0 : nT = mnDY-mnBottomBorder;
1579 : else
1580 0 : nT = mnTopBorder;
1581 0 : nL = mnLeftBorder;
1582 : }
1583 : else
1584 : {
1585 0 : if ( mbBottomRight )
1586 0 : nL = mnDX-mnRightBorder;
1587 : else
1588 0 : nL = mnLeftBorder;
1589 0 : nT = mnTopBorder;
1590 : }
1591 0 : nW = mnDX-mnLeftBorder-mnRightBorder;
1592 0 : nH = mnDY-mnTopBorder-mnBottomBorder;
1593 0 : if ( mnWinStyle & WB_SIZEABLE )
1594 : {
1595 0 : if ( mbHorz )
1596 0 : nH -= nSplitSize;
1597 : else
1598 0 : nW -= nSplitSize;
1599 : }
1600 :
1601 : // Sets rekursiv berechnen
1602 0 : ImplCalcSet( mpMainSet, nL, nT, nW, nH, mbHorz, !mbBottomRight );
1603 0 : ImplCalcSet2( this, mpMainSet, sal_False, mbHorz, !mbBottomRight );
1604 0 : mbCalc = sal_False;
1605 : }
1606 :
1607 : // -----------------------------------------------------------------------
1608 :
1609 5280 : void SplitWindow::ImplUpdate()
1610 : {
1611 5280 : mbCalc = sal_True;
1612 :
1613 5280 : if ( IsReallyShown() && IsUpdateMode() && mbRecalc )
1614 : {
1615 0 : if ( mpMainSet->mpItems )
1616 0 : ImplCalcLayout();
1617 : else
1618 0 : Invalidate();
1619 : }
1620 5280 : }
1621 :
1622 : // -----------------------------------------------------------------------
1623 :
1624 0 : void SplitWindow::ImplSplitMousePos( Point& rMousePos )
1625 : {
1626 0 : if ( mnSplitTest & SPLIT_HORZ )
1627 : {
1628 0 : rMousePos.X() -= mnMouseOff;
1629 0 : if ( rMousePos.X() < maDragRect.Left() )
1630 0 : rMousePos.X() = maDragRect.Left();
1631 0 : else if ( rMousePos.X()+mpSplitSet->mnSplitSize+1 > maDragRect.Right() )
1632 0 : rMousePos.X() = maDragRect.Right()-mpSplitSet->mnSplitSize+1;
1633 : // Wegen FullDrag in Screen-Koordinaaten merken
1634 0 : mnMSplitPos = OutputToScreenPixel( rMousePos ).X();
1635 : }
1636 : else
1637 : {
1638 0 : rMousePos.Y() -= mnMouseOff;
1639 0 : if ( rMousePos.Y() < maDragRect.Top() )
1640 0 : rMousePos.Y() = maDragRect.Top();
1641 0 : else if ( rMousePos.Y()+mpSplitSet->mnSplitSize+1 > maDragRect.Bottom() )
1642 0 : rMousePos.Y() = maDragRect.Bottom()-mpSplitSet->mnSplitSize+1;
1643 0 : mnMSplitPos = OutputToScreenPixel( rMousePos ).Y();
1644 : }
1645 0 : }
1646 :
1647 : // -----------------------------------------------------------------------
1648 :
1649 0 : void SplitWindow::ImplGetButtonRect( Rectangle& rRect, long nEx, sal_Bool bTest ) const
1650 : {
1651 0 : long nSplitSize = mpMainSet->mnSplitSize-2;
1652 0 : if ( mbAutoHide || mbFadeOut || mbFadeIn )
1653 0 : nSplitSize += SPLITWIN_SPLITSIZEEX;
1654 :
1655 0 : long nButtonSize = 0;
1656 0 : if ( mbFadeIn )
1657 0 : nButtonSize += SPLITWIN_SPLITSIZEFADE+1;
1658 0 : if ( mbFadeOut )
1659 0 : nButtonSize += SPLITWIN_SPLITSIZEFADE+1;
1660 0 : if ( mbAutoHide )
1661 0 : nButtonSize += SPLITWIN_SPLITSIZEAUTOHIDE+1;
1662 0 : long nCenterEx = 0;
1663 0 : if ( mbHorz )
1664 0 : nCenterEx += ((mnDX-mnLeftBorder-mnRightBorder)-nButtonSize)/2;
1665 : else
1666 0 : nCenterEx += ((mnDY-mnTopBorder-mnBottomBorder)-nButtonSize)/2;
1667 0 : if ( nCenterEx > 0 )
1668 0 : nEx += nCenterEx;
1669 :
1670 0 : switch ( meAlign )
1671 : {
1672 : case WINDOWALIGN_TOP:
1673 0 : rRect.Left() = mnLeftBorder+nEx;
1674 0 : rRect.Top() = mnDY-mnBottomBorder-nSplitSize;
1675 0 : rRect.Right() = rRect.Left()+SPLITWIN_SPLITSIZEAUTOHIDE;
1676 0 : rRect.Bottom() = mnDY-mnBottomBorder-1;
1677 0 : if ( bTest )
1678 : {
1679 0 : rRect.Top() -= mnTopBorder;
1680 0 : rRect.Bottom() += mnBottomBorder;
1681 : }
1682 0 : break;
1683 : case WINDOWALIGN_BOTTOM:
1684 0 : rRect.Left() = mnLeftBorder+nEx;
1685 0 : rRect.Top() = mnTopBorder;
1686 0 : rRect.Right() = rRect.Left()+SPLITWIN_SPLITSIZEAUTOHIDE;
1687 0 : rRect.Bottom() = mnTopBorder+nSplitSize-1;
1688 0 : if ( bTest )
1689 : {
1690 0 : rRect.Top() -= mnTopBorder;
1691 0 : rRect.Bottom() += mnBottomBorder;
1692 : }
1693 0 : break;
1694 : case WINDOWALIGN_LEFT:
1695 0 : rRect.Left() = mnDX-mnRightBorder-nSplitSize;
1696 0 : rRect.Top() = mnTopBorder+nEx;
1697 0 : rRect.Right() = mnDX-mnRightBorder-1;
1698 0 : rRect.Bottom() = rRect.Top()+SPLITWIN_SPLITSIZEAUTOHIDE;
1699 0 : if ( bTest )
1700 : {
1701 0 : rRect.Left() -= mnLeftBorder;
1702 0 : rRect.Right() += mnRightBorder;
1703 : }
1704 0 : break;
1705 : case WINDOWALIGN_RIGHT:
1706 0 : rRect.Left() = mnLeftBorder;
1707 0 : rRect.Top() = mnTopBorder+nEx;
1708 0 : rRect.Right() = mnLeftBorder+nSplitSize-1;
1709 0 : rRect.Bottom() = rRect.Top()+SPLITWIN_SPLITSIZEAUTOHIDE;
1710 0 : if ( bTest )
1711 : {
1712 0 : rRect.Left() -= mnLeftBorder;
1713 0 : rRect.Right() += mnRightBorder;
1714 : }
1715 0 : break;
1716 : }
1717 0 : }
1718 :
1719 : // -----------------------------------------------------------------------
1720 :
1721 0 : void SplitWindow::ImplGetAutoHideRect( Rectangle& rRect, sal_Bool bTest ) const
1722 : {
1723 0 : Rectangle aRect;
1724 :
1725 0 : if ( mbAutoHide )
1726 : {
1727 0 : long nEx = 0;
1728 0 : if ( mbFadeIn || mbFadeOut )
1729 0 : nEx = SPLITWIN_SPLITSIZEFADE+1;
1730 0 : ImplGetButtonRect( aRect, nEx, bTest && mbFadeIn );
1731 : }
1732 :
1733 0 : rRect = aRect;
1734 0 : }
1735 :
1736 : // -----------------------------------------------------------------------
1737 :
1738 0 : void SplitWindow::ImplGetFadeInRect( Rectangle& rRect, sal_Bool bTest ) const
1739 : {
1740 0 : Rectangle aRect;
1741 :
1742 0 : if ( mbFadeIn )
1743 0 : ImplGetButtonRect( aRect, 0, bTest );
1744 :
1745 0 : rRect = aRect;
1746 0 : }
1747 :
1748 : // -----------------------------------------------------------------------
1749 :
1750 0 : void SplitWindow::ImplGetFadeOutRect( Rectangle& rRect, sal_Bool ) const
1751 : {
1752 0 : Rectangle aRect;
1753 :
1754 0 : if ( mbFadeOut )
1755 0 : ImplGetButtonRect( aRect, 0, sal_False );
1756 :
1757 0 : rRect = aRect;
1758 0 : }
1759 :
1760 : // -----------------------------------------------------------------------
1761 :
1762 0 : void SplitWindow::ImplDrawButtonRect( const Rectangle& rRect, long nSize )
1763 : {
1764 0 : const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
1765 :
1766 0 : if ( mbHorz )
1767 : {
1768 0 : long nLeft = rRect.Left();
1769 0 : long nRight = rRect.Right();
1770 0 : long nCenter = rRect.Center().Y();
1771 0 : long nEx1 = nLeft+((rRect.GetWidth()-nSize)/2)-2;
1772 0 : long nEx2 = nEx1+nSize+3;
1773 0 : SetLineColor( rStyleSettings.GetLightColor() );
1774 0 : DrawLine( Point( rRect.Left(), rRect.Top() ), Point( rRect.Left(), rRect.Bottom() ) );
1775 0 : DrawLine( Point( rRect.Left(), rRect.Top() ), Point( rRect.Right(), rRect.Top() ) );
1776 0 : SetLineColor( rStyleSettings.GetShadowColor() );
1777 0 : DrawLine( Point( rRect.Right(), rRect.Top() ), Point( rRect.Right(), rRect.Bottom() ) );
1778 0 : DrawLine( Point( rRect.Left(), rRect.Bottom() ), Point( rRect.Right(), rRect.Bottom() ) );
1779 0 : long i = nLeft+2;
1780 0 : while ( i < nRight-3 )
1781 : {
1782 0 : if ( (i < nEx1) || (i > nEx2 ) )
1783 : {
1784 0 : DrawPixel( Point( i, nCenter-2 ), rStyleSettings.GetLightColor() );
1785 0 : DrawPixel( Point( i+1, nCenter-2+1 ), rStyleSettings.GetShadowColor() );
1786 : }
1787 0 : i++;
1788 0 : if ( (i < nEx1) || ((i > nEx2 ) && (i < nRight-3)) )
1789 : {
1790 0 : DrawPixel( Point( i, nCenter+2 ), rStyleSettings.GetLightColor() );
1791 0 : DrawPixel( Point( i+1, nCenter+2+1 ), rStyleSettings.GetShadowColor() );
1792 : }
1793 0 : i += 2;
1794 : }
1795 : }
1796 : else
1797 : {
1798 0 : long nTop = rRect.Top();
1799 0 : long nBottom = rRect.Bottom();
1800 0 : long nCenter = rRect.Center().X();
1801 0 : long nEx1 = nTop+((rRect.GetHeight()-nSize)/2)-2;
1802 0 : long nEx2 = nEx1+nSize+3;
1803 0 : SetLineColor( rStyleSettings.GetLightColor() );
1804 0 : DrawLine( Point( rRect.Left(), rRect.Top() ), Point( rRect.Right(), rRect.Top() ) );
1805 0 : DrawLine( Point( rRect.Left(), rRect.Top() ), Point( rRect.Left(), rRect.Bottom() ) );
1806 0 : SetLineColor( rStyleSettings.GetShadowColor() );
1807 0 : DrawLine( Point( rRect.Right(), rRect.Top() ), Point( rRect.Right(), rRect.Bottom() ) );
1808 0 : DrawLine( Point( rRect.Left(), rRect.Bottom() ), Point( rRect.Right(), rRect.Bottom() ) );
1809 0 : long i = nTop+2;
1810 0 : while ( i < nBottom-3 )
1811 : {
1812 0 : if ( (i < nEx1) || (i > nEx2 ) )
1813 : {
1814 0 : DrawPixel( Point( nCenter-2, i ), rStyleSettings.GetLightColor() );
1815 0 : DrawPixel( Point( nCenter-2+1, i+1 ), rStyleSettings.GetShadowColor() );
1816 : }
1817 0 : i++;
1818 0 : if ( (i < nEx1) || ((i > nEx2 ) && (i < nBottom-3)) )
1819 : {
1820 0 : DrawPixel( Point( nCenter+2, i ), rStyleSettings.GetLightColor() );
1821 0 : DrawPixel( Point( nCenter+2+1, i+1 ), rStyleSettings.GetShadowColor() );
1822 : }
1823 0 : i += 2;
1824 : }
1825 : }
1826 0 : }
1827 :
1828 : // -----------------------------------------------------------------------
1829 :
1830 0 : void SplitWindow::ImplDrawAutoHide( sal_Bool bInPaint )
1831 : {
1832 0 : if ( mbAutoHide )
1833 : {
1834 0 : Rectangle aTempRect;
1835 0 : ImplGetAutoHideRect( aTempRect );
1836 :
1837 0 : if ( !bInPaint )
1838 0 : Erase( aTempRect );
1839 :
1840 : // ImageListe laden, wenn noch nicht vorhanden
1841 0 : ImplSVData* pSVData = ImplGetSVData();
1842 : ImageList* pImageList;
1843 0 : if ( mbHorz )
1844 : {
1845 0 : if ( !pSVData->maCtrlData.mpSplitHPinImgList )
1846 : {
1847 0 : ResMgr* pResMgr = ImplGetResMgr();
1848 0 : if( pResMgr )
1849 : {
1850 0 : Color aNonAlphaMask( 0x00, 0x00, 0xFF );
1851 0 : pSVData->maCtrlData.mpSplitHPinImgList = new ImageList(4);
1852 : pSVData->maCtrlData.mpSplitHPinImgList->InsertFromHorizontalBitmap
1853 0 : ( ResId( SV_RESID_BITMAP_SPLITHPIN, *pResMgr ), 4, &aNonAlphaMask );
1854 : }
1855 : }
1856 0 : pImageList = pSVData->maCtrlData.mpSplitHPinImgList;
1857 : }
1858 : else
1859 : {
1860 0 : if ( !pSVData->maCtrlData.mpSplitVPinImgList )
1861 : {
1862 0 : ResMgr* pResMgr = ImplGetResMgr();
1863 0 : pSVData->maCtrlData.mpSplitVPinImgList = new ImageList(4);
1864 0 : if( pResMgr )
1865 : {
1866 0 : Color aNonAlphaMask( 0x00, 0x00, 0xFF );
1867 : pSVData->maCtrlData.mpSplitVPinImgList->InsertFromHorizontalBitmap
1868 0 : ( ResId( SV_RESID_BITMAP_SPLITVPIN, *pResMgr ), 4, &aNonAlphaMask );
1869 : }
1870 : }
1871 0 : pImageList = pSVData->maCtrlData.mpSplitVPinImgList;
1872 : }
1873 :
1874 : // Image ermitteln und zurueckgeben
1875 : sal_uInt16 nId;
1876 0 : if ( mbAutoHidePressed )
1877 : {
1878 0 : if ( mbAutoHideIn )
1879 0 : nId = 3;
1880 : else
1881 0 : nId = 4;
1882 : }
1883 : else
1884 : {
1885 0 : if ( mbAutoHideIn )
1886 0 : nId = 1;
1887 : else
1888 0 : nId = 2;
1889 : }
1890 :
1891 0 : Image aImage = pImageList->GetImage( nId );
1892 0 : Size aImageSize = aImage.GetSizePixel();
1893 0 : Point aPos( aTempRect.Left()+((aTempRect.GetWidth()-aImageSize.Width())/2),
1894 0 : aTempRect.Top()+((aTempRect.GetHeight()-aImageSize.Height())/2) );
1895 : long nSize;
1896 0 : if ( mbHorz )
1897 0 : nSize = aImageSize.Width();
1898 : else
1899 0 : nSize = aImageSize.Height();
1900 0 : ImplDrawButtonRect( aTempRect, nSize );
1901 0 : DrawImage( aPos, aImage );
1902 : }
1903 0 : }
1904 :
1905 : // -----------------------------------------------------------------------
1906 :
1907 0 : void SplitWindow::ImplDrawFadeArrow( const Point& rPt, sal_Bool bHorz, sal_Bool bLeft )
1908 : {
1909 0 : const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
1910 :
1911 0 : int x( rPt.X() );
1912 0 : int y( rPt.Y() );
1913 :
1914 0 : Color aCol;
1915 0 : if( !bHorz )
1916 : {
1917 0 : int dx = 1;
1918 0 : if( bLeft )
1919 : {
1920 0 : x ++;
1921 0 : dx = -1;
1922 : }
1923 :
1924 0 : x++; y++;
1925 0 : aCol = Color( COL_WHITE );
1926 0 : DrawPixel( Point(x, y), aCol );
1927 0 : DrawPixel( Point(x, y+1), aCol );
1928 0 : DrawPixel( Point(x, y+2), aCol );
1929 0 : DrawPixel( Point(x+dx, y+1), aCol );
1930 :
1931 0 : x--; y--;
1932 0 : aCol = rStyleSettings.GetDarkShadowColor();
1933 0 : DrawPixel( Point(x, y), rStyleSettings.GetDarkShadowColor() );
1934 0 : DrawPixel( Point(x, y+1), rStyleSettings.GetDarkShadowColor() );
1935 0 : DrawPixel( Point(x, y+2), rStyleSettings.GetDarkShadowColor() );
1936 0 : DrawPixel( Point(x+dx, y+1), rStyleSettings.GetDarkShadowColor() );
1937 : }
1938 : else
1939 : {
1940 0 : int dy = 1;
1941 0 : if( bLeft )
1942 : {
1943 0 : y ++;
1944 0 : dy = -1;
1945 : }
1946 :
1947 0 : x++; y++;
1948 0 : aCol = Color( COL_WHITE );
1949 0 : DrawPixel( Point(x, y), aCol );
1950 0 : DrawPixel( Point(x+1, y), aCol );
1951 0 : DrawPixel( Point(x+2, y), aCol );
1952 0 : DrawPixel( Point(x+1, y+dy), aCol );
1953 :
1954 0 : x--; y--;
1955 0 : aCol = rStyleSettings.GetDarkShadowColor();
1956 0 : DrawPixel( Point(x, y), aCol );
1957 0 : DrawPixel( Point(x+1, y), aCol );
1958 0 : DrawPixel( Point(x+2, y), aCol );
1959 0 : DrawPixel( Point(x+1, y+dy), aCol );
1960 : }
1961 0 : }
1962 :
1963 0 : void SplitWindow::ImplDrawGrip( const Rectangle& rRect, sal_Bool bHorz, sal_Bool bLeft )
1964 : {
1965 0 : const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
1966 :
1967 0 : if( rRect.IsInside( GetPointerPosPixel() ) )
1968 : {
1969 0 : DrawWallpaper( rRect, Wallpaper( Color( COL_WHITE ) ) );
1970 0 : DrawSelectionBackground( rRect, 2, sal_False, sal_False, sal_False );
1971 : }
1972 :
1973 0 : if( bHorz )
1974 : {
1975 0 : int width = (int) (0.5 * rRect.getWidth() + 0.5);
1976 0 : int i = rRect.Left() + (rRect.getWidth() - width) / 2;
1977 0 : width += i;
1978 0 : const int y = rRect.Top() + 1;
1979 0 : ImplDrawFadeArrow( Point( i-8, y), bHorz, bLeft );
1980 0 : while( i <= width )
1981 : {
1982 :
1983 0 : DrawPixel( Point(i, y), rStyleSettings.GetDarkShadowColor() );
1984 0 : DrawPixel( Point(i+1, y), rStyleSettings.GetShadowColor() );
1985 :
1986 0 : DrawPixel( Point(i, y+1), rStyleSettings.GetShadowColor() );
1987 0 : DrawPixel( Point(i+1, y+1), rStyleSettings.GetFaceColor() );
1988 0 : DrawPixel( Point(i+2, y+1), Color(COL_WHITE) );
1989 :
1990 0 : DrawPixel( Point(i+1, y+2), Color(COL_WHITE) );
1991 0 : DrawPixel( Point(i+2, y+2), Color(COL_WHITE) );
1992 0 : i+=4;
1993 : }
1994 0 : ImplDrawFadeArrow( Point( i+3, y), bHorz, bLeft );
1995 : }
1996 : else
1997 : {
1998 0 : int height = (int) (0.5 * rRect.getHeight() + 0.5);
1999 0 : int i = rRect.Top() + (rRect.getHeight() - height) / 2;
2000 0 : height += i;
2001 0 : const int x = rRect.Left() + 1;
2002 0 : ImplDrawFadeArrow( Point( x, i-8), bHorz, bLeft );
2003 0 : while( i <= height )
2004 : {
2005 :
2006 0 : DrawPixel( Point(x, i), rStyleSettings.GetDarkShadowColor() );
2007 0 : DrawPixel( Point(x+1, i), rStyleSettings.GetShadowColor() );
2008 :
2009 0 : DrawPixel( Point(x, i+1), rStyleSettings.GetShadowColor() );
2010 0 : DrawPixel( Point(x+1, i+1), rStyleSettings.GetFaceColor() );
2011 0 : DrawPixel( Point(x+2, i+1), Color(COL_WHITE) );
2012 :
2013 0 : DrawPixel( Point(x+1, i+2), Color(COL_WHITE) );
2014 0 : DrawPixel( Point(x+2, i+2), Color(COL_WHITE) );
2015 0 : i+=4;
2016 : }
2017 0 : ImplDrawFadeArrow( Point( x, i+3), bHorz, bLeft );
2018 : }
2019 0 : }
2020 :
2021 0 : void SplitWindow::ImplDrawFadeIn( sal_Bool bInPaint )
2022 : {
2023 0 : if ( mbFadeIn )
2024 : {
2025 0 : Rectangle aTempRect;
2026 0 : ImplGetFadeInRect( aTempRect );
2027 :
2028 0 : sal_Bool bLeft = sal_True;
2029 0 : switch ( meAlign )
2030 : {
2031 : case WINDOWALIGN_TOP:
2032 : case WINDOWALIGN_LEFT:
2033 0 : bLeft = sal_False;
2034 0 : break;
2035 : case WINDOWALIGN_BOTTOM:
2036 : case WINDOWALIGN_RIGHT:
2037 : default:
2038 0 : bLeft = sal_True;
2039 0 : break;
2040 : }
2041 :
2042 0 : if ( !bInPaint )
2043 0 : Erase( aTempRect );
2044 :
2045 0 : ImplDrawGrip( aTempRect, (meAlign == WINDOWALIGN_TOP) || (meAlign == WINDOWALIGN_BOTTOM), bLeft );
2046 : }
2047 0 : }
2048 :
2049 : // -----------------------------------------------------------------------
2050 :
2051 0 : void SplitWindow::ImplDrawFadeOut( sal_Bool bInPaint )
2052 : {
2053 0 : if ( mbFadeOut )
2054 : {
2055 0 : Rectangle aTempRect;
2056 0 : ImplGetFadeOutRect( aTempRect );
2057 :
2058 0 : sal_Bool bLeft = sal_True;
2059 0 : switch ( meAlign )
2060 : {
2061 : case WINDOWALIGN_BOTTOM:
2062 : case WINDOWALIGN_RIGHT:
2063 0 : bLeft = sal_False;
2064 0 : break;
2065 : case WINDOWALIGN_TOP:
2066 : case WINDOWALIGN_LEFT:
2067 : default:
2068 0 : bLeft = sal_True;
2069 0 : break;
2070 : }
2071 :
2072 0 : if ( !bInPaint )
2073 0 : Erase( aTempRect );
2074 :
2075 0 : ImplDrawGrip( aTempRect, (meAlign == WINDOWALIGN_TOP) || (meAlign == WINDOWALIGN_BOTTOM), bLeft );
2076 : }
2077 0 : }
2078 :
2079 : // -----------------------------------------------------------------------
2080 0 : void SplitWindow::ImplStartSplit( const MouseEvent& rMEvt )
2081 : {
2082 0 : Point aMousePosPixel = rMEvt.GetPosPixel();
2083 0 : mnSplitTest = ImplTestSplit( this, aMousePosPixel, mnMouseOff, &mpSplitSet, mnSplitPos );
2084 :
2085 0 : if ( mnSplitTest && !(mnSplitTest & SPLIT_NOSPLIT) )
2086 : {
2087 : ImplSplitItem* pSplitItem;
2088 : long nCurMaxSize;
2089 : sal_uInt16 nTemp;
2090 : sal_Bool bDown;
2091 : sal_Bool bPropSmaller;
2092 :
2093 0 : mnMouseModifier = rMEvt.GetModifier();
2094 0 : if ( !(mnMouseModifier & KEY_SHIFT) || (mnSplitPos+1 >= mpSplitSet->mnItems) )
2095 0 : bPropSmaller = sal_False;
2096 : else
2097 0 : bPropSmaller = sal_True;
2098 :
2099 : // Hier kann noch die maximale Groesse gesetzt werden
2100 0 : StartSplit();
2101 :
2102 0 : if ( mnMaxSize )
2103 0 : nCurMaxSize = mnMaxSize;
2104 : else
2105 : {
2106 0 : Size aSize = GetParent()->GetOutputSizePixel();
2107 0 : if ( mbHorz )
2108 0 : nCurMaxSize = aSize.Height();
2109 : else
2110 0 : nCurMaxSize = aSize.Width();
2111 : }
2112 :
2113 0 : if ( mpSplitSet->mpItems )
2114 : {
2115 0 : bDown = sal_True;
2116 0 : if ( (mpSplitSet == mpMainSet) && mbBottomRight )
2117 0 : bDown = sal_False;
2118 :
2119 0 : pSplitItem = &(mpSplitSet->mpItems[mnSplitPos]);
2120 0 : maDragRect.Left() = pSplitItem->mnLeft;
2121 0 : maDragRect.Top() = pSplitItem->mnTop;
2122 0 : maDragRect.Right() = pSplitItem->mnLeft+pSplitItem->mnWidth-1;
2123 0 : maDragRect.Bottom() = pSplitItem->mnTop+pSplitItem->mnHeight-1;
2124 :
2125 0 : if ( mnSplitTest & SPLIT_HORZ )
2126 : {
2127 0 : if ( bDown )
2128 0 : maDragRect.Right() += mpSplitSet->mnSplitSize;
2129 : else
2130 0 : maDragRect.Left() -= mpSplitSet->mnSplitSize;
2131 : }
2132 : else
2133 : {
2134 0 : if ( bDown )
2135 0 : maDragRect.Bottom() += mpSplitSet->mnSplitSize;
2136 : else
2137 0 : maDragRect.Top() -= mpSplitSet->mnSplitSize;
2138 : }
2139 :
2140 0 : if ( mnSplitPos )
2141 : {
2142 0 : nTemp = mnSplitPos;
2143 0 : while ( nTemp )
2144 : {
2145 0 : pSplitItem = &(mpSplitSet->mpItems[nTemp-1]);
2146 0 : if ( pSplitItem->mbFixed )
2147 0 : break;
2148 : else
2149 : {
2150 0 : if ( mnSplitTest & SPLIT_HORZ )
2151 : {
2152 0 : if ( bDown )
2153 0 : maDragRect.Left() -= pSplitItem->mnPixSize;
2154 : else
2155 0 : maDragRect.Right() += pSplitItem->mnPixSize;
2156 : }
2157 : else
2158 : {
2159 0 : if ( bDown )
2160 0 : maDragRect.Top() -= pSplitItem->mnPixSize;
2161 : else
2162 0 : maDragRect.Bottom() += pSplitItem->mnPixSize;
2163 : }
2164 : }
2165 0 : nTemp--;
2166 : }
2167 : }
2168 :
2169 0 : if ( (mpSplitSet == mpMainSet) && (mnWinStyle & WB_SIZEABLE) && !bPropSmaller )
2170 : {
2171 0 : if ( bDown )
2172 : {
2173 0 : if ( mbHorz )
2174 0 : maDragRect.Bottom() += nCurMaxSize-mnDY-mnTopBorder;
2175 : else
2176 0 : maDragRect.Right() += nCurMaxSize-mnDX-mnLeftBorder;
2177 : }
2178 : else
2179 : {
2180 0 : if ( mbHorz )
2181 0 : maDragRect.Top() -= nCurMaxSize-mnDY-mnBottomBorder;
2182 : else
2183 0 : maDragRect.Left() -= nCurMaxSize-mnDX-mnRightBorder;
2184 : }
2185 : }
2186 : else
2187 : {
2188 0 : nTemp = mnSplitPos+1;
2189 0 : while ( nTemp < mpSplitSet->mnItems )
2190 : {
2191 0 : pSplitItem = &(mpSplitSet->mpItems[nTemp]);
2192 0 : if ( pSplitItem->mbFixed )
2193 0 : break;
2194 : else
2195 : {
2196 0 : if ( mnSplitTest & SPLIT_HORZ )
2197 : {
2198 0 : if ( bDown )
2199 0 : maDragRect.Right() += pSplitItem->mnPixSize;
2200 : else
2201 0 : maDragRect.Left() -= pSplitItem->mnPixSize;
2202 : }
2203 : else
2204 : {
2205 0 : if ( bDown )
2206 0 : maDragRect.Bottom() += pSplitItem->mnPixSize;
2207 : else
2208 0 : maDragRect.Top() -= pSplitItem->mnPixSize;
2209 : }
2210 : }
2211 0 : nTemp++;
2212 : }
2213 : }
2214 : }
2215 : else
2216 : {
2217 0 : maDragRect.Left() = mnLeftBorder;
2218 0 : maDragRect.Top() = mnTopBorder;
2219 0 : maDragRect.Right() = mnDX-mnRightBorder-1;
2220 0 : maDragRect.Bottom() = mnDY-mnBottomBorder-1;
2221 0 : if ( mbHorz )
2222 : {
2223 0 : if ( mbBottomRight )
2224 0 : maDragRect.Top() -= nCurMaxSize-mnDY-mnBottomBorder;
2225 : else
2226 0 : maDragRect.Bottom() += nCurMaxSize-mnDY-mnTopBorder;
2227 : }
2228 : else
2229 : {
2230 0 : if ( mbBottomRight )
2231 0 : maDragRect.Left() -= nCurMaxSize-mnDX-mnRightBorder;
2232 : else
2233 0 : maDragRect.Right() += nCurMaxSize-mnDX-mnLeftBorder;
2234 : }
2235 : }
2236 :
2237 0 : StartTracking();
2238 :
2239 0 : mbDragFull = (GetSettings().GetStyleSettings().GetDragFullOptions() & DRAGFULL_OPTION_SPLIT) != 0;
2240 :
2241 0 : ImplSplitMousePos( aMousePosPixel );
2242 :
2243 0 : if ( !mbDragFull )
2244 0 : ImplDrawSplitTracking( this, aMousePosPixel );
2245 : else
2246 : {
2247 0 : ImplSplitItem* pItems = mpSplitSet->mpItems;
2248 0 : sal_uInt16 nItems = mpSplitSet->mnItems;
2249 0 : mpLastSizes = new long[nItems*2];
2250 0 : for ( sal_uInt16 i = 0; i < nItems; i++ )
2251 : {
2252 0 : mpLastSizes[i*2] = pItems[i].mnSize;
2253 0 : mpLastSizes[i*2+1] = pItems[i].mnPixSize;
2254 : }
2255 : }
2256 0 : mnMStartPos = mnMSplitPos;
2257 :
2258 0 : PointerStyle eStyle = POINTER_ARROW;
2259 0 : if ( mnSplitTest & SPLIT_HORZ )
2260 0 : eStyle = POINTER_HSPLIT;
2261 0 : else if ( mnSplitTest & SPLIT_VERT )
2262 0 : eStyle = POINTER_VSPLIT;
2263 :
2264 0 : Pointer aPtr( eStyle );
2265 0 : SetPointer( aPtr );
2266 : }
2267 0 : }
2268 :
2269 :
2270 : // -----------------------------------------------------------------------
2271 :
2272 0 : void SplitWindow::StartSplit()
2273 : {
2274 0 : maStartSplitHdl.Call( this );
2275 0 : }
2276 :
2277 : // -----------------------------------------------------------------------
2278 :
2279 0 : void SplitWindow::Split()
2280 : {
2281 0 : maSplitHdl.Call( this );
2282 0 : }
2283 :
2284 : // -----------------------------------------------------------------------
2285 :
2286 0 : void SplitWindow::SplitResize()
2287 : {
2288 0 : maSplitResizeHdl.Call( this );
2289 0 : }
2290 :
2291 : // -----------------------------------------------------------------------
2292 :
2293 0 : void SplitWindow::AutoHide()
2294 : {
2295 0 : maAutoHideHdl.Call( this );
2296 0 : }
2297 :
2298 : // -----------------------------------------------------------------------
2299 :
2300 0 : void SplitWindow::FadeIn()
2301 : {
2302 0 : maFadeInHdl.Call( this );
2303 0 : }
2304 :
2305 : // -----------------------------------------------------------------------
2306 :
2307 0 : void SplitWindow::FadeOut()
2308 : {
2309 0 : maFadeOutHdl.Call( this );
2310 0 : }
2311 :
2312 : // -----------------------------------------------------------------------
2313 :
2314 0 : void SplitWindow::MouseButtonDown( const MouseEvent& rMEvt )
2315 : {
2316 0 : if ( !rMEvt.IsLeft() || rMEvt.IsMod2() )
2317 : {
2318 0 : DockingWindow::MouseButtonDown( rMEvt );
2319 : return;
2320 : }
2321 :
2322 0 : Point aMousePosPixel = rMEvt.GetPosPixel();
2323 0 : Rectangle aTestRect;
2324 :
2325 0 : mbFadeNoButtonMode = sal_False;
2326 0 : ImplGetAutoHideRect( aTestRect, sal_True );
2327 0 : if ( aTestRect.IsInside( aMousePosPixel ) )
2328 : {
2329 0 : mbAutoHideDown = sal_True;
2330 0 : mbAutoHidePressed = sal_True;
2331 0 : ImplDrawAutoHide( sal_False );
2332 : }
2333 : else
2334 : {
2335 0 : ImplGetFadeOutRect( aTestRect, sal_True );
2336 0 : if ( aTestRect.IsInside( aMousePosPixel ) )
2337 : {
2338 0 : mbFadeOutDown = sal_True;
2339 0 : mbFadeOutPressed = sal_True;
2340 0 : ImplDrawFadeOut( sal_False );
2341 : }
2342 : else
2343 : {
2344 0 : ImplGetFadeInRect( aTestRect, sal_True );
2345 0 : if ( aTestRect.IsInside( aMousePosPixel ) )
2346 : {
2347 0 : mbFadeInDown = sal_True;
2348 0 : mbFadeInPressed = sal_True;
2349 0 : ImplDrawFadeIn( sal_False );
2350 : }
2351 0 : else if ( !aTestRect.IsEmpty() && !(mnWinStyle & WB_SIZEABLE) )
2352 : {
2353 0 : mbFadeNoButtonMode = sal_True;
2354 0 : FadeIn();
2355 : return;
2356 : }
2357 : }
2358 : }
2359 :
2360 0 : if ( mbAutoHideDown || mbFadeInDown || mbFadeOutDown )
2361 0 : StartTracking();
2362 : else
2363 0 : ImplStartSplit( rMEvt );
2364 : }
2365 :
2366 : // -----------------------------------------------------------------------
2367 :
2368 0 : void SplitWindow::MouseMove( const MouseEvent& rMEvt )
2369 : {
2370 0 : if ( !IsTracking() )
2371 : {
2372 0 : Point aPos = rMEvt.GetPosPixel();
2373 : long nTemp;
2374 : ImplSplitSet* pTempSplitSet;
2375 : sal_uInt16 nTempSplitPos;
2376 0 : sal_uInt16 nSplitTest = ImplTestSplit( this, aPos, nTemp, &pTempSplitSet, nTempSplitPos );
2377 0 : PointerStyle eStyle = POINTER_ARROW;
2378 0 : Rectangle aAutoHideRect;
2379 0 : Rectangle aFadeInRect;
2380 0 : Rectangle aFadeOutRect;
2381 :
2382 0 : ImplGetAutoHideRect( aAutoHideRect );
2383 0 : ImplGetFadeInRect( aFadeInRect );
2384 0 : ImplGetFadeOutRect( aFadeOutRect );
2385 0 : if ( !aAutoHideRect.IsInside( aPos ) &&
2386 0 : !aFadeInRect.IsInside( aPos ) &&
2387 0 : !aFadeOutRect.IsInside( aPos ) )
2388 : {
2389 0 : if ( nSplitTest && !(nSplitTest & SPLIT_NOSPLIT) )
2390 : {
2391 0 : if ( nSplitTest & SPLIT_HORZ )
2392 0 : eStyle = POINTER_HSPLIT;
2393 0 : else if ( nSplitTest & SPLIT_VERT )
2394 0 : eStyle = POINTER_VSPLIT;
2395 : }
2396 : }
2397 :
2398 0 : Pointer aPtr( eStyle );
2399 0 : SetPointer( aPtr );
2400 : }
2401 0 : }
2402 :
2403 : // -----------------------------------------------------------------------
2404 :
2405 0 : void SplitWindow::Tracking( const TrackingEvent& rTEvt )
2406 : {
2407 0 : Point aMousePosPixel = rTEvt.GetMouseEvent().GetPosPixel();
2408 :
2409 0 : if ( mbAutoHideDown )
2410 : {
2411 0 : if ( rTEvt.IsTrackingEnded() )
2412 : {
2413 0 : mbAutoHideDown = sal_False;
2414 0 : if ( mbAutoHidePressed )
2415 : {
2416 0 : mbAutoHidePressed = sal_False;
2417 :
2418 0 : if ( !rTEvt.IsTrackingCanceled() )
2419 : {
2420 0 : mbAutoHideIn = !mbAutoHideIn;
2421 0 : ImplDrawAutoHide( sal_False );
2422 0 : AutoHide();
2423 : }
2424 : else
2425 0 : ImplDrawAutoHide( sal_False );
2426 : }
2427 : }
2428 : else
2429 : {
2430 0 : Rectangle aTestRect;
2431 0 : ImplGetAutoHideRect( aTestRect, sal_True );
2432 0 : sal_Bool bNewPressed = aTestRect.IsInside( aMousePosPixel );
2433 0 : if ( bNewPressed != mbAutoHidePressed )
2434 : {
2435 0 : mbAutoHidePressed = bNewPressed;
2436 0 : ImplDrawAutoHide( sal_False );
2437 : }
2438 : }
2439 : }
2440 0 : else if ( mbFadeInDown )
2441 : {
2442 0 : if ( rTEvt.IsTrackingEnded() )
2443 : {
2444 0 : mbFadeInDown = sal_False;
2445 0 : if ( mbFadeInPressed )
2446 : {
2447 0 : mbFadeInPressed = sal_False;
2448 0 : ImplDrawFadeIn( sal_False );
2449 :
2450 0 : if ( !rTEvt.IsTrackingCanceled() )
2451 0 : FadeIn();
2452 : }
2453 : }
2454 : else
2455 : {
2456 0 : Rectangle aTestRect;
2457 0 : ImplGetFadeInRect( aTestRect, sal_True );
2458 0 : sal_Bool bNewPressed = aTestRect.IsInside( aMousePosPixel );
2459 0 : if ( bNewPressed != mbFadeInPressed )
2460 : {
2461 0 : mbFadeInPressed = bNewPressed;
2462 0 : ImplDrawFadeIn( sal_False );
2463 : }
2464 : }
2465 : }
2466 0 : else if ( mbFadeOutDown )
2467 : {
2468 0 : if ( rTEvt.IsTrackingEnded() )
2469 : {
2470 0 : mbFadeOutDown = sal_False;
2471 0 : if ( mbFadeOutPressed )
2472 : {
2473 0 : mbFadeOutPressed = sal_False;
2474 0 : ImplDrawFadeOut( sal_False );
2475 :
2476 0 : if ( !rTEvt.IsTrackingCanceled() )
2477 0 : FadeOut();
2478 : }
2479 : }
2480 : else
2481 : {
2482 0 : Rectangle aTestRect;
2483 0 : ImplGetFadeOutRect( aTestRect, sal_True );
2484 0 : sal_Bool bNewPressed = aTestRect.IsInside( aMousePosPixel );
2485 0 : if ( bNewPressed == sal_False )
2486 : {
2487 0 : mbFadeOutPressed = bNewPressed;
2488 0 : ImplDrawFadeOut( sal_False );
2489 :
2490 : // We need a mouseevent with a position inside the button for the
2491 : // ImplStartSplit function!
2492 0 : MouseEvent aOrgMEvt = rTEvt.GetMouseEvent();
2493 0 : MouseEvent aNewMEvt = MouseEvent( aTestRect.Center(), aOrgMEvt.GetClicks(),
2494 0 : aOrgMEvt.GetMode(), aOrgMEvt.GetButtons(),
2495 0 : aOrgMEvt.GetModifier() );
2496 :
2497 0 : ImplStartSplit( aNewMEvt );
2498 0 : mbFadeOutDown = sal_False;
2499 : }
2500 : }
2501 : }
2502 : else
2503 : {
2504 0 : ImplSplitMousePos( aMousePosPixel );
2505 0 : sal_Bool bSplit = sal_True;
2506 0 : if ( mbDragFull )
2507 : {
2508 0 : if ( rTEvt.IsTrackingEnded() )
2509 : {
2510 0 : if ( rTEvt.IsTrackingCanceled() )
2511 : {
2512 0 : ImplSplitItem* pItems = mpSplitSet->mpItems;
2513 0 : sal_uInt16 nItems = mpSplitSet->mnItems;
2514 0 : for ( sal_uInt16 i = 0; i < nItems; i++ )
2515 : {
2516 0 : pItems[i].mnSize = mpLastSizes[i*2];
2517 0 : pItems[i].mnPixSize = mpLastSizes[i*2+1];
2518 : }
2519 0 : ImplUpdate();
2520 0 : Split();
2521 : }
2522 0 : bSplit = sal_False;
2523 : }
2524 : }
2525 : else
2526 : {
2527 0 : if ( rTEvt.IsTrackingEnded() )
2528 : {
2529 0 : HideTracking();
2530 0 : bSplit = !rTEvt.IsTrackingCanceled();
2531 : }
2532 : else
2533 : {
2534 0 : ImplDrawSplitTracking( this, aMousePosPixel );
2535 0 : bSplit = sal_False;
2536 : }
2537 : }
2538 :
2539 0 : if ( bSplit )
2540 : {
2541 0 : sal_Bool bPropSmaller = (mnMouseModifier & KEY_SHIFT) ? sal_True : sal_False;
2542 0 : sal_Bool bPropGreater = (mnMouseModifier & KEY_MOD1) ? sal_True : sal_False;
2543 0 : long nDelta = mnMSplitPos-mnMStartPos;
2544 :
2545 0 : if ( (mnSplitTest & SPLIT_WINDOW) && !mpMainSet->mpItems )
2546 : {
2547 0 : if ( (mpSplitSet == mpMainSet) && mbBottomRight )
2548 0 : nDelta *= -1;
2549 0 : ImplSetWindowSize( nDelta );
2550 : }
2551 : else
2552 : {
2553 0 : long nNewSize = mpSplitSet->mpItems[mnSplitPos].mnPixSize;
2554 0 : if ( (mpSplitSet == mpMainSet) && mbBottomRight )
2555 0 : nNewSize -= nDelta;
2556 : else
2557 0 : nNewSize += nDelta;
2558 0 : SplitItem( mpSplitSet->mpItems[mnSplitPos].mnId, nNewSize,
2559 0 : bPropSmaller, bPropGreater );
2560 : }
2561 :
2562 0 : Split();
2563 :
2564 0 : if ( mbDragFull )
2565 : {
2566 0 : Update();
2567 0 : mnMStartPos = mnMSplitPos;
2568 : }
2569 : }
2570 :
2571 0 : if ( rTEvt.IsTrackingEnded() )
2572 : {
2573 0 : delete mpLastSizes;
2574 0 : mpLastSizes = NULL;
2575 0 : mpSplitSet = NULL;
2576 0 : mnMouseOff = 0;
2577 0 : mnMStartPos = 0;
2578 0 : mnMSplitPos = 0;
2579 0 : mnMouseModifier = 0;
2580 0 : mnSplitTest = 0;
2581 0 : mnSplitPos = 0;
2582 : }
2583 : }
2584 0 : }
2585 :
2586 : // -----------------------------------------------------------------------
2587 :
2588 0 : long SplitWindow::PreNotify( NotifyEvent& rNEvt )
2589 : {
2590 0 : const MouseEvent* pMouseEvt = NULL;
2591 :
2592 0 : if( (rNEvt.GetType() == EVENT_MOUSEMOVE) && (pMouseEvt = rNEvt.GetMouseEvent()) != NULL )
2593 : {
2594 0 : if( !pMouseEvt->GetButtons() && !pMouseEvt->IsSynthetic() && !pMouseEvt->IsModifierChanged() )
2595 : {
2596 : // trigger redraw if mouse over state has changed
2597 0 : Rectangle aFadeInRect;
2598 0 : Rectangle aFadeOutRect;
2599 0 : ImplGetFadeInRect( aFadeInRect );
2600 0 : ImplGetFadeOutRect( aFadeOutRect );
2601 :
2602 0 : if ( aFadeInRect.IsInside( GetPointerPosPixel() ) != aFadeInRect.IsInside( GetLastPointerPosPixel() ) )
2603 0 : Invalidate( aFadeInRect );
2604 0 : if ( aFadeOutRect.IsInside( GetPointerPosPixel() ) != aFadeOutRect.IsInside( GetLastPointerPosPixel() ) )
2605 0 : Invalidate( aFadeOutRect );
2606 :
2607 0 : if( pMouseEvt->IsLeaveWindow() || pMouseEvt->IsEnterWindow() )
2608 : {
2609 0 : Invalidate( aFadeInRect );
2610 0 : Invalidate( aFadeOutRect );
2611 : }
2612 : }
2613 : }
2614 0 : return Window::PreNotify( rNEvt );
2615 : }
2616 :
2617 : // -----------------------------------------------------------------------
2618 :
2619 0 : void SplitWindow::Paint( const Rectangle& )
2620 : {
2621 0 : if ( mnWinStyle & WB_BORDER )
2622 0 : ImplDrawBorder( this );
2623 :
2624 0 : ImplDrawBorderLine( this );
2625 0 : ImplDrawFadeOut( sal_True );
2626 0 : ImplDrawFadeIn( sal_True );
2627 0 : ImplDrawAutoHide( sal_True );
2628 :
2629 : // FrameSet-Hintergruende zeichnen
2630 0 : ImplDrawBack( this, mpMainSet );
2631 :
2632 : // Splitter zeichnen
2633 0 : if ( !(mnWinStyle & WB_NOSPLITDRAW) )
2634 0 : ImplDrawSplit( this, mpMainSet, mbHorz, !mbBottomRight );
2635 0 : }
2636 :
2637 : // -----------------------------------------------------------------------
2638 :
2639 0 : void SplitWindow::Move()
2640 : {
2641 0 : DockingWindow::Move();
2642 0 : }
2643 :
2644 : // -----------------------------------------------------------------------
2645 :
2646 0 : void SplitWindow::Resize()
2647 : {
2648 0 : Size aSize = GetOutputSizePixel();
2649 0 : mnDX = aSize.Width();
2650 0 : mnDY = aSize.Height();
2651 :
2652 0 : ImplUpdate();
2653 0 : Invalidate();
2654 0 : }
2655 :
2656 : // -----------------------------------------------------------------------
2657 :
2658 0 : void SplitWindow::RequestHelp( const HelpEvent& rHEvt )
2659 : {
2660 : // no keyboard help for splitwin
2661 0 : if ( rHEvt.GetMode() & (HELPMODE_BALLOON | HELPMODE_QUICK) && !rHEvt.KeyboardActivated() )
2662 : {
2663 0 : Point aMousePosPixel = ScreenToOutputPixel( rHEvt.GetMousePosPixel() );
2664 0 : Rectangle aHelpRect;
2665 0 : sal_uInt16 nHelpResId = 0;
2666 :
2667 0 : ImplGetAutoHideRect( aHelpRect, sal_True );
2668 0 : if ( aHelpRect.IsInside( aMousePosPixel ) )
2669 : {
2670 0 : if ( mbAutoHideIn )
2671 0 : nHelpResId = SV_HELPTEXT_SPLITFIXED;
2672 : else
2673 0 : nHelpResId = SV_HELPTEXT_SPLITFLOATING;
2674 : }
2675 : else
2676 : {
2677 0 : ImplGetFadeInRect( aHelpRect, sal_True );
2678 0 : if ( aHelpRect.IsInside( aMousePosPixel ) )
2679 0 : nHelpResId = SV_HELPTEXT_FADEIN;
2680 : else
2681 : {
2682 0 : ImplGetFadeOutRect( aHelpRect, sal_True );
2683 0 : if ( aHelpRect.IsInside( aMousePosPixel ) )
2684 0 : nHelpResId = SV_HELPTEXT_FADEOUT;
2685 : }
2686 : }
2687 :
2688 : // Rechteck ermitteln
2689 0 : if ( nHelpResId )
2690 : {
2691 0 : Point aPt = OutputToScreenPixel( aHelpRect.TopLeft() );
2692 0 : aHelpRect.Left() = aPt.X();
2693 0 : aHelpRect.Top() = aPt.Y();
2694 0 : aPt = OutputToScreenPixel( aHelpRect.BottomRight() );
2695 0 : aHelpRect.Right() = aPt.X();
2696 0 : aHelpRect.Bottom() = aPt.Y();
2697 :
2698 : // Text ermitteln und anzeigen
2699 0 : XubString aStr;
2700 0 : ResMgr* pResMgr = ImplGetResMgr();
2701 0 : if( pResMgr )
2702 0 : aStr = ResId( nHelpResId, *pResMgr ).toString();
2703 0 : if ( rHEvt.GetMode() & HELPMODE_BALLOON )
2704 0 : Help::ShowBalloon( this, aHelpRect.Center(), aHelpRect, aStr );
2705 : else
2706 0 : Help::ShowQuickHelp( this, aHelpRect, aStr );
2707 0 : return;
2708 : }
2709 : }
2710 :
2711 0 : DockingWindow::RequestHelp( rHEvt );
2712 : }
2713 :
2714 : // -----------------------------------------------------------------------
2715 :
2716 880 : void SplitWindow::StateChanged( StateChangedType nType )
2717 : {
2718 880 : switch ( nType )
2719 : {
2720 : case STATE_CHANGE_INITSHOW:
2721 0 : if ( IsUpdateMode() )
2722 0 : ImplCalcLayout();
2723 0 : break;
2724 : case STATE_CHANGE_UPDATEMODE:
2725 0 : if ( IsUpdateMode() && IsReallyShown() )
2726 0 : ImplCalcLayout();
2727 0 : break;
2728 : case STATE_CHANGE_CONTROLBACKGROUND:
2729 0 : ImplInitSettings();
2730 0 : Invalidate();
2731 0 : break;
2732 : }
2733 :
2734 880 : DockingWindow::StateChanged( nType );
2735 880 : }
2736 :
2737 : // -----------------------------------------------------------------------
2738 :
2739 736 : void SplitWindow::DataChanged( const DataChangedEvent& rDCEvt )
2740 : {
2741 1472 : if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
2742 736 : (rDCEvt.GetFlags() & SETTINGS_STYLE) )
2743 : {
2744 0 : ImplInitSettings();
2745 0 : Invalidate();
2746 : }
2747 : else
2748 736 : DockingWindow::DataChanged( rDCEvt );
2749 736 : }
2750 :
2751 : // -----------------------------------------------------------------------
2752 :
2753 0 : void SplitWindow::InsertItem( sal_uInt16 nId, Window* pWindow, long nSize,
2754 : sal_uInt16 nPos, sal_uInt16 nSetId,
2755 : SplitWindowItemBits nBits )
2756 : {
2757 : #ifdef DBG_UTIL
2758 : sal_uInt16 nDbgDummy;
2759 : DBG_ASSERT( ImplFindSet( mpMainSet, nSetId ), "SplitWindow::InsertItem() - Set not exists" );
2760 : DBG_ASSERT( !ImplFindItem( mpMainSet, nId, nDbgDummy ), "SplitWindow::InsertItem() - Id already exists" );
2761 : #endif
2762 :
2763 : // Size has to be at least 1.
2764 0 : if ( nSize < 1 )
2765 0 : nSize = 1;
2766 :
2767 0 : ImplSplitSet* pSet = ImplFindSet( mpMainSet, nSetId );
2768 : ImplSplitSet* pNewSet;
2769 : ImplSplitItem* pItem;
2770 :
2771 : // Make room for the new item.
2772 0 : if ( nPos > pSet->mnItems )
2773 0 : nPos = pSet->mnItems;
2774 0 : ImplSplitItem* pNewItems = new ImplSplitItem[pSet->mnItems+1];
2775 0 : if ( nPos )
2776 0 : memcpy( pNewItems, pSet->mpItems, sizeof( ImplSplitItem )*nPos );
2777 0 : if ( nPos < pSet->mnItems )
2778 0 : memcpy( pNewItems+nPos+1, pSet->mpItems+nPos, sizeof( ImplSplitItem )*(pSet->mnItems-nPos) );
2779 0 : delete[] pSet->mpItems;
2780 0 : pSet->mpItems = pNewItems;
2781 0 : pSet->mnItems++;
2782 0 : pSet->mbCalcPix = sal_True;
2783 :
2784 : // Create and initialize item.
2785 0 : pItem = &(pSet->mpItems[nPos]);
2786 0 : memset( pItem, 0, sizeof( ImplSplitItem ) );
2787 0 : pItem->mnSize = nSize;
2788 0 : pItem->mnId = nId;
2789 0 : pItem->mnBits = nBits;
2790 0 : pItem->mnMinSize=-1;
2791 0 : pItem->mnMaxSize=-1;
2792 :
2793 0 : if ( pWindow )
2794 : {
2795 0 : pItem->mpWindow = pWindow;
2796 0 : pItem->mpOrgParent = pWindow->GetParent();
2797 :
2798 : // Attach window to SplitWindow.
2799 0 : pWindow->Hide();
2800 0 : pWindow->SetParent( this );
2801 : }
2802 : else
2803 : {
2804 0 : pNewSet = new ImplSplitSet;
2805 0 : pNewSet->mpItems = NULL;
2806 0 : pNewSet->mpWallpaper = NULL;
2807 0 : pNewSet->mpBitmap = NULL;
2808 0 : pNewSet->mnLastSize = 0;
2809 0 : pNewSet->mnItems = 0;
2810 0 : pNewSet->mnId = nId;
2811 0 : pNewSet->mnSplitSize = pSet->mnSplitSize;
2812 0 : pNewSet->mbCalcPix = sal_True;
2813 :
2814 0 : pItem->mpSet = pNewSet;
2815 : }
2816 :
2817 0 : ImplUpdate();
2818 0 : }
2819 :
2820 : // -----------------------------------------------------------------------
2821 :
2822 0 : void SplitWindow::InsertItem( sal_uInt16 nId, long nSize,
2823 : sal_uInt16 nPos, sal_uInt16 nSetId,
2824 : SplitWindowItemBits nBits )
2825 : {
2826 0 : InsertItem( nId, NULL, nSize, nPos, nSetId, nBits );
2827 0 : }
2828 :
2829 : // -----------------------------------------------------------------------
2830 :
2831 0 : void SplitWindow::RemoveItem( sal_uInt16 nId, sal_Bool bHide )
2832 : {
2833 : #ifdef DBG_UTIL
2834 : sal_uInt16 nDbgDummy;
2835 : DBG_ASSERT( ImplFindItem( mpMainSet, nId, nDbgDummy ), "SplitWindow::RemoveItem() - Id not found" );
2836 : #endif
2837 :
2838 : // Set suchen
2839 : sal_uInt16 nPos;
2840 0 : ImplSplitSet* pSet = ImplFindItem( mpMainSet, nId, nPos );
2841 0 : ImplSplitItem* pItem = &(pSet->mpItems[nPos]);
2842 0 : Window* pWindow = pItem->mpWindow;
2843 0 : Window* pOrgParent = pItem->mpOrgParent;
2844 :
2845 : // Evt. Set loeschen
2846 0 : if ( !pWindow )
2847 0 : ImplDeleteSet( pItem->mpSet );
2848 :
2849 : // Item entfernen
2850 0 : pSet->mnItems--;
2851 0 : pSet->mbCalcPix = sal_True;
2852 0 : if ( pSet->mnItems )
2853 : {
2854 0 : memmove( pSet->mpItems+nPos, pSet->mpItems+nPos+1,
2855 0 : (pSet->mnItems-nPos)*sizeof( ImplSplitItem ) );
2856 : }
2857 : else
2858 : {
2859 0 : delete[] pSet->mpItems;
2860 0 : pSet->mpItems = NULL;
2861 : }
2862 :
2863 0 : ImplUpdate();
2864 :
2865 : // Window erst hier loeschen, um weniger Paints zu haben
2866 0 : if ( pWindow )
2867 : {
2868 : // Fenster wieder herstellen
2869 0 : if ( bHide || (pOrgParent != this) )
2870 : {
2871 0 : pWindow->Hide();
2872 0 : pWindow->SetParent( pOrgParent );
2873 : }
2874 : }
2875 0 : }
2876 :
2877 : // -----------------------------------------------------------------------
2878 :
2879 0 : void SplitWindow::Clear()
2880 : {
2881 : // Alle Sets loeschen
2882 0 : ImplDeleteSet( mpMainSet );
2883 :
2884 : // Main-Set wieder anlegen
2885 0 : mpMainSet = new ImplSplitSet;
2886 0 : mpMainSet->mpItems = NULL;
2887 0 : mpMainSet->mpWallpaper = NULL;
2888 0 : mpMainSet->mpBitmap = NULL;
2889 0 : mpMainSet->mnLastSize = 0;
2890 0 : mpMainSet->mnItems = 0;
2891 0 : mpMainSet->mnId = 0;
2892 0 : mpMainSet->mnSplitSize = SPLITWIN_SPLITSIZE;
2893 0 : mpMainSet->mbCalcPix = sal_True;
2894 0 : if ( mnWinStyle & WB_NOSPLITDRAW )
2895 0 : mpMainSet->mnSplitSize -= 2;
2896 0 : mpBaseSet = mpMainSet;
2897 :
2898 : // Und neu invalidieren
2899 0 : ImplUpdate();
2900 0 : }
2901 :
2902 : // -----------------------------------------------------------------------
2903 :
2904 0 : void SplitWindow::SplitItem( sal_uInt16 nId, long nNewSize,
2905 : sal_Bool bPropSmall, sal_Bool bPropGreat )
2906 : {
2907 : sal_uInt16 nItems;
2908 : sal_uInt16 nPos;
2909 : sal_uInt16 nMin;
2910 : sal_uInt16 nMax;
2911 : sal_uInt16 i;
2912 : sal_uInt16 n;
2913 : long nDelta;
2914 : long nTempDelta;
2915 0 : ImplSplitSet* pSet = ImplFindItem( mpBaseSet, nId, nPos );
2916 : ImplSplitItem* pItems;
2917 :
2918 0 : if ( !pSet )
2919 : return;
2920 :
2921 0 : nItems = pSet->mnItems;
2922 0 : pItems = pSet->mpItems;
2923 :
2924 : // When there is an explicit minimum or maximum size then move nNewSize
2925 : // into that range (when it is not yet already in it.)
2926 0 : nNewSize = ValidateSize(nNewSize, pItems[nPos]);
2927 :
2928 0 : if ( mbCalc )
2929 : {
2930 0 : pItems[nPos].mnSize = nNewSize;
2931 : return;
2932 : }
2933 :
2934 0 : nDelta = nNewSize-pItems[nPos].mnPixSize;
2935 0 : if ( !nDelta )
2936 : return;
2937 :
2938 : // Bereich berechnen, der beim Splitten betroffen sein kann
2939 0 : nMin = 0;
2940 0 : nMax = nItems;
2941 0 : for ( i = 0; i < nItems; i++ )
2942 : {
2943 0 : if ( pItems[i].mbFixed )
2944 : {
2945 0 : if ( i < nPos )
2946 0 : nMin = i+1;
2947 : else
2948 0 : nMax = i;
2949 : }
2950 : }
2951 :
2952 : // Wenn das Fenster sizeable ist, wird das TopSet anders behandelt
2953 0 : sal_Bool bSmall = sal_True;
2954 0 : sal_Bool bGreat = sal_True;
2955 0 : if ( (pSet == mpMainSet) && (mnWinStyle & WB_SIZEABLE) )
2956 : {
2957 0 : if ( nPos < pSet->mnItems-1 )
2958 : {
2959 0 : if ( !((bPropSmall && bPropGreat) ||
2960 : ((nDelta > 0) && bPropSmall) ||
2961 0 : ((nDelta < 0) && bPropGreat)) )
2962 : {
2963 0 : if ( nDelta < 0 )
2964 0 : bGreat = sal_False;
2965 : else
2966 0 : bSmall = sal_False;
2967 : }
2968 : }
2969 : else
2970 : {
2971 0 : if ( nDelta < 0 )
2972 0 : bGreat = sal_False;
2973 : else
2974 0 : bSmall = sal_False;
2975 : }
2976 : }
2977 0 : else if ( nPos >= nMax )
2978 : {
2979 0 : bSmall = sal_False;
2980 0 : bGreat = sal_False;
2981 : }
2982 0 : else if ( nPos && (nPos >= pSet->mnItems-1) )
2983 : {
2984 0 : nPos--;
2985 0 : nDelta *= -1;
2986 0 : sal_Bool bTemp = bPropSmall;
2987 0 : bPropSmall = bPropGreat;
2988 0 : bPropGreat = bTemp;
2989 : }
2990 :
2991 : // Jetzt die Fenster splitten
2992 0 : if ( nDelta < 0 )
2993 : {
2994 0 : if ( bGreat )
2995 : {
2996 0 : if ( bPropGreat )
2997 : {
2998 0 : nTempDelta = nDelta;
2999 0 : do
3000 : {
3001 0 : n = nPos+1;
3002 0 : do
3003 : {
3004 0 : if ( nTempDelta )
3005 : {
3006 0 : pItems[n].mnPixSize++;
3007 0 : nTempDelta++;
3008 : }
3009 0 : n++;
3010 : }
3011 : while ( n < nMax );
3012 : }
3013 : while ( nTempDelta );
3014 : }
3015 : else
3016 0 : pItems[nPos+1].mnPixSize -= nDelta;
3017 : }
3018 :
3019 0 : if ( bSmall )
3020 : {
3021 0 : if ( bPropSmall )
3022 : {
3023 0 : do
3024 : {
3025 0 : n = nPos+1;
3026 0 : do
3027 : {
3028 0 : if ( nDelta && pItems[n-1].mnPixSize )
3029 : {
3030 0 : pItems[n-1].mnPixSize--;
3031 0 : nDelta++;
3032 : }
3033 :
3034 0 : n--;
3035 : }
3036 : while ( n > nMin );
3037 : }
3038 : while ( nDelta );
3039 : }
3040 : else
3041 : {
3042 0 : n = nPos+1;
3043 0 : do
3044 : {
3045 0 : if ( pItems[n-1].mnPixSize+nDelta < 0 )
3046 : {
3047 0 : nDelta += pItems[n-1].mnPixSize;
3048 0 : pItems[n-1].mnPixSize = 0;
3049 : }
3050 : else
3051 : {
3052 0 : pItems[n-1].mnPixSize += nDelta;
3053 0 : break;
3054 : }
3055 0 : n--;
3056 : }
3057 : while ( n > nMin );
3058 : }
3059 : }
3060 : }
3061 : else
3062 : {
3063 0 : if ( bGreat )
3064 : {
3065 0 : if ( bPropGreat )
3066 : {
3067 0 : nTempDelta = nDelta;
3068 0 : do
3069 : {
3070 0 : n = nPos+1;
3071 0 : do
3072 : {
3073 0 : if ( nTempDelta )
3074 : {
3075 0 : pItems[n-1].mnPixSize++;
3076 0 : nTempDelta--;
3077 : }
3078 0 : n--;
3079 : }
3080 : while ( n > nMin );
3081 : }
3082 : while ( nTempDelta );
3083 : }
3084 : else
3085 0 : pItems[nPos].mnPixSize += nDelta;
3086 : }
3087 :
3088 0 : if ( bSmall )
3089 : {
3090 0 : if ( bPropSmall )
3091 : {
3092 0 : do
3093 : {
3094 0 : n = nPos+1;
3095 0 : do
3096 : {
3097 0 : if ( nDelta && pItems[n].mnPixSize )
3098 : {
3099 0 : pItems[n].mnPixSize--;
3100 0 : nDelta--;
3101 : }
3102 :
3103 0 : n++;
3104 : }
3105 : while ( n < nMax );
3106 : }
3107 : while ( nDelta );
3108 : }
3109 : else
3110 : {
3111 0 : n = nPos+1;
3112 0 : do
3113 : {
3114 0 : if ( pItems[n].mnPixSize-nDelta < 0 )
3115 : {
3116 0 : nDelta -= pItems[n].mnPixSize;
3117 0 : pItems[n].mnPixSize = 0;
3118 : }
3119 : else
3120 : {
3121 0 : pItems[n].mnPixSize -= nDelta;
3122 0 : break;
3123 : }
3124 0 : n++;
3125 : }
3126 : while ( n < nMax );
3127 : }
3128 : }
3129 : }
3130 :
3131 : // Original-Groessen updaten
3132 0 : ImplCalcLogSize( pItems, nItems );
3133 :
3134 0 : ImplUpdate();
3135 : }
3136 :
3137 : // -----------------------------------------------------------------------
3138 :
3139 0 : void SplitWindow::SetItemSize( sal_uInt16 nId, long nNewSize )
3140 : {
3141 : sal_uInt16 nPos;
3142 0 : ImplSplitSet* pSet = ImplFindItem( mpBaseSet, nId, nPos );
3143 : ImplSplitItem* pItem;
3144 :
3145 0 : if ( !pSet )
3146 0 : return;
3147 :
3148 : // Testen, ob sich Groesse aendert
3149 0 : pItem = &(pSet->mpItems[nPos]);
3150 0 : if ( pItem->mnSize != nNewSize )
3151 : {
3152 : // Neue Groesse setzen und neu durchrechnen
3153 0 : pItem->mnSize = nNewSize;
3154 0 : pSet->mbCalcPix = sal_True;
3155 0 : ImplUpdate();
3156 : }
3157 : }
3158 :
3159 : // -----------------------------------------------------------------------
3160 :
3161 0 : long SplitWindow::GetItemSize( sal_uInt16 nId ) const
3162 : {
3163 : sal_uInt16 nPos;
3164 0 : ImplSplitSet* pSet = ImplFindItem( mpBaseSet, nId, nPos );
3165 :
3166 0 : if ( pSet )
3167 0 : return pSet->mpItems[nPos].mnSize;
3168 : else
3169 0 : return 0;
3170 : }
3171 :
3172 : // -----------------------------------------------------------------------
3173 :
3174 0 : long SplitWindow::GetItemSize( sal_uInt16 nId, SplitWindowItemBits nBits ) const
3175 : {
3176 : sal_uInt16 nPos;
3177 0 : ImplSplitSet* pSet = ImplFindItem( mpBaseSet, nId, nPos );
3178 :
3179 0 : if ( pSet )
3180 : {
3181 0 : if ( nBits == pSet->mpItems[nPos].mnBits )
3182 0 : return pSet->mpItems[nPos].mnSize;
3183 : else
3184 : {
3185 0 : ((SplitWindow*)this)->ImplCalcLayout();
3186 :
3187 0 : long nRelSize = 0;
3188 0 : long nPerSize = 0;
3189 : ImplSplitItem* pItems;
3190 : sal_uInt16 nItems;
3191 : SplitWindowItemBits nTempBits;
3192 : sal_uInt16 i;
3193 0 : nItems = pSet->mnItems;
3194 0 : pItems = pSet->mpItems;
3195 0 : for ( i = 0; i < nItems; i++ )
3196 : {
3197 0 : if ( i == nPos )
3198 0 : nTempBits = nBits;
3199 : else
3200 0 : nTempBits = pItems[i].mnBits;
3201 0 : if ( nTempBits & SWIB_RELATIVESIZE )
3202 0 : nRelSize += pItems[i].mnPixSize;
3203 0 : else if ( nTempBits & SWIB_PERCENTSIZE )
3204 0 : nPerSize += pItems[i].mnPixSize;
3205 : }
3206 0 : nPerSize += nRelSize;
3207 0 : if ( nBits & SWIB_RELATIVESIZE )
3208 : {
3209 0 : if ( nRelSize )
3210 0 : return (pItems[nPos].mnPixSize+(nRelSize/2))/nRelSize;
3211 : else
3212 0 : return 1;
3213 : }
3214 0 : else if ( nBits & SWIB_PERCENTSIZE )
3215 : {
3216 0 : if ( nPerSize )
3217 0 : return (pItems[nPos].mnPixSize*100)/nPerSize;
3218 : else
3219 0 : return 1;
3220 : }
3221 : else
3222 0 : return pItems[nPos].mnPixSize;
3223 : }
3224 : }
3225 : else
3226 0 : return 0;
3227 : }
3228 :
3229 :
3230 :
3231 :
3232 0 : void SplitWindow::SetItemSizeRange (sal_uInt16 nId, const Range aRange)
3233 : {
3234 : sal_uInt16 nPos;
3235 0 : ImplSplitSet* pSet = ImplFindItem(mpBaseSet, nId, nPos);
3236 :
3237 0 : if (pSet != NULL)
3238 : {
3239 0 : pSet->mpItems[nPos].mnMinSize = aRange.Min();
3240 0 : pSet->mpItems[nPos].mnMaxSize = aRange.Max();
3241 : }
3242 0 : }
3243 :
3244 : // -----------------------------------------------------------------------
3245 :
3246 0 : sal_uInt16 SplitWindow::GetSet( sal_uInt16 nId ) const
3247 : {
3248 : sal_uInt16 nPos;
3249 0 : ImplSplitSet* pSet = ImplFindItem( mpBaseSet, nId, nPos );
3250 :
3251 0 : if ( pSet )
3252 0 : return pSet->mnId;
3253 : else
3254 0 : return 0;
3255 : }
3256 :
3257 : // -----------------------------------------------------------------------
3258 :
3259 0 : sal_Bool SplitWindow::IsItemValid( sal_uInt16 nId ) const
3260 : {
3261 : sal_uInt16 nPos;
3262 0 : ImplSplitSet* pSet = mpBaseSet ? ImplFindItem(mpBaseSet, nId, nPos) : NULL;
3263 :
3264 0 : if ( pSet )
3265 0 : return sal_True;
3266 : else
3267 0 : return sal_False;
3268 : }
3269 :
3270 : // -----------------------------------------------------------------------
3271 :
3272 0 : sal_uInt16 SplitWindow::GetItemId( Window* pWindow ) const
3273 : {
3274 0 : return ImplFindItem( mpBaseSet, pWindow );
3275 : }
3276 :
3277 : // -----------------------------------------------------------------------
3278 :
3279 0 : sal_uInt16 SplitWindow::GetItemId( const Point& rPos ) const
3280 : {
3281 0 : return ImplFindItem( mpBaseSet, rPos, mbHorz, !mbBottomRight );
3282 : }
3283 :
3284 : // -----------------------------------------------------------------------
3285 :
3286 0 : sal_uInt16 SplitWindow::GetItemPos( sal_uInt16 nId, sal_uInt16 nSetId ) const
3287 : {
3288 0 : ImplSplitSet* pSet = ImplFindSet( mpBaseSet, nSetId );
3289 0 : sal_uInt16 nPos = SPLITWINDOW_ITEM_NOTFOUND;
3290 :
3291 0 : if ( pSet )
3292 : {
3293 0 : for ( sal_uInt16 i = 0; i < pSet->mnItems; i++ )
3294 : {
3295 0 : if ( pSet->mpItems[i].mnId == nId )
3296 : {
3297 0 : nPos = i;
3298 0 : break;
3299 : }
3300 : }
3301 : }
3302 :
3303 0 : return nPos;
3304 : }
3305 :
3306 : // -----------------------------------------------------------------------
3307 :
3308 0 : sal_uInt16 SplitWindow::GetItemId( sal_uInt16 nPos, sal_uInt16 nSetId ) const
3309 : {
3310 0 : ImplSplitSet* pSet = ImplFindSet( mpBaseSet, nSetId );
3311 0 : if ( pSet && (nPos < pSet->mnItems) )
3312 0 : return pSet->mpItems[nPos].mnId;
3313 : else
3314 0 : return 0;
3315 : }
3316 :
3317 : // -----------------------------------------------------------------------
3318 :
3319 5256 : sal_uInt16 SplitWindow::GetItemCount( sal_uInt16 nSetId ) const
3320 : {
3321 5256 : ImplSplitSet* pSet = ImplFindSet( mpBaseSet, nSetId );
3322 5256 : if ( pSet )
3323 5256 : return pSet->mnItems;
3324 : else
3325 0 : return 0;
3326 : }
3327 :
3328 : // -----------------------------------------------------------------------
3329 :
3330 1440 : void SplitWindow::ImplNewAlign()
3331 : {
3332 1440 : if ( mbNoAlign )
3333 : {
3334 0 : mbHorz = sal_False;
3335 0 : mbBottomRight = sal_False;
3336 : }
3337 : else
3338 : {
3339 1440 : switch ( meAlign )
3340 : {
3341 : case WINDOWALIGN_TOP:
3342 0 : mbHorz = sal_True;
3343 0 : mbBottomRight = sal_False;
3344 0 : break;
3345 : case WINDOWALIGN_BOTTOM:
3346 480 : mbHorz = sal_True;
3347 480 : mbBottomRight = sal_True;
3348 480 : break;
3349 : case WINDOWALIGN_LEFT:
3350 480 : mbHorz = sal_False;
3351 480 : mbBottomRight = sal_False;
3352 480 : break;
3353 : case WINDOWALIGN_RIGHT:
3354 480 : mbHorz = sal_False;
3355 480 : mbBottomRight = sal_True;
3356 480 : break;
3357 : }
3358 : }
3359 :
3360 1440 : if ( mnWinStyle & WB_BORDER )
3361 : {
3362 : ImplCalcBorder( meAlign, mbNoAlign, mnLeftBorder, mnTopBorder,
3363 1440 : mnRightBorder, mnBottomBorder );
3364 : }
3365 :
3366 1440 : if ( IsReallyVisible() && IsUpdateMode() )
3367 0 : Invalidate();
3368 1440 : ImplUpdate();
3369 1440 : }
3370 :
3371 : // -----------------------------------------------------------------------
3372 :
3373 1920 : void SplitWindow::SetAlign( WindowAlign eNewAlign )
3374 : {
3375 1920 : if ( meAlign != eNewAlign )
3376 : {
3377 1440 : meAlign = eNewAlign;
3378 1440 : ImplNewAlign();
3379 : }
3380 1920 : }
3381 :
3382 : // -----------------------------------------------------------------------
3383 :
3384 1920 : void SplitWindow::ShowAutoHideButton( sal_Bool bShow )
3385 : {
3386 1920 : mbAutoHide = bShow;
3387 1920 : ImplUpdate();
3388 1920 : }
3389 :
3390 : // -----------------------------------------------------------------------
3391 :
3392 960 : void SplitWindow::ShowFadeInHideButton( sal_Bool bShow )
3393 : {
3394 960 : mbFadeIn = bShow;
3395 960 : ImplUpdate();
3396 960 : }
3397 :
3398 : // -----------------------------------------------------------------------
3399 :
3400 960 : void SplitWindow::ShowFadeOutButton( sal_Bool bShow )
3401 : {
3402 960 : mbFadeOut = bShow;
3403 960 : ImplUpdate();
3404 960 : }
3405 :
3406 : // -----------------------------------------------------------------------
3407 :
3408 1920 : void SplitWindow::SetAutoHideState( sal_Bool bAutoHide )
3409 : {
3410 1920 : mbAutoHideIn = bAutoHide;
3411 1920 : if ( IsReallyVisible() )
3412 : {
3413 0 : Rectangle aRect;
3414 0 : ImplGetAutoHideRect( aRect );
3415 0 : Invalidate( aRect );
3416 : }
3417 1920 : }
3418 :
3419 : // -----------------------------------------------------------------------
3420 :
3421 960 : long SplitWindow::GetFadeInSize() const
3422 : {
3423 960 : long n = 0;
3424 :
3425 960 : if ( mbHorz )
3426 480 : n = mnTopBorder+mnBottomBorder;
3427 : else
3428 480 : n = mnLeftBorder+mnRightBorder;
3429 :
3430 960 : return n+SPLITWIN_SPLITSIZE+SPLITWIN_SPLITSIZEEX-2;
3431 : }
3432 :
3433 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|