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 <vcl/builder.hxx>
21 : #include <vcl/svapp.hxx>
22 : #include <vcl/settings.hxx>
23 : #include <sfx2/dialoghelper.hxx>
24 : #include <svx/xtable.hxx>
25 : #include <svx/xpool.hxx>
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 <com/sun/star/accessibility/AccessibleEventObject.hpp>
35 : #include <com/sun/star/accessibility/AccessibleEventId.hpp>
36 : #include <com/sun/star/accessibility/AccessibleStateType.hpp>
37 : #include "svxpixelctlaccessiblecontext.hxx"
38 : #include <svtools/colorcfg.hxx>
39 : #include <svxrectctaccessiblecontext.hxx>
40 : #include <com/sun/star/lang/XUnoTunnel.hpp>
41 : #include <basegfx/point/b2dpoint.hxx>
42 : #include <basegfx/polygon/b2dpolygon.hxx>
43 : #include <svx/svdorect.hxx>
44 : #include <svx/svdmodel.hxx>
45 : #include <svx/svdopath.hxx>
46 : #include <svx/sdr/contact/objectcontactofobjlistpainter.hxx>
47 : #include <svx/sdr/contact/displayinfo.hxx>
48 : #include <vcl/bmpacc.hxx>
49 : #include <svx/xbtmpit.hxx>
50 :
51 : #define OUTPUT_DRAWMODE_COLOR (DRAWMODE_DEFAULT)
52 : #define OUTPUT_DRAWMODE_CONTRAST (DRAWMODE_SETTINGSLINE | DRAWMODE_SETTINGSFILL | DRAWMODE_SETTINGSTEXT | DRAWMODE_SETTINGSGRADIENT)
53 :
54 : using namespace ::com::sun::star::uno;
55 : using namespace ::com::sun::star::lang;
56 : using namespace ::com::sun::star::accessibility;
57 :
58 : // Control for display and selection of the corner points and
59 : // mid point of an object
60 :
61 0 : Bitmap& SvxRectCtl::GetRectBitmap( void )
62 : {
63 0 : if( !pBitmap )
64 0 : InitRectBitmap();
65 :
66 0 : return *pBitmap;
67 : }
68 :
69 0 : SvxRectCtl::SvxRectCtl(vcl::Window* pParent, RECT_POINT eRpt,
70 : sal_uInt16 nBorder, sal_uInt16 nCircle, CTL_STYLE eStyle)
71 : : Control(pParent, WB_BORDER | WB_TABSTOP)
72 : , pAccContext(NULL)
73 : , nBorderWidth(nBorder)
74 : , nRadius(nCircle)
75 : , eDefRP(eRpt)
76 : , eCS(eStyle)
77 : , pBitmap(NULL)
78 : , m_nState(0)
79 0 : , mbCompleteDisable(false)
80 : {
81 0 : SetMapMode(MAP_100TH_MM);
82 0 : Resize_Impl();
83 0 : }
84 :
85 0 : void SvxRectCtl::SetControlSettings(RECT_POINT eRpt, sal_uInt16 nBorder, sal_uInt16 nCircle, CTL_STYLE eStyle)
86 : {
87 0 : nBorderWidth = nBorder;
88 0 : nRadius = nCircle;
89 0 : eDefRP = eRpt;
90 0 : eCS = eStyle;
91 0 : Resize_Impl();
92 0 : }
93 :
94 0 : Size SvxRectCtl::GetOptimalSize() const
95 : {
96 0 : return LogicToPixel(Size(78, 39), MAP_APPFONT);
97 : }
98 :
99 0 : extern "C" SAL_DLLPUBLIC_EXPORT vcl::Window* SAL_CALL makeSvxRectCtl(vcl::Window *pParent, VclBuilder::stringmap &)
100 : {
101 0 : return new SvxRectCtl(pParent);
102 : }
103 :
104 :
105 :
106 0 : SvxRectCtl::~SvxRectCtl()
107 : {
108 0 : delete pBitmap;
109 :
110 0 : if( pAccContext )
111 0 : pAccContext->release();
112 0 : }
113 :
114 :
115 0 : void SvxRectCtl::Resize()
116 : {
117 0 : Resize_Impl();
118 0 : Control::Resize();
119 0 : }
120 :
121 :
122 :
123 0 : void SvxRectCtl::Resize_Impl()
124 : {
125 0 : aSize = GetOutputSize();
126 :
127 0 : switch( eCS )
128 : {
129 : case CS_RECT:
130 : case CS_ANGLE:
131 : case CS_SHADOW:
132 0 : aPtLT = Point( 0 + nBorderWidth, 0 + nBorderWidth );
133 0 : aPtMT = Point( aSize.Width() / 2, 0 + nBorderWidth );
134 0 : aPtRT = Point( aSize.Width() - nBorderWidth, 0 + nBorderWidth );
135 :
136 0 : aPtLM = Point( 0 + nBorderWidth, aSize.Height() / 2 );
137 0 : aPtMM = Point( aSize.Width() / 2, aSize.Height() / 2 );
138 0 : aPtRM = Point( aSize.Width() - nBorderWidth, aSize.Height() / 2 );
139 :
140 0 : aPtLB = Point( 0 + nBorderWidth, aSize.Height() - nBorderWidth );
141 0 : aPtMB = Point( aSize.Width() / 2, aSize.Height() - nBorderWidth );
142 0 : aPtRB = Point( aSize.Width() - nBorderWidth, aSize.Height() - nBorderWidth );
143 0 : break;
144 :
145 : case CS_LINE:
146 0 : aPtLT = Point( 0 + 3 * nBorderWidth, 0 + nBorderWidth );
147 0 : aPtMT = Point( aSize.Width() / 2, 0 + nBorderWidth );
148 0 : aPtRT = Point( aSize.Width() - 3 * nBorderWidth, 0 + nBorderWidth );
149 :
150 0 : aPtLM = Point( 0 + 3 * nBorderWidth, aSize.Height() / 2 );
151 0 : aPtMM = Point( aSize.Width() / 2, aSize.Height() / 2 );
152 0 : aPtRM = Point( aSize.Width() - 3 * nBorderWidth, aSize.Height() / 2 );
153 :
154 0 : aPtLB = Point( 0 + 3 * nBorderWidth, aSize.Height() - nBorderWidth );
155 0 : aPtMB = Point( aSize.Width() / 2, aSize.Height() - nBorderWidth );
156 0 : aPtRB = Point( aSize.Width() - 3 * nBorderWidth, aSize.Height() - nBorderWidth );
157 0 : break;
158 : }
159 0 : Reset();
160 0 : InitSettings( true, true );
161 0 : }
162 :
163 :
164 0 : void SvxRectCtl::InitRectBitmap( void )
165 : {
166 0 : delete pBitmap;
167 :
168 0 : const StyleSettings& rStyles = Application::GetSettings().GetStyleSettings();
169 0 : svtools::ColorConfig aColorConfig;
170 :
171 0 : pBitmap = new Bitmap( SVX_RES( RID_SVXCTRL_RECTBTNS ) );
172 :
173 : // set bitmap-colors
174 0 : Color aColorAry1[7];
175 0 : Color aColorAry2[7];
176 0 : aColorAry1[0] = Color( 0xC0, 0xC0, 0xC0 ); // light-gray
177 0 : aColorAry1[1] = Color( 0xFF, 0xFF, 0x00 ); // yellow
178 0 : aColorAry1[2] = Color( 0xFF, 0xFF, 0xFF ); // white
179 0 : aColorAry1[3] = Color( 0x80, 0x80, 0x80 ); // dark-gray
180 0 : aColorAry1[4] = Color( 0x00, 0x00, 0x00 ); // black
181 0 : aColorAry1[5] = Color( 0x00, 0xFF, 0x00 ); // green
182 0 : aColorAry1[6] = Color( 0x00, 0x00, 0xFF ); // blue
183 0 : aColorAry2[0] = rStyles.GetDialogColor(); // background
184 0 : aColorAry2[1] = rStyles.GetWindowColor();
185 0 : aColorAry2[2] = rStyles.GetLightColor();
186 0 : aColorAry2[3] = rStyles.GetShadowColor();
187 0 : aColorAry2[4] = rStyles.GetDarkShadowColor();
188 0 : aColorAry2[5] = Color( aColorConfig.GetColorValue( svtools::FONTCOLOR ).nColor );
189 0 : aColorAry2[6] = rStyles.GetDialogColor();
190 :
191 : #ifdef DBG_UTIL
192 : static bool bModify = false;
193 : bool& rModify = bModify;
194 : if( rModify )
195 : {
196 : static int n = 0;
197 : static sal_uInt8 r = 0xFF;
198 : static sal_uInt8 g = 0x00;
199 : static sal_uInt8 b = 0xFF;
200 : int& rn = n;
201 : sal_uInt8& rr = r;
202 : sal_uInt8& rg = g;
203 : sal_uInt8& rb = b;
204 : aColorAry2[ rn ] = Color( rr, rg, rb );
205 : }
206 : #endif
207 :
208 0 : pBitmap->Replace( aColorAry1, aColorAry2, 7, NULL );
209 0 : }
210 :
211 :
212 :
213 0 : void SvxRectCtl::InitSettings( bool bForeground, bool bBackground )
214 : {
215 0 : const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
216 :
217 0 : if( bForeground )
218 : {
219 0 : svtools::ColorConfig aColorConfig;
220 0 : Color aTextColor( aColorConfig.GetColorValue( svtools::FONTCOLOR ).nColor );
221 :
222 0 : if ( IsControlForeground() )
223 0 : aTextColor = GetControlForeground();
224 0 : SetTextColor( aTextColor );
225 : }
226 :
227 0 : if( bBackground )
228 : {
229 0 : if ( IsControlBackground() )
230 0 : SetBackground( GetControlBackground() );
231 : else
232 0 : SetBackground( rStyleSettings.GetWindowColor() );
233 : }
234 :
235 0 : delete pBitmap;
236 0 : pBitmap = NULL; // forces new creating of bitmap
237 :
238 0 : Invalidate();
239 0 : }
240 :
241 : // The clicked rectangle (3 x 3) is determined and the parent (dialog)
242 : // is notified that the item was changed
243 0 : void SvxRectCtl::MouseButtonDown( const MouseEvent& rMEvt )
244 : {
245 : // CompletelyDisabled() added to have a disabled state for SvxRectCtl
246 0 : if(!IsCompletelyDisabled())
247 : {
248 0 : Point aPtLast = aPtNew;
249 :
250 0 : aPtNew = GetApproxLogPtFromPixPt( rMEvt.GetPosPixel() );
251 :
252 0 : if( aPtNew == aPtMM && ( eCS == CS_SHADOW || eCS == CS_ANGLE ) )
253 : {
254 0 : aPtNew = aPtLast;
255 : }
256 : else
257 : {
258 0 : Invalidate( Rectangle( aPtLast - Point( nRadius, nRadius ),
259 0 : aPtLast + Point( nRadius, nRadius ) ) );
260 0 : Invalidate( Rectangle( aPtNew - Point( nRadius, nRadius ),
261 0 : aPtNew + Point( nRadius, nRadius ) ) );
262 0 : eRP = GetRPFromPoint( aPtNew );
263 :
264 0 : SetActualRP( eRP );
265 :
266 0 : vcl::Window *pTabPage = getNonLayoutParent(this);
267 0 : if (pTabPage && WINDOW_TABPAGE == pTabPage->GetType())
268 0 : static_cast<SvxTabPage*>(pTabPage)->PointChanged( this, eRP );
269 : }
270 : }
271 0 : }
272 :
273 0 : void SvxRectCtl::KeyInput( const KeyEvent& rKeyEvt )
274 : {
275 : // CompletelyDisabled() added to have a disabled state for SvxRectCtl
276 0 : if(!IsCompletelyDisabled())
277 : {
278 0 : RECT_POINT eNewRP = eRP;
279 0 : bool bUseMM = (eCS != CS_SHADOW) && (eCS != CS_ANGLE);
280 :
281 0 : switch( rKeyEvt.GetKeyCode().GetCode() )
282 : {
283 : case KEY_DOWN:
284 : {
285 0 : if( !(m_nState & CS_NOVERT) )
286 0 : switch( eNewRP )
287 : {
288 0 : case RP_LT: eNewRP = RP_LM; break;
289 0 : case RP_MT: eNewRP = bUseMM ? RP_MM : RP_MB; break;
290 0 : case RP_RT: eNewRP = RP_RM; break;
291 0 : case RP_LM: eNewRP = RP_LB; break;
292 0 : case RP_MM: eNewRP = RP_MB; break;
293 0 : case RP_RM: eNewRP = RP_RB; break;
294 : default: ; //prevent warning
295 : }
296 : }
297 0 : break;
298 : case KEY_UP:
299 : {
300 0 : if( !(m_nState & CS_NOVERT) )
301 0 : switch( eNewRP )
302 : {
303 0 : case RP_LM: eNewRP = RP_LT; break;
304 0 : case RP_MM: eNewRP = RP_MT; break;
305 0 : case RP_RM: eNewRP = RP_RT; break;
306 0 : case RP_LB: eNewRP = RP_LM; break;
307 0 : case RP_MB: eNewRP = bUseMM ? RP_MM : RP_MT; break;
308 0 : case RP_RB: eNewRP = RP_RM; break;
309 : default: ; //prevent warning
310 : }
311 : }
312 0 : break;
313 : case KEY_LEFT:
314 : {
315 0 : if( !(m_nState & CS_NOHORZ) )
316 0 : switch( eNewRP )
317 : {
318 0 : case RP_MT: eNewRP = RP_LT; break;
319 0 : case RP_RT: eNewRP = RP_MT; break;
320 0 : case RP_MM: eNewRP = RP_LM; break;
321 0 : case RP_RM: eNewRP = bUseMM ? RP_MM : RP_LM; break;
322 0 : case RP_MB: eNewRP = RP_LB; break;
323 0 : case RP_RB: eNewRP = RP_MB; break;
324 : default: ; //prevent warning
325 : }
326 : }
327 0 : break;
328 : case KEY_RIGHT:
329 : {
330 0 : if( !(m_nState & CS_NOHORZ) )
331 0 : switch( eNewRP )
332 : {
333 0 : case RP_LT: eNewRP = RP_MT; break;
334 0 : case RP_MT: eNewRP = RP_RT; break;
335 0 : case RP_LM: eNewRP = bUseMM ? RP_MM : RP_RM; break;
336 0 : case RP_MM: eNewRP = RP_RM; break;
337 0 : case RP_LB: eNewRP = RP_MB; break;
338 0 : case RP_MB: eNewRP = RP_RB; break;
339 : default: ; //prevent warning
340 : }
341 : }
342 0 : break;
343 : default:
344 0 : Control::KeyInput( rKeyEvt );
345 0 : return;
346 : }
347 0 : if( eNewRP != eRP )
348 : {
349 0 : SetActualRP( eNewRP );
350 :
351 0 : vcl::Window *pTabPage = getNonLayoutParent(this);
352 0 : if (pTabPage && WINDOW_TABPAGE == pTabPage->GetType())
353 0 : static_cast<SvxTabPage*>(pTabPage)->PointChanged(this, eRP);
354 :
355 0 : SetFocusRect();
356 : }
357 : }
358 : }
359 :
360 :
361 :
362 0 : void SvxRectCtl::StateChanged( StateChangedType nType )
363 : {
364 0 : if ( nType == StateChangedType::CONTROLFOREGROUND )
365 0 : InitSettings( true, false );
366 0 : else if ( nType == StateChangedType::CONTROLBACKGROUND )
367 0 : InitSettings( false, true );
368 :
369 0 : Window::StateChanged( nType );
370 0 : }
371 :
372 :
373 :
374 0 : void SvxRectCtl::DataChanged( const DataChangedEvent& rDCEvt )
375 : {
376 0 : if ( ( rDCEvt.GetType() == DATACHANGED_SETTINGS ) && ( rDCEvt.GetFlags() & SETTINGS_STYLE ) )
377 0 : InitSettings( true, true );
378 : else
379 0 : Window::DataChanged( rDCEvt );
380 0 : }
381 :
382 : // the control (rectangle with 9 circles)
383 :
384 0 : void SvxRectCtl::Paint( const Rectangle& )
385 : {
386 0 : Point aPtDiff( PixelToLogic( Point( 1, 1 ) ) );
387 :
388 0 : const StyleSettings& rStyles = Application::GetSettings().GetStyleSettings();
389 :
390 0 : SetLineColor( rStyles.GetDialogColor() );
391 0 : SetFillColor( rStyles.GetDialogColor() );
392 0 : DrawRect( Rectangle( Point(0,0), GetOutputSize() ) );
393 :
394 0 : if( IsEnabled() )
395 0 : SetLineColor( rStyles.GetLabelTextColor() );
396 : else
397 0 : SetLineColor( rStyles.GetShadowColor() );
398 :
399 0 : SetFillColor();
400 :
401 0 : switch( eCS )
402 : {
403 :
404 : case CS_RECT:
405 : case CS_SHADOW:
406 0 : if( !IsEnabled() )
407 : {
408 0 : Color aOldCol = GetLineColor();
409 0 : SetLineColor( rStyles.GetLightColor() );
410 0 : DrawRect( Rectangle( aPtLT + aPtDiff, aPtRB + aPtDiff ) );
411 0 : SetLineColor( aOldCol );
412 : }
413 0 : DrawRect( Rectangle( aPtLT, aPtRB ) );
414 0 : break;
415 :
416 : case CS_LINE:
417 0 : if( !IsEnabled() )
418 : {
419 0 : Color aOldCol = GetLineColor();
420 0 : SetLineColor( rStyles.GetLightColor() );
421 0 : DrawLine( aPtLM - Point( 2 * nBorderWidth, 0) + aPtDiff,
422 0 : aPtRM + Point( 2 * nBorderWidth, 0 ) + aPtDiff );
423 0 : SetLineColor( aOldCol );
424 : }
425 0 : DrawLine( aPtLM - Point( 2 * nBorderWidth, 0),
426 0 : aPtRM + Point( 2 * nBorderWidth, 0 ) );
427 0 : break;
428 :
429 : case CS_ANGLE:
430 0 : if( !IsEnabled() )
431 : {
432 0 : Color aOldCol = GetLineColor();
433 0 : SetLineColor( rStyles.GetLightColor() );
434 0 : DrawLine( aPtLT + aPtDiff, aPtRB + aPtDiff );
435 0 : DrawLine( aPtLB + aPtDiff, aPtRT + aPtDiff );
436 0 : DrawLine( aPtLM + aPtDiff, aPtRM + aPtDiff );
437 0 : DrawLine( aPtMT + aPtDiff, aPtMB + aPtDiff );
438 0 : SetLineColor( aOldCol );
439 : }
440 0 : DrawLine( aPtLT, aPtRB );
441 0 : DrawLine( aPtLB, aPtRT );
442 0 : DrawLine( aPtLM, aPtRM );
443 0 : DrawLine( aPtMT, aPtMB );
444 0 : break;
445 :
446 : default:
447 0 : break;
448 : }
449 0 : SetFillColor( GetBackground().GetColor() );
450 :
451 0 : Size aBtnSize( 11, 11 );
452 0 : Size aDstBtnSize( PixelToLogic( aBtnSize ) );
453 0 : Point aToCenter( aDstBtnSize.Width() >> 1, aDstBtnSize.Height() >> 1);
454 0 : Point aBtnPnt1( IsEnabled()?0:22,0 );
455 0 : Point aBtnPnt2( 11,0 );
456 0 : Point aBtnPnt3( 22,0 );
457 :
458 0 : bool bNoHorz = (m_nState & CS_NOHORZ) != 0;
459 0 : bool bNoVert = (m_nState & CS_NOVERT) != 0;
460 :
461 0 : Bitmap& rBitmap = GetRectBitmap();
462 :
463 : // CompletelyDisabled() added to have a disabled state for SvxRectCtl
464 0 : if(IsCompletelyDisabled())
465 : {
466 0 : DrawBitmap( aPtLT - aToCenter, aDstBtnSize, aBtnPnt3, aBtnSize, rBitmap );
467 0 : DrawBitmap( aPtMT - aToCenter, aDstBtnSize, aBtnPnt3, aBtnSize, rBitmap );
468 0 : DrawBitmap( aPtRT - aToCenter, aDstBtnSize, aBtnPnt3, aBtnSize, rBitmap );
469 0 : DrawBitmap( aPtLM - aToCenter, aDstBtnSize, aBtnPnt3, aBtnSize, rBitmap );
470 0 : if( eCS == CS_RECT || eCS == CS_LINE )
471 0 : DrawBitmap( aPtMM - aToCenter, aDstBtnSize, aBtnPnt3, aBtnSize, rBitmap );
472 0 : DrawBitmap( aPtRM - aToCenter, aDstBtnSize, aBtnPnt3, aBtnSize, rBitmap );
473 0 : DrawBitmap( aPtLB - aToCenter, aDstBtnSize, aBtnPnt3, aBtnSize, rBitmap );
474 0 : DrawBitmap( aPtMB - aToCenter, aDstBtnSize, aBtnPnt3, aBtnSize, rBitmap );
475 0 : DrawBitmap( aPtRB - aToCenter, aDstBtnSize, aBtnPnt3, aBtnSize, rBitmap );
476 : }
477 : else
478 : {
479 0 : DrawBitmap( aPtLT - aToCenter, aDstBtnSize, (bNoHorz || bNoVert)?aBtnPnt3:aBtnPnt1, aBtnSize, rBitmap );
480 0 : DrawBitmap( aPtMT - aToCenter, aDstBtnSize, bNoVert?aBtnPnt3:aBtnPnt1, aBtnSize, rBitmap );
481 0 : DrawBitmap( aPtRT - aToCenter, aDstBtnSize, (bNoHorz || bNoVert)?aBtnPnt3:aBtnPnt1, aBtnSize, rBitmap );
482 :
483 0 : DrawBitmap( aPtLM - aToCenter, aDstBtnSize, bNoHorz?aBtnPnt3:aBtnPnt1, aBtnSize, rBitmap );
484 :
485 : // Center for rectangle and line
486 0 : if( eCS == CS_RECT || eCS == CS_LINE )
487 0 : DrawBitmap( aPtMM - aToCenter, aDstBtnSize, aBtnPnt1, aBtnSize, rBitmap );
488 :
489 0 : DrawBitmap( aPtRM - aToCenter, aDstBtnSize, bNoHorz?aBtnPnt3:aBtnPnt1, aBtnSize, rBitmap );
490 :
491 0 : DrawBitmap( aPtLB - aToCenter, aDstBtnSize, (bNoHorz || bNoVert)?aBtnPnt3:aBtnPnt1, aBtnSize, rBitmap );
492 0 : DrawBitmap( aPtMB - aToCenter, aDstBtnSize, bNoVert?aBtnPnt3:aBtnPnt1, aBtnSize, rBitmap );
493 0 : DrawBitmap( aPtRB - aToCenter, aDstBtnSize, (bNoHorz || bNoVert)?aBtnPnt3:aBtnPnt1, aBtnSize, rBitmap );
494 : }
495 :
496 : // draw active button, avoid center pos for angle
497 : // CompletelyDisabled() added to have a disabled state for SvxRectCtl
498 0 : if(!IsCompletelyDisabled())
499 : {
500 0 : if( IsEnabled() && (eCS != CS_ANGLE || aPtNew != aPtMM) )
501 : {
502 0 : Point aCenterPt( aPtNew );
503 0 : aCenterPt -= aToCenter;
504 :
505 0 : DrawBitmap( aCenterPt, aDstBtnSize, aBtnPnt2, aBtnSize, rBitmap );
506 : }
507 : }
508 0 : }
509 :
510 : // Convert RECT_POINT Point
511 :
512 0 : Point SvxRectCtl::GetPointFromRP( RECT_POINT _eRP) const
513 : {
514 0 : switch( _eRP )
515 : {
516 0 : case RP_LT: return aPtLT;
517 0 : case RP_MT: return aPtMT;
518 0 : case RP_RT: return aPtRT;
519 0 : case RP_LM: return aPtLM;
520 0 : case RP_MM: return aPtMM;
521 0 : case RP_RM: return aPtRM;
522 0 : case RP_LB: return aPtLB;
523 0 : case RP_MB: return aPtMB;
524 0 : case RP_RB: return aPtRB;
525 : }
526 0 : return( aPtMM ); // default
527 : }
528 :
529 :
530 0 : void SvxRectCtl::SetFocusRect( const Rectangle* pRect )
531 : {
532 0 : HideFocus();
533 :
534 0 : if( pRect )
535 0 : ShowFocus( *pRect );
536 : else
537 0 : ShowFocus( CalculateFocusRectangle() );
538 0 : }
539 :
540 0 : Point SvxRectCtl::SetActualRPWithoutInvalidate( RECT_POINT eNewRP )
541 : {
542 0 : Point aPtLast = aPtNew;
543 0 : aPtNew = GetPointFromRP( eNewRP );
544 :
545 0 : if( (m_nState & CS_NOHORZ) != 0 )
546 0 : aPtNew.X() = aPtMM.X();
547 :
548 0 : if( (m_nState & CS_NOVERT) != 0 )
549 0 : aPtNew.Y() = aPtMM.Y();
550 :
551 : // fdo#74751 this fix reverse base point on RTL UI.
552 0 : bool bRTL = Application::GetSettings().GetLayoutRTL();
553 0 : eNewRP = GetRPFromPoint( aPtNew, bRTL );
554 :
555 0 : eDefRP = eNewRP;
556 0 : eRP = eNewRP;
557 :
558 0 : return aPtLast;
559 : }
560 :
561 0 : void SvxRectCtl::GetFocus()
562 : {
563 0 : SetFocusRect();
564 : // Send the accessible focused event
565 0 : Control::GetFocus();
566 : // Send accessibility event.
567 0 : if(pAccContext)
568 : {
569 0 : pAccContext->FireChildFocus(GetActualRP());
570 : }
571 0 : }
572 :
573 :
574 0 : void SvxRectCtl::LoseFocus()
575 : {
576 0 : HideFocus();
577 0 : }
578 :
579 :
580 0 : Point SvxRectCtl::GetApproxLogPtFromPixPt( const Point& rPt ) const
581 : {
582 0 : Point aPt = PixelToLogic( rPt );
583 : long x;
584 : long y;
585 :
586 0 : if( ( m_nState & CS_NOHORZ ) == 0 )
587 : {
588 0 : if( aPt.X() < aSize.Width() / 3 )
589 0 : x = aPtLT.X();
590 0 : else if( aPt.X() < aSize.Width() * 2 / 3 )
591 0 : x = aPtMM.X();
592 : else
593 0 : x = aPtRB.X();
594 : }
595 : else
596 0 : x = aPtMM.X();
597 :
598 0 : if( ( m_nState & CS_NOVERT ) == 0 )
599 : {
600 0 : if( aPt.Y() < aSize.Height() / 3 )
601 0 : y = aPtLT.Y();
602 0 : else if( aPt.Y() < aSize.Height() * 2 / 3 )
603 0 : y = aPtMM.Y();
604 : else
605 0 : y = aPtRB.Y();
606 : }
607 : else
608 0 : y = aPtMM.Y();
609 :
610 0 : return Point( x, y );
611 : }
612 :
613 :
614 : // Converts Point in RECT_POINT
615 :
616 0 : RECT_POINT SvxRectCtl::GetRPFromPoint( Point aPt, bool bRTL ) const
617 : {
618 0 : RECT_POINT rPoint = RP_MM; // default
619 :
620 0 : if ( aPt == aPtLT) rPoint = bRTL ? RP_RT : RP_LT;
621 0 : else if( aPt == aPtMT) rPoint = RP_MT;
622 0 : else if( aPt == aPtRT) rPoint = bRTL ? RP_LT : RP_RT;
623 0 : else if( aPt == aPtLM) rPoint = bRTL ? RP_RM : RP_LM;
624 0 : else if( aPt == aPtRM) rPoint = bRTL ? RP_LM : RP_RM;
625 0 : else if( aPt == aPtLB) rPoint = bRTL ? RP_RB : RP_LB;
626 0 : else if( aPt == aPtMB) rPoint = RP_MB;
627 0 : else if( aPt == aPtRB) rPoint = bRTL ? RP_LB : RP_RB;
628 :
629 0 : return rPoint;
630 : }
631 :
632 : // Resets to the original state of the control
633 :
634 0 : void SvxRectCtl::Reset()
635 : {
636 0 : aPtNew = GetPointFromRP( eDefRP );
637 0 : eRP = eDefRP;
638 0 : Invalidate();
639 0 : }
640 :
641 : // Returns the currently selected RECT_POINT
642 :
643 :
644 0 : void SvxRectCtl::SetActualRP( RECT_POINT eNewRP )
645 : {
646 0 : Point aPtLast( SetActualRPWithoutInvalidate( eNewRP ) );
647 :
648 0 : Invalidate( Rectangle( aPtLast - Point( nRadius, nRadius ), aPtLast + Point( nRadius, nRadius ) ) );
649 0 : Invalidate( Rectangle( aPtNew - Point( nRadius, nRadius ), aPtNew + Point( nRadius, nRadius ) ) );
650 :
651 : // notify accessibility object about change
652 0 : if( pAccContext )
653 0 : pAccContext->selectChild( eNewRP /* MT, bFireFocus */ );
654 0 : }
655 :
656 0 : void SvxRectCtl::SetState( CTL_STATE nState )
657 : {
658 0 : m_nState = nState;
659 :
660 0 : Point aPtLast( GetPointFromRP( eRP ) );
661 0 : Point _aPtNew( aPtLast );
662 :
663 0 : if( (m_nState & CS_NOHORZ) != 0 )
664 0 : _aPtNew.X() = aPtMM.X();
665 :
666 0 : if( (m_nState & CS_NOVERT) != 0 )
667 0 : _aPtNew.Y() = aPtMM.Y();
668 :
669 0 : eRP = GetRPFromPoint( _aPtNew );
670 0 : Invalidate();
671 :
672 0 : vcl::Window *pTabPage = getNonLayoutParent(this);
673 0 : if (pTabPage && WINDOW_TABPAGE == pTabPage->GetType())
674 0 : static_cast<SvxTabPage*>(pTabPage)->PointChanged(this, eRP);
675 0 : }
676 :
677 0 : sal_uInt8 SvxRectCtl::GetNumOfChildren( void ) const
678 : {
679 0 : return ( eCS == CS_ANGLE )? 8 : 9;
680 : }
681 :
682 0 : Rectangle SvxRectCtl::CalculateFocusRectangle( void ) const
683 : {
684 0 : Size aDstBtnSize( PixelToLogic( Size( 15, 15 ) ) );
685 0 : return Rectangle( aPtNew - Point( aDstBtnSize.Width() >> 1, aDstBtnSize.Height() >> 1 ), aDstBtnSize );
686 : }
687 :
688 0 : Rectangle SvxRectCtl::CalculateFocusRectangle( RECT_POINT eRectPoint ) const
689 : {
690 0 : Rectangle aRet;
691 0 : RECT_POINT eOldRectPoint = GetActualRP();
692 :
693 0 : if( eOldRectPoint == eRectPoint )
694 0 : aRet = CalculateFocusRectangle();
695 : else
696 : {
697 0 : SvxRectCtl* pThis = const_cast< SvxRectCtl* >( this );
698 :
699 0 : pThis->SetActualRPWithoutInvalidate( eRectPoint ); // no invalidation because it's only temporary!
700 0 : aRet = CalculateFocusRectangle();
701 :
702 0 : pThis->SetActualRPWithoutInvalidate( eOldRectPoint ); // no invalidation because nothing has changed!
703 : }
704 :
705 0 : return aRet;
706 : }
707 :
708 0 : Reference< XAccessible > SvxRectCtl::CreateAccessible()
709 : {
710 0 : vcl::Window* pParent = GetAccessibleParentWindow();
711 :
712 : DBG_ASSERT( pParent, "-SvxRectCtl::CreateAccessible(): No Parent!" );
713 :
714 0 : Reference< XAccessible > xAccParent = pParent->GetAccessible();
715 0 : if( xAccParent.is() )
716 : {
717 0 : pAccContext = new SvxRectCtlAccessibleContext( xAccParent, *this );
718 0 : pAccContext->acquire();
719 :
720 0 : SetActualRP( GetActualRP() );
721 :
722 0 : return pAccContext;
723 : }
724 : else
725 0 : return Reference< XAccessible >();
726 : }
727 :
728 0 : RECT_POINT SvxRectCtl::GetApproxRPFromPixPt( const ::com::sun::star::awt::Point& r ) const
729 : {
730 0 : return GetRPFromPoint( GetApproxLogPtFromPixPt( Point( r.X, r.Y ) ) );
731 : }
732 :
733 : // CompletelyDisabled() added to have a disabled state for SvxRectCtl
734 0 : void SvxRectCtl::DoCompletelyDisable(bool bNew)
735 : {
736 0 : mbCompleteDisable = bNew;
737 0 : Invalidate();
738 0 : }
739 :
740 0 : void SvxRectCtl::SetCS(CTL_STYLE eNew)
741 : {
742 0 : eCS = eNew;
743 0 : }
744 :
745 : // Control for editing bitmaps
746 :
747 0 : ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > SvxPixelCtl::CreateAccessible()
748 : {
749 0 : if(!m_xAccess.is())
750 : {
751 0 : m_xAccess = m_pAccess = new SvxPixelCtlAccessible(*this);
752 : }
753 0 : return m_xAccess;
754 : }
755 :
756 : //Logic Pixel
757 0 : long SvxPixelCtl::PointToIndex(const Point &aPt) const
758 : {
759 0 : long nX = aPt.X() * nLines / aRectSize.Width();
760 0 : long nY = aPt.Y() * nLines / aRectSize.Height();
761 :
762 0 : return nX + nY * nLines ;
763 : }
764 :
765 0 : Point SvxPixelCtl::IndexToPoint(long nIndex) const
766 : {
767 : DBG_ASSERT(nIndex >= 0 && nIndex < nSquares ," Check Index");
768 :
769 0 : sal_Int32 nXIndex = nIndex % nLines;
770 0 : sal_Int32 nYIndex = nIndex / nLines;
771 :
772 0 : Point aPtTl;
773 0 : aPtTl.Y() = aRectSize.Height() * nYIndex / nLines + 1;
774 0 : aPtTl.X() = aRectSize.Width() * nXIndex / nLines + 1;
775 :
776 0 : return aPtTl;
777 : }
778 :
779 0 : long SvxPixelCtl::GetFoucsPosIndex() const
780 : {
781 0 : return aFocusPosition.getX() + aFocusPosition.getY() * nLines ;
782 : }
783 :
784 0 : long SvxPixelCtl::ShowPosition( const Point &pt)
785 : {
786 0 : Point aPt = PixelToLogic( pt );
787 :
788 0 : sal_Int32 nX = aPt.X() * nLines / aRectSize.Width();
789 0 : sal_Int32 nY = aPt.Y() * nLines / aRectSize.Height();
790 :
791 0 : ChangePixel( nX + nY * nLines );
792 :
793 : //Solution:Set new focus position and repaint
794 : //Invalidate( Rectangle( aPtTl, aPtBr ) );
795 0 : aFocusPosition.setX(nX);
796 0 : aFocusPosition.setY(nY);
797 0 : Invalidate(Rectangle(Point(0,0),aRectSize));
798 :
799 0 : vcl::Window *pTabPage = getNonLayoutParent(this);
800 0 : if (pTabPage && WINDOW_TABPAGE == pTabPage->GetType())
801 0 : static_cast<SvxTabPage*>(pTabPage)->PointChanged( this, RP_MM ); // RectPoint ist dummy
802 :
803 0 : return GetFoucsPosIndex();
804 :
805 : }
806 :
807 0 : SvxPixelCtl::SvxPixelCtl(vcl::Window* pParent, sal_uInt16 nNumber)
808 : : Control(pParent, WB_BORDER)
809 : , nLines(nNumber)
810 : , bPaintable(true)
811 0 : , aFocusPosition(0,0)
812 : {
813 : assert(nLines); // can't have no lines
814 0 : SetPixelColor( Color( COL_BLACK ) );
815 0 : SetBackgroundColor( Color( COL_WHITE ) );
816 0 : SetLineColor( Application::GetSettings().GetStyleSettings().GetShadowColor() );
817 :
818 0 : nSquares = nLines * nLines;
819 0 : pPixel = new sal_uInt16[ nSquares ];
820 0 : memset(pPixel, 0, nSquares * sizeof(sal_uInt16));
821 0 : m_pAccess=NULL;
822 0 : }
823 :
824 0 : void SvxPixelCtl::Resize()
825 : {
826 0 : Control::Resize();
827 0 : aRectSize = GetOutputSize();
828 0 : }
829 :
830 0 : Size SvxPixelCtl::GetOptimalSize() const
831 : {
832 0 : return LogicToPixel(Size(72, 72), MAP_APPFONT);
833 : }
834 :
835 0 : extern "C" SAL_DLLPUBLIC_EXPORT vcl::Window* SAL_CALL makeSvxPixelCtl(vcl::Window *pParent, VclBuilder::stringmap&)
836 : {
837 0 : return new SvxPixelCtl(pParent, 8);
838 : }
839 : // Destructor dealocating the dynamic array
840 :
841 0 : SvxPixelCtl::~SvxPixelCtl( )
842 : {
843 0 : delete []pPixel;
844 0 : }
845 :
846 : // Changes the foreground or Background color
847 :
848 0 : void SvxPixelCtl::ChangePixel( sal_uInt16 nPixel )
849 : {
850 0 : if( *( pPixel + nPixel) == 0 )
851 0 : *( pPixel + nPixel) = 1; // could be extended to more colors
852 : else
853 0 : *( pPixel + nPixel) = 0;
854 0 : }
855 :
856 : // The clicked rectangle is identified, to change its color
857 :
858 0 : void SvxPixelCtl::MouseButtonDown( const MouseEvent& rMEvt )
859 : {
860 0 : if (!aRectSize.Width() || !aRectSize.Height())
861 0 : return;
862 :
863 : //Grab focus when click in window
864 0 : if (!HasFocus())
865 : {
866 0 : GrabFocus();
867 : }
868 :
869 0 : long nIndex = ShowPosition(rMEvt.GetPosPixel());
870 :
871 0 : if(m_pAccess)
872 : {
873 0 : m_pAccess->NotifyChild(nIndex,true, true);
874 : }
875 : }
876 :
877 : // Draws the Control (Rectangle with nine circles)
878 :
879 0 : void SvxPixelCtl::Paint( const Rectangle& )
880 : {
881 0 : if (!aRectSize.Width() || !aRectSize.Height())
882 0 : return;
883 :
884 : sal_uInt16 i, j, nTmp;
885 0 : Point aPtTl, aPtBr;
886 :
887 0 : if( bPaintable )
888 : {
889 : // Draw lines
890 0 : Control::SetLineColor( aLineColor );
891 0 : for( i = 1; i < nLines; i++)
892 : {
893 : // horizontal
894 0 : nTmp = (sal_uInt16) ( aRectSize.Height() * i / nLines );
895 0 : DrawLine( Point( 0, nTmp ), Point( aRectSize.Width(), nTmp ) );
896 : // vertically
897 0 : nTmp = (sal_uInt16) ( aRectSize.Width() * i / nLines );
898 0 : DrawLine( Point( nTmp, 0 ), Point( nTmp, aRectSize.Height() ) );
899 : }
900 :
901 : //Draw Rectangles (squares)
902 0 : Control::SetLineColor();
903 0 : sal_uInt16 nLastPixel = *pPixel ? 0 : 1;
904 :
905 0 : for( i = 0; i < nLines; i++)
906 : {
907 0 : aPtTl.Y() = aRectSize.Height() * i / nLines + 1;
908 0 : aPtBr.Y() = aRectSize.Height() * (i + 1) / nLines - 1;
909 :
910 0 : for( j = 0; j < nLines; j++)
911 : {
912 0 : aPtTl.X() = aRectSize.Width() * j / nLines + 1;
913 0 : aPtBr.X() = aRectSize.Width() * (j + 1) / nLines - 1;
914 :
915 0 : if ( *( pPixel + i * nLines + j ) != nLastPixel )
916 : {
917 0 : nLastPixel = *( pPixel + i * nLines + j );
918 : // Change color: 0 -> Background color
919 0 : SetFillColor( nLastPixel ? aPixelColor : aBackgroundColor );
920 : }
921 0 : DrawRect( Rectangle( aPtTl, aPtBr ) );
922 : }
923 : }
924 : //Draw visual focus when has focus
925 0 : if( HasFocus() )
926 : {
927 0 : ShowFocus(implCalFocusRect(aFocusPosition));
928 : }
929 : } // bPaintable
930 : else
931 : {
932 0 : SetBackground( Wallpaper( Color( COL_LIGHTGRAY ) ) );
933 0 : Control::SetLineColor( Color( COL_LIGHTRED ) );
934 0 : DrawLine( Point( 0, 0 ), Point( aRectSize.Width(), aRectSize.Height() ) );
935 0 : DrawLine( Point( 0, aRectSize.Height() ), Point( aRectSize.Width(), 0 ) );
936 : }
937 : }
938 :
939 : //Calculate visual focus rectangle via focus position
940 0 : Rectangle SvxPixelCtl::implCalFocusRect( const Point& aPosition )
941 : {
942 : long nLeft,nTop,nRight,nBottom;
943 : long i,j;
944 0 : i = aPosition.Y();
945 0 : j = aPosition.X();
946 0 : nLeft = aRectSize.Width() * j / nLines + 1;
947 0 : nRight = aRectSize.Width() * (j + 1) / nLines - 1;
948 0 : nTop = aRectSize.Height() * i / nLines + 1;
949 0 : nBottom = aRectSize.Height() * (i + 1) / nLines - 1;
950 0 : return Rectangle(nLeft,nTop,nRight,nBottom);
951 : }
952 :
953 : //Solution:Keyboard function
954 0 : void SvxPixelCtl::KeyInput( const KeyEvent& rKEvt )
955 : {
956 0 : vcl::KeyCode aKeyCode = rKEvt.GetKeyCode();
957 0 : sal_uInt16 nCode = aKeyCode.GetCode();
958 0 : bool bIsMod = aKeyCode.IsShift() || aKeyCode.IsMod1() || aKeyCode.IsMod2();
959 :
960 0 : if( !bIsMod )
961 : {
962 0 : Point pRepaintPoint( aRectSize.Width() *( aFocusPosition.getX() - 1)/ nLines - 1,
963 0 : aRectSize.Height() *( aFocusPosition.getY() - 1)/ nLines -1
964 0 : );
965 0 : Size mRepaintSize( aRectSize.Width() *3/ nLines + 2,aRectSize.Height() *3/ nLines + 2);
966 0 : Rectangle mRepaintRect( pRepaintPoint, mRepaintSize );
967 0 : bool bFocusPosChanged=false;
968 0 : switch(nCode)
969 : {
970 : case KEY_LEFT:
971 0 : if((aFocusPosition.getX() >= 1))
972 : {
973 0 : aFocusPosition.setX( aFocusPosition.getX() - 1 );
974 0 : Invalidate(mRepaintRect);
975 0 : bFocusPosChanged=true;
976 : }
977 0 : break;
978 : case KEY_RIGHT:
979 0 : if( aFocusPosition.getX() < (nLines - 1) )
980 : {
981 0 : aFocusPosition.setX( aFocusPosition.getX() + 1 );
982 0 : Invalidate(mRepaintRect);
983 0 : bFocusPosChanged=true;
984 : }
985 0 : break;
986 : case KEY_UP:
987 0 : if((aFocusPosition.getY() >= 1))
988 : {
989 0 : aFocusPosition.setY( aFocusPosition.getY() - 1 );
990 0 : Invalidate(mRepaintRect);
991 0 : bFocusPosChanged=true;
992 : }
993 0 : break;
994 : case KEY_DOWN:
995 0 : if( aFocusPosition.getY() < ( nLines - 1 ) )
996 : {
997 0 : aFocusPosition.setY( aFocusPosition.getY() + 1 );
998 0 : Invalidate(mRepaintRect);
999 0 : bFocusPosChanged=true;
1000 : }
1001 0 : break;
1002 : case KEY_SPACE:
1003 0 : ChangePixel( sal_uInt16(aFocusPosition.getX() + aFocusPosition.getY() * nLines) );
1004 0 : Invalidate( implCalFocusRect(aFocusPosition) );
1005 0 : break;
1006 : default:
1007 0 : Control::KeyInput( rKEvt );
1008 0 : return;
1009 : }
1010 0 : if(m_xAccess.is())
1011 : {
1012 0 : long nIndex = GetFoucsPosIndex();
1013 0 : switch(nCode)
1014 : {
1015 : case KEY_LEFT:
1016 : case KEY_RIGHT:
1017 : case KEY_UP:
1018 : case KEY_DOWN:
1019 0 : if (bFocusPosChanged)
1020 : {
1021 0 : m_pAccess->NotifyChild(nIndex,false,false);
1022 : }
1023 0 : break;
1024 : case KEY_SPACE:
1025 0 : m_pAccess->NotifyChild(nIndex,false,true);
1026 0 : break;
1027 : default:
1028 0 : break;
1029 : }
1030 : }
1031 : }
1032 : else
1033 : {
1034 0 : Control::KeyInput( rKEvt );
1035 : }
1036 : }
1037 :
1038 : //Draw focus when get focus
1039 0 : void SvxPixelCtl::GetFocus()
1040 : {
1041 0 : Invalidate(implCalFocusRect(aFocusPosition));
1042 :
1043 0 : if(m_pAccess)
1044 : {
1045 0 : m_pAccess->NotifyChild(GetFoucsPosIndex(),true,false);
1046 : }
1047 :
1048 0 : Control::GetFocus();
1049 0 : }
1050 :
1051 : //Hide focus when lose focus
1052 0 : void SvxPixelCtl::LoseFocus()
1053 : {
1054 0 : HideFocus();
1055 0 : if (m_pAccess)
1056 : {
1057 0 : m_pAccess->LoseFocus();
1058 : }
1059 0 : Control::LoseFocus();
1060 0 : }
1061 :
1062 0 : void SvxPixelCtl::SetXBitmap( const BitmapEx& rBitmapEx )
1063 : {
1064 0 : BitmapColor aBack;
1065 0 : BitmapColor aFront;
1066 :
1067 0 : if(isHistorical8x8(rBitmapEx, aBack, aFront))
1068 : {
1069 0 : Bitmap aBitmap(rBitmapEx.GetBitmap());
1070 0 : BitmapReadAccess* pRead = aBitmap.AcquireReadAccess();
1071 :
1072 0 : aBackgroundColor = aBack;
1073 0 : aPixelColor = aFront;
1074 :
1075 0 : for(sal_uInt16 i(0); i < nSquares; i++)
1076 : {
1077 0 : const BitmapColor aColor(pRead->GetColor(i/8, i%8));
1078 :
1079 0 : if(aColor == aBack)
1080 : {
1081 0 : *( pPixel + i ) = 0;
1082 : }
1083 : else
1084 : {
1085 0 : *( pPixel + i ) = 1;
1086 : }
1087 0 : }
1088 :
1089 0 : aBitmap.ReleaseAccess(pRead);
1090 0 : }
1091 0 : }
1092 :
1093 : // Returns a specific pixel
1094 :
1095 0 : sal_uInt16 SvxPixelCtl::GetBitmapPixel( const sal_uInt16 nPixel )
1096 : {
1097 0 : return( *( pPixel + nPixel ) );
1098 : }
1099 :
1100 : // Resets to the original state of the control
1101 :
1102 0 : void SvxPixelCtl::Reset()
1103 : {
1104 : // clear pixel area
1105 0 : memset(pPixel, 0, nSquares * sizeof(sal_uInt16));
1106 0 : Invalidate();
1107 0 : }
1108 :
1109 : // Constructor: BitmapCtl for SvxPixelCtl
1110 :
1111 0 : SvxBitmapCtl::SvxBitmapCtl( vcl::Window* /*pParent*/, const Size& rSize )
1112 : : aSize(rSize)
1113 : , nLines(0)
1114 0 : , pBmpArray(NULL)
1115 : {
1116 0 : }
1117 :
1118 0 : SvxBitmapCtl::~SvxBitmapCtl()
1119 : {
1120 0 : }
1121 :
1122 : // BitmapCtl: Returns the Bitmap
1123 :
1124 0 : BitmapEx SvxBitmapCtl::GetBitmapEx()
1125 : {
1126 0 : const Bitmap aRetval(createHistorical8x8FromArray(pBmpArray, aPixelColor, aBackgroundColor));
1127 :
1128 0 : return BitmapEx(aRetval);
1129 : }
1130 :
1131 0 : extern "C" SAL_DLLPUBLIC_EXPORT vcl::Window* SAL_CALL makeColorLB(vcl::Window *pParent, VclBuilder::stringmap &rMap)
1132 : {
1133 0 : bool bDropdown = VclBuilder::extractDropdown(rMap);
1134 0 : WinBits nWinBits = WB_LEFT|WB_VCENTER|WB_3DLOOK|WB_SIMPLEMODE|WB_TABSTOP;
1135 0 : if (bDropdown)
1136 0 : nWinBits |= WB_DROPDOWN;
1137 0 : OString sBorder = VclBuilder::extractCustomProperty(rMap);
1138 0 : if (!sBorder.isEmpty())
1139 0 : nWinBits |= WB_BORDER;
1140 0 : ColorLB *pListBox = new ColorLB(pParent, nWinBits);
1141 0 : pListBox->EnableAutoSize(true);
1142 0 : return pListBox;
1143 : }
1144 :
1145 : // Fills the Listbox with color and strings
1146 :
1147 0 : void ColorLB::Fill( const XColorListRef &pColorTab )
1148 : {
1149 0 : if( !pColorTab.is() )
1150 0 : return;
1151 :
1152 0 : long nCount = pColorTab->Count();
1153 : XColorEntry* pEntry;
1154 0 : SetUpdateMode( false );
1155 :
1156 0 : for( long i = 0; i < nCount; i++ )
1157 : {
1158 0 : pEntry = pColorTab->GetColor( i );
1159 0 : InsertEntry( pEntry->GetColor(), pEntry->GetName() );
1160 : }
1161 :
1162 0 : AdaptDropDownLineCountToMaximum();
1163 0 : SetUpdateMode( true );
1164 : }
1165 :
1166 0 : void ColorLB::Append( const XColorEntry& rEntry )
1167 : {
1168 0 : InsertEntry( rEntry.GetColor(), rEntry.GetName() );
1169 0 : AdaptDropDownLineCountToMaximum();
1170 0 : }
1171 :
1172 0 : void ColorLB::Modify( const XColorEntry& rEntry, sal_Int32 nPos )
1173 : {
1174 0 : RemoveEntry( nPos );
1175 0 : InsertEntry( rEntry.GetColor(), rEntry.GetName(), nPos );
1176 0 : }
1177 :
1178 : // Fills the Listbox with color and strings
1179 :
1180 57 : void FillAttrLB::Fill( const XColorListRef &pColorTab )
1181 : {
1182 57 : long nCount = pColorTab->Count();
1183 : XColorEntry* pEntry;
1184 57 : SetUpdateMode( false );
1185 :
1186 9576 : for( long i = 0; i < nCount; i++ )
1187 : {
1188 9519 : pEntry = pColorTab->GetColor( i );
1189 9519 : InsertEntry( pEntry->GetColor(), pEntry->GetName() );
1190 : }
1191 :
1192 57 : AdaptDropDownLineCountToMaximum();
1193 57 : SetUpdateMode( true );
1194 57 : }
1195 :
1196 : // Fills the listbox (provisional) with strings
1197 :
1198 0 : HatchingLB::HatchingLB( vcl::Window* pParent, WinBits nWinStyle)
1199 : : ListBox( pParent, nWinStyle ),
1200 0 : mpList ( NULL )
1201 : {
1202 0 : SetEdgeBlending(true);
1203 0 : }
1204 :
1205 0 : extern "C" SAL_DLLPUBLIC_EXPORT vcl::Window* SAL_CALL makeHatchingLB(vcl::Window *pParent, VclBuilder::stringmap& rMap)
1206 : {
1207 0 : WinBits nWinStyle = WB_LEFT|WB_VCENTER|WB_3DLOOK|WB_SIMPLEMODE;
1208 0 : OString sBorder = VclBuilder::extractCustomProperty(rMap);
1209 0 : if (!sBorder.isEmpty())
1210 0 : nWinStyle |= WB_BORDER;
1211 0 : HatchingLB *pListBox = new HatchingLB(pParent, nWinStyle);
1212 0 : pListBox->EnableAutoSize(true);
1213 0 : return pListBox;
1214 : }
1215 :
1216 0 : void HatchingLB::Fill( const XHatchListRef &pList )
1217 : {
1218 0 : if( !pList.is() )
1219 0 : return;
1220 :
1221 0 : mpList = pList;
1222 : XHatchEntry* pEntry;
1223 0 : long nCount = pList->Count();
1224 :
1225 0 : SetUpdateMode( false );
1226 :
1227 0 : for( long i = 0; i < nCount; i++ )
1228 : {
1229 0 : pEntry = pList->GetHatch( i );
1230 0 : const Bitmap aBitmap = pList->GetUiBitmap( i );
1231 0 : if( !aBitmap.IsEmpty() )
1232 0 : InsertEntry(pEntry->GetName(), Image(aBitmap));
1233 : else
1234 0 : InsertEntry( pEntry->GetName() );
1235 0 : }
1236 :
1237 0 : AdaptDropDownLineCountToMaximum();
1238 0 : SetUpdateMode( true );
1239 : }
1240 :
1241 0 : void HatchingLB::Append( const XHatchEntry& rEntry, const Bitmap& rBitmap )
1242 : {
1243 0 : if(!rBitmap.IsEmpty())
1244 : {
1245 0 : InsertEntry(rEntry.GetName(), Image(rBitmap));
1246 : }
1247 : else
1248 : {
1249 0 : InsertEntry( rEntry.GetName() );
1250 : }
1251 :
1252 0 : AdaptDropDownLineCountToMaximum();
1253 0 : }
1254 :
1255 0 : void HatchingLB::Modify( const XHatchEntry& rEntry, sal_Int32 nPos, const Bitmap& rBitmap )
1256 : {
1257 0 : RemoveEntry( nPos );
1258 :
1259 0 : if( !rBitmap.IsEmpty() )
1260 : {
1261 0 : InsertEntry( rEntry.GetName(), Image(rBitmap), nPos );
1262 : }
1263 : else
1264 : {
1265 0 : InsertEntry( rEntry.GetName(), nPos );
1266 : }
1267 0 : }
1268 :
1269 : // Fills the listbox (provisional) with strings
1270 :
1271 0 : void FillAttrLB::Fill( const XHatchListRef &pList )
1272 : {
1273 0 : long nCount = pList->Count();
1274 : XHatchEntry* pEntry;
1275 0 : ListBox::SetUpdateMode( false );
1276 :
1277 0 : for( long i = 0; i < nCount; i++ )
1278 : {
1279 0 : pEntry = pList->GetHatch( i );
1280 0 : const Bitmap aBitmap = pList->GetUiBitmap( i );
1281 0 : if( !aBitmap.IsEmpty() )
1282 0 : ListBox::InsertEntry(pEntry->GetName(), Image(aBitmap));
1283 : else
1284 0 : InsertEntry( pEntry->GetName() );
1285 0 : }
1286 :
1287 0 : AdaptDropDownLineCountToMaximum();
1288 0 : ListBox::SetUpdateMode( true );
1289 0 : }
1290 :
1291 : // Fills the listbox (provisional) with strings
1292 :
1293 0 : GradientLB::GradientLB( vcl::Window* pParent, WinBits aWB)
1294 : : ListBox( pParent, aWB ),
1295 0 : mpList(NULL)
1296 : {
1297 0 : SetEdgeBlending(true);
1298 0 : }
1299 :
1300 0 : extern "C" SAL_DLLPUBLIC_EXPORT vcl::Window* SAL_CALL makeGradientLB(vcl::Window *pParent, VclBuilder::stringmap &rMap)
1301 : {
1302 0 : WinBits nWinStyle = WB_LEFT|WB_VCENTER|WB_3DLOOK|WB_SIMPLEMODE;
1303 0 : OString sBorder = VclBuilder::extractCustomProperty(rMap);
1304 0 : if (!sBorder.isEmpty())
1305 0 : nWinStyle |= WB_BORDER;
1306 0 : GradientLB *pListBox = new GradientLB(pParent, nWinStyle);
1307 0 : pListBox->EnableAutoSize(true);
1308 0 : return pListBox;
1309 : }
1310 :
1311 0 : void GradientLB::Fill( const XGradientListRef &pList )
1312 : {
1313 0 : if( !pList.is() )
1314 0 : return;
1315 :
1316 0 : mpList = pList;
1317 : XGradientEntry* pEntry;
1318 0 : long nCount = pList->Count();
1319 :
1320 0 : SetUpdateMode( false );
1321 :
1322 0 : for( long i = 0; i < nCount; i++ )
1323 : {
1324 0 : pEntry = pList->GetGradient( i );
1325 0 : const Bitmap aBitmap = pList->GetUiBitmap( i );
1326 0 : if( !aBitmap.IsEmpty() )
1327 0 : InsertEntry(pEntry->GetName(), Image(aBitmap));
1328 : else
1329 0 : InsertEntry( pEntry->GetName() );
1330 0 : }
1331 :
1332 0 : AdaptDropDownLineCountToMaximum();
1333 0 : SetUpdateMode( true );
1334 : }
1335 :
1336 0 : void GradientLB::Append( const XGradientEntry& rEntry, const Bitmap& rBitmap )
1337 : {
1338 0 : if(!rBitmap.IsEmpty())
1339 : {
1340 0 : InsertEntry(rEntry.GetName(), Image(rBitmap));
1341 : }
1342 : else
1343 : {
1344 0 : InsertEntry( rEntry.GetName() );
1345 : }
1346 :
1347 0 : AdaptDropDownLineCountToMaximum();
1348 0 : }
1349 :
1350 0 : void GradientLB::Modify( const XGradientEntry& rEntry, sal_Int32 nPos, const Bitmap& rBitmap )
1351 : {
1352 0 : RemoveEntry( nPos );
1353 :
1354 0 : if(!rBitmap.IsEmpty())
1355 : {
1356 0 : InsertEntry( rEntry.GetName(), Image(rBitmap), nPos );
1357 : }
1358 : else
1359 : {
1360 0 : InsertEntry( rEntry.GetName(), nPos );
1361 : }
1362 0 : }
1363 :
1364 0 : void GradientLB::SelectEntryByList( const XGradientListRef &pList, const OUString& rStr,
1365 : const XGradient& rGradient, sal_uInt16 nDist )
1366 : {
1367 0 : long nCount = pList.get() ? pList->Count() : 0;
1368 : XGradientEntry* pEntry;
1369 0 : bool bFound = false;
1370 0 : OUString aStr;
1371 :
1372 : long i;
1373 0 : for( i = 0; i < nCount && !bFound; i++ )
1374 : {
1375 0 : pEntry = pList->GetGradient( i );
1376 :
1377 0 : aStr = pEntry->GetName();
1378 :
1379 0 : if( rStr == aStr && rGradient == pEntry->GetGradient() )
1380 0 : bFound = true;
1381 : }
1382 0 : if( bFound )
1383 0 : SelectEntryPos( (sal_uInt16) ( i - 1 + nDist ) );
1384 0 : }
1385 :
1386 : // Fills the listbox (provisional) with strings
1387 :
1388 0 : void FillAttrLB::Fill( const XGradientListRef &pList )
1389 : {
1390 0 : long nCount = pList->Count();
1391 : XGradientEntry* pEntry;
1392 0 : ListBox::SetUpdateMode( false );
1393 :
1394 0 : for( long i = 0; i < nCount; i++ )
1395 : {
1396 0 : pEntry = pList->GetGradient( i );
1397 0 : const Bitmap aBitmap = pList->GetUiBitmap( i );
1398 0 : if( !aBitmap.IsEmpty() )
1399 0 : ListBox::InsertEntry(pEntry->GetName(), Image(aBitmap));
1400 : else
1401 0 : InsertEntry( pEntry->GetName() );
1402 0 : }
1403 :
1404 0 : AdaptDropDownLineCountToMaximum();
1405 0 : ListBox::SetUpdateMode( true );
1406 0 : }
1407 :
1408 : // BitmapLB Constructor
1409 :
1410 0 : BitmapLB::BitmapLB( vcl::Window* pParent, WinBits aWB)
1411 : : ListBox( pParent, aWB ),
1412 : maBitmapEx(),
1413 0 : mpList(NULL)
1414 : {
1415 0 : SetEdgeBlending(true);
1416 0 : }
1417 :
1418 0 : extern "C" SAL_DLLPUBLIC_EXPORT vcl::Window* SAL_CALL makeBitmapLB(vcl::Window *pParent, VclBuilder::stringmap &rMap)
1419 : {
1420 0 : WinBits nWinStyle = WB_LEFT|WB_VCENTER|WB_3DLOOK|WB_SIMPLEMODE;
1421 0 : OString sBorder = VclBuilder::extractCustomProperty(rMap);
1422 0 : if (!sBorder.isEmpty())
1423 0 : nWinStyle |= WB_BORDER;
1424 0 : BitmapLB *pListBox = new BitmapLB(pParent, nWinStyle);
1425 0 : pListBox->EnableAutoSize(true);
1426 0 : return pListBox;
1427 : }
1428 :
1429 : namespace
1430 : {
1431 0 : void formatBitmapExToSize(BitmapEx& rBitmapEx, const Size& rSize)
1432 : {
1433 0 : if(!rBitmapEx.IsEmpty() && rSize.Width() > 0 && rSize.Height() > 0)
1434 : {
1435 0 : VirtualDevice aVirtualDevice;
1436 0 : aVirtualDevice.SetOutputSizePixel(rSize);
1437 :
1438 0 : if(rBitmapEx.IsTransparent())
1439 : {
1440 0 : const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
1441 :
1442 0 : if(rStyleSettings.GetPreviewUsesCheckeredBackground())
1443 : {
1444 0 : const Point aNull(0, 0);
1445 : static const sal_uInt32 nLen(8);
1446 0 : static const Color aW(COL_WHITE);
1447 0 : static const Color aG(0xef, 0xef, 0xef);
1448 :
1449 0 : aVirtualDevice.DrawCheckered(aNull, rSize, nLen, aW, aG);
1450 : }
1451 : else
1452 : {
1453 0 : aVirtualDevice.SetBackground(rStyleSettings.GetFieldColor());
1454 0 : aVirtualDevice.Erase();
1455 : }
1456 : }
1457 :
1458 0 : if(rBitmapEx.GetSizePixel().Width() >= rSize.Width() && rBitmapEx.GetSizePixel().Height() >= rSize.Height())
1459 : {
1460 0 : rBitmapEx.Scale(rSize, BMP_SCALE_DEFAULT);
1461 0 : aVirtualDevice.DrawBitmapEx(Point(0, 0), rBitmapEx);
1462 : }
1463 : else
1464 : {
1465 0 : const Size aBitmapSize(rBitmapEx.GetSizePixel());
1466 :
1467 0 : for(sal_Int32 y(0); y < rSize.Height(); y += aBitmapSize.Height())
1468 : {
1469 0 : for(sal_Int32 x(0); x < rSize.Width(); x += aBitmapSize.Width())
1470 : {
1471 : aVirtualDevice.DrawBitmapEx(
1472 : Point(x, y),
1473 0 : rBitmapEx);
1474 : }
1475 : }
1476 : }
1477 :
1478 0 : rBitmapEx = aVirtualDevice.GetBitmap(Point(0, 0), rSize);
1479 : }
1480 0 : }
1481 : } // end of anonymous namespace
1482 :
1483 0 : void BitmapLB::Fill( const XBitmapListRef &pList )
1484 : {
1485 0 : if( !pList.is() )
1486 0 : return;
1487 :
1488 0 : mpList = pList;
1489 : XBitmapEntry* pEntry;
1490 0 : const long nCount(pList->Count());
1491 0 : const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
1492 0 : const Size aSize(rStyleSettings.GetListBoxPreviewDefaultPixelSize());
1493 :
1494 0 : SetUpdateMode(false);
1495 :
1496 0 : for(long i(0); i < nCount; i++)
1497 : {
1498 0 : pEntry = pList->GetBitmap(i);
1499 0 : maBitmapEx = pEntry->GetGraphicObject().GetGraphic().GetBitmapEx();
1500 0 : formatBitmapExToSize(maBitmapEx, aSize);
1501 0 : InsertEntry(pEntry->GetName(), Image(maBitmapEx));
1502 : }
1503 :
1504 0 : AdaptDropDownLineCountToMaximum();
1505 0 : SetUpdateMode(true);
1506 : }
1507 :
1508 0 : void BitmapLB::Append(const Size& rSize, const XBitmapEntry& rEntry)
1509 : {
1510 0 : maBitmapEx = rEntry.GetGraphicObject().GetGraphic().GetBitmapEx();
1511 :
1512 0 : if(!maBitmapEx.IsEmpty())
1513 : {
1514 0 : formatBitmapExToSize(maBitmapEx, rSize);
1515 0 : InsertEntry(rEntry.GetName(), Image(maBitmapEx));
1516 : }
1517 : else
1518 : {
1519 0 : InsertEntry(rEntry.GetName());
1520 : }
1521 :
1522 0 : AdaptDropDownLineCountToMaximum();
1523 0 : }
1524 :
1525 0 : void BitmapLB::Modify(const Size& rSize, const XBitmapEntry& rEntry, sal_Int32 nPos)
1526 : {
1527 0 : RemoveEntry(nPos);
1528 0 : maBitmapEx = rEntry.GetGraphicObject().GetGraphic().GetBitmapEx();
1529 :
1530 0 : if(!maBitmapEx.IsEmpty())
1531 : {
1532 0 : formatBitmapExToSize(maBitmapEx, rSize);
1533 0 : InsertEntry(rEntry.GetName(), Image(maBitmapEx), nPos);
1534 : }
1535 : else
1536 : {
1537 0 : InsertEntry(rEntry.GetName());
1538 : }
1539 0 : }
1540 :
1541 126 : FillAttrLB::FillAttrLB(vcl::Window* pParent, WinBits aWB)
1542 126 : : ColorListBox(pParent, aWB)
1543 : {
1544 126 : }
1545 :
1546 0 : void FillAttrLB::Fill( const XBitmapListRef &pList )
1547 : {
1548 0 : const long nCount(pList->Count());
1549 : XBitmapEntry* pEntry;
1550 0 : const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
1551 0 : const Size aSize(rStyleSettings.GetListBoxPreviewDefaultPixelSize());
1552 :
1553 0 : ListBox::SetUpdateMode(false);
1554 :
1555 0 : for(long i(0); i < nCount; i++)
1556 : {
1557 0 : pEntry = pList->GetBitmap( i );
1558 0 : maBitmapEx = pEntry->GetGraphicObject().GetGraphic().GetBitmapEx();
1559 0 : formatBitmapExToSize(maBitmapEx, aSize);
1560 0 : ListBox::InsertEntry(pEntry->GetName(), Image(maBitmapEx));
1561 : }
1562 :
1563 0 : AdaptDropDownLineCountToMaximum();
1564 0 : ListBox::SetUpdateMode(true);
1565 0 : }
1566 :
1567 126 : void FillTypeLB::Fill()
1568 : {
1569 126 : SetUpdateMode( false );
1570 :
1571 126 : InsertEntry( SVX_RESSTR(RID_SVXSTR_INVISIBLE) );
1572 126 : InsertEntry( SVX_RESSTR(RID_SVXSTR_COLOR) );
1573 126 : InsertEntry( SVX_RESSTR(RID_SVXSTR_GRADIENT) );
1574 126 : InsertEntry( SVX_RESSTR(RID_SVXSTR_HATCH) );
1575 126 : InsertEntry( SVX_RESSTR(RID_SVXSTR_BITMAP) );
1576 :
1577 126 : AdaptDropDownLineCountToMaximum();
1578 126 : SetUpdateMode( true );
1579 126 : }
1580 :
1581 126 : LineLB::LineLB(vcl::Window* pParent, WinBits aWB)
1582 : : ListBox(pParent, aWB),
1583 126 : mbAddStandardFields(true)
1584 : {
1585 : // No EdgeBlending for LineStyle/Dash SetEdgeBlending(true);
1586 126 : }
1587 :
1588 0 : extern "C" SAL_DLLPUBLIC_EXPORT vcl::Window* SAL_CALL makeLineLB(vcl::Window *pParent, VclBuilder::stringmap &rMap)
1589 : {
1590 0 : bool bDropdown = VclBuilder::extractDropdown(rMap);
1591 0 : WinBits nWinBits = WB_LEFT|WB_VCENTER|WB_3DLOOK|WB_SIMPLEMODE|WB_TABSTOP;
1592 0 : if (bDropdown)
1593 0 : nWinBits |= WB_DROPDOWN;
1594 0 : OString sBorder = VclBuilder::extractCustomProperty(rMap);
1595 0 : if (!sBorder.isEmpty())
1596 0 : nWinBits |= WB_BORDER;
1597 0 : LineLB *pListBox = new LineLB(pParent, nWinBits);
1598 0 : pListBox->EnableAutoSize(true);
1599 0 : return pListBox;
1600 : }
1601 :
1602 126 : LineLB::~LineLB()
1603 : {
1604 126 : }
1605 :
1606 0 : void LineLB::setAddStandardFields(bool bNew)
1607 : {
1608 0 : if(getAddStandardFields() != bNew)
1609 : {
1610 0 : mbAddStandardFields = bNew;
1611 : }
1612 0 : }
1613 :
1614 : // Fills the listbox (provisional) with strings
1615 :
1616 105 : void LineLB::Fill( const XDashListRef &pList )
1617 : {
1618 105 : Clear();
1619 :
1620 105 : if( !pList.is() )
1621 105 : return;
1622 :
1623 105 : if(getAddStandardFields())
1624 : {
1625 : // entry for 'none'
1626 105 : InsertEntry(pList->GetStringForUiNoLine());
1627 :
1628 : // entry for solid line
1629 : InsertEntry(pList->GetStringForUiSolidLine(),
1630 105 : Image(pList->GetBitmapForUISolidLine()));
1631 : }
1632 :
1633 : // entries for dashed lines
1634 :
1635 105 : long nCount = pList->Count();
1636 : XDashEntry* pEntry;
1637 105 : SetUpdateMode( false );
1638 :
1639 1155 : for( long i = 0; i < nCount; i++ )
1640 : {
1641 1050 : pEntry = pList->GetDash( i );
1642 1050 : const Bitmap aBitmap = pList->GetUiBitmap( i );
1643 1050 : if( !aBitmap.IsEmpty() )
1644 : {
1645 1050 : InsertEntry(pEntry->GetName(), Image(aBitmap));
1646 : }
1647 : else
1648 0 : InsertEntry( pEntry->GetName() );
1649 1050 : }
1650 :
1651 105 : AdaptDropDownLineCountToMaximum();
1652 105 : SetUpdateMode( true );
1653 : }
1654 :
1655 0 : void LineLB::Append( const XDashEntry& rEntry, const Bitmap& rBitmap )
1656 : {
1657 0 : if(!rBitmap.IsEmpty())
1658 : {
1659 0 : InsertEntry(rEntry.GetName(), Image(rBitmap));
1660 : }
1661 : else
1662 : {
1663 0 : InsertEntry( rEntry.GetName() );
1664 : }
1665 :
1666 0 : AdaptDropDownLineCountToMaximum();
1667 0 : }
1668 :
1669 0 : void LineLB::Modify( const XDashEntry& rEntry, sal_Int32 nPos, const Bitmap& rBitmap )
1670 : {
1671 0 : RemoveEntry( nPos );
1672 :
1673 0 : if(!rBitmap.IsEmpty())
1674 : {
1675 0 : InsertEntry( rEntry.GetName(), Image(rBitmap), nPos );
1676 : }
1677 : else
1678 : {
1679 0 : InsertEntry( rEntry.GetName(), nPos );
1680 : }
1681 0 : }
1682 :
1683 : // Fills the listbox (provisional) with strings
1684 :
1685 0 : LineEndLB::LineEndLB( vcl::Window* pParent, WinBits aWB )
1686 0 : : ListBox( pParent, aWB )
1687 : {
1688 : // No EdgeBlending for LineEnds SetEdgeBlending(true);
1689 0 : }
1690 :
1691 0 : extern "C" SAL_DLLPUBLIC_EXPORT vcl::Window* SAL_CALL makeLineEndLB(vcl::Window *pParent, VclBuilder::stringmap &rMap)
1692 : {
1693 0 : bool bDropdown = VclBuilder::extractDropdown(rMap);
1694 0 : WinBits nWinBits = WB_LEFT|WB_VCENTER|WB_3DLOOK|WB_SIMPLEMODE|WB_TABSTOP;
1695 0 : if (bDropdown)
1696 0 : nWinBits |= WB_DROPDOWN;
1697 0 : OString sBorder = VclBuilder::extractCustomProperty(rMap);
1698 0 : if (!sBorder.isEmpty())
1699 0 : nWinBits |= WB_BORDER;
1700 0 : LineEndLB *pListBox = new LineEndLB(pParent, nWinBits);
1701 0 : pListBox->EnableAutoSize(true);
1702 0 : return pListBox;
1703 : }
1704 :
1705 0 : LineEndLB::~LineEndLB(void)
1706 : {
1707 0 : }
1708 :
1709 0 : void LineEndLB::Fill( const XLineEndListRef &pList, bool bStart )
1710 : {
1711 0 : if( !pList.is() )
1712 0 : return;
1713 :
1714 0 : long nCount = pList->Count();
1715 : XLineEndEntry* pEntry;
1716 0 : VirtualDevice aVD;
1717 0 : SetUpdateMode( false );
1718 :
1719 0 : for( long i = 0; i < nCount; i++ )
1720 : {
1721 0 : pEntry = pList->GetLineEnd( i );
1722 0 : const Bitmap aBitmap = pList->GetUiBitmap( i );
1723 0 : if( !aBitmap.IsEmpty() )
1724 : {
1725 0 : Size aBmpSize( aBitmap.GetSizePixel() );
1726 0 : aVD.SetOutputSizePixel( aBmpSize, false );
1727 0 : aVD.DrawBitmap( Point(), aBitmap );
1728 0 : InsertEntry( pEntry->GetName(),
1729 : Image(aVD.GetBitmap(
1730 0 : (bStart) ? Point() : Point(aBmpSize.Width() / 2, 0),
1731 0 : Size(aBmpSize.Width() / 2, aBmpSize.Height()))));
1732 : //delete pBitmap;
1733 : }
1734 : else
1735 0 : InsertEntry( pEntry->GetName() );
1736 0 : }
1737 :
1738 0 : AdaptDropDownLineCountToMaximum();
1739 0 : SetUpdateMode( true );
1740 : }
1741 :
1742 0 : void LineEndLB::Append( const XLineEndEntry& rEntry, const Bitmap& rBitmap, bool bStart )
1743 : {
1744 0 : if(!rBitmap.IsEmpty())
1745 : {
1746 0 : VirtualDevice aVD;
1747 0 : const Size aBmpSize(rBitmap.GetSizePixel());
1748 :
1749 0 : aVD.SetOutputSizePixel(aBmpSize, false);
1750 0 : aVD.DrawBitmap(Point(), rBitmap);
1751 : InsertEntry(
1752 0 : rEntry.GetName(),
1753 : Image(aVD.GetBitmap(
1754 0 : (bStart) ? Point() : Point(aBmpSize.Width() / 2, 0),
1755 0 : Size(aBmpSize.Width() / 2, aBmpSize.Height()))));
1756 : }
1757 : else
1758 : {
1759 0 : InsertEntry(rEntry.GetName());
1760 : }
1761 :
1762 0 : AdaptDropDownLineCountToMaximum();
1763 0 : }
1764 :
1765 0 : void LineEndLB::Modify( const XLineEndEntry& rEntry, sal_Int32 nPos, const Bitmap& rBitmap, bool bStart )
1766 : {
1767 0 : RemoveEntry( nPos );
1768 :
1769 0 : if(!rBitmap.IsEmpty())
1770 : {
1771 0 : VirtualDevice aVD;
1772 0 : const Size aBmpSize(rBitmap.GetSizePixel());
1773 :
1774 0 : aVD.SetOutputSizePixel(aBmpSize, false);
1775 0 : aVD.DrawBitmap(Point(), rBitmap);
1776 : InsertEntry(
1777 0 : rEntry.GetName(),
1778 : Image(aVD.GetBitmap(
1779 0 : (bStart) ? Point() : Point(aBmpSize.Width() / 2, 0),
1780 0 : Size(aBmpSize.Width() / 2, aBmpSize.Height()))),
1781 0 : nPos);
1782 : }
1783 : else
1784 : {
1785 0 : InsertEntry(rEntry.GetName(), nPos);
1786 : }
1787 0 : }
1788 :
1789 :
1790 :
1791 0 : void SvxPreviewBase::InitSettings(bool bForeground, bool bBackground)
1792 : {
1793 0 : const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
1794 :
1795 0 : if(bForeground)
1796 : {
1797 0 : svtools::ColorConfig aColorConfig;
1798 0 : Color aTextColor(aColorConfig.GetColorValue(svtools::FONTCOLOR).nColor);
1799 :
1800 0 : if(IsControlForeground())
1801 : {
1802 0 : aTextColor = GetControlForeground();
1803 : }
1804 :
1805 0 : getBufferDevice().SetTextColor(aTextColor);
1806 : }
1807 :
1808 0 : if(bBackground)
1809 : {
1810 0 : if(IsControlBackground())
1811 : {
1812 0 : getBufferDevice().SetBackground(GetControlBackground());
1813 : }
1814 : else
1815 : {
1816 0 : getBufferDevice().SetBackground(rStyleSettings.GetWindowColor());
1817 : }
1818 : }
1819 :
1820 : // do not paint background self, it gets painted buffered
1821 0 : SetControlBackground();
1822 0 : SetBackground();
1823 :
1824 0 : Invalidate();
1825 0 : }
1826 :
1827 0 : SvxPreviewBase::SvxPreviewBase(vcl::Window* pParent)
1828 : : Control(pParent, WB_BORDER)
1829 0 : , mpModel(new SdrModel())
1830 0 : , mpBufferDevice(new VirtualDevice(*this))
1831 : {
1832 : // Draw the control's border as a flat thin black line.
1833 0 : SetBorderStyle(WindowBorderStyle::MONO);
1834 0 : SetDrawMode( GetSettings().GetStyleSettings().GetHighContrastMode() ? OUTPUT_DRAWMODE_CONTRAST : OUTPUT_DRAWMODE_COLOR );
1835 0 : SetMapMode(MAP_100TH_MM);
1836 :
1837 : // init model
1838 0 : mpModel->GetItemPool().FreezeIdRanges();
1839 0 : }
1840 :
1841 0 : SvxPreviewBase::~SvxPreviewBase()
1842 : {
1843 0 : delete mpModel;
1844 0 : delete mpBufferDevice;
1845 0 : }
1846 :
1847 0 : void SvxPreviewBase::LocalPrePaint()
1848 : {
1849 : // init BufferDevice
1850 0 : if(mpBufferDevice->GetOutputSizePixel() != GetOutputSizePixel())
1851 : {
1852 0 : mpBufferDevice->SetDrawMode(GetDrawMode());
1853 0 : mpBufferDevice->SetSettings(GetSettings());
1854 0 : mpBufferDevice->SetAntialiasing(GetAntialiasing());
1855 0 : mpBufferDevice->SetOutputSizePixel(GetOutputSizePixel());
1856 0 : mpBufferDevice->SetMapMode(GetMapMode());
1857 : }
1858 :
1859 0 : const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
1860 :
1861 0 : if(rStyleSettings.GetPreviewUsesCheckeredBackground())
1862 : {
1863 0 : const Point aNull(0, 0);
1864 : static const sal_uInt32 nLen(8);
1865 0 : static const Color aW(COL_WHITE);
1866 0 : static const Color aG(0xef, 0xef, 0xef);
1867 0 : const bool bWasEnabled(mpBufferDevice->IsMapModeEnabled());
1868 :
1869 0 : mpBufferDevice->EnableMapMode(false);
1870 0 : mpBufferDevice->DrawCheckered(aNull, mpBufferDevice->GetOutputSizePixel(), nLen, aW, aG);
1871 0 : mpBufferDevice->EnableMapMode(bWasEnabled);
1872 : }
1873 : else
1874 : {
1875 0 : mpBufferDevice->Erase();
1876 : }
1877 0 : }
1878 :
1879 0 : void SvxPreviewBase::LocalPostPaint()
1880 : {
1881 : // copy to front (in pixel mode)
1882 0 : const bool bWasEnabledSrc(mpBufferDevice->IsMapModeEnabled());
1883 0 : const bool bWasEnabledDst(IsMapModeEnabled());
1884 0 : const Point aEmptyPoint;
1885 :
1886 0 : mpBufferDevice->EnableMapMode(false);
1887 0 : EnableMapMode(false);
1888 :
1889 : DrawOutDev(
1890 0 : aEmptyPoint, GetOutputSizePixel(),
1891 0 : aEmptyPoint, GetOutputSizePixel(),
1892 0 : *mpBufferDevice);
1893 :
1894 0 : mpBufferDevice->EnableMapMode(bWasEnabledSrc);
1895 0 : EnableMapMode(bWasEnabledDst);
1896 0 : }
1897 :
1898 0 : void SvxPreviewBase::StateChanged(StateChangedType nType)
1899 : {
1900 0 : Control::StateChanged(nType);
1901 :
1902 0 : if(StateChangedType::CONTROLFOREGROUND == nType)
1903 : {
1904 0 : InitSettings(true, false);
1905 : }
1906 0 : else if(StateChangedType::CONTROLBACKGROUND == nType)
1907 : {
1908 0 : InitSettings(false, true);
1909 : }
1910 0 : }
1911 :
1912 0 : void SvxPreviewBase::DataChanged(const DataChangedEvent& rDCEvt)
1913 : {
1914 0 : SetDrawMode(GetSettings().GetStyleSettings().GetHighContrastMode() ? OUTPUT_DRAWMODE_CONTRAST : OUTPUT_DRAWMODE_COLOR);
1915 :
1916 0 : if((DATACHANGED_SETTINGS == rDCEvt.GetType()) && (rDCEvt.GetFlags() & SETTINGS_STYLE))
1917 : {
1918 0 : InitSettings(true, true);
1919 : }
1920 : else
1921 : {
1922 0 : Control::DataChanged(rDCEvt);
1923 : }
1924 0 : }
1925 :
1926 0 : void SvxXLinePreview::Resize()
1927 : {
1928 0 : SvxPreviewBase::Resize();
1929 :
1930 0 : const Size aOutputSize(GetOutputSize());
1931 0 : const sal_Int32 nDistance(500L);
1932 0 : const sal_Int32 nAvailableLength(aOutputSize.Width() - (4 * nDistance));
1933 :
1934 : // create DrawObectA
1935 0 : const sal_Int32 aYPosA(aOutputSize.Height() / 2);
1936 0 : const basegfx::B2DPoint aPointA1( nDistance, aYPosA);
1937 0 : const basegfx::B2DPoint aPointA2( aPointA1.getX() + ((nAvailableLength * 14) / 20), aYPosA );
1938 0 : basegfx::B2DPolygon aPolygonA;
1939 0 : aPolygonA.append(aPointA1);
1940 0 : aPolygonA.append(aPointA2);
1941 0 : mpLineObjA->SetPathPoly(basegfx::B2DPolyPolygon(aPolygonA));
1942 :
1943 : // create DrawObectB
1944 0 : const sal_Int32 aYPosB1((aOutputSize.Height() * 3) / 4);
1945 0 : const sal_Int32 aYPosB2((aOutputSize.Height() * 1) / 4);
1946 0 : const basegfx::B2DPoint aPointB1( aPointA2.getX() + nDistance, aYPosB1);
1947 0 : const basegfx::B2DPoint aPointB2( aPointB1.getX() + ((nAvailableLength * 2) / 20), aYPosB2 );
1948 0 : const basegfx::B2DPoint aPointB3( aPointB2.getX() + ((nAvailableLength * 2) / 20), aYPosB1 );
1949 0 : basegfx::B2DPolygon aPolygonB;
1950 0 : aPolygonB.append(aPointB1);
1951 0 : aPolygonB.append(aPointB2);
1952 0 : aPolygonB.append(aPointB3);
1953 0 : mpLineObjB->SetPathPoly(basegfx::B2DPolyPolygon(aPolygonB));
1954 :
1955 : // create DrawObectC
1956 0 : basegfx::B2DPolygon aPolygonC;
1957 0 : const basegfx::B2DPoint aPointC1( aPointB3.getX() + nDistance, aYPosB1);
1958 0 : const basegfx::B2DPoint aPointC2( aPointC1.getX() + ((nAvailableLength * 1) / 20), aYPosB2 );
1959 0 : const basegfx::B2DPoint aPointC3( aPointC2.getX() + ((nAvailableLength * 1) / 20), aYPosB1 );
1960 0 : aPolygonC.append(aPointC1);
1961 0 : aPolygonC.append(aPointC2);
1962 0 : aPolygonC.append(aPointC3);
1963 0 : mpLineObjC->SetPathPoly(basegfx::B2DPolyPolygon(aPolygonC));
1964 0 : }
1965 :
1966 0 : SvxXLinePreview::SvxXLinePreview(vcl::Window* pParent)
1967 : : SvxPreviewBase(pParent)
1968 : , mpLineObjA(NULL)
1969 : , mpLineObjB(NULL)
1970 : , mpLineObjC(NULL)
1971 : , mpGraphic(NULL)
1972 0 : , mbWithSymbol(false)
1973 : {
1974 0 : InitSettings( true, true );
1975 :
1976 0 : mpLineObjA = new SdrPathObj(OBJ_LINE);
1977 0 : mpLineObjA->SetModel(&getModel());
1978 :
1979 0 : mpLineObjB = new SdrPathObj(OBJ_PLIN);
1980 0 : mpLineObjB->SetModel(&getModel());
1981 :
1982 0 : mpLineObjC = new SdrPathObj(OBJ_PLIN);
1983 0 : mpLineObjC->SetModel(&getModel());
1984 0 : }
1985 :
1986 0 : extern "C" SAL_DLLPUBLIC_EXPORT vcl::Window* SAL_CALL makeSvxXLinePreview(vcl::Window *pParent, VclBuilder::stringmap &)
1987 : {
1988 0 : return new SvxXLinePreview(pParent);
1989 : }
1990 :
1991 0 : Size SvxXLinePreview::GetOptimalSize() const
1992 : {
1993 0 : return getPreviewStripSize(this);
1994 : }
1995 :
1996 0 : SvxXLinePreview::~SvxXLinePreview()
1997 : {
1998 0 : SdrObject *pFoo = mpLineObjA;
1999 0 : SdrObject::Free( pFoo );
2000 0 : pFoo = mpLineObjB;
2001 0 : SdrObject::Free( pFoo );
2002 0 : pFoo = mpLineObjC;
2003 0 : SdrObject::Free( pFoo );
2004 0 : }
2005 :
2006 :
2007 :
2008 0 : void SvxXLinePreview::SetSymbol(Graphic* p,const Size& s)
2009 : {
2010 0 : mpGraphic = p;
2011 0 : maSymbolSize = s;
2012 0 : }
2013 :
2014 :
2015 :
2016 0 : void SvxXLinePreview::ResizeSymbol(const Size& s)
2017 : {
2018 0 : if ( s != maSymbolSize )
2019 : {
2020 0 : maSymbolSize = s;
2021 0 : Invalidate();
2022 : }
2023 0 : }
2024 :
2025 :
2026 :
2027 0 : void SvxXLinePreview::SetLineAttributes(const SfxItemSet& rItemSet)
2028 : {
2029 : // Set ItemSet at objects
2030 0 : mpLineObjA->SetMergedItemSet(rItemSet);
2031 :
2032 : // At line joints, do not use arrows
2033 0 : SfxItemSet aTempSet(rItemSet);
2034 0 : aTempSet.ClearItem(XATTR_LINESTART);
2035 0 : aTempSet.ClearItem(XATTR_LINEEND);
2036 :
2037 0 : mpLineObjB->SetMergedItemSet(aTempSet);
2038 0 : mpLineObjC->SetMergedItemSet(aTempSet);
2039 0 : }
2040 :
2041 :
2042 :
2043 0 : void SvxXLinePreview::Paint( const Rectangle& )
2044 : {
2045 0 : LocalPrePaint();
2046 :
2047 : // paint objects to buffer device
2048 0 : sdr::contact::SdrObjectVector aObjectVector;
2049 0 : aObjectVector.push_back(mpLineObjA);
2050 0 : aObjectVector.push_back(mpLineObjB);
2051 0 : aObjectVector.push_back(mpLineObjC);
2052 :
2053 0 : sdr::contact::ObjectContactOfObjListPainter aPainter(getBufferDevice(), aObjectVector, 0);
2054 0 : sdr::contact::DisplayInfo aDisplayInfo;
2055 :
2056 : // do processing
2057 0 : aPainter.ProcessDisplay(aDisplayInfo);
2058 :
2059 0 : if ( mbWithSymbol && mpGraphic )
2060 : {
2061 0 : const Size aOutputSize(GetOutputSize());
2062 0 : Point aPos = Point( aOutputSize.Width() / 3, aOutputSize.Height() / 2 );
2063 0 : aPos.X() -= maSymbolSize.Width() / 2;
2064 0 : aPos.Y() -= maSymbolSize.Height() / 2;
2065 0 : mpGraphic->Draw( &getBufferDevice(), aPos, maSymbolSize );
2066 : }
2067 :
2068 0 : LocalPostPaint();
2069 0 : }
2070 :
2071 0 : SvxXRectPreview::SvxXRectPreview(vcl::Window* pParent)
2072 : : SvxPreviewBase(pParent)
2073 0 : , mpRectangleObject(0)
2074 : {
2075 0 : InitSettings(true, true);
2076 :
2077 : // create RectangleObject
2078 0 : const Rectangle aObjectSize(Point(), GetOutputSize());
2079 0 : mpRectangleObject = new SdrRectObj(aObjectSize);
2080 0 : mpRectangleObject->SetModel(&getModel());
2081 0 : }
2082 :
2083 0 : void SvxXRectPreview::Resize()
2084 : {
2085 0 : const Rectangle aObjectSize(Point(), GetOutputSize());
2086 0 : SdrObject *pOrigObject = mpRectangleObject;
2087 0 : if (pOrigObject)
2088 : {
2089 0 : mpRectangleObject = new SdrRectObj(aObjectSize);
2090 0 : mpRectangleObject->SetModel(&getModel());
2091 0 : SetAttributes(pOrigObject->GetMergedItemSet());
2092 0 : SdrObject::Free(pOrigObject);
2093 : }
2094 0 : SvxPreviewBase::Resize();
2095 0 : }
2096 :
2097 0 : extern "C" SAL_DLLPUBLIC_EXPORT vcl::Window* SAL_CALL makeSvxXRectPreview(vcl::Window *pParent, VclBuilder::stringmap &)
2098 : {
2099 0 : return new SvxXRectPreview(pParent);
2100 : }
2101 :
2102 0 : SvxXRectPreview::~SvxXRectPreview()
2103 : {
2104 0 : SdrObject::Free(mpRectangleObject);
2105 0 : }
2106 :
2107 0 : void SvxXRectPreview::SetAttributes(const SfxItemSet& rItemSet)
2108 : {
2109 0 : mpRectangleObject->SetMergedItemSet(rItemSet, true);
2110 0 : mpRectangleObject->SetMergedItem(XLineStyleItem(XLINE_NONE));
2111 0 : }
2112 :
2113 0 : void SvxXRectPreview::Paint( const Rectangle& )
2114 : {
2115 0 : LocalPrePaint();
2116 :
2117 0 : sdr::contact::SdrObjectVector aObjectVector;
2118 :
2119 0 : aObjectVector.push_back(mpRectangleObject);
2120 :
2121 0 : sdr::contact::ObjectContactOfObjListPainter aPainter(getBufferDevice(), aObjectVector, 0);
2122 0 : sdr::contact::DisplayInfo aDisplayInfo;
2123 :
2124 0 : aPainter.ProcessDisplay(aDisplayInfo);
2125 :
2126 0 : LocalPostPaint();
2127 0 : }
2128 :
2129 0 : SvxXShadowPreview::SvxXShadowPreview( vcl::Window* pParent )
2130 : : SvxPreviewBase(pParent)
2131 : , mpRectangleObject(0)
2132 0 : , mpRectangleShadow(0)
2133 : {
2134 0 : InitSettings(true, true);
2135 :
2136 : // prepare size
2137 0 : Size aSize = GetOutputSize();
2138 0 : aSize.Width() = aSize.Width() / 3;
2139 0 : aSize.Height() = aSize.Height() / 3;
2140 :
2141 : // create RectangleObject
2142 0 : const Rectangle aObjectSize( Point( aSize.Width(), aSize.Height() ), aSize );
2143 0 : mpRectangleObject = new SdrRectObj(aObjectSize);
2144 0 : mpRectangleObject->SetModel(&getModel());
2145 :
2146 : // create ShadowObject
2147 0 : const Rectangle aShadowSize( Point( aSize.Width(), aSize.Height() ), aSize );
2148 0 : mpRectangleShadow = new SdrRectObj(aShadowSize);
2149 0 : mpRectangleShadow->SetModel(&getModel());
2150 0 : }
2151 :
2152 0 : extern "C" SAL_DLLPUBLIC_EXPORT vcl::Window* SAL_CALL makeSvxXShadowPreview (vcl::Window *pParent, VclBuilder::stringmap &)
2153 : {
2154 0 : return new SvxXShadowPreview(pParent);
2155 : }
2156 :
2157 0 : SvxXShadowPreview::~SvxXShadowPreview()
2158 : {
2159 0 : SdrObject::Free(mpRectangleObject);
2160 0 : SdrObject::Free(mpRectangleShadow);
2161 0 : }
2162 :
2163 0 : void SvxXShadowPreview::SetRectangleAttributes(const SfxItemSet& rItemSet)
2164 : {
2165 0 : mpRectangleObject->SetMergedItemSet(rItemSet, true);
2166 0 : mpRectangleObject->SetMergedItem(XLineStyleItem(XLINE_NONE));
2167 0 : }
2168 :
2169 0 : void SvxXShadowPreview::SetShadowAttributes(const SfxItemSet& rItemSet)
2170 : {
2171 0 : mpRectangleShadow->SetMergedItemSet(rItemSet, true);
2172 0 : mpRectangleShadow->SetMergedItem(XLineStyleItem(XLINE_NONE));
2173 0 : }
2174 :
2175 0 : void SvxXShadowPreview::SetShadowPosition(const Point& rPos)
2176 : {
2177 0 : maShadowOffset = rPos;
2178 0 : }
2179 :
2180 0 : void SvxXShadowPreview::Paint( const Rectangle& )
2181 : {
2182 0 : LocalPrePaint();
2183 :
2184 : // prepare size
2185 0 : Size aSize = GetOutputSize();
2186 0 : aSize.Width() = aSize.Width() / 3;
2187 0 : aSize.Height() = aSize.Height() / 3;
2188 :
2189 0 : Rectangle aObjectRect(Point(aSize.Width(), aSize.Height()), aSize);
2190 0 : mpRectangleObject->SetSnapRect(aObjectRect);
2191 0 : aObjectRect.Move(maShadowOffset.X(), maShadowOffset.Y());
2192 0 : mpRectangleShadow->SetSnapRect(aObjectRect);
2193 :
2194 0 : sdr::contact::SdrObjectVector aObjectVector;
2195 :
2196 0 : aObjectVector.push_back(mpRectangleShadow);
2197 0 : aObjectVector.push_back(mpRectangleObject);
2198 :
2199 0 : sdr::contact::ObjectContactOfObjListPainter aPainter(getBufferDevice(), aObjectVector, 0);
2200 0 : sdr::contact::DisplayInfo aDisplayInfo;
2201 :
2202 0 : aPainter.ProcessDisplay(aDisplayInfo);
2203 :
2204 0 : LocalPostPaint();
2205 594 : }
2206 :
2207 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|