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 <tools/shl.hxx>
21 : #include <vcl/svapp.hxx>
22 :
23 : #include <svx/xtable.hxx>
24 : #include <svx/xpool.hxx>
25 :
26 : #include <svx/dialogs.hrc>
27 : #include "accessibility.hrc"
28 : #include <svx/dlgctrl.hxx>
29 : #include <svx/dialmgr.hxx>
30 : #include <tools/poly.hxx>
31 : #include <vcl/region.hxx>
32 : #include <vcl/gradient.hxx>
33 : #include <vcl/hatch.hxx>
34 : #include <svtools/colorcfg.hxx>
35 :
36 : #include "svxrectctaccessiblecontext.hxx"
37 : #include <com/sun/star/lang/XUnoTunnel.hpp>
38 : #include <basegfx/point/b2dpoint.hxx>
39 : #include <basegfx/polygon/b2dpolygon.hxx>
40 : #include <svx/svdorect.hxx>
41 :
42 : #include <svx/svdmodel.hxx>
43 : #include <svx/svdopath.hxx>
44 : #include <svx/sdr/contact/objectcontactofobjlistpainter.hxx>
45 : #include <svx/sdr/contact/displayinfo.hxx>
46 : #include "linectrl.hrc"
47 :
48 : #define OUTPUT_DRAWMODE_COLOR (DRAWMODE_DEFAULT)
49 : #define OUTPUT_DRAWMODE_CONTRAST (DRAWMODE_SETTINGSLINE | DRAWMODE_SETTINGSFILL | DRAWMODE_SETTINGSTEXT | DRAWMODE_SETTINGSGRADIENT)
50 :
51 : using namespace ::com::sun::star::uno;
52 : using namespace ::com::sun::star::lang;
53 : using namespace ::com::sun::star::accessibility;
54 :
55 : // Control for display and selection of the corner points and
56 : // mid point of an object
57 :
58 0 : Bitmap& SvxRectCtl::GetRectBitmap( void )
59 : {
60 0 : if( !pBitmap )
61 0 : InitRectBitmap();
62 :
63 0 : return *pBitmap;
64 : }
65 :
66 0 : SvxRectCtl::SvxRectCtl( Window* pParent, const ResId& rResId, RECT_POINT eRpt,
67 : sal_uInt16 nBorder, sal_uInt16 nCircle, CTL_STYLE eStyle ) :
68 :
69 : Control( pParent, rResId ),
70 :
71 : pAccContext ( NULL ),
72 : nBorderWidth( nBorder ),
73 : nRadius ( nCircle),
74 : eDefRP ( eRpt ),
75 : eCS ( eStyle ),
76 : pBitmap ( NULL ),
77 : m_nState ( 0 ),
78 0 : mbCompleteDisable(sal_False)
79 : {
80 0 : SetMapMode( MAP_100TH_MM );
81 0 : Resize_Impl();
82 0 : }
83 :
84 : // -----------------------------------------------------------------------
85 :
86 0 : SvxRectCtl::~SvxRectCtl()
87 : {
88 0 : delete pBitmap;
89 :
90 0 : if( pAccContext )
91 0 : pAccContext->release();
92 0 : }
93 :
94 : // -----------------------------------------------------------------------
95 0 : void SvxRectCtl::Resize()
96 : {
97 0 : Resize_Impl();
98 0 : Control::Resize();
99 0 : }
100 :
101 : // -----------------------------------------------------------------------
102 :
103 0 : void SvxRectCtl::Resize_Impl()
104 : {
105 0 : aSize = GetOutputSize();
106 :
107 0 : switch( eCS )
108 : {
109 : case CS_RECT:
110 : case CS_ANGLE:
111 : case CS_SHADOW:
112 0 : aPtLT = Point( 0 + nBorderWidth, 0 + nBorderWidth );
113 0 : aPtMT = Point( aSize.Width() / 2, 0 + nBorderWidth );
114 0 : aPtRT = Point( aSize.Width() - nBorderWidth, 0 + nBorderWidth );
115 :
116 0 : aPtLM = Point( 0 + nBorderWidth, aSize.Height() / 2 );
117 0 : aPtMM = Point( aSize.Width() / 2, aSize.Height() / 2 );
118 0 : aPtRM = Point( aSize.Width() - nBorderWidth, aSize.Height() / 2 );
119 :
120 0 : aPtLB = Point( 0 + nBorderWidth, aSize.Height() - nBorderWidth );
121 0 : aPtMB = Point( aSize.Width() / 2, aSize.Height() - nBorderWidth );
122 0 : aPtRB = Point( aSize.Width() - nBorderWidth, aSize.Height() - nBorderWidth );
123 0 : break;
124 :
125 : case CS_LINE:
126 0 : aPtLT = Point( 0 + 3 * nBorderWidth, 0 + nBorderWidth );
127 0 : aPtMT = Point( aSize.Width() / 2, 0 + nBorderWidth );
128 0 : aPtRT = Point( aSize.Width() - 3 * nBorderWidth, 0 + nBorderWidth );
129 :
130 0 : aPtLM = Point( 0 + 3 * nBorderWidth, aSize.Height() / 2 );
131 0 : aPtMM = Point( aSize.Width() / 2, aSize.Height() / 2 );
132 0 : aPtRM = Point( aSize.Width() - 3 * nBorderWidth, aSize.Height() / 2 );
133 :
134 0 : aPtLB = Point( 0 + 3 * nBorderWidth, aSize.Height() - nBorderWidth );
135 0 : aPtMB = Point( aSize.Width() / 2, aSize.Height() - nBorderWidth );
136 0 : aPtRB = Point( aSize.Width() - 3 * nBorderWidth, aSize.Height() - nBorderWidth );
137 0 : break;
138 : }
139 0 : Reset();
140 0 : InitSettings( sal_True, sal_True );
141 0 : }
142 : // -----------------------------------------------------------------------
143 :
144 0 : void SvxRectCtl::InitRectBitmap( void )
145 : {
146 0 : if( pBitmap )
147 0 : delete pBitmap;
148 :
149 0 : const StyleSettings& rStyles = Application::GetSettings().GetStyleSettings();
150 0 : svtools::ColorConfig aColorConfig;
151 :
152 0 : pBitmap = new Bitmap( SVX_RES( RID_SVXCTRL_RECTBTNS ) );
153 :
154 : // set bitmap-colors
155 0 : Color aColorAry1[7];
156 0 : Color aColorAry2[7];
157 0 : aColorAry1[0] = Color( 0xC0, 0xC0, 0xC0 ); // light-gray
158 0 : aColorAry1[1] = Color( 0xFF, 0xFF, 0x00 ); // yellow
159 0 : aColorAry1[2] = Color( 0xFF, 0xFF, 0xFF ); // white
160 0 : aColorAry1[3] = Color( 0x80, 0x80, 0x80 ); // dark-gray
161 0 : aColorAry1[4] = Color( 0x00, 0x00, 0x00 ); // black
162 0 : aColorAry1[5] = Color( 0x00, 0xFF, 0x00 ); // green
163 0 : aColorAry1[6] = Color( 0x00, 0x00, 0xFF ); // blue
164 0 : aColorAry2[0] = rStyles.GetDialogColor(); // background
165 0 : aColorAry2[1] = rStyles.GetWindowColor();
166 0 : aColorAry2[2] = rStyles.GetLightColor();
167 0 : aColorAry2[3] = rStyles.GetShadowColor();
168 0 : aColorAry2[4] = rStyles.GetDarkShadowColor();
169 0 : aColorAry2[5] = Color( aColorConfig.GetColorValue( svtools::FONTCOLOR ).nColor );
170 0 : aColorAry2[6] = rStyles.GetDialogColor();
171 :
172 : #ifdef DBG_UTIL
173 : static sal_Bool bModify = sal_False;
174 : sal_Bool& rModify = bModify;
175 : if( rModify )
176 : {
177 : static int n = 0;
178 : static sal_uInt8 r = 0xFF;
179 : static sal_uInt8 g = 0x00;
180 : static sal_uInt8 b = 0xFF;
181 : int& rn = n;
182 : sal_uInt8& rr = r;
183 : sal_uInt8& rg = g;
184 : sal_uInt8& rb = b;
185 : aColorAry2[ rn ] = Color( rr, rg, rb );
186 : }
187 : #endif
188 :
189 0 : pBitmap->Replace( aColorAry1, aColorAry2, 7, NULL );
190 0 : }
191 :
192 : // -----------------------------------------------------------------------
193 :
194 0 : void SvxRectCtl::InitSettings( sal_Bool bForeground, sal_Bool bBackground )
195 : {
196 0 : const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
197 :
198 0 : if( bForeground )
199 : {
200 0 : svtools::ColorConfig aColorConfig;
201 0 : Color aTextColor( aColorConfig.GetColorValue( svtools::FONTCOLOR ).nColor );
202 :
203 0 : if ( IsControlForeground() )
204 0 : aTextColor = GetControlForeground();
205 0 : SetTextColor( aTextColor );
206 : }
207 :
208 0 : if( bBackground )
209 : {
210 0 : if ( IsControlBackground() )
211 0 : SetBackground( GetControlBackground() );
212 : else
213 0 : SetBackground( rStyleSettings.GetWindowColor() );
214 : }
215 :
216 0 : delete pBitmap;
217 0 : pBitmap = NULL; // forces new creating of bitmap
218 :
219 0 : Invalidate();
220 0 : }
221 :
222 : // The clicked rectangle (3 x 3) is determined and the parent (dialog)
223 : // is notified that the item was changed
224 0 : void SvxRectCtl::MouseButtonDown( const MouseEvent& rMEvt )
225 : {
226 : // CompletelyDisabled() added to have a disabled state for SvxRectCtl
227 0 : if(!IsCompletelyDisabled())
228 : {
229 0 : Point aPtLast = aPtNew;
230 :
231 0 : aPtNew = GetApproxLogPtFromPixPt( rMEvt.GetPosPixel() );
232 :
233 0 : if( aPtNew == aPtMM && ( eCS == CS_SHADOW || eCS == CS_ANGLE ) )
234 : {
235 0 : aPtNew = aPtLast;
236 : }
237 : else
238 : {
239 0 : Invalidate( Rectangle( aPtLast - Point( nRadius, nRadius ),
240 0 : aPtLast + Point( nRadius, nRadius ) ) );
241 0 : Invalidate( Rectangle( aPtNew - Point( nRadius, nRadius ),
242 0 : aPtNew + Point( nRadius, nRadius ) ) );
243 0 : eRP = GetRPFromPoint( aPtNew );
244 :
245 0 : SetActualRP( eRP );
246 :
247 0 : if( WINDOW_TABPAGE == GetParent()->GetType() )
248 0 : ( (SvxTabPage*) GetParent() )->PointChanged( this, eRP );
249 : }
250 : }
251 0 : }
252 :
253 : // -----------------------------------------------------------------------
254 :
255 0 : void SvxRectCtl::KeyInput( const KeyEvent& rKeyEvt )
256 : {
257 : // CompletelyDisabled() added to have a disabled state for SvxRectCtl
258 0 : if(!IsCompletelyDisabled())
259 : {
260 0 : RECT_POINT eNewRP = eRP;
261 0 : sal_Bool bUseMM = (eCS != CS_SHADOW) && (eCS != CS_ANGLE);
262 :
263 0 : switch( rKeyEvt.GetKeyCode().GetCode() )
264 : {
265 : case KEY_DOWN:
266 : {
267 0 : if( !(m_nState & CS_NOVERT) )
268 0 : switch( eNewRP )
269 : {
270 0 : case RP_LT: eNewRP = RP_LM; break;
271 0 : case RP_MT: eNewRP = bUseMM ? RP_MM : RP_MB; break;
272 0 : case RP_RT: eNewRP = RP_RM; break;
273 0 : case RP_LM: eNewRP = RP_LB; break;
274 0 : case RP_MM: eNewRP = RP_MB; break;
275 0 : case RP_RM: eNewRP = RP_RB; break;
276 : default: ; //prevent warning
277 : }
278 : }
279 0 : break;
280 : case KEY_UP:
281 : {
282 0 : if( !(m_nState & CS_NOVERT) )
283 0 : switch( eNewRP )
284 : {
285 0 : case RP_LM: eNewRP = RP_LT; break;
286 0 : case RP_MM: eNewRP = RP_MT; break;
287 0 : case RP_RM: eNewRP = RP_RT; break;
288 0 : case RP_LB: eNewRP = RP_LM; break;
289 0 : case RP_MB: eNewRP = bUseMM ? RP_MM : RP_MT; break;
290 0 : case RP_RB: eNewRP = RP_RM; break;
291 : default: ; //prevent warning
292 : }
293 : }
294 0 : break;
295 : case KEY_LEFT:
296 : {
297 0 : if( !(m_nState & CS_NOHORZ) )
298 0 : switch( eNewRP )
299 : {
300 0 : case RP_MT: eNewRP = RP_LT; break;
301 0 : case RP_RT: eNewRP = RP_MT; break;
302 0 : case RP_MM: eNewRP = RP_LM; break;
303 0 : case RP_RM: eNewRP = bUseMM ? RP_MM : RP_LM; break;
304 0 : case RP_MB: eNewRP = RP_LB; break;
305 0 : case RP_RB: eNewRP = RP_MB; break;
306 : default: ; //prevent warning
307 : }
308 : }
309 0 : break;
310 : case KEY_RIGHT:
311 : {
312 0 : if( !(m_nState & CS_NOHORZ) )
313 0 : switch( eNewRP )
314 : {
315 0 : case RP_LT: eNewRP = RP_MT; break;
316 0 : case RP_MT: eNewRP = RP_RT; break;
317 0 : case RP_LM: eNewRP = bUseMM ? RP_MM : RP_RM; break;
318 0 : case RP_MM: eNewRP = RP_RM; break;
319 0 : case RP_LB: eNewRP = RP_MB; break;
320 0 : case RP_MB: eNewRP = RP_RB; break;
321 : default: ; //prevent warning
322 : }
323 : }
324 0 : break;
325 : default:
326 0 : Control::KeyInput( rKeyEvt );
327 0 : return;
328 : }
329 0 : if( eNewRP != eRP )
330 : {
331 0 : SetActualRP( eNewRP );
332 :
333 0 : if( WINDOW_TABPAGE == GetParent()->GetType() )
334 0 : ( (SvxTabPage*) GetParent() )->PointChanged( this, eRP );
335 :
336 0 : SetFocusRect();
337 : }
338 : }
339 : }
340 :
341 : // -----------------------------------------------------------------------
342 :
343 0 : void SvxRectCtl::StateChanged( StateChangedType nType )
344 : {
345 0 : if ( nType == STATE_CHANGE_CONTROLFOREGROUND )
346 0 : InitSettings( sal_True, sal_False );
347 0 : else if ( nType == STATE_CHANGE_CONTROLBACKGROUND )
348 0 : InitSettings( sal_False, sal_True );
349 :
350 0 : Window::StateChanged( nType );
351 0 : }
352 :
353 : // -----------------------------------------------------------------------
354 :
355 0 : void SvxRectCtl::DataChanged( const DataChangedEvent& rDCEvt )
356 : {
357 0 : if ( ( rDCEvt.GetType() == DATACHANGED_SETTINGS ) && ( rDCEvt.GetFlags() & SETTINGS_STYLE ) )
358 0 : InitSettings( sal_True, sal_True );
359 : else
360 0 : Window::DataChanged( rDCEvt );
361 0 : }
362 :
363 : // the control (rectangle with 9 circles)
364 :
365 0 : void SvxRectCtl::Paint( const Rectangle& )
366 : {
367 0 : Point aPtDiff( PixelToLogic( Point( 1, 1 ) ) );
368 :
369 0 : const StyleSettings& rStyles = Application::GetSettings().GetStyleSettings();
370 :
371 0 : SetLineColor( rStyles.GetDialogColor() );
372 0 : SetFillColor( rStyles.GetDialogColor() );
373 0 : DrawRect( Rectangle( Point(0,0), GetOutputSize() ) );
374 :
375 0 : if( IsEnabled() )
376 0 : SetLineColor( rStyles.GetLabelTextColor() );
377 : else
378 0 : SetLineColor( rStyles.GetShadowColor() );
379 :
380 0 : SetFillColor();
381 :
382 0 : switch( eCS )
383 : {
384 :
385 : case CS_RECT:
386 : case CS_SHADOW:
387 0 : if( !IsEnabled() )
388 : {
389 0 : Color aOldCol = GetLineColor();
390 0 : SetLineColor( rStyles.GetLightColor() );
391 0 : DrawRect( Rectangle( aPtLT + aPtDiff, aPtRB + aPtDiff ) );
392 0 : SetLineColor( aOldCol );
393 : }
394 0 : DrawRect( Rectangle( aPtLT, aPtRB ) );
395 0 : break;
396 :
397 : case CS_LINE:
398 0 : if( !IsEnabled() )
399 : {
400 0 : Color aOldCol = GetLineColor();
401 0 : SetLineColor( rStyles.GetLightColor() );
402 0 : DrawLine( aPtLM - Point( 2 * nBorderWidth, 0) + aPtDiff,
403 0 : aPtRM + Point( 2 * nBorderWidth, 0 ) + aPtDiff );
404 0 : SetLineColor( aOldCol );
405 : }
406 0 : DrawLine( aPtLM - Point( 2 * nBorderWidth, 0),
407 0 : aPtRM + Point( 2 * nBorderWidth, 0 ) );
408 0 : break;
409 :
410 : case CS_ANGLE:
411 0 : if( !IsEnabled() )
412 : {
413 0 : Color aOldCol = GetLineColor();
414 0 : SetLineColor( rStyles.GetLightColor() );
415 0 : DrawLine( aPtLT + aPtDiff, aPtRB + aPtDiff );
416 0 : DrawLine( aPtLB + aPtDiff, aPtRT + aPtDiff );
417 0 : DrawLine( aPtLM + aPtDiff, aPtRM + aPtDiff );
418 0 : DrawLine( aPtMT + aPtDiff, aPtMB + aPtDiff );
419 0 : SetLineColor( aOldCol );
420 : }
421 0 : DrawLine( aPtLT, aPtRB );
422 0 : DrawLine( aPtLB, aPtRT );
423 0 : DrawLine( aPtLM, aPtRM );
424 0 : DrawLine( aPtMT, aPtMB );
425 0 : break;
426 :
427 : default:
428 0 : break;
429 : }
430 0 : SetFillColor( GetBackground().GetColor() );
431 :
432 0 : Size aBtnSize( 11, 11 );
433 0 : Size aDstBtnSize( PixelToLogic( aBtnSize ) );
434 0 : Point aToCenter( aDstBtnSize.Width() >> 1, aDstBtnSize.Height() >> 1);
435 0 : Point aBtnPnt1( IsEnabled()?0:22,0 );
436 0 : Point aBtnPnt2( 11,0 );
437 0 : Point aBtnPnt3( 22,0 );
438 :
439 0 : sal_Bool bNoHorz = (m_nState & CS_NOHORZ) != 0;
440 0 : sal_Bool bNoVert = (m_nState & CS_NOVERT) != 0;
441 :
442 0 : Bitmap& rBitmap = GetRectBitmap();
443 :
444 : // CompletelyDisabled() added to have a disabled state for SvxRectCtl
445 0 : if(IsCompletelyDisabled())
446 : {
447 0 : DrawBitmap( aPtLT - aToCenter, aDstBtnSize, aBtnPnt3, aBtnSize, rBitmap );
448 0 : DrawBitmap( aPtMT - aToCenter, aDstBtnSize, aBtnPnt3, aBtnSize, rBitmap );
449 0 : DrawBitmap( aPtRT - aToCenter, aDstBtnSize, aBtnPnt3, aBtnSize, rBitmap );
450 0 : DrawBitmap( aPtLM - aToCenter, aDstBtnSize, aBtnPnt3, aBtnSize, rBitmap );
451 0 : if( eCS == CS_RECT || eCS == CS_LINE )
452 0 : DrawBitmap( aPtMM - aToCenter, aDstBtnSize, aBtnPnt3, aBtnSize, rBitmap );
453 0 : DrawBitmap( aPtRM - aToCenter, aDstBtnSize, aBtnPnt3, aBtnSize, rBitmap );
454 0 : DrawBitmap( aPtLB - aToCenter, aDstBtnSize, aBtnPnt3, aBtnSize, rBitmap );
455 0 : DrawBitmap( aPtMB - aToCenter, aDstBtnSize, aBtnPnt3, aBtnSize, rBitmap );
456 0 : DrawBitmap( aPtRB - aToCenter, aDstBtnSize, aBtnPnt3, aBtnSize, rBitmap );
457 : }
458 : else
459 : {
460 0 : DrawBitmap( aPtLT - aToCenter, aDstBtnSize, (bNoHorz | bNoVert)?aBtnPnt3:aBtnPnt1, aBtnSize, rBitmap );
461 0 : DrawBitmap( aPtMT - aToCenter, aDstBtnSize, bNoVert?aBtnPnt3:aBtnPnt1, aBtnSize, rBitmap );
462 0 : DrawBitmap( aPtRT - aToCenter, aDstBtnSize, (bNoHorz | bNoVert)?aBtnPnt3:aBtnPnt1, aBtnSize, rBitmap );
463 :
464 0 : DrawBitmap( aPtLM - aToCenter, aDstBtnSize, bNoHorz?aBtnPnt3:aBtnPnt1, aBtnSize, rBitmap );
465 :
466 : // Center for rectangle and line
467 0 : if( eCS == CS_RECT || eCS == CS_LINE )
468 0 : DrawBitmap( aPtMM - aToCenter, aDstBtnSize, aBtnPnt1, aBtnSize, rBitmap );
469 :
470 0 : DrawBitmap( aPtRM - aToCenter, aDstBtnSize, bNoHorz?aBtnPnt3:aBtnPnt1, aBtnSize, rBitmap );
471 :
472 0 : DrawBitmap( aPtLB - aToCenter, aDstBtnSize, (bNoHorz | bNoVert)?aBtnPnt3:aBtnPnt1, aBtnSize, rBitmap );
473 0 : DrawBitmap( aPtMB - aToCenter, aDstBtnSize, bNoVert?aBtnPnt3:aBtnPnt1, aBtnSize, rBitmap );
474 0 : DrawBitmap( aPtRB - aToCenter, aDstBtnSize, (bNoHorz | bNoVert)?aBtnPnt3:aBtnPnt1, aBtnSize, rBitmap );
475 : }
476 :
477 : // draw active button, avoid center pos for angle
478 : // CompletelyDisabled() added to have a disabled state for SvxRectCtl
479 0 : if(!IsCompletelyDisabled())
480 : {
481 0 : if( IsEnabled() && (eCS != CS_ANGLE || aPtNew != aPtMM) )
482 : {
483 0 : Point aCenterPt( aPtNew );
484 0 : aCenterPt -= aToCenter;
485 :
486 0 : DrawBitmap( aCenterPt, aDstBtnSize, aBtnPnt2, aBtnSize, rBitmap );
487 : }
488 : }
489 0 : }
490 :
491 : // Convert RECT_POINT Point
492 :
493 0 : Point SvxRectCtl::GetPointFromRP( RECT_POINT _eRP) const
494 : {
495 0 : switch( _eRP )
496 : {
497 0 : case RP_LT: return aPtLT;
498 0 : case RP_MT: return aPtMT;
499 0 : case RP_RT: return aPtRT;
500 0 : case RP_LM: return aPtLM;
501 0 : case RP_MM: return aPtMM;
502 0 : case RP_RM: return aPtRM;
503 0 : case RP_LB: return aPtLB;
504 0 : case RP_MB: return aPtMB;
505 0 : case RP_RB: return aPtRB;
506 : }
507 0 : return( aPtMM ); // default
508 : }
509 :
510 :
511 0 : void SvxRectCtl::SetFocusRect( const Rectangle* pRect )
512 : {
513 0 : HideFocus();
514 :
515 0 : if( pRect )
516 0 : ShowFocus( *pRect );
517 : else
518 0 : ShowFocus( CalculateFocusRectangle() );
519 0 : }
520 :
521 0 : Point SvxRectCtl::SetActualRPWithoutInvalidate( RECT_POINT eNewRP )
522 : {
523 0 : Point aPtLast = aPtNew;
524 0 : aPtNew = GetPointFromRP( eNewRP );
525 :
526 0 : if( (m_nState & CS_NOHORZ) != 0 )
527 0 : aPtNew.X() = aPtMM.X();
528 :
529 0 : if( (m_nState & CS_NOVERT) != 0 )
530 0 : aPtNew.Y() = aPtMM.Y();
531 :
532 0 : eNewRP = GetRPFromPoint( aPtNew );
533 :
534 0 : eDefRP = eNewRP;
535 0 : eRP = eNewRP;
536 :
537 0 : return aPtLast;
538 : }
539 :
540 0 : void SvxRectCtl::GetFocus()
541 : {
542 0 : SetFocusRect();
543 0 : }
544 :
545 :
546 0 : void SvxRectCtl::LoseFocus()
547 : {
548 0 : HideFocus();
549 0 : }
550 :
551 :
552 0 : Point SvxRectCtl::GetApproxLogPtFromPixPt( const Point& rPt ) const
553 : {
554 0 : Point aPt = PixelToLogic( rPt );
555 : long x;
556 : long y;
557 :
558 0 : if( ( m_nState & CS_NOHORZ ) == 0 )
559 : {
560 0 : if( aPt.X() < aSize.Width() / 3 )
561 0 : x = aPtLT.X();
562 0 : else if( aPt.X() < aSize.Width() * 2 / 3 )
563 0 : x = aPtMM.X();
564 : else
565 0 : x = aPtRB.X();
566 : }
567 : else
568 0 : x = aPtMM.X();
569 :
570 0 : if( ( m_nState & CS_NOVERT ) == 0 )
571 : {
572 0 : if( aPt.Y() < aSize.Height() / 3 )
573 0 : y = aPtLT.Y();
574 0 : else if( aPt.Y() < aSize.Height() * 2 / 3 )
575 0 : y = aPtMM.Y();
576 : else
577 0 : y = aPtRB.Y();
578 : }
579 : else
580 0 : y = aPtMM.Y();
581 :
582 0 : return Point( x, y );
583 : }
584 :
585 :
586 : // Converts Point in RECT_POINT
587 :
588 0 : RECT_POINT SvxRectCtl::GetRPFromPoint( Point aPt ) const
589 : {
590 0 : if ( aPt == aPtLT) return RP_LT;
591 0 : else if( aPt == aPtMT) return RP_MT;
592 0 : else if( aPt == aPtRT) return RP_RT;
593 0 : else if( aPt == aPtLM) return RP_LM;
594 0 : else if( aPt == aPtRM) return RP_RM;
595 0 : else if( aPt == aPtLB) return RP_LB;
596 0 : else if( aPt == aPtMB) return RP_MB;
597 0 : else if( aPt == aPtRB) return RP_RB;
598 :
599 : else
600 0 : return RP_MM; // default
601 : }
602 :
603 : // Resets to the original state of the control
604 :
605 0 : void SvxRectCtl::Reset()
606 : {
607 0 : aPtNew = GetPointFromRP( eDefRP );
608 0 : eRP = eDefRP;
609 0 : Invalidate();
610 0 : }
611 :
612 : // Returns the currently selected RECT_POINT
613 :
614 0 : RECT_POINT SvxRectCtl::GetActualRP() const
615 : {
616 0 : return( eRP );
617 : }
618 :
619 0 : void SvxRectCtl::SetActualRP( RECT_POINT eNewRP )
620 : {
621 0 : Point aPtLast( SetActualRPWithoutInvalidate( eNewRP ) );
622 :
623 0 : Invalidate( Rectangle( aPtLast - Point( nRadius, nRadius ), aPtLast + Point( nRadius, nRadius ) ) );
624 0 : Invalidate( Rectangle( aPtNew - Point( nRadius, nRadius ), aPtNew + Point( nRadius, nRadius ) ) );
625 :
626 : // notify accessibility object about change
627 0 : if( pAccContext )
628 0 : pAccContext->selectChild( eNewRP );
629 0 : }
630 :
631 0 : void SvxRectCtl::SetState( CTL_STATE nState )
632 : {
633 0 : m_nState = nState;
634 :
635 0 : Point aPtLast( GetPointFromRP( eRP ) );
636 0 : Point _aPtNew( aPtLast );
637 :
638 0 : if( (m_nState & CS_NOHORZ) != 0 )
639 0 : _aPtNew.X() = aPtMM.X();
640 :
641 0 : if( (m_nState & CS_NOVERT) != 0 )
642 0 : _aPtNew.Y() = aPtMM.Y();
643 :
644 0 : eRP = GetRPFromPoint( _aPtNew );
645 0 : Invalidate();
646 :
647 0 : if( WINDOW_TABPAGE == GetParent()->GetType() )
648 0 : ( (SvxTabPage*) GetParent() )->PointChanged( this, eRP );
649 0 : }
650 :
651 0 : sal_uInt8 SvxRectCtl::GetNumOfChildren( void ) const
652 : {
653 0 : return ( eCS == CS_ANGLE )? 8 : 9;
654 : }
655 :
656 0 : Rectangle SvxRectCtl::CalculateFocusRectangle( void ) const
657 : {
658 0 : Size aDstBtnSize( PixelToLogic( Size( 15, 15 ) ) );
659 0 : return Rectangle( aPtNew - Point( aDstBtnSize.Width() >> 1, aDstBtnSize.Height() >> 1 ), aDstBtnSize );
660 : }
661 :
662 0 : Rectangle SvxRectCtl::CalculateFocusRectangle( RECT_POINT eRectPoint ) const
663 : {
664 0 : Rectangle aRet;
665 0 : RECT_POINT eOldRectPoint = GetActualRP();
666 :
667 0 : if( eOldRectPoint == eRectPoint )
668 0 : aRet = CalculateFocusRectangle();
669 : else
670 : {
671 0 : SvxRectCtl* pThis = const_cast< SvxRectCtl* >( this );
672 :
673 0 : pThis->SetActualRPWithoutInvalidate( eRectPoint ); // no invalidation because it's only temporary!
674 0 : aRet = CalculateFocusRectangle();
675 :
676 0 : pThis->SetActualRPWithoutInvalidate( eOldRectPoint ); // no invalidation because nothing has changed!
677 : }
678 :
679 0 : return aRet;
680 : }
681 :
682 0 : Reference< XAccessible > SvxRectCtl::CreateAccessible()
683 : {
684 0 : Window* pParent = GetAccessibleParentWindow();
685 :
686 : DBG_ASSERT( pParent, "-SvxRectCtl::CreateAccessible(): No Parent!" );
687 :
688 0 : Reference< XAccessible > xAccParent = pParent->GetAccessible();
689 0 : if( xAccParent.is() )
690 : {
691 0 : pAccContext = new SvxRectCtlAccessibleContext( xAccParent, *this );
692 0 : pAccContext->acquire();
693 :
694 0 : SetActualRP( GetActualRP() );
695 :
696 0 : return pAccContext;
697 : }
698 : else
699 0 : return Reference< XAccessible >();
700 : }
701 :
702 0 : RECT_POINT SvxRectCtl::GetApproxRPFromPixPt( const ::com::sun::star::awt::Point& r ) const
703 : {
704 0 : return GetRPFromPoint( GetApproxLogPtFromPixPt( Point( r.X, r.Y ) ) );
705 : }
706 :
707 : // CompletelyDisabled() added to have a disabled state for SvxRectCtl
708 0 : void SvxRectCtl::DoCompletelyDisable(sal_Bool bNew)
709 : {
710 0 : mbCompleteDisable = bNew;
711 0 : Invalidate();
712 0 : }
713 :
714 : // Control for editing bitmaps
715 :
716 0 : SvxPixelCtl::SvxPixelCtl( Window* pParent, const ResId& rResId, sal_uInt16 nNumber ) :
717 : Control ( pParent, rResId ),
718 : nLines ( nNumber ),
719 0 : bPaintable ( sal_True )
720 : {
721 0 : aRectSize = GetOutputSize();
722 :
723 0 : SetPixelColor( Color( COL_BLACK ) );
724 0 : SetBackgroundColor( Color( COL_WHITE ) );
725 0 : SetLineColor( Application::GetSettings().GetStyleSettings().GetShadowColor() );
726 :
727 0 : nSquares = nLines * nLines;
728 0 : pPixel = new sal_uInt16[ nSquares ];
729 0 : memset(pPixel, 0, nSquares * sizeof(sal_uInt16));
730 0 : }
731 :
732 : // Destructor dealocating the dynamic array
733 :
734 0 : SvxPixelCtl::~SvxPixelCtl( )
735 : {
736 0 : delete []pPixel;
737 0 : }
738 :
739 : // Changes the foreground or Background color
740 :
741 0 : void SvxPixelCtl::ChangePixel( sal_uInt16 nPixel )
742 : {
743 0 : if( *( pPixel + nPixel) == 0 )
744 0 : *( pPixel + nPixel) = 1; // could be extended to more colors
745 : else
746 0 : *( pPixel + nPixel) = 0;
747 0 : }
748 :
749 : // The clicked rectangle is identified, to change its color
750 :
751 0 : void SvxPixelCtl::MouseButtonDown( const MouseEvent& rMEvt )
752 : {
753 0 : Point aPt = PixelToLogic( rMEvt.GetPosPixel() );
754 0 : Point aPtTl, aPtBr;
755 : sal_uInt16 nX, nY;
756 :
757 0 : nX = (sal_uInt16) ( aPt.X() * nLines / aRectSize.Width() );
758 0 : nY = (sal_uInt16) ( aPt.Y() * nLines / aRectSize.Height() );
759 :
760 0 : ChangePixel( nX + nY * nLines );
761 :
762 0 : aPtTl.X() = aRectSize.Width() * nX / nLines + 1;
763 0 : aPtBr.X() = aRectSize.Width() * (nX + 1) / nLines - 1;
764 0 : aPtTl.Y() = aRectSize.Height() * nY / nLines + 1;
765 0 : aPtBr.Y() = aRectSize.Height() * (nY + 1) / nLines - 1;
766 :
767 0 : Invalidate( Rectangle( aPtTl, aPtBr ) );
768 :
769 0 : if( WINDOW_TABPAGE == GetParent()->GetType() )
770 0 : ( (SvxTabPage*) GetParent() )->PointChanged( this, RP_MM ); // RectPoint is a dummy
771 0 : }
772 :
773 : // Draws the Control (Rectangle with nine circles)
774 :
775 0 : void SvxPixelCtl::Paint( const Rectangle& )
776 : {
777 : sal_uInt16 i, j, nTmp;
778 0 : Point aPtTl, aPtBr;
779 :
780 0 : if( bPaintable )
781 : {
782 : // Draw lines
783 0 : Control::SetLineColor( aLineColor );
784 0 : for( i = 1; i < nLines; i++)
785 : {
786 : // horizontal
787 0 : nTmp = (sal_uInt16) ( aRectSize.Height() * i / nLines );
788 0 : DrawLine( Point( 0, nTmp ), Point( aRectSize.Width(), nTmp ) );
789 : // vertically
790 0 : nTmp = (sal_uInt16) ( aRectSize.Width() * i / nLines );
791 0 : DrawLine( Point( nTmp, 0 ), Point( nTmp, aRectSize.Height() ) );
792 : }
793 :
794 : //Draw Rectangles (squares)
795 0 : Control::SetLineColor();
796 0 : sal_uInt16 nLastPixel = *pPixel ? 0 : 1;
797 :
798 0 : for( i = 0; i < nLines; i++)
799 : {
800 0 : aPtTl.Y() = aRectSize.Height() * i / nLines + 1;
801 0 : aPtBr.Y() = aRectSize.Height() * (i + 1) / nLines - 1;
802 :
803 0 : for( j = 0; j < nLines; j++)
804 : {
805 0 : aPtTl.X() = aRectSize.Width() * j / nLines + 1;
806 0 : aPtBr.X() = aRectSize.Width() * (j + 1) / nLines - 1;
807 :
808 0 : if ( *( pPixel + i * nLines + j ) != nLastPixel )
809 : {
810 0 : nLastPixel = *( pPixel + i * nLines + j );
811 : // Change color: 0 -> Background color
812 0 : SetFillColor( nLastPixel ? aPixelColor : aBackgroundColor );
813 : }
814 0 : DrawRect( Rectangle( aPtTl, aPtBr ) );
815 : }
816 : }
817 : } // bPaintable
818 : else
819 : {
820 0 : SetBackground( Wallpaper( Color( COL_LIGHTGRAY ) ) );
821 0 : Control::SetLineColor( Color( COL_LIGHTRED ) );
822 0 : DrawLine( Point( 0, 0 ), Point( aRectSize.Width(), aRectSize.Height() ) );
823 0 : DrawLine( Point( 0, aRectSize.Height() ), Point( aRectSize.Width(), 0 ) );
824 : }
825 0 : }
826 :
827 0 : void SvxPixelCtl::SetXBitmap( const XOBitmap& rXBmp )
828 : {
829 0 : if( rXBmp.GetBitmapType() == XBITMAP_8X8 )
830 : {
831 0 : aPixelColor = rXBmp.GetPixelColor();
832 0 : aBackgroundColor = rXBmp.GetBackgroundColor();
833 :
834 0 : sal_uInt16* pArray = rXBmp.GetPixelArray();
835 :
836 0 : for( sal_uInt16 i = 0; i < nSquares; i++ )
837 0 : *( pPixel + i ) = *( pArray + i );
838 : }
839 0 : }
840 :
841 : // Resets to the original state of the control
842 :
843 0 : void SvxPixelCtl::Reset()
844 : {
845 : // clear pixel area
846 0 : memset(pPixel, 0, nSquares * sizeof(sal_uInt16));
847 0 : Invalidate();
848 0 : }
849 :
850 : // Constructor: BitmapCtl for SvxPixelCtl
851 :
852 0 : SvxBitmapCtl::SvxBitmapCtl( Window* /*pParent*/, const Size& rSize )
853 : {
854 0 : aSize = rSize;
855 0 : }
856 :
857 0 : SvxBitmapCtl::~SvxBitmapCtl()
858 : {
859 0 : }
860 :
861 : // BitmapCtl: Returns the Bitmap
862 :
863 0 : XOBitmap SvxBitmapCtl::GetXBitmap()
864 : {
865 0 : XOBitmap aXOBitmap( pBmpArray, aPixelColor, aBackgroundColor );
866 :
867 0 : return( aXOBitmap );
868 : }
869 :
870 : // Fills the Listbox with color and strings
871 :
872 0 : void ColorLB::Fill( const XColorListRef &pColorTab )
873 : {
874 0 : long nCount = pColorTab->Count();
875 : XColorEntry* pEntry;
876 0 : SetUpdateMode( sal_False );
877 :
878 0 : for( long i = 0; i < nCount; i++ )
879 : {
880 0 : pEntry = pColorTab->GetColor( i );
881 0 : InsertEntry( pEntry->GetColor(), pEntry->GetName() );
882 : }
883 0 : SetUpdateMode( sal_True );
884 0 : }
885 :
886 : /************************************************************************/
887 :
888 0 : void ColorLB::Append( XColorEntry* pEntry, Bitmap* )
889 : {
890 0 : InsertEntry( pEntry->GetColor(), pEntry->GetName() );
891 0 : }
892 :
893 : /************************************************************************/
894 :
895 0 : void ColorLB::Modify( XColorEntry* pEntry, sal_uInt16 nPos, Bitmap* )
896 : {
897 0 : RemoveEntry( nPos );
898 0 : InsertEntry( pEntry->GetColor(), pEntry->GetName(), nPos );
899 0 : }
900 :
901 : // Fills the Listbox with color and strings
902 :
903 0 : void FillAttrLB::Fill( const XColorListRef &pColorTab )
904 : {
905 0 : long nCount = pColorTab->Count();
906 : XColorEntry* pEntry;
907 0 : SetUpdateMode( sal_False );
908 :
909 0 : for( long i = 0; i < nCount; i++ )
910 : {
911 0 : pEntry = pColorTab->GetColor( i );
912 0 : InsertEntry( pEntry->GetColor(), pEntry->GetName() );
913 : }
914 0 : SetUpdateMode( sal_True );
915 0 : }
916 :
917 : // Fills the listbox (provisional) with strings
918 :
919 0 : HatchingLB::HatchingLB( Window* pParent, ResId Id, sal_Bool bUserDraw /*= sal_True*/ )
920 : : ListBox( pParent, Id ),
921 : mpList ( NULL ),
922 0 : mbUserDraw( bUserDraw )
923 : {
924 0 : EnableUserDraw( mbUserDraw );
925 0 : }
926 :
927 0 : void HatchingLB::Fill( const XHatchListRef &pList )
928 : {
929 0 : mpList = pList;
930 : XHatchEntry* pEntry;
931 0 : long nCount = pList->Count();
932 :
933 0 : SetUpdateMode( sal_False );
934 :
935 0 : if( mbUserDraw )
936 : {
937 0 : for( long i = 0; i < nCount; i++ )
938 0 : InsertEntry( pList->GetHatch( i )->GetName() );
939 : }
940 : else
941 : {
942 0 : for( long i = 0; i < nCount; i++ )
943 : {
944 0 : pEntry = pList->GetHatch( i );
945 0 : Bitmap* pBitmap = pList->GetBitmap( i );
946 0 : if( pBitmap )
947 0 : InsertEntry( pEntry->GetName(), *pBitmap );
948 : else
949 0 : InsertEntry( pEntry->GetName() );
950 : }
951 : }
952 :
953 0 : SetUpdateMode( sal_True );
954 0 : }
955 :
956 0 : void HatchingLB::UserDraw( const UserDrawEvent& rUDEvt )
957 : {
958 0 : if( mpList != NULL )
959 : {
960 : // Draw gradient with borderrectangle
961 0 : const Rectangle& rDrawRect = rUDEvt.GetRect();
962 0 : Rectangle aRect( rDrawRect.Left()+1, rDrawRect.Top()+1, rDrawRect.Left()+33, rDrawRect.Bottom()-1 );
963 :
964 0 : sal_Int32 nId = rUDEvt.GetItemId();
965 0 : if( nId >= 0 && nId <= mpList->Count() )
966 : {
967 0 : OutputDevice* pDevice = rUDEvt.GetDevice();
968 :
969 0 : sal_uIntPtr nOldDrawMode = pDevice->GetDrawMode();
970 0 : pDevice->SetDrawMode( GetSettings().GetStyleSettings().GetHighContrastMode() ? OUTPUT_DRAWMODE_CONTRAST : OUTPUT_DRAWMODE_COLOR );
971 :
972 0 : XHatch& rXHatch = mpList->GetHatch( rUDEvt.GetItemId() )->GetHatch();
973 0 : MapMode aMode( MAP_100TH_MM );
974 0 : Hatch aHatch( (HatchStyle) rXHatch.GetHatchStyle(),
975 : rXHatch.GetColor(),
976 0 : rUDEvt.GetDevice()->LogicToPixel( Point( rXHatch.GetDistance(), 0 ), aMode ).X(),
977 0 : (sal_uInt16)rXHatch.GetAngle() );
978 0 : const Polygon aPolygon( aRect );
979 0 : const PolyPolygon aPolypoly( aPolygon );
980 0 : pDevice->DrawHatch( aPolypoly, aHatch );
981 :
982 0 : pDevice->SetLineColor( COL_BLACK );
983 0 : pDevice->SetFillColor();
984 0 : pDevice->DrawRect( aRect );
985 :
986 0 : pDevice->SetDrawMode( nOldDrawMode );
987 :
988 : // Draw name
989 0 : pDevice->DrawText( Point( aRect.Right()+7, aRect.Top()-1 ), mpList->GetHatch( rUDEvt.GetItemId() )->GetName() );
990 : }
991 : }
992 0 : }
993 :
994 : /************************************************************************/
995 :
996 0 : void HatchingLB::Append( XHatchEntry* pEntry, Bitmap* pBmp )
997 : {
998 0 : if( pBmp )
999 0 : InsertEntry( pEntry->GetName(), *pBmp );
1000 : else
1001 0 : InsertEntry( pEntry->GetName() );
1002 0 : }
1003 :
1004 : /************************************************************************/
1005 :
1006 0 : void HatchingLB::Modify( XHatchEntry* pEntry, sal_uInt16 nPos, Bitmap* pBmp )
1007 : {
1008 0 : RemoveEntry( nPos );
1009 :
1010 0 : if( pBmp )
1011 0 : InsertEntry( pEntry->GetName(), *pBmp, nPos );
1012 : else
1013 0 : InsertEntry( pEntry->GetName(), nPos );
1014 0 : }
1015 :
1016 : // Fills the listbox (provisional) with strings
1017 :
1018 0 : void FillAttrLB::Fill( const XHatchListRef &pList )
1019 : {
1020 0 : long nCount = pList->Count();
1021 : XHatchEntry* pEntry;
1022 0 : ListBox::SetUpdateMode( sal_False );
1023 :
1024 0 : for( long i = 0; i < nCount; i++ )
1025 : {
1026 0 : pEntry = pList->GetHatch( i );
1027 0 : Bitmap* pBitmap = pList->GetBitmap( i );
1028 0 : if( pBitmap )
1029 0 : ListBox::InsertEntry( pEntry->GetName(), *pBitmap );
1030 : else
1031 0 : InsertEntry( pEntry->GetName() );
1032 : }
1033 0 : ListBox::SetUpdateMode( sal_True );
1034 0 : }
1035 :
1036 : // Fills the listbox (provisional) with strings
1037 :
1038 0 : GradientLB::GradientLB( Window* pParent, ResId Id, sal_Bool bUserDraw /*= sal_True*/ )
1039 : : ListBox( pParent, Id ),
1040 : mpList(NULL),
1041 0 : mbUserDraw( bUserDraw )
1042 : {
1043 0 : EnableUserDraw( mbUserDraw);
1044 0 : }
1045 :
1046 0 : void GradientLB::Fill( const XGradientListRef &pList )
1047 : {
1048 0 : mpList = pList;
1049 : XGradientEntry* pEntry;
1050 0 : long nCount = pList->Count();
1051 :
1052 0 : SetUpdateMode( sal_False );
1053 :
1054 0 : if( mbUserDraw )
1055 : {
1056 0 : for( long i = 0; i < nCount; i++ )
1057 0 : InsertEntry( pList->GetGradient( i )->GetName() );
1058 : }
1059 : else
1060 : {
1061 0 : for( long i = 0; i < nCount; i++ )
1062 : {
1063 0 : pEntry = pList->GetGradient( i );
1064 0 : Bitmap* pBitmap = pList->GetBitmap( i );
1065 0 : if( pBitmap )
1066 0 : InsertEntry( pEntry->GetName(), *pBitmap );
1067 : else
1068 0 : InsertEntry( pEntry->GetName() );
1069 : }
1070 : }
1071 :
1072 0 : SetUpdateMode( sal_True );
1073 0 : }
1074 :
1075 0 : void GradientLB::UserDraw( const UserDrawEvent& rUDEvt )
1076 : {
1077 0 : if( mpList != NULL )
1078 : {
1079 : // Draw gradient with borderrectangle
1080 0 : const Rectangle& rDrawRect = rUDEvt.GetRect();
1081 0 : Rectangle aRect( rDrawRect.Left()+1, rDrawRect.Top()+1, rDrawRect.Left()+33, rDrawRect.Bottom()-1 );
1082 :
1083 0 : sal_Int32 nId = rUDEvt.GetItemId();
1084 0 : if( nId >= 0 && nId <= mpList->Count() )
1085 : {
1086 0 : OutputDevice* pDevice = rUDEvt.GetDevice();
1087 :
1088 0 : XGradient& rXGrad = mpList->GetGradient( rUDEvt.GetItemId() )->GetGradient();
1089 0 : Gradient aGradient( (GradientStyle) rXGrad.GetGradientStyle(), rXGrad.GetStartColor(), rXGrad.GetEndColor() );
1090 0 : aGradient.SetAngle( (sal_uInt16)rXGrad.GetAngle() );
1091 0 : aGradient.SetBorder( rXGrad.GetBorder() );
1092 0 : aGradient.SetOfsX( rXGrad.GetXOffset() );
1093 0 : aGradient.SetOfsY( rXGrad.GetYOffset() );
1094 0 : aGradient.SetStartIntensity( rXGrad.GetStartIntens() );
1095 0 : aGradient.SetEndIntensity( rXGrad.GetEndIntens() );
1096 0 : aGradient.SetSteps( 255 );
1097 :
1098 : // #i76307# always paint the preview in LTR, because this is what the document does
1099 0 : Window* pWin = dynamic_cast<Window*>(pDevice);
1100 0 : if( pWin && pWin->IsRTLEnabled() && Application::GetSettings().GetLayoutRTL())
1101 : {
1102 0 : long nWidth = pDevice->GetOutputSize().Width();
1103 :
1104 0 : pWin->EnableRTL( sal_False );
1105 :
1106 0 : Rectangle aMirrorRect( Point( nWidth - aRect.Left() - aRect.GetWidth(), aRect.Top() ),
1107 0 : aRect.GetSize() );
1108 :
1109 0 : pDevice->DrawGradient( aMirrorRect, aGradient );
1110 :
1111 0 : pWin->EnableRTL( sal_True );
1112 : }
1113 : else
1114 0 : pDevice->DrawGradient( aRect, aGradient );
1115 :
1116 0 : pDevice->SetLineColor( COL_BLACK );
1117 0 : pDevice->SetFillColor();
1118 0 : pDevice->DrawRect( aRect );
1119 :
1120 : // Draw name
1121 0 : pDevice->DrawText( Point( aRect.Right()+7, aRect.Top()-1 ), mpList->GetGradient( rUDEvt.GetItemId() )->GetName() );
1122 : }
1123 : }
1124 0 : }
1125 :
1126 : /************************************************************************/
1127 :
1128 0 : void GradientLB::Append( XGradientEntry* pEntry, Bitmap* pBmp )
1129 : {
1130 0 : if( pBmp )
1131 0 : InsertEntry( pEntry->GetName(), *pBmp );
1132 : else
1133 0 : InsertEntry( pEntry->GetName() );
1134 0 : }
1135 :
1136 : /************************************************************************/
1137 :
1138 0 : void GradientLB::Modify( XGradientEntry* pEntry, sal_uInt16 nPos, Bitmap* pBmp )
1139 : {
1140 0 : RemoveEntry( nPos );
1141 :
1142 0 : if( pBmp )
1143 0 : InsertEntry( pEntry->GetName(), *pBmp, nPos );
1144 : else
1145 0 : InsertEntry( pEntry->GetName(), nPos );
1146 0 : }
1147 :
1148 : /************************************************************************/
1149 :
1150 0 : void GradientLB::SelectEntryByList( const XGradientListRef &pList, const String& rStr,
1151 : const XGradient& rGradient, sal_uInt16 nDist )
1152 : {
1153 0 : long nCount = pList->Count();
1154 : XGradientEntry* pEntry;
1155 0 : sal_Bool bFound = sal_False;
1156 0 : String aStr;
1157 :
1158 : long i;
1159 0 : for( i = 0; i < nCount && !bFound; i++ )
1160 : {
1161 0 : pEntry = pList->GetGradient( i );
1162 :
1163 0 : aStr = pEntry->GetName();
1164 :
1165 0 : if( rStr == aStr && rGradient == pEntry->GetGradient() )
1166 0 : bFound = sal_True;
1167 : }
1168 0 : if( bFound )
1169 0 : SelectEntryPos( (sal_uInt16) ( i - 1 + nDist ) );
1170 0 : }
1171 :
1172 : // Fills the listbox (provisional) with strings
1173 :
1174 0 : void FillAttrLB::Fill( const XGradientListRef &pList )
1175 : {
1176 0 : long nCount = pList->Count();
1177 : XGradientEntry* pEntry;
1178 0 : ListBox::SetUpdateMode( sal_False );
1179 :
1180 0 : for( long i = 0; i < nCount; i++ )
1181 : {
1182 0 : pEntry = pList->GetGradient( i );
1183 0 : Bitmap* pBitmap = pList->GetBitmap( i );
1184 0 : if( pBitmap )
1185 0 : ListBox::InsertEntry( pEntry->GetName(), *pBitmap );
1186 : else
1187 0 : InsertEntry( pEntry->GetName() );
1188 : }
1189 0 : ListBox::SetUpdateMode( sal_True );
1190 0 : }
1191 :
1192 : // BitmapLB Constructor
1193 :
1194 0 : BitmapLB::BitmapLB( Window* pParent, ResId Id, sal_Bool bUserDraw /*= sal_True*/ )
1195 : : ListBox( pParent, Id ),
1196 : mpList( NULL ),
1197 0 : mbUserDraw( bUserDraw )
1198 : {
1199 0 : aVD.SetOutputSizePixel( Size( 32, 16 ) );
1200 0 : EnableUserDraw( mbUserDraw );
1201 0 : }
1202 :
1203 : /************************************************************************/
1204 :
1205 0 : void BitmapLB::SetVirtualDevice()
1206 : {
1207 0 : if( aBitmap.GetSizePixel().Width() > 8 ||
1208 0 : aBitmap.GetSizePixel().Height() > 8 )
1209 : {
1210 0 : aVD.DrawBitmap( Point( 0, 0 ), Size( 32, 16 ), aBitmap );
1211 : }
1212 : else
1213 : {
1214 0 : aVD.DrawBitmap( Point( 0, 0 ), aBitmap );
1215 0 : aVD.DrawBitmap( Point( 8, 0 ), aBitmap );
1216 0 : aVD.DrawBitmap( Point( 16, 0 ), aBitmap );
1217 0 : aVD.DrawBitmap( Point( 24, 0 ), aBitmap );
1218 0 : aVD.DrawBitmap( Point( 0, 8 ), aBitmap );
1219 0 : aVD.DrawBitmap( Point( 8, 8 ), aBitmap );
1220 0 : aVD.DrawBitmap( Point( 16, 8 ), aBitmap );
1221 0 : aVD.DrawBitmap( Point( 24, 8 ), aBitmap );
1222 : }
1223 0 : }
1224 :
1225 : /************************************************************************/
1226 :
1227 0 : void BitmapLB::Fill( const XBitmapListRef &pList )
1228 : {
1229 0 : mpList = pList;
1230 : XBitmapEntry* pEntry;
1231 0 : long nCount = pList->Count();
1232 :
1233 0 : SetUpdateMode( sal_False );
1234 :
1235 0 : if( mbUserDraw )
1236 : {
1237 0 : for( long i = 0; i < nCount; i++ )
1238 0 : InsertEntry( pList->GetBitmap( i )->GetName() );
1239 : }
1240 : else
1241 : {
1242 0 : for( long i = 0; i < nCount; i++ )
1243 : {
1244 0 : pEntry = pList->GetBitmap( i );
1245 0 : aBitmap = pEntry->GetXBitmap().GetBitmap();
1246 :
1247 0 : SetVirtualDevice();
1248 :
1249 0 : InsertEntry( pEntry->GetName(), aVD.GetBitmap( Point( 0, 2 ), Size( 32, 12 ) ) );
1250 : }
1251 : }
1252 :
1253 0 : SetUpdateMode( sal_True );
1254 0 : }
1255 :
1256 0 : void BitmapLB::UserDraw( const UserDrawEvent& rUDEvt )
1257 : {
1258 0 : if( mpList != NULL )
1259 : {
1260 : // Draw bitmap
1261 0 : const Rectangle& rDrawRect = rUDEvt.GetRect();
1262 0 : Rectangle aRect( rDrawRect.Left()+1, rDrawRect.Top()+1, rDrawRect.Left()+33, rDrawRect.Bottom()-1 );
1263 :
1264 0 : sal_Int32 nId = rUDEvt.GetItemId();
1265 0 : if( nId >= 0 && nId <= mpList->Count() )
1266 : {
1267 0 : Rectangle aClipRect( rDrawRect.Left()+1, rDrawRect.Top()+1, rDrawRect.Right()-1, rDrawRect.Bottom()-1 );
1268 :
1269 0 : OutputDevice* pDevice = rUDEvt.GetDevice();
1270 0 : pDevice->SetClipRegion( Region( aClipRect ) );
1271 :
1272 0 : aBitmap = mpList->GetBitmap( nId )->GetXBitmap().GetBitmap();
1273 :
1274 0 : long nPosBaseX = aRect.Left();
1275 0 : long nPosBaseY = aRect.Top();
1276 :
1277 0 : if( aBitmap.GetSizePixel().Width() > 8 ||
1278 0 : aBitmap.GetSizePixel().Height() > 8 )
1279 : {
1280 0 : pDevice->DrawBitmap( Point( nPosBaseX, nPosBaseY ), Size( 32, 16 ), aBitmap );
1281 : }
1282 : else
1283 : {
1284 0 : pDevice->DrawBitmap( Point( nPosBaseX+ 0, nPosBaseY+0 ), aBitmap );
1285 0 : pDevice->DrawBitmap( Point( nPosBaseX+ 8, nPosBaseY+0 ), aBitmap );
1286 0 : pDevice->DrawBitmap( Point( nPosBaseX+16, nPosBaseY+0 ), aBitmap );
1287 0 : pDevice->DrawBitmap( Point( nPosBaseX+24, nPosBaseY+0 ), aBitmap );
1288 0 : pDevice->DrawBitmap( Point( nPosBaseX+ 0, nPosBaseY+8 ), aBitmap );
1289 0 : pDevice->DrawBitmap( Point( nPosBaseX+ 8, nPosBaseY+8 ), aBitmap );
1290 0 : pDevice->DrawBitmap( Point( nPosBaseX+16, nPosBaseY+8 ), aBitmap );
1291 0 : pDevice->DrawBitmap( Point( nPosBaseX+24, nPosBaseY+8 ), aBitmap );
1292 : }
1293 :
1294 0 : pDevice->SetClipRegion();
1295 :
1296 : // Draw name
1297 0 : pDevice->DrawText( Point( aRect.Right()+7, aRect.Top()-1 ), mpList->GetBitmap( nId )->GetName() );
1298 : }
1299 : }
1300 0 : }
1301 :
1302 : /************************************************************************/
1303 :
1304 0 : void BitmapLB::Append( XBitmapEntry* pEntry, Bitmap* pBmp )
1305 : {
1306 0 : if( pBmp )
1307 : {
1308 0 : aBitmap = pEntry->GetXBitmap().GetBitmap();
1309 0 : SetVirtualDevice();
1310 0 : InsertEntry( pEntry->GetName(), aVD.GetBitmap( Point( 0, 2 ), Size( 32, 12 ) ) );
1311 : }
1312 : else
1313 0 : InsertEntry( pEntry->GetName() );
1314 0 : }
1315 :
1316 : /************************************************************************/
1317 :
1318 0 : void BitmapLB::Modify( XBitmapEntry* pEntry, sal_uInt16 nPos, Bitmap* pBmp )
1319 : {
1320 0 : RemoveEntry( nPos );
1321 :
1322 0 : if( pBmp )
1323 : {
1324 0 : aBitmap = pEntry->GetXBitmap().GetBitmap();
1325 0 : SetVirtualDevice();
1326 :
1327 0 : InsertEntry( pEntry->GetName(), aVD.GetBitmap( Point( 0, 2 ), Size( 32, 12 ) ), nPos );
1328 : }
1329 : else
1330 0 : InsertEntry( pEntry->GetName() );
1331 0 : }
1332 :
1333 : // FillAttrLB Constructor
1334 :
1335 0 : FillAttrLB::FillAttrLB( Window* pParent, WinBits aWB ) :
1336 0 : ColorListBox( pParent, aWB )
1337 : {
1338 0 : aVD.SetOutputSizePixel( Size( 32, 16 ) );
1339 0 : }
1340 :
1341 : /************************************************************************/
1342 :
1343 0 : void FillAttrLB::SetVirtualDevice()
1344 : {
1345 0 : if( aBitmap.GetSizePixel().Width() > 8 ||
1346 0 : aBitmap.GetSizePixel().Height() > 8 )
1347 : {
1348 0 : aVD.DrawBitmap( Point( 0, 0 ), Size( 32, 16 ), aBitmap );
1349 : }
1350 : else
1351 : {
1352 0 : aVD.DrawBitmap( Point( 0, 0 ), aBitmap );
1353 0 : aVD.DrawBitmap( Point( 8, 0 ), aBitmap );
1354 0 : aVD.DrawBitmap( Point( 16, 0 ), aBitmap );
1355 0 : aVD.DrawBitmap( Point( 24, 0 ), aBitmap );
1356 0 : aVD.DrawBitmap( Point( 0, 8 ), aBitmap );
1357 0 : aVD.DrawBitmap( Point( 8, 8 ), aBitmap );
1358 0 : aVD.DrawBitmap( Point( 16, 8 ), aBitmap );
1359 0 : aVD.DrawBitmap( Point( 24, 8 ), aBitmap );
1360 : }
1361 0 : }
1362 :
1363 : /************************************************************************/
1364 :
1365 0 : void FillAttrLB::Fill( const XBitmapListRef &pList )
1366 : {
1367 0 : long nCount = pList->Count();
1368 : XBitmapEntry* pEntry;
1369 0 : ListBox::SetUpdateMode( sal_False );
1370 :
1371 0 : for( long i = 0; i < nCount; i++ )
1372 : {
1373 0 : pEntry = pList->GetBitmap( i );
1374 0 : aBitmap = pEntry->GetXBitmap().GetBitmap();
1375 :
1376 0 : SetVirtualDevice();
1377 :
1378 0 : ListBox::InsertEntry( pEntry->GetName(), aVD.GetBitmap( Point( 0, 2 ), Size( 32, 12 ) ) );
1379 : }
1380 0 : ListBox::SetUpdateMode( sal_True );
1381 0 : }
1382 :
1383 : // Fills the listbox (provisional) with strings
1384 :
1385 0 : void FillTypeLB::Fill()
1386 : {
1387 0 : SetUpdateMode( sal_False );
1388 0 : InsertEntry( String( SVX_RES( RID_SVXSTR_INVISIBLE ) ) );
1389 0 : InsertEntry( String( SVX_RES( RID_SVXSTR_COLOR ) ) );
1390 0 : InsertEntry( String( SVX_RES( RID_SVXSTR_GRADIENT ) ) );
1391 0 : InsertEntry( String( SVX_RES( RID_SVXSTR_HATCH ) ) );
1392 0 : InsertEntry( String( SVX_RES( RID_SVXSTR_BITMAP ) ) );
1393 0 : SetUpdateMode( sal_True );
1394 0 : }
1395 :
1396 : // Fills the listbox (provisional) with strings
1397 :
1398 0 : void LineLB::Fill( const XDashListRef &pList )
1399 : {
1400 0 : long nCount = pList->Count();
1401 : XDashEntry* pEntry;
1402 0 : SetUpdateMode( sal_False );
1403 :
1404 0 : for( long i = 0; i < nCount; i++ )
1405 : {
1406 0 : pEntry = pList->GetDash( i );
1407 0 : Bitmap* pBitmap = pList->CreateBitmapForUI( i );
1408 0 : if( pBitmap )
1409 : {
1410 0 : InsertEntry( pEntry->GetName(), *pBitmap );
1411 0 : delete pBitmap;
1412 : }
1413 : else
1414 0 : InsertEntry( pEntry->GetName() );
1415 : }
1416 0 : SetUpdateMode( sal_True );
1417 0 : }
1418 :
1419 0 : void LineLB::FillStyles()
1420 : {
1421 0 : ResMgr& rMgr = DIALOG_MGR();
1422 :
1423 : // Line Styles
1424 0 : Clear();
1425 0 : InsertEntry( String( ResId( RID_SVXSTR_INVISIBLE, rMgr ) ) );
1426 :
1427 0 : const StyleSettings& rStyles = Application::GetSettings().GetStyleSettings();
1428 0 : Bitmap aBitmap ( SVX_RES ( RID_SVXCTRL_LINECTRL ) );
1429 0 : Color aSourceColors[2];
1430 0 : Color aDestColors[2];
1431 :
1432 0 : aSourceColors[0] = Color( COL_WHITE );
1433 0 : aSourceColors[1] = Color( COL_BLACK );
1434 :
1435 0 : aDestColors[0] = rStyles.GetFieldColor();
1436 0 : aDestColors[1] = rStyles.GetFieldTextColor();
1437 :
1438 0 : aBitmap.Replace ( aSourceColors, aDestColors, 2 );
1439 0 : Image aSolidLine ( aBitmap );
1440 0 : InsertEntry( String( ResId( RID_SVXSTR_SOLID, rMgr ) ), aSolidLine );
1441 0 : }
1442 :
1443 : /************************************************************************/
1444 :
1445 0 : void LineLB::Append( XDashEntry* pEntry, Bitmap* pBmp )
1446 : {
1447 0 : if( pBmp )
1448 0 : InsertEntry( pEntry->GetName(), *pBmp );
1449 : else
1450 0 : InsertEntry( pEntry->GetName() );
1451 0 : }
1452 :
1453 : /************************************************************************/
1454 :
1455 0 : void LineLB::Modify( XDashEntry* pEntry, sal_uInt16 nPos, Bitmap* pBmp )
1456 : {
1457 0 : RemoveEntry( nPos );
1458 :
1459 0 : if( pBmp )
1460 0 : InsertEntry( pEntry->GetName(), *pBmp, nPos );
1461 : else
1462 0 : InsertEntry( pEntry->GetName(), nPos );
1463 0 : }
1464 :
1465 : // Fills the listbox (provisional) with strings
1466 :
1467 0 : void LineEndLB::Fill( const XLineEndListRef &pList, sal_Bool bStart )
1468 : {
1469 0 : long nCount = pList->Count();
1470 : XLineEndEntry* pEntry;
1471 0 : VirtualDevice aVD;
1472 0 : SetUpdateMode( sal_False );
1473 :
1474 0 : for( long i = 0; i < nCount; i++ )
1475 : {
1476 0 : pEntry = pList->GetLineEnd( i );
1477 0 : Bitmap* pBitmap = pList->CreateBitmapForUI( i );
1478 0 : if( pBitmap )
1479 : {
1480 0 : Size aBmpSize( pBitmap->GetSizePixel() );
1481 0 : aVD.SetOutputSizePixel( aBmpSize, sal_False );
1482 0 : aVD.DrawBitmap( Point(), *pBitmap );
1483 0 : InsertEntry( pEntry->GetName(),
1484 0 : aVD.GetBitmap( bStart ? Point() : Point( aBmpSize.Width() / 2, 0 ),
1485 0 : Size( aBmpSize.Width() / 2, aBmpSize.Height() ) ) );
1486 :
1487 0 : delete pBitmap;
1488 : }
1489 : else
1490 0 : InsertEntry( pEntry->GetName() );
1491 : }
1492 0 : SetUpdateMode( sal_True );
1493 0 : }
1494 :
1495 : /************************************************************************/
1496 :
1497 0 : void LineEndLB::Append( XLineEndEntry* pEntry, Bitmap* pBmp,
1498 : sal_Bool bStart )
1499 : {
1500 0 : if( pBmp )
1501 : {
1502 0 : VirtualDevice aVD;
1503 0 : Size aBmpSize( pBmp->GetSizePixel() );
1504 :
1505 0 : aVD.SetOutputSizePixel( aBmpSize, sal_False );
1506 0 : aVD.DrawBitmap( Point(), *pBmp );
1507 0 : InsertEntry( pEntry->GetName(),
1508 0 : aVD.GetBitmap( bStart ? Point() : Point( aBmpSize.Width() / 2, 0 ),
1509 0 : Size( aBmpSize.Width() / 2, aBmpSize.Height() ) ) );
1510 : }
1511 : else
1512 0 : InsertEntry( pEntry->GetName() );
1513 0 : }
1514 :
1515 : /************************************************************************/
1516 :
1517 0 : void LineEndLB::Modify( XLineEndEntry* pEntry, sal_uInt16 nPos, Bitmap* pBmp,
1518 : sal_Bool bStart )
1519 : {
1520 0 : RemoveEntry( nPos );
1521 :
1522 0 : if( pBmp )
1523 : {
1524 0 : VirtualDevice aVD;
1525 0 : Size aBmpSize( pBmp->GetSizePixel() );
1526 :
1527 0 : aVD.SetOutputSizePixel( aBmpSize, sal_False );
1528 0 : aVD.DrawBitmap( Point(), *pBmp );
1529 0 : InsertEntry( pEntry->GetName(),
1530 0 : aVD.GetBitmap( bStart ? Point() : Point( aBmpSize.Width() / 2, 0 ),
1531 0 : Size( aBmpSize.Width() / 2, aBmpSize.Height() ) ), nPos );
1532 : }
1533 : else
1534 0 : InsertEntry( pEntry->GetName(), nPos );
1535 0 : }
1536 :
1537 : //////////////////////////////////////////////////////////////////////////////
1538 :
1539 0 : void SvxPreviewBase::InitSettings(bool bForeground, bool bBackground)
1540 : {
1541 0 : const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
1542 :
1543 0 : if(bForeground)
1544 : {
1545 0 : svtools::ColorConfig aColorConfig;
1546 0 : Color aTextColor(aColorConfig.GetColorValue(svtools::FONTCOLOR).nColor);
1547 :
1548 0 : if(IsControlForeground())
1549 : {
1550 0 : aTextColor = GetControlForeground();
1551 : }
1552 :
1553 0 : getBufferDevice().SetTextColor(aTextColor);
1554 : }
1555 :
1556 0 : if(bBackground)
1557 : {
1558 0 : if(IsControlBackground())
1559 : {
1560 0 : getBufferDevice().SetBackground(GetControlBackground());
1561 : }
1562 : else
1563 : {
1564 0 : getBufferDevice().SetBackground(rStyleSettings.GetWindowColor());
1565 : }
1566 : }
1567 :
1568 : // do not paint background self, it gets painted buffered
1569 0 : SetControlBackground();
1570 0 : SetBackground();
1571 :
1572 0 : Invalidate();
1573 0 : }
1574 :
1575 0 : SvxPreviewBase::SvxPreviewBase( Window* pParent, const ResId& rResId )
1576 : : Control( pParent, rResId ),
1577 0 : mpModel( new SdrModel() ),
1578 0 : mpBufferDevice( new VirtualDevice(*this) )
1579 : {
1580 : // Draw the control's border as a flat thin black line.
1581 0 : SetBorderStyle(WINDOW_BORDER_MONO);
1582 0 : SetDrawMode( GetSettings().GetStyleSettings().GetHighContrastMode() ? OUTPUT_DRAWMODE_CONTRAST : OUTPUT_DRAWMODE_COLOR );
1583 0 : SetMapMode(MAP_100TH_MM);
1584 :
1585 : // init model
1586 0 : mpModel->GetItemPool().FreezeIdRanges();
1587 0 : }
1588 :
1589 0 : SvxPreviewBase::~SvxPreviewBase()
1590 : {
1591 0 : delete mpModel;
1592 0 : delete mpBufferDevice;
1593 0 : }
1594 :
1595 0 : void SvxPreviewBase::LocalPrePaint()
1596 : {
1597 : // init BufferDevice
1598 0 : if(mpBufferDevice->GetOutputSizePixel() != GetOutputSizePixel())
1599 : {
1600 0 : mpBufferDevice->SetDrawMode(GetDrawMode());
1601 0 : mpBufferDevice->SetSettings(GetSettings());
1602 0 : mpBufferDevice->SetAntialiasing(GetAntialiasing());
1603 0 : mpBufferDevice->SetOutputSizePixel(GetOutputSizePixel());
1604 0 : mpBufferDevice->SetMapMode(GetMapMode());
1605 : }
1606 :
1607 0 : mpBufferDevice->Erase();
1608 0 : }
1609 :
1610 0 : void SvxPreviewBase::LocalPostPaint()
1611 : {
1612 : // copy to front (in pixel mode)
1613 0 : const bool bWasEnabledSrc(mpBufferDevice->IsMapModeEnabled());
1614 0 : const bool bWasEnabledDst(IsMapModeEnabled());
1615 0 : const Point aEmptyPoint;
1616 :
1617 0 : mpBufferDevice->EnableMapMode(false);
1618 0 : EnableMapMode(false);
1619 :
1620 : DrawOutDev(
1621 0 : aEmptyPoint, GetOutputSizePixel(),
1622 0 : aEmptyPoint, GetOutputSizePixel(),
1623 0 : *mpBufferDevice);
1624 :
1625 0 : mpBufferDevice->EnableMapMode(bWasEnabledSrc);
1626 0 : EnableMapMode(bWasEnabledDst);
1627 0 : }
1628 :
1629 0 : void SvxPreviewBase::StateChanged(StateChangedType nType)
1630 : {
1631 0 : Control::StateChanged(nType);
1632 :
1633 0 : if(STATE_CHANGE_CONTROLFOREGROUND == nType)
1634 : {
1635 0 : InitSettings(true, false);
1636 : }
1637 0 : else if(STATE_CHANGE_CONTROLBACKGROUND == nType)
1638 : {
1639 0 : InitSettings(false, true);
1640 : }
1641 0 : }
1642 :
1643 0 : void SvxPreviewBase::DataChanged(const DataChangedEvent& rDCEvt)
1644 : {
1645 0 : SetDrawMode(GetSettings().GetStyleSettings().GetHighContrastMode() ? OUTPUT_DRAWMODE_CONTRAST : OUTPUT_DRAWMODE_COLOR);
1646 :
1647 0 : if((DATACHANGED_SETTINGS == rDCEvt.GetType()) && (rDCEvt.GetFlags() & SETTINGS_STYLE))
1648 : {
1649 0 : InitSettings(true, true);
1650 : }
1651 : else
1652 : {
1653 0 : Control::DataChanged(rDCEvt);
1654 : }
1655 0 : }
1656 :
1657 0 : SvxXLinePreview::SvxXLinePreview( Window* pParent, const ResId& rResId )
1658 : : SvxPreviewBase( pParent, rResId ),
1659 : mpLineObjA( 0L ),
1660 : mpLineObjB( 0L ),
1661 : mpLineObjC( 0L ),
1662 : mpGraphic( 0L ),
1663 0 : mbWithSymbol( sal_False )
1664 : {
1665 0 : const Size aOutputSize(GetOutputSize());
1666 0 : InitSettings( sal_True, sal_True );
1667 :
1668 0 : const sal_Int32 nDistance(500L);
1669 0 : const sal_Int32 nAvailableLength(aOutputSize.Width() - (4 * nDistance));
1670 :
1671 : // create DrawObectA
1672 0 : const sal_Int32 aYPosA(aOutputSize.Height() / 2);
1673 0 : const basegfx::B2DPoint aPointA1( nDistance, aYPosA);
1674 0 : const basegfx::B2DPoint aPointA2( aPointA1.getX() + ((nAvailableLength * 14) / 20), aYPosA );
1675 0 : basegfx::B2DPolygon aPolygonA;
1676 0 : aPolygonA.append(aPointA1);
1677 0 : aPolygonA.append(aPointA2);
1678 0 : mpLineObjA = new SdrPathObj(OBJ_LINE, basegfx::B2DPolyPolygon(aPolygonA));
1679 0 : mpLineObjA->SetModel(&getModel());
1680 :
1681 : // create DrawObectB
1682 0 : const sal_Int32 aYPosB1((aOutputSize.Height() * 3) / 4);
1683 0 : const sal_Int32 aYPosB2((aOutputSize.Height() * 1) / 4);
1684 0 : const basegfx::B2DPoint aPointB1( aPointA2.getX() + nDistance, aYPosB1);
1685 0 : const basegfx::B2DPoint aPointB2( aPointB1.getX() + ((nAvailableLength * 2) / 20), aYPosB2 );
1686 0 : const basegfx::B2DPoint aPointB3( aPointB2.getX() + ((nAvailableLength * 2) / 20), aYPosB1 );
1687 0 : basegfx::B2DPolygon aPolygonB;
1688 0 : aPolygonB.append(aPointB1);
1689 0 : aPolygonB.append(aPointB2);
1690 0 : aPolygonB.append(aPointB3);
1691 0 : mpLineObjB = new SdrPathObj(OBJ_PLIN, basegfx::B2DPolyPolygon(aPolygonB));
1692 0 : mpLineObjB->SetModel(&getModel());
1693 :
1694 : // create DrawObectC
1695 0 : const basegfx::B2DPoint aPointC1( aPointB3.getX() + nDistance, aYPosB1);
1696 0 : const basegfx::B2DPoint aPointC2( aPointC1.getX() + ((nAvailableLength * 1) / 20), aYPosB2 );
1697 0 : const basegfx::B2DPoint aPointC3( aPointC2.getX() + ((nAvailableLength * 1) / 20), aYPosB1 );
1698 0 : basegfx::B2DPolygon aPolygonC;
1699 0 : aPolygonC.append(aPointC1);
1700 0 : aPolygonC.append(aPointC2);
1701 0 : aPolygonC.append(aPointC3);
1702 0 : mpLineObjC = new SdrPathObj(OBJ_PLIN, basegfx::B2DPolyPolygon(aPolygonC));
1703 0 : mpLineObjC->SetModel(&getModel());
1704 0 : }
1705 :
1706 0 : SvxXLinePreview::~SvxXLinePreview()
1707 : {
1708 0 : SdrObject::Free( mpLineObjA );
1709 0 : SdrObject::Free( mpLineObjB );
1710 0 : SdrObject::Free( mpLineObjC );
1711 0 : }
1712 :
1713 : // -----------------------------------------------------------------------
1714 :
1715 0 : void SvxXLinePreview::SetSymbol(Graphic* p,const Size& s)
1716 : {
1717 0 : mpGraphic = p;
1718 0 : maSymbolSize = s;
1719 0 : }
1720 :
1721 : // -----------------------------------------------------------------------
1722 :
1723 0 : void SvxXLinePreview::ResizeSymbol(const Size& s)
1724 : {
1725 0 : if ( s != maSymbolSize )
1726 : {
1727 0 : maSymbolSize = s;
1728 0 : Invalidate();
1729 : }
1730 0 : }
1731 :
1732 : // -----------------------------------------------------------------------
1733 :
1734 0 : void SvxXLinePreview::SetLineAttributes(const SfxItemSet& rItemSet)
1735 : {
1736 : // Set ItemSet at objects
1737 0 : mpLineObjA->SetMergedItemSet(rItemSet);
1738 :
1739 : // At line joints, do not use arrows
1740 0 : SfxItemSet aTempSet(rItemSet);
1741 0 : aTempSet.ClearItem(XATTR_LINESTART);
1742 0 : aTempSet.ClearItem(XATTR_LINEEND);
1743 :
1744 0 : mpLineObjB->SetMergedItemSet(aTempSet);
1745 0 : mpLineObjC->SetMergedItemSet(aTempSet);
1746 0 : }
1747 :
1748 : // -----------------------------------------------------------------------
1749 :
1750 0 : void SvxXLinePreview::Paint( const Rectangle& )
1751 : {
1752 0 : LocalPrePaint();
1753 :
1754 : // paint objects to buffer device
1755 0 : sdr::contact::SdrObjectVector aObjectVector;
1756 0 : aObjectVector.push_back(mpLineObjA);
1757 0 : aObjectVector.push_back(mpLineObjB);
1758 0 : aObjectVector.push_back(mpLineObjC);
1759 :
1760 0 : sdr::contact::ObjectContactOfObjListPainter aPainter(getBufferDevice(), aObjectVector, 0);
1761 0 : sdr::contact::DisplayInfo aDisplayInfo;
1762 :
1763 : // do processing
1764 0 : aPainter.ProcessDisplay(aDisplayInfo);
1765 :
1766 0 : if ( mbWithSymbol && mpGraphic )
1767 : {
1768 0 : const Size aOutputSize(GetOutputSize());
1769 0 : Point aPos = Point( aOutputSize.Width() / 3, aOutputSize.Height() / 2 );
1770 0 : aPos.X() -= maSymbolSize.Width() / 2;
1771 0 : aPos.Y() -= maSymbolSize.Height() / 2;
1772 0 : mpGraphic->Draw( &getBufferDevice(), aPos, maSymbolSize );
1773 : }
1774 :
1775 0 : LocalPostPaint();
1776 0 : }
1777 :
1778 0 : SvxXRectPreview::SvxXRectPreview( Window* pParent, const ResId& rResId )
1779 : : SvxPreviewBase( pParent, rResId ),
1780 0 : mpRectangleObject(0)
1781 : {
1782 0 : InitSettings(true, true);
1783 :
1784 : // create RectangleObject
1785 0 : const Rectangle aObjectSize(Point(), GetOutputSize());
1786 0 : mpRectangleObject = new SdrRectObj(aObjectSize);
1787 0 : mpRectangleObject->SetModel(&getModel());
1788 0 : }
1789 :
1790 0 : SvxXRectPreview::~SvxXRectPreview()
1791 : {
1792 0 : SdrObject::Free(mpRectangleObject);
1793 0 : }
1794 :
1795 0 : void SvxXRectPreview::SetAttributes(const SfxItemSet& rItemSet)
1796 : {
1797 0 : mpRectangleObject->SetMergedItemSet(rItemSet, true);
1798 0 : mpRectangleObject->SetMergedItem(XLineStyleItem(XLINE_NONE));
1799 0 : }
1800 :
1801 0 : void SvxXRectPreview::Paint( const Rectangle& )
1802 : {
1803 0 : LocalPrePaint();
1804 :
1805 0 : sdr::contact::SdrObjectVector aObjectVector;
1806 :
1807 0 : aObjectVector.push_back(mpRectangleObject);
1808 :
1809 0 : sdr::contact::ObjectContactOfObjListPainter aPainter(getBufferDevice(), aObjectVector, 0);
1810 0 : sdr::contact::DisplayInfo aDisplayInfo;
1811 :
1812 0 : aPainter.ProcessDisplay(aDisplayInfo);
1813 :
1814 0 : LocalPostPaint();
1815 0 : }
1816 :
1817 0 : SvxXShadowPreview::SvxXShadowPreview( Window* pParent, const ResId& rResId )
1818 : : SvxPreviewBase( pParent, rResId ),
1819 : mpRectangleObject(0),
1820 0 : mpRectangleShadow(0)
1821 : {
1822 0 : InitSettings(true, true);
1823 :
1824 : // prepare size
1825 0 : Size aSize = GetOutputSize();
1826 0 : aSize.Width() = aSize.Width() / 3;
1827 0 : aSize.Height() = aSize.Height() / 3;
1828 :
1829 : // create RectangleObject
1830 0 : const Rectangle aObjectSize( Point( aSize.Width(), aSize.Height() ), aSize );
1831 0 : mpRectangleObject = new SdrRectObj(aObjectSize);
1832 0 : mpRectangleObject->SetModel(&getModel());
1833 :
1834 : // create ShadowObject
1835 0 : const Rectangle aShadowSize( Point( aSize.Width(), aSize.Height() ), aSize );
1836 0 : mpRectangleShadow = new SdrRectObj(aShadowSize);
1837 0 : mpRectangleShadow->SetModel(&getModel());
1838 0 : }
1839 :
1840 0 : SvxXShadowPreview::~SvxXShadowPreview()
1841 : {
1842 0 : SdrObject::Free(mpRectangleObject);
1843 0 : SdrObject::Free(mpRectangleShadow);
1844 0 : }
1845 :
1846 0 : void SvxXShadowPreview::SetRectangleAttributes(const SfxItemSet& rItemSet)
1847 : {
1848 0 : mpRectangleObject->SetMergedItemSet(rItemSet, true);
1849 0 : mpRectangleObject->SetMergedItem(XLineStyleItem(XLINE_NONE));
1850 0 : }
1851 :
1852 0 : void SvxXShadowPreview::SetShadowAttributes(const SfxItemSet& rItemSet)
1853 : {
1854 0 : mpRectangleShadow->SetMergedItemSet(rItemSet, true);
1855 0 : mpRectangleShadow->SetMergedItem(XLineStyleItem(XLINE_NONE));
1856 0 : }
1857 :
1858 0 : void SvxXShadowPreview::SetShadowPosition(const Point& rPos)
1859 : {
1860 0 : Rectangle aObjectPosition(mpRectangleObject->GetSnapRect());
1861 0 : aObjectPosition.Move(rPos.X(), rPos.Y());
1862 0 : mpRectangleShadow->SetSnapRect(aObjectPosition);
1863 0 : }
1864 :
1865 0 : void SvxXShadowPreview::Paint( const Rectangle& )
1866 : {
1867 0 : LocalPrePaint();
1868 :
1869 0 : sdr::contact::SdrObjectVector aObjectVector;
1870 :
1871 0 : aObjectVector.push_back(mpRectangleShadow);
1872 0 : aObjectVector.push_back(mpRectangleObject);
1873 :
1874 0 : sdr::contact::ObjectContactOfObjListPainter aPainter(getBufferDevice(), aObjectVector, 0);
1875 0 : sdr::contact::DisplayInfo aDisplayInfo;
1876 :
1877 0 : aPainter.ProcessDisplay(aDisplayInfo);
1878 :
1879 0 : LocalPostPaint();
1880 57 : }
1881 :
1882 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|