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 28 #include <cmdid.h> 29 #include "globals.hrc" 30 31 #include <tools/shl.hxx> 32 #include <com/sun/star/scanner/XScannerManager.hpp> 33 #include <com/sun/star/datatransfer/clipboard/XClipboardNotifier.hpp> 34 #include <com/sun/star/datatransfer/clipboard/XClipboard.hpp> 35 #include <com/sun/star/lang/XMultiServiceFactory.hpp> 36 #include <comphelper/processfactory.hxx> 37 #include <vos/mutex.hxx> 38 #include <vcl/svapp.hxx> 39 #include <vcl/wrkwin.hxx> 40 #include <vcl/msgbox.hxx> 41 #include <sfx2/viewfrm.hxx> 42 #include <sfx2/bindings.hxx> 43 44 #include <sfx2/docinsert.hxx> 45 #include <sfx2/request.hxx> 46 #include <uivwimp.hxx> 47 #include <wview.hxx> 48 #include <unotxvw.hxx> 49 #include <unodispatch.hxx> 50 #include <swmodule.hxx> 51 #include <swdtflvr.hxx> 52 #include <edtwin.hxx> 53 #include <mmconfigitem.hxx> 54 55 #include <view.hrc> 56 57 58 using namespace ::com::sun::star; 59 using namespace ::com::sun::star::uno; 60 using namespace ::com::sun::star::scanner; 61 using namespace ::com::sun::star::lang; 62 using namespace ::com::sun::star::datatransfer::clipboard; 63 64 /* -----------------02.06.98 15:31------------------- 65 * 66 * --------------------------------------------------*/ 67 SwView_Impl::SwView_Impl(SwView* pShell) : 68 pxXTextView(new uno::Reference<view::XSelectionSupplier>), 69 pView(pShell), 70 eShellMode(SHELL_MODE_TEXT), 71 pConfigItem(0), 72 nMailMergeRestartPage(0), 73 bMailMergeSourceView(sal_True), 74 m_pDocInserter(NULL), 75 m_pRequest(NULL), 76 m_bSelectObject(false), 77 m_bEditingPositionSet(false) 78 { 79 *pxXTextView = new SwXTextView(pView); 80 xDisProvInterceptor = new SwXDispatchProviderInterceptor(*pView); 81 } 82 83 /*-----------------13.12.97 09:51------------------- 84 85 --------------------------------------------------*/ 86 SwView_Impl::~SwView_Impl() 87 { 88 Reference<XUnoTunnel> xDispTunnel(xDisProvInterceptor, UNO_QUERY); 89 SwXDispatchProviderInterceptor* pInterceptor = 0; 90 if(xDispTunnel.is() && 91 0 != (pInterceptor = reinterpret_cast< SwXDispatchProviderInterceptor * >( 92 sal::static_int_cast< sal_IntPtr >( 93 xDispTunnel->getSomething(SwXDispatchProviderInterceptor::getUnoTunnelId()))))) 94 { 95 pInterceptor->Invalidate(); 96 } 97 view::XSelectionSupplier* pTextView = pxXTextView->get(); 98 ((SwXTextView*)pTextView)->Invalidate(); 99 delete pxXTextView; 100 if( xScanEvtLstnr.is() ) 101 pScanEvtLstnr->ViewDestroyed(); 102 if( xClipEvtLstnr.is() ) 103 { 104 pClipEvtLstnr->AddRemoveListener( sal_False ); 105 pClipEvtLstnr->ViewDestroyed(); 106 } 107 delete pConfigItem; 108 109 delete m_pDocInserter; 110 delete m_pRequest; 111 } 112 113 /*-----------------13.12.97 09:54------------------- 114 115 --------------------------------------------------*/ 116 void SwView_Impl::SetShellMode(ShellModes eSet) 117 { 118 eShellMode = eSet; 119 } 120 /*-----------------13.12.97 09:59------------------- 121 122 --------------------------------------------------*/ 123 view::XSelectionSupplier* SwView_Impl::GetUNOObject() 124 { 125 return pxXTextView->get(); 126 } 127 /* -----------------02.06.98 15:29------------------- 128 * 129 * --------------------------------------------------*/ 130 SwXTextView* SwView_Impl::GetUNOObject_Impl() 131 { 132 view::XSelectionSupplier* pTextView = pxXTextView->get(); 133 return ((SwXTextView*)pTextView); 134 } 135 /* -----------------------------29.05.00 09:04-------------------------------- 136 137 ---------------------------------------------------------------------------*/ 138 void SwView_Impl::ExecuteScan( SfxRequest& rReq ) 139 { 140 sal_uInt16 nSlot = rReq.GetSlot(); 141 switch(nSlot) 142 { 143 case SID_TWAIN_SELECT: 144 { 145 sal_Bool bDone = sal_False; 146 Reference< XScannerManager > xScanMgr = SW_MOD()->GetScannerManager(); 147 148 if( xScanMgr.is() ) 149 { 150 try 151 { 152 const Sequence< ScannerContext > 153 aContexts( xScanMgr->getAvailableScanners() ); 154 155 if( aContexts.getLength() ) 156 { 157 ScannerContext aContext( aContexts.getConstArray()[ 0 ] ); 158 bDone = xScanMgr->configureScanner( aContext ); 159 } 160 } 161 catch(...) 162 { 163 } 164 165 } 166 if( bDone ) 167 rReq.Done(); 168 else 169 { 170 rReq.Ignore(); 171 // KA 04.07.2002 172 // InfoBox( 0, SW_RES(MSG_SCAN_NOSOURCE) ).Execute(); 173 } 174 } 175 break; 176 177 case SID_TWAIN_TRANSFER: 178 { 179 sal_Bool bDone = sal_False; 180 181 Reference< XScannerManager > xScanMgr = SW_MOD()->GetScannerManager(); 182 if( xScanMgr.is() ) 183 { 184 SwScannerEventListener& rListener = GetScannerEventListener(); 185 try 186 { 187 const Sequence< scanner::ScannerContext >aContexts( xScanMgr->getAvailableScanners() ); 188 if( aContexts.getLength() ) 189 { 190 Reference< XEventListener > xLstner = &rListener; 191 xScanMgr->startScan( aContexts.getConstArray()[ 0 ], xLstner ); 192 bDone = sal_True; 193 } 194 } 195 catch(...) 196 { 197 } 198 } 199 200 if( !bDone ) 201 { 202 InfoBox( 0, SW_RES(MSG_SCAN_NOSOURCE) ).Execute(); 203 rReq.Ignore(); 204 } 205 else 206 { 207 rReq.Done(); 208 SfxBindings& rBind = pView->GetViewFrame()->GetBindings(); 209 rBind.Invalidate( SID_TWAIN_SELECT ); 210 rBind.Invalidate( SID_TWAIN_TRANSFER ); 211 } 212 } 213 break; 214 } 215 } 216 217 /* -----------------------------29.05.00 08:26-------------------------------- 218 219 ---------------------------------------------------------------------------*/ 220 SwScannerEventListener& SwView_Impl::GetScannerEventListener() 221 { 222 if(!xScanEvtLstnr.is()) 223 xScanEvtLstnr = pScanEvtLstnr = new SwScannerEventListener(*pView); 224 return *pScanEvtLstnr; 225 } 226 227 228 void SwView_Impl::AddClipboardListener() 229 { 230 if(!xClipEvtLstnr.is()) 231 { 232 xClipEvtLstnr = pClipEvtLstnr = new SwClipboardChangeListener( *pView ); 233 pClipEvtLstnr->AddRemoveListener( sal_True ); 234 } 235 } 236 /* -----------------3/31/2003 11:42AM---------------- 237 238 --------------------------------------------------*/ 239 void SwView_Impl::Invalidate() 240 { 241 GetUNOObject_Impl()->Invalidate(); 242 Reference< XUnoTunnel > xTunnel(xTransferable.get(), UNO_QUERY); 243 if(xTunnel.is()) 244 245 { 246 SwTransferable* pTransferable = reinterpret_cast< SwTransferable * >( 247 sal::static_int_cast< sal_IntPtr >( 248 xTunnel->getSomething(SwTransferable::getUnoTunnelId()))); 249 if(pTransferable) 250 pTransferable->Invalidate(); 251 } 252 } 253 /* -----------------3/31/2003 12:40PM---------------- 254 255 --------------------------------------------------*/ 256 void SwView_Impl::AddTransferable(SwTransferable& rTransferable) 257 { 258 //prevent removing of the non-referenced SwTransferable 259 rTransferable.m_refCount++;; 260 { 261 xTransferable = Reference<XUnoTunnel> (&rTransferable); 262 } 263 rTransferable.m_refCount--; 264 } 265 266 void SwView_Impl::StartDocumentInserter( const String& rFactory, const Link& rEndDialogHdl ) 267 { 268 delete m_pDocInserter; 269 m_pDocInserter = new ::sfx2::DocumentInserter( 0, rFactory ); 270 m_pDocInserter->StartExecuteModal( rEndDialogHdl ); 271 } 272 273 SfxMedium* SwView_Impl::CreateMedium() 274 { 275 return m_pDocInserter->CreateMedium(); 276 } 277 278 void SwView_Impl::InitRequest( const SfxRequest& rRequest ) 279 { 280 delete m_pRequest; 281 m_pRequest = new SfxRequest( rRequest ); 282 } 283 284 // ------------------------- SwScannerEventListener --------------------- 285 286 SwScannerEventListener::~SwScannerEventListener() 287 { 288 } 289 290 void SAL_CALL SwScannerEventListener::disposing( const EventObject& rEventObject) throw(uno::RuntimeException) 291 { 292 vos::OGuard aGuard(Application::GetSolarMutex()); 293 #if defined WNT || defined UNX 294 if( pView ) 295 pView->ScannerEventHdl( rEventObject ); 296 #endif 297 } 298 299 // ------------------------- SwClipboardChangeListener --------------------- 300 301 SwClipboardChangeListener::~SwClipboardChangeListener() 302 { 303 } 304 305 void SAL_CALL SwClipboardChangeListener::disposing( const EventObject& /*rEventObject*/ ) 306 throw ( RuntimeException ) 307 { 308 } 309 310 void SAL_CALL SwClipboardChangeListener::changedContents( const CLIP_NMSPC::ClipboardEvent& rEventObject ) 311 throw ( RuntimeException ) 312 313 { 314 const ::vos::OGuard aGuard( Application::GetSolarMutex() ); 315 if( pView ) 316 { 317 { 318 TransferableDataHelper aDataHelper( rEventObject.Contents ); 319 SwWrtShell& rSh = pView->GetWrtShell(); 320 321 pView->nLastPasteDestination = SwTransferable::GetSotDestination( rSh ); 322 pView->bPasteState = aDataHelper.GetXTransferable().is() && 323 SwTransferable::IsPaste( rSh, aDataHelper ); 324 325 pView->bPasteSpecialState = aDataHelper.GetXTransferable().is() && 326 SwTransferable::IsPasteSpecial( rSh, aDataHelper ); 327 } 328 329 SfxBindings& rBind = pView->GetViewFrame()->GetBindings(); 330 rBind.Invalidate( SID_PASTE ); 331 rBind.Invalidate( SID_PASTE_SPECIAL ); 332 rBind.Invalidate( SID_CLIPBOARD_FORMAT_ITEMS ); 333 } 334 } 335 336 void SwClipboardChangeListener::AddRemoveListener( sal_Bool bAdd ) 337 { 338 pView->AddRemoveClipboardListener( Reference< XClipboardListener >( this ), bAdd ); 339 } 340 341 342