xref: /AOO41X/main/sc/source/ui/unoobj/afmtuno.cxx (revision b3f79822e811ac3493b185030a72c3c5a51f32d8)
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_sc.hxx"
26 
27 
28 
29 #include "scitems.hxx"
30 #include <editeng/memberids.hrc>
31 #include <tools/debug.hxx>
32 #include <tools/shl.hxx>
33 #include <svl/poolitem.hxx>
34 #include <svx/unomid.hxx>
35 #include "unowids.hxx"
36 #include <rtl/uuid.h>
37 #include <com/sun/star/table/BorderLine.hpp>
38 #include <com/sun/star/table/CellVertJustify.hpp>
39 #include <com/sun/star/table/ShadowLocation.hpp>
40 #include <com/sun/star/table/TableBorder.hpp>
41 #include <com/sun/star/table/ShadowFormat.hpp>
42 #include <com/sun/star/table/CellRangeAddress.hpp>
43 #include <com/sun/star/table/CellContentType.hpp>
44 #include <com/sun/star/table/TableOrientation.hpp>
45 #include <com/sun/star/table/CellHoriJustify.hpp>
46 #include <com/sun/star/util/SortField.hpp>
47 #include <com/sun/star/util/SortFieldType.hpp>
48 #include <com/sun/star/table/CellOrientation.hpp>
49 #include <com/sun/star/table/CellAddress.hpp>
50 #include <com/sun/star/awt/SimpleFontMetric.hpp>
51 #include <com/sun/star/awt/FontWeight.hpp>
52 #include <com/sun/star/awt/FontSlant.hpp>
53 #include <com/sun/star/awt/CharSet.hpp>
54 #include <com/sun/star/awt/FontDescriptor.hpp>
55 #include <com/sun/star/awt/FontWidth.hpp>
56 #include <com/sun/star/awt/XFont.hpp>
57 #include <com/sun/star/awt/FontType.hpp>
58 #include <com/sun/star/awt/FontUnderline.hpp>
59 #include <com/sun/star/awt/FontStrikeout.hpp>
60 #include <com/sun/star/awt/FontFamily.hpp>
61 #include <com/sun/star/awt/FontPitch.hpp>
62 
63 #include "afmtuno.hxx"
64 #include "miscuno.hxx"
65 #include "autoform.hxx"
66 #include "unoguard.hxx"
67 #include "scdll.hxx"
68 #include "unonames.hxx"
69 #include "cellsuno.hxx"
70 
71 using namespace ::com::sun::star;
72 
73 //------------------------------------------------------------------------
74 
75 //  ein AutoFormat hat immer 16 Eintraege
76 #define SC_AF_FIELD_COUNT 16
77 
78 //------------------------------------------------------------------------
79 
80 //  AutoFormat-Map nur fuer PropertySetInfo, ohne Which-IDs
81 
lcl_GetAutoFormatMap()82 const SfxItemPropertyMapEntry* lcl_GetAutoFormatMap()
83 {
84     static SfxItemPropertyMapEntry aAutoFormatMap_Impl[] =
85     {
86         {MAP_CHAR_LEN(SC_UNONAME_INCBACK),  0,  &::getBooleanCppuType(),    0, 0 },
87         {MAP_CHAR_LEN(SC_UNONAME_INCBORD),  0,  &::getBooleanCppuType(),    0, 0 },
88         {MAP_CHAR_LEN(SC_UNONAME_INCFONT),  0,  &::getBooleanCppuType(),    0, 0 },
89         {MAP_CHAR_LEN(SC_UNONAME_INCJUST),  0,  &::getBooleanCppuType(),    0, 0 },
90         {MAP_CHAR_LEN(SC_UNONAME_INCNUM),   0,  &::getBooleanCppuType(),    0, 0 },
91         {MAP_CHAR_LEN(SC_UNONAME_INCWIDTH), 0,  &::getBooleanCppuType(),    0, 0 },
92         {0,0,0,0,0,0}
93     };
94     return aAutoFormatMap_Impl;
95 }
96 
97 //! Zahlformat (String/Language) ??? (in XNumberFormat nur ReadOnly)
98 //! table::TableBorder ??!?
99 
lcl_GetAutoFieldMap()100 const SfxItemPropertyMapEntry* lcl_GetAutoFieldMap()
101 {
102     static SfxItemPropertyMapEntry aAutoFieldMap_Impl[] =
103     {
104         {MAP_CHAR_LEN(SC_UNONAME_CELLBACK), ATTR_BACKGROUND,        &::getCppuType((const sal_Int32*)0),        0, MID_BACK_COLOR },
105         {MAP_CHAR_LEN(SC_UNONAME_CCOLOR),   ATTR_FONT_COLOR,        &::getCppuType((const sal_Int32*)0),        0, 0 },
106         {MAP_CHAR_LEN(SC_UNONAME_COUTL),    ATTR_FONT_CONTOUR,      &::getBooleanCppuType(),                    0, 0 },
107         {MAP_CHAR_LEN(SC_UNONAME_CCROSS),   ATTR_FONT_CROSSEDOUT,   &::getBooleanCppuType(),                    0, MID_CROSSED_OUT },
108         {MAP_CHAR_LEN(SC_UNONAME_CFONT),    ATTR_FONT,              &::getCppuType((const sal_Int16*)0),        0, MID_FONT_FAMILY },
109         {MAP_CHAR_LEN(SC_UNONAME_CFCHARS),  ATTR_FONT,              &::getCppuType((sal_Int16*)0),              0, MID_FONT_CHAR_SET },
110         {MAP_CHAR_LEN(SC_UNO_CJK_CFCHARS),  ATTR_CJK_FONT,          &::getCppuType((sal_Int16*)0),              0, MID_FONT_CHAR_SET },
111         {MAP_CHAR_LEN(SC_UNO_CTL_CFCHARS),  ATTR_CTL_FONT,          &::getCppuType((sal_Int16*)0),              0, MID_FONT_CHAR_SET },
112         {MAP_CHAR_LEN(SC_UNONAME_CFFAMIL),  ATTR_FONT,              &::getCppuType((sal_Int16*)0),              0, MID_FONT_FAMILY },
113         {MAP_CHAR_LEN(SC_UNO_CJK_CFFAMIL),  ATTR_CJK_FONT,          &::getCppuType((sal_Int16*)0),              0, MID_FONT_FAMILY },
114         {MAP_CHAR_LEN(SC_UNO_CTL_CFFAMIL),  ATTR_CTL_FONT,          &::getCppuType((sal_Int16*)0),              0, MID_FONT_FAMILY },
115         {MAP_CHAR_LEN(SC_UNONAME_CFNAME),   ATTR_FONT,              &::getCppuType((rtl::OUString*)0),          0, MID_FONT_FAMILY_NAME },
116         {MAP_CHAR_LEN(SC_UNO_CJK_CFNAME),   ATTR_CJK_FONT,          &::getCppuType((rtl::OUString*)0),          0, MID_FONT_FAMILY_NAME },
117         {MAP_CHAR_LEN(SC_UNO_CTL_CFNAME),   ATTR_CTL_FONT,          &::getCppuType((rtl::OUString*)0),          0, MID_FONT_FAMILY_NAME },
118         {MAP_CHAR_LEN(SC_UNONAME_CFPITCH),  ATTR_FONT,              &::getCppuType((sal_Int16*)0),              0, MID_FONT_PITCH },
119         {MAP_CHAR_LEN(SC_UNO_CJK_CFPITCH),  ATTR_CJK_FONT,          &::getCppuType((sal_Int16*)0),              0, MID_FONT_PITCH },
120         {MAP_CHAR_LEN(SC_UNO_CTL_CFPITCH),  ATTR_CTL_FONT,          &::getCppuType((sal_Int16*)0),              0, MID_FONT_PITCH },
121         {MAP_CHAR_LEN(SC_UNONAME_CFSTYLE),  ATTR_FONT,              &::getCppuType((rtl::OUString*)0),          0, MID_FONT_STYLE_NAME },
122         {MAP_CHAR_LEN(SC_UNO_CJK_CFSTYLE),  ATTR_CJK_FONT,          &::getCppuType((rtl::OUString*)0),          0, MID_FONT_STYLE_NAME },
123         {MAP_CHAR_LEN(SC_UNO_CTL_CFSTYLE),  ATTR_CTL_FONT,          &::getCppuType((rtl::OUString*)0),          0, MID_FONT_STYLE_NAME },
124         {MAP_CHAR_LEN(SC_UNONAME_CHEIGHT),  ATTR_FONT_HEIGHT,       &::getCppuType((float*)0),                  0, MID_FONTHEIGHT | CONVERT_TWIPS },
125         {MAP_CHAR_LEN(SC_UNO_CJK_CHEIGHT),  ATTR_CJK_FONT_HEIGHT,   &::getCppuType((float*)0),                  0, MID_FONTHEIGHT | CONVERT_TWIPS },
126         {MAP_CHAR_LEN(SC_UNO_CTL_CHEIGHT),  ATTR_CTL_FONT_HEIGHT,   &::getCppuType((float*)0),                  0, MID_FONTHEIGHT | CONVERT_TWIPS },
127         {MAP_CHAR_LEN(SC_UNONAME_COVER),    ATTR_FONT_OVERLINE,     &::getCppuType((const sal_Int16*)0),        0, MID_TL_STYLE },
128         {MAP_CHAR_LEN(SC_UNONAME_CPOST),    ATTR_FONT_POSTURE,      &::getCppuType((awt::FontSlant*)0),         0, MID_POSTURE },
129         {MAP_CHAR_LEN(SC_UNO_CJK_CPOST),    ATTR_CJK_FONT_POSTURE,  &::getCppuType((awt::FontSlant*)0),         0, MID_POSTURE },
130         {MAP_CHAR_LEN(SC_UNO_CTL_CPOST),    ATTR_CTL_FONT_POSTURE,  &::getCppuType((awt::FontSlant*)0),         0, MID_POSTURE },
131         {MAP_CHAR_LEN(SC_UNONAME_CSHADD),   ATTR_FONT_SHADOWED,     &::getBooleanCppuType(),                    0, 0 },
132         {MAP_CHAR_LEN(SC_UNONAME_TBLBORD),  SC_WID_UNO_TBLBORD,     &::getCppuType((table::TableBorder*)0),     0, 0 | CONVERT_TWIPS },
133         {MAP_CHAR_LEN(SC_UNONAME_CUNDER),   ATTR_FONT_UNDERLINE,    &::getCppuType((const sal_Int16*)0),        0, MID_TL_STYLE },
134         {MAP_CHAR_LEN(SC_UNONAME_CWEIGHT),  ATTR_FONT_WEIGHT,       &::getCppuType((float*)0),                  0, MID_WEIGHT },
135         {MAP_CHAR_LEN(SC_UNO_CJK_CWEIGHT),  ATTR_CJK_FONT_WEIGHT,   &::getCppuType((float*)0),                  0, MID_WEIGHT },
136         {MAP_CHAR_LEN(SC_UNO_CTL_CWEIGHT),  ATTR_CTL_FONT_WEIGHT,   &::getCppuType((float*)0),                  0, MID_WEIGHT },
137         {MAP_CHAR_LEN(SC_UNONAME_CELLHJUS), ATTR_HOR_JUSTIFY,       &::getCppuType((const table::CellHoriJustify*)0),   0, 0 },
138         {MAP_CHAR_LEN(SC_UNONAME_CELLTRAN), ATTR_BACKGROUND,        &::getBooleanCppuType(),                    0, MID_GRAPHIC_TRANSPARENT },
139         {MAP_CHAR_LEN(SC_UNONAME_WRAP),     ATTR_LINEBREAK,         &::getBooleanCppuType(),                    0, 0 },
140         {MAP_CHAR_LEN(SC_UNONAME_CELLORI),  ATTR_STACKED,           &::getCppuType((const table::CellOrientation*)0),   0, 0 },
141         {MAP_CHAR_LEN(SC_UNONAME_PBMARGIN), ATTR_MARGIN,            &::getCppuType((const sal_Int32*)0),        0, MID_MARGIN_LO_MARGIN | CONVERT_TWIPS },
142         {MAP_CHAR_LEN(SC_UNONAME_PLMARGIN), ATTR_MARGIN,            &::getCppuType((const sal_Int32*)0),        0, MID_MARGIN_L_MARGIN  | CONVERT_TWIPS },
143         {MAP_CHAR_LEN(SC_UNONAME_PRMARGIN), ATTR_MARGIN,            &::getCppuType((const sal_Int32*)0),        0, MID_MARGIN_R_MARGIN  | CONVERT_TWIPS },
144         {MAP_CHAR_LEN(SC_UNONAME_PTMARGIN), ATTR_MARGIN,            &::getCppuType((const sal_Int32*)0),        0, MID_MARGIN_UP_MARGIN | CONVERT_TWIPS },
145         {MAP_CHAR_LEN(SC_UNONAME_ROTANG),   ATTR_ROTATE_VALUE,      &::getCppuType((const sal_Int32*)0),        0, 0 },
146         {MAP_CHAR_LEN(SC_UNONAME_ROTREF),   ATTR_ROTATE_MODE,       &::getCppuType((const table::CellVertJustify*)0),   0, 0 },
147         {MAP_CHAR_LEN(SC_UNONAME_CELLVJUS), ATTR_VER_JUSTIFY,       &::getCppuType((const table::CellVertJustify*)0),   0, 0 },
148         {0,0,0,0,0,0}
149     };
150     return aAutoFieldMap_Impl;
151 }
152 
153 //------------------------------------------------------------------------
154 
155 #define SCAUTOFORMATSOBJ_SERVICE    "com.sun.star.sheet.TableAutoFormats"
156 
157 SC_SIMPLE_SERVICE_INFO( ScAutoFormatFieldObj, "ScAutoFormatFieldObj", "com.sun.star.sheet.TableAutoFormatField" )
158 SC_SIMPLE_SERVICE_INFO( ScAutoFormatObj, "ScAutoFormatObj", "com.sun.star.sheet.TableAutoFormat" )
159 SC_SIMPLE_SERVICE_INFO( ScAutoFormatsObj, "ScAutoFormatsObj", SCAUTOFORMATSOBJ_SERVICE )
160 
161 //------------------------------------------------------------------------
162 
lcl_FindAutoFormatIndex(const ScAutoFormat & rFormats,const String & rName,sal_uInt16 & rOutIndex)163 sal_Bool lcl_FindAutoFormatIndex( const ScAutoFormat& rFormats, const String& rName, sal_uInt16& rOutIndex )
164 {
165     String aEntryName;
166     sal_uInt16 nCount = rFormats.GetCount();
167     for( sal_uInt16 nPos=0; nPos<nCount; nPos++ )
168     {
169         ScAutoFormatData* pEntry = rFormats[nPos];
170         pEntry->GetName( aEntryName );
171         if ( aEntryName == rName )
172         {
173             rOutIndex = nPos;
174             return sal_True;
175         }
176     }
177     return sal_False;       // is nich
178 }
179 
180 //------------------------------------------------------------------------
181 
ScAutoFormatsObj()182 ScAutoFormatsObj::ScAutoFormatsObj()
183 {
184     //! Dieses Objekt darf es nur einmal geben, und es muss an den Auto-Format-Daten
185     //! bekannt sein, damit Aenderungen gebroadcasted werden koennen
186 }
187 
~ScAutoFormatsObj()188 ScAutoFormatsObj::~ScAutoFormatsObj()
189 {
190 }
191 
192 // stuff for exService_...
193 
ScAutoFormatsObj_CreateInstance(const uno::Reference<lang::XMultiServiceFactory> &)194 uno::Reference<uno::XInterface> SAL_CALL ScAutoFormatsObj_CreateInstance(
195                         const uno::Reference<lang::XMultiServiceFactory>& )
196 {
197     ScUnoGuard aGuard;
198     ScDLL::Init();
199     static uno::Reference< uno::XInterface > xInst((::cppu::OWeakObject*) new ScAutoFormatsObj);
200     return xInst;
201 }
202 
getImplementationName_Static()203 rtl::OUString ScAutoFormatsObj::getImplementationName_Static()
204 {
205     return rtl::OUString::createFromAscii( "stardiv.StarCalc.ScAutoFormatsObj" );
206 }
207 
getSupportedServiceNames_Static()208 uno::Sequence<rtl::OUString> ScAutoFormatsObj::getSupportedServiceNames_Static()
209 {
210     uno::Sequence<rtl::OUString> aRet(1);
211     rtl::OUString* pArray = aRet.getArray();
212     pArray[0] = rtl::OUString::createFromAscii( SCAUTOFORMATSOBJ_SERVICE );
213     return aRet;
214 }
215 
216 // XTableAutoFormats
217 
GetObjectByIndex_Impl(sal_uInt16 nIndex)218 ScAutoFormatObj* ScAutoFormatsObj::GetObjectByIndex_Impl(sal_uInt16 nIndex)
219 {
220     ScAutoFormat* pFormats = ScGlobal::GetAutoFormat();
221     if (pFormats && nIndex < pFormats->GetCount())
222         return new ScAutoFormatObj(nIndex);
223 
224     return NULL;    // falscher Index
225 }
226 
GetObjectByName_Impl(const rtl::OUString & aName)227 ScAutoFormatObj* ScAutoFormatsObj::GetObjectByName_Impl(const rtl::OUString& aName)
228 {
229     ScAutoFormat* pFormats = ScGlobal::GetAutoFormat();
230     if (pFormats)
231     {
232         String aString(aName);
233         sal_uInt16 nIndex;
234         if (lcl_FindAutoFormatIndex( *pFormats, aString, nIndex ))
235             return GetObjectByIndex_Impl(nIndex);
236     }
237     return NULL;
238 }
239 
240 // container::XNameContainer
241 
insertByName(const rtl::OUString & aName,const uno::Any & aElement)242 void SAL_CALL ScAutoFormatsObj::insertByName( const rtl::OUString& aName, const uno::Any& aElement )
243                             throw(lang::IllegalArgumentException, container::ElementExistException,
244                                     lang::WrappedTargetException, uno::RuntimeException)
245 {
246     ScUnoGuard aGuard;
247     sal_Bool bDone = sal_False;
248     //  Reflection muss nicht uno::XInterface sein, kann auch irgendein Interface sein...
249     uno::Reference< uno::XInterface > xInterface(aElement, uno::UNO_QUERY);
250     if ( xInterface.is() )
251     {
252         ScAutoFormatObj* pFormatObj = ScAutoFormatObj::getImplementation( xInterface );
253         if ( pFormatObj && !pFormatObj->IsInserted() )  // noch nicht eingefuegt?
254         {
255             String aNameStr(aName);
256             ScAutoFormat* pFormats = ScGlobal::GetAutoFormat();
257 
258             sal_uInt16 nDummy;
259             if (pFormats && !lcl_FindAutoFormatIndex( *pFormats, aNameStr, nDummy ))
260             {
261                 ScAutoFormatData* pNew = new ScAutoFormatData();
262                 pNew->SetName( aNameStr );
263 
264                 if (pFormats->Insert( pNew ))
265                 {
266                     //! Notify fuer andere Objekte
267                     pFormats->Save();   // sofort speichern
268 
269                     sal_uInt16 nNewIndex;
270                     if (lcl_FindAutoFormatIndex( *pFormats, aNameStr, nNewIndex ))
271                     {
272                         pFormatObj->InitFormat( nNewIndex );    // kann jetzt benutzt werden
273                         bDone = sal_True;
274                     }
275                 }
276                 else
277                 {
278                     delete pNew;
279                     DBG_ERROR("AutoFormat konnte nicht eingefuegt werden");
280                     throw uno::RuntimeException();
281                 }
282             }
283             else
284             {
285                 throw container::ElementExistException();
286             }
287         }
288     }
289 
290     if (!bDone)
291     {
292         //  other errors are handled above
293         throw lang::IllegalArgumentException();
294     }
295 }
296 
replaceByName(const rtl::OUString & aName,const uno::Any & aElement)297 void SAL_CALL ScAutoFormatsObj::replaceByName( const rtl::OUString& aName, const uno::Any& aElement )
298                             throw(lang::IllegalArgumentException, container::NoSuchElementException,
299                                     lang::WrappedTargetException, uno::RuntimeException)
300 {
301     ScUnoGuard aGuard;
302     //! zusammenfassen?
303     removeByName( aName );
304     insertByName( aName, aElement );
305 }
306 
removeByName(const rtl::OUString & aName)307 void SAL_CALL ScAutoFormatsObj::removeByName( const rtl::OUString& aName )
308                                 throw(container::NoSuchElementException,
309                                     lang::WrappedTargetException, uno::RuntimeException)
310 {
311     ScUnoGuard aGuard;
312     String aNameStr(aName);
313     ScAutoFormat* pFormats = ScGlobal::GetAutoFormat();
314 
315     sal_uInt16 nIndex;
316     if (pFormats && lcl_FindAutoFormatIndex( *pFormats, aNameStr, nIndex ))
317     {
318         pFormats->AtFree( nIndex );
319 
320         //! Notify fuer andere Objekte
321         pFormats->Save();   // sofort speichern
322     }
323     else
324     {
325         throw container::NoSuchElementException();
326     }
327 }
328 
329 // container::XEnumerationAccess
330 
createEnumeration()331 uno::Reference<container::XEnumeration> SAL_CALL ScAutoFormatsObj::createEnumeration()
332                                                     throw(uno::RuntimeException)
333 {
334     ScUnoGuard aGuard;
335     return new ScIndexEnumeration(this, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sheet.TableAutoFormatEnumeration")));
336 }
337 
338 // container::XIndexAccess
339 
getCount()340 sal_Int32 SAL_CALL ScAutoFormatsObj::getCount() throw(uno::RuntimeException)
341 {
342     ScUnoGuard aGuard;
343     ScAutoFormat* pFormats = ScGlobal::GetAutoFormat();
344     if (pFormats)
345         return pFormats->GetCount();
346 
347     return 0;
348 }
349 
getByIndex(sal_Int32 nIndex)350 uno::Any SAL_CALL ScAutoFormatsObj::getByIndex( sal_Int32 nIndex )
351                             throw(lang::IndexOutOfBoundsException,
352                                     lang::WrappedTargetException, uno::RuntimeException)
353 {
354     ScUnoGuard aGuard;
355     uno::Reference< container::XNamed >  xFormat(GetObjectByIndex_Impl((sal_uInt16)nIndex));
356     if (!xFormat.is())
357         throw lang::IndexOutOfBoundsException();
358     return uno::makeAny(xFormat);
359 }
360 
getElementType()361 uno::Type SAL_CALL ScAutoFormatsObj::getElementType() throw(uno::RuntimeException)
362 {
363     ScUnoGuard aGuard;
364     return ::getCppuType((const uno::Reference< container::XNamed >*)0);    // muss zu getByIndex passen
365 }
366 
hasElements()367 sal_Bool SAL_CALL ScAutoFormatsObj::hasElements() throw(uno::RuntimeException)
368 {
369     ScUnoGuard aGuard;
370     return ( getCount() != 0 );
371 }
372 
373 // container::XNameAccess
374 
getByName(const rtl::OUString & aName)375 uno::Any SAL_CALL ScAutoFormatsObj::getByName( const rtl::OUString& aName )
376             throw(container::NoSuchElementException,
377                     lang::WrappedTargetException, uno::RuntimeException)
378 {
379     ScUnoGuard aGuard;
380     uno::Reference< container::XNamed >  xFormat(GetObjectByName_Impl(aName));
381     if (!xFormat.is())
382         throw container::NoSuchElementException();
383     return uno::makeAny(xFormat);
384 }
385 
getElementNames()386 uno::Sequence<rtl::OUString> SAL_CALL ScAutoFormatsObj::getElementNames()
387                                                 throw(uno::RuntimeException)
388 {
389     ScUnoGuard aGuard;
390     ScAutoFormat* pFormats = ScGlobal::GetAutoFormat();
391     if (pFormats)
392     {
393         String aName;
394         sal_uInt16 nCount = pFormats->GetCount();
395         uno::Sequence<rtl::OUString> aSeq(nCount);
396         rtl::OUString* pAry = aSeq.getArray();
397         for (sal_uInt16 i=0; i<nCount; i++)
398         {
399             (*pFormats)[i]->GetName(aName);
400             pAry[i] = aName;
401         }
402         return aSeq;
403     }
404     return uno::Sequence<rtl::OUString>(0);
405 }
406 
hasByName(const rtl::OUString & aName)407 sal_Bool SAL_CALL ScAutoFormatsObj::hasByName( const rtl::OUString& aName )
408                                         throw(uno::RuntimeException)
409 {
410     ScUnoGuard aGuard;
411     ScAutoFormat* pFormats = ScGlobal::GetAutoFormat();
412     if (pFormats)
413     {
414         String aString(aName);
415         sal_uInt16 nDummy;
416         return lcl_FindAutoFormatIndex( *pFormats, aString, nDummy );
417     }
418     return sal_False;
419 }
420 
421 //------------------------------------------------------------------------
422 
ScAutoFormatObj(sal_uInt16 nIndex)423 ScAutoFormatObj::ScAutoFormatObj(sal_uInt16 nIndex) :
424     aPropSet( lcl_GetAutoFormatMap() ),
425     nFormatIndex( nIndex )
426 {
427     //! Listening !!!
428 }
429 
~ScAutoFormatObj()430 ScAutoFormatObj::~ScAutoFormatObj()
431 {
432     //  Wenn ein AutoFormat-Objekt losgelassen wird, werden eventuelle Aenderungen
433     //  gespeichert, damit sie z.B. im Writer sichtbar sind
434 
435     if (IsInserted())
436     {
437         ScAutoFormat* pFormats = ScGlobal::GetAutoFormat();
438         if ( pFormats && pFormats->IsSaveLater() )
439             pFormats->Save();
440 
441         // Save() setzt SaveLater Flag zurueck
442     }
443 }
444 
InitFormat(sal_uInt16 nNewIndex)445 void ScAutoFormatObj::InitFormat( sal_uInt16 nNewIndex )
446 {
447     DBG_ASSERT( nFormatIndex == SC_AFMTOBJ_INVALID, "ScAutoFormatObj::InitFormat mehrfach" );
448     nFormatIndex = nNewIndex;
449     //! Listening !!!
450 }
451 
452 // XUnoTunnel
453 
getSomething(const uno::Sequence<sal_Int8> & rId)454 sal_Int64 SAL_CALL ScAutoFormatObj::getSomething(
455                 const uno::Sequence<sal_Int8 >& rId ) throw(uno::RuntimeException)
456 {
457     if ( rId.getLength() == 16 &&
458           0 == rtl_compareMemory( getUnoTunnelId().getConstArray(),
459                                     rId.getConstArray(), 16 ) )
460     {
461         return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this));
462     }
463     return 0;
464 }
465 
466 // static
getUnoTunnelId()467 const uno::Sequence<sal_Int8>& ScAutoFormatObj::getUnoTunnelId()
468 {
469     static uno::Sequence<sal_Int8> * pSeq = 0;
470     if( !pSeq )
471     {
472         osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() );
473         if( !pSeq )
474         {
475             static uno::Sequence< sal_Int8 > aSeq( 16 );
476             rtl_createUuid( (sal_uInt8*)aSeq.getArray(), 0, sal_True );
477             pSeq = &aSeq;
478         }
479     }
480     return *pSeq;
481 }
482 
483 // static
getImplementation(const uno::Reference<uno::XInterface> xObj)484 ScAutoFormatObj* ScAutoFormatObj::getImplementation(
485                         const uno::Reference<uno::XInterface> xObj )
486 {
487     ScAutoFormatObj* pRet = NULL;
488     uno::Reference<lang::XUnoTunnel> xUT( xObj, uno::UNO_QUERY );
489     if (xUT.is())
490         pRet = reinterpret_cast<ScAutoFormatObj*>(sal::static_int_cast<sal_IntPtr>(xUT->getSomething(getUnoTunnelId())));
491     return pRet;
492 }
493 
Notify(SfxBroadcaster &,const SfxHint &)494 void ScAutoFormatObj::Notify( SfxBroadcaster& /* rBC */, const SfxHint& /* rHint */ )
495 {
496     //  spaeter...
497 }
498 
499 // XTableAutoFormat
500 
GetObjectByIndex_Impl(sal_uInt16 nIndex)501 ScAutoFormatFieldObj* ScAutoFormatObj::GetObjectByIndex_Impl(sal_uInt16 nIndex)
502 {
503     if ( IsInserted() && nIndex < SC_AF_FIELD_COUNT )
504         return new ScAutoFormatFieldObj( nFormatIndex, nIndex );
505 
506     return NULL;
507 }
508 
509 // container::XEnumerationAccess
510 
createEnumeration()511 uno::Reference<container::XEnumeration> SAL_CALL ScAutoFormatObj::createEnumeration()
512                                                     throw(uno::RuntimeException)
513 {
514     ScUnoGuard aGuard;
515     return new ScIndexEnumeration(this, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sheet.TableAutoFormatEnumeration")));
516 }
517 
518 // container::XIndexAccess
519 
getCount()520 sal_Int32 SAL_CALL ScAutoFormatObj::getCount() throw(uno::RuntimeException)
521 {
522     ScUnoGuard aGuard;
523     if (IsInserted())
524         return SC_AF_FIELD_COUNT;   // immer 16 Elemente
525     else
526         return 0;
527 }
528 
getByIndex(sal_Int32 nIndex)529 uno::Any SAL_CALL ScAutoFormatObj::getByIndex( sal_Int32 nIndex )
530                             throw(lang::IndexOutOfBoundsException,
531                                     lang::WrappedTargetException, uno::RuntimeException)
532 {
533     ScUnoGuard aGuard;
534 
535     if ( nIndex < 0 || nIndex >= getCount() )
536         throw lang::IndexOutOfBoundsException();
537 
538     if (IsInserted())
539         return uno::makeAny(uno::Reference< beans::XPropertySet >(GetObjectByIndex_Impl((sal_uInt16)nIndex)));
540     return uno::Any();
541 }
542 
getElementType()543 uno::Type SAL_CALL ScAutoFormatObj::getElementType() throw(uno::RuntimeException)
544 {
545     ScUnoGuard aGuard;
546     return ::getCppuType((const uno::Reference< beans::XPropertySet >*)0);  // muss zu getByIndex passen
547 }
548 
hasElements()549 sal_Bool SAL_CALL ScAutoFormatObj::hasElements() throw(uno::RuntimeException)
550 {
551     ScUnoGuard aGuard;
552     return ( getCount() != 0 );
553 }
554 
555 // container::XNamed
556 
getName()557 rtl::OUString SAL_CALL ScAutoFormatObj::getName() throw(uno::RuntimeException)
558 {
559     ScUnoGuard aGuard;
560     ScAutoFormat* pFormats = ScGlobal::GetAutoFormat();
561     if (pFormats && IsInserted() && nFormatIndex < pFormats->GetCount())
562     {
563         String aName;
564         (*pFormats)[nFormatIndex]->GetName(aName);
565         return aName;
566     }
567     return rtl::OUString();
568 }
569 
setName(const rtl::OUString & aNewName)570 void SAL_CALL ScAutoFormatObj::setName( const rtl::OUString& aNewName )
571                                                 throw(uno::RuntimeException)
572 {
573     ScUnoGuard aGuard;
574     String aNewString(aNewName);
575     ScAutoFormat* pFormats = ScGlobal::GetAutoFormat();
576 
577     sal_uInt16 nDummy;
578     if (pFormats && IsInserted() && nFormatIndex < pFormats->GetCount() &&
579             !lcl_FindAutoFormatIndex( *pFormats, aNewString, nDummy ))
580     {
581         ScAutoFormatData* pData = (*pFormats)[nFormatIndex];
582         DBG_ASSERT(pData,"AutoFormat Daten nicht da");
583 
584         ScAutoFormatData* pNew = new ScAutoFormatData(*pData);
585         pNew->SetName( aNewString );
586 
587         pFormats->AtFree( nFormatIndex );
588         if (pFormats->Insert( pNew ))
589         {
590             nFormatIndex = pFormats->IndexOf( pNew );   // ist evtl. anders einsortiert...
591 
592             //! Notify fuer andere Objekte
593             pFormats->SetSaveLater(sal_True);
594         }
595         else
596         {
597             delete pNew;
598             DBG_ERROR("AutoFormat konnte nicht eingefuegt werden");
599             nFormatIndex = 0;       //! alter Index ist ungueltig
600         }
601     }
602     else
603     {
604         //  not inserted or name exists
605         throw uno::RuntimeException();
606     }
607 }
608 
609 // beans::XPropertySet
610 
getPropertySetInfo()611 uno::Reference<beans::XPropertySetInfo> SAL_CALL ScAutoFormatObj::getPropertySetInfo()
612                                                         throw(uno::RuntimeException)
613 {
614     ScUnoGuard aGuard;
615     static uno::Reference< beans::XPropertySetInfo > aRef(new SfxItemPropertySetInfo( aPropSet.getPropertyMap() ));
616     return aRef;
617 }
618 
setPropertyValue(const rtl::OUString & aPropertyName,const uno::Any & aValue)619 void SAL_CALL ScAutoFormatObj::setPropertyValue(
620                         const rtl::OUString& aPropertyName, const uno::Any& aValue )
621                 throw(beans::UnknownPropertyException, beans::PropertyVetoException,
622                         lang::IllegalArgumentException, lang::WrappedTargetException,
623                         uno::RuntimeException)
624 {
625     ScUnoGuard aGuard;
626     ScAutoFormat* pFormats = ScGlobal::GetAutoFormat();
627     if (pFormats && IsInserted() && nFormatIndex < pFormats->GetCount())
628     {
629         ScAutoFormatData* pData = (*pFormats)[nFormatIndex];
630         DBG_ASSERT(pData,"AutoFormat Daten nicht da");
631 
632         String aPropString(aPropertyName);
633         sal_Bool bBool = sal_Bool();
634         if (aPropString.EqualsAscii( SC_UNONAME_INCBACK ) && (aValue >>= bBool))
635             pData->SetIncludeBackground( bBool );
636         else if (aPropString.EqualsAscii( SC_UNONAME_INCBORD ) && (aValue >>= bBool))
637             pData->SetIncludeFrame( bBool );
638         else if (aPropString.EqualsAscii( SC_UNONAME_INCFONT ) && (aValue >>= bBool))
639             pData->SetIncludeFont( bBool );
640         else if (aPropString.EqualsAscii( SC_UNONAME_INCJUST ) && (aValue >>= bBool))
641             pData->SetIncludeJustify( bBool );
642         else if (aPropString.EqualsAscii( SC_UNONAME_INCNUM ) && (aValue >>= bBool))
643             pData->SetIncludeValueFormat( bBool );
644         else if (aPropString.EqualsAscii( SC_UNONAME_INCWIDTH ) && (aValue >>= bBool))
645             pData->SetIncludeWidthHeight( bBool );
646 
647         // else Fehler
648 
649         //! Notify fuer andere Objekte
650         pFormats->SetSaveLater(sal_True);
651     }
652 }
653 
getPropertyValue(const rtl::OUString & aPropertyName)654 uno::Any SAL_CALL ScAutoFormatObj::getPropertyValue( const rtl::OUString& aPropertyName )
655                 throw(beans::UnknownPropertyException, lang::WrappedTargetException,
656                         uno::RuntimeException)
657 {
658     ScUnoGuard aGuard;
659     uno::Any aAny;
660 
661     ScAutoFormat* pFormats = ScGlobal::GetAutoFormat();
662     if (pFormats && IsInserted() && nFormatIndex < pFormats->GetCount())
663     {
664         ScAutoFormatData* pData = (*pFormats)[nFormatIndex];
665         DBG_ASSERT(pData,"AutoFormat Daten nicht da");
666 
667         sal_Bool bValue;
668         sal_Bool bError = sal_False;
669 
670         String aPropString(aPropertyName);
671         if (aPropString.EqualsAscii( SC_UNONAME_INCBACK ))
672             bValue = pData->GetIncludeBackground();
673         else if (aPropString.EqualsAscii( SC_UNONAME_INCBORD ))
674             bValue = pData->GetIncludeFrame();
675         else if (aPropString.EqualsAscii( SC_UNONAME_INCFONT ))
676             bValue = pData->GetIncludeFont();
677         else if (aPropString.EqualsAscii( SC_UNONAME_INCJUST ))
678             bValue = pData->GetIncludeJustify();
679         else if (aPropString.EqualsAscii( SC_UNONAME_INCNUM ))
680             bValue = pData->GetIncludeValueFormat();
681         else if (aPropString.EqualsAscii( SC_UNONAME_INCWIDTH ))
682             bValue = pData->GetIncludeWidthHeight();
683         else
684             bError = sal_True;      // unbekannte Property
685 
686         if (!bError)
687             aAny <<= bValue;
688     }
689 
690     return aAny;
691 }
692 
SC_IMPL_DUMMY_PROPERTY_LISTENER(ScAutoFormatObj)693 SC_IMPL_DUMMY_PROPERTY_LISTENER( ScAutoFormatObj )
694 
695 //------------------------------------------------------------------------
696 
697 ScAutoFormatFieldObj::ScAutoFormatFieldObj(sal_uInt16 nFormat, sal_uInt16 nField) :
698     aPropSet( lcl_GetAutoFieldMap() ),
699     nFormatIndex( nFormat ),
700     nFieldIndex( nField )
701 {
702     //! Listening !!!
703 }
704 
~ScAutoFormatFieldObj()705 ScAutoFormatFieldObj::~ScAutoFormatFieldObj()
706 {
707 }
708 
Notify(SfxBroadcaster &,const SfxHint &)709 void ScAutoFormatFieldObj::Notify( SfxBroadcaster& /* rBC */, const SfxHint& /* rHint */ )
710 {
711     //  spaeter...
712 }
713 
714 // beans::XPropertySet
715 
getPropertySetInfo()716 uno::Reference<beans::XPropertySetInfo> SAL_CALL ScAutoFormatFieldObj::getPropertySetInfo()
717                                                         throw(uno::RuntimeException)
718 {
719     ScUnoGuard aGuard;
720     static uno::Reference< beans::XPropertySetInfo > aRef(new SfxItemPropertySetInfo( aPropSet.getPropertyMap() ));
721     return aRef;
722 }
723 
setPropertyValue(const rtl::OUString & aPropertyName,const uno::Any & aValue)724 void SAL_CALL ScAutoFormatFieldObj::setPropertyValue(
725                         const rtl::OUString& aPropertyName, const uno::Any& aValue )
726                 throw(beans::UnknownPropertyException, beans::PropertyVetoException,
727                         lang::IllegalArgumentException, lang::WrappedTargetException,
728                         uno::RuntimeException)
729 {
730     ScUnoGuard aGuard;
731     ScAutoFormat* pFormats = ScGlobal::GetAutoFormat();
732     const SfxItemPropertySimpleEntry* pEntry =
733             aPropSet.getPropertyMap()->getByName( aPropertyName );
734 
735     if ( pEntry && pEntry->nWID && pFormats && nFormatIndex < pFormats->GetCount() )
736     {
737         ScAutoFormatData* pData = (*pFormats)[nFormatIndex];
738 
739         if ( IsScItemWid( pEntry->nWID ) )
740         {
741             if( const SfxPoolItem* pItem = pData->GetItem( nFieldIndex, pEntry->nWID ) )
742             {
743                 sal_Bool bDone = sal_False;
744 
745                 switch( pEntry->nWID )
746                 {
747                     case ATTR_STACKED:
748                     {
749                         table::CellOrientation eOrient;
750                         if( aValue >>= eOrient )
751                         {
752                             switch( eOrient )
753                             {
754                                 case table::CellOrientation_STANDARD:
755                                     pData->PutItem( nFieldIndex, SfxBoolItem( ATTR_STACKED, sal_False ) );
756                                 break;
757                                 case table::CellOrientation_TOPBOTTOM:
758                                     pData->PutItem( nFieldIndex, SfxBoolItem( ATTR_STACKED, sal_False ) );
759                                     pData->PutItem( nFieldIndex, SfxInt32Item( ATTR_ROTATE_VALUE, 27000 ) );
760                                 break;
761                                 case table::CellOrientation_BOTTOMTOP:
762                                     pData->PutItem( nFieldIndex, SfxBoolItem( ATTR_STACKED, sal_False ) );
763                                     pData->PutItem( nFieldIndex, SfxInt32Item( ATTR_ROTATE_VALUE, 9000 ) );
764                                 break;
765                                 case table::CellOrientation_STACKED:
766                                     pData->PutItem( nFieldIndex, SfxBoolItem( ATTR_STACKED, sal_True ) );
767                                 break;
768                                 default:
769                                 {
770                                     // added to avoid warnings
771                                 }
772                             }
773                             bDone = sal_True;
774                         }
775                     }
776                     break;
777                     default:
778                         SfxPoolItem* pNewItem = pItem->Clone();
779                         bDone = pNewItem->PutValue( aValue, pEntry->nMemberId );
780                         if (bDone)
781                             pData->PutItem( nFieldIndex, *pNewItem );
782                         delete pNewItem;
783                 }
784 
785                 if (bDone)
786                     //! Notify fuer andere Objekte?
787                     pFormats->SetSaveLater(sal_True);
788             }
789         }
790         else
791         {
792             switch (pEntry->nWID)
793             {
794                 case SC_WID_UNO_TBLBORD:
795                     {
796                         table::TableBorder aBorder;
797                         if ( aValue >>= aBorder )   // empty = nothing to do
798                         {
799                             SvxBoxItem aOuter(ATTR_BORDER);
800                             SvxBoxInfoItem aInner(ATTR_BORDER_INNER);
801                             ScHelperFunctions::FillBoxItems( aOuter, aInner, aBorder );
802                             pData->PutItem( nFieldIndex, aOuter );
803 
804                             //! Notify fuer andere Objekte?
805                             pFormats->SetSaveLater(sal_True);
806                         }
807                     }
808                     break;
809             }
810         }
811     }
812 }
813 
getPropertyValue(const rtl::OUString & aPropertyName)814 uno::Any SAL_CALL ScAutoFormatFieldObj::getPropertyValue( const rtl::OUString& aPropertyName )
815                 throw(beans::UnknownPropertyException, lang::WrappedTargetException,
816                         uno::RuntimeException)
817 {
818     ScUnoGuard aGuard;
819     uno::Any aVal;
820 
821     ScAutoFormat* pFormats = ScGlobal::GetAutoFormat();
822     const SfxItemPropertySimpleEntry* pEntry =
823             aPropSet.getPropertyMap()->getByName( aPropertyName );
824 
825     if ( pEntry && pEntry->nWID && pFormats && nFormatIndex < pFormats->GetCount() )
826     {
827         const ScAutoFormatData* pData = (*pFormats)[nFormatIndex];
828 
829         if ( IsScItemWid( pEntry->nWID ) )
830         {
831             if( const SfxPoolItem* pItem = pData->GetItem( nFieldIndex, pEntry->nWID ) )
832             {
833                 switch( pEntry->nWID )
834                 {
835                     case ATTR_STACKED:
836                     {
837                         const SfxInt32Item* pRotItem = (const SfxInt32Item*)pData->GetItem( nFieldIndex, ATTR_ROTATE_VALUE );
838                         sal_Int32 nRot = pRotItem ? pRotItem->GetValue() : 0;
839                         sal_Bool bStacked = ((const SfxBoolItem*)pItem)->GetValue();
840                         SvxOrientationItem( nRot, bStacked, 0 ).QueryValue( aVal );
841                     }
842                     break;
843                     default:
844                         pItem->QueryValue( aVal, pEntry->nMemberId );
845                 }
846             }
847         }
848         else
849         {
850             switch (pEntry->nWID)
851             {
852                 case SC_WID_UNO_TBLBORD:
853                     {
854                         const SfxPoolItem* pItem = pData->GetItem(nFieldIndex, ATTR_BORDER);
855                         if (pItem)
856                         {
857                             SvxBoxItem aOuter(*(static_cast<const SvxBoxItem*>(pItem)));
858                             SvxBoxInfoItem aInner(ATTR_BORDER_INNER);
859 
860                             table::TableBorder aBorder;
861                             ScHelperFunctions::FillTableBorder( aBorder, aOuter, aInner );
862                             aVal <<= aBorder;
863                         }
864                     }
865                     break;
866             }
867         }
868     }
869 
870     return aVal;
871 }
872 
873 SC_IMPL_DUMMY_PROPERTY_LISTENER( ScAutoFormatFieldObj )
874 
875 //------------------------------------------------------------------------
876 
877 
878 
879