Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*************************************************************************
3 : : *
4 : : * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 : : *
6 : : * Copyright 2000, 2010 Oracle and/or its affiliates.
7 : : *
8 : : * OpenOffice.org - a multi-platform office productivity suite
9 : : *
10 : : * This file is part of OpenOffice.org.
11 : : *
12 : : * OpenOffice.org is free software: you can redistribute it and/or modify
13 : : * it under the terms of the GNU Lesser General Public License version 3
14 : : * only, as published by the Free Software Foundation.
15 : : *
16 : : * OpenOffice.org is distributed in the hope that it will be useful,
17 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : : * GNU Lesser General Public License version 3 for more details
20 : : * (a copy is included in the LICENSE file that accompanied this code).
21 : : *
22 : : * You should have received a copy of the GNU Lesser General Public License
23 : : * version 3 along with OpenOffice.org. If not, see
24 : : * <http://www.openoffice.org/license.html>
25 : : * for a copy of the LGPLv3 License.
26 : : *
27 : : ************************************************************************/
28 : :
29 : : #include <vcl/image.hxx>
30 : : #include <vcl/virdev.hxx>
31 : : #include <toolkit/unohlp.hxx>
32 : : #include <svl/itemprop.hxx>
33 : : #include <svl/smplhint.hxx>
34 : : #include <vcl/svapp.hxx>
35 : : #include <vcl/settings.hxx>
36 : : #include <com/sun/star/awt/XBitmap.hpp>
37 : :
38 : : #include "targuno.hxx"
39 : : #include "miscuno.hxx"
40 : : #include "docuno.hxx"
41 : : #include "datauno.hxx"
42 : : #include "nameuno.hxx"
43 : : #include "docsh.hxx"
44 : : #include "content.hxx"
45 : : #include "scresid.hxx"
46 : : #include "sc.hrc"
47 : : #include "unonames.hxx"
48 : :
49 : : using namespace ::com::sun::star;
50 : :
51 : : //------------------------------------------------------------------------
52 : :
53 : : sal_uInt16 nTypeResIds[SC_LINKTARGETTYPE_COUNT] =
54 : : {
55 : : SCSTR_CONTENT_TABLE, // SC_LINKTARGETTYPE_SHEET
56 : : SCSTR_CONTENT_RANGENAME, // SC_LINKTARGETTYPE_RANGENAME
57 : : SCSTR_CONTENT_DBAREA // SC_LINKTARGETTYPE_DBAREA
58 : : };
59 : :
60 : 0 : const SfxItemPropertyMapEntry* lcl_GetLinkTargetMap()
61 : : {
62 : : static SfxItemPropertyMapEntry aLinkTargetMap_Impl[] =
63 : : {
64 [ # # ]: 0 : {MAP_CHAR_LEN(SC_UNO_LINKDISPBIT), 0, &getCppuType((const uno::Reference<awt::XBitmap>*)0), beans::PropertyAttribute::READONLY, 0 },
65 [ # # ]: 0 : {MAP_CHAR_LEN(SC_UNO_LINKDISPNAME), 0, &getCppuType((const ::rtl::OUString*)0), beans::PropertyAttribute::READONLY, 0 },
66 : : {0,0,0,0,0,0}
67 [ # # ][ # # ]: 0 : };
[ # # ]
68 : 0 : return aLinkTargetMap_Impl;
69 : : }
70 : :
71 : : //------------------------------------------------------------------------
72 : :
73 : : // service for ScLinkTargetTypeObj is not defined
74 : : // must not support document::LinkTarget because the target type cannot be used as a target
75 : :
76 [ # # ]: 0 : SC_SIMPLE_SERVICE_INFO( ScLinkTargetTypesObj, "ScLinkTargetTypesObj", "com.sun.star.document.LinkTargets" )
77 [ # # ]: 0 : SC_SIMPLE_SERVICE_INFO( ScLinkTargetTypeObj, "ScLinkTargetTypeObj", "com.sun.star.document.LinkTargetSupplier" )
78 [ # # ]: 0 : SC_SIMPLE_SERVICE_INFO( ScLinkTargetsObj, "ScLinkTargetsObj", "com.sun.star.document.LinkTargets" )
79 : :
80 : : //------------------------------------------------------------------------
81 : :
82 : 1 : ScLinkTargetTypesObj::ScLinkTargetTypesObj(ScDocShell* pDocSh) :
83 [ + - ][ + - ]: 4 : pDocShell( pDocSh )
[ + + # #
# # ]
84 : : {
85 [ + - ]: 1 : pDocShell->GetDocument()->AddUnoObject(*this);
86 : :
87 [ + + ]: 4 : for (sal_uInt16 i=0; i<SC_LINKTARGETTYPE_COUNT; i++)
88 [ + - ][ + - ]: 3 : aNames[i] = String( ScResId( nTypeResIds[i] ) );
[ + - ][ + - ]
89 [ # # # # ]: 1 : }
90 : :
91 [ + - ][ + - ]: 4 : ScLinkTargetTypesObj::~ScLinkTargetTypesObj()
92 : : {
93 [ - + ]: 1 : if (pDocShell)
94 [ # # ]: 0 : pDocShell->GetDocument()->RemoveUnoObject(*this);
95 [ + - ][ + + ]: 6 : }
[ - + ]
[ # # # # ]
96 : :
97 : 67 : void ScLinkTargetTypesObj::Notify( SfxBroadcaster&, const SfxHint& rHint )
98 : : {
99 [ + - ][ + + ]: 67 : if ( rHint.ISA( SfxSimpleHint ) && ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING )
[ + + ]
100 : 1 : pDocShell = NULL; // document gone
101 : 67 : }
102 : :
103 : : // container::XNameAccess
104 : :
105 : 0 : uno::Any SAL_CALL ScLinkTargetTypesObj::getByName(const rtl::OUString& aName)
106 : : throw( container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException )
107 : : {
108 [ # # ]: 0 : if (pDocShell)
109 : : {
110 [ # # ]: 0 : String aNameStr(aName);
111 [ # # ]: 0 : for (sal_uInt16 i=0; i<SC_LINKTARGETTYPE_COUNT; i++)
112 [ # # ][ # # ]: 0 : if ( aNames[i] == aNameStr )
113 [ # # ][ # # ]: 0 : return uno::makeAny(uno::Reference< beans::XPropertySet >(new ScLinkTargetTypeObj( pDocShell, i )));
[ # # ][ # # ]
[ # # ][ # # ]
114 : : }
115 : :
116 [ # # ]: 0 : throw container::NoSuchElementException();
117 : : }
118 : :
119 : 1 : uno::Sequence<rtl::OUString> SAL_CALL ScLinkTargetTypesObj::getElementNames(void) throw( uno::RuntimeException )
120 : : {
121 : 1 : uno::Sequence<rtl::OUString> aRet(SC_LINKTARGETTYPE_COUNT);
122 [ + - ]: 1 : rtl::OUString* pArray = aRet.getArray();
123 [ + + ]: 4 : for (sal_uInt16 i=0; i<SC_LINKTARGETTYPE_COUNT; i++)
124 [ + - ]: 3 : pArray[i] = aNames[i];
125 : 1 : return aRet;
126 : : }
127 : :
128 : 0 : sal_Bool SAL_CALL ScLinkTargetTypesObj::hasByName(const rtl::OUString& aName) throw( uno::RuntimeException )
129 : : {
130 [ # # ]: 0 : String aNameStr = aName;
131 [ # # ]: 0 : for (sal_uInt16 i=0; i<SC_LINKTARGETTYPE_COUNT; i++)
132 [ # # ][ # # ]: 0 : if ( aNames[i] == aNameStr )
133 : 0 : return sal_True;
134 [ # # ]: 0 : return false;
135 : : }
136 : :
137 : : // container::XElementAccess
138 : :
139 : 0 : uno::Type SAL_CALL ScLinkTargetTypesObj::getElementType(void) throw( uno::RuntimeException )
140 : : {
141 : 0 : return ::getCppuType((const uno::Reference< beans::XPropertySet >*)0);
142 : : }
143 : :
144 : 0 : sal_Bool SAL_CALL ScLinkTargetTypesObj::hasElements(void) throw( uno::RuntimeException )
145 : : {
146 : 0 : return sal_True;
147 : : }
148 : :
149 : : //------------------------------------------------------------------------
150 : :
151 : 0 : ScLinkTargetTypeObj::ScLinkTargetTypeObj(ScDocShell* pDocSh, sal_uInt16 nT) :
152 : : pDocShell( pDocSh ),
153 [ # # ][ # # ]: 0 : nType( nT )
154 : : {
155 [ # # ]: 0 : pDocShell->GetDocument()->AddUnoObject(*this);
156 [ # # ][ # # ]: 0 : aName = String( ScResId( nTypeResIds[nType] ) ); //! on demand?
[ # # ][ # # ]
157 : 0 : }
158 : :
159 [ # # ][ # # ]: 0 : ScLinkTargetTypeObj::~ScLinkTargetTypeObj()
160 : : {
161 [ # # ]: 0 : if (pDocShell)
162 [ # # ]: 0 : pDocShell->GetDocument()->RemoveUnoObject(*this);
163 [ # # ]: 0 : }
164 : :
165 : 0 : void ScLinkTargetTypeObj::Notify( SfxBroadcaster&, const SfxHint& rHint )
166 : : {
167 [ # # ][ # # ]: 0 : if ( rHint.ISA( SfxSimpleHint ) && ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING )
[ # # ]
168 : 0 : pDocShell = NULL; // document gone
169 : 0 : }
170 : :
171 : : // document::XLinkTargetSupplier
172 : :
173 : 0 : uno::Reference< container::XNameAccess > SAL_CALL ScLinkTargetTypeObj::getLinks(void) throw( uno::RuntimeException )
174 : : {
175 : 0 : uno::Reference< container::XNameAccess > xCollection;
176 : :
177 [ # # ]: 0 : if ( pDocShell )
178 : : {
179 [ # # # # ]: 0 : switch ( nType )
180 : : {
181 : : case SC_LINKTARGETTYPE_SHEET:
182 [ # # ][ # # ]: 0 : xCollection.set(new ScTableSheetsObj(pDocShell));
[ # # ]
183 : 0 : break;
184 : : case SC_LINKTARGETTYPE_RANGENAME:
185 [ # # ][ # # ]: 0 : xCollection.set(new ScGlobalNamedRangesObj(pDocShell));
[ # # ]
186 : 0 : break;
187 : : case SC_LINKTARGETTYPE_DBAREA:
188 [ # # ][ # # ]: 0 : xCollection.set(new ScDatabaseRangesObj(pDocShell));
[ # # ]
189 : 0 : break;
190 : : default:
191 : : OSL_FAIL("invalid type");
192 : : }
193 : : }
194 : :
195 : : // wrap collection in ScLinkTargetsObj because service document::LinkTargets requires
196 : : // beans::XPropertySet as ElementType in container::XNameAccess.
197 [ # # ]: 0 : if ( xCollection.is() )
198 [ # # ][ # # ]: 0 : return new ScLinkTargetsObj( xCollection );
[ # # ]
199 [ # # ]: 0 : return NULL;
200 : : }
201 : :
202 : : // beans::XPropertySet
203 : :
204 : 0 : uno::Reference< beans::XPropertySetInfo > SAL_CALL ScLinkTargetTypeObj::getPropertySetInfo(void) throw( uno::RuntimeException )
205 : : {
206 [ # # ]: 0 : SolarMutexGuard aGuard;
207 [ # # ][ # # ]: 0 : static uno::Reference< beans::XPropertySetInfo > aRef(new SfxItemPropertySetInfo( lcl_GetLinkTargetMap() ));
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
208 [ # # ]: 0 : return aRef;
209 : : }
210 : :
211 : 0 : void SAL_CALL ScLinkTargetTypeObj::setPropertyValue(const rtl::OUString& /* aPropertyName */,
212 : : const uno::Any& /* aValue */)
213 : : throw( beans::UnknownPropertyException,
214 : : beans::PropertyVetoException,
215 : : lang::IllegalArgumentException,
216 : : lang::WrappedTargetException,
217 : : uno::RuntimeException )
218 : : {
219 : : // everything is read-only
220 : : //! exception?
221 : 0 : }
222 : :
223 : 0 : void ScLinkTargetTypeObj::SetLinkTargetBitmap( uno::Any& rRet, sal_uInt16 nType )
224 : : {
225 : 0 : sal_uInt16 nImgId = 0;
226 [ # # # # ]: 0 : switch ( nType )
227 : : {
228 : : case SC_LINKTARGETTYPE_SHEET:
229 : 0 : nImgId = SC_CONTENT_TABLE;
230 : 0 : break;
231 : : case SC_LINKTARGETTYPE_RANGENAME:
232 : 0 : nImgId = SC_CONTENT_RANGENAME;
233 : 0 : break;
234 : : case SC_LINKTARGETTYPE_DBAREA:
235 : 0 : nImgId = SC_CONTENT_DBAREA;
236 : 0 : break;
237 : : }
238 [ # # ]: 0 : if (nImgId)
239 : : {
240 [ # # ][ # # ]: 0 : ImageList aEntryImages( ScResId( RID_IMAGELIST_NAVCONT ) );
241 [ # # ]: 0 : const Image& rImage = aEntryImages.GetImage( nImgId );
242 [ # # ][ # # ]: 0 : rRet <<= uno::Reference< awt::XBitmap > (VCLUnoHelper::CreateBitmap( rImage.GetBitmapEx() ));
[ # # ][ # # ]
[ # # ][ # # ]
243 : : }
244 : 0 : }
245 : :
246 : 0 : uno::Any SAL_CALL ScLinkTargetTypeObj::getPropertyValue(const rtl::OUString& PropertyName)
247 : : throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
248 : : {
249 : 0 : uno::Any aRet;
250 [ # # ]: 0 : String aNameStr(PropertyName);
251 [ # # ][ # # ]: 0 : if ( aNameStr.EqualsAscii( SC_UNO_LINKDISPBIT ) )
252 [ # # ]: 0 : SetLinkTargetBitmap( aRet, nType );
253 [ # # ][ # # ]: 0 : else if ( aNameStr.EqualsAscii( SC_UNO_LINKDISPNAME ) )
254 [ # # ][ # # ]: 0 : aRet <<= rtl::OUString( aName );
255 : :
256 [ # # ]: 0 : return aRet;
257 : : }
258 : :
259 : 0 : SC_IMPL_DUMMY_PROPERTY_LISTENER( ScLinkTargetTypeObj )
260 : :
261 : : //------------------------------------------------------------------------
262 : :
263 : 0 : ScLinkTargetsObj::ScLinkTargetsObj( const uno::Reference< container::XNameAccess > & rColl ) :
264 : 0 : xCollection( rColl )
265 : : {
266 : : OSL_ENSURE( xCollection.is(), "ScLinkTargetsObj: NULL" );
267 : 0 : }
268 : :
269 : 0 : ScLinkTargetsObj::~ScLinkTargetsObj()
270 : : {
271 [ # # ]: 0 : }
272 : :
273 : : // container::XNameAccess
274 : :
275 : 0 : uno::Any SAL_CALL ScLinkTargetsObj::getByName(const rtl::OUString& aName)
276 : : throw( container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException )
277 : : {
278 [ # # ][ # # ]: 0 : uno::Reference< beans::XPropertySet > xProp( ScUnoHelpFunctions::AnyToInterface( xCollection->getByName(aName) ), uno::UNO_QUERY );
[ # # ][ # # ]
279 [ # # ]: 0 : if (xProp.is())
280 [ # # ]: 0 : return uno::makeAny(xProp);
281 : :
282 [ # # ]: 0 : throw container::NoSuchElementException();
283 : : // return uno::Any();
284 : : }
285 : :
286 : 0 : uno::Sequence<rtl::OUString> SAL_CALL ScLinkTargetsObj::getElementNames(void) throw( uno::RuntimeException )
287 : : {
288 : 0 : return xCollection->getElementNames();
289 : : }
290 : :
291 : 0 : sal_Bool SAL_CALL ScLinkTargetsObj::hasByName(const rtl::OUString& aName) throw( uno::RuntimeException )
292 : : {
293 : 0 : return xCollection->hasByName(aName);
294 : : }
295 : :
296 : : // container::XElementAccess
297 : :
298 : 0 : uno::Type SAL_CALL ScLinkTargetsObj::getElementType(void) throw( uno::RuntimeException )
299 : : {
300 : 0 : return ::getCppuType((const uno::Reference< beans::XPropertySet >*)0);
301 : : }
302 : :
303 : 0 : sal_Bool SAL_CALL ScLinkTargetsObj::hasElements(void) throw( uno::RuntimeException )
304 : : {
305 : 0 : return xCollection->hasElements();
306 : : }
307 : :
308 : :
309 : :
310 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|