xref: /trunk/main/svx/source/xoutdev/xtabcolr.cxx (revision 97e8a929)
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 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_svx.hxx"
26 
27 #ifndef SVX_LIGHT
28 
29 #include <com/sun/star/container/XNameContainer.hpp>
30 #include "svx/XPropertyTable.hxx"
31 #include <unotools/ucbstreamhelper.hxx>
32 
33 #include <unotools/pathoptions.hxx>
34 
35 #include "xmlxtexp.hxx"
36 #include "xmlxtimp.hxx"
37 
38 #endif
39 
40 #include <sfx2/docfile.hxx>
41 #include <tools/urlobj.hxx>
42 #include <svx/dialogs.hrc>
43 #include <svx/dialmgr.hxx>
44 #include <svx/xtable.hxx>
45 #include <svx/xpool.hxx>
46 
47 #define GLOBALOVERFLOW
48 
49 using namespace com::sun::star;
50 using namespace rtl;
51 
52 sal_Unicode const pszExtColor[]	 = {'s','o','c'};
53 
54 static char const aChckColor[]  = { 0x04, 0x00, 'S','O','C','L'};	// < 5.2
55 static char const aChckColor0[] = { 0x04, 0x00, 'S','O','C','0'};	// = 5.2
56 static char const aChckXML[]    = { '<', '?', 'x', 'm', 'l' };		// = 6.0
57 
58 /*************************************************************************
59 |*
60 |* XColorList::XColorList()
61 |*
62 *************************************************************************/
63 
64 static XColorList* pStaticGlobalColorList = 0;
65 
66 XColorList::XColorList( const String& rPath, XOutdevItemPool* pInPool ) :
67 				XPropertyList( rPath, pInPool )
68 {
69 }
70 
71 /************************************************************************/
72 
73 XColorList::~XColorList()
74 {
75 }
76 
77 /************************************************************************/
78 
79 XColorEntry* XColorList::Replace(XColorEntry* pEntry, long nIndex )
80 {
81 	return (XColorEntry*) XPropertyList::Replace(pEntry, nIndex);
82 }
83 
84 /************************************************************************/
85 
86 XColorEntry* XColorList::Remove(long nIndex)
87 {
88 	return (XColorEntry*) XPropertyList::Remove(nIndex, 0);
89 }
90 
91 /************************************************************************/
92 
93 XColorEntry* XColorList::GetColor(long nIndex) const
94 {
95 	return (XColorEntry*) XPropertyList::Get(nIndex, 0);
96 }
97 
98 /************************************************************************/
99 
100 sal_Bool XColorList::Load()
101 {
102 	if( mbListDirty )
103 	{
104 		mbListDirty = false;
105 
106 		INetURLObject aURL( maPath );
107 
108 		if( INET_PROT_NOT_VALID == aURL.GetProtocol() )
109 		{
110 			DBG_ASSERT( !maPath.Len(), "invalid URL" );
111 			return sal_False;
112 		}
113 
114 		aURL.Append( maName );
115 
116 		if( !aURL.getExtension().getLength() )
117 			aURL.setExtension( rtl::OUString( pszExtColor, 3 ) );
118 
119 		uno::Reference< container::XNameContainer > xTable( SvxUnoXColorTable_createInstance( this ), uno::UNO_QUERY );
120 		return SvxXMLXTableImport::load( aURL.GetMainURL( INetURLObject::NO_DECODE ), xTable );
121 	}
122 	return( sal_False );
123 }
124 
125 /************************************************************************/
126 
127 sal_Bool XColorList::Save()
128 {
129 	INetURLObject aURL( maPath );
130 
131 	if( INET_PROT_NOT_VALID == aURL.GetProtocol() )
132 	{
133 		DBG_ASSERT( !maPath.Len(), "invalid URL" );
134 		return sal_False;
135 	}
136 
137 	aURL.Append( maName );
138 
139 	if( !aURL.getExtension().getLength() )
140 		aURL.setExtension( rtl::OUString( pszExtColor, 3 ) );
141 
142 	uno::Reference< container::XNameContainer > xTable( SvxUnoXColorTable_createInstance( this ), uno::UNO_QUERY );
143 	return SvxXMLXTableExportComponent::save( aURL.GetMainURL( INetURLObject::NO_DECODE ), xTable );
144 }
145 
146 /************************************************************************/
147 
148 sal_Bool XColorList::Create()
149 {
150 	XubString aStr;
151 	xub_StrLen nLen;
152 	ResMgr& rRes = DIALOG_MGR();
153 
154 	static sal_uInt16 __READONLY_DATA aResId[] =
155 	{
156 		RID_SVXSTR_BLACK,
157 		RID_SVXSTR_BLUE,
158 		RID_SVXSTR_GREEN,
159 		RID_SVXSTR_CYAN,
160 		RID_SVXSTR_RED,
161 		RID_SVXSTR_MAGENTA,
162 		RID_SVXSTR_BROWN,
163 		RID_SVXSTR_GREY,
164 		RID_SVXSTR_LIGHTGREY,
165 		RID_SVXSTR_LIGHTBLUE,
166 		RID_SVXSTR_LIGHTGREEN,
167 		RID_SVXSTR_LIGHTCYAN,
168 		RID_SVXSTR_LIGHTRED,
169 		RID_SVXSTR_LIGHTMAGENTA,
170 		RID_SVXSTR_YELLOW,
171 		RID_SVXSTR_WHITE
172 	};
173 
174 	// MT: COL_XXX ist in VCL kein enum mehr!!!
175 	// COL_WHITE ist seeeehr gross! ( => Zugriff ueber das obige Array hinweg )
176 	// Mit der unteren Schleife gibt es keinen Absturtz, aber es ist
177 	// alles schwarz, weil alles kleine Werte.
178 	// Ausserdem ist die ganze Vorgehensweise laut MM sehr unperformant
179 	// => lieber gleich Stringlisten laden.
180 
181 	// BM: ifndef VCL part removed (deprecated)
182 
183 	static ColorData __READONLY_DATA aColTab[] =
184 	{
185 		COL_BLACK,
186 		COL_BLUE,
187 		COL_GREEN,
188 		COL_CYAN,
189 		COL_RED,
190 		COL_MAGENTA,
191 		COL_BROWN,
192 		COL_GRAY,
193 		COL_LIGHTGRAY,
194 		COL_LIGHTBLUE,
195 		COL_LIGHTGREEN,
196 		COL_LIGHTCYAN,
197 		COL_LIGHTRED,
198 		COL_LIGHTMAGENTA,
199 		COL_YELLOW,
200 		COL_WHITE
201 	};
202 
203 	for( sal_uInt16 n = 0; n < 16; ++n )
204 	{
205 		Insert( new XColorEntry( Color( aColTab[n] ), String( ResId( aResId[ n ], rRes )) ), n );
206 	}
207 
208 	aStr = SVX_RESSTR( RID_SVXSTR_GREY );
209 	aStr.AppendAscii(" 80%");
210 	nLen = aStr.Len() - 3;
211 	Insert( new XColorEntry( Color( 51, 51, 51 ), aStr ) , 16);
212 	aStr.SetChar(nLen, sal_Unicode('7'));
213 	Insert( new XColorEntry( Color( 76, 76, 76 ), aStr ) , 17);
214 	aStr.SetChar(nLen, sal_Unicode('6'));
215 	Insert( new XColorEntry( Color(102,102,102 ), aStr ) , 18);
216 	aStr.SetChar(nLen, sal_Unicode('4'));
217 	Insert( new XColorEntry( Color(153,153,153 ), aStr ) , 19);
218 	aStr.SetChar(nLen, sal_Unicode('3'));
219 	Insert( new XColorEntry( Color(179,179,179 ), aStr ) , 20);
220 	aStr.SetChar(nLen, sal_Unicode('2'));
221 	Insert( new XColorEntry( Color(204,204,204 ), aStr ) , 21);
222 	// BM: new 15%
223 	aStr.SetChar(nLen, sal_Unicode('1'));
224 	aStr.SetChar(nLen + 1, sal_Unicode('5'));
225 	Insert( new XColorEntry( Color(217,217,217 ), aStr ) , 22);
226 	aStr.SetChar(nLen + 1, sal_Unicode('0'));
227 	Insert( new XColorEntry( Color(230,230,230 ), aStr ) , 23);
228 	Insert( new XColorEntry( Color(230,230,255 ), SVX_RESSTR( RID_SVXSTR_BLUEGREY ) ) , 24);
229 
230 	aStr = SVX_RESSTR( RID_SVXSTR_RED );
231 	aStr.AppendAscii(" 1");
232 	nLen = aStr.Len() - 1;
233 	Insert( new XColorEntry( Color(255, 51,102 ), aStr ) , 25);
234 	aStr.SetChar(nLen, sal_Unicode('2'));
235 	Insert( new XColorEntry( Color(220, 35,  0 ), aStr ) , 26);
236 	aStr.SetChar(nLen, sal_Unicode('3'));
237 	Insert( new XColorEntry( Color(184, 71,  0 ), aStr ) , 27);
238 	aStr.SetChar(nLen, sal_Unicode('4'));
239 	Insert( new XColorEntry( Color(255, 51, 51 ), aStr ) , 28);
240 	aStr.SetChar(nLen, sal_Unicode('5'));
241 	Insert( new XColorEntry( Color(235, 97, 61 ), aStr ) , 29);
242 	aStr.SetChar(nLen, sal_Unicode('6'));
243 	Insert( new XColorEntry( Color(184, 71, 71 ), aStr ) , 30);
244 	aStr.SetChar(nLen, sal_Unicode('7'));
245 	Insert( new XColorEntry( Color(184,  0, 71 ), aStr ) , 31);
246 	aStr.SetChar(nLen, sal_Unicode('8'));
247 	Insert( new XColorEntry( Color(153, 40, 76 ), aStr ) , 32);
248 
249 	aStr = SVX_RESSTR( RID_SVXSTR_MAGENTA );
250 	aStr.AppendAscii(" 1");
251 	nLen = aStr.Len() - 1;
252 	Insert( new XColorEntry( Color(148,  0,107 ), aStr ) , 33);
253 	aStr.SetChar(nLen, sal_Unicode('2'));
254 	Insert( new XColorEntry( Color(148, 71,107 ), aStr ) , 34);
255 	aStr.SetChar(nLen, sal_Unicode('3'));
256 	Insert( new XColorEntry( Color(148, 71,148 ), aStr ) , 35);
257 	aStr.SetChar(nLen, sal_Unicode('4'));
258 	Insert( new XColorEntry( Color(153,102,204 ), aStr ) , 36);
259 	aStr.SetChar(nLen, sal_Unicode('5'));
260 	Insert( new XColorEntry( Color(107, 71,148 ), aStr ) , 37);
261 	aStr.SetChar(nLen, sal_Unicode('6'));
262 	Insert( new XColorEntry( Color(107, 35,148 ), aStr ) , 38);
263 	aStr.SetChar(nLen, sal_Unicode('7'));
264 	Insert( new XColorEntry( Color(107,  0,148 ), aStr ) , 39);
265 	aStr.SetChar(nLen, sal_Unicode('8'));
266 	Insert( new XColorEntry( Color( 94, 17,166 ), aStr ) , 40);
267 
268 	aStr = SVX_RESSTR( RID_SVXSTR_BLUE );
269 	aStr.AppendAscii(" 1");
270 	nLen = aStr.Len() - 1;
271 	Insert( new XColorEntry( Color( 40,  0,153 ), aStr ) , 41);
272 	aStr.SetChar(nLen, sal_Unicode('2'));
273 	Insert( new XColorEntry( Color( 71,  0,184 ), aStr ) , 42);
274 	aStr.SetChar(nLen, sal_Unicode('3'));
275 	Insert( new XColorEntry( Color( 35,  0,220 ), aStr ) , 43);
276 	aStr.SetChar(nLen, sal_Unicode('4'));
277 	Insert( new XColorEntry( Color( 35, 35,220 ), aStr ) , 44);
278 	aStr.SetChar(nLen, sal_Unicode('5'));
279 	Insert( new XColorEntry( Color(  0, 71,255 ), aStr ) , 45);
280 	aStr.SetChar(nLen, sal_Unicode('6'));
281 	Insert( new XColorEntry( Color(  0,153,255 ), aStr ) , 46);
282 	aStr.SetChar(nLen, sal_Unicode('7'));
283 	Insert( new XColorEntry( Color(  0,184,255 ), aStr ) , 47);
284 	aStr.SetChar(nLen, sal_Unicode('8'));
285 	Insert( new XColorEntry( Color(153,204,255 ), aStr ) , 48);
286 	//Insert(48, new XColorEntry( Color( 46,215,255 ), aStr ) );
287 
288 	aStr = SVX_RESSTR( RID_SVXSTR_CYAN );
289 	aStr.AppendAscii(" 1");
290 	nLen = aStr.Len() - 1;
291 	Insert( new XColorEntry( Color(  0,220,255 ), aStr ) , 49);
292 	aStr.SetChar(nLen, sal_Unicode('2'));
293 	Insert( new XColorEntry( Color(  0,204,204 ), aStr ) , 50);
294 	aStr.SetChar(nLen, sal_Unicode('3'));
295 	Insert( new XColorEntry( Color( 35,184,220 ), aStr ) , 51);
296 	aStr.SetChar(nLen, sal_Unicode('4'));
297 	Insert( new XColorEntry( Color( 71,184,184 ), aStr ) , 52);
298 	aStr.SetChar(nLen, sal_Unicode('5'));
299 	Insert( new XColorEntry( Color( 51,163,163 ), aStr ) , 53);
300 	aStr.SetChar(nLen, sal_Unicode('6'));
301 	Insert( new XColorEntry( Color( 25,138,138 ), aStr ) , 54);
302 	aStr.SetChar(nLen, sal_Unicode('7'));
303 	Insert( new XColorEntry( Color(  0,107,107 ), aStr ) , 55);
304 	aStr.SetChar(nLen, sal_Unicode('8'));
305 	Insert( new XColorEntry( Color(  0, 74, 74 ), aStr ) , 56);
306 
307 	aStr = SVX_RESSTR( RID_SVXSTR_GREEN );
308 	aStr.AppendAscii(" 1");
309 	nLen = aStr.Len() - 1;
310 	Insert( new XColorEntry( Color( 53, 94,  0 ), aStr ) , 57);
311 	aStr.SetChar(nLen, sal_Unicode('2'));
312 	Insert( new XColorEntry( Color( 92,133, 38 ), aStr ) , 58);
313 	aStr.SetChar(nLen, sal_Unicode('3'));
314 	Insert( new XColorEntry( Color(125,166, 71 ), aStr ) , 59);
315 	aStr.SetChar(nLen, sal_Unicode('4'));
316 	Insert( new XColorEntry( Color(148,189, 94 ), aStr ) , 60);
317 	aStr.SetChar(nLen, sal_Unicode('5'));
318 	Insert( new XColorEntry( Color(  0,174,  0 ), aStr ) , 61);
319 	aStr.SetChar(nLen, sal_Unicode('6'));
320 	Insert( new XColorEntry( Color( 51,204,102 ), aStr ) , 62);
321 	aStr.SetChar(nLen, sal_Unicode('7'));
322 	Insert( new XColorEntry( Color( 61,235, 61 ), aStr ) , 63);
323 	aStr.SetChar(nLen, sal_Unicode('8'));
324 	Insert( new XColorEntry( Color( 35,255, 35 ), aStr ) , 64);
325 
326 	aStr = SVX_RESSTR( RID_SVXSTR_YELLOW );
327 	aStr.AppendAscii(" 1");
328 	nLen = aStr.Len() - 1;
329 	Insert( new XColorEntry( Color(230,255,  0 ), aStr ) , 65);
330 	aStr.SetChar(nLen, sal_Unicode('2'));
331 	Insert( new XColorEntry( Color(255,255,153 ), aStr ) , 66);
332 	aStr.SetChar(nLen, sal_Unicode('3'));
333 	Insert( new XColorEntry( Color(255,255,102 ), aStr ) , 67);
334 	aStr.SetChar(nLen, sal_Unicode('4'));
335 	Insert( new XColorEntry( Color(230,230, 76 ), aStr ) , 68);
336 	aStr.SetChar(nLen, sal_Unicode('5'));
337 	Insert( new XColorEntry( Color(204,204,  0 ), aStr ) , 69);
338 	aStr.SetChar(nLen, sal_Unicode('6'));
339 	Insert( new XColorEntry( Color(179,179,  0 ), aStr ) , 70);
340 	aStr.SetChar(nLen, sal_Unicode('7'));
341 	Insert( new XColorEntry( Color(128,128, 25 ), aStr ) , 71);
342 	aStr.SetChar(nLen, sal_Unicode('8'));
343 	Insert( new XColorEntry( Color(102,102,  0 ), aStr ) , 72);
344 
345 	aStr = SVX_RESSTR( RID_SVXSTR_BROWN );
346 	aStr.AppendAscii(" 1");
347 	nLen = aStr.Len() - 1;
348 	Insert( new XColorEntry( Color( 76, 25,  0 ), aStr ) , 73);
349 	aStr.SetChar(nLen, sal_Unicode('2'));
350 	Insert( new XColorEntry( Color(102, 51,  0 ), aStr ) , 74);
351 	aStr.SetChar(nLen, sal_Unicode('3'));
352 	Insert( new XColorEntry( Color(128, 76, 25 ), aStr ) , 75);
353 	aStr.SetChar(nLen, sal_Unicode('4'));
354 	Insert( new XColorEntry( Color(153,102, 51 ), aStr ) , 76);
355 
356 	aStr = SVX_RESSTR( RID_SVXSTR_ORANGE );
357 	aStr.AppendAscii(" 1");
358 	nLen = aStr.Len() - 1;
359 	Insert( new XColorEntry( Color(204,102, 51 ), aStr ) , 77);
360 	aStr.SetChar(nLen, sal_Unicode('2'));
361 	Insert( new XColorEntry( Color(255,102, 51 ), aStr ) , 78);
362 	aStr.SetChar(nLen, sal_Unicode('3'));
363 	Insert( new XColorEntry( Color(255,153,102 ), aStr ) , 79);
364 	aStr.SetChar(nLen, sal_Unicode('4'));
365 	Insert( new XColorEntry( Color(255,204,153 ), aStr ) , 80);
366 
367 	// new chart colors
368 	aStr = SVX_RESSTR( RID_SVXSTR_VIOLET );
369 	Insert( new XColorEntry( Color( 0x99, 0x99, 0xff ), aStr ) , 81);
370 
371 	aStr = SVX_RESSTR( RID_SVXSTR_BORDEAUX );
372 	Insert( new XColorEntry( Color( 0x99, 0x33, 0x66 ), aStr ) , 82);
373 
374 	aStr = SVX_RESSTR( RID_SVXSTR_PALE_YELLOW );
375 	Insert( new XColorEntry( Color( 0xff, 0xff, 0xcc ), aStr ) , 83);
376 
377 	aStr = SVX_RESSTR( RID_SVXSTR_PALE_GREEN );
378 	Insert( new XColorEntry( Color( 0xcc, 0xff, 0xff ), aStr ) , 84);
379 
380 	aStr = SVX_RESSTR( RID_SVXSTR_DKVIOLET );
381 	Insert( new XColorEntry( Color( 0x66, 0x00, 0x66 ), aStr ) , 85);
382 
383 	aStr = SVX_RESSTR( RID_SVXSTR_SALMON );
384 	Insert( new XColorEntry( Color( 0xff, 0x80, 0x80 ), aStr ) , 86);
385 
386 	aStr = SVX_RESSTR( RID_SVXSTR_SEABLUE );
387 	Insert( new XColorEntry( Color( 0x00, 0x66, 0xcc ), aStr ) , 87);
388 
389 	// Sun colors
390 	aStr = SVX_RESSTR( RID_SVXSTR_COLOR_SUN );
391 	aStr.AppendAscii(" 1");
392 	nLen = aStr.Len() - 1;
393 	Insert( new XColorEntry( Color( 0x33, 0x33, 0x66 ), aStr ) , 88);
394 	aStr.SetChar(nLen, sal_Unicode('2'));
395 	Insert( new XColorEntry( Color( 0x66, 0x66, 0x99 ), aStr ) , 89);
396 	aStr.SetChar(nLen, sal_Unicode('3'));
397 	Insert( new XColorEntry( Color( 0x99, 0x99, 0xcc ), aStr ) , 90);
398 	aStr.SetChar(nLen, sal_Unicode('4'));
399 	Insert( new XColorEntry( Color( 0xcc, 0xcc, 0xff ), aStr ) , 91);
400 
401     // Chart default colors
402     aStr = SVX_RESSTR( RID_SVXSTR_COLOR_CHART );
403     aStr.AppendAscii(" 1");
404     nLen = aStr.Len() - 1;
405     Insert( new XColorEntry( Color( 0x00, 0x45, 0x86 ), aStr ) , 92);
406     aStr.SetChar(nLen, sal_Unicode('2'));
407     Insert( new XColorEntry( Color( 0xff, 0x42, 0x0e ), aStr ) , 93);
408     aStr.SetChar(nLen, sal_Unicode('3'));
409     Insert( new XColorEntry( Color( 0xff, 0xd3, 0x20 ), aStr ) , 94);
410     aStr.SetChar(nLen, sal_Unicode('4'));
411     Insert( new XColorEntry( Color( 0x57, 0x9d, 0x1c ), aStr ) , 95);
412     aStr.SetChar(nLen, sal_Unicode('5'));
413     Insert( new XColorEntry( Color( 0x7e, 0x00, 0x21 ), aStr ) , 96);
414     aStr.SetChar(nLen, sal_Unicode('6'));
415     Insert( new XColorEntry( Color( 0x83, 0xca, 0xff ), aStr ) , 97);
416     aStr.SetChar(nLen, sal_Unicode('7'));
417     Insert( new XColorEntry( Color( 0x31, 0x40, 0x04 ), aStr ) , 98);
418     aStr.SetChar(nLen, sal_Unicode('8'));
419     Insert( new XColorEntry( Color( 0xae, 0xcf, 0x00 ), aStr ) , 99);
420     aStr.SetChar(nLen, sal_Unicode('9'));
421     Insert( new XColorEntry( Color( 0x4b, 0x1f, 0x6f ), aStr ) , 100);
422     aStr.SetChar(nLen, sal_Unicode('1'));
423     aStr.AppendAscii("0");
424     nLen = aStr.Len() - 1;
425     Insert( new XColorEntry( Color( 0xff, 0x95, 0x0e ), aStr ) , 101);
426     aStr.SetChar(nLen, sal_Unicode('1'));
427     Insert( new XColorEntry( Color( 0xc5, 0x00, 0x0b ), aStr ) , 102);
428     aStr.SetChar(nLen, sal_Unicode('2'));
429     Insert( new XColorEntry( Color( 0x00, 0x84, 0xd1 ), aStr ) , 103);
430 
431 	return( Count() == 104 );
432 }
433 
434 /************************************************************************/
435 
436 Bitmap XColorList::CreateBitmapForUI( long /*nIndex*/ )
437 {
438 	return Bitmap();
439 }
440 
441 /************************************************************************/
442 
443 XColorList* XColorList::GetStdColorList()
444 {
445 	if ( !pStaticGlobalColorList )
446 		pStaticGlobalColorList = new XColorList( SvtPathOptions().GetPalettePath() );
447 	return pStaticGlobalColorList;
448 }
449 
450 // eof
451