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