xref: /AOO41X/main/sw/source/ui/uiview/uivwimp.cxx (revision efeef26f81c84063fb0a91bde3856d4a51172d90)
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  * --------------------------------------------------*/
SwView_Impl(SwView * pShell)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 --------------------------------------------------*/
~SwView_Impl()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 --------------------------------------------------*/
SetShellMode(ShellModes eSet)116 void SwView_Impl::SetShellMode(ShellModes eSet)
117 {
118     eShellMode = eSet;
119 }
120 /*-----------------13.12.97 09:59-------------------
121 
122 --------------------------------------------------*/
GetUNOObject()123 view::XSelectionSupplier*   SwView_Impl::GetUNOObject()
124 {
125     return pxXTextView->get();
126 }
127 /* -----------------02.06.98 15:29-------------------
128  *
129  * --------------------------------------------------*/
GetUNOObject_Impl()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  ---------------------------------------------------------------------------*/
ExecuteScan(SfxRequest & rReq)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  ---------------------------------------------------------------------------*/
GetScannerEventListener()220 SwScannerEventListener& SwView_Impl::GetScannerEventListener()
221 {
222     if(!xScanEvtLstnr.is())
223         xScanEvtLstnr = pScanEvtLstnr = new SwScannerEventListener(*pView);
224     return *pScanEvtLstnr;
225 }
226 
227 
AddClipboardListener()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  --------------------------------------------------*/
Invalidate()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  --------------------------------------------------*/
AddTransferable(SwTransferable & rTransferable)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 
StartDocumentInserter(const String & rFactory,const Link & rEndDialogHdl)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 
CreateMedium()273 SfxMedium* SwView_Impl::CreateMedium()
274 {
275     return m_pDocInserter->CreateMedium();
276 }
277 
InitRequest(const SfxRequest & rRequest)278 void SwView_Impl::InitRequest( const SfxRequest& rRequest )
279 {
280     delete m_pRequest;
281     m_pRequest = new SfxRequest( rRequest );
282 }
283 
284 // ------------------------- SwScannerEventListener ---------------------
285 
~SwScannerEventListener()286 SwScannerEventListener::~SwScannerEventListener()
287 {
288 }
289 
disposing(const EventObject & rEventObject)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 
~SwClipboardChangeListener()301 SwClipboardChangeListener::~SwClipboardChangeListener()
302 {
303 }
304 
disposing(const EventObject &)305 void SAL_CALL SwClipboardChangeListener::disposing( const EventObject& /*rEventObject*/ )
306     throw ( RuntimeException )
307 {
308 }
309 
changedContents(const CLIP_NMSPC::ClipboardEvent & rEventObject)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 
AddRemoveListener(sal_Bool bAdd)336 void SwClipboardChangeListener::AddRemoveListener( sal_Bool bAdd )
337 {
338     pView->AddRemoveClipboardListener( Reference< XClipboardListener >( this ), bAdd );
339 }
340 
341 
342