1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22 #include "svx/sidebar/ValueSetWithTextControl.hxx"
23 #include <svx/dialogs.hrc>
24 #include <svx/dialmgr.hxx>
25 #include <sfx2/sidebar/Theme.hxx>
26
27 #include <limits.h>
28 #include <com/sun/star/uno/Reference.h>
29 #include <com/sun/star/uno/Sequence.h>
30 #include <com/sun/star/lang/Locale.hpp>
31 #include <com/sun/star/style/NumberingType.hpp>
32 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
33 #include <com/sun/star/container/XIndexAccess.hpp>
34 #include <com/sun/star/text/XDefaultNumberingProvider.hpp>
35 #include <com/sun/star/text/XNumberingFormatter.hpp>
36 #include <com/sun/star/beans/PropertyValue.hpp>
37 #include <comphelper/processfactory.hxx>
38 #include <com/sun/star/text/XNumberingTypeInfo.hpp>
39 #include <i18npool/mslangid.hxx>
40 #include <svtools/valueset.hxx>
41 #include <editeng/brshitem.hxx>
42 #include <vcl/graph.hxx>
43 #include <svx/nbdtmg.hxx>
44 #include <svx/nbdtmgfact.hxx>
45
46 using namespace com::sun::star::uno;
47 using namespace com::sun::star::beans;
48 using namespace com::sun::star::lang;
49 using namespace com::sun::star::i18n;
50 using namespace com::sun::star::text;
51 using namespace com::sun::star::container;
52 using namespace com::sun::star::style;
53 using rtl::OUString;
54
55 #define C2U(cChar) OUString::createFromAscii(cChar)
56
57 namespace svx { namespace sidebar {
58 static const sal_Char cValue[] = "Value";
59
lcl_GetDefaultBulletFont()60 static Font& lcl_GetDefaultBulletFont()
61 {
62 static sal_Bool bInit = 0;
63 static Font aDefBulletFont( UniString::CreateFromAscii(
64 RTL_CONSTASCII_STRINGPARAM( "StarSymbol" ) ),
65 String(), Size( 0, 14 ) );
66 if(!bInit)
67 {
68 aDefBulletFont.SetCharSet( RTL_TEXTENCODING_SYMBOL );
69 aDefBulletFont.SetFamily( FAMILY_DONTKNOW );
70 aDefBulletFont.SetPitch( PITCH_DONTKNOW );
71 aDefBulletFont.SetWeight( WEIGHT_DONTKNOW );
72 aDefBulletFont.SetTransparent( sal_True );
73 bInit = sal_True;
74 }
75 return aDefBulletFont;
76 }
77
ValueSetWithTextControl(const tControlType eControlType,Window * pParent,const ResId & rResId)78 ValueSetWithTextControl::ValueSetWithTextControl(
79 const tControlType eControlType,
80 Window* pParent,
81 const ResId& rResId)
82 : ValueSet( pParent, rResId )
83 , meControlType( eControlType )
84 , maItems()
85 {
86 SetColCount( 1 );
87 }
88
89
~ValueSetWithTextControl(void)90 ValueSetWithTextControl::~ValueSetWithTextControl(void)
91 {
92 }
93
94
AddItem(const Image & rItemImage,const Image * pSelectedItemImage,const XubString & rItemText,const XubString * pItemHelpText)95 void ValueSetWithTextControl::AddItem(
96 const Image& rItemImage,
97 const Image* pSelectedItemImage,
98 const XubString& rItemText,
99 const XubString* pItemHelpText )
100 {
101 if ( meControlType != IMAGE_TEXT )
102 {
103 return;
104 }
105
106 ValueSetWithTextItem aItem;
107 aItem.maItemImage = rItemImage;
108 aItem.maSelectedItemImage = (pSelectedItemImage != 0)
109 ? *pSelectedItemImage
110 : rItemImage;
111 aItem.maItemText = rItemText;
112
113 maItems.push_back( aItem );
114
115 InsertItem( maItems.size() );
116 SetItemText( maItems.size(),
117 (pItemHelpText != 0) ? *pItemHelpText : rItemText );
118 }
119
120
AddItem(const XubString & rItemText,const XubString & rItemText2,const XubString * pItemHelpText)121 void ValueSetWithTextControl::AddItem(
122 const XubString& rItemText,
123 const XubString& rItemText2,
124 const XubString* pItemHelpText )
125 {
126 if ( meControlType != TEXT_TEXT )
127 {
128 return;
129 }
130
131 ValueSetWithTextItem aItem;
132 aItem.maItemText = rItemText;
133 aItem.maItemText2 = rItemText2;
134
135 maItems.push_back( aItem );
136
137 InsertItem( maItems.size() );
138 SetItemText( maItems.size(),
139 (pItemHelpText != 0) ? *pItemHelpText : rItemText );
140 }
141
142
ReplaceItemImages(const sal_uInt16 nItemId,const Image & rItemImage,const Image * pSelectedItemImage)143 void ValueSetWithTextControl::ReplaceItemImages(
144 const sal_uInt16 nItemId,
145 const Image& rItemImage,
146 const Image* pSelectedItemImage )
147 {
148 if ( meControlType != IMAGE_TEXT )
149 {
150 return;
151 }
152
153 if ( nItemId == 0 ||
154 nItemId > maItems.size() )
155 {
156 return;
157 }
158
159 maItems[nItemId-1].maItemImage = rItemImage;
160 maItems[nItemId-1].maSelectedItemImage = (pSelectedItemImage != 0)
161 ? *pSelectedItemImage
162 : rItemImage;
163 }
164
165
UserDraw(const UserDrawEvent & rUDEvt)166 void ValueSetWithTextControl::UserDraw( const UserDrawEvent& rUDEvt )
167 {
168 const Rectangle aRect = rUDEvt.GetRect();
169 OutputDevice* pDev = rUDEvt.GetDevice();
170 pDev->Push( PUSH_ALL );
171 const sal_uInt16 nItemId = rUDEvt.GetItemId();
172
173 const long nRectHeight = aRect.GetHeight();
174 const Point aBLPos = aRect.TopLeft();
175
176 Font aFont(OutputDevice::GetDefaultFont(DEFAULTFONT_UI_SANS, MsLangId::getSystemLanguage(), DEFAULTFONT_FLAGS_ONLYONE));
177 {
178 Size aSize = aFont.GetSize();
179 aSize.Height() = (nRectHeight*4)/9;
180 aFont.SetSize( aSize );
181 }
182
183 {
184 //draw backgroud
185 if ( GetSelectItemId() == nItemId )
186 {
187 Rectangle aBackRect = aRect;
188 aBackRect.Top() += 3;
189 aBackRect.Bottom() -= 2;
190 pDev->SetFillColor( sfx2::sidebar::Theme::GetColor( sfx2::sidebar::Theme::Color_Highlight ) );
191 pDev->DrawRect(aBackRect);
192 }
193 else
194 {
195 pDev->SetFillColor( COL_TRANSPARENT );
196 pDev->DrawRect(aRect);
197 }
198
199 //draw image + text resp. text + text
200 Image* pImage = 0;
201 if ( GetSelectItemId() == nItemId )
202 {
203 aFont.SetColor( sfx2::sidebar::Theme::GetColor( sfx2::sidebar::Theme::Color_HighlightText ) );
204 pImage = &maItems[nItemId-1].maSelectedItemImage;
205 }
206 else
207 {
208 aFont.SetColor( GetSettings().GetStyleSettings().GetFieldTextColor() );
209 pImage = &maItems[nItemId-1].maItemImage;
210 }
211
212 Rectangle aStrRect = aRect;
213 aStrRect.Top() += nRectHeight/4;
214 aStrRect.Bottom() -= nRectHeight/4;
215
216 switch ( meControlType )
217 {
218 case IMAGE_TEXT:
219 {
220 Point aImgStart(
221 aBLPos.X() + 4,
222 aBLPos.Y() + ( ( nRectHeight - pImage->GetSizePixel().Height() ) / 2 ) );
223 pDev->DrawImage( aImgStart, *pImage );
224
225 aStrRect.Left() += pImage->GetSizePixel().Width() + 12;
226 pDev->SetFont(aFont);
227 pDev->DrawText(aStrRect, maItems[nItemId-1].maItemText, TEXT_DRAW_ENDELLIPSIS);
228 }
229 break;
230 case TEXT_TEXT:
231 {
232 const long nRectWidth = aRect.GetWidth();
233 aStrRect.Left() += 8;
234 aStrRect.Right() -= (nRectWidth*2)/3;
235 pDev->SetFont(aFont);
236 pDev->DrawText(aStrRect, maItems[nItemId-1].maItemText, TEXT_DRAW_ENDELLIPSIS);
237 aStrRect.Left() += nRectWidth/3;
238 aStrRect.Right() += (nRectWidth*2)/3;
239 pDev->DrawText(aStrRect, maItems[nItemId-1].maItemText2, TEXT_DRAW_ENDELLIPSIS);
240 }
241 break;
242 }
243 }
244
245 Invalidate( aRect );
246 pDev->Pop();
247 }
248
SvxNumValueSet2(Window * pParent,const ResId & rResId)249 SvxNumValueSet2::SvxNumValueSet2( Window* pParent, const ResId& rResId) :
250 ValueSet( pParent, rResId ),
251 aLineColor ( COL_LIGHTGRAY ),
252 pVDev ( NULL )
253 {
254 SetColCount( 3 );
255 SetLineCount( 3 );
256 SetStyle( GetStyle() | WB_ITEMBORDER );
257 }
258
~SvxNumValueSet2()259 SvxNumValueSet2::~SvxNumValueSet2()
260 {
261 delete pVDev;
262 }
263
SetNumberingSettings(const Sequence<Sequence<PropertyValue>> & aNum,Reference<XNumberingFormatter> & xFormat,const Locale & rLocale)264 void SvxNumValueSet2::SetNumberingSettings(
265 const Sequence<Sequence<PropertyValue> >& aNum,
266 Reference<XNumberingFormatter>& xFormat,
267 const Locale& rLocale )
268 {
269 aNumSettings = aNum;
270 xFormatter = xFormat;
271 aLocale = rLocale;
272 if(aNum.getLength() > 9)
273 SetStyle( GetStyle()|WB_VSCROLL);
274 InsertItem( DEFAULT_NONE, DEFAULT_NONE - 1 );
275 SetItemText( DEFAULT_NONE, SVX_RESSTR( RID_SVXSTR_NUMBULLET_NONE ));
276
277 for ( sal_Int32 i = 0; i < aNum.getLength(); i++ )
278 {
279 InsertItem( i + 1);
280 if( i < 8 )
281 {
282 NBOTypeMgrBase* pNumbering = NBOutlineTypeMgrFact::CreateInstance(eNBOType::NUMBERING);
283 if ( pNumbering )
284 {
285 SetItemText( i + 1, pNumbering->GetDescription(i));
286 }
287 }
288 }
289 }
290
UserDraw(const UserDrawEvent & rUDEvt)291 void SvxNumValueSet2::UserDraw( const UserDrawEvent& rUDEvt )
292 {
293 const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
294 const Color aBackColor = rStyleSettings.GetFieldColor();
295 const Color aTextColor = rStyleSettings.GetFieldTextColor();
296
297 OutputDevice* pDev = rUDEvt.GetDevice();
298 Rectangle aRect = rUDEvt.GetRect();
299 sal_uInt32 nItemId = rUDEvt.GetItemId();
300 long nRectWidth = aRect.GetWidth();
301 long nRectHeight = aRect.GetHeight();
302 Size aRectSize(nRectWidth, aRect.GetHeight());
303 Point aBLPos = aRect.TopLeft();
304 Font aOldFont = pDev->GetFont();
305 Color aOldColor = pDev->GetLineColor();
306 pDev->SetLineColor(aBackColor);
307 Font aFont(OutputDevice::GetDefaultFont(
308 DEFAULTFONT_UI_SANS, MsLangId::getSystemLanguage(), DEFAULTFONT_FLAGS_ONLYONE));
309
310 Size aSize = aFont.GetSize();
311 aSize.Height() = nRectHeight/5;
312 aFont.SetColor(aTextColor);
313 aFont.SetFillColor(aBackColor);
314 aFont.SetSize( aSize );
315 pDev->SetFont(aFont);
316 pDev->SetLineColor(aTextColor);
317 if(!pVDev)
318 {
319 // Die Linien werden nur einmalig in das VirtualDevice gepainted
320 // nur die Gliederungspage bekommt es aktuell
321 pVDev = new VirtualDevice(*pDev);
322 pVDev->SetMapMode(pDev->GetMapMode());
323 pVDev->EnableRTL( IsRTLEnabled() );
324 pVDev->SetOutputSize( aRectSize );
325 aOrgRect = aRect;
326
327 pVDev->SetLineColor( aBackColor );
328 pVDev->SetFillColor( aBackColor );
329 pVDev->DrawRect(aOrgRect);
330
331 if(aBackColor == aLineColor)
332 aLineColor.Invert();
333 if(GetSettings().GetStyleSettings().GetHighContrastMode())
334 pVDev->SetLineColor(aTextColor);
335 else
336 pVDev->SetLineColor(aLineColor);
337 // Linien nur einmalig Zeichnen
338 Point aStart(aBLPos.X() + nRectWidth *30 / 100,0);
339 Point aEnd(aBLPos.X() + nRectWidth * 9 / 10,0);
340 for( sal_uInt32 i = 11; i < 100; i += 33)
341 {
342 aStart.Y() = aEnd.Y() = aBLPos.Y() + nRectHeight * i / 100;
343 pVDev->DrawLine(aStart, aEnd);
344 aStart.Y() = aEnd.Y() = aBLPos.Y() + nRectHeight * (i + 11) / 100;
345 pVDev->DrawLine(aStart, aEnd);
346 }
347 }
348 if ( nItemId != DEFAULT_NONE)
349 pDev->DrawOutDev( aRect.TopLeft(), aRectSize,
350 aOrgRect.TopLeft(), aRectSize,
351 *pVDev );
352 const OUString sValue(C2U(cValue));
353
354 Point aStart(aBLPos.X() + nRectWidth / 9,0);
355 if ( nItemId == DEFAULT_NONE)
356 {
357 String sText(SVX_RESSTR( RID_SVXSTR_NUMBULLET_NONE));
358 Font aFont = pDev->GetFont();
359 Size aSize = aFont.GetSize();
360 aSize.Height() = nRectHeight/4;
361 aFont.SetSize( aSize );
362 pDev->SetFont(aFont);
363 long nTextWidth = pDev->GetTextWidth(sText);
364 long nTextHeight = pDev->GetTextHeight();
365 //GVT refine
366 while (nTextWidth>nRectWidth && aSize.Height()>4) {
367 aSize.Height() = aSize.Height()*0.9;
368 aFont.SetSize( aSize );
369 pDev->SetFont(aFont);
370 nTextWidth = pDev->GetTextWidth(sText);
371 }
372 Point aSStart(aBLPos.X()+(nRectWidth-nTextWidth)/2, aBLPos.Y() +(nRectHeight-nTextHeight)/2);
373 pDev->DrawText(aSStart, sText);
374 pDev->SetFont(aOldFont);
375 }
376 else
377 {
378 NBOTypeMgrBase* pNumbering = NBOutlineTypeMgrFact::CreateInstance(eNBOType::NUMBERING);
379 if ( pNumbering && nItemId <= DEFAULT_BULLET_TYPES )
380 {
381 for( sal_uInt32 i = 0; i < 3; i++ )
382 {
383 sal_uInt32 nY = 11 + i * 33;
384 aStart.Y() = aBLPos.Y() + nRectHeight * nY / 100;
385 String sText;
386 sal_uInt16 nLvl = 0;
387 SvxNumRule aTempRule( 0, 10, false );
388 pNumbering->ApplyNumRule(aTempRule,nItemId -1,1<<nLvl);
389 SvxNumberFormat aNumFmt(aTempRule.GetLevel(nLvl));
390 sText=aNumFmt.GetNumStr(i+1);
391 sText.Insert( aNumFmt.GetPrefix(), 0 );
392 sText += aNumFmt.GetSuffix();
393 aStart.X() = aBLPos.X() + 2;
394 aStart.Y() -= pDev->GetTextHeight()/2;
395 pDev->DrawText(aStart, sText);
396 }
397 }
398 pDev->SetFont(aOldFont);
399 pDev->SetLineColor(aOldColor);
400 }
401 //End
402 }
403
404 //===============================================================================================
405
SvxNumValueSet3(Window * pParent,const ResId & rResId)406 SvxNumValueSet3::SvxNumValueSet3( Window* pParent, const ResId& rResId) :
407 ValueSet( pParent, rResId )
408 {
409 SetColCount( 3 );
410 SetLineCount( 4 );
411 SetStyle( GetStyle() | WB_ITEMBORDER );
412 }
413
~SvxNumValueSet3()414 SvxNumValueSet3::~SvxNumValueSet3()
415 {
416 }
417
UserDraw(const UserDrawEvent & rUDEvt)418 void SvxNumValueSet3::UserDraw( const UserDrawEvent& rUDEvt )
419 {
420 Rectangle aRect = rUDEvt.GetRect();
421 OutputDevice* pDev = rUDEvt.GetDevice();
422 sal_uInt32 nItemId = rUDEvt.GetItemId();
423
424 long nRectHeight = aRect.GetHeight();
425 long nRectWidth = aRect.GetWidth();
426 Point aBLPos = aRect.TopLeft();
427 NBOTypeMgrBase* pBullets = NBOutlineTypeMgrFact::CreateInstance(eNBOType::MIXBULLETS);
428 if ( pBullets )
429 {
430 if ( nItemId <= DEFAULT_BULLET_TYPES ) {
431 sal_uInt16 nLvl = 0;
432 SvxNumRule aTempRule( 0, 10, false );
433 pBullets->ApplyNumRule(aTempRule,nItemId -1,1<<nLvl);
434 SvxNumberFormat aFmt(aTempRule.GetLevel(nLvl));
435 sal_Int16 eNumType = aFmt.GetNumberingType();
436 if( eNumType == SVX_NUM_CHAR_SPECIAL)
437 {
438 sal_Unicode cChar = aFmt.GetBulletChar();
439 //End
440 const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
441 const Color aBackColor = rStyleSettings.GetFieldColor();
442 const Color aTextColor = rStyleSettings.GetFieldTextColor();
443
444 Font aOldFont = pDev->GetFont();
445 Font aFont( lcl_GetDefaultBulletFont() );
446
447 Size aSize = aFont.GetSize();
448 aSize.Height() = nRectHeight*3/6;
449 aFont.SetColor(aTextColor);
450 aFont.SetFillColor(aBackColor);
451 aFont.SetSize( aSize );
452 pDev->SetFont(aFont);
453 pDev->SetFillColor( aBackColor ); //wj
454
455 String sText;
456 sText = cChar;
457 Font aOldBulletFont = pDev->GetFont();
458 Font aBulletFnt(aFmt.GetBulletFont() ? *aFmt.GetBulletFont() : aOldBulletFont);
459 Size aBulSize = aOldBulletFont.GetSize();
460 aBulletFnt.SetSize(aBulSize);
461 pDev->SetFont(aBulletFnt);
462 long nTextWidth = pDev->GetTextWidth(sText);
463 long nTextHeight = pDev->GetTextHeight();
464 Point aStart(aBLPos.X()+(nRectWidth-nTextWidth)/2, aBLPos.Y() +(nRectHeight-nTextHeight)/2);
465 pDev->DrawText(aStart, sText);
466 pDev->SetFont(aOldFont);
467 }else if ( eNumType == SVX_NUM_BITMAP )
468 {
469 const SvxBrushItem* pBrushItem = aFmt.GetBrush();
470 if(pBrushItem)
471 {
472 const Graphic* pGrf = pBrushItem->GetGraphic();
473 if(pGrf)
474 {
475 Size aSize(nRectHeight*6/20, nRectHeight*6/20);
476 Point aStart(aBLPos.X() + nRectWidth*7/20, aBLPos.Y() + nRectHeight*7/20);
477
478 pGrf->Draw( pDev, aStart, aSize );
479 }
480 }
481 }
482 }else if ( nItemId == DEFAULT_NONE)
483 {
484 const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
485 const Color aBackColor = rStyleSettings.GetFieldColor();
486 const Color aTextColor = rStyleSettings.GetFieldTextColor();
487
488 Font aOldFont = pDev->GetFont();
489 Font aFont(OutputDevice::GetDefaultFont(DEFAULTFONT_UI_SANS, MsLangId::getSystemLanguage(), DEFAULTFONT_FLAGS_ONLYONE));
490 Size aSize = aFont.GetSize();
491 //aSize.Height() = nRectHeight/5;
492 aSize.Height() = nRectHeight/4;
493 aFont.SetColor(aTextColor);
494 aFont.SetFillColor(aBackColor);
495 aFont.SetSize( aSize );
496 pDev->SetFont(aFont);
497 pDev->SetFillColor( aBackColor );
498
499 String sText(SVX_RESSTR( RID_SVXSTR_NUMBULLET_NONE));
500
501 long nTextWidth = pDev->GetTextWidth(sText);
502 long nTextHeight = pDev->GetTextHeight();
503 //GVT refine
504 while (nTextWidth>nRectWidth && aSize.Height()>4) {
505 aSize.Height() = aSize.Height()*0.9;
506 aFont.SetSize( aSize );
507 pDev->SetFont(aFont);
508 nTextWidth = pDev->GetTextWidth(sText);
509 }
510 Point aStart(aBLPos.X()+(nRectWidth-nTextWidth)/2, aBLPos.Y() +(nRectHeight-nTextHeight)/2);
511 pDev->DrawText(aStart, sText);
512
513 pDev->SetFont(aOldFont);
514 }
515 }
516
517 }
518
519 } } // end of namespace svx::sidebar
520