xref: /aoo42x/main/sd/source/ui/unoidl/unolayer.cxx (revision 5b190011)
1*5b190011SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*5b190011SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*5b190011SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*5b190011SAndrew Rist  * distributed with this work for additional information
6*5b190011SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*5b190011SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*5b190011SAndrew Rist  * "License"); you may not use this file except in compliance
9*5b190011SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*5b190011SAndrew Rist  *
11*5b190011SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*5b190011SAndrew Rist  *
13*5b190011SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*5b190011SAndrew Rist  * software distributed under the License is distributed on an
15*5b190011SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*5b190011SAndrew Rist  * KIND, either express or implied.  See the License for the
17*5b190011SAndrew Rist  * specific language governing permissions and limitations
18*5b190011SAndrew Rist  * under the License.
19*5b190011SAndrew Rist  *
20*5b190011SAndrew Rist  *************************************************************/
21*5b190011SAndrew Rist 
22*5b190011SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sd.hxx"
26cdf0e10cSrcweir #include <com/sun/star/lang/DisposedException.hpp>
27cdf0e10cSrcweir 
28cdf0e10cSrcweir #include "unolayer.hxx"
29cdf0e10cSrcweir #include <osl/mutex.hxx>
30cdf0e10cSrcweir #include <vos/mutex.hxx>
31cdf0e10cSrcweir 
32cdf0e10cSrcweir #include <svx/svdpagv.hxx>
33cdf0e10cSrcweir #include <svx/unoshape.hxx>
34cdf0e10cSrcweir #include <svx/svdobj.hxx>
35cdf0e10cSrcweir #include <comphelper/serviceinfohelper.hxx>
36cdf0e10cSrcweir 
37cdf0e10cSrcweir // folgende fuer InsertSdPage()
38cdf0e10cSrcweir #include <svx/svdlayer.hxx>
39cdf0e10cSrcweir 
40cdf0e10cSrcweir #ifndef SVX_LIGHT
41cdf0e10cSrcweir #ifndef SD_DRAW_DOC_SHELL_HXX
42cdf0e10cSrcweir #include "DrawDocShell.hxx"
43cdf0e10cSrcweir #endif
44cdf0e10cSrcweir #endif
45cdf0e10cSrcweir #include <drawdoc.hxx>
46cdf0e10cSrcweir #include <unomodel.hxx>
47cdf0e10cSrcweir #include "unoprnms.hxx"
48cdf0e10cSrcweir #include <com/sun/star/lang/NoSupportException.hpp>
49cdf0e10cSrcweir #include <svx/svdpool.hxx>
50cdf0e10cSrcweir #include "unohelp.hxx"
51cdf0e10cSrcweir #include "FrameView.hxx"
52cdf0e10cSrcweir #include "DrawViewShell.hxx"
53cdf0e10cSrcweir #include "View.hxx"
54cdf0e10cSrcweir #include "ViewShell.hxx"
55cdf0e10cSrcweir #include "app.hrc"
56cdf0e10cSrcweir #include "strings.hrc"
57cdf0e10cSrcweir #include "sdresid.hxx"
58cdf0e10cSrcweir #include "glob.hrc"
59cdf0e10cSrcweir 
60cdf0e10cSrcweir #include "unokywds.hxx"
61cdf0e10cSrcweir #include "unowcntr.hxx"
62cdf0e10cSrcweir #include <vcl/svapp.hxx>
63cdf0e10cSrcweir 
64cdf0e10cSrcweir using namespace ::rtl;
65cdf0e10cSrcweir using namespace ::vos;
66cdf0e10cSrcweir using namespace ::com::sun::star;
67cdf0e10cSrcweir 
68cdf0e10cSrcweir //=============================================================================
69cdf0e10cSrcweir // class SdLayer
70cdf0e10cSrcweir //=============================================================================
71cdf0e10cSrcweir 
72cdf0e10cSrcweir #define WID_LAYER_LOCKED	1
73cdf0e10cSrcweir #define WID_LAYER_PRINTABLE	2
74cdf0e10cSrcweir #define WID_LAYER_VISIBLE	3
75cdf0e10cSrcweir #define WID_LAYER_NAME		4
76cdf0e10cSrcweir #define WID_LAYER_TITLE		5
77cdf0e10cSrcweir #define WID_LAYER_DESC		6
78cdf0e10cSrcweir 
79cdf0e10cSrcweir const SvxItemPropertySet* ImplGetSdLayerPropertySet()
80cdf0e10cSrcweir {
81cdf0e10cSrcweir 	static const SfxItemPropertyMapEntry aSdLayerPropertyMap_Impl[] =
82cdf0e10cSrcweir 	{
83cdf0e10cSrcweir 		{ MAP_CHAR_LEN(UNO_NAME_LAYER_LOCKED),		WID_LAYER_LOCKED,	&::getBooleanCppuType(),			0, 0 },
84cdf0e10cSrcweir 		{ MAP_CHAR_LEN(UNO_NAME_LAYER_PRINTABLE),	WID_LAYER_PRINTABLE,&::getBooleanCppuType(),			0, 0 },
85cdf0e10cSrcweir 		{ MAP_CHAR_LEN(UNO_NAME_LAYER_VISIBLE),		WID_LAYER_VISIBLE,	&::getBooleanCppuType(),			0, 0 },
86cdf0e10cSrcweir 		{ MAP_CHAR_LEN(UNO_NAME_LAYER_NAME),		WID_LAYER_NAME,		&::getCppuType((const OUString*)0),	0, 0 },
87cdf0e10cSrcweir 		{ MAP_CHAR_LEN("Title"),					WID_LAYER_TITLE,	&::getCppuType((const OUString*)0),	0, 0 },
88cdf0e10cSrcweir 		{ MAP_CHAR_LEN("Description"),				WID_LAYER_DESC,		&::getCppuType((const OUString*)0),	0, 0 },
89cdf0e10cSrcweir 		{ 0,0,0,0,0,0}
90cdf0e10cSrcweir 	};
91cdf0e10cSrcweir     static SvxItemPropertySet aSDLayerPropertySet_Impl( aSdLayerPropertyMap_Impl, SdrObject::GetGlobalDrawObjectItemPool() );
92cdf0e10cSrcweir     return &aSDLayerPropertySet_Impl;
93cdf0e10cSrcweir }
94cdf0e10cSrcweir 
95cdf0e10cSrcweir String SdLayer::convertToInternalName( const OUString& rName )
96cdf0e10cSrcweir {
97cdf0e10cSrcweir 	if( rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(sUNO_LayerName_background) ) )
98cdf0e10cSrcweir 	{
99cdf0e10cSrcweir 		return String( SdResId( STR_LAYER_BCKGRND ) );
100cdf0e10cSrcweir 	}
101cdf0e10cSrcweir 	else if( rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(sUNO_LayerName_background_objects) ) )
102cdf0e10cSrcweir 	{
103cdf0e10cSrcweir 		return  String( SdResId( STR_LAYER_BCKGRNDOBJ ) );
104cdf0e10cSrcweir 	}
105cdf0e10cSrcweir 	else if( rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(sUNO_LayerName_layout) ) )
106cdf0e10cSrcweir 	{
107cdf0e10cSrcweir 		return  String( SdResId( STR_LAYER_LAYOUT ) );
108cdf0e10cSrcweir 	}
109cdf0e10cSrcweir 	else if( rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(sUNO_LayerName_controls) ) )
110cdf0e10cSrcweir 	{
111cdf0e10cSrcweir 		return  String( SdResId( STR_LAYER_CONTROLS ) );
112cdf0e10cSrcweir 	}
113cdf0e10cSrcweir 	else if( rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(sUNO_LayerName_measurelines) ) )
114cdf0e10cSrcweir 	{
115cdf0e10cSrcweir 		return  String( SdResId( STR_LAYER_MEASURELINES ) );
116cdf0e10cSrcweir 	}
117cdf0e10cSrcweir 	else
118cdf0e10cSrcweir 	{
119cdf0e10cSrcweir 		return String( rName );
120cdf0e10cSrcweir 	}
121cdf0e10cSrcweir }
122cdf0e10cSrcweir 
123cdf0e10cSrcweir OUString SdLayer::convertToExternalName( const String& rName )
124cdf0e10cSrcweir {
125cdf0e10cSrcweir 	const String aCompare( rName );
126cdf0e10cSrcweir 	if( rName == String( SdResId( STR_LAYER_BCKGRND ) ) )
127cdf0e10cSrcweir 	{
128cdf0e10cSrcweir 		return OUString( RTL_CONSTASCII_USTRINGPARAM(sUNO_LayerName_background) );
129cdf0e10cSrcweir 	}
130cdf0e10cSrcweir 	else if( rName == String( SdResId( STR_LAYER_BCKGRNDOBJ ) ) )
131cdf0e10cSrcweir 	{
132cdf0e10cSrcweir 		return OUString( RTL_CONSTASCII_USTRINGPARAM(sUNO_LayerName_background_objects) );
133cdf0e10cSrcweir 	}
134cdf0e10cSrcweir 	else if( rName == String( SdResId( STR_LAYER_LAYOUT ) ) )
135cdf0e10cSrcweir 	{
136cdf0e10cSrcweir 		return OUString( RTL_CONSTASCII_USTRINGPARAM(sUNO_LayerName_layout) );
137cdf0e10cSrcweir 	}
138cdf0e10cSrcweir 	else if( rName == String( SdResId( STR_LAYER_CONTROLS ) ) )
139cdf0e10cSrcweir 	{
140cdf0e10cSrcweir 		return OUString( RTL_CONSTASCII_USTRINGPARAM(sUNO_LayerName_controls) );
141cdf0e10cSrcweir 	}
142cdf0e10cSrcweir 	else if( rName == String( SdResId( STR_LAYER_MEASURELINES ) ) )
143cdf0e10cSrcweir 	{
144cdf0e10cSrcweir 		return OUString( RTL_CONSTASCII_USTRINGPARAM(sUNO_LayerName_measurelines) );
145cdf0e10cSrcweir 	}
146cdf0e10cSrcweir 	else
147cdf0e10cSrcweir 	{
148cdf0e10cSrcweir 		return OUString( rName );
149cdf0e10cSrcweir 	}
150cdf0e10cSrcweir }
151cdf0e10cSrcweir 
152cdf0e10cSrcweir /** */
153cdf0e10cSrcweir SdLayer::SdLayer( SdLayerManager* pLayerManager_, SdrLayer* pSdrLayer_ ) throw()
154cdf0e10cSrcweir : pLayerManager(pLayerManager_)
155cdf0e10cSrcweir , mxLayerManager(pLayerManager_)
156cdf0e10cSrcweir , pLayer(pSdrLayer_)
157cdf0e10cSrcweir , pPropSet(ImplGetSdLayerPropertySet())
158cdf0e10cSrcweir {
159cdf0e10cSrcweir }
160cdf0e10cSrcweir 
161cdf0e10cSrcweir /** */
162cdf0e10cSrcweir SdLayer::~SdLayer() throw()
163cdf0e10cSrcweir {
164cdf0e10cSrcweir }
165cdf0e10cSrcweir 
166cdf0e10cSrcweir // uno helper
167cdf0e10cSrcweir UNO3_GETIMPLEMENTATION_IMPL( SdLayer );
168cdf0e10cSrcweir 
169cdf0e10cSrcweir // XServiceInfo
170cdf0e10cSrcweir OUString SAL_CALL SdLayer::getImplementationName()
171cdf0e10cSrcweir 	throw(uno::RuntimeException)
172cdf0e10cSrcweir {
173cdf0e10cSrcweir 	return OUString( OUString::createFromAscii(sUNO_SdLayer) );
174cdf0e10cSrcweir }
175cdf0e10cSrcweir 
176cdf0e10cSrcweir sal_Bool SAL_CALL SdLayer::supportsService( const OUString& ServiceName )
177cdf0e10cSrcweir 	throw(uno::RuntimeException)
178cdf0e10cSrcweir {
179cdf0e10cSrcweir 	return comphelper::ServiceInfoHelper::supportsService( ServiceName, getSupportedServiceNames() );
180cdf0e10cSrcweir }
181cdf0e10cSrcweir 
182cdf0e10cSrcweir uno::Sequence< OUString > SAL_CALL SdLayer::getSupportedServiceNames()
183cdf0e10cSrcweir 	throw(uno::RuntimeException)
184cdf0e10cSrcweir {
185cdf0e10cSrcweir 	OUString aServiceName( OUString::createFromAscii(sUNO_Service_DrawingLayer) );
186cdf0e10cSrcweir 	uno::Sequence< OUString > aSeq( &aServiceName, 1 );
187cdf0e10cSrcweir 	return aSeq;
188cdf0e10cSrcweir }
189cdf0e10cSrcweir 
190cdf0e10cSrcweir // beans::XPropertySet
191cdf0e10cSrcweir uno::Reference< beans::XPropertySetInfo > SAL_CALL SdLayer::getPropertySetInfo(  )
192cdf0e10cSrcweir 	throw(uno::RuntimeException)
193cdf0e10cSrcweir {
194cdf0e10cSrcweir 	OGuard aGuard( Application::GetSolarMutex() );
195cdf0e10cSrcweir 	return pPropSet->getPropertySetInfo();
196cdf0e10cSrcweir }
197cdf0e10cSrcweir 
198cdf0e10cSrcweir void SAL_CALL SdLayer::setPropertyValue( const OUString& aPropertyName, const uno::Any& aValue )
199cdf0e10cSrcweir 	throw(beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException)
200cdf0e10cSrcweir {
201cdf0e10cSrcweir 	OGuard aGuard( Application::GetSolarMutex() );
202cdf0e10cSrcweir 
203cdf0e10cSrcweir 	if(pLayer == NULL || pLayerManager == NULL)
204cdf0e10cSrcweir 		throw lang::DisposedException();
205cdf0e10cSrcweir 
206cdf0e10cSrcweir 	const SfxItemPropertySimpleEntry* pEntry = pPropSet->getPropertyMapEntry(aPropertyName);
207cdf0e10cSrcweir 
208cdf0e10cSrcweir 	switch( pEntry ? pEntry->nWID : -1 )
209cdf0e10cSrcweir 	{
210cdf0e10cSrcweir 	case WID_LAYER_LOCKED:
211cdf0e10cSrcweir 	{
212cdf0e10cSrcweir 		sal_Bool bValue = sal_False;
213cdf0e10cSrcweir 		if(!sd::any2bool( aValue, bValue ))
214cdf0e10cSrcweir 			throw lang::IllegalArgumentException();
215cdf0e10cSrcweir 		set( LOCKED, bValue );
216cdf0e10cSrcweir 		break;
217cdf0e10cSrcweir 	}
218cdf0e10cSrcweir 	case WID_LAYER_PRINTABLE:
219cdf0e10cSrcweir 	{
220cdf0e10cSrcweir 		sal_Bool bValue = sal_False;
221cdf0e10cSrcweir 		if(!sd::any2bool( aValue, bValue ))
222cdf0e10cSrcweir 			throw lang::IllegalArgumentException();
223cdf0e10cSrcweir 		set( PRINTABLE, bValue );
224cdf0e10cSrcweir 		break;
225cdf0e10cSrcweir 	}
226cdf0e10cSrcweir 	case WID_LAYER_VISIBLE:
227cdf0e10cSrcweir 	{
228cdf0e10cSrcweir 		sal_Bool bValue = sal_False;
229cdf0e10cSrcweir 		if(!sd::any2bool( aValue, bValue ))
230cdf0e10cSrcweir 			throw lang::IllegalArgumentException();
231cdf0e10cSrcweir 		set( VISIBLE, bValue );
232cdf0e10cSrcweir 		break;
233cdf0e10cSrcweir 	}
234cdf0e10cSrcweir 	case WID_LAYER_NAME:
235cdf0e10cSrcweir 	{
236cdf0e10cSrcweir 		OUString aName;
237cdf0e10cSrcweir 		if(!(aValue >>= aName))
238cdf0e10cSrcweir 			throw lang::IllegalArgumentException();
239cdf0e10cSrcweir 
240cdf0e10cSrcweir 		pLayer->SetName(SdLayer::convertToInternalName( aName ) );
241cdf0e10cSrcweir 		pLayerManager->UpdateLayerView();
242cdf0e10cSrcweir 		break;
243cdf0e10cSrcweir 	}
244cdf0e10cSrcweir 
245cdf0e10cSrcweir 	case WID_LAYER_TITLE:
246cdf0e10cSrcweir 	{
247cdf0e10cSrcweir 		OUString sTitle;
248cdf0e10cSrcweir 		if(!(aValue >>= sTitle))
249cdf0e10cSrcweir 			throw lang::IllegalArgumentException();
250cdf0e10cSrcweir 
251cdf0e10cSrcweir 		pLayer->SetTitle(sTitle);
252cdf0e10cSrcweir 		break;
253cdf0e10cSrcweir 	}
254cdf0e10cSrcweir 
255cdf0e10cSrcweir 	case WID_LAYER_DESC:
256cdf0e10cSrcweir 	{
257cdf0e10cSrcweir 		OUString sDescription;
258cdf0e10cSrcweir 		if(!(aValue >>= sDescription))
259cdf0e10cSrcweir 			throw lang::IllegalArgumentException();
260cdf0e10cSrcweir 
261cdf0e10cSrcweir 		pLayer->SetDescription(sDescription);
262cdf0e10cSrcweir 		break;
263cdf0e10cSrcweir 	}
264cdf0e10cSrcweir 
265cdf0e10cSrcweir 	default:
266cdf0e10cSrcweir 		throw beans::UnknownPropertyException();
267cdf0e10cSrcweir 	}
268cdf0e10cSrcweir 
269cdf0e10cSrcweir #ifndef SVX_LIGHT
270cdf0e10cSrcweir 	if(	pLayerManager->GetDocShell() )
271cdf0e10cSrcweir 		pLayerManager->GetDocShell()->SetModified();
272cdf0e10cSrcweir #endif
273cdf0e10cSrcweir }
274cdf0e10cSrcweir 
275cdf0e10cSrcweir uno::Any SAL_CALL SdLayer::getPropertyValue( const OUString& PropertyName )
276cdf0e10cSrcweir 	throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
277cdf0e10cSrcweir {
278cdf0e10cSrcweir 	OGuard aGuard( Application::GetSolarMutex() );
279cdf0e10cSrcweir 
280cdf0e10cSrcweir 	if(pLayer == NULL || pLayerManager == NULL)
281cdf0e10cSrcweir 		throw lang::DisposedException();
282cdf0e10cSrcweir 
283cdf0e10cSrcweir 	const SfxItemPropertySimpleEntry* pEntry = pPropSet->getPropertyMapEntry(PropertyName);
284cdf0e10cSrcweir 
285cdf0e10cSrcweir 	uno::Any aValue;
286cdf0e10cSrcweir 
287cdf0e10cSrcweir 	switch( pEntry ? pEntry->nWID : -1 )
288cdf0e10cSrcweir 	{
289cdf0e10cSrcweir 	case WID_LAYER_LOCKED:
290cdf0e10cSrcweir 		sd::bool2any( get( LOCKED ), aValue );
291cdf0e10cSrcweir 		break;
292cdf0e10cSrcweir 	case WID_LAYER_PRINTABLE:
293cdf0e10cSrcweir 		sd::bool2any( get( PRINTABLE ), aValue );
294cdf0e10cSrcweir 		break;
295cdf0e10cSrcweir 	case WID_LAYER_VISIBLE:
296cdf0e10cSrcweir 		sd::bool2any( get( VISIBLE ), aValue );
297cdf0e10cSrcweir 		break;
298cdf0e10cSrcweir 	case WID_LAYER_NAME:
299cdf0e10cSrcweir 	{
300cdf0e10cSrcweir 		OUString aRet( SdLayer::convertToExternalName( pLayer->GetName() ) );
301cdf0e10cSrcweir 		aValue <<= aRet;
302cdf0e10cSrcweir 		break;
303cdf0e10cSrcweir 	}
304cdf0e10cSrcweir 	case WID_LAYER_TITLE:
305cdf0e10cSrcweir 		aValue <<= OUString( pLayer->GetTitle() );
306cdf0e10cSrcweir 		break;
307cdf0e10cSrcweir 	case WID_LAYER_DESC:
308cdf0e10cSrcweir 		aValue <<= OUString( pLayer->GetDescription() );
309cdf0e10cSrcweir 		break;
310cdf0e10cSrcweir 	default:
311cdf0e10cSrcweir 		throw beans::UnknownPropertyException();
312cdf0e10cSrcweir 	}
313cdf0e10cSrcweir 
314cdf0e10cSrcweir 	return aValue;
315cdf0e10cSrcweir }
316cdf0e10cSrcweir 
317cdf0e10cSrcweir void SAL_CALL SdLayer::addPropertyChangeListener( const OUString& , const uno::Reference< beans::XPropertyChangeListener >& ) throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) {}
318cdf0e10cSrcweir void SAL_CALL SdLayer::removePropertyChangeListener( const OUString& , const uno::Reference< beans::XPropertyChangeListener >& ) throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) {}
319cdf0e10cSrcweir void SAL_CALL SdLayer::addVetoableChangeListener( const OUString& , const uno::Reference< beans::XVetoableChangeListener >& ) throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) {}
320cdf0e10cSrcweir void SAL_CALL SdLayer::removeVetoableChangeListener( const OUString& , const uno::Reference< beans::XVetoableChangeListener >& ) throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) {}
321cdf0e10cSrcweir 
322cdf0e10cSrcweir /** */
323cdf0e10cSrcweir sal_Bool SdLayer::get( LayerAttribute what ) throw()
324cdf0e10cSrcweir {
325cdf0e10cSrcweir 	if(pLayer&&pLayerManager)
326cdf0e10cSrcweir 	{
327cdf0e10cSrcweir 		// Versuch 1. ist eine beliebige Seite geoeffnet?
328cdf0e10cSrcweir 		::sd::View *pView = pLayerManager->GetView();
329cdf0e10cSrcweir 		SdrPageView* pSdrPageView = NULL;
330cdf0e10cSrcweir 		if(pView)
331cdf0e10cSrcweir 			pSdrPageView = pView->GetSdrPageView();
332cdf0e10cSrcweir 
333cdf0e10cSrcweir 		if(pSdrPageView)
334cdf0e10cSrcweir 		{
335cdf0e10cSrcweir 			String aLayerName = pLayer->GetName();
336cdf0e10cSrcweir 			switch(what)
337cdf0e10cSrcweir 			{
338cdf0e10cSrcweir 			case VISIBLE:	return pSdrPageView->IsLayerVisible(aLayerName);
339cdf0e10cSrcweir 			case PRINTABLE:	return pSdrPageView->IsLayerPrintable(aLayerName);
340cdf0e10cSrcweir 			case LOCKED:   	return pSdrPageView->IsLayerLocked(aLayerName);
341cdf0e10cSrcweir 			}
342cdf0e10cSrcweir 		}
343cdf0e10cSrcweir 
344cdf0e10cSrcweir #ifndef SVX_LIGHT
345cdf0e10cSrcweir 		// Versuch 2. Info von der FrameView besorgen
346cdf0e10cSrcweir 		if(pLayerManager->GetDocShell())
347cdf0e10cSrcweir 		{
348cdf0e10cSrcweir 			::sd::FrameView *pFrameView = pLayerManager->GetDocShell()->GetFrameView();
349cdf0e10cSrcweir 			if(pFrameView)
350cdf0e10cSrcweir 				switch(what)
351cdf0e10cSrcweir 				{
352cdf0e10cSrcweir 				case VISIBLE:	return pFrameView->GetVisibleLayers().IsSet(pLayer->GetID());
353cdf0e10cSrcweir 				case PRINTABLE:	return pFrameView->GetPrintableLayers().IsSet(pLayer->GetID());
354cdf0e10cSrcweir 				case LOCKED:	return pFrameView->GetLockedLayers().IsSet(pLayer->GetID());
355cdf0e10cSrcweir 				}
356cdf0e10cSrcweir 		}
357cdf0e10cSrcweir #endif
358cdf0e10cSrcweir 	}
359cdf0e10cSrcweir 	return sal_False; //TODO: uno::Exception?
360cdf0e10cSrcweir }
361cdf0e10cSrcweir 
362cdf0e10cSrcweir void SdLayer::set( LayerAttribute what, sal_Bool flag ) throw()
363cdf0e10cSrcweir {
364cdf0e10cSrcweir 	if(pLayer&&pLayerManager)
365cdf0e10cSrcweir 	{
366cdf0e10cSrcweir 		// Versuch 1. ist eine beliebige Seite geoeffnet?
367cdf0e10cSrcweir 		::sd::View *pView = pLayerManager->GetView();
368cdf0e10cSrcweir 		SdrPageView* pSdrPageView = NULL;
369cdf0e10cSrcweir 		if(pView)
370cdf0e10cSrcweir 			pSdrPageView = pView->GetSdrPageView();
371cdf0e10cSrcweir 
372cdf0e10cSrcweir 		if(pSdrPageView)
373cdf0e10cSrcweir 		{
374cdf0e10cSrcweir 			String aLayerName(pLayer->GetName());
375cdf0e10cSrcweir 			switch(what)
376cdf0e10cSrcweir 			{
377cdf0e10cSrcweir 			case VISIBLE:	pSdrPageView->SetLayerVisible(aLayerName,flag);
378cdf0e10cSrcweir 							break;
379cdf0e10cSrcweir 			case PRINTABLE:	pSdrPageView->SetLayerPrintable(aLayerName,flag);
380cdf0e10cSrcweir 							break;
381cdf0e10cSrcweir 			case LOCKED:	pSdrPageView->SetLayerLocked(aLayerName,flag);
382cdf0e10cSrcweir 							break;
383cdf0e10cSrcweir 			}
384cdf0e10cSrcweir 		}
385cdf0e10cSrcweir 
386cdf0e10cSrcweir #ifndef SVX_LIGHT
387cdf0e10cSrcweir 		// Versuch 2. Info von der FrameView besorgen
388cdf0e10cSrcweir 		if(pLayerManager->GetDocShell())
389cdf0e10cSrcweir 		{
390cdf0e10cSrcweir 			::sd::FrameView *pFrameView = pLayerManager->GetDocShell()->GetFrameView();
391cdf0e10cSrcweir 
392cdf0e10cSrcweir 			if(pFrameView)
393cdf0e10cSrcweir 			{
394cdf0e10cSrcweir 				SetOfByte aNewLayers;
395cdf0e10cSrcweir 				switch(what)
396cdf0e10cSrcweir 				{
397cdf0e10cSrcweir 				case VISIBLE:	aNewLayers = pFrameView->GetVisibleLayers();
398cdf0e10cSrcweir 								break;
399cdf0e10cSrcweir 				case PRINTABLE:	aNewLayers = pFrameView->GetPrintableLayers();
400cdf0e10cSrcweir 								break;
401cdf0e10cSrcweir 				case LOCKED:	aNewLayers = pFrameView->GetLockedLayers();
402cdf0e10cSrcweir 								break;
403cdf0e10cSrcweir 				}
404cdf0e10cSrcweir 
405cdf0e10cSrcweir 				aNewLayers.Set(pLayer->GetID(),flag);
406cdf0e10cSrcweir 
407cdf0e10cSrcweir 				switch(what)
408cdf0e10cSrcweir 				{
409cdf0e10cSrcweir 				case VISIBLE:	pFrameView->SetVisibleLayers(aNewLayers);
410cdf0e10cSrcweir 								break;
411cdf0e10cSrcweir 				case PRINTABLE:	pFrameView->SetPrintableLayers(aNewLayers);
412cdf0e10cSrcweir 								break;
413cdf0e10cSrcweir 				case LOCKED:	pFrameView->SetLockedLayers(aNewLayers);
414cdf0e10cSrcweir 								break;
415cdf0e10cSrcweir 				}
416cdf0e10cSrcweir 				return;
417cdf0e10cSrcweir 			}
418cdf0e10cSrcweir 		}
419cdf0e10cSrcweir #endif
420cdf0e10cSrcweir 	}
421cdf0e10cSrcweir 	//TODO: uno::Exception?
422cdf0e10cSrcweir }
423cdf0e10cSrcweir 
424cdf0e10cSrcweir 
425cdf0e10cSrcweir 
426cdf0e10cSrcweir 
427cdf0e10cSrcweir //=====  ::com::sun::star::container::XChild  =================================
428cdf0e10cSrcweir 
429cdf0e10cSrcweir uno::Reference<uno::XInterface> SAL_CALL SdLayer::getParent (void)
430cdf0e10cSrcweir     throw (::com::sun::star::uno::RuntimeException)
431cdf0e10cSrcweir {
432cdf0e10cSrcweir 	OGuard aGuard( Application::GetSolarMutex() );
433cdf0e10cSrcweir 
434cdf0e10cSrcweir 	if( pLayerManager == NULL )
435cdf0e10cSrcweir 		throw lang::DisposedException();
436cdf0e10cSrcweir 
437cdf0e10cSrcweir     return uno::Reference<uno::XInterface> (mxLayerManager, uno::UNO_QUERY);
438cdf0e10cSrcweir }
439cdf0e10cSrcweir 
440cdf0e10cSrcweir 
441cdf0e10cSrcweir void SAL_CALL SdLayer::setParent (const uno::Reference<uno::XInterface >& )
442cdf0e10cSrcweir     throw (::com::sun::star::lang::NoSupportException,
443cdf0e10cSrcweir         ::com::sun::star::uno::RuntimeException)
444cdf0e10cSrcweir {
445cdf0e10cSrcweir     throw lang::NoSupportException ();
446cdf0e10cSrcweir }
447cdf0e10cSrcweir 
448cdf0e10cSrcweir // XComponent
449cdf0e10cSrcweir void SAL_CALL SdLayer::dispose(  ) throw (uno::RuntimeException)
450cdf0e10cSrcweir {
451cdf0e10cSrcweir 	pLayerManager = 0;
452cdf0e10cSrcweir 	mxLayerManager = 0;
453cdf0e10cSrcweir 	pLayer = 0;
454cdf0e10cSrcweir }
455cdf0e10cSrcweir 
456cdf0e10cSrcweir void SAL_CALL SdLayer::addEventListener( const uno::Reference< lang::XEventListener >& ) throw (uno::RuntimeException)
457cdf0e10cSrcweir {
458cdf0e10cSrcweir 	DBG_ERROR("not implemented!");
459cdf0e10cSrcweir }
460cdf0e10cSrcweir 
461cdf0e10cSrcweir void SAL_CALL SdLayer::removeEventListener( const uno::Reference< lang::XEventListener >& ) throw (uno::RuntimeException)
462cdf0e10cSrcweir {
463cdf0e10cSrcweir 	DBG_ERROR("not implemented!");
464cdf0e10cSrcweir }
465cdf0e10cSrcweir 
466cdf0e10cSrcweir 
467cdf0e10cSrcweir //=============================================================================
468cdf0e10cSrcweir // class SdLayerManager
469cdf0e10cSrcweir //=============================================================================
470cdf0e10cSrcweir 
471cdf0e10cSrcweir /** */
472cdf0e10cSrcweir SdLayerManager::SdLayerManager( SdXImpressDocument& rMyModel ) throw()
473cdf0e10cSrcweir :mpModel( &rMyModel)
474cdf0e10cSrcweir {
475cdf0e10cSrcweir 	mpLayers = new SvUnoWeakContainer;
476cdf0e10cSrcweir }
477cdf0e10cSrcweir 
478cdf0e10cSrcweir /** */
479cdf0e10cSrcweir SdLayerManager::~SdLayerManager() throw()
480cdf0e10cSrcweir {
481cdf0e10cSrcweir     dispose();
482cdf0e10cSrcweir }
483cdf0e10cSrcweir 
484cdf0e10cSrcweir // uno helper
485cdf0e10cSrcweir UNO3_GETIMPLEMENTATION_IMPL( SdLayerManager );
486cdf0e10cSrcweir 
487cdf0e10cSrcweir // XComponent
488cdf0e10cSrcweir void SAL_CALL SdLayerManager::dispose(  ) throw (uno::RuntimeException)
489cdf0e10cSrcweir {
490cdf0e10cSrcweir 	mpModel = 0;
491cdf0e10cSrcweir 	if( mpLayers )
492cdf0e10cSrcweir 	{
493cdf0e10cSrcweir 		mpLayers->dispose();
494cdf0e10cSrcweir 
495cdf0e10cSrcweir 		delete mpLayers;
496cdf0e10cSrcweir 		mpLayers = 0;
497cdf0e10cSrcweir 	}
498cdf0e10cSrcweir }
499cdf0e10cSrcweir 
500cdf0e10cSrcweir void SAL_CALL SdLayerManager::addEventListener( const uno::Reference< lang::XEventListener >& ) throw (uno::RuntimeException)
501cdf0e10cSrcweir {
502cdf0e10cSrcweir 	DBG_ERROR("not implemented!");
503cdf0e10cSrcweir }
504cdf0e10cSrcweir 
505cdf0e10cSrcweir void SAL_CALL SdLayerManager::removeEventListener( const uno::Reference< lang::XEventListener >& ) throw (uno::RuntimeException)
506cdf0e10cSrcweir {
507cdf0e10cSrcweir 	DBG_ERROR("not implemented!");
508cdf0e10cSrcweir }
509cdf0e10cSrcweir 
510cdf0e10cSrcweir // XServiceInfo
511cdf0e10cSrcweir OUString SAL_CALL SdLayerManager::getImplementationName()
512cdf0e10cSrcweir 	throw(uno::RuntimeException)
513cdf0e10cSrcweir {
514cdf0e10cSrcweir 	return OUString( OUString::createFromAscii(sUNO_SdLayerManager) );
515cdf0e10cSrcweir }
516cdf0e10cSrcweir 
517cdf0e10cSrcweir sal_Bool SAL_CALL SdLayerManager::supportsService( const OUString& ServiceName )
518cdf0e10cSrcweir 	throw(uno::RuntimeException)
519cdf0e10cSrcweir {
520cdf0e10cSrcweir 	return comphelper::ServiceInfoHelper::supportsService( ServiceName, getSupportedServiceNames() );
521cdf0e10cSrcweir }
522cdf0e10cSrcweir 
523cdf0e10cSrcweir uno::Sequence< OUString > SAL_CALL SdLayerManager::getSupportedServiceNames()
524cdf0e10cSrcweir 	throw(uno::RuntimeException)
525cdf0e10cSrcweir {
526cdf0e10cSrcweir 	OUString aServiceName( OUString::createFromAscii(sUNO_Service_DrawingLayerManager) );
527cdf0e10cSrcweir 	uno::Sequence< OUString > aSeq( &aServiceName, 1 );
528cdf0e10cSrcweir 	return aSeq;
529cdf0e10cSrcweir }
530cdf0e10cSrcweir 
531cdf0e10cSrcweir // XLayerManager
532cdf0e10cSrcweir uno::Reference< drawing::XLayer > SAL_CALL SdLayerManager::insertNewByIndex( sal_Int32 nIndex )
533cdf0e10cSrcweir 	throw(uno::RuntimeException)
534cdf0e10cSrcweir {
535cdf0e10cSrcweir 	OGuard aGuard( Application::GetSolarMutex() );
536cdf0e10cSrcweir 
537cdf0e10cSrcweir 	if( mpModel == 0 )
538cdf0e10cSrcweir 		throw lang::DisposedException();
539cdf0e10cSrcweir 
540cdf0e10cSrcweir 	uno::Reference< drawing::XLayer > xLayer;
541cdf0e10cSrcweir 
542cdf0e10cSrcweir 	if( mpModel->mpDoc )
543cdf0e10cSrcweir 	{
544cdf0e10cSrcweir 		SdrLayerAdmin& rLayerAdmin = mpModel->mpDoc->GetLayerAdmin();
545cdf0e10cSrcweir 		sal_uInt16 nLayerCnt = rLayerAdmin.GetLayerCount();
546cdf0e10cSrcweir 		sal_uInt16 nLayer = nLayerCnt - 2 + 1;
547cdf0e10cSrcweir 		String aLayerName;
548cdf0e10cSrcweir 
549cdf0e10cSrcweir 		// Ueberpruefung auf schon vorhandene Namen
550cdf0e10cSrcweir 		while( aLayerName.Len()==0 || rLayerAdmin.GetLayer( aLayerName, sal_False) )
551cdf0e10cSrcweir 		{
552cdf0e10cSrcweir 			aLayerName = String(SdResId(STR_LAYER));
553cdf0e10cSrcweir 			aLayerName += String::CreateFromInt32( (sal_Int32)nLayer );
554cdf0e10cSrcweir 			nLayer++;
555cdf0e10cSrcweir 		}
556cdf0e10cSrcweir 
557cdf0e10cSrcweir 		SdrLayerAdmin& rLA=mpModel->mpDoc->GetLayerAdmin();
558cdf0e10cSrcweir 		const sal_Int32 nMax=rLA.GetLayerCount();
559cdf0e10cSrcweir 		if (nIndex>nMax) nIndex=nMax;
560cdf0e10cSrcweir 		xLayer = GetLayer (rLA.NewLayer(aLayerName,(sal_uInt16)nIndex));
561cdf0e10cSrcweir 		mpModel->SetModified();
562cdf0e10cSrcweir 	}
563cdf0e10cSrcweir 	return xLayer;
564cdf0e10cSrcweir }
565cdf0e10cSrcweir 
566cdf0e10cSrcweir void SAL_CALL SdLayerManager::remove( const uno::Reference< drawing::XLayer >& xLayer )
567cdf0e10cSrcweir 	throw(container::NoSuchElementException, uno::RuntimeException)
568cdf0e10cSrcweir {
569cdf0e10cSrcweir 	OGuard aGuard( Application::GetSolarMutex() );
570cdf0e10cSrcweir 
571cdf0e10cSrcweir 	if( mpModel == 0 )
572cdf0e10cSrcweir 		throw lang::DisposedException();
573cdf0e10cSrcweir 
574cdf0e10cSrcweir 	SdLayer* pSdLayer = SdLayer::getImplementation(xLayer);
575cdf0e10cSrcweir 
576cdf0e10cSrcweir 	if(pSdLayer && GetView())
577cdf0e10cSrcweir 	{
578cdf0e10cSrcweir 		const SdrLayer* pSdrLayer = pSdLayer->GetSdrLayer();
579cdf0e10cSrcweir 		GetView()->DeleteLayer( pSdrLayer->GetName() );
580cdf0e10cSrcweir 
581cdf0e10cSrcweir 		UpdateLayerView();
582cdf0e10cSrcweir 	}
583cdf0e10cSrcweir 
584cdf0e10cSrcweir 	mpModel->SetModified();
585cdf0e10cSrcweir }
586cdf0e10cSrcweir 
587cdf0e10cSrcweir void SAL_CALL SdLayerManager::attachShapeToLayer( const uno::Reference< drawing::XShape >& xShape, const uno::Reference< drawing::XLayer >& xLayer )
588cdf0e10cSrcweir 	throw(uno::RuntimeException)
589cdf0e10cSrcweir {
590cdf0e10cSrcweir 	OGuard aGuard( Application::GetSolarMutex() );
591cdf0e10cSrcweir 
592cdf0e10cSrcweir 	if( mpModel == 0 )
593cdf0e10cSrcweir 		throw lang::DisposedException();
594cdf0e10cSrcweir 
595cdf0e10cSrcweir 	SdLayer* pSdLayer = SdLayer::getImplementation(xLayer);
596cdf0e10cSrcweir 	SdrLayer* pSdrLayer = pSdLayer?pSdLayer->GetSdrLayer():NULL;
597cdf0e10cSrcweir 	if(pSdrLayer==NULL)
598cdf0e10cSrcweir 		return;
599cdf0e10cSrcweir 
600cdf0e10cSrcweir 	SvxShape* pShape = SvxShape::getImplementation( xShape );
601cdf0e10cSrcweir 	SdrObject* pSdrObject = pShape?pShape->GetSdrObject():NULL;
602cdf0e10cSrcweir 
603cdf0e10cSrcweir 	if(pSdrObject && pSdrLayer )
604cdf0e10cSrcweir 		pSdrObject->SetLayer(pSdrLayer->GetID());
605cdf0e10cSrcweir 
606cdf0e10cSrcweir 	mpModel->SetModified();
607cdf0e10cSrcweir }
608cdf0e10cSrcweir 
609cdf0e10cSrcweir uno::Reference< drawing::XLayer > SAL_CALL SdLayerManager::getLayerForShape( const uno::Reference< drawing::XShape >& xShape ) throw(uno::RuntimeException)
610cdf0e10cSrcweir {
611cdf0e10cSrcweir 	OGuard aGuard( Application::GetSolarMutex() );
612cdf0e10cSrcweir 
613cdf0e10cSrcweir 	if( mpModel == 0 )
614cdf0e10cSrcweir 		throw lang::DisposedException();
615cdf0e10cSrcweir 
616cdf0e10cSrcweir 	uno::Reference< drawing::XLayer >  xLayer;
617cdf0e10cSrcweir 
618cdf0e10cSrcweir 	if(mpModel->mpDoc)
619cdf0e10cSrcweir 	{
620cdf0e10cSrcweir 		SvxShape* pShape = SvxShape::getImplementation( xShape );
621cdf0e10cSrcweir 		SdrObject* pObj = pShape?pShape->GetSdrObject():NULL;
622cdf0e10cSrcweir 		if(pObj)
623cdf0e10cSrcweir 		{
624cdf0e10cSrcweir 			SdrLayerID aId = pObj->GetLayer();
625cdf0e10cSrcweir 			SdrLayerAdmin& rLayerAdmin = mpModel->mpDoc->GetLayerAdmin();
626cdf0e10cSrcweir 			xLayer = GetLayer (rLayerAdmin.GetLayerPerID(aId));
627cdf0e10cSrcweir 		}
628cdf0e10cSrcweir 	}
629cdf0e10cSrcweir 	return xLayer;
630cdf0e10cSrcweir }
631cdf0e10cSrcweir 
632cdf0e10cSrcweir // XIndexAccess
633cdf0e10cSrcweir sal_Int32 SAL_CALL SdLayerManager::getCount()
634cdf0e10cSrcweir 	throw(uno::RuntimeException)
635cdf0e10cSrcweir {
636cdf0e10cSrcweir 	OGuard aGuard( Application::GetSolarMutex() );
637cdf0e10cSrcweir 
638cdf0e10cSrcweir 	if( mpModel == 0 )
639cdf0e10cSrcweir 		throw lang::DisposedException();
640cdf0e10cSrcweir 
641cdf0e10cSrcweir 	if( mpModel->mpDoc )
642cdf0e10cSrcweir 	{
643cdf0e10cSrcweir 		SdrLayerAdmin& rLayerAdmin = mpModel->mpDoc->GetLayerAdmin();
644cdf0e10cSrcweir 		return rLayerAdmin.GetLayerCount();
645cdf0e10cSrcweir 	}
646cdf0e10cSrcweir 
647cdf0e10cSrcweir 	return 0;
648cdf0e10cSrcweir }
649cdf0e10cSrcweir 
650cdf0e10cSrcweir uno::Any SAL_CALL SdLayerManager::getByIndex( sal_Int32 nLayer )
651cdf0e10cSrcweir 	throw(lang::IndexOutOfBoundsException, lang::WrappedTargetException, uno::RuntimeException)
652cdf0e10cSrcweir {
653cdf0e10cSrcweir 	OGuard aGuard( Application::GetSolarMutex() );
654cdf0e10cSrcweir 
655cdf0e10cSrcweir 	if( mpModel == 0 )
656cdf0e10cSrcweir 		throw lang::DisposedException();
657cdf0e10cSrcweir 
658cdf0e10cSrcweir 	if( nLayer >= getCount() || nLayer < 0 )
659cdf0e10cSrcweir 		throw lang::IndexOutOfBoundsException();
660cdf0e10cSrcweir 
661cdf0e10cSrcweir 	uno::Any aAny;
662cdf0e10cSrcweir 
663cdf0e10cSrcweir 	if( mpModel->mpDoc )
664cdf0e10cSrcweir 	{
665cdf0e10cSrcweir 		SdrLayerAdmin& rLayerAdmin = mpModel->mpDoc->GetLayerAdmin();
666cdf0e10cSrcweir 		uno::Reference<drawing::XLayer> xLayer (GetLayer (rLayerAdmin.GetLayer((sal_uInt16)nLayer)));
667cdf0e10cSrcweir 		aAny <<= xLayer;
668cdf0e10cSrcweir 	}
669cdf0e10cSrcweir 	return aAny;
670cdf0e10cSrcweir }
671cdf0e10cSrcweir 
672cdf0e10cSrcweir 
673cdf0e10cSrcweir // XNameAccess
674cdf0e10cSrcweir uno::Any SAL_CALL SdLayerManager::getByName( const OUString& aName )
675cdf0e10cSrcweir 	throw(container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException)
676cdf0e10cSrcweir {
677cdf0e10cSrcweir 	OGuard aGuard( Application::GetSolarMutex() );
678cdf0e10cSrcweir 
679cdf0e10cSrcweir 	if( (mpModel == 0) || (mpModel->mpDoc == 0 ) )
680cdf0e10cSrcweir 		throw lang::DisposedException();
681cdf0e10cSrcweir 
682cdf0e10cSrcweir 	SdrLayerAdmin& rLayerAdmin = mpModel->mpDoc->GetLayerAdmin();
683cdf0e10cSrcweir 	SdrLayer* pLayer = rLayerAdmin.GetLayer( SdLayer::convertToInternalName( aName ), sal_False );
684cdf0e10cSrcweir 	if( pLayer == NULL )
685cdf0e10cSrcweir 		throw container::NoSuchElementException();
686cdf0e10cSrcweir 
687cdf0e10cSrcweir 	return uno::Any( GetLayer (pLayer) );
688cdf0e10cSrcweir }
689cdf0e10cSrcweir 
690cdf0e10cSrcweir uno::Sequence< OUString > SAL_CALL SdLayerManager::getElementNames()
691cdf0e10cSrcweir 	throw(uno::RuntimeException)
692cdf0e10cSrcweir {
693cdf0e10cSrcweir 	OGuard aGuard( Application::GetSolarMutex() );
694cdf0e10cSrcweir 
695cdf0e10cSrcweir 	if( mpModel == 0 )
696cdf0e10cSrcweir 		throw lang::DisposedException();
697cdf0e10cSrcweir 
698cdf0e10cSrcweir 	SdrLayerAdmin& rLayerAdmin = mpModel->mpDoc->GetLayerAdmin();
699cdf0e10cSrcweir 	const sal_uInt16 nLayerCount = rLayerAdmin.GetLayerCount();
700cdf0e10cSrcweir 
701cdf0e10cSrcweir 	uno::Sequence< OUString > aSeq( nLayerCount );
702cdf0e10cSrcweir 
703cdf0e10cSrcweir 	OUString* pStrings = aSeq.getArray();
704cdf0e10cSrcweir 	SdrLayer* pLayer;
705cdf0e10cSrcweir 
706cdf0e10cSrcweir 	for( sal_uInt16 nLayer = 0; nLayer < nLayerCount; nLayer++ )
707cdf0e10cSrcweir 	{
708cdf0e10cSrcweir 		pLayer = rLayerAdmin.GetLayer( nLayer );
709cdf0e10cSrcweir 		if( pLayer )
710cdf0e10cSrcweir 			*pStrings++ = SdLayer::convertToExternalName( pLayer->GetName() );
711cdf0e10cSrcweir 	}
712cdf0e10cSrcweir 
713cdf0e10cSrcweir 	return aSeq;
714cdf0e10cSrcweir }
715cdf0e10cSrcweir 
716cdf0e10cSrcweir sal_Bool SAL_CALL SdLayerManager::hasByName( const OUString& aName ) throw(uno::RuntimeException)
717cdf0e10cSrcweir {
718cdf0e10cSrcweir 	OGuard aGuard( Application::GetSolarMutex() );
719cdf0e10cSrcweir 
720cdf0e10cSrcweir 	if( mpModel == 0 )
721cdf0e10cSrcweir 		throw lang::DisposedException();
722cdf0e10cSrcweir 
723cdf0e10cSrcweir 	SdrLayerAdmin& rLayerAdmin = mpModel->mpDoc->GetLayerAdmin();
724cdf0e10cSrcweir 
725cdf0e10cSrcweir 	return NULL != rLayerAdmin.GetLayer( SdLayer::convertToInternalName( aName ), sal_False );
726cdf0e10cSrcweir }
727cdf0e10cSrcweir 
728cdf0e10cSrcweir // XElementAccess
729cdf0e10cSrcweir uno::Type SAL_CALL SdLayerManager::getElementType()
730cdf0e10cSrcweir 	throw(uno::RuntimeException)
731cdf0e10cSrcweir {
732cdf0e10cSrcweir 	return ITYPE( drawing::XLayer );
733cdf0e10cSrcweir }
734cdf0e10cSrcweir 
735cdf0e10cSrcweir sal_Bool SAL_CALL SdLayerManager::hasElements() throw(uno::RuntimeException)
736cdf0e10cSrcweir {
737cdf0e10cSrcweir 	return getCount() > 0;
738cdf0e10cSrcweir }
739cdf0e10cSrcweir 
740cdf0e10cSrcweir /** Falls an den Layern was geaendert wurde sorgt diese Methode dafuer, das
741cdf0e10cSrcweir 	die Aenderungen auch in der sdbcx::View sichtbar gemacht werden */
742cdf0e10cSrcweir void SdLayerManager::UpdateLayerView( sal_Bool modify ) const throw()
743cdf0e10cSrcweir {
744cdf0e10cSrcweir 	if(mpModel->mpDocShell)
745cdf0e10cSrcweir 	{
746cdf0e10cSrcweir 		::sd::DrawViewShell* pDrViewSh =
747cdf0e10cSrcweir 			PTR_CAST(::sd::DrawViewShell, mpModel->mpDocShell->GetViewShell());
748cdf0e10cSrcweir 
749cdf0e10cSrcweir 		if(pDrViewSh)
750cdf0e10cSrcweir 		{
751cdf0e10cSrcweir 			sal_Bool bLayerMode = pDrViewSh->IsLayerModeActive();
752cdf0e10cSrcweir 			pDrViewSh->ChangeEditMode(pDrViewSh->GetEditMode(), !bLayerMode);
753cdf0e10cSrcweir 			pDrViewSh->ChangeEditMode(pDrViewSh->GetEditMode(), bLayerMode);
754cdf0e10cSrcweir 		}
755cdf0e10cSrcweir 
756cdf0e10cSrcweir 		if(modify)
757cdf0e10cSrcweir 			mpModel->mpDoc->SetChanged(sal_True);
758cdf0e10cSrcweir 	}
759cdf0e10cSrcweir }
760cdf0e10cSrcweir 
761cdf0e10cSrcweir /** */
762cdf0e10cSrcweir ::sd::View* SdLayerManager::GetView() const throw()
763cdf0e10cSrcweir {
764cdf0e10cSrcweir 	if( mpModel->mpDocShell )
765cdf0e10cSrcweir 	{
766cdf0e10cSrcweir 		::sd::ViewShell* pViewSh = mpModel->mpDocShell->GetViewShell();
767cdf0e10cSrcweir 		if(pViewSh)
768cdf0e10cSrcweir 			return pViewSh->GetView();
769cdf0e10cSrcweir 	}
770cdf0e10cSrcweir 	return NULL;
771cdf0e10cSrcweir }
772cdf0e10cSrcweir 
773cdf0e10cSrcweir 
774cdf0e10cSrcweir 
775cdf0e10cSrcweir namespace
776cdf0e10cSrcweir {
777cdf0e10cSrcweir /** Compare two pointers to <type>SdrLayer</type> objects.
778cdf0e10cSrcweir     @param xRef
779cdf0e10cSrcweir         The implementing SdLayer class provides the first pointer by the
780cdf0e10cSrcweir         <member>SdLayer::GetSdrLayer</member> method.
781cdf0e10cSrcweir     @param pSearchData
782cdf0e10cSrcweir         This void pointer is the second pointer to an <type>SdrLayer</type>
783cdf0e10cSrcweir         object.
784cdf0e10cSrcweir     @return
785cdf0e10cSrcweir         Return </True> if both pointers point to the same object.
786cdf0e10cSrcweir */
787cdf0e10cSrcweir sal_Bool compare_layers (uno::WeakReference<uno::XInterface> xRef, void* pSearchData)
788cdf0e10cSrcweir {
789cdf0e10cSrcweir 	uno::Reference<uno::XInterface> xLayer (xRef);
790cdf0e10cSrcweir 	if (xLayer.is())
791cdf0e10cSrcweir 	{
792cdf0e10cSrcweir         SdLayer* pSdLayer = SdLayer::getImplementation (xRef);
793cdf0e10cSrcweir         if (pSdLayer != NULL)
794cdf0e10cSrcweir         {
795cdf0e10cSrcweir             SdrLayer* pSdrLayer = pSdLayer->GetSdrLayer ();
796cdf0e10cSrcweir             if (pSdrLayer == static_cast<SdrLayer*>(pSearchData))
797cdf0e10cSrcweir                 return sal_True;
798cdf0e10cSrcweir         }
799cdf0e10cSrcweir 	}
800cdf0e10cSrcweir 	return sal_False;
801cdf0e10cSrcweir }
802cdf0e10cSrcweir }
803cdf0e10cSrcweir 
804cdf0e10cSrcweir /** Use the <member>mpLayers</member> container of weak references to either
805cdf0e10cSrcweir     retrieve and return a previously created <type>XLayer</type> object for
806cdf0e10cSrcweir     the given <type>SdrLayer</type> object or create and remember a new one.
807cdf0e10cSrcweir */
808cdf0e10cSrcweir uno::Reference<drawing::XLayer> SdLayerManager::GetLayer (SdrLayer* pLayer)
809cdf0e10cSrcweir {
810cdf0e10cSrcweir 	uno::WeakReference<uno::XInterface> xRef;
811cdf0e10cSrcweir 	uno::Reference<drawing::XLayer>  xLayer;
812cdf0e10cSrcweir 
813cdf0e10cSrcweir     // Search existing xLayer for the given pLayer.
814cdf0e10cSrcweir 	if (mpLayers->findRef (xRef, (void*)pLayer, compare_layers))
815cdf0e10cSrcweir         xLayer = uno::Reference<drawing::XLayer> (xRef, uno::UNO_QUERY);
816cdf0e10cSrcweir 
817cdf0e10cSrcweir     // Create the xLayer if necessary.
818cdf0e10cSrcweir 	if ( ! xLayer.is())
819cdf0e10cSrcweir 	{
820cdf0e10cSrcweir 		xLayer = new SdLayer (this, pLayer);
821cdf0e10cSrcweir 
822cdf0e10cSrcweir         // Remember the new xLayer for future calls.
823cdf0e10cSrcweir         uno::WeakReference<uno::XInterface> wRef(xLayer);
824cdf0e10cSrcweir         mpLayers->insert(wRef);
825cdf0e10cSrcweir 	}
826cdf0e10cSrcweir 
827cdf0e10cSrcweir     return xLayer;
828cdf0e10cSrcweir }
829