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