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