1*f6e50924SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*f6e50924SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*f6e50924SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*f6e50924SAndrew Rist  * distributed with this work for additional information
6*f6e50924SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*f6e50924SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*f6e50924SAndrew Rist  * "License"); you may not use this file except in compliance
9*f6e50924SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*f6e50924SAndrew Rist  *
11*f6e50924SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*f6e50924SAndrew Rist  *
13*f6e50924SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*f6e50924SAndrew Rist  * software distributed under the License is distributed on an
15*f6e50924SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*f6e50924SAndrew Rist  * KIND, either express or implied.  See the License for the
17*f6e50924SAndrew Rist  * specific language governing permissions and limitations
18*f6e50924SAndrew Rist  * under the License.
19*f6e50924SAndrew Rist  *
20*f6e50924SAndrew Rist  *************************************************************/
21*f6e50924SAndrew Rist 
22*f6e50924SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_svx.hxx"
26cdf0e10cSrcweir #include <svx/dialmgr.hxx>
27cdf0e10cSrcweir #ifndef _SVX_DIALOGS_HRC
28cdf0e10cSrcweir #include <svx/dialogs.hrc>
29cdf0e10cSrcweir #endif
30cdf0e10cSrcweir #include <tools/shl.hxx>
31cdf0e10cSrcweir #include <i18npool/mslangid.hxx>
32cdf0e10cSrcweir #include <svtools/valueset.hxx>
33cdf0e10cSrcweir #include <svl/languageoptions.hxx>
34cdf0e10cSrcweir #ifndef _SVX_HELPID_HRC
35cdf0e10cSrcweir #include <helpid.hrc>
36cdf0e10cSrcweir #endif
37cdf0e10cSrcweir #include <editeng/numitem.hxx>
38cdf0e10cSrcweir #include <svl/eitem.hxx>
39cdf0e10cSrcweir #include <vcl/svapp.hxx>
40cdf0e10cSrcweir #include <svx/gallery.hxx>
41cdf0e10cSrcweir #include <svl/urihelper.hxx>
42cdf0e10cSrcweir #include <editeng/brshitem.hxx>
43cdf0e10cSrcweir #include <svl/intitem.hxx>
44cdf0e10cSrcweir #include <sfx2/objsh.hxx>
45cdf0e10cSrcweir #include <vcl/graph.hxx>
46cdf0e10cSrcweir #include <vcl/msgbox.hxx>
47cdf0e10cSrcweir #include <editeng/flstitem.hxx>
48cdf0e10cSrcweir #include <svx/dlgutil.hxx>
49cdf0e10cSrcweir #ifndef _XTABLE_HXX //autogen
50cdf0e10cSrcweir 
51cdf0e10cSrcweir #include <svx/xtable.hxx>
52cdf0e10cSrcweir #endif
53cdf0e10cSrcweir #include <svx/drawitem.hxx>
54cdf0e10cSrcweir #include <svx/numvset.hxx>
55cdf0e10cSrcweir #include <svx/htmlmode.hxx>
56cdf0e10cSrcweir #include <unotools/pathoptions.hxx>
57cdf0e10cSrcweir #include <svtools/ctrltool.hxx>
58cdf0e10cSrcweir #include <editeng/unolingu.hxx>
59cdf0e10cSrcweir #include <com/sun/star/style/NumberingType.hpp>
60cdf0e10cSrcweir #include <com/sun/star/lang/XMultiServiceFactory.hpp>
61cdf0e10cSrcweir #include <com/sun/star/container/XIndexAccess.hpp>
62cdf0e10cSrcweir #include <com/sun/star/text/XDefaultNumberingProvider.hpp>
63cdf0e10cSrcweir #include <com/sun/star/text/XNumberingFormatter.hpp>
64cdf0e10cSrcweir #include <com/sun/star/beans/PropertyValue.hpp>
65cdf0e10cSrcweir #include <comphelper/processfactory.hxx>
66cdf0e10cSrcweir #include <com/sun/star/text/XNumberingTypeInfo.hpp>
67cdf0e10cSrcweir 
68cdf0e10cSrcweir #include <algorithm>
69cdf0e10cSrcweir #include <sfx2/opengrf.hxx>
70cdf0e10cSrcweir 
71cdf0e10cSrcweir using namespace com::sun::star::uno;
72cdf0e10cSrcweir using namespace com::sun::star::beans;
73cdf0e10cSrcweir using namespace com::sun::star::lang;
74cdf0e10cSrcweir using namespace com::sun::star::i18n;
75cdf0e10cSrcweir using namespace com::sun::star::text;
76cdf0e10cSrcweir using namespace com::sun::star::container;
77cdf0e10cSrcweir using namespace com::sun::star::style;
78cdf0e10cSrcweir using rtl::OUString;
79cdf0e10cSrcweir 
80cdf0e10cSrcweir #define C2U(cChar) OUString::createFromAscii(cChar)
81cdf0e10cSrcweir #define NUM_PAGETYPE_BULLET			0
82cdf0e10cSrcweir #define NUM_PAGETYPE_SINGLENUM      1
83cdf0e10cSrcweir #define NUM_PAGETYPE_NUM            2
84cdf0e10cSrcweir #define NUM_PAGETYPE_BMP            3
85cdf0e10cSrcweir #define PAGETYPE_USER_START         10
86cdf0e10cSrcweir 
87cdf0e10cSrcweir #define SHOW_NUMBERING				0
88cdf0e10cSrcweir #define SHOW_BULLET					1
89cdf0e10cSrcweir #define SHOW_BITMAP					2
90cdf0e10cSrcweir 
91cdf0e10cSrcweir #define MAX_BMP_WIDTH				16
92cdf0e10cSrcweir #define MAX_BMP_HEIGHT				16
93cdf0e10cSrcweir 
94cdf0e10cSrcweir static const sal_Char cNumberingType[] = "NumberingType";
95cdf0e10cSrcweir static const sal_Char cValue[] = "Value";
96cdf0e10cSrcweir static const sal_Char cParentNumbering[] = "ParentNumbering";
97cdf0e10cSrcweir static const sal_Char cPrefix[] = "Prefix";
98cdf0e10cSrcweir static const sal_Char cSuffix[] = "Suffix";
99cdf0e10cSrcweir static const sal_Char cBulletChar[] = "BulletChar";
100cdf0e10cSrcweir static const sal_Char cBulletFontName[] = "BulletFontName";
101cdf0e10cSrcweir 
102cdf0e10cSrcweir /* -----------------28.10.98 08:32-------------------
103cdf0e10cSrcweir  *
104cdf0e10cSrcweir  * --------------------------------------------------*/
105cdf0e10cSrcweir // Die Auswahl an Bullets aus den StarSymbol
106cdf0e10cSrcweir static const sal_Unicode aBulletTypes[] =
107cdf0e10cSrcweir {
108cdf0e10cSrcweir 	0x2022,
109cdf0e10cSrcweir 	0x25cf,
110cdf0e10cSrcweir 	0xe00c,
111cdf0e10cSrcweir 	0xe00a,
112cdf0e10cSrcweir 	0x2794,
113cdf0e10cSrcweir 	0x27a2,
114cdf0e10cSrcweir 	0x2717,
115cdf0e10cSrcweir 	0x2714
116cdf0e10cSrcweir };
117cdf0e10cSrcweir 
lcl_GetDefaultBulletFont()118cdf0e10cSrcweir static Font& lcl_GetDefaultBulletFont()
119cdf0e10cSrcweir {
120cdf0e10cSrcweir 	static sal_Bool bInit = 0;
121cdf0e10cSrcweir 	static Font aDefBulletFont( UniString::CreateFromAscii(
122cdf0e10cSrcweir 		                        RTL_CONSTASCII_STRINGPARAM( "StarSymbol" ) ),
123cdf0e10cSrcweir 								String(), Size( 0, 14 ) );
124cdf0e10cSrcweir 	if(!bInit)
125cdf0e10cSrcweir 	{
126cdf0e10cSrcweir         aDefBulletFont.SetCharSet( RTL_TEXTENCODING_SYMBOL );
127cdf0e10cSrcweir 		aDefBulletFont.SetFamily( FAMILY_DONTKNOW );
128cdf0e10cSrcweir 		aDefBulletFont.SetPitch( PITCH_DONTKNOW );
129cdf0e10cSrcweir 		aDefBulletFont.SetWeight( WEIGHT_DONTKNOW );
130cdf0e10cSrcweir 		aDefBulletFont.SetTransparent( sal_True );
131cdf0e10cSrcweir 		bInit = sal_True;
132cdf0e10cSrcweir 	}
133cdf0e10cSrcweir 	return aDefBulletFont;
134cdf0e10cSrcweir }
135cdf0e10cSrcweir 
lcl_PaintLevel(OutputDevice * pVDev,sal_Int16 nNumberingType,const OUString & rBulletChar,const OUString & rText,const OUString & rFontName,Point & rLeft,Font & rRuleFont,const Font & rTextFont)136cdf0e10cSrcweir static void lcl_PaintLevel(OutputDevice* pVDev, sal_Int16 nNumberingType,
137cdf0e10cSrcweir                         const OUString& rBulletChar, const OUString& rText, const OUString& rFontName,
138cdf0e10cSrcweir                         Point& rLeft, Font& rRuleFont, const Font& rTextFont)
139cdf0e10cSrcweir {
140cdf0e10cSrcweir 
141cdf0e10cSrcweir     if(NumberingType::CHAR_SPECIAL == nNumberingType )
142cdf0e10cSrcweir     {
143cdf0e10cSrcweir         rRuleFont.SetStyleName(rFontName);
144cdf0e10cSrcweir         pVDev->SetFont(rRuleFont);
145cdf0e10cSrcweir         pVDev->DrawText(rLeft, rBulletChar);
146cdf0e10cSrcweir         rLeft.X() += pVDev->GetTextWidth(rBulletChar);
147cdf0e10cSrcweir     }
148cdf0e10cSrcweir     else
149cdf0e10cSrcweir     {
150cdf0e10cSrcweir         pVDev->SetFont(rTextFont);
151cdf0e10cSrcweir         pVDev->DrawText(rLeft, rText);
152cdf0e10cSrcweir         rLeft.X() += pVDev->GetTextWidth(rText);
153cdf0e10cSrcweir     }
154cdf0e10cSrcweir }
UserDraw(const UserDrawEvent & rUDEvt)155cdf0e10cSrcweir void  SvxNumValueSet::UserDraw( const UserDrawEvent& rUDEvt )
156cdf0e10cSrcweir {
157cdf0e10cSrcweir 	static sal_uInt16 __READONLY_DATA aLinesArr[] =
158cdf0e10cSrcweir 	{
159cdf0e10cSrcweir 		15, 10,
160cdf0e10cSrcweir 		20, 30,
161cdf0e10cSrcweir 		25, 50,
162cdf0e10cSrcweir 		30, 70,
163cdf0e10cSrcweir 		35, 90,	// up to here line positions
164cdf0e10cSrcweir         05, 10, // character positions
165cdf0e10cSrcweir         10, 30,
166cdf0e10cSrcweir         15, 50,
167cdf0e10cSrcweir         20, 70,
168cdf0e10cSrcweir         25, 90,
169cdf0e10cSrcweir 	};
170cdf0e10cSrcweir 
171cdf0e10cSrcweir     const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
172cdf0e10cSrcweir     const Color aBackColor = rStyleSettings.GetFieldColor();
173cdf0e10cSrcweir     const Color aTextColor = rStyleSettings.GetFieldTextColor();
174cdf0e10cSrcweir 
175cdf0e10cSrcweir     OutputDevice*  pDev = rUDEvt.GetDevice();
176cdf0e10cSrcweir 	Rectangle aRect = rUDEvt.GetRect();
177cdf0e10cSrcweir 	sal_uInt16	nItemId = rUDEvt.GetItemId();
178cdf0e10cSrcweir 	long nRectWidth = aRect.GetWidth();
179cdf0e10cSrcweir 	long nRectHeight = aRect.GetHeight();
180cdf0e10cSrcweir 	Size aRectSize(nRectWidth, aRect.GetHeight());
181cdf0e10cSrcweir 	Point aBLPos = aRect.TopLeft();
182cdf0e10cSrcweir 	Font aOldFont = pDev->GetFont();
183cdf0e10cSrcweir 	Color aOldColor = pDev->GetLineColor();
184cdf0e10cSrcweir     pDev->SetLineColor(aTextColor);
185cdf0e10cSrcweir     Font aFont(OutputDevice::GetDefaultFont(
186cdf0e10cSrcweir                 DEFAULTFONT_UI_SANS, MsLangId::getSystemLanguage(), DEFAULTFONT_FLAGS_ONLYONE));
187cdf0e10cSrcweir 
188cdf0e10cSrcweir     Size aSize = aFont.GetSize();
189cdf0e10cSrcweir 
190cdf0e10cSrcweir 	Font aRuleFont( lcl_GetDefaultBulletFont() );
191cdf0e10cSrcweir 	aSize.Height() = nRectHeight/6;
192cdf0e10cSrcweir 	aRuleFont.SetSize(aSize);
193cdf0e10cSrcweir     aRuleFont.SetColor(aTextColor);
194cdf0e10cSrcweir     aRuleFont.SetFillColor(aBackColor);
195cdf0e10cSrcweir 	if(nPageType == NUM_PAGETYPE_BULLET)
196cdf0e10cSrcweir 		aFont = aRuleFont;
197cdf0e10cSrcweir 	else if(nPageType == NUM_PAGETYPE_NUM)
198cdf0e10cSrcweir 	{
199cdf0e10cSrcweir 		aSize.Height() = nRectHeight/8;
200cdf0e10cSrcweir 	}
201cdf0e10cSrcweir 	aFont.SetColor(aTextColor);
202cdf0e10cSrcweir 	aFont.SetFillColor(aBackColor);
203cdf0e10cSrcweir 	aFont.SetSize( aSize );
204cdf0e10cSrcweir 	pDev->SetFont(aFont);
205cdf0e10cSrcweir 
206cdf0e10cSrcweir 	if(!pVDev)
207cdf0e10cSrcweir 	{
208cdf0e10cSrcweir 		// Die Linien werden nur einmalig in das VirtualDevice gepainted
209cdf0e10cSrcweir 		// nur die Gliederungspage bekommt es aktuell
210cdf0e10cSrcweir 		pVDev = new VirtualDevice(*pDev);
211cdf0e10cSrcweir 		pVDev->SetMapMode(pDev->GetMapMode());
212cdf0e10cSrcweir 		pVDev->EnableRTL( IsRTLEnabled() );
213cdf0e10cSrcweir  		pVDev->SetOutputSize( aRectSize );
214cdf0e10cSrcweir 		aOrgRect = aRect;
215cdf0e10cSrcweir 		pVDev->SetFillColor( aBackColor );
216cdf0e10cSrcweir 		pVDev->DrawRect(aOrgRect);
217cdf0e10cSrcweir 
218cdf0e10cSrcweir         if(aBackColor == aLineColor)
219cdf0e10cSrcweir             aLineColor.Invert();
220cdf0e10cSrcweir         pVDev->SetLineColor(aLineColor);
221cdf0e10cSrcweir 		// Linien nur einmalig Zeichnen
222cdf0e10cSrcweir 		if(nPageType != NUM_PAGETYPE_NUM)
223cdf0e10cSrcweir 		{
224cdf0e10cSrcweir 			Point aStart(aBLPos.X() + nRectWidth *25 / 100,0);
225cdf0e10cSrcweir 			Point aEnd(aBLPos.X() + nRectWidth * 9 / 10,0);
226cdf0e10cSrcweir 			for( sal_uInt16 i = 11; i < 100; i += 33)
227cdf0e10cSrcweir 			{
228cdf0e10cSrcweir 				aStart.Y() = aEnd.Y() = aBLPos.Y() + nRectHeight  * i / 100;
229cdf0e10cSrcweir 				pVDev->DrawLine(aStart, aEnd);
230cdf0e10cSrcweir 				aStart.Y() = aEnd.Y() = aBLPos.Y() + nRectHeight  * (i + 11) / 100;
231cdf0e10cSrcweir 				pVDev->DrawLine(aStart, aEnd);
232cdf0e10cSrcweir 			}
233cdf0e10cSrcweir 		}
234cdf0e10cSrcweir 	}
235cdf0e10cSrcweir 	pDev->DrawOutDev(	aRect.TopLeft(), aRectSize,
236cdf0e10cSrcweir 						aOrgRect.TopLeft(), aRectSize,
237cdf0e10cSrcweir 						*pVDev );
238cdf0e10cSrcweir 	// jetzt kommt der Text
239cdf0e10cSrcweir 	const OUString sValue(C2U(cValue));
240cdf0e10cSrcweir     if( NUM_PAGETYPE_SINGLENUM == nPageType ||
241cdf0e10cSrcweir 			NUM_PAGETYPE_BULLET == nPageType )
242cdf0e10cSrcweir 	{
243cdf0e10cSrcweir 		Point aStart(aBLPos.X() + nRectWidth / 9,0);
244cdf0e10cSrcweir 		for( sal_uInt16 i = 0; i < 3; i++ )
245cdf0e10cSrcweir 		{
246cdf0e10cSrcweir 			sal_uInt16 nY = 11 + i * 33;
247cdf0e10cSrcweir 			aStart.Y() = aBLPos.Y() + nRectHeight  * nY / 100;
248cdf0e10cSrcweir 			String sText;
249cdf0e10cSrcweir 			if(nPageType == NUM_PAGETYPE_BULLET)
250cdf0e10cSrcweir 			{
251cdf0e10cSrcweir 				sText = aBulletTypes[nItemId - 1];
252cdf0e10cSrcweir 				aStart.Y() -= pDev->GetTextHeight()/2;
253cdf0e10cSrcweir 				aStart.X() = aBLPos.X() + 5;
254cdf0e10cSrcweir 			}
255cdf0e10cSrcweir 			else
256cdf0e10cSrcweir 			{
257cdf0e10cSrcweir 				if(xFormatter.is() && aNumSettings.getLength() > nItemId - 1)
258cdf0e10cSrcweir 				{
259cdf0e10cSrcweir 					Sequence<PropertyValue> aLevel = aNumSettings.getConstArray()[nItemId - 1];
260cdf0e10cSrcweir 					try
261cdf0e10cSrcweir 					{
262cdf0e10cSrcweir 						aLevel.realloc(aLevel.getLength() + 1);
263cdf0e10cSrcweir 						PropertyValue& rValue = aLevel.getArray()[aLevel.getLength() - 1];
264cdf0e10cSrcweir 						rValue.Name = sValue;
265cdf0e10cSrcweir 						rValue.Value <<= (sal_Int32)(i + 1);
266cdf0e10cSrcweir 						sText = xFormatter->makeNumberingString( aLevel, aLocale );
267cdf0e10cSrcweir 					}
268cdf0e10cSrcweir 					catch(Exception&)
269cdf0e10cSrcweir 					{
270cdf0e10cSrcweir 						DBG_ERROR("Exception in DefaultNumberingProvider::makeNumberingString");
271cdf0e10cSrcweir 					}
272cdf0e10cSrcweir 				}
273cdf0e10cSrcweir 				// knapp neben dem linken Rand beginnen
274cdf0e10cSrcweir 				aStart.X() = aBLPos.X() + 2;
275cdf0e10cSrcweir 				aStart.Y() -= pDev->GetTextHeight()/2;
276cdf0e10cSrcweir 			}
277cdf0e10cSrcweir 			pDev->DrawText(aStart, sText);
278cdf0e10cSrcweir 		}
279cdf0e10cSrcweir 	}
280cdf0e10cSrcweir 	else if(NUM_PAGETYPE_NUM == nPageType )
281cdf0e10cSrcweir 	{
282cdf0e10cSrcweir 		// Outline numbering has to be painted into the virtual device
283cdf0e10cSrcweir 		// to get correct lines
284cdf0e10cSrcweir 		// has to be made again
285cdf0e10cSrcweir 		pVDev->DrawRect(aOrgRect);
286cdf0e10cSrcweir         long nStartX = aOrgRect.TopLeft().X();
287cdf0e10cSrcweir 		long nStartY = aOrgRect.TopLeft().Y();
288cdf0e10cSrcweir 
289cdf0e10cSrcweir 		if(xFormatter.is() && aOutlineSettings.getLength() > nItemId - 1)
290cdf0e10cSrcweir 		{
291cdf0e10cSrcweir 			Reference<XIndexAccess> xLevel = aOutlineSettings.getArray()[nItemId - 1];
292cdf0e10cSrcweir 			try
293cdf0e10cSrcweir 			{
294cdf0e10cSrcweir                 OUString sLevelTexts[5];
295cdf0e10cSrcweir                 OUString sFontNames[5];
296cdf0e10cSrcweir                 OUString sBulletChars[5];
297cdf0e10cSrcweir                 sal_Int16 aNumberingTypes[5];
298cdf0e10cSrcweir                 OUString sPrefixes[5];
299cdf0e10cSrcweir                 OUString sSuffixes[5];
300cdf0e10cSrcweir                 sal_Int16 aParentNumberings[5];
301cdf0e10cSrcweir 
302cdf0e10cSrcweir                 sal_Int32 nLevelCount = xLevel->getCount();
303cdf0e10cSrcweir                 if(nLevelCount > 5)
304cdf0e10cSrcweir                     nLevelCount = 5;
305cdf0e10cSrcweir                 for( sal_Int32 i = 0; i < nLevelCount && i < 5; i++)
306cdf0e10cSrcweir 				{
307cdf0e10cSrcweir                     long nTop = nStartY + nRectHeight * (aLinesArr[2 * i + 11])/100 ;
308cdf0e10cSrcweir 					Point aLeft(nStartX + nRectWidth *  (aLinesArr[2 * i + 10])/ 100, nTop );
309cdf0e10cSrcweir 
310cdf0e10cSrcweir                     Any aLevelAny = xLevel->getByIndex(i);
311cdf0e10cSrcweir 					Sequence<PropertyValue> aLevel;
312cdf0e10cSrcweir 					aLevelAny >>= aLevel;
313cdf0e10cSrcweir                     const PropertyValue* pValues = aLevel.getConstArray();
314cdf0e10cSrcweir                     aNumberingTypes[i] = 0;
315cdf0e10cSrcweir                     for(sal_Int32 nProperty = 0; nProperty < aLevel.getLength() - 1; nProperty++)
316cdf0e10cSrcweir                     {
317cdf0e10cSrcweir                         if(pValues[nProperty].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(cNumberingType)))
318cdf0e10cSrcweir                             pValues[nProperty].Value >>= aNumberingTypes[i];
319cdf0e10cSrcweir                         else if(pValues[nProperty].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(cBulletFontName)))
320cdf0e10cSrcweir                             pValues[nProperty].Value >>= sFontNames[i];
321cdf0e10cSrcweir                         else if(pValues[nProperty].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(cBulletChar)))
322cdf0e10cSrcweir                             pValues[nProperty].Value >>= sBulletChars[i];
323cdf0e10cSrcweir                         else if(pValues[nProperty].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(cPrefix)))
324cdf0e10cSrcweir                             pValues[nProperty].Value >>= sPrefixes[i];
325cdf0e10cSrcweir                         else if(pValues[nProperty].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(cSuffix)))
326cdf0e10cSrcweir                             pValues[nProperty].Value >>= sSuffixes[i];
327cdf0e10cSrcweir                         else if(pValues[nProperty].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(cParentNumbering)))
328cdf0e10cSrcweir                             pValues[nProperty].Value >>= aParentNumberings[i];
329cdf0e10cSrcweir                     }
330cdf0e10cSrcweir                     Sequence< PropertyValue > aProperties(2);
331cdf0e10cSrcweir                     PropertyValue* pProperties = aProperties.getArray();
332cdf0e10cSrcweir                     pProperties[0].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("NumberingType"));
333cdf0e10cSrcweir                     pProperties[0].Value <<= aNumberingTypes[i];
334cdf0e10cSrcweir                     pProperties[1].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Value"));
335cdf0e10cSrcweir                     pProperties[1].Value <<= (sal_Int32)1;
336cdf0e10cSrcweir                     try
337cdf0e10cSrcweir 					{
338cdf0e10cSrcweir                         sLevelTexts[i] = xFormatter->makeNumberingString( aProperties, aLocale );
339cdf0e10cSrcweir 					}
340cdf0e10cSrcweir 					catch(Exception&)
341cdf0e10cSrcweir 					{
342cdf0e10cSrcweir 						DBG_ERROR("Exception in DefaultNumberingProvider::makeNumberingString");
343cdf0e10cSrcweir 					}
344cdf0e10cSrcweir 
345cdf0e10cSrcweir                     aLeft.Y() -= (pDev->GetTextHeight()/2);
346cdf0e10cSrcweir                     if(sPrefixes[i].getLength() &&
347cdf0e10cSrcweir                         !sPrefixes[i].equalsAsciiL(" ", 1) &&
348cdf0e10cSrcweir                         sPrefixes[i].getStr()[0] != 0)
349cdf0e10cSrcweir                     {
350cdf0e10cSrcweir                         pVDev->SetFont(aFont);
351cdf0e10cSrcweir                         pVDev->DrawText(aLeft, sPrefixes[i]);
352cdf0e10cSrcweir                         aLeft.X() += pDev->GetTextWidth(sPrefixes[i]);
353cdf0e10cSrcweir                     }
354cdf0e10cSrcweir                     if(aParentNumberings[i])
355cdf0e10cSrcweir                     {
356cdf0e10cSrcweir                         //insert old numberings here
357cdf0e10cSrcweir                         sal_Int32 nStartLevel = std::min((sal_Int32)aParentNumberings[i], i);
358cdf0e10cSrcweir                         for(sal_Int32 nParentLevel = i - nStartLevel; nParentLevel < i; nParentLevel++)
359cdf0e10cSrcweir                         {
360cdf0e10cSrcweir                             OUString sTmp(sLevelTexts[nParentLevel]);
361cdf0e10cSrcweir                             sTmp += C2U(".");
362cdf0e10cSrcweir                             lcl_PaintLevel(pVDev,
363cdf0e10cSrcweir                                     aNumberingTypes[nParentLevel],
364cdf0e10cSrcweir                                     sBulletChars[nParentLevel],
365cdf0e10cSrcweir                                     sTmp,
366cdf0e10cSrcweir                                     sFontNames[nParentLevel],
367cdf0e10cSrcweir                                     aLeft,
368cdf0e10cSrcweir                                     aRuleFont,
369cdf0e10cSrcweir                                     aFont);
370cdf0e10cSrcweir                         }
371cdf0e10cSrcweir                     }
372cdf0e10cSrcweir                     lcl_PaintLevel(pVDev,
373cdf0e10cSrcweir                                     aNumberingTypes[i],
374cdf0e10cSrcweir                                     sBulletChars[i],
375cdf0e10cSrcweir                                     sLevelTexts[i],
376cdf0e10cSrcweir                                     sFontNames[i],
377cdf0e10cSrcweir                                     aLeft,
378cdf0e10cSrcweir                                     aRuleFont,
379cdf0e10cSrcweir                                     aFont);
380cdf0e10cSrcweir                     if(sSuffixes[i].getLength()&&
381cdf0e10cSrcweir                         !sSuffixes[i].equalsAsciiL(" ", 1) &&
382cdf0e10cSrcweir                         sSuffixes[i].getStr()[0] != 0)
383cdf0e10cSrcweir                     {
384cdf0e10cSrcweir                         pVDev->SetFont(aFont);
385cdf0e10cSrcweir                         pVDev->DrawText(aLeft, sSuffixes[i]);
386cdf0e10cSrcweir                         aLeft.X() += pDev->GetTextWidth(sSuffixes[i]);
387cdf0e10cSrcweir                     }
388cdf0e10cSrcweir 
389cdf0e10cSrcweir 					long nLineTop = nStartY + nRectHeight * aLinesArr[2 * i + 1]/100 ;
390cdf0e10cSrcweir                     Point aLineLeft(aLeft.X() /*+ nStartX + nRectWidth * aLinesArr[2 * i]/ 100*/, nLineTop );
391cdf0e10cSrcweir 					Point aLineRight(nStartX + nRectWidth * 90 /100, nLineTop );
392cdf0e10cSrcweir 					pVDev->DrawLine(aLineLeft,	aLineRight);
393cdf0e10cSrcweir                 }
394cdf0e10cSrcweir 
395cdf0e10cSrcweir             }
396cdf0e10cSrcweir #ifdef DBG_UTIL
397cdf0e10cSrcweir 			catch(Exception&)
398cdf0e10cSrcweir 			{
399cdf0e10cSrcweir 				static sal_Bool bAssert = sal_False;
400cdf0e10cSrcweir 				if(!bAssert)
401cdf0e10cSrcweir 				{
402cdf0e10cSrcweir 					DBG_ERROR("exception in ::UserDraw");
403cdf0e10cSrcweir 					bAssert = sal_True;
404cdf0e10cSrcweir 				}
405cdf0e10cSrcweir 			}
406cdf0e10cSrcweir #else
407cdf0e10cSrcweir 			catch(Exception&)
408cdf0e10cSrcweir 			{
409cdf0e10cSrcweir 			}
410cdf0e10cSrcweir #endif
411cdf0e10cSrcweir 		}
412cdf0e10cSrcweir 		pDev->DrawOutDev(	aRect.TopLeft(), aRectSize,
413cdf0e10cSrcweir 							aOrgRect.TopLeft(), aRectSize,
414cdf0e10cSrcweir 							*pVDev );
415cdf0e10cSrcweir 	}
416cdf0e10cSrcweir 
417cdf0e10cSrcweir 	pDev->SetFont(aOldFont);
418cdf0e10cSrcweir 	pDev->SetLineColor(aOldColor);
419cdf0e10cSrcweir }
420cdf0e10cSrcweir 
421cdf0e10cSrcweir /**************************************************************************/
422cdf0e10cSrcweir /*                                                                        */
423cdf0e10cSrcweir /*                                                                        */
424cdf0e10cSrcweir /**************************************************************************/
425cdf0e10cSrcweir 
SvxNumValueSet(Window * pParent,const ResId & rResId,sal_uInt16 nType)426cdf0e10cSrcweir SvxNumValueSet::SvxNumValueSet( Window* pParent, const ResId& rResId, sal_uInt16 nType ) :
427cdf0e10cSrcweir 
428cdf0e10cSrcweir 	ValueSet( pParent, rResId ),
429cdf0e10cSrcweir 
430cdf0e10cSrcweir     aLineColor  ( COL_LIGHTGRAY ),
431cdf0e10cSrcweir     nPageType   ( nType ),
432cdf0e10cSrcweir     bHTMLMode   ( sal_False ),
433cdf0e10cSrcweir     pVDev       ( NULL )
434cdf0e10cSrcweir {
435cdf0e10cSrcweir 	SetColCount( 4 );
436cdf0e10cSrcweir     SetLineCount( 2 );
437cdf0e10cSrcweir 	SetStyle( GetStyle() | WB_ITEMBORDER | WB_DOUBLEBORDER );
438cdf0e10cSrcweir 	if(NUM_PAGETYPE_BULLET == nType)
439cdf0e10cSrcweir 	{
440cdf0e10cSrcweir 		for	( sal_uInt16 i = 0; i < 8; i++ )
441cdf0e10cSrcweir         {
442cdf0e10cSrcweir 			InsertItem( i + 1, i );
443cdf0e10cSrcweir             SetItemText( i + 1, SVX_RESSTR( RID_SVXSTR_BULLET_DESCRIPTIONS + i ) );
444cdf0e10cSrcweir         }
445cdf0e10cSrcweir 	}
446cdf0e10cSrcweir }
447cdf0e10cSrcweir 
448cdf0e10cSrcweir /*-----------------08.02.97 12.38-------------------
449cdf0e10cSrcweir 
450cdf0e10cSrcweir --------------------------------------------------*/
451cdf0e10cSrcweir 
~SvxNumValueSet()452cdf0e10cSrcweir  SvxNumValueSet::~SvxNumValueSet()
453cdf0e10cSrcweir {
454cdf0e10cSrcweir 	delete pVDev;
455cdf0e10cSrcweir }
456cdf0e10cSrcweir /* -----------------------------30.01.01 16:24--------------------------------
457cdf0e10cSrcweir 
458cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
SetNumberingSettings(const Sequence<Sequence<PropertyValue>> & aNum,Reference<XNumberingFormatter> & xFormat,const Locale & rLocale)459cdf0e10cSrcweir void SvxNumValueSet::SetNumberingSettings(
460cdf0e10cSrcweir 	const Sequence<Sequence<PropertyValue> >& aNum,
461cdf0e10cSrcweir 	Reference<XNumberingFormatter>& xFormat,
462cdf0e10cSrcweir 	const Locale& rLocale	)
463cdf0e10cSrcweir {
464cdf0e10cSrcweir 	aNumSettings = aNum;
465cdf0e10cSrcweir 	xFormatter = xFormat;
466cdf0e10cSrcweir 	aLocale = rLocale;
467cdf0e10cSrcweir     if(aNum.getLength() > 8)
468cdf0e10cSrcweir             SetStyle( GetStyle()|WB_VSCROLL);
469cdf0e10cSrcweir     for ( sal_uInt16 i = 0; i < aNum.getLength(); i++ )
470cdf0e10cSrcweir     {
471cdf0e10cSrcweir 			InsertItem( i + 1, i );
472cdf0e10cSrcweir             if( i < 8 )
473cdf0e10cSrcweir                 SetItemText( i + 1, SVX_RESSTR( RID_SVXSTR_SINGLENUM_DESCRIPTIONS + i ));
474cdf0e10cSrcweir     }
475cdf0e10cSrcweir }
476cdf0e10cSrcweir /* -----------------------------31.01.01 09:50--------------------------------
477cdf0e10cSrcweir 
478cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
SetOutlineNumberingSettings(Sequence<Reference<XIndexAccess>> & rOutline,Reference<XNumberingFormatter> & xFormat,const Locale & rLocale)479cdf0e10cSrcweir void SvxNumValueSet::SetOutlineNumberingSettings(
480cdf0e10cSrcweir 			Sequence<Reference<XIndexAccess> >& rOutline,
481cdf0e10cSrcweir 			Reference<XNumberingFormatter>& xFormat,
482cdf0e10cSrcweir 			const Locale& rLocale)
483cdf0e10cSrcweir {
484cdf0e10cSrcweir 	aOutlineSettings = rOutline;
485cdf0e10cSrcweir 	xFormatter = xFormat;
486cdf0e10cSrcweir 	aLocale = rLocale;
487cdf0e10cSrcweir     if(aOutlineSettings.getLength() > 8)
488cdf0e10cSrcweir         SetStyle( GetStyle() | WB_VSCROLL );
489cdf0e10cSrcweir     for ( sal_uInt16 i = 0; i < aOutlineSettings.getLength(); i++ )
490cdf0e10cSrcweir     {
491cdf0e10cSrcweir 		InsertItem( i + 1, i );
492cdf0e10cSrcweir         if( i < 8 )
493cdf0e10cSrcweir             SetItemText( i + 1, SVX_RESSTR( RID_SVXSTR_OUTLINENUM_DESCRIPTIONS + i ));
494cdf0e10cSrcweir     }
495cdf0e10cSrcweir }
496cdf0e10cSrcweir 
SvxBmpNumValueSet(Window * pParent,const ResId & rResId)497cdf0e10cSrcweir SvxBmpNumValueSet::SvxBmpNumValueSet( Window* pParent, const ResId& rResId/*, const List& rStrNames*/ ) :
498cdf0e10cSrcweir 
499cdf0e10cSrcweir 	SvxNumValueSet( pParent, rResId, NUM_PAGETYPE_BMP ),
500cdf0e10cSrcweir //    rStrList    ( rStrNames ),
501cdf0e10cSrcweir 	bGrfNotFound( sal_False )
502cdf0e10cSrcweir 
503cdf0e10cSrcweir {
504cdf0e10cSrcweir     GalleryExplorer::BeginLocking(GALLERY_THEME_BULLETS);
505cdf0e10cSrcweir     SetStyle( GetStyle() | WB_VSCROLL );
506cdf0e10cSrcweir 	SetLineCount( 3 );
507cdf0e10cSrcweir 	aFormatTimer.SetTimeout(300);
508cdf0e10cSrcweir 	aFormatTimer.SetTimeoutHdl(LINK(this, SvxBmpNumValueSet, FormatHdl_Impl));
509cdf0e10cSrcweir }
510cdf0e10cSrcweir 
511cdf0e10cSrcweir /*-----------------13.02.97 09.41-------------------
512cdf0e10cSrcweir 
513cdf0e10cSrcweir --------------------------------------------------*/
514cdf0e10cSrcweir 
~SvxBmpNumValueSet()515cdf0e10cSrcweir  SvxBmpNumValueSet::~SvxBmpNumValueSet()
516cdf0e10cSrcweir {
517cdf0e10cSrcweir     GalleryExplorer::EndLocking(GALLERY_THEME_BULLETS);
518cdf0e10cSrcweir     aFormatTimer.Stop();
519cdf0e10cSrcweir }
520cdf0e10cSrcweir /*-----------------13.02.97 09.41-------------------
521cdf0e10cSrcweir 
522cdf0e10cSrcweir --------------------------------------------------*/
523cdf0e10cSrcweir 
UserDraw(const UserDrawEvent & rUDEvt)524cdf0e10cSrcweir void   	SvxBmpNumValueSet::UserDraw( const UserDrawEvent& rUDEvt )
525cdf0e10cSrcweir {
526cdf0e10cSrcweir 	SvxNumValueSet::UserDraw(rUDEvt);
527cdf0e10cSrcweir 
528cdf0e10cSrcweir 	Rectangle aRect = rUDEvt.GetRect();
529cdf0e10cSrcweir 	OutputDevice*  pDev = rUDEvt.GetDevice();
530cdf0e10cSrcweir 	sal_uInt16	nItemId = rUDEvt.GetItemId();
531cdf0e10cSrcweir 	Point aBLPos = aRect.TopLeft();
532cdf0e10cSrcweir 
533cdf0e10cSrcweir 	int nRectHeight = aRect.GetHeight();
534cdf0e10cSrcweir 	Size aSize(nRectHeight/8, nRectHeight/8);
535cdf0e10cSrcweir 
536cdf0e10cSrcweir     Graphic aGraphic;
537cdf0e10cSrcweir     if(!GalleryExplorer::GetGraphicObj( GALLERY_THEME_BULLETS, nItemId - 1,
538cdf0e10cSrcweir                         &aGraphic, NULL))
539cdf0e10cSrcweir     {
540cdf0e10cSrcweir         bGrfNotFound = sal_True;
541cdf0e10cSrcweir     }
542cdf0e10cSrcweir     else
543cdf0e10cSrcweir     {
544cdf0e10cSrcweir         Point aPos(aBLPos.X() + 5, 0);
545cdf0e10cSrcweir         for( sal_uInt16 i = 0; i < 3; i++ )
546cdf0e10cSrcweir         {
547cdf0e10cSrcweir             sal_uInt16 nY = 11 + i * 33;
548cdf0e10cSrcweir             aPos.Y() = aBLPos.Y() + nRectHeight  * nY / 100;
549cdf0e10cSrcweir             aGraphic.Draw( pDev, aPos, aSize );
550cdf0e10cSrcweir         }
551cdf0e10cSrcweir     }
552cdf0e10cSrcweir }
553cdf0e10cSrcweir 
554cdf0e10cSrcweir /*-----------------14.02.97 07.34-------------------
555cdf0e10cSrcweir 
556cdf0e10cSrcweir --------------------------------------------------*/
557cdf0e10cSrcweir 
IMPL_LINK(SvxBmpNumValueSet,FormatHdl_Impl,Timer *,EMPTYARG)558cdf0e10cSrcweir IMPL_LINK(SvxBmpNumValueSet, FormatHdl_Impl, Timer*, EMPTYARG)
559cdf0e10cSrcweir {
560cdf0e10cSrcweir 	// nur, wenn eine Grafik nicht da war, muss formatiert werden
561cdf0e10cSrcweir 	if(bGrfNotFound)
562cdf0e10cSrcweir 	{
563cdf0e10cSrcweir 		bGrfNotFound = sal_False;
564cdf0e10cSrcweir 		Format();
565cdf0e10cSrcweir 	}
566cdf0e10cSrcweir 	Invalidate();
567cdf0e10cSrcweir 	return 0;
568cdf0e10cSrcweir }
569