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