xref: /aoo41x/main/sw/source/core/draw/drawdoc.cxx (revision efeef26f)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sw.hxx"
26 
27 #ifndef _SVX_SVXIDS_HRC
28 #include <svx/svxids.hrc>
29 #endif
30 #include <tools/stream.hxx>
31 #include <unotools/pathoptions.hxx>
32 #include <sot/storage.hxx>
33 #include <svl/intitem.hxx>
34 #include <editeng/forbiddencharacterstable.hxx>
35 
36 #include <unotools/ucbstreamhelper.hxx>
37 #include <svx/xtable.hxx>
38 #include <svx/drawitem.hxx>
39 #include <viewsh.hxx>
40 #include <doc.hxx>
41 #include <rootfrm.hxx>
42 #include <drawdoc.hxx>
43 #include <dpage.hxx>
44 #ifndef _DOCSH_HXX
45 #include <docsh.hxx>
46 #endif
47 #include <shellio.hxx>
48 #include <hintids.hxx>
49 #include <com/sun/star/embed/ElementModes.hpp>
50 
51 using namespace com::sun::star;
52 
53 /*************************************************************************
54 |*
55 |* Konstruktor
56 |*
57 \************************************************************************/
58 
59 const String GetPalettePath()
60 {
61 	SvtPathOptions aPathOpt;
62 	return aPathOpt.GetPalettePath();
63 }
64 
65 SwDrawDocument::SwDrawDocument( SwDoc* pD ) :
66 	FmFormModel( ::GetPalettePath(), &pD->GetAttrPool(),
67 				 pD->GetDocShell(), sal_True ),
68 	pDoc( pD )
69 {
70 	SetScaleUnit( MAP_TWIP );
71 	SetSwapGraphics( sal_True );
72 
73 	SwDocShell* pDocSh = pDoc->GetDocShell();
74 	if ( pDocSh )
75 	{
76 		SetObjectShell( pDocSh );
77 		SvxColorTableItem* pColItem = ( SvxColorTableItem* )
78                                 ( pDocSh->GetItem( SID_COLOR_TABLE ) );
79 		XColorTable *pXCol = pColItem ? pColItem->GetColorTable() :
80 										XColorTable::GetStdColorTable();
81 		SetColorTable( pXCol );
82 
83 		if ( !pColItem )
84             pDocSh->PutItem( SvxColorTableItem( pXCol, SID_COLOR_TABLE ) );
85 
86         pDocSh->PutItem( SvxGradientListItem( GetGradientList(), SID_GRADIENT_LIST ));
87         pDocSh->PutItem( SvxHatchListItem( GetHatchList(), SID_HATCH_LIST ) );
88         pDocSh->PutItem( SvxBitmapListItem( GetBitmapList(), SID_BITMAP_LIST ) );
89         pDocSh->PutItem( SvxDashListItem( GetDashList(), SID_DASH_LIST ) );
90         pDocSh->PutItem( SvxLineEndListItem( GetLineEndList(), SID_LINEEND_LIST ) );
91 		pDocSh->PutItem( SfxUInt16Item(SID_ATTR_LINEEND_WIDTH_DEFAULT, 111) );
92 		SetObjectShell( pDocSh );
93 	}
94 	else
95 		SetColorTable( XColorTable::GetStdColorTable() );
96 
97 	// copy all the default values to the SdrModel
98 	SfxItemPool* pSdrPool = pD->GetAttrPool().GetSecondaryPool();
99 	if( pSdrPool )
100 	{
101 		const sal_uInt16 aWhichRanges[] =
102 			{
103 				RES_CHRATR_BEGIN, RES_CHRATR_END,
104 				RES_PARATR_BEGIN, RES_PARATR_END,
105 				0
106 			};
107 
108 		SfxItemPool& rDocPool = pD->GetAttrPool();
109 		sal_uInt16 nEdtWhich, nSlotId;
110 		const SfxPoolItem* pItem;
111 		for( const sal_uInt16* pRangeArr = aWhichRanges;
112 			*pRangeArr; pRangeArr += 2 )
113 			for( sal_uInt16 nW = *pRangeArr, nEnd = *(pRangeArr+1);
114 					nW < nEnd; ++nW )
115 				if( 0 != (pItem = rDocPool.GetPoolDefaultItem( nW )) &&
116 					0 != (nSlotId = rDocPool.GetSlotId( nW ) ) &&
117 					nSlotId != nW &&
118 					0 != (nEdtWhich = pSdrPool->GetWhich( nSlotId )) &&
119 					nSlotId != nEdtWhich )
120 				{
121 					SfxPoolItem* pCpy = pItem->Clone();
122 					pCpy->SetWhich( nEdtWhich );
123 					pSdrPool->SetPoolDefaultItem( *pCpy );
124 					delete pCpy;
125 				}
126 	}
127 
128     SetForbiddenCharsTable( pD->getForbiddenCharacterTable() );
129 	// #87795# Implementation for asian compression
130     SetCharCompressType( static_cast<sal_uInt16>(pD->getCharacterCompressionType() ));
131 }
132 
133 /*************************************************************************
134 |*
135 |* Destruktor
136 |*
137 \************************************************************************/
138 
139 
140 SwDrawDocument::~SwDrawDocument()
141 {
142 	Broadcast(SdrHint(HINT_MODELCLEARED));
143 
144 	// #116168#
145 	ClearModel(sal_True);
146 	//Clear();
147 }
148 
149 /*************************************************************************
150 |*
151 |* Diese Methode erzeugt eine neue Seite (SdPage) und gibt einen Zeiger
152 |* darauf zurueck. Die Drawing Engine benutzt diese Methode beim Laden
153 |* zur Erzeugung von Seiten (deren Typ sie ja nicht kennt, da es ABLEITUNGEN
154 |* der SdrPage sind).
155 |*
156 \************************************************************************/
157 
158 
159 SdrPage* SwDrawDocument::AllocPage(FASTBOOL bMasterPage)
160 {
161 	SwDPage* pPage = new SwDPage(*this, 0 != bMasterPage);
162 	pPage->SetName( String::CreateFromAscii(
163 									RTL_CONSTASCII_STRINGPARAM( "Controls" )) );
164 	return pPage;
165 }
166 
167 
168 SvStream* SwDrawDocument::GetDocumentStream( SdrDocumentStreamInfo& rInfo ) const
169 {
170 	SvStream* pRet = NULL;
171     uno::Reference < embed::XStorage > xRoot( pDoc->GetDocStorage() );
172     if( xRoot.is() )
173     {
174 	    if( rInfo.maUserData.Len() &&
175 		    ( rInfo.maUserData.GetToken( 0, ':' ) ==
176 		      String( RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.Package" ) ) ) )
177 	    {
178 		    const String aPicturePath( rInfo.maUserData.GetToken( 1, ':' ) );
179 
180 		    // graphic from picture stream in picture storage in XML package
181 		    if( aPicturePath.GetTokenCount( '/' ) == 2 )
182 		    {
183 			    const String    aPictureStorageName( aPicturePath.GetToken( 0, '/' ) );
184                 const String    aPictureStreamName( aPicturePath.GetToken( 1, '/' ) );
185 
186                 try
187                 {
188                     uno::Reference < embed::XStorage > xPictureStorage = xRoot->openStorageElement(
189                             aPictureStorageName, embed::ElementModes::READ );
190                     uno::Reference < io::XStream > xStream = xPictureStorage->openStreamElement(
191                             aPictureStreamName, embed::ElementModes::READ );
192                     pRet = utl::UcbStreamHelper::CreateStream( xStream );
193 				    if( pRet )
194 				    {
195                         rInfo.mbDeleteAfterUse = sal_True;
196                         rInfo.mxStorageRef = xPictureStorage;
197 				    }
198 			    }
199                 catch ( uno::Exception& )
200                 {
201                 }
202 		    }
203 	    }
204     }
205 	return pRet;
206 }
207 
208 SdrLayerID SwDrawDocument::GetControlExportLayerId( const SdrObject & ) const
209 {
210 	//fuer Versionen < 5.0, es gab nur Hell und Heaven
211 	return (SdrLayerID)pDoc->GetHeavenId();
212 }
213 
214 // --> OD 2006-03-01 #b6382898#
215 uno::Reference< uno::XInterface > SwDrawDocument::createUnoModel()
216 {
217 
218     uno::Reference< uno::XInterface > xModel;
219 
220     try
221     {
222         if ( GetDoc().GetDocShell() )
223         {
224             xModel = GetDoc().GetDocShell()->GetModel();
225         }
226     }
227     catch( uno::RuntimeException& )
228     {
229         ASSERT( false,
230                 "<SwDrawDocument::createUnoModel()> - could *not* retrieve model at <SwDocShell>" );
231     }
232 
233     return xModel;
234 }
235 
236 // <--
237