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 SwDrawModel::SwDrawModel( SwDoc* pD ) 66 : FmFormModel( ::GetPalettePath(), &pD->GetAttrPool(), pD->GetDocShell() ), 67 pDoc( pD ) 68 { 69 SetScaleUnit( MAP_TWIP ); 70 SetSwapGraphics( sal_True ); 71 72 // use common InitDrawModelAndDocShell which will set the associations as needed, 73 // including SvxColorTableItem with WhichID SID_COLOR_TABLE 74 InitDrawModelAndDocShell(pDoc ? pDoc->GetDocShell() : 0, this); 75 76 // copy all the default values to the SdrModel 77 SfxItemPool* pSdrPool = pD->GetAttrPool().GetSecondaryPool(); 78 if( pSdrPool ) 79 { 80 const sal_uInt16 aWhichRanges[] = 81 { 82 RES_CHRATR_BEGIN, RES_CHRATR_END, 83 RES_PARATR_BEGIN, RES_PARATR_END, 84 0 85 }; 86 87 SfxItemPool& rDocPool = pD->GetAttrPool(); 88 sal_uInt16 nEdtWhich, nSlotId; 89 const SfxPoolItem* pItem; 90 for( const sal_uInt16* pRangeArr = aWhichRanges; 91 *pRangeArr; pRangeArr += 2 ) 92 for( sal_uInt16 nW = *pRangeArr, nEnd = *(pRangeArr+1); 93 nW < nEnd; ++nW ) 94 if( 0 != (pItem = rDocPool.GetPoolDefaultItem( nW )) && 95 0 != (nSlotId = rDocPool.GetSlotId( nW ) ) && 96 nSlotId != nW && 97 0 != (nEdtWhich = pSdrPool->GetWhich( nSlotId )) && 98 nSlotId != nEdtWhich ) 99 { 100 SfxPoolItem* pCpy = pItem->Clone(); 101 pCpy->SetWhich( nEdtWhich ); 102 pSdrPool->SetPoolDefaultItem( *pCpy ); 103 delete pCpy; 104 } 105 } 106 107 SetForbiddenCharsTable( pD->getForbiddenCharacterTable() ); 108 // #87795# Implementation for asian compression 109 SetCharCompressType( static_cast<sal_uInt16>(pD->getCharacterCompressionType() )); 110 } 111 112 /************************************************************************* 113 |* 114 |* Destruktor 115 |* 116 \************************************************************************/ 117 118 119 SwDrawModel::~SwDrawModel() 120 { 121 Broadcast(SdrHint(HINT_MODELCLEARED)); 122 123 // #116168# 124 ClearModel(sal_True); 125 //Clear(); 126 } 127 128 /************************************************************************* 129 |* 130 |* Diese Methode erzeugt eine neue Seite (SdPage) und gibt einen Zeiger 131 |* darauf zurueck. Die Drawing Engine benutzt diese Methode beim Laden 132 |* zur Erzeugung von Seiten (deren Typ sie ja nicht kennt, da es ABLEITUNGEN 133 |* der SdrPage sind). 134 |* 135 \************************************************************************/ 136 137 138 SdrPage* SwDrawModel::AllocPage(FASTBOOL bMasterPage) 139 { 140 SwDPage* pPage = new SwDPage(*this, 0 != bMasterPage); 141 pPage->SetName( String::CreateFromAscii( 142 RTL_CONSTASCII_STRINGPARAM( "Controls" )) ); 143 return pPage; 144 } 145 146 147 SvStream* SwDrawModel::GetDocumentStream( SdrDocumentStreamInfo& rInfo ) const 148 { 149 SvStream* pRet = NULL; 150 uno::Reference < embed::XStorage > xRoot( pDoc->GetDocStorage() ); 151 if( xRoot.is() ) 152 { 153 if( rInfo.maUserData.Len() && 154 ( rInfo.maUserData.GetToken( 0, ':' ) == 155 String( RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.Package" ) ) ) ) 156 { 157 const String aPicturePath( rInfo.maUserData.GetToken( 1, ':' ) ); 158 159 // graphic from picture stream in picture storage in XML package 160 if( aPicturePath.GetTokenCount( '/' ) == 2 ) 161 { 162 const String aPictureStorageName( aPicturePath.GetToken( 0, '/' ) ); 163 const String aPictureStreamName( aPicturePath.GetToken( 1, '/' ) ); 164 165 try 166 { 167 uno::Reference < embed::XStorage > xPictureStorage = xRoot->openStorageElement( 168 aPictureStorageName, embed::ElementModes::READ ); 169 uno::Reference < io::XStream > xStream = xPictureStorage->openStreamElement( 170 aPictureStreamName, embed::ElementModes::READ ); 171 pRet = utl::UcbStreamHelper::CreateStream( xStream ); 172 if( pRet ) 173 { 174 rInfo.mbDeleteAfterUse = sal_True; 175 rInfo.mxStorageRef = xPictureStorage; 176 } 177 } 178 catch ( uno::Exception& ) 179 { 180 } 181 } 182 } 183 } 184 return pRet; 185 } 186 187 SdrLayerID SwDrawModel::GetControlExportLayerId( const SdrObject & ) const 188 { 189 //fuer Versionen < 5.0, es gab nur Hell und Heaven 190 return (SdrLayerID)pDoc->GetHeavenId(); 191 } 192 193 // --> OD 2006-03-01 #b6382898# 194 uno::Reference< uno::XInterface > SwDrawModel::createUnoModel() 195 { 196 197 uno::Reference< uno::XInterface > xModel; 198 199 try 200 { 201 if ( GetDoc().GetDocShell() ) 202 { 203 xModel = GetDoc().GetDocShell()->GetModel(); 204 } 205 } 206 catch( uno::RuntimeException& ) 207 { 208 ASSERT( false, "<SwDrawModel::createUnoModel()> - could *not* retrieve model at <SwDocShell>" ); 209 } 210 211 return xModel; 212 } 213 214 // <-- 215