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