xref: /aoo42x/main/sfx2/source/view/viewsh.cxx (revision 7c9a78b3)
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_sfx2.hxx"
26 #include <svl/stritem.hxx>
27 #include <svl/eitem.hxx>
28 #include <svl/whiter.hxx>
29 #include <vcl/msgbox.hxx>
30 #include <vcl/toolbox.hxx>
31 #include <svl/intitem.hxx>
32 #include <svtools/sfxecode.hxx>
33 #include <svtools/ehdl.hxx>
34 #include <com/sun/star/frame/XLayoutManager.hpp>
35 #include <com/sun/star/frame/XModuleManager.hpp>
36 #include <com/sun/star/beans/XPropertySet.hpp>
37 #include <com/sun/star/embed/EmbedStates.hpp>
38 #include <com/sun/star/embed/EmbedMisc.hpp>
39 #include <com/sun/star/system/SystemShellExecute.hpp>
40 #include <com/sun/star/system/SystemShellExecuteFlags.hpp>
41 #include <com/sun/star/container/XContainerQuery.hpp>
42 #include <com/sun/star/frame/XStorable.hpp>
43 #include <com/sun/star/datatransfer/clipboard/XClipboard.hpp>
44 #include <cppuhelper/implbase1.hxx>
45 
46 #include <osl/file.hxx>
47 #include <vos/mutex.hxx>
48 #include <tools/urlobj.hxx>
49 #include <unotools/tempfile.hxx>
50 #include <unotools/pathoptions.hxx>
51 #include <svtools/miscopt.hxx>
52 #include <svtools/soerr.hxx>
53 #include <unotools/internaloptions.hxx>
54 
55 #include <unotools/javaoptions.hxx>
56 #include <basic/basmgr.hxx>
57 #include <basic/sbuno.hxx>
58 #include <framework/actiontriggerhelper.hxx>
59 #include <comphelper/processfactory.hxx>
60 #include <comphelper/sequenceashashmap.hxx>
61 #include <toolkit/unohlp.hxx>
62 
63 
64 #include <sfx2/app.hxx>
65 #include "view.hrc"
66 #include <sfx2/viewsh.hxx>
67 #include "viewimp.hxx"
68 #include "sfx2/sfxresid.hxx"
69 #include <sfx2/request.hxx>
70 #include <sfx2/templdlg.hxx>
71 #include <sfx2/printer.hxx>
72 #include <sfx2/docfile.hxx>
73 #include <sfx2/dispatch.hxx>
74 #include "arrdecl.hxx"
75 #include <sfx2/docfac.hxx>
76 #include "view.hrc"
77 #include "sfxlocal.hrc"
78 #include <sfx2/sfxbasecontroller.hxx>
79 #include "sfx2/mailmodelapi.hxx"
80 #include <sfx2/viewfrm.hxx>
81 #include <sfx2/event.hxx>
82 #include <sfx2/fcontnr.hxx>
83 #include <sfx2/ipclient.hxx>
84 #include "workwin.hxx"
85 #include <sfx2/objface.hxx>
86 #include <sfx2/docfilt.hxx>
87 
88 // #110897#
89 #ifndef _UNOTOOLS_PROCESSFACTORY_HXX
90 #include <comphelper/processfactory.hxx>
91 #endif
92 
93 using namespace ::com::sun::star;
94 using namespace ::com::sun::star::uno;
95 using namespace ::com::sun::star::frame;
96 using namespace ::com::sun::star::beans;
97 using namespace ::com::sun::star::util;
98 using namespace ::com::sun::star::system;
99 using namespace ::cppu;
100 namespace css = ::com::sun::star;
101 
102 //=========================================================================
103 DBG_NAME(SfxViewShell)
104 
105 #define SfxViewShell
106 #include "sfxslots.hxx"
107 
108 //=========================================================================
109 
110 class SfxClipboardChangeListener : public ::cppu::WeakImplHelper1<
111     datatransfer::clipboard::XClipboardListener >
112 {
113 public:
114     SfxClipboardChangeListener( SfxViewShell* pView, const uno::Reference< datatransfer::clipboard::XClipboardNotifier >& xClpbrdNtfr );
115     virtual ~SfxClipboardChangeListener();
116 
117     // XEventListener
118     virtual void SAL_CALL disposing( const lang::EventObject& rEventObject )
119         throw ( uno::RuntimeException );
120 
121     // XClipboardListener
122     virtual void SAL_CALL changedContents( const datatransfer::clipboard::ClipboardEvent& rEventObject )
123         throw ( uno::RuntimeException );
124 
125     void DisconnectViewShell() { m_pViewShell = NULL; }
126     void ChangedContents();
127 
128     enum AsyncExecuteCmd
129     {
130         ASYNCEXECUTE_CMD_DISPOSING,
131         ASYNCEXECUTE_CMD_CHANGEDCONTENTS
132     };
133 
134     struct AsyncExecuteInfo
135     {
136         AsyncExecuteInfo( AsyncExecuteCmd eCmd, uno::Reference< datatransfer::clipboard::XClipboardListener > xThis, SfxClipboardChangeListener* pListener ) :
137             m_eCmd( eCmd ), m_xThis( xThis ), m_pListener( pListener ) {}
138 
139         AsyncExecuteCmd m_eCmd;
140         uno::Reference< datatransfer::clipboard::XClipboardListener > m_xThis;
141         SfxClipboardChangeListener* m_pListener;
142     };
143 
144 private:
145     SfxViewShell* m_pViewShell;
146     uno::Reference< datatransfer::clipboard::XClipboardNotifier > m_xClpbrdNtfr;
147     uno::Reference< lang::XComponent > m_xCtrl;
148 
149     DECL_STATIC_LINK( SfxClipboardChangeListener, AsyncExecuteHdl_Impl, AsyncExecuteInfo* );
150 };
151 
152 SfxClipboardChangeListener::SfxClipboardChangeListener( SfxViewShell* pView, const uno::Reference< datatransfer::clipboard::XClipboardNotifier >& xClpbrdNtfr )
153   : m_pViewShell( 0 ), m_xClpbrdNtfr( xClpbrdNtfr )
154 {
155     m_xCtrl = uno::Reference < lang::XComponent >( pView->GetController(), uno::UNO_QUERY );
156     if ( m_xCtrl.is() )
157     {
158         m_xCtrl->addEventListener( uno::Reference < lang::XEventListener > ( static_cast < lang::XEventListener* >( this ) ) );
159         m_pViewShell = pView;
160     }
161     if ( m_xClpbrdNtfr.is() )
162     {
163         m_xClpbrdNtfr->addClipboardListener( uno::Reference< datatransfer::clipboard::XClipboardListener >(
164             static_cast< datatransfer::clipboard::XClipboardListener* >( this )));
165     }
166 }
167 
168 SfxClipboardChangeListener::~SfxClipboardChangeListener()
169 {
170 }
171 
172 void SfxClipboardChangeListener::ChangedContents()
173 {
174     const ::vos::OGuard aGuard( Application::GetSolarMutex() );
175     if( m_pViewShell )
176     {
177         SfxBindings& rBind = m_pViewShell->GetViewFrame()->GetBindings();
178         rBind.Invalidate( SID_PASTE );
179         rBind.Invalidate( SID_PASTE_SPECIAL );
180         rBind.Invalidate( SID_CLIPBOARD_FORMAT_ITEMS );
181     }
182 }
183 
184 IMPL_STATIC_LINK_NOINSTANCE( SfxClipboardChangeListener, AsyncExecuteHdl_Impl, AsyncExecuteInfo*, pAsyncExecuteInfo )
185 {
186     if ( pAsyncExecuteInfo )
187     {
188         uno::Reference< datatransfer::clipboard::XClipboardListener > xThis( pAsyncExecuteInfo->m_xThis );
189         if ( pAsyncExecuteInfo->m_pListener )
190         {
191             if ( pAsyncExecuteInfo->m_eCmd == ASYNCEXECUTE_CMD_DISPOSING )
192                 pAsyncExecuteInfo->m_pListener->DisconnectViewShell();
193             else if ( pAsyncExecuteInfo->m_eCmd == ASYNCEXECUTE_CMD_CHANGEDCONTENTS )
194                 pAsyncExecuteInfo->m_pListener->ChangedContents();
195         }
196     }
197     delete pAsyncExecuteInfo;
198 
199     return 0;
200 }
201 
202 void SAL_CALL SfxClipboardChangeListener::disposing( const lang::EventObject& /*rEventObject*/ )
203 throw ( uno::RuntimeException )
204 {
205     // Either clipboard or ViewShell is going to be destroyed -> no interest in listening anymore
206     uno::Reference< lang::XComponent > xCtrl( m_xCtrl );
207     uno::Reference< datatransfer::clipboard::XClipboardNotifier > xNotify( m_xClpbrdNtfr );
208 
209     uno::Reference< datatransfer::clipboard::XClipboardListener > xThis( static_cast< datatransfer::clipboard::XClipboardListener* >( this ));
210     if ( xCtrl.is() )
211         xCtrl->removeEventListener( uno::Reference < lang::XEventListener > ( static_cast < lang::XEventListener* >( this )));
212     if ( xNotify.is() )
213         xNotify->removeClipboardListener( xThis );
214 
215     // Make asynchronous call to avoid locking SolarMutex which is the
216     // root for many deadlocks, especially in conjuction with the "Windows"
217     // based single thread apartment clipboard code!
218     AsyncExecuteInfo* pInfo = new AsyncExecuteInfo( ASYNCEXECUTE_CMD_DISPOSING, xThis, this );
219     Application::PostUserEvent( STATIC_LINK( 0, SfxClipboardChangeListener, AsyncExecuteHdl_Impl ), pInfo );
220 }
221 
222 void SAL_CALL SfxClipboardChangeListener::changedContents( const datatransfer::clipboard::ClipboardEvent& )
223         throw ( RuntimeException )
224 {
225     // Make asynchronous call to avoid locking SolarMutex which is the
226     // root for many deadlocks, especially in conjuction with the "Windows"
227     // based single thread apartment clipboard code!
228     uno::Reference< datatransfer::clipboard::XClipboardListener > xThis( static_cast< datatransfer::clipboard::XClipboardListener* >( this ));
229     AsyncExecuteInfo* pInfo = new AsyncExecuteInfo( ASYNCEXECUTE_CMD_CHANGEDCONTENTS, xThis, this );
230     Application::PostUserEvent( STATIC_LINK( 0, SfxClipboardChangeListener, AsyncExecuteHdl_Impl ), pInfo );
231 }
232 
233 //=========================================================================
234 
235 static ::rtl::OUString RetrieveLabelFromCommand(
236     const ::rtl::OUString& rCommandURL,
237     const css::uno::Reference< css::frame::XFrame >& rFrame )
238 {
239     static css::uno::WeakReference< frame::XModuleManager > s_xModuleManager;
240     static css::uno::WeakReference< container::XNameAccess > s_xNameAccess;
241 
242     ::rtl::OUString aLabel;
243     css::uno::Reference< css::frame::XModuleManager > xModuleManager( s_xModuleManager );
244     css::uno::Reference< css::container::XNameAccess > xNameAccess( s_xNameAccess );
245     css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR(
246         ::comphelper::getProcessServiceFactory(), css::uno::UNO_QUERY_THROW);
247 
248     try
249     {
250         if ( !xModuleManager.is() )
251         {
252             xModuleManager = css::uno::Reference< css::frame::XModuleManager >(
253                 xSMGR->createInstance(
254                     ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.ModuleManager" ))),
255                     css::uno::UNO_QUERY_THROW );
256             s_xModuleManager = xModuleManager;
257         }
258 
259         ::rtl::OUString aModuleIdentifier = xModuleManager->identify( rFrame );
260 
261         if ( !xNameAccess.is() )
262         {
263             xNameAccess = css::uno::Reference< css::container::XNameAccess >(
264                 xSMGR->createInstance(
265                     ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.UICommandDescription" ))),
266                     css::uno::UNO_QUERY_THROW );
267             s_xNameAccess = xNameAccess;
268         }
269 
270         css::uno::Any a = xNameAccess->getByName( aModuleIdentifier );
271         css::uno::Reference< css::container::XNameAccess > xUICommands;
272         a >>= xUICommands;
273 
274         rtl::OUString aStr;
275         css::uno::Sequence< css::beans::PropertyValue > aPropSeq;
276 
277         a = xUICommands->getByName( rCommandURL );
278         if ( a >>= aPropSeq )
279         {
280             for ( sal_Int32 i = 0; i < aPropSeq.getLength(); i++ )
281             {
282                 if ( aPropSeq[i].Name.equalsAscii( "Label" ))
283                 {
284                     aPropSeq[i].Value >>= aStr;
285                     break;
286                 }
287             }
288             aLabel = aStr;
289         }
290     }
291     catch ( css::uno::Exception& )
292     {
293     }
294 
295     return aLabel;
296 }
297 
298 //=========================================================================
299 SfxViewShell_Impl::SfxViewShell_Impl(sal_uInt16 const nFlags)
300 : aInterceptorContainer( aMutex )
301 ,   m_bControllerSet(false)
302 ,   m_nPrinterLocks(0)
303 ,   m_bCanPrint(SFX_VIEW_CAN_PRINT == (nFlags & SFX_VIEW_CAN_PRINT))
304 ,   m_bHasPrintOptions(
305         SFX_VIEW_HAS_PRINTOPTIONS == (nFlags & SFX_VIEW_HAS_PRINTOPTIONS))
306 ,   m_bPlugInsActive(true)
307 ,   m_bIsShowView(SFX_VIEW_NO_SHOW != (nFlags & SFX_VIEW_NO_SHOW))
308 ,   m_bGotOwnership(false)
309 ,   m_bGotFrameOwnership(false)
310 ,   m_eScroll(SCROLLING_DEFAULT)
311 ,   m_nFamily(0xFFFF)   // undefined, default set by TemplateDialog
312 ,   m_pController(0)
313 ,   m_pAccExec(0)
314 {}
315 
316 //=========================================================================
317 SFX_IMPL_INTERFACE(SfxViewShell,SfxShell,SfxResId(0))
318 {
319         SFX_CHILDWINDOW_REGISTRATION( SID_MAIL_CHILDWIN );
320 }
321 
322 TYPEINIT2(SfxViewShell,SfxShell,SfxListener);
323 
324 //--------------------------------------------------------------------
325 /** search for a filter name dependent on type and module
326  */
327 
328 static ::rtl::OUString impl_retrieveFilterNameFromTypeAndModule(
329     const css::uno::Reference< css::container::XContainerQuery >& rContainerQuery,
330     const ::rtl::OUString& rType,
331     const ::rtl::OUString& rModuleIdentifier,
332     const sal_Int32 nFlags )
333 {
334     // Retrieve filter from type
335     css::uno::Sequence< css::beans::NamedValue > aQuery( 2 );
336     aQuery[0].Name  = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Type" ));
337     aQuery[0].Value = css::uno::makeAny( rType );
338     aQuery[1].Name  = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DocumentService" ));
339     aQuery[1].Value = css::uno::makeAny( rModuleIdentifier );
340 
341     css::uno::Reference< css::container::XEnumeration > xEnumeration =
342         rContainerQuery->createSubSetEnumerationByProperties( aQuery );
343 
344     ::rtl::OUString aFoundFilterName;
345     while ( xEnumeration->hasMoreElements() )
346     {
347         ::comphelper::SequenceAsHashMap aFilterPropsHM( xEnumeration->nextElement() );
348         ::rtl::OUString aFilterName = aFilterPropsHM.getUnpackedValueOrDefault(
349                                     ::rtl::OUString::createFromAscii( "Name" ),
350                                     ::rtl::OUString() );
351 
352         sal_Int32 nFilterFlags = aFilterPropsHM.getUnpackedValueOrDefault(
353                                     ::rtl::OUString::createFromAscii( "Flags" ),
354                                     sal_Int32( 0 ) );
355 
356         if ( nFilterFlags & nFlags )
357         {
358             aFoundFilterName = aFilterName;
359             break;
360         }
361     }
362 
363     return aFoundFilterName;
364 }
365 
366 //--------------------------------------------------------------------
367 /** search for an internal typename, which map to the current app module
368     and map also to a "family" of file formats as e.g. PDF/MS Doc/OOo Doc.
369  */
370 enum ETypeFamily
371 {
372     E_MS_DOC,
373     E_OOO_DOC
374 };
375 
376 ::rtl::OUString impl_searchFormatTypeForApp(const css::uno::Reference< css::frame::XFrame >& xFrame     ,
377                                                   ETypeFamily                                eTypeFamily)
378 {
379     static ::rtl::OUString SERVICENAME_MODULEMANAGER = ::rtl::OUString::createFromAscii("com.sun.star.frame.ModuleManager");
380 
381     try
382     {
383         css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR         (::comphelper::getProcessServiceFactory()        , css::uno::UNO_QUERY_THROW);
384         css::uno::Reference< css::frame::XModuleManager >      xModuleManager(xSMGR->createInstance(SERVICENAME_MODULEMANAGER), css::uno::UNO_QUERY_THROW);
385 
386         ::rtl::OUString sModule = xModuleManager->identify(xFrame);
387         ::rtl::OUString sType   ;
388 
389         switch(eTypeFamily)
390         {
391             case E_MS_DOC:
392                  {
393                     if (sModule.equalsAscii( "com.sun.star.text.TextDocument" ))
394                         sType = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "writer_MS_Word_97" ));
395                     else
396                     if (sModule.equalsAscii( "com.sun.star.sheet.SpreadsheetDocument" ))
397                         sType = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "calc_MS_Excel_97" ));
398                     else
399                     if (sModule.equalsAscii( "com.sun.star.drawing.DrawingDocument" ))
400                         sType = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "impress_MS_PowerPoint_97" ));
401                     else
402                     if (sModule.equalsAscii( "com.sun.star.presentation.PresentationDocument" ))
403                         sType = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "impress_MS_PowerPoint_97" ));
404                  }
405                  break;
406 
407             case E_OOO_DOC:
408                  {
409                     if (sModule.equalsAscii( "com.sun.star.text.TextDocument" ))
410                         sType = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "writer8" ));
411                     else
412                     if (sModule.equalsAscii( "com.sun.star.sheet.SpreadsheetDocument" ))
413                         sType = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "calc8" ));
414                     else
415                     if (sModule.equalsAscii( "com.sun.star.drawing.DrawingDocument" ))
416                         sType = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "draw8" ));
417                     else
418                     if (sModule.equalsAscii( "com.sun.star.presentation.PresentationDocument" ))
419                         sType = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "impress8" ));
420                  }
421                  break;
422         }
423 
424         return sType;
425     }
426     catch(const css::uno::RuntimeException& exRun)
427         { throw exRun; }
428     catch(const css::uno::Exception&)
429         {}
430 
431     return ::rtl::OUString();
432 }
433 
434 //--------------------------------------------------------------------
435 
436 void SfxViewShell::ExecMisc_Impl( SfxRequest &rReq )
437 {
438         const sal_uInt16 nId = rReq.GetSlot();
439         switch( nId )
440         {
441                 case SID_STYLE_FAMILY :
442                 {
443                         SFX_REQUEST_ARG(rReq, pItem, SfxUInt16Item, nId, sal_False);
444                         if (pItem)
445             {
446                 pImp->m_nFamily = pItem->GetValue();
447             }
448                         break;
449                 }
450 
451                 case SID_STYLE_CATALOG:
452                 {
453                         SfxTemplateCatalog aCatalog(
454                                 SFX_APP()->GetTopWindow(), &GetViewFrame()->GetBindings());
455                         aCatalog.Execute();
456             rReq.Ignore();
457                         break;
458                 }
459         case SID_ACTIVATE_STYLE_APPLY:
460         {
461             com::sun::star::uno::Reference< com::sun::star::frame::XFrame > xFrame(
462                     GetViewFrame()->GetFrame().GetFrameInterface(),
463                     com::sun::star::uno::UNO_QUERY);
464 
465             Reference< com::sun::star::beans::XPropertySet > xPropSet( xFrame, UNO_QUERY );
466             Reference< ::com::sun::star::frame::XLayoutManager > xLayoutManager;
467             if ( xPropSet.is() )
468             {
469                 try
470                 {
471                     Any aValue = xPropSet->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "LayoutManager" )));
472                     aValue >>= xLayoutManager;
473                     if ( xLayoutManager.is() )
474                     {
475                         rtl::OUString aTextResString( RTL_CONSTASCII_USTRINGPARAM( "private:resource/toolbar/textobjectbar" ));
476                         uno::Reference< ui::XUIElement > xElement = xLayoutManager->getElement( aTextResString );
477                         if(!xElement.is())
478                         {
479                             rtl::OUString aFrameResString( RTL_CONSTASCII_USTRINGPARAM( "private:resource/toolbar/frameobjectbar" ));
480                             xElement = xLayoutManager->getElement( aFrameResString );
481                         }
482                         if(!xElement.is())
483                         {
484                             rtl::OUString aOleResString( RTL_CONSTASCII_USTRINGPARAM( "private:resource/toolbar/oleobjectbar" ));
485                             xElement = xLayoutManager->getElement( aOleResString );
486                         }
487                         if(xElement.is())
488                         {
489                             uno::Reference< awt::XWindow > xWin( xElement->getRealInterface(), uno::UNO_QUERY_THROW );
490                             Window* pWin = VCLUnoHelper::GetWindow( xWin );
491                             ToolBox* pTextToolbox = dynamic_cast< ToolBox* >( pWin );
492                             if( pTextToolbox )
493                             {
494                                 sal_uInt16 nItemCount = pTextToolbox->GetItemCount();
495                                 for( sal_uInt16 nItem = 0; nItem < nItemCount; ++nItem )
496                                 {
497                                     sal_uInt16 nItemId = pTextToolbox->GetItemId( nItem );
498                                     const XubString& rCommand = pTextToolbox->GetItemCommand( nItemId );
499                                     if( rCommand.EqualsAscii( ".uno:StyleApply" ) )
500                                     {
501                                         Window* pItemWin = pTextToolbox->GetItemWindow( nItemId );
502                                         if( pItemWin )
503                                             pItemWin->GrabFocus();
504                                         break;
505                                     }
506                                 }
507                             }
508                         }
509                     }
510                 }
511                 catch ( Exception& )
512                 {
513                 }
514             }
515             rReq.Done();
516         }
517         break;
518                 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
519 
520                 case SID_MAIL_SENDDOCASMS:
521                 case SID_MAIL_SENDDOCASOOO:
522                 case SID_MAIL_SENDDOCASPDF:
523                 case SID_MAIL_SENDDOC:
524         case SID_MAIL_SENDDOCASFORMAT:
525                 {
526                         SfxObjectShell* pDoc = GetObjectShell();
527                         if ( pDoc && pDoc->QueryHiddenInformation(
528                                                         WhenSaving, &GetViewFrame()->GetWindow() ) != RET_YES )
529                                 break;
530 
531                         if ( SvtInternalOptions().MailUIEnabled() )
532             {
533                 GetViewFrame()->SetChildWindow( SID_MAIL_CHILDWIN, sal_True );
534             }
535             else
536             {
537                                 SfxMailModel  aModel;
538                 rtl::OUString aDocType;
539 
540                                 SFX_REQUEST_ARG(rReq, pMailSubject, SfxStringItem, SID_MAIL_SUBJECT, sal_False );
541                                 if ( pMailSubject )
542                                         aModel.SetSubject( pMailSubject->GetValue() );
543 
544                                 SFX_REQUEST_ARG(rReq, pMailRecipient, SfxStringItem, SID_MAIL_RECIPIENT, sal_False );
545                                 if ( pMailRecipient )
546                                 {
547                                         String aRecipient( pMailRecipient->GetValue() );
548                                         String aMailToStr( String::CreateFromAscii( "mailto:" ));
549 
550                                         if ( aRecipient.Search( aMailToStr ) == 0 )
551                                                 aRecipient = aRecipient.Erase( 0, aMailToStr.Len() );
552                                         aModel.AddAddress( aRecipient, SfxMailModel::ROLE_TO );
553                                 }
554                 SFX_REQUEST_ARG(rReq, pMailDocType, SfxStringItem, SID_TYPE_NAME, sal_False );
555                 if ( pMailDocType )
556                     aDocType = pMailDocType->GetValue();
557 
558                 uno::Reference < frame::XFrame > xFrame( pFrame->GetFrame().GetFrameInterface() );
559                                 SfxMailModel::SendMailResult eResult = SfxMailModel::SEND_MAIL_ERROR;
560 
561                 if ( nId == SID_MAIL_SENDDOC )
562                                         eResult = aModel.SaveAndSend( xFrame, rtl::OUString() );
563                                 else
564                                 if ( nId == SID_MAIL_SENDDOCASPDF )
565                     eResult = aModel.SaveAndSend( xFrame, rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "pdf_Portable_Document_Format" )));
566                 else
567                                 if ( nId == SID_MAIL_SENDDOCASMS )
568                 {
569                     aDocType = impl_searchFormatTypeForApp(xFrame, E_MS_DOC);
570                     if (aDocType.getLength() > 0)
571                         eResult = aModel.SaveAndSend( xFrame, aDocType );
572                 }
573                 else
574                                 if ( nId == SID_MAIL_SENDDOCASOOO )
575                 {
576                     aDocType = impl_searchFormatTypeForApp(xFrame, E_OOO_DOC);
577                     if (aDocType.getLength() > 0)
578                         eResult = aModel.SaveAndSend( xFrame, aDocType );
579                 }
580 
581                                 if ( eResult == SfxMailModel::SEND_MAIL_ERROR )
582                                 {
583                                         InfoBox aBox( SFX_APP()->GetTopWindow(), SfxResId( MSG_ERROR_SEND_MAIL ));
584                                         aBox.Execute();
585                     rReq.Ignore();
586                                 }
587                 else
588                     rReq.Done();
589                         }
590 
591                         break;
592                 }
593 
594                 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
595                 case SID_WEBHTML:
596                 {
597             static const char HTML_DOCUMENT_TYPE[] = "writer_web_HTML";
598             static const char HTML_GRAPHIC_TYPE[]  = "graphic_HTML";
599             const sal_Int32   FILTERFLAG_EXPORT    = 0x00000002;
600 
601             css::uno::Reference< lang::XMultiServiceFactory > xSMGR(::comphelper::getProcessServiceFactory(), css::uno::UNO_QUERY_THROW);
602             css::uno::Reference < css::frame::XFrame >        xFrame( pFrame->GetFrame().GetFrameInterface() );
603             css::uno::Reference< css::frame::XModel >         xModel;
604 
605             const rtl::OUString aModuleManager( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.ModuleManager" ));
606             css::uno::Reference< css::frame::XModuleManager > xModuleManager( xSMGR->createInstance( aModuleManager ), css::uno::UNO_QUERY_THROW );
607             if ( !xModuleManager.is() )
608             {
609                 rReq.Done(sal_False);
610                 return;
611             }
612 
613             rtl::OUString aModule;
614             try
615             {
616                  aModule = xModuleManager->identify( xFrame );
617             }
618             catch ( css::uno::RuntimeException& )
619             {
620                 throw;
621             }
622             catch ( css::uno::Exception& )
623             {
624             }
625 
626             if ( xFrame.is() )
627             {
628                 css::uno::Reference< css::frame::XController > xController = xFrame->getController();
629                 if ( xController.is() )
630                     xModel = xController->getModel();
631             }
632 
633             // We need at least a valid module name and model reference
634             css::uno::Reference< css::frame::XStorable > xStorable( xModel, css::uno::UNO_QUERY );
635             if ( xModel.is() && xStorable.is() )
636             {
637                 rtl::OUString aFilterName;
638                 rtl::OUString aTypeName( RTL_CONSTASCII_USTRINGPARAM( HTML_DOCUMENT_TYPE ));
639                 rtl::OUString aFileName;
640                 rtl::OUString aExtension( RTL_CONSTASCII_USTRINGPARAM( "htm" ));
641 
642                 rtl::OUString aLocation = xStorable->getLocation();
643                 INetURLObject aFileObj( aLocation );
644 
645                 bool bPrivateProtocol = ( aFileObj.GetProtocol() == INET_PROT_PRIV_SOFFICE );
646                 bool bHasLocation = ( aLocation.getLength() > 0 ) && !bPrivateProtocol;
647 
648                 css::uno::Reference< css::container::XContainerQuery > xContainerQuery(
649                     xSMGR->createInstance( rtl::OUString(
650                         RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.document.FilterFactory" ))),
651                         css::uno::UNO_QUERY_THROW );
652 
653                 // Retrieve filter from type
654                 sal_Int32 nFilterFlags = FILTERFLAG_EXPORT;
655                 aFilterName = impl_retrieveFilterNameFromTypeAndModule( xContainerQuery, aTypeName, aModule, nFilterFlags );
656                 if ( aFilterName.getLength() == 0 )
657                 {
658                     // Draw/Impress uses a different type. 2nd chance try to use alternative type name
659                     aFilterName = impl_retrieveFilterNameFromTypeAndModule(
660                         xContainerQuery, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( HTML_GRAPHIC_TYPE )), aModule, nFilterFlags );
661                 }
662 
663                 // No filter found => error
664                 // No type and no location => error
665                 if (( aFilterName.getLength() == 0 ) || ( aTypeName.getLength() == 0 ))
666                 {
667                     rReq.Done(sal_False);
668                     return;
669                 }
670 
671                 // Use provided save file name. If empty determine file name
672                 if ( !bHasLocation )
673                 {
674                     // Create a default file name with the correct extension
675                     const rtl::OUString aPreviewFileName( RTL_CONSTASCII_USTRINGPARAM( "webpreview" ));
676                     aFileName = aPreviewFileName;
677                 }
678                 else
679                 {
680                     // Determine file name from model
681                     INetURLObject aFObj( xStorable->getLocation() );
682                     aFileName = aFObj.getName( INetURLObject::LAST_SEGMENT, true, INetURLObject::NO_DECODE );
683                 }
684 
685                 OSL_ASSERT( aFilterName.getLength() > 0 );
686                 OSL_ASSERT( aFileName.getLength() > 0 );
687 
688                 // Creates a temporary directory to store our predefined file into it.
689                 ::utl::TempFile aTempDir( NULL, sal_True );
690 
691                 INetURLObject aFilePathObj( aTempDir.GetURL() );
692                 aFilePathObj.insertName( aFileName );
693                 aFilePathObj.setExtension( aExtension );
694 
695                 rtl::OUString aFileURL = aFilePathObj.GetMainURL( INetURLObject::NO_DECODE );
696 
697                 css::uno::Sequence< css::beans::PropertyValue > aArgs( 1 );
698                 aArgs[0].Name  = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FilterName" ));
699                 aArgs[0].Value = css::uno::makeAny( aFilterName );
700 
701                 // Store document in the html format
702                 try
703                 {
704                     xStorable->storeToURL( aFileURL, aArgs );
705                 }
706                 catch ( com::sun::star::io::IOException& )
707                 {
708                     rReq.Done(sal_False);
709                     return;
710                 }
711 
712                 ::com::sun::star::uno::Reference< XSystemShellExecute > xSystemShellExecute(
713                     com::sun::star::system::SystemShellExecute::create(
714                         ::comphelper::getProcessComponentContext() ) );
715 
716                         sal_Bool bRet( sal_True );
717                 if ( xSystemShellExecute.is() )
718                 {
719                     try
720                     {
721                                 xSystemShellExecute->execute(
722                                                     aFileURL, ::rtl::OUString(), SystemShellExecuteFlags::DEFAULTS );
723                     }
724                     catch ( uno::Exception& )
725                     {
726                                             vos::OGuard aGuard( Application::GetSolarMutex() );
727                         Window *pParent = SFX_APP()->GetTopWindow();
728                                             ErrorBox( pParent, SfxResId( MSG_ERROR_NO_WEBBROWSER_FOUND )).Execute();
729                         bRet = sal_False;
730                     }
731                 }
732 
733                 rReq.Done(bRet);
734                             break;
735             }
736             else
737             {
738                 rReq.Done(sal_False);
739                 return;
740             }
741         }
742 
743         // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
744                 case SID_PLUGINS_ACTIVE:
745                 {
746                         SFX_REQUEST_ARG(rReq, pShowItem, SfxBoolItem, nId, sal_False);
747             bool const bActive = (pShowItem)
748                 ? pShowItem->GetValue()
749                 : !pImp->m_bPlugInsActive;
750                         // ggf. recorden
751                         if ( !rReq.IsAPI() )
752                                 rReq.AppendItem( SfxBoolItem( nId, bActive ) );
753 
754                         // Jetzt schon DONE aufrufen, da die Argumente evtl. einen Pool
755                         // benutzen, der demn"achst weg ist
756                         rReq.Done(sal_True);
757 
758                         // ausfuehren
759             if (!pShowItem || (bActive != pImp->m_bPlugInsActive))
760                         {
761                                 SfxFrame* pTopFrame = &GetFrame()->GetTopFrame();
762                                 if ( pTopFrame != &GetFrame()->GetFrame() )
763                                 {
764                                         // FramesetDocument
765                                         SfxViewShell *pShell = pTopFrame->GetCurrentViewFrame()->GetViewShell();
766                                         if ( pShell->GetInterface()->GetSlot( nId ) )
767                                                 pShell->ExecuteSlot( rReq );
768                                         break;
769                                 }
770 
771                                 SfxFrameIterator aIter( *pTopFrame );
772                                 while ( pTopFrame )
773                                 {
774                                         if ( pTopFrame->GetCurrentViewFrame() )
775                                         {
776                                                 SfxViewShell *pView = pTopFrame->GetCurrentViewFrame()->GetViewShell();
777                                                 if ( pView )
778                                                 {
779                             pView->pImp->m_bPlugInsActive = bActive;
780                             Rectangle aVisArea = GetObjectShell()->GetVisArea();
781                             VisAreaChanged(aVisArea);
782 
783                                                         // the plugins might need change in their state
784                                                         SfxInPlaceClientList *pClients = pView->GetIPClientList_Impl(sal_False);
785                                                         if ( pClients )
786                                                         {
787                                                                 for (sal_uInt16 n=0; n < pClients->Count(); n++)
788                                                                 {
789                                                                         SfxInPlaceClient* pIPClient = pClients->GetObject(n);
790                                                                         if ( pIPClient )
791                                                                                 pView->CheckIPClient_Impl( pIPClient, aVisArea );
792                                                                 }
793                                                         }
794                                                 }
795                                         }
796 
797                                         if ( !pTopFrame->GetParentFrame() )
798                                                 pTopFrame = aIter.FirstFrame();
799                                         else
800                                                 pTopFrame = aIter.NextFrame( *pTopFrame );
801                                 }
802                         }
803 
804                         break;
805                 }
806         }
807 }
808 
809 //--------------------------------------------------------------------
810 
811 void SfxViewShell::GetState_Impl( SfxItemSet &rSet )
812 {
813         DBG_CHKTHIS(SfxViewShell, 0);
814 
815         SfxWhichIter aIter( rSet );
816         for ( sal_uInt16 nSID = aIter.FirstWhich(); nSID; nSID = aIter.NextWhich() )
817         {
818                 switch ( nSID )
819                 {
820                         case SID_STYLE_CATALOG:
821                         {
822                 if ( !GetViewFrame()->KnowsChildWindow( SID_STYLE_DESIGNER ) )
823                                         rSet.DisableItem( nSID );
824                                 break;
825                         }
826 
827                         // Printer-Funktionen
828                         case SID_PRINTDOC:
829                         case SID_PRINTDOCDIRECT:
830                         case SID_SETUPPRINTER:
831                         case SID_PRINTER_NAME:
832                         {
833                 bool bEnabled = pImp->m_bCanPrint && !pImp->m_nPrinterLocks;
834                                 bEnabled = bEnabled  && !Application::GetSettings().GetMiscSettings().GetDisablePrinting();
835                 if ( bEnabled )
836                 {
837                     SfxPrinter *pPrinter = GetPrinter(sal_False);
838 
839                     if ( SID_PRINTDOCDIRECT == nSID )
840                     {
841                         rtl::OUString aPrinterName;
842                         if ( pPrinter != NULL )
843                             aPrinterName = pPrinter->GetName();
844                         else
845                             aPrinterName = Printer::GetDefaultPrinterName();
846                         if ( aPrinterName.getLength() > 0 )
847                         {
848                             uno::Reference < frame::XFrame > xFrame( pFrame->GetFrame().GetFrameInterface() );
849 
850                             ::rtl::OUStringBuffer aBuffer( 60 );
851                             aBuffer.append( RetrieveLabelFromCommand(
852                                                 ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:PrintDefault" )),
853                                                 xFrame ));
854                             aBuffer.appendAscii( " (" );
855                             aBuffer.append( aPrinterName );
856                             aBuffer.appendAscii( ")" );
857 
858                             rSet.Put( SfxStringItem( SID_PRINTDOCDIRECT, aBuffer.makeStringAndClear() ) );
859                         }
860                     }
861                     bEnabled = !pPrinter || !pPrinter->IsPrinting();
862                 }
863                                 if ( !bEnabled )
864                                 {
865                                         // will now be handled by requeing the request
866                                 /*      rSet.DisableItem( SID_PRINTDOC );
867                                         rSet.DisableItem( SID_PRINTDOCDIRECT );
868                                         rSet.DisableItem( SID_SETUPPRINTER ); */
869                                 }
870                                 break;
871                         }
872 
873                         // Mail-Funktionen
874                         case SID_MAIL_SENDDOCASPDF:
875                         case SID_MAIL_SENDDOC:
876             case SID_MAIL_SENDDOCASFORMAT:
877                         {
878                 sal_Bool bEnable = !GetViewFrame()->HasChildWindow( SID_MAIL_CHILDWIN );
879                                 if ( !bEnable )
880                                         rSet.DisableItem( nSID );
881                                 break;
882                         }
883 
884                         // PlugIns running
885                         case SID_PLUGINS_ACTIVE:
886                         {
887                 rSet.Put( SfxBoolItem( SID_PLUGINS_ACTIVE,
888                                         !pImp->m_bPlugInsActive) );
889                                 break;
890                         }
891 /*
892                         // SelectionText
893                         case SID_SELECTION_TEXT:
894                         {
895                                 rSet.Put( SfxStringItem( SID_SELECTION_TEXT, GetSelectionText() ) );
896                                 break;
897                         }
898 
899                         // SelectionTextExt
900                         case SID_SELECTION_TEXT_EXT:
901                         {
902                                 rSet.Put( SfxStringItem( SID_SELECTION_TEXT_EXT, GetSelectionText(sal_True) ) );
903                                 break;
904                         }
905 */
906                         case SID_STYLE_FAMILY :
907                         {
908                 rSet.Put( SfxUInt16Item( SID_STYLE_FAMILY, pImp->m_nFamily ) );
909                                 break;
910                         }
911                 }
912         }
913 }
914 
915 //--------------------------------------------------------------------
916 
917 void SfxViewShell::SetZoomFactor( const Fraction &rZoomX,
918                                                                   const Fraction &rZoomY )
919 {
920         DBG_ASSERT( GetWindow(), "no window" );
921         MapMode aMap( GetWindow()->GetMapMode() );
922         aMap.SetScaleX( rZoomX );
923         aMap.SetScaleY( rZoomY );
924         GetWindow()->SetMapMode( aMap );
925 }
926 
927 //--------------------------------------------------------------------
928 ErrCode SfxViewShell::DoVerb(long /*nVerb*/)
929 
930 /*  [Beschreibung]
931 
932         Virtuelle Methode, um am selektierten Objekt ein Verb auszuf"uhren.
933     Da dieses Objekt nur den abgeleiteten Klassen bekannt ist, muss DoVerb
934     dort "uberschrieben werden.
935 
936 */
937 
938 {
939         return ERRCODE_SO_NOVERBS;
940 }
941 
942 //--------------------------------------------------------------------
943 
944 void SfxViewShell::OutplaceActivated( sal_Bool bActive, SfxInPlaceClient* /*pClient*/ )
945 {
946         if ( !bActive )
947                 GetFrame()->GetFrame().Appear();
948 }
949 
950 //--------------------------------------------------------------------
951 
952 void SfxViewShell::InplaceActivating( SfxInPlaceClient* /*pClient*/ )
953 {
954         // TODO/LATER: painting of the bitmap can be stopped, it is required if CLIPCHILDREN problem #i25788# is not solved,
955         // but may be the bug will not affect the real office vcl windows, then it is not required
956 }
957 
958 //--------------------------------------------------------------------
959 
960 void SfxViewShell::InplaceDeactivated( SfxInPlaceClient* /*pClient*/ )
961 {
962         // TODO/LATER: paint the replacement image in normal way if the painting was stopped
963 }
964 
965 //--------------------------------------------------------------------
966 
967 void SfxViewShell::UIActivating( SfxInPlaceClient* /*pClient*/ )
968 {
969     uno::Reference < frame::XFrame > xOwnFrame( pFrame->GetFrame().GetFrameInterface() );
970     uno::Reference < frame::XFramesSupplier > xParentFrame( xOwnFrame->getCreator(), uno::UNO_QUERY );
971     if ( xParentFrame.is() )
972         xParentFrame->setActiveFrame( xOwnFrame );
973 
974     pFrame->GetBindings().HidePopups(sal_True);
975     pFrame->GetDispatcher()->Update_Impl( sal_True );
976 }
977 
978 //--------------------------------------------------------------------
979 
980 void SfxViewShell::UIDeactivated( SfxInPlaceClient* /*pClient*/ )
981 {
982     if ( !pFrame->GetFrame().IsClosing_Impl() ||
983         SfxViewFrame::Current() != pFrame )
984             pFrame->GetDispatcher()->Update_Impl( sal_True );
985     pFrame->GetBindings().HidePopups(sal_False);
986 
987     // uno::Reference < frame::XFrame > xOwnFrame( pFrame->GetFrame().GetFrameInterface() );
988     // uno::Reference < frame::XFramesSupplier > xParentFrame( xOwnFrame->getCreator(), uno::UNO_QUERY );
989     // if ( xParentFrame.is() )
990     //     xParentFrame->setActiveFrame( uno::Reference < frame::XFrame >() );
991 
992     // Make sure that slot servers are initialized or updated after
993     // an OLE object is deactivated.
994     pFrame->GetBindings().InvalidateAll(sal_True);
995 }
996 
997 //--------------------------------------------------------------------
998 
999 SfxInPlaceClient* SfxViewShell::FindIPClient
1000 (
1001     const uno::Reference < embed::XEmbeddedObject >& xObj,
1002     Window*             pObjParentWin
1003 )   const
1004 {
1005     SfxInPlaceClientList *pClients = GetIPClientList_Impl(sal_False);
1006         if ( !pClients )
1007                 return 0;
1008 
1009         if( !pObjParentWin )
1010                 pObjParentWin = GetWindow();
1011         for (sal_uInt16 n=0; n < pClients->Count(); n++)
1012         {
1013                 SfxInPlaceClient *pIPClient = (SfxInPlaceClient*) pClients->GetObject(n);
1014         if ( pIPClient->GetObject() == xObj && pIPClient->GetEditWin() == pObjParentWin )
1015                         return pIPClient;
1016         }
1017 
1018         return 0;
1019 }
1020 
1021 //--------------------------------------------------------------------
1022 
1023 SfxInPlaceClient* SfxViewShell::GetIPClient() const
1024 {
1025         return GetUIActiveClient();
1026 }
1027 
1028 //--------------------------------------------------------------------
1029 
1030 SfxInPlaceClient* SfxViewShell::GetUIActiveIPClient_Impl() const
1031 {
1032     // this method is needed as long as SFX still manages the border space for ChildWindows (see SfxFrame::Resize)
1033     SfxInPlaceClientList *pClients = GetIPClientList_Impl(sal_False);
1034         if ( !pClients )
1035                 return 0;
1036 
1037         for (sal_uInt16 n=0; n < pClients->Count(); n++)
1038         {
1039         SfxInPlaceClient* pIPClient = pClients->GetObject(n);
1040         if ( pIPClient->IsUIActive() )
1041             return pIPClient;
1042         }
1043 
1044     return NULL;
1045 }
1046 
1047 SfxInPlaceClient* SfxViewShell::GetUIActiveClient() const
1048 {
1049     SfxInPlaceClientList *pClients = GetIPClientList_Impl(sal_False);
1050         if ( !pClients )
1051                 return 0;
1052 
1053         for (sal_uInt16 n=0; n < pClients->Count(); n++)
1054         {
1055         SfxInPlaceClient* pIPClient = pClients->GetObject(n);
1056         if ( pIPClient->IsObjectUIActive() )
1057             return pIPClient;
1058         }
1059 
1060     return NULL;
1061 }
1062 
1063 //--------------------------------------------------------------------
1064 
1065 void SfxViewShell::Activate( sal_Bool bMDI )
1066 {
1067         DBG_CHKTHIS(SfxViewShell, 0);
1068         if ( bMDI )
1069         {
1070                 SfxObjectShell *pSh = GetViewFrame()->GetObjectShell();
1071                 if ( pSh->GetModel().is() )
1072                         pSh->GetModel()->setCurrentController( GetViewFrame()->GetFrame().GetController() );
1073 
1074         SetCurrentDocument();
1075         }
1076 }
1077 
1078 //--------------------------------------------------------------------
1079 
1080 void SfxViewShell::Deactivate(sal_Bool /*bMDI*/)
1081 {
1082         DBG_CHKTHIS(SfxViewShell, 0);
1083 }
1084 
1085 //--------------------------------------------------------------------
1086 
1087 void SfxViewShell::AdjustPosSizePixel
1088 (
1089         const Point&    /*rToolOffset*/,// linke obere Ecke der Tools im Frame-Window
1090         const Size&     /*rSize*/       // gesamte zur Verf"ugung stehende Gr"o\se
1091 )
1092 
1093 {
1094         DBG_CHKTHIS(SfxViewShell, 0);
1095 }
1096 
1097 //--------------------------------------------------------------------
1098 
1099 void SfxViewShell::Move()
1100 
1101 /*  [Beschreibung]
1102 
1103         Diese virtuelle Methode wird gerufen, wenn das Fenster, in dem die
1104         SfxViewShell dargestellt wird eine StarView-Move() Nachricht erh"alt.
1105 
1106         Die Basisimplementierung braucht nicht gerufen zu werden.
1107 
1108 
1109         [Anmerkung]
1110 
1111         Diese Methode kann dazu verwendet werden, eine Selektion abzubrechen,
1112         um durch das Moven des Fensters erzeugte Maus-Bewegungen anzufangen.
1113 
1114         Zur Zeit funktioniert die Benachrichtigung nicht In-Place.
1115 */
1116 
1117 {
1118 }
1119 
1120 //--------------------------------------------------------------------
1121 
1122 void SfxViewShell::OuterResizePixel
1123 (
1124         const Point&    /*rToolOffset*/,// linke obere Ecke der Tools im Frame-Window
1125         const Size&     /*rSize*/       // gesamte zur Verf"ugung stehende Gr"o\se
1126 )
1127 
1128 /*  [Beschreibung]
1129 
1130     Diese Methode muss ueberladen werden, um auf "Anderungen der Groesse
1131         der View zu reagieren. Dabei definieren wir die View als das Edit-Window
1132         zuz"uglich der um das Edit-Window angeordnenten Tools (z.B. Lineale).
1133 
1134         Das Edit-Window darf weder in Gr"o\se noch Position ver"andert werden.
1135 
1136         Die Vis-Area der SfxObjectShell, dessen Skalierung und Position
1137         d"urfen hier ver"andert werden. Der Hauptanwendungsfall ist dabei,
1138         das Ver"andern der Gr"o\se der Vis-Area.
1139 
1140         "Andert sich durch die neue Berechnung der Border, so mu\s dieser
1141         mit <SfxViewShell::SetBorderPixel(const SvBorder&)> gesetzt werden.
1142         Erst nach Aufruf von 'SetBorderPixel' ist das Positionieren von
1143         Tools erlaubt.
1144 
1145 
1146         [Beispiel]
1147 
1148         void AppViewSh::OuterViewResizePixel( const Point &rOfs, const Size &rSz )
1149         {
1150                 // Tool-Positionen und Gr"o\sen von au\sen berechnen, NICHT setzen!
1151                 // (wegen folgender Border-Berechnung)
1152                 Point aHLinPos...; Size aHLinSz...;
1153                 ...
1154 
1155                 // Border f"ur Tools passend zu rSize berechnen und setzen
1156                 SvBorder aBorder...
1157                 SetBorderPixel( aBorder ); // ab jetzt sind Positionierungen erlaubt
1158 
1159                 // Tools anordnen
1160                 pHLin->SetPosSizePixel( aHLinPos, aHLinSz );
1161                 ...
1162         }
1163 
1164 
1165         [Querverweise]
1166 
1167         <SfxViewShell::InnerResizePixel(const Point&,const Size& rSize)>
1168 */
1169 
1170 {
1171         DBG_CHKTHIS(SfxViewShell, 0);
1172         SetBorderPixel( SvBorder() );
1173 }
1174 
1175 //--------------------------------------------------------------------
1176 
1177 void SfxViewShell::InnerResizePixel
1178 (
1179         const Point&    /*rToolOffset*/,// linke obere Ecke der Tools im Frame-Window
1180         const Size&     /*rSize*/       // dem Edit-Win zur Verf"ugung stehende Gr"o\se
1181 )
1182 
1183 /*  [Beschreibung]
1184 
1185     Diese Methode muss ueberladen werden, um auf "Anderungen der Groesse
1186         des Edit-Windows zu reagieren.
1187 
1188         Das Edit-Window darf weder in Gr"o\se noch Position ver"andert werden.
1189         Weder die Vis-Area der SfxObjectShell noch dessen Skalierung oder
1190         Position d"urfen ver"andert werden.
1191 
1192         "Andert sich durch die neue Berechnung der Border, so mu\s dieser
1193         mit <SfxViewShell::SetBorderPixel(const SvBorder&)> gesetzt werden.
1194         Erst nach Aufruf von 'SetBorderPixel' ist das Positionieren von
1195         Tools erlaubt.
1196 
1197 
1198         [Beispiel]
1199 
1200         void AppViewSh::InnerViewResizePixel( const Point &rOfs, const Size &rSz )
1201         {
1202                 // Tool-Positionen und Gr"o\sen von innen berechnen, NICHT setzen!
1203                 // (wegen folgender Border-Berechnung)
1204                 Point aHLinPos...; Size aHLinSz...;
1205                 ...
1206 
1207                 // Border f"ur Tools passend zu rSz berechnen und setzen
1208                 SvBorder aBorder...
1209                 SetBorderPixel( aBorder ); // ab jetzt sind Positionierungen erlaubt
1210 
1211                 // Tools anordnen
1212                 pHLin->SetPosSizePixel( aHLinPos, aHLinSz );
1213                 ...
1214         }
1215 
1216 
1217         [Querverweise]
1218 
1219         <SfxViewShell::OuterResizePixel(const Point&,const Size& rSize)>
1220 */
1221 
1222 {
1223     DBG_CHKTHIS(SfxViewShell, 0);
1224     SetBorderPixel( SvBorder() );
1225 }
1226 
1227 //--------------------------------------------------------------------
1228 
1229 void SfxViewShell::InvalidateBorder()
1230 {
1231     DBG_CHKTHIS(SfxViewShell, 0);
1232     DBG_ASSERT( GetViewFrame(), "SfxViewShell without SfxViewFrame" );
1233 
1234     GetViewFrame()->InvalidateBorderImpl( this );
1235     if (pImp->m_pController.is())
1236     {
1237         pImp->m_pController->BorderWidthsChanged_Impl();
1238     }
1239 }
1240 
1241 //--------------------------------------------------------------------
1242 
1243 void SfxViewShell::SetBorderPixel( const SvBorder &rBorder )
1244 {
1245     DBG_CHKTHIS(SfxViewShell, 0);
1246     DBG_ASSERT( GetViewFrame(), "SfxViewShell without SfxViewFrame" );
1247 
1248     //if ( rBorder != GetBorderPixel())
1249     {
1250         GetViewFrame()->SetBorderPixelImpl( this, rBorder );
1251 
1252         // notify related controller that border size is changed
1253         if (pImp->m_pController.is())
1254         {
1255             pImp->m_pController->BorderWidthsChanged_Impl();
1256         }
1257     }
1258 }
1259 
1260 //--------------------------------------------------------------------
1261 
1262 const SvBorder& SfxViewShell::GetBorderPixel() const
1263 {
1264     DBG_CHKTHIS(SfxViewShell, 0);
1265     DBG_ASSERT( GetViewFrame(), "SfxViewShell without SfxViewFrame" );
1266 
1267     return GetViewFrame()->GetBorderPixelImpl( this );
1268 }
1269 
1270 //--------------------------------------------------------------------
1271 
1272 void SfxViewShell::SetWindow
1273 (
1274     Window*     pViewPort   // Pointer auf das Datenfenster bzw. 0 im Destruktor
1275 )
1276 
1277 /*  [Beschreibung]
1278 
1279         Mit dieser Methode wird der SfxViewShell das Datenfenster mitgeteilt.
1280         Dieses wird f"ur den In-Place-Container und f"ur das korrekte
1281         Wiederherstellen des Focus ben"otigt.
1282 
1283         Selbst In-Place-aktiv ist das Umsetzen des ViewPort-Windows verboten.
1284 */
1285 
1286 {
1287     if( pWindow == pViewPort )
1288         return;
1289 
1290     // ggf. vorhandene IP-Clients disconnecten
1291     DisconnectAllClients();
1292 
1293     //TODO: should we have a "ReconnectAllClients" method?
1294     DiscardClients_Impl();
1295 
1296     // View-Port austauschen
1297     sal_Bool bHadFocus = pWindow ? pWindow->HasChildPathFocus( sal_True ) : sal_False;
1298     pWindow = pViewPort;
1299 
1300     if( pWindow )
1301     {
1302         // Disable automatic GUI mirroring (right-to-left) for document windows
1303         pWindow->EnableRTL( sal_False );
1304     }
1305 
1306     if ( bHadFocus && pWindow )
1307         pWindow->GrabFocus();
1308     //TODO/CLEANUP
1309     //brauchen wir die Methode doch noch?!
1310     //SFX_APP()->GrabFocus( pWindow );
1311 }
1312 
1313 //--------------------------------------------------------------------
1314 
1315 Size SfxViewShell::GetOptimalSizePixel() const
1316 {
1317     DBG_ERROR( "Useless call!" );
1318     return Size();
1319 }
1320 
1321 //------------------------------------------------------------------------
1322 
1323 SfxViewShell::SfxViewShell
1324 (
1325     SfxViewFrame*   pViewFrame,     /*  <SfxViewFrame>, in dem diese View dargestellt wird */
1326     sal_uInt16          nFlags          /*  siehe <SfxViewShell-Flags> */
1327 )
1328 
1329 :   SfxShell(this)
1330 ,   pImp( new SfxViewShell_Impl(nFlags) )
1331         ,pIPClientList( 0 )
1332         ,pFrame(pViewFrame)
1333         ,pSubShell(0)
1334         ,pWindow(0)
1335         ,bNoNewWindow( 0 != (nFlags & SFX_VIEW_NO_NEWWINDOW) )
1336 {
1337     DBG_CTOR(SfxViewShell, 0);
1338 
1339     //pImp->pPrinterCommandQueue = new SfxAsyncPrintExec_Impl( this );
1340 
1341     if ( pViewFrame->GetParentViewFrame() )
1342     {
1343         pImp->m_bPlugInsActive = pViewFrame->GetParentViewFrame()
1344             ->GetViewShell()->pImp->m_bPlugInsActive;
1345     }
1346     SetMargin( pViewFrame->GetMargin_Impl() );
1347 
1348     SetPool( &pViewFrame->GetObjectShell()->GetPool() );
1349     StartListening(*pViewFrame->GetObjectShell());
1350 
1351     // in Liste eintragen
1352     const SfxViewShell *pThis = this; // wegen der kranken Array-Syntax
1353     SfxViewShellArr_Impl &rViewArr = SFX_APP()->GetViewShells_Impl();
1354     rViewArr.Insert(pThis, rViewArr.Count() );
1355 }
1356 
1357 //--------------------------------------------------------------------
1358 
1359 SfxViewShell::~SfxViewShell()
1360 {
1361     DBG_DTOR(SfxViewShell, 0);
1362 
1363     // aus Liste austragen
1364     const SfxViewShell *pThis = this;
1365     SfxViewShellArr_Impl &rViewArr = SFX_APP()->GetViewShells_Impl();
1366     rViewArr.Remove( rViewArr.GetPos(pThis) );
1367 
1368     if ( pImp->xClipboardListener.is() )
1369     {
1370         pImp->xClipboardListener->DisconnectViewShell();
1371         pImp->xClipboardListener = NULL;
1372     }
1373 
1374     if (pImp->m_pController.is())
1375     {
1376         pImp->m_pController->ReleaseShell_Impl();
1377         pImp->m_pController.clear();
1378     }
1379 
1380     //DELETEZ( pImp->pPrinterCommandQueue );
1381     DELETEZ( pImp );
1382     DELETEZ( pIPClientList );
1383 }
1384 
1385 //--------------------------------------------------------------------
1386 
1387 sal_uInt16 SfxViewShell::PrepareClose
1388 (
1389     sal_Bool bUI,     // sal_True: Dialoge etc. erlaubt, sal_False: silent-mode
1390     sal_Bool /*bForBrowsing*/
1391 )
1392 {
1393     SfxPrinter *pPrinter = GetPrinter();
1394     if ( pPrinter && pPrinter->IsPrinting() )
1395     {
1396         if ( bUI )
1397         {
1398             InfoBox aInfoBox( &GetViewFrame()->GetWindow(), SfxResId( MSG_CANT_CLOSE ) );
1399             aInfoBox.Execute();
1400         }
1401 
1402         return sal_False;
1403     }
1404 
1405     if( GetViewFrame()->IsInModalMode() )
1406         return sal_False;
1407 
1408     if( bUI && GetViewFrame()->GetDispatcher()->IsLocked() )
1409         return sal_False;
1410 
1411     return sal_True;
1412 }
1413 
1414 //--------------------------------------------------------------------
1415 
1416 SfxViewShell* SfxViewShell::Current()
1417 {
1418     SfxViewFrame *pCurrent = SfxViewFrame::Current();
1419     return pCurrent ? pCurrent->GetViewShell() : NULL;
1420 }
1421 
1422 //--------------------------------------------------------------------
1423 
1424 SfxViewShell* SfxViewShell::Get( const Reference< XController>& i_rController )
1425 {
1426     if ( !i_rController.is() )
1427         return NULL;
1428 
1429     for (   SfxViewShell* pViewShell = SfxViewShell::GetFirst( NULL, sal_False );
1430             pViewShell;
1431             pViewShell = SfxViewShell::GetNext( *pViewShell, NULL, sal_False )
1432         )
1433     {
1434         if ( pViewShell->GetController() == i_rController )
1435             return pViewShell;
1436     }
1437     return NULL;
1438 }
1439 
1440 //--------------------------------------------------------------------
1441 
1442 SdrView* SfxViewShell::GetDrawView() const
1443 
1444 /*      [Beschreibung]
1445 
1446         Diese virtuelle Methode mu\s von den Subklassen "uberladen werden, wenn
1447         der Property-Editor zur Verf"ugung stehen soll.
1448 
1449         Die Default-Implementierung liefert immer 0.
1450 */
1451 
1452 {
1453     return 0;
1454 }
1455 
1456 //--------------------------------------------------------------------
1457 
1458 String SfxViewShell::GetSelectionText
1459 (
1460     sal_Bool /*bCompleteWords*/         /*      sal_False (default)
1461                                                                 Nur der tats"achlich selektierte Text wird
1462                                                                 zur"uckgegeben.
1463 
1464                                                                 TRUE
1465                                                                 Der selektierte Text wird soweit erweitert,
1466                                                                 da\s nur ganze W"orter zur"uckgegeben werden.
1467                                                                 Als Worttrenner gelten White-Spaces und die
1468                                 Satzzeichen ".,;" sowie einfache und doppelte
1469                                                                 Anf"uhrungszeichen.
1470                                                         */
1471 )
1472 
1473 /*  [Beschreibung]
1474 
1475         Diese Methode kann von Anwendungsprogrammierer "uberladen werden,
1476         um einen Text zur"uckzuliefern, der in der aktuellen Selektion
1477         steht. Dieser wird z.B. beim Versenden (email) verwendet.
1478 
1479     Mit "CompleteWords == TRUE" ger"ufen, reicht z.B. auch der Cursor,
1480         der in einer URL steht, um die gesamte URL zu liefern.
1481 */
1482 
1483 {
1484     return String();
1485 }
1486 
1487 //--------------------------------------------------------------------
1488 
1489 sal_Bool SfxViewShell::HasSelection( sal_Bool ) const
1490 
1491 /*  [Beschreibung]
1492 
1493         Mit dieser virtuellen Methode kann z.B. ein Dialog abfragen, ob in der
1494         aktuellen View etwas selektiert ist. Wenn der Parameter <sal_Bool> sal_True ist,
1495         wird abgefragt, ob Text selektiert ist.
1496 */
1497 
1498 {
1499     return sal_False;
1500 }
1501 
1502 //--------------------------------------------------------------------
1503 
1504 void SfxViewShell::SetSubShell( SfxShell *pShell )
1505 
1506 /*  [Beschreibung]
1507 
1508         Mit dieser Methode kann eine Selektions- oder Cursor-Shell angemeldet
1509         werden, die automatisch unmittelbar nach der SfxViewShell auf den
1510         SfxDispatcher gepusht wird, und automatisch umittelbar vor ihr
1511         gepoppt wird.
1512 
1513         Ist die SfxViewShell-Instanz bereits gepusht, dann wird pShell
1514         sofort ebenfalls gepusht. Wird mit SetSubShell eine andere SfxShell
1515         Instanz angemeldet, als vorher angemeldet war, wird die zuvor angemeldete
1516         ggf. automatisch gepoppt. Mit pShell==0 kann daher die aktuelle
1517         Sub-Shell abgemeldet werden.
1518 */
1519 
1520 {
1521     // ist diese ViewShell "uberhaupt aktiv?
1522     SfxDispatcher *pDisp = pFrame->GetDispatcher();
1523     if ( pDisp->IsActive(*this) )
1524     {
1525         // Dispatcher updaten
1526         if ( pSubShell )
1527             pDisp->Pop(*pSubShell);
1528         if ( pShell )
1529             pDisp->Push(*pShell);
1530         pDisp->Flush();
1531     }
1532 
1533     pSubShell = pShell;
1534 }
1535 
1536 void SfxViewShell::AddSubShell( SfxShell& rShell )
1537 {
1538     pImp->aArr.Insert( &rShell, pImp->aArr.Count() );
1539     SfxDispatcher *pDisp = pFrame->GetDispatcher();
1540     if ( pDisp->IsActive(*this) )
1541     {
1542         pDisp->Push(rShell);
1543         pDisp->Flush();
1544     }
1545 }
1546 
1547 void SfxViewShell::RemoveSubShell( SfxShell* pShell )
1548 {
1549     SfxDispatcher *pDisp = pFrame->GetDispatcher();
1550     if ( !pShell )
1551     {
1552         sal_uInt16 nCount = pImp->aArr.Count();
1553         if ( pDisp->IsActive(*this) )
1554         {
1555             for ( sal_uInt16 n=nCount; n>0; n-- )
1556                 pDisp->Pop( *pImp->aArr[n-1] );
1557             pDisp->Flush();
1558         }
1559 
1560         pImp->aArr.Remove(0, nCount);
1561     }
1562     else
1563     {
1564         sal_uInt16 nPos = pImp->aArr.GetPos( pShell );
1565         if ( nPos != 0xFFFF )
1566         {
1567             pImp->aArr.Remove( nPos );
1568             if ( pDisp->IsActive(*this) )
1569             {
1570                 pDisp->RemoveShell_Impl( *pShell );
1571                 pDisp->Flush();
1572             }
1573         }
1574     }
1575 }
1576 
1577 SfxShell* SfxViewShell::GetSubShell( sal_uInt16 nNo )
1578 {
1579     sal_uInt16 nCount = pImp->aArr.Count();
1580     if ( nNo<nCount )
1581         return pImp->aArr[nCount-nNo-1];
1582     return NULL;
1583 }
1584 
1585 void SfxViewShell::PushSubShells_Impl( sal_Bool bPush )
1586 {
1587     sal_uInt16 nCount = pImp->aArr.Count();
1588     SfxDispatcher *pDisp = pFrame->GetDispatcher();
1589     if ( bPush )
1590     {
1591         for ( sal_uInt16 n=0; n<nCount; n++ )
1592             pDisp->Push( *pImp->aArr[n] );
1593     }
1594     else if ( nCount )
1595     {
1596         SfxShell& rPopUntil = *pImp->aArr[0];
1597         if ( pDisp->GetShellLevel( rPopUntil ) != USHRT_MAX )
1598             pDisp->Pop( rPopUntil, SFX_SHELL_POP_UNTIL );
1599     }
1600 
1601     pDisp->Flush();
1602 }
1603 
1604 //--------------------------------------------------------------------
1605 
1606 void SfxViewShell::WriteUserData( String&, sal_Bool )
1607 {
1608 }
1609 
1610 //--------------------------------------------------------------------
1611 
1612 void SfxViewShell::ReadUserData(const String&, sal_Bool )
1613 {
1614 }
1615 
1616 void SfxViewShell::ReadUserDataSequence ( const ::com::sun::star::uno::Sequence < ::com::sun::star::beans::PropertyValue >&, sal_Bool )
1617 {
1618 }
1619 
1620 void SfxViewShell::WriteUserDataSequence ( ::com::sun::star::uno::Sequence < ::com::sun::star::beans::PropertyValue >&, sal_Bool )
1621 {
1622 }
1623 
1624 
1625 //--------------------------------------------------------------------
1626 // returns the first shell of spec. type viewing the specified doc.
1627 
1628 SfxViewShell* SfxViewShell::GetFirst
1629 (
1630     const TypeId* pType,
1631     sal_Bool          bOnlyVisible
1632 )
1633 {
1634     // search for a SfxViewShell of the specified type
1635     SfxViewShellArr_Impl &rShells = SFX_APP()->GetViewShells_Impl();
1636     SfxViewFrameArr_Impl &rFrames = SFX_APP()->GetViewFrames_Impl();
1637     for ( sal_uInt16 nPos = 0; nPos < rShells.Count(); ++nPos )
1638     {
1639         SfxViewShell *pShell = rShells.GetObject(nPos);
1640         if ( pShell )
1641         {
1642             // sometimes dangling SfxViewShells exist that point to a dead SfxViewFrame
1643             // these ViewShells shouldn't be accessible anymore
1644             // a destroyed ViewFrame is not in the ViewFrame array anymore, so checking this array helps
1645             for ( sal_uInt16 n=0; n<rFrames.Count(); ++n )
1646             {
1647                 SfxViewFrame *pFrame = rFrames.GetObject(n);
1648                 if ( pFrame == pShell->GetViewFrame() )
1649                 {
1650                     // only ViewShells with a valid ViewFrame will be returned
1651                     if ( ( !bOnlyVisible || pFrame->IsVisible() ) && ( !pType || pShell->IsA(*pType) ) )
1652                         return pShell;
1653                     break;
1654                 }
1655             }
1656         }
1657     }
1658 
1659     return 0;
1660 }
1661 
1662 //--------------------------------------------------------------------
1663 // returns the next shell of spec. type viewing the specified doc.
1664 
1665 SfxViewShell* SfxViewShell::GetNext
1666 (
1667     const SfxViewShell& rPrev,
1668     const TypeId*       pType,
1669     sal_Bool                bOnlyVisible
1670 )
1671 {
1672     SfxViewShellArr_Impl &rShells = SFX_APP()->GetViewShells_Impl();
1673     SfxViewFrameArr_Impl &rFrames = SFX_APP()->GetViewFrames_Impl();
1674     sal_uInt16 nPos;
1675     for ( nPos = 0; nPos < rShells.Count(); ++nPos )
1676         if ( rShells.GetObject(nPos) == &rPrev )
1677             break;
1678 
1679     for ( ++nPos; nPos < rShells.Count(); ++nPos )
1680     {
1681         SfxViewShell *pShell = rShells.GetObject(nPos);
1682         if ( pShell )
1683         {
1684             // sometimes dangling SfxViewShells exist that point to a dead SfxViewFrame
1685             // these ViewShells shouldn't be accessible anymore
1686             // a destroyed ViewFrame is not in the ViewFrame array anymore, so checking this array helps
1687             for ( sal_uInt16 n=0; n<rFrames.Count(); ++n )
1688             {
1689                 SfxViewFrame *pFrame = rFrames.GetObject(n);
1690                 if ( pFrame == pShell->GetViewFrame() )
1691                 {
1692                     // only ViewShells with a valid ViewFrame will be returned
1693                     if ( ( !bOnlyVisible || pFrame->IsVisible() ) && ( !pType || pShell->IsA(*pType) ) )
1694                         return pShell;
1695                     break;
1696                 }
1697             }
1698         }
1699     }
1700 
1701     return 0;
1702 }
1703 
1704 //--------------------------------------------------------------------
1705 
1706 void SfxViewShell::Notify( SfxBroadcaster& rBC,
1707                             const SfxHint& rHint )
1708 {
1709     if ( rHint.IsA(TYPE(SfxEventHint)) )
1710     {
1711         switch ( ((SfxEventHint&)rHint).GetEventId() )
1712         {
1713             case SFX_EVENT_LOADFINISHED:
1714             {
1715                 if ( GetController().is() )
1716                 {
1717                     // avoid access to dangling ViewShells
1718                     SfxViewFrameArr_Impl &rFrames = SFX_APP()->GetViewFrames_Impl();
1719                     for ( sal_uInt16 n=0; n<rFrames.Count(); ++n )
1720                     {
1721                         SfxViewFrame *frame = rFrames.GetObject(n);
1722                         if ( frame == GetViewFrame() && &rBC == GetObjectShell() )
1723                         {
1724                             SfxItemSet* pSet = GetObjectShell()->GetMedium()->GetItemSet();
1725                             SFX_ITEMSET_ARG( pSet, pItem, SfxUnoAnyItem, SID_VIEW_DATA, sal_False );
1726                             if ( pItem )
1727                             {
1728                                 pImp->m_pController->restoreViewData(
1729                                         pItem->GetValue() );
1730                                 pSet->ClearItem( SID_VIEW_DATA );
1731                             }
1732 
1733                             break;
1734                         }
1735                     }
1736                 }
1737 
1738                 break;
1739             }
1740         }
1741     }
1742 }
1743 
1744 //--------------------------------------------------------------------
1745 
1746 sal_Bool SfxViewShell::ExecKey_Impl(const KeyEvent& aKey)
1747 {
1748     if (!pImp->m_pAccExec.get())
1749     {
1750         pImp->m_pAccExec.reset(
1751                 ::svt::AcceleratorExecute::createAcceleratorHelper() );
1752         pImp->m_pAccExec->init(::comphelper::getProcessServiceFactory(),
1753                 pFrame->GetFrame().GetFrameInterface());
1754     }
1755 
1756     return pImp->m_pAccExec->execute(aKey.GetKeyCode());
1757 }
1758 
1759 //--------------------------------------------------------------------
1760 
1761 FASTBOOL SfxViewShell::KeyInput( const KeyEvent &rKeyEvent )
1762 
1763 /*  [Beschreibung]
1764 
1765         Diese Methode f"uhrt das KeyEvent 'rKeyEvent' "uber die an dieser
1766         SfxViewShell direkt oder indirekt (z.B. via Applikation) konfigurierten
1767         Tasten (Accelerator) aus.
1768 
1769 
1770         [R"uckgabewert]
1771 
1772         FASTBOOL                sal_True
1773                                                         die Taste ist konfiguriert, der betreffende
1774                                                         Handler wurde gerufen
1775 
1776                                                         FALSE
1777                                                         die Taste ist nicht konfiguriert, es konnte
1778                                                         also kein Handler gerufen werden
1779 
1780 
1781         [Querverweise]
1782         <SfxApplication::KeyInput(const KeyEvent&)>
1783 */
1784 {
1785     return ExecKey_Impl(rKeyEvent);
1786 }
1787 
1788 bool SfxViewShell::GlobalKeyInput_Impl( const KeyEvent &rKeyEvent )
1789 {
1790     return ExecKey_Impl(rKeyEvent);
1791 }
1792 
1793 //--------------------------------------------------------------------
1794 
1795 void SfxViewShell::ShowCursor( FASTBOOL /*bOn*/ )
1796 
1797 /*  [Beschreibung]
1798 
1799         Diese Methode mu\s von Subklassen "uberladen werden, damit vom SFx
1800         aus der Cursor ein- und ausgeschaltet werden kann. Dies geschieht
1801         z.B. bei laufendem <SfxProgress>.
1802 */
1803 
1804 {
1805 }
1806 
1807 //--------------------------------------------------------------------
1808 
1809 void SfxViewShell::GotFocus() const
1810 
1811 /*  [Beschreibung]
1812 
1813         Diese Methode mu\s vom Applikationsentwickler gerufen werden, wenn
1814         das Edit-Window den Focus erhalten hat. Der SFx hat so z.B. die
1815         M"oglichkeit, den Accelerator einzuschalten.
1816 
1817 
1818         [Anmerkung]
1819 
1820         <StarView> liefert leider keine M"oglichkeit, solche Events
1821         'von der Seite' einzuh"angen.
1822 */
1823 
1824 {
1825 }
1826 
1827 //--------------------------------------------------------------------
1828 void SfxViewShell::ResetAllClients_Impl( SfxInPlaceClient *pIP )
1829 {
1830 
1831     SfxInPlaceClientList *pClients = GetIPClientList_Impl(sal_False);
1832     if ( !pClients )
1833         return;
1834 
1835     for ( sal_uInt16 n=0; n < pClients->Count(); n++ )
1836     {
1837         SfxInPlaceClient* pIPClient = pClients->GetObject(n);
1838         if( pIPClient != pIP )
1839             pIPClient->ResetObject();
1840     }
1841 }
1842 
1843 //--------------------------------------------------------------------
1844 
1845 void SfxViewShell::DisconnectAllClients()
1846 {
1847     SfxInPlaceClientList *pClients = GetIPClientList_Impl(sal_False);
1848     if ( !pClients )
1849         return;
1850 
1851     for ( sal_uInt16 n=0; n<pClients->Count(); )
1852         // clients will remove themselves from the list
1853         delete pClients->GetObject(n);
1854 }
1855 
1856 //--------------------------------------------------------------------
1857 
1858 void SfxViewShell::QueryObjAreaPixel( Rectangle& ) const
1859 {
1860 }
1861 
1862 //--------------------------------------------------------------------
1863 
1864 void SfxViewShell::AdjustVisArea(const Rectangle& rRect)
1865 {
1866     DBG_ASSERT (pFrame, "Kein Frame?");
1867     GetObjectShell()->SetVisArea( rRect );
1868 }
1869 
1870 //--------------------------------------------------------------------
1871 
1872 void SfxViewShell::VisAreaChanged(const Rectangle& /*rVisArea*/)
1873 {
1874     SfxInPlaceClientList *pClients = GetIPClientList_Impl(sal_False);
1875     if ( !pClients )
1876         return;
1877 
1878     for (sal_uInt16 n=0; n < pClients->Count(); n++)
1879     {
1880         SfxInPlaceClient* pIPClient = pClients->GetObject(n);
1881         if ( pIPClient->IsObjectInPlaceActive() )
1882             // client is active, notify client that the VisArea might have changed
1883             pIPClient->VisAreaChanged();
1884     }
1885 }
1886 
1887 //--------------------------------------------------------------------
1888 void SfxViewShell::CheckIPClient_Impl( SfxInPlaceClient *pIPClient, const Rectangle& rVisArea )
1889 {
1890     if ( GetObjectShell()->IsInClose() )
1891         return;
1892 
1893     sal_Bool bAlwaysActive =
1894         ( ( pIPClient->GetObjectMiscStatus() & embed::EmbedMisc::EMBED_ACTIVATEIMMEDIATELY ) != 0 );
1895     sal_Bool bActiveWhenVisible =
1896         ( ( pIPClient->GetObjectMiscStatus() & embed::EmbedMisc::MS_EMBED_ACTIVATEWHENVISIBLE ) != 0 );
1897 
1898     // this method is called when either a client is created or the "Edit/Plugins" checkbox is checked
1899     if ( !pIPClient->IsObjectInPlaceActive() && pImp->m_bPlugInsActive )
1900     {
1901         // object in client is currently not active
1902         // check if the object wants to be activated always or when it becomes at least partially visible
1903         // TODO/LATER: maybe we should use the scaled area instead of the ObjArea?!
1904         if ( bAlwaysActive || (bActiveWhenVisible && rVisArea.IsOver(pIPClient->GetObjArea())) )
1905         {
1906             try
1907             {
1908                 pIPClient->GetObject()->changeState( embed::EmbedStates::INPLACE_ACTIVE );
1909             }
1910             catch ( uno::Exception& )
1911             {
1912             }
1913         }
1914     }
1915     else if (!pImp->m_bPlugInsActive)
1916     {
1917         // object in client is currently active and "Edit/Plugins" checkbox is selected
1918         // check if the object wants to be activated always or when it becomes at least partially visible
1919         // in this case selecting of the "Edit/Plugin" checkbox should let such objects deactivate
1920         if ( bAlwaysActive || bActiveWhenVisible )
1921             pIPClient->GetObject()->changeState( embed::EmbedStates::RUNNING );
1922     }
1923 }
1924 
1925 //--------------------------------------------------------------------
1926 
1927 sal_Bool SfxViewShell::PlugInsActive() const
1928 {
1929     return pImp->m_bPlugInsActive;
1930 }
1931 
1932 //--------------------------------------------------------------------
1933 void SfxViewShell::DiscardClients_Impl()
1934 
1935 /*  [Beschreibung]
1936 
1937         Diese Methode dient dazu, vor dem Schlie\sen eines Dokuments das
1938         Speichern der Objekte zu verhindern, wenn der Benutzer Schlie\en ohne
1939         Speichern gew"ahlt hatte.
1940 */
1941 
1942 {
1943     SfxInPlaceClientList *pClients = GetIPClientList_Impl(sal_False);
1944     if ( !pClients )
1945         return;
1946 
1947     for (sal_uInt16 n=0; n < pClients->Count(); )
1948         delete pClients->GetObject(n);
1949 }
1950 
1951 //--------------------------------------------------------------------
1952 
1953 SfxScrollingMode SfxViewShell::GetScrollingMode() const
1954 {
1955     return pImp->m_eScroll;
1956 }
1957 
1958 //--------------------------------------------------------------------
1959 
1960 void SfxViewShell::SetScrollingMode( SfxScrollingMode eMode )
1961 {
1962     pImp->m_eScroll = eMode;
1963 }
1964 
1965 //--------------------------------------------------------------------
1966 
1967 SfxObjectShell* SfxViewShell::GetObjectShell()
1968 {
1969     return pFrame ? pFrame->GetObjectShell() : NULL;
1970 }
1971 
1972 //--------------------------------------------------------------------
1973 
1974 Reference< XModel > SfxViewShell::GetCurrentDocument() const
1975 {
1976     Reference< XModel > xDocument;
1977 
1978     const SfxObjectShell* pDocShell( const_cast< SfxViewShell* >( this )->GetObjectShell() );
1979     OSL_ENSURE( pDocShell, "SfxViewFrame::GetCurrentDocument: no DocShell!?" );
1980     if ( pDocShell )
1981         xDocument = pDocShell->GetModel();
1982     return xDocument;
1983 }
1984 
1985 //--------------------------------------------------------------------
1986 
1987 void SfxViewShell::SetCurrentDocument() const
1988 {
1989     uno::Reference< frame::XModel > xDocument( GetCurrentDocument() );
1990     if ( xDocument.is() )
1991         SfxObjectShell::SetCurrentComponent( xDocument );
1992 }
1993 
1994 //--------------------------------------------------------------------
1995 
1996 const Size& SfxViewShell::GetMargin() const
1997 {
1998     return pImp->aMargin;
1999 }
2000 
2001 //--------------------------------------------------------------------
2002 
2003 void SfxViewShell::SetMargin( const Size& rSize )
2004 {
2005     // Der default-Margin wurde "geeicht" mit www.apple.com !!
2006     Size aMargin = rSize;
2007     if ( aMargin.Width() == -1 )
2008         aMargin.Width() = DEFAULT_MARGIN_WIDTH;
2009     if ( aMargin.Height() == -1 )
2010         aMargin.Height() = DEFAULT_MARGIN_HEIGHT;
2011 
2012     if ( aMargin != pImp->aMargin )
2013     {
2014         pImp->aMargin = aMargin;
2015         MarginChanged();
2016     }
2017 }
2018 
2019 //--------------------------------------------------------------------
2020 
2021 void SfxViewShell::MarginChanged()
2022 {
2023 }
2024 
2025 //--------------------------------------------------------------------
2026 
2027 sal_Bool SfxViewShell::IsShowView_Impl() const
2028 {
2029     return pImp->m_bIsShowView;
2030 }
2031 
2032 //--------------------------------------------------------------------
2033 
2034 SfxFrame* SfxViewShell::GetSmartSelf( SfxFrame* pSelf, SfxMedium& /*rMedium*/ )
2035 {
2036     return pSelf;
2037 }
2038 
2039 //------------------------------------------------------------------------
2040 
2041 void SfxViewShell::JumpToMark( const String& rMark )
2042 {
2043     SfxStringItem aMarkItem( SID_JUMPTOMARK, rMark );
2044     GetViewFrame()->GetDispatcher()->Execute(
2045         SID_JUMPTOMARK,
2046         SFX_CALLMODE_SYNCHRON|SFX_CALLMODE_RECORD,
2047         &aMarkItem, 0L );
2048 }
2049 
2050 //------------------------------------------------------------------------
2051 
2052 SfxInPlaceClientList* SfxViewShell::GetIPClientList_Impl( sal_Bool bCreate ) const
2053 {
2054     if ( !pIPClientList && bCreate )
2055         ( (SfxViewShell*) this )->pIPClientList = new SfxInPlaceClientList;
2056     return pIPClientList;
2057 }
2058 
2059 void SfxViewShell::SetController( SfxBaseController* pController )
2060 {
2061     pImp->m_pController = pController;
2062     pImp->m_bControllerSet = true;
2063 
2064     // there should be no old listener, but if there is one, it should be disconnected
2065     if (  pImp->xClipboardListener.is() )
2066         pImp->xClipboardListener->DisconnectViewShell();
2067 
2068     pImp->xClipboardListener = new SfxClipboardChangeListener( this, GetClipboardNotifier() );
2069 }
2070 
2071 Reference < XController > SfxViewShell::GetController()
2072 {
2073     return pImp->m_pController.get();
2074 }
2075 
2076 SfxBaseController* SfxViewShell::GetBaseController_Impl() const
2077 {
2078     return pImp->m_pController.get();
2079 }
2080 
2081 void SfxViewShell::AddContextMenuInterceptor_Impl( const REFERENCE< XCONTEXTMENUINTERCEPTOR >& xInterceptor )
2082 {
2083     pImp->aInterceptorContainer.addInterface( xInterceptor );
2084 }
2085 
2086 void SfxViewShell::RemoveContextMenuInterceptor_Impl( const REFERENCE< XCONTEXTMENUINTERCEPTOR >& xInterceptor )
2087 {
2088     pImp->aInterceptorContainer.removeInterface( xInterceptor );
2089 }
2090 
2091 ::cppu::OInterfaceContainerHelper& SfxViewShell::GetContextMenuInterceptors() const
2092 {
2093     return pImp->aInterceptorContainer;
2094 }
2095 
2096 void Change( Menu* pMenu, SfxViewShell* pView )
2097 {
2098     SfxDispatcher *pDisp = pView->GetViewFrame()->GetDispatcher();
2099     sal_uInt16 nCount = pMenu->GetItemCount();
2100     for ( sal_uInt16 nPos=0; nPos<nCount; ++nPos )
2101     {
2102         sal_uInt16 nId = pMenu->GetItemId(nPos);
2103         String aCmd = pMenu->GetItemCommand(nId);
2104         PopupMenu* pPopup = pMenu->GetPopupMenu(nId);
2105         if ( pPopup )
2106         {
2107             Change( pPopup, pView );
2108         }
2109         else if ( nId < 5000 )
2110         {
2111             if ( aCmd.CompareToAscii(".uno:", 5) == 0 )
2112             {
2113                 for (sal_uInt16 nIdx=0;;)
2114                 {
2115                     SfxShell *pShell=pDisp->GetShell(nIdx++);
2116                     if (pShell == NULL)
2117                         break;
2118                     const SfxInterface *pIFace = pShell->GetInterface();
2119                     const SfxSlot* pSlot = pIFace->GetSlot( aCmd );
2120                     if ( pSlot )
2121                     {
2122                         pMenu->InsertItem( pSlot->GetSlotId(), pMenu->GetItemText( nId ), pMenu->GetItemBits( nId ), nPos );
2123                         pMenu->SetItemCommand( pSlot->GetSlotId(), aCmd );
2124                         pMenu->RemoveItem( nPos+1 );
2125                         break;
2126                     }
2127                 }
2128             }
2129         }
2130     }
2131 }
2132 
2133 
2134 sal_Bool SfxViewShell::TryContextMenuInterception( Menu& rIn, const ::rtl::OUString& rMenuIdentifier, Menu*& rpOut, ui::ContextMenuExecuteEvent aEvent )
2135 {
2136     rpOut = NULL;
2137     sal_Bool bModified = sal_False;
2138 
2139     // create container from menu
2140         // #110897#
2141     // aEvent.ActionTriggerContainer = ::framework::ActionTriggerHelper::CreateActionTriggerContainerFromMenu( &rIn );
2142     aEvent.ActionTriggerContainer = ::framework::ActionTriggerHelper::CreateActionTriggerContainerFromMenu(
2143         ::comphelper::getProcessServiceFactory(), &rIn, &rMenuIdentifier );
2144 
2145     // get selection from controller
2146     aEvent.Selection = uno::Reference < view::XSelectionSupplier > ( GetController(), uno::UNO_QUERY );
2147 
2148     // call interceptors
2149     ::cppu::OInterfaceIteratorHelper aIt( pImp->aInterceptorContainer );
2150     while( aIt.hasMoreElements() )
2151     {
2152         try
2153         {
2154             ui::ContextMenuInterceptorAction eAction =
2155                 ((ui::XContextMenuInterceptor*)aIt.next())->notifyContextMenuExecute( aEvent );
2156             switch ( eAction )
2157             {
2158                 case ui::ContextMenuInterceptorAction_CANCELLED :
2159                     // interceptor does not want execution
2160                     return sal_False;
2161                 case ui::ContextMenuInterceptorAction_EXECUTE_MODIFIED :
2162                     // interceptor wants his modified menu to be executed
2163                     bModified = sal_True;
2164                     break;
2165                 case ui::ContextMenuInterceptorAction_CONTINUE_MODIFIED :
2166                     // interceptor has modified menu, but allows for calling other interceptors
2167                     bModified = sal_True;
2168                     continue;
2169                 case ui::ContextMenuInterceptorAction_IGNORED :
2170                     // interceptor is indifferent
2171                     continue;
2172                 default:
2173                     DBG_ERROR("Wrong return value of ContextMenuInterceptor!");
2174                     continue;
2175             }
2176         }
2177         catch( uno::RuntimeException& )
2178         {
2179             aIt.remove();
2180         }
2181 
2182         break;
2183     }
2184 
2185     if ( bModified )
2186     {
2187         // container was modified, create a new window out of it
2188         rpOut = new PopupMenu;
2189         ::framework::ActionTriggerHelper::CreateMenuFromActionTriggerContainer( rpOut, aEvent.ActionTriggerContainer );
2190 
2191         Change( rpOut, this );
2192     }
2193 
2194     return sal_True;
2195 }
2196 
2197 void SfxViewShell::TakeOwnerShip_Impl()
2198 {
2199     // currently there is only one reason to take OwnerShip: a hidden frame is printed
2200     // so the ViewShell will check this on EndPrint (->prnmon.cxx)
2201     pImp->m_bGotOwnership = true;
2202 }
2203 
2204 void SfxViewShell::TakeFrameOwnerShip_Impl()
2205 {
2206     // currently there is only one reason to take OwnerShip: a hidden frame is printed
2207     // so the ViewShell will check this on EndPrint (->prnmon.cxx)
2208     pImp->m_bGotFrameOwnership = true;
2209 }
2210 
2211 void SfxViewShell::CheckOwnerShip_Impl()
2212 {
2213     sal_Bool bSuccess = sal_False;
2214     if (pImp->m_bGotOwnership)
2215     {
2216         uno::Reference < util::XCloseable > xModel(
2217             GetObjectShell()->GetModel(), uno::UNO_QUERY );
2218         if ( xModel.is() )
2219         {
2220             try
2221             {
2222                 // this call will destroy this object in case of success!
2223                 xModel->close( sal_True );
2224                 bSuccess = sal_True;
2225             }
2226             catch ( util::CloseVetoException& )
2227             {
2228             }
2229         }
2230     }
2231 
2232     if (!bSuccess && pImp->m_bGotFrameOwnership)
2233     {
2234         // document couldn't be closed or it shouldn't, now try at least to close the frame
2235         uno::Reference < util::XCloseable > xFrame(
2236             GetViewFrame()->GetFrame().GetFrameInterface(), com::sun::star::uno::UNO_QUERY );
2237         if ( xFrame.is() )
2238         {
2239             try
2240             {
2241                 xFrame->close( sal_True );
2242             }
2243             catch ( util::CloseVetoException& )
2244             {
2245             }
2246         }
2247     }
2248 }
2249 
2250 long SfxViewShell::HandleNotifyEvent_Impl( NotifyEvent& rEvent )
2251 {
2252     if (pImp->m_pController.is())
2253         return pImp->m_pController->HandleEvent_Impl( rEvent );
2254     return 0;
2255 }
2256 
2257 sal_Bool SfxViewShell::HasKeyListeners_Impl()
2258 {
2259     return (pImp->m_pController.is())
2260         ? pImp->m_pController->HasKeyListeners_Impl() : sal_False;
2261 }
2262 
2263 sal_Bool SfxViewShell::HasMouseClickListeners_Impl()
2264 {
2265     return (pImp->m_pController.is())
2266         ? pImp->m_pController->HasMouseClickListeners_Impl() : sal_False;
2267 }
2268 
2269 void SfxViewShell::SetAdditionalPrintOptions( const com::sun::star::uno::Sequence < com::sun::star::beans::PropertyValue >& rOpts )
2270 {
2271     pImp->aPrintOpts = rOpts;
2272 //      GetObjectShell()->Broadcast( SfxPrintingHint( -3, NULL, NULL, rOpts ) );
2273 }
2274 
2275 sal_Bool SfxViewShell::Escape()
2276 {
2277     return GetViewFrame()->GetBindings().Execute( SID_TERMINATE_INPLACEACTIVATION );
2278 }
2279 
2280 Reference< view::XRenderable > SfxViewShell::GetRenderable()
2281 {
2282     Reference< view::XRenderable >xRender;
2283     SfxObjectShell* pObj = GetObjectShell();
2284     if( pObj )
2285     {
2286         Reference< frame::XModel > xModel( pObj->GetModel() );
2287         if( xModel.is() )
2288             xRender = Reference< view::XRenderable >( xModel, UNO_QUERY );
2289     }
2290     return xRender;
2291 }
2292 
2293 uno::Reference< datatransfer::clipboard::XClipboardNotifier > SfxViewShell::GetClipboardNotifier()
2294 {
2295     uno::Reference< datatransfer::clipboard::XClipboardNotifier > xClipboardNotifier;
2296     if ( GetViewFrame() )
2297       xClipboardNotifier = uno::Reference< datatransfer::clipboard::XClipboardNotifier >( GetViewFrame()->GetWindow().GetClipboard(), uno::UNO_QUERY );
2298 
2299     return xClipboardNotifier;
2300 }
2301 
2302 void SfxViewShell::AddRemoveClipboardListener( const uno::Reference < datatransfer::clipboard::XClipboardListener >& rClp, sal_Bool bAdd )
2303 {
2304     try
2305     {
2306         if ( GetViewFrame() )
2307         {
2308             uno::Reference< datatransfer::clipboard::XClipboard > xClipboard( GetViewFrame()->GetWindow().GetClipboard() );
2309             if( xClipboard.is() )
2310             {
2311                 uno::Reference< datatransfer::clipboard::XClipboardNotifier > xClpbrdNtfr( xClipboard, uno::UNO_QUERY );
2312                 if( xClpbrdNtfr.is() )
2313                 {
2314                     if( bAdd )
2315                         xClpbrdNtfr->addClipboardListener( rClp );
2316                     else
2317                         xClpbrdNtfr->removeClipboardListener( rClp );
2318                 }
2319             }
2320         }
2321     }
2322     catch( const uno::Exception& )
2323     {
2324     }
2325 }
2326 
2327