1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: svxbmpnumvalueset.cxx,v $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_svx.hxx"
33 #include <svx/dialmgr.hxx>
34 #ifndef _SVX_DIALOGS_HRC
35 #include <svx/dialogs.hrc>
37 #include <tools/shl.hxx>
38 #include <i18npool/mslangid.hxx>
39 #include <svtools/valueset.hxx>
40 #include <svtools/languageoptions.hxx>
41 #ifndef _SVX_HELPID_HRC
44 #include <svx/numitem.hxx>
45 #include <svtools/eitem.hxx>
46 #include <vcl/svapp.hxx>
47 #include <gallery.hxx>
48 #include <svtools/urihelper.hxx>
49 #include <svx/brshitem.hxx>
50 #include <svtools/intitem.hxx>
51 #include <sfx2/objsh.hxx>
52 #include <vcl/graph.hxx>
53 #include <vcl/msgbox.hxx>
54 #include <flstitem.hxx>
55 #include <dlgutil.hxx>
56 #ifndef _XTABLE_HXX //autogen
58 #include <svx/xtable.hxx>
60 #include <drawitem.hxx>
61 #include <numvset.hxx>
62 #include <htmlmode.hxx>
63 #include <svtools/pathoptions.hxx>
64 #include <svtools/ctrltool.hxx>
65 #include <unolingu.hxx>
66 #include <com/sun/star/style/NumberingType.hpp>
67 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
68 #include <com/sun/star/container/XIndexAccess.hpp>
69 #include <com/sun/star/text/XDefaultNumberingProvider.hpp>
70 #include <com/sun/star/text/XNumberingFormatter.hpp>
71 #include <com/sun/star/beans/PropertyValue.hpp>
72 #include <comphelper/processfactory.hxx>
73 #include <com/sun/star/text/XNumberingTypeInfo.hpp>
76 #include "opengrf.hxx"
78 using namespace com::sun::star::uno
;
79 using namespace com::sun::star::beans
;
80 using namespace com::sun::star::lang
;
81 using namespace com::sun::star::i18n
;
82 using namespace com::sun::star::text
;
83 using namespace com::sun::star::container
;
84 using namespace com::sun::star::style
;
87 #define C2U(cChar) OUString::createFromAscii(cChar)
88 #define NUM_PAGETYPE_BULLET 0
89 #define NUM_PAGETYPE_SINGLENUM 1
90 #define NUM_PAGETYPE_NUM 2
91 #define NUM_PAGETYPE_BMP 3
92 #define PAGETYPE_USER_START 10
94 #define SHOW_NUMBERING 0
98 #define MAX_BMP_WIDTH 16
99 #define MAX_BMP_HEIGHT 16
101 static const sal_Char cNumberingType
[] = "NumberingType";
102 static const sal_Char cValue
[] = "Value";
103 static const sal_Char cParentNumbering
[] = "ParentNumbering";
104 static const sal_Char cPrefix
[] = "Prefix";
105 static const sal_Char cSuffix
[] = "Suffix";
106 static const sal_Char cBulletChar
[] = "BulletChar";
107 static const sal_Char cBulletFontName
[] = "BulletFontName";
109 /* -----------------28.10.98 08:32-------------------
111 * --------------------------------------------------*/
112 // Die Auswahl an Bullets aus den StarSymbol
113 static const sal_Unicode aBulletTypes
[] =
125 static Font
& lcl_GetDefaultBulletFont()
127 static BOOL bInit
= 0;
128 static Font
aDefBulletFont( UniString::CreateFromAscii(
129 RTL_CONSTASCII_STRINGPARAM( "StarSymbol" ) ),
130 String(), Size( 0, 14 ) );
133 aDefBulletFont
.SetCharSet( RTL_TEXTENCODING_SYMBOL
);
134 aDefBulletFont
.SetFamily( FAMILY_DONTKNOW
);
135 aDefBulletFont
.SetPitch( PITCH_DONTKNOW
);
136 aDefBulletFont
.SetWeight( WEIGHT_DONTKNOW
);
137 aDefBulletFont
.SetTransparent( TRUE
);
140 return aDefBulletFont
;
143 static void lcl_PaintLevel(OutputDevice
* pVDev
, sal_Int16 nNumberingType
,
144 const OUString
& rBulletChar
, const OUString
& rText
, const OUString
& rFontName
,
145 Point
& rLeft
, Font
& rRuleFont
, const Font
& rTextFont
)
148 if(NumberingType::CHAR_SPECIAL
== nNumberingType
)
150 rRuleFont
.SetStyleName(rFontName
);
151 pVDev
->SetFont(rRuleFont
);
152 pVDev
->DrawText(rLeft
, rBulletChar
);
153 rLeft
.X() += pVDev
->GetTextWidth(rBulletChar
);
157 pVDev
->SetFont(rTextFont
);
158 pVDev
->DrawText(rLeft
, rText
);
159 rLeft
.X() += pVDev
->GetTextWidth(rText
);
162 void SvxNumValueSet::UserDraw( const UserDrawEvent
& rUDEvt
)
164 static USHORT __READONLY_DATA aLinesArr
[] =
170 35, 90, // up to here line positions
171 05, 10, // character positions
178 const StyleSettings
& rStyleSettings
= GetSettings().GetStyleSettings();
179 const Color aBackColor
= rStyleSettings
.GetFieldColor();
180 const Color aTextColor
= rStyleSettings
.GetFieldTextColor();
182 OutputDevice
* pDev
= rUDEvt
.GetDevice();
183 Rectangle aRect
= rUDEvt
.GetRect();
184 USHORT nItemId
= rUDEvt
.GetItemId();
185 long nRectWidth
= aRect
.GetWidth();
186 long nRectHeight
= aRect
.GetHeight();
187 Size
aRectSize(nRectWidth
, aRect
.GetHeight());
188 Point aBLPos
= aRect
.TopLeft();
189 Font aOldFont
= pDev
->GetFont();
190 Color aOldColor
= pDev
->GetLineColor();
191 pDev
->SetLineColor(aTextColor
);
192 Font
aFont(OutputDevice::GetDefaultFont(
193 DEFAULTFONT_UI_SANS
, MsLangId::getSystemLanguage(), DEFAULTFONT_FLAGS_ONLYONE
));
195 Size aSize
= aFont
.GetSize();
197 Font
aRuleFont( lcl_GetDefaultBulletFont() );
198 aSize
.Height() = nRectHeight
/6;
199 aRuleFont
.SetSize(aSize
);
200 aRuleFont
.SetColor(aTextColor
);
201 aRuleFont
.SetFillColor(aBackColor
);
202 if(nPageType
== NUM_PAGETYPE_BULLET
)
204 else if(nPageType
== NUM_PAGETYPE_NUM
)
206 aSize
.Height() = nRectHeight
/8;
208 aFont
.SetColor(aTextColor
);
209 aFont
.SetFillColor(aBackColor
);
210 aFont
.SetSize( aSize
);
211 pDev
->SetFont(aFont
);
215 // Die Linien werden nur einmalig in das VirtualDevice gepainted
216 // nur die Gliederungspage bekommt es aktuell
217 pVDev
= new VirtualDevice(*pDev
);
218 pVDev
->SetMapMode(pDev
->GetMapMode());
219 pVDev
->EnableRTL( IsRTLEnabled() );
220 pVDev
->SetOutputSize( aRectSize
);
222 pVDev
->SetFillColor( aBackColor
);
223 pVDev
->DrawRect(aOrgRect
);
225 if(aBackColor
== aLineColor
)
227 pVDev
->SetLineColor(aLineColor
);
228 // Linien nur einmalig Zeichnen
229 if(nPageType
!= NUM_PAGETYPE_NUM
)
231 Point
aStart(aBLPos
.X() + nRectWidth
*25 / 100,0);
232 Point
aEnd(aBLPos
.X() + nRectWidth
* 9 / 10,0);
233 for( USHORT i
= 11; i
< 100; i
+= 33)
235 aStart
.Y() = aEnd
.Y() = aBLPos
.Y() + nRectHeight
* i
/ 100;
236 pVDev
->DrawLine(aStart
, aEnd
);
237 aStart
.Y() = aEnd
.Y() = aBLPos
.Y() + nRectHeight
* (i
+ 11) / 100;
238 pVDev
->DrawLine(aStart
, aEnd
);
242 pDev
->DrawOutDev( aRect
.TopLeft(), aRectSize
,
243 aOrgRect
.TopLeft(), aRectSize
,
245 // jetzt kommt der Text
246 const OUString
sValue(C2U(cValue
));
247 if( NUM_PAGETYPE_SINGLENUM
== nPageType
||
248 NUM_PAGETYPE_BULLET
== nPageType
)
250 Point
aStart(aBLPos
.X() + nRectWidth
/ 9,0);
251 for( USHORT i
= 0; i
< 3; i
++ )
253 USHORT nY
= 11 + i
* 33;
254 aStart
.Y() = aBLPos
.Y() + nRectHeight
* nY
/ 100;
256 if(nPageType
== NUM_PAGETYPE_BULLET
)
258 sText
= aBulletTypes
[nItemId
- 1];
259 aStart
.Y() -= pDev
->GetTextHeight()/2;
260 aStart
.X() = aBLPos
.X() + 5;
264 if(xFormatter
.is() && aNumSettings
.getLength() > nItemId
- 1)
266 Sequence
<PropertyValue
> aLevel
= aNumSettings
.getConstArray()[nItemId
- 1];
269 aLevel
.realloc(aLevel
.getLength() + 1);
270 PropertyValue
& rValue
= aLevel
.getArray()[aLevel
.getLength() - 1];
271 rValue
.Name
= sValue
;
272 rValue
.Value
<<= (sal_Int32
)(i
+ 1);
273 sText
= xFormatter
->makeNumberingString( aLevel
, aLocale
);
277 DBG_ERROR("Exception in DefaultNumberingProvider::makeNumberingString");
280 // knapp neben dem linken Rand beginnen
281 aStart
.X() = aBLPos
.X() + 2;
282 aStart
.Y() -= pDev
->GetTextHeight()/2;
284 pDev
->DrawText(aStart
, sText
);
287 else if(NUM_PAGETYPE_NUM
== nPageType
)
289 // Outline numbering has to be painted into the virtual device
290 // to get correct lines
291 // has to be made again
292 pVDev
->DrawRect(aOrgRect
);
293 long nStartX
= aOrgRect
.TopLeft().X();
294 long nStartY
= aOrgRect
.TopLeft().Y();
296 if(xFormatter
.is() && aOutlineSettings
.getLength() > nItemId
- 1)
298 Reference
<XIndexAccess
> xLevel
= aOutlineSettings
.getArray()[nItemId
- 1];
301 OUString sLevelTexts
[5];
302 OUString sFontNames
[5];
303 OUString sBulletChars
[5];
304 sal_Int16 aNumberingTypes
[5];
305 OUString sPrefixes
[5];
306 OUString sSuffixes
[5];
307 sal_Int16 aParentNumberings
[5];
309 sal_Int32 nLevelCount
= xLevel
->getCount();
312 for( sal_Int32 i
= 0; i
< nLevelCount
&& i
< 5; i
++)
314 long nTop
= nStartY
+ nRectHeight
* (aLinesArr
[2 * i
+ 11])/100 ;
315 Point
aLeft(nStartX
+ nRectWidth
* (aLinesArr
[2 * i
+ 10])/ 100, nTop
);
317 Any aLevelAny
= xLevel
->getByIndex(i
);
318 Sequence
<PropertyValue
> aLevel
;
319 aLevelAny
>>= aLevel
;
320 const PropertyValue
* pValues
= aLevel
.getConstArray();
321 aNumberingTypes
[i
] = 0;
322 for(sal_Int32 nProperty
= 0; nProperty
< aLevel
.getLength() - 1; nProperty
++)
324 if(pValues
[nProperty
].Name
.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(cNumberingType
)))
325 pValues
[nProperty
].Value
>>= aNumberingTypes
[i
];
326 else if(pValues
[nProperty
].Name
.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(cBulletFontName
)))
327 pValues
[nProperty
].Value
>>= sFontNames
[i
];
328 else if(pValues
[nProperty
].Name
.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(cBulletChar
)))
329 pValues
[nProperty
].Value
>>= sBulletChars
[i
];
330 else if(pValues
[nProperty
].Name
.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(cPrefix
)))
331 pValues
[nProperty
].Value
>>= sPrefixes
[i
];
332 else if(pValues
[nProperty
].Name
.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(cSuffix
)))
333 pValues
[nProperty
].Value
>>= sSuffixes
[i
];
334 else if(pValues
[nProperty
].Name
.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(cParentNumbering
)))
335 pValues
[nProperty
].Value
>>= aParentNumberings
[i
];
337 Sequence
< PropertyValue
> aProperties(2);
338 PropertyValue
* pProperties
= aProperties
.getArray();
339 pProperties
[0].Name
= rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("NumberingType"));
340 pProperties
[0].Value
<<= aNumberingTypes
[i
];
341 pProperties
[1].Name
= rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Value"));
342 pProperties
[1].Value
<<= (sal_Int32
)1;
345 sLevelTexts
[i
] = xFormatter
->makeNumberingString( aProperties
, aLocale
);
349 DBG_ERROR("Exception in DefaultNumberingProvider::makeNumberingString");
352 aLeft
.Y() -= (pDev
->GetTextHeight()/2);
353 if(sPrefixes
[i
].getLength() &&
354 !sPrefixes
[i
].equalsAsciiL(" ", 1) &&
355 sPrefixes
[i
].getStr()[0] != 0)
357 pVDev
->SetFont(aFont
);
358 pVDev
->DrawText(aLeft
, sPrefixes
[i
]);
359 aLeft
.X() += pDev
->GetTextWidth(sPrefixes
[i
]);
361 if(aParentNumberings
[i
])
363 //insert old numberings here
364 sal_Int32 nStartLevel
= std::min((sal_Int32
)aParentNumberings
[i
], i
);
365 for(sal_Int32 nParentLevel
= i
- nStartLevel
; nParentLevel
< i
; nParentLevel
++)
367 OUString
sTmp(sLevelTexts
[nParentLevel
]);
369 lcl_PaintLevel(pVDev
,
370 aNumberingTypes
[nParentLevel
],
371 sBulletChars
[nParentLevel
],
373 sFontNames
[nParentLevel
],
379 lcl_PaintLevel(pVDev
,
387 if(sSuffixes
[i
].getLength()&&
388 !sSuffixes
[i
].equalsAsciiL(" ", 1) &&
389 sSuffixes
[i
].getStr()[0] != 0)
391 pVDev
->SetFont(aFont
);
392 pVDev
->DrawText(aLeft
, sSuffixes
[i
]);
393 aLeft
.X() += pDev
->GetTextWidth(sSuffixes
[i
]);
396 long nLineTop
= nStartY
+ nRectHeight
* aLinesArr
[2 * i
+ 1]/100 ;
397 Point
aLineLeft(aLeft
.X() /*+ nStartX + nRectWidth * aLinesArr[2 * i]/ 100*/, nLineTop
);
398 Point
aLineRight(nStartX
+ nRectWidth
* 90 /100, nLineTop
);
399 pVDev
->DrawLine(aLineLeft
, aLineRight
);
406 static sal_Bool bAssert
= FALSE
;
409 DBG_ERROR("exception in ::UserDraw");
419 pDev
->DrawOutDev( aRect
.TopLeft(), aRectSize
,
420 aOrgRect
.TopLeft(), aRectSize
,
424 pDev
->SetFont(aOldFont
);
425 pDev
->SetLineColor(aOldColor
);
428 /**************************************************************************/
431 /**************************************************************************/
433 SvxNumValueSet::SvxNumValueSet( Window
* pParent
, const ResId
& rResId
, USHORT nType
) :
435 ValueSet( pParent
, rResId
),
437 aLineColor ( COL_LIGHTGRAY
),
444 SetStyle( GetStyle() | WB_ITEMBORDER
| WB_DOUBLEBORDER
);
445 if(NUM_PAGETYPE_BULLET
== nType
)
447 for ( USHORT i
= 0; i
< 8; i
++ )
449 InsertItem( i
+ 1, i
);
450 SetItemText( i
+ 1, SVX_RESSTR( RID_SVXSTR_BULLET_DESCRIPTIONS
+ i
) );
455 /*-----------------08.02.97 12.38-------------------
457 --------------------------------------------------*/
459 SvxNumValueSet::~SvxNumValueSet()
463 /* -----------------------------30.01.01 16:24--------------------------------
465 ---------------------------------------------------------------------------*/
466 void SvxNumValueSet::SetNumberingSettings(
467 const Sequence
<Sequence
<PropertyValue
> >& aNum
,
468 Reference
<XNumberingFormatter
>& xFormat
,
469 const Locale
& rLocale
)
472 xFormatter
= xFormat
;
474 if(aNum
.getLength() > 8)
475 SetStyle( GetStyle()|WB_VSCROLL
);
476 for ( USHORT i
= 0; i
< aNum
.getLength(); i
++ )
478 InsertItem( i
+ 1, i
);
480 SetItemText( i
+ 1, SVX_RESSTR( RID_SVXSTR_SINGLENUM_DESCRIPTIONS
+ i
));
483 /* -----------------------------31.01.01 09:50--------------------------------
485 ---------------------------------------------------------------------------*/
486 void SvxNumValueSet::SetOutlineNumberingSettings(
487 Sequence
<Reference
<XIndexAccess
> >& rOutline
,
488 Reference
<XNumberingFormatter
>& xFormat
,
489 const Locale
& rLocale
)
491 aOutlineSettings
= rOutline
;
492 xFormatter
= xFormat
;
494 if(aOutlineSettings
.getLength() > 8)
495 SetStyle( GetStyle() | WB_VSCROLL
);
496 for ( sal_uInt16 i
= 0; i
< aOutlineSettings
.getLength(); i
++ )
498 InsertItem( i
+ 1, i
);
500 SetItemText( i
+ 1, SVX_RESSTR( RID_SVXSTR_OUTLINENUM_DESCRIPTIONS
+ i
));
504 SvxBmpNumValueSet::SvxBmpNumValueSet( Window
* pParent
, const ResId
& rResId
/*, const List& rStrNames*/ ) :
506 SvxNumValueSet( pParent
, rResId
, NUM_PAGETYPE_BMP
),
507 // rStrList ( rStrNames ),
508 bGrfNotFound( FALSE
)
511 GalleryExplorer::BeginLocking(GALLERY_THEME_BULLETS
);
512 SetStyle( GetStyle() | WB_VSCROLL
);
514 aFormatTimer
.SetTimeout(300);
515 aFormatTimer
.SetTimeoutHdl(LINK(this, SvxBmpNumValueSet
, FormatHdl_Impl
));
518 /*-----------------13.02.97 09.41-------------------
520 --------------------------------------------------*/
522 SvxBmpNumValueSet::~SvxBmpNumValueSet()
524 GalleryExplorer::EndLocking(GALLERY_THEME_BULLETS
);
527 /*-----------------13.02.97 09.41-------------------
529 --------------------------------------------------*/
531 void SvxBmpNumValueSet::UserDraw( const UserDrawEvent
& rUDEvt
)
533 SvxNumValueSet::UserDraw(rUDEvt
);
535 Rectangle aRect
= rUDEvt
.GetRect();
536 OutputDevice
* pDev
= rUDEvt
.GetDevice();
537 USHORT nItemId
= rUDEvt
.GetItemId();
538 Point aBLPos
= aRect
.TopLeft();
540 int nRectHeight
= aRect
.GetHeight();
541 Size
aSize(nRectHeight
/8, nRectHeight
/8);
544 if(!GalleryExplorer::GetGraphicObj( GALLERY_THEME_BULLETS
, nItemId
- 1,
551 Point
aPos(aBLPos
.X() + 5, 0);
552 for( USHORT i
= 0; i
< 3; i
++ )
554 USHORT nY
= 11 + i
* 33;
555 aPos
.Y() = aBLPos
.Y() + nRectHeight
* nY
/ 100;
556 aGraphic
.Draw( pDev
, aPos
, aSize
);
561 /*-----------------14.02.97 07.34-------------------
563 --------------------------------------------------*/
565 IMPL_LINK(SvxBmpNumValueSet
, FormatHdl_Impl
, Timer
*, EMPTYARG
)
567 // nur, wenn eine Grafik nicht da war, muss formatiert werden
570 bGrfNotFound
= FALSE
;