1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 // MARKER(update_precomp.py): autogen include statement, do not remove 29 #include "precompiled_sd.hxx" 30 #include <unotools/pathoptions.hxx> 31 #include <svl/languageoptions.hxx> 32 #ifndef _UNOTOOLS_UCBSTREAMHELPER_HXX 33 #include <unotools/ucbstreamhelper.hxx> 34 #endif 35 #include <tools/urlobj.hxx> 36 #include <vcl/virdev.hxx> 37 #include <sfx2/app.hxx> 38 #include <vcl/status.hxx> 39 #include <svl/intitem.hxx> 40 #include <sfx2/msg.hxx> 41 #include <sfx2/objface.hxx> 42 #include <sfx2/printer.hxx> 43 #include <svx/pszctrl.hxx> 44 #include <svx/zoomctrl.hxx> 45 #include <svx/modctrl.hxx> 46 #include <svl/zforlist.hxx> 47 #include <comphelper/processfactory.hxx> 48 #include <svtools/ehdl.hxx> 49 50 #include <svx/svxids.hrc> 51 #include <svl/srchitem.hxx> 52 #include <svx/svxerr.hxx> 53 54 #include <svx/xmlsecctrl.hxx> 55 56 57 #define _SD_DLL // fuer SD_MOD() 58 #include "sderror.hxx" 59 #include "sdmod.hxx" 60 #include "sddll.hxx" 61 #include "sdresid.hxx" 62 #include "optsitem.hxx" 63 #include "DrawDocShell.hxx" 64 #include "drawdoc.hxx" 65 #include "app.hrc" 66 #include "glob.hrc" 67 #include "strings.hrc" 68 #include "res_bmp.hrc" 69 #include "cfgids.hxx" 70 #include "tools/SdGlobalResourceContainer.hxx" 71 72 TYPEINIT1( SdModule, SfxModule ); 73 74 #define SdModule 75 #include "sdslots.hxx" 76 77 78 SFX_IMPL_INTERFACE(SdModule, SfxModule, SdResId(STR_APPLICATIONOBJECTBAR)) 79 { 80 SFX_STATUSBAR_REGISTRATION(SdResId(RID_DRAW_STATUSBAR)); 81 } 82 83 /************************************************************************* 84 |* 85 |* Ctor 86 |* 87 \************************************************************************/ 88 89 SdModule::SdModule(SfxObjectFactory* pFact1, SfxObjectFactory* pFact2 ) 90 : SfxModule( SfxApplication::CreateResManager("sd"), sal_False, 91 pFact1, pFact2, NULL ), 92 pTransferClip(NULL), 93 pTransferDrag(NULL), 94 pTransferSelection(NULL), 95 pImpressOptions(NULL), 96 pDrawOptions(NULL), 97 pSearchItem(NULL), 98 pNumberFormatter( NULL ), 99 bWaterCan(sal_False), 100 mpResourceContainer(new ::sd::SdGlobalResourceContainer()) 101 { 102 SetName( UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "StarDraw" ) ) ); // Nicht uebersetzen! 103 pSearchItem = new SvxSearchItem(SID_SEARCH_ITEM); 104 pSearchItem->SetAppFlag(SVX_SEARCHAPP_DRAW); 105 StartListening( *SFX_APP() ); 106 SvxErrorHandler::Get(); 107 mpErrorHdl = new SfxErrorHandler( RID_SD_ERRHDL, 108 ERRCODE_AREA_SD, 109 ERRCODE_AREA_SD_END, 110 GetResMgr() ); 111 112 // Create a new ref device and (by calling SetReferenceDevice()) 113 // set its resolution to 600 DPI. This leads to a visually better 114 // formatting of text in small sizes (6 point and below.) 115 VirtualDevice* pDevice = new VirtualDevice; 116 mpVirtualRefDevice = pDevice; 117 pDevice->SetMapMode( MAP_100TH_MM ); 118 pDevice->SetReferenceDevice ( VirtualDevice::REFDEV_MODE06 ); 119 } 120 121 122 123 /************************************************************************* 124 |* 125 |* Dtor 126 |* 127 \************************************************************************/ 128 129 SdModule::~SdModule() 130 { 131 delete pSearchItem; 132 133 if( pNumberFormatter ) 134 delete pNumberFormatter; 135 136 ::sd::DrawDocShell* pDocShell = PTR_CAST(::sd::DrawDocShell, SfxObjectShell::Current()); 137 if( pDocShell ) 138 { 139 ::sd::ViewShell* pViewShell = pDocShell->GetViewShell(); 140 if (pViewShell) 141 { 142 // Removing our event listener 143 Application::RemoveEventListener( LINK( this, SdModule, EventListenerHdl ) ); 144 } 145 } 146 147 mpResourceContainer.reset(); 148 149 // Mark the module in the global AppData structure as deleted. 150 SdModule** ppShellPointer = (SdModule**)GetAppData(SHL_DRAW); 151 if (ppShellPointer != NULL) 152 (*ppShellPointer) = NULL; 153 154 delete mpErrorHdl; 155 delete static_cast< VirtualDevice* >( mpVirtualRefDevice ); 156 } 157 158 159 /************************************************************************* 160 |* 161 |* get notifications 162 |* 163 \************************************************************************/ 164 165 void SdModule::Notify( SfxBroadcaster&, const SfxHint& rHint ) 166 { 167 if( rHint.ISA( SfxSimpleHint ) && 168 ( (SfxSimpleHint&) rHint ).GetId() == SFX_HINT_DEINITIALIZING ) 169 { 170 delete pImpressOptions, pImpressOptions = NULL; 171 delete pDrawOptions, pDrawOptions = NULL; 172 } 173 } 174 175 /************************************************************************* 176 |* 177 |* Optionen zurueckgeben 178 |* 179 \************************************************************************/ 180 181 SdOptions* SdModule::GetSdOptions(DocumentType eDocType) 182 { 183 SdOptions* pOptions = NULL; 184 185 if (eDocType == DOCUMENT_TYPE_DRAW) 186 { 187 if (!pDrawOptions) 188 pDrawOptions = new SdOptions( SDCFG_DRAW ); 189 190 pOptions = pDrawOptions; 191 } 192 else if (eDocType == DOCUMENT_TYPE_IMPRESS) 193 { 194 if (!pImpressOptions) 195 pImpressOptions = new SdOptions( SDCFG_IMPRESS ); 196 197 pOptions = pImpressOptions; 198 } 199 if( pOptions ) 200 { 201 sal_uInt16 nMetric = pOptions->GetMetric(); 202 203 ::sd::DrawDocShell* pDocSh = PTR_CAST(::sd::DrawDocShell, SfxObjectShell::Current() ); 204 SdDrawDocument* pDoc = NULL; 205 if (pDocSh) 206 pDoc = pDocSh->GetDoc(); 207 208 if( nMetric != 0xffff && pDoc && eDocType == pDoc->GetDocumentType() ) 209 PutItem( SfxUInt16Item( SID_ATTR_METRIC, nMetric ) ); 210 } 211 212 return(pOptions); 213 } 214 215 /************************************************************************* 216 |* 217 |* Optionen-Stream fuer interne Options oeffnen und zurueckgeben; 218 |* falls der Stream zum Lesen geoeffnet wird, aber noch nicht 219 |* angelegt wurde, wird ein 'leeres' RefObject zurueckgegeben 220 |* 221 \************************************************************************/ 222 223 SvStorageStreamRef SdModule::GetOptionStream( const String& rOptionName, 224 SdOptionStreamMode eMode ) 225 { 226 ::sd::DrawDocShell* pDocSh = PTR_CAST(::sd::DrawDocShell, SfxObjectShell::Current() ); 227 SvStorageStreamRef xStm; 228 229 if( pDocSh ) 230 { 231 DocumentType eType = pDocSh->GetDoc()->GetDocumentType(); 232 String aStmName; 233 234 if( !xOptionStorage.Is() ) 235 { 236 INetURLObject aURL( SvtPathOptions().GetUserConfigPath() ); 237 238 aURL.Append( UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "drawing.cfg" ) ) ); 239 240 SvStream* pStm = ::utl::UcbStreamHelper::CreateStream( aURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_READWRITE ); 241 242 if( pStm ) 243 xOptionStorage = new SvStorage( pStm, sal_True ); 244 } 245 246 if( DOCUMENT_TYPE_DRAW == eType ) 247 aStmName.AssignAscii( RTL_CONSTASCII_STRINGPARAM( "Draw_" ) ); 248 else 249 aStmName.AssignAscii( RTL_CONSTASCII_STRINGPARAM( "Impress_" ) ); 250 251 aStmName += rOptionName; 252 253 if( SD_OPTION_STORE == eMode || xOptionStorage->IsContained( aStmName ) ) 254 xStm = xOptionStorage->OpenSotStream( aStmName ); 255 } 256 257 return xStm; 258 } 259 260 /************************************************************************* 261 |* 262 \************************************************************************/ 263 264 SvNumberFormatter* SdModule::GetNumberFormatter() 265 { 266 if( !pNumberFormatter ) 267 pNumberFormatter = new SvNumberFormatter( ::comphelper::getProcessServiceFactory(), LANGUAGE_SYSTEM ); 268 269 return pNumberFormatter; 270 } 271 272 /************************************************************************* 273 |* 274 \************************************************************************/ 275 276 OutputDevice* SdModule::GetVirtualRefDevice (void) 277 { 278 return mpVirtualRefDevice; 279 } 280 281 /** This method is deprecated and only an alias to 282 <member>GetVirtualRefDevice()</member>. The given argument is ignored. 283 */ 284 OutputDevice* SdModule::GetRefDevice (::sd::DrawDocShell& ) 285 { 286 return GetVirtualRefDevice(); 287 } 288