summaryrefslogtreecommitdiff
path: root/sfx2/source/view/viewsh.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sfx2/source/view/viewsh.cxx')
-rw-r--r--sfx2/source/view/viewsh.cxx1723
1 files changed, 1723 insertions, 0 deletions
diff --git a/sfx2/source/view/viewsh.cxx b/sfx2/source/view/viewsh.cxx
new file mode 100644
index 0000000000..094c614ed6
--- /dev/null
+++ b/sfx2/source/view/viewsh.cxx
@@ -0,0 +1,1723 @@
+/*************************************************************************
+ *
+ * $RCSfile: viewsh.cxx,v $
+ *
+ * $Revision: 1.1.1.1 $
+ *
+ * last change: $Author: hr $ $Date: 2000-09-18 16:52:37 $
+ *
+ * The Contents of this file are made available subject to the terms of
+ * either of the following licenses
+ *
+ * - GNU Lesser General Public License Version 2.1
+ * - Sun Industry Standards Source License Version 1.1
+ *
+ * Sun Microsystems Inc., October, 2000
+ *
+ * GNU Lesser General Public License Version 2.1
+ * =============================================
+ * Copyright 2000 by Sun Microsystems, Inc.
+ * 901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ *
+ * Sun Industry Standards Source License Version 1.1
+ * =================================================
+ * The contents of this file are subject to the Sun Industry Standards
+ * Source License Version 1.1 (the "License"); You may not use this file
+ * except in compliance with the License. You may obtain a copy of the
+ * License at http://www.openoffice.org/license.html.
+ *
+ * Software provided under this License is provided on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ * See the License for the specific provisions governing your rights and
+ * obligations concerning the Software.
+ *
+ * The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+ *
+ * Copyright: 2000 by Sun Microsystems, Inc.
+ *
+ * All Rights Reserved.
+ *
+ * Contributor(s): _______________________________________
+ *
+ *
+ ************************************************************************/
+
+#ifndef _PLUGIN_HXX //autogen
+#include <so3/plugin.hxx>
+#endif
+#ifndef _APPLET_HXX //autogen
+#include <so3/applet.hxx>
+#endif
+#ifndef _SFXSTRITEM_HXX //autogen
+#include <svtools/stritem.hxx>
+#endif
+#ifndef _SFXENUMITEM_HXX //autogen
+#include <svtools/eitem.hxx>
+#endif
+#ifndef _SFX_WHITER_HXX //autogen
+#include <svtools/whiter.hxx>
+#endif
+#ifndef _SFXINIMGR_HXX //autogen
+#include <svtools/iniman.hxx>
+#endif
+#ifndef _MSGBOX_HXX //autogen
+#include <vcl/msgbox.hxx>
+#endif
+#ifndef _SOERR_HXX //autogen
+#include <so3/soerr.hxx>
+#endif
+#ifndef _SFXINTITEM_HXX //autogen
+#include <svtools/intitem.hxx>
+#endif
+#ifndef _SFXECODE_HXX
+#include <svtools/sfxecode.hxx>
+#endif
+#ifndef _EHDL_HXX
+#include <svtools/ehdl.hxx>
+#endif
+
+#pragma hdrstop
+
+#include "viewsh.hxx"
+#include "viewimp.hxx"
+
+#include "sfxresid.hxx"
+#include "request.hxx"
+#include "templdlg.hxx"
+#include "interno.hxx"
+#include "printer.hxx"
+#include "docfile.hxx"
+#include "dispatch.hxx"
+#include "arrdecl.hxx"
+#include "ipenv.hxx"
+#include "accmgr.hxx"
+#include "intfrm.hxx"
+#include "docfac.hxx"
+#include "view.hrc"
+#include "mnumgr.hxx"
+#include "virtmenu.hxx"
+#include "objuno.hxx"
+#include "sfxlocal.hrc"
+#include "frameobj.hxx"
+#include "sfxbasecontroller.hxx"
+#include "topfrm.hxx"
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::frame;
+
+//=========================================================================
+DBG_NAME(SfxViewShell);
+
+#define SfxViewShell
+#include "sfxslots.hxx"
+
+//=========================================================================
+
+SFX_IMPL_INTERFACE(SfxViewShell,SfxShell,SfxResId(0))
+{
+ SFX_CHILDWINDOW_REGISTRATION( SID_MAIL_CHILDWIN );
+}
+
+TYPEINIT2(SfxViewShell,SfxShell,SfxListener);
+
+//--------------------------------------------------------------------
+
+void SfxViewShell::SetMenu_Impl( SfxMenuBarManager* pMenu )
+{
+}
+
+//--------------------------------------------------------------------
+
+SfxMenuBarManager* SfxViewShell::GetMenu_Impl() const
+{
+ return NULL;
+}
+
+//--------------------------------------------------------------------
+
+ErrCode SfxViewShell::DirectLoad( SfxFrame* pFrame, SfxMedium& rMedium )
+{
+ return ERRCODE_SFX_FORCEDOCLOAD;
+}
+
+//--------------------------------------------------------------------
+
+void SfxViewShell::ExecMisc_Impl( SfxRequest &rReq )
+{
+ const USHORT nId = rReq.GetSlot();
+ switch( nId )
+ {
+ case SID_STYLE_FAMILY :
+ {
+ SFX_REQUEST_ARG(rReq, pItem, SfxUInt16Item, nId, FALSE);
+ if (pItem)
+ pImp->nFamily = pItem->GetValue();
+ break;
+ }
+
+ case SID_STYLE_CATALOG:
+ {
+ SfxTemplateCatalog aCatalog(
+ SFX_APP()->GetTopWindow(), &GetViewFrame()->GetBindings());
+ aCatalog.Execute();
+ break;
+ }
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+ case SID_MAIL_SENDDOC:
+ GetViewFrame()->SetChildWindow( SID_MAIL_CHILDWIN, TRUE );
+ break;
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+ case SID_PLUGINS_ACTIVE:
+ {
+ SFX_REQUEST_ARG(rReq, pShowItem, SfxBoolItem, nId, FALSE);
+ BOOL bActive = pShowItem ? pShowItem->GetValue() : !pImp->bPlugInsActive;
+ // ggf. recorden
+ if ( !rReq.IsAPI() )
+ rReq.AppendItem( SfxBoolItem( nId, bActive ) );
+
+ // Jetzt schon DONE aufrufen, da die Argumente evtl. einen Pool
+ // benutzen, der demn"achst weg ist
+ rReq.Done(TRUE);
+
+ // ausfuehren
+ if ( !pShowItem || bActive != pImp->bPlugInsActive )
+ {
+ SfxFrame *pFrame = GetFrame()->GetTopFrame();
+ if ( pFrame != GetFrame()->GetFrame() )
+ {
+ // FramesetDocument
+ SfxViewShell *pShell = pFrame->GetCurrentViewFrame()->GetViewShell();
+ if ( pShell->GetInterface()->GetSlot( nId ) )
+ pShell->ExecuteSlot( rReq );
+ break;
+ }
+
+ SfxFrameIterator aIter( *pFrame );
+ while ( pFrame )
+ {
+ if ( pFrame->GetCurrentViewFrame() )
+ {
+ SfxViewShell *pView = pFrame->GetCurrentViewFrame()->GetViewShell();
+ if ( pView )
+ {
+ pView->pImp->bPlugInsActive = bActive;
+ SfxInPlaceObject *pObj =
+ pFrame->GetCurrentDocument()->GetInPlaceObject();
+ if ( pObj )
+ {
+ Rectangle aVisArea = pObj->GetVisArea();
+ VisAreaChanged(aVisArea);
+ }
+ }
+ }
+
+ if ( !pFrame->GetParentFrame() )
+ pFrame = aIter.FirstFrame();
+ else
+ pFrame = aIter.NextFrame( *pFrame );
+ }
+ }
+
+ break;
+ }
+ }
+}
+
+//--------------------------------------------------------------------
+
+void SfxViewShell::GetState_Impl( SfxItemSet &rSet )
+{
+ DBG_CHKTHIS(SfxViewShell, 0);
+
+ SfxWhichIter aIter( rSet );
+ for ( USHORT nSID = aIter.FirstWhich(); nSID; nSID = aIter.NextWhich() )
+ {
+ switch ( nSID )
+ {
+ case SID_STYLE_CATALOG:
+ {
+ if ( !GetViewFrame()->KnowsChildWindow( SID_STYLE_DESIGNER ) )
+ rSet.DisableItem( nSID );
+ break;
+ }
+
+ // Printer-Property
+ case SID_PRINTER_NAME:
+ {
+ SfxPrinter *pPrinter = GetPrinter(TRUE);
+ if ( pPrinter )
+ rSet.Put( SfxStringItem( SID_PRINTER_NAME, pPrinter->GetName() ) );
+ break;
+ }
+
+ // Printer-Funktionen
+ case SID_PRINTDOC:
+ case SID_PRINTDOCDIRECT:
+ case SID_SETUPPRINTER:
+ {
+ BOOL bEnabled = pImp->bCanPrint && !pImp->nPrinterLocks;
+ if ( bEnabled )
+ {
+ SfxPrinter *pPrinter = GetPrinter(FALSE);
+ bEnabled = !pPrinter || !pPrinter->IsPrinting();
+ }
+ if ( !bEnabled )
+ {
+ rSet.DisableItem( SID_PRINTDOC );
+ rSet.DisableItem( SID_PRINTDOCDIRECT );
+ rSet.DisableItem( SID_SETUPPRINTER );
+ }
+ break;
+ }
+
+ // Mail-Funktionen
+ case SID_MAIL_SENDDOC:
+ {
+ BOOL bEnable = !GetViewFrame()->HasChildWindow( SID_MAIL_CHILDWIN );
+ if ( !bEnable )
+ rSet.DisableItem( nSID );
+ break;
+ }
+
+ // PlugIns running
+ case SID_PLUGINS_ACTIVE:
+ {
+ rSet.Put( SfxBoolItem( SID_PLUGINS_ACTIVE, !pImp->bPlugInsActive) );
+ break;
+ }
+
+ // SelectionText
+ case SID_SELECTION_TEXT:
+ {
+ rSet.Put( SfxStringItem( SID_SELECTION_TEXT, GetSelectionText() ) );
+ break;
+ }
+
+ // SelectionTextExt
+ case SID_SELECTION_TEXT_EXT:
+ {
+ rSet.Put( SfxStringItem( SID_SELECTION_TEXT_EXT, GetSelectionText(TRUE) ) );
+ break;
+ }
+
+ case SID_STYLE_FAMILY :
+ {
+ rSet.Put( SfxUInt16Item( SID_STYLE_FAMILY, pImp->nFamily ) );
+ break;
+ }
+ }
+ }
+}
+
+//--------------------------------------------------------------------
+
+void SfxViewShell::SetZoomFactor( const Fraction &rZoomX,
+ const Fraction &rZoomY )
+{
+ DBG_ASSERT( GetWindow(), "no window" );
+ MapMode aMap( GetWindow()->GetMapMode() );
+ aMap.SetScaleX( rZoomX );
+ aMap.SetScaleY( rZoomY );
+ GetWindow()->SetMapMode( aMap );
+}
+
+//--------------------------------------------------------------------
+
+SfxInPlaceClient* SfxViewShell::CreateIPClient
+(
+ WorkWindow* pTop,
+ WorkWindow* pDoc,
+ Window* pDraw
+)
+
+/* [Beschreibung]
+
+ "Uber diese Factory-Methode erzeugt der SFx spezielle SfxShell-Instanzen,
+ die als Stellvertreter f"ur InPlace-Objekte dienen. Solle auf Callbacks
+ dieser Stellvertreter reagiert werden, die dieses "uber eine eigene
+ SfxInPlaceClient-Subklasse zu realisieren und diese Factory zu "uberladen.
+*/
+
+{
+ HACK(kann raus)
+ return new SfxInPlaceClient( this, pDraw );
+}
+
+//--------------------------------------------------------------------
+
+void SfxViewShell::UIActivate
+(
+ SvInPlaceObject* pObj // das Objekt, welched deaktiv wurde
+)
+
+/* [Beschreibung]
+
+ Dieser Handler wird gerufen, wenn ein mit der Methode
+ <SfxViewShell::DoVerb()> angesteuertes Objekt aktiviert
+ wurde.
+
+ Die Basisimplementation braucht nicht gerufen zu werden.
+
+
+ [Querverweise]
+ <SfxViewShell::UIDeactivate(SvInPlaceObject)>
+*/
+
+{
+}
+
+//--------------------------------------------------------------------
+
+void SfxViewShell::UIDeactivate
+(
+ SvInPlaceObject* pObj // das Objekt, welched deaktiv wurde
+)
+
+/* [Beschreibung]
+
+ Dieser Handler wird gerufen, wenn ein mit der Methode
+ <SfxViewShell::DoVerb()> aktiviertes Objekt deaktiviert
+ wurde. Dies kann von der Server-Applikation oder durch die Client-
+ Applikation hervorgerufen worden sein.
+
+ Die Basisimplementation braucht nicht gerufen zu werden.
+
+
+ [Querverweise]
+ <SfxViewShell::UIDeactivate(SvInPlaceObject)>
+*/
+
+{
+}
+
+//--------------------------------------------------------------------
+
+ErrCode SfxViewShell::DoVerb
+(
+ SfxInPlaceClient* pIPClient, // zu aktivierender <SfxInPlaceClient>
+ long nVerb // auszuf"uhrendes Verb (default = 0)
+)
+
+/* [Beschreibung]
+
+ [Beispiel]
+
+ ErrCode SwView::DoVerb( SwSoNode *pSoNode, long nVerb )
+ {
+ SwIPClientRef xIPCli = (SwIPClient*)
+ pViewSh->FindIPClient( pSoNode->GetObject() );
+ if ( !xIPCli.Is() )
+ xIPCli = new SwIPClient( pViewSh, pEditWin, .... );
+ pSoNode->GetObject()->DoConnect( xIPCli );
+ xIPCli->GetEnv()->SetObjArea( Rectangle( ... ) );
+ ...
+ return DoVerb( xIPCli, nVerb );
+ }
+*/
+
+{
+ DBG_ASSERT( pIPClient->GetEmbedObj(), "DoVerb aber nicht connected?!" );
+
+ // falls neu, in Liste eintragen
+ // Passiert jetzt schon im Connect !
+// if ( LIST_ENTRY_NOTFOUND == aIPClientList.GetPos( pIPClient ) )
+// aIPClientList.Insert(pIPClient);
+
+ // und ab gehts (kein SetModified rufen, das mach das Obj schon selbst)
+ SfxErrorContext aEc( ERRCTX_SO_DOVERB, GetWindow(), RID_SO_ERRCTX );
+ ErrCode nErr = pIPClient->GetEmbedObj()->DoVerb( nVerb );
+ if( nErr )
+ ErrorHandler::HandleError( nErr );
+ return nErr;
+}
+
+//--------------------------------------------------------------------
+
+SfxInPlaceClient* SfxViewShell::FindIPClient
+(
+ SvEmbeddedObject* pObj, /* <SfxInPlaceClient> f"ur dieses
+ <SvEmbeddedObject> suchen */
+ Window* pObjParentWin /* SfxInPlaceClient, der in diesem
+ Window dargestellt wird */
+) const
+
+/* [Beschreibung]
+
+ Sucht nach einem exisitierenden SfxInPlaceClient f"ur das angegebene
+ Objekt/Window-Paar.
+
+ Wird keins gefunden, wird 0 zur"uckgegeben.
+
+
+ [Querverweise]
+
+ <SfxViewShell::DoVerb(SfxInPlaceClient*,long)>
+*/
+
+{
+ SvInPlaceClientMemberList *pClients = GetIPClientList_Impl(FALSE);
+ if ( !pClients )
+ return 0;
+
+ if( !pObjParentWin )
+ pObjParentWin = GetWindow();
+ for (USHORT n=0; n < pClients->Count(); n++)
+ {
+ SfxInPlaceClient *pIPClient = (SfxInPlaceClient*) pClients->GetObject(n);
+ if ( pIPClient->GetEmbedObj() == pObj &&
+ pIPClient->GetEnv()->GetEditWin() == pObjParentWin )
+ return pIPClient;
+ }
+
+ return 0;
+}
+
+//--------------------------------------------------------------------
+
+SfxInPlaceClient* SfxViewShell::GetIPClient() const
+{
+ return GetUIActiveClient();
+}
+
+//--------------------------------------------------------------------
+
+SfxInPlaceClient* SfxViewShell::GetUIActiveClient() const
+{
+ SvInPlaceClientMemberList *pClients = GetIPClientList_Impl(FALSE);
+ if ( !pClients )
+ return 0;
+
+ SvInPlaceClient *pIPClient=0;
+ SvInPlaceClientRef aIPClient;
+
+ for (USHORT n=0; n < pClients->Count(); n++)
+ {
+ aIPClient = pClients->GetObject(n);
+ if( aIPClient.Is() )
+ {
+ if (aIPClient->GetProtocol().IsUIActive())
+ {
+ pIPClient = aIPClient;
+ break;
+ }
+ }
+ }
+
+ return (SfxInPlaceClient*) pIPClient;
+}
+
+//--------------------------------------------------------------------
+
+void SfxViewShell::Activate( BOOL bMDI )
+{
+ DBG_CHKTHIS(SfxViewShell, 0);
+ if ( bMDI )
+ {
+ SfxObjectShell *pSh = GetViewFrame()->GetObjectShell();
+ if ( pSh->GetModel().is() )
+ pSh->GetModel()->setCurrentController( GetViewFrame()->GetFrame()->GetController() );
+ if ( pSh && pSh->GetMedium() && pSh->GetMedium()->GetName().Len() )
+ INetURLObject::SetBaseURL( pSh->GetBaseURL() );
+ else
+ {
+ INetURLObject aObject( SFX_INIMANAGER()->Get( SFX_KEY_WORK_PATH ), INET_PROT_FILE );
+ aObject.setFinalSlash();
+ INetURLObject::SetBaseURL( aObject.GetMainURL() );
+ }
+ }
+}
+
+//--------------------------------------------------------------------
+
+void SfxViewShell::Deactivate(BOOL bMDI)
+{
+ DBG_CHKTHIS(SfxViewShell, 0);
+}
+
+//--------------------------------------------------------------------
+
+void SfxViewShell::AdjustPosSizePixel
+(
+ const Point& rToolOffset,// linke obere Ecke der Tools im Frame-Window
+ const Size& rSize // gesamte zur Verf"ugung stehende Gr"o\se
+)
+
+{
+ DBG_CHKTHIS(SfxViewShell, 0);
+}
+
+//--------------------------------------------------------------------
+
+void SfxViewShell::Move()
+
+/* [Beschreibung]
+
+ Diese virtuelle Methode wird gerufen, wenn das Fenster, in dem die
+ SfxViewShell dargestellt wird eine StarView-Move() Nachricht erh"alt.
+
+ Die Basisimplementierung braucht nicht gerufen zu werden.
+
+
+ [Anmerkung]
+
+ Diese Methode kann dazu verwendet werden, eine Selektion abzubrechen,
+ um durch das Moven des Fensters erzeugte Maus-Bewegungen anzufangen.
+
+ Zur Zeit funktioniert die Benachrichtigung nicht In-Place.
+*/
+
+{
+}
+
+//--------------------------------------------------------------------
+
+void SfxViewShell::OuterResizePixel
+(
+ const Point& rToolOffset,// linke obere Ecke der Tools im Frame-Window
+ const Size& rSize // gesamte zur Verf"ugung stehende Gr"o\se
+)
+
+/* [Beschreibung]
+
+ Diese Methode mu berladen werden, um auf "Anderungen der Gre
+ der View zu reagieren. Dabei definieren wir die View als das Edit-Window
+ zuz"uglich der um das Edit-Window angeordnenten Tools (z.B. Lineale).
+
+ Das Edit-Window darf weder in Gr"o\se noch Position ver"andert werden.
+
+ Die Vis-Area der SfxObjectShell, dessen Skalierung und Position
+ d"urfen hier ver"andert werden. Der Hauptanwendungsfall ist dabei,
+ das Ver"andern der Gr"o\se der Vis-Area.
+
+ "Andert sich durch die neue Berechnung der Border, so mu\s dieser
+ mit <SfxViewShell::SetBorderPixel(const SvBorder&)> gesetzt werden.
+ Erst nach Aufruf von 'SetBorderPixel' ist das Positionieren von
+ Tools erlaubt.
+
+
+ [Beispiel]
+
+ void AppViewSh::OuterViewResizePixel( const Point &rOfs, const Size &rSz )
+ {
+ // Tool-Positionen und Gr"o\sen von au\sen berechnen, NICHT setzen!
+ // (wegen folgender Border-Berechnung)
+ Point aHLinPos...; Size aHLinSz...;
+ ...
+
+ // Border f"ur Tools passend zu rSize berechnen und setzen
+ SvBorder aBorder...
+ SetBorderPixel( aBorder ); // ab jetzt sind Positionierungen erlaubt
+
+ // Tools anordnen
+ pHLin->SetPosSizePixel( aHLinPos, aHLinSz );
+ ...
+ }
+
+
+ [Querverweise]
+
+ <SfxViewShell::InnerResizePixel(const Point&,const Size& rSize)>
+*/
+
+{
+ DBG_CHKTHIS(SfxViewShell, 0);
+ SetBorderPixel( SvBorder() );
+}
+
+//--------------------------------------------------------------------
+
+void SfxViewShell::InnerResizePixel
+(
+ const Point& rToolOffset,// linke obere Ecke der Tools im Frame-Window
+ const Size& rSize // dem Edit-Win zur Verf"ugung stehende Gr"o\se
+)
+
+/* [Beschreibung]
+
+ Diese Methode mu berladen werden, um auf "Anderungen der Gre
+ des Edit-Windows zu reagieren.
+
+ Das Edit-Window darf weder in Gr"o\se noch Position ver"andert werden.
+ Weder die Vis-Area der SfxObjectShell noch dessen Skalierung oder
+ Position d"urfen ver"andert werden.
+
+ "Andert sich durch die neue Berechnung der Border, so mu\s dieser
+ mit <SfxViewShell::SetBorderPixel(const SvBorder&)> gesetzt werden.
+ Erst nach Aufruf von 'SetBorderPixel' ist das Positionieren von
+ Tools erlaubt.
+
+
+ [Beispiel]
+
+ void AppViewSh::InnerViewResizePixel( const Point &rOfs, const Size &rSz )
+ {
+ // Tool-Positionen und Gr"o\sen von innen berechnen, NICHT setzen!
+ // (wegen folgender Border-Berechnung)
+ Point aHLinPos...; Size aHLinSz...;
+ ...
+
+ // Border f"ur Tools passend zu rSz berechnen und setzen
+ SvBorder aBorder...
+ SetBorderPixel( aBorder ); // ab jetzt sind Positionierungen erlaubt
+
+ // Tools anordnen
+ pHLin->SetPosSizePixel( aHLinPos, aHLinSz );
+ ...
+ }
+
+
+ [Querverweise]
+
+ <SfxViewShell::OuterResizePixel(const Point&,const Size& rSize)>
+*/
+
+{
+ DBG_CHKTHIS(SfxViewShell, 0);
+ SetBorderPixel( SvBorder() );
+}
+
+//--------------------------------------------------------------------
+
+void SfxViewShell::InvalidateBorder()
+{
+ DBG_CHKTHIS(SfxViewShell, 0);
+ DBG_ASSERT( GetViewFrame(), "SfxViewShell without SfxViewFrame" );
+
+ GetViewFrame()->InvalidateBorderImpl( this );
+}
+
+//--------------------------------------------------------------------
+
+void SfxViewShell::SetBorderPixel( const SvBorder &rBorder )
+{
+ DBG_CHKTHIS(SfxViewShell, 0);
+ DBG_ASSERT( GetViewFrame(), "SfxViewShell without SfxViewFrame" );
+
+ GetViewFrame()->SetBorderPixelImpl( this, rBorder );
+}
+
+//--------------------------------------------------------------------
+
+const SvBorder& SfxViewShell::GetBorderPixel() const
+{
+ DBG_CHKTHIS(SfxViewShell, 0);
+ DBG_ASSERT( GetViewFrame(), "SfxViewShell without SfxViewFrame" );
+
+ return GetViewFrame()->GetBorderPixelImpl( this );
+}
+
+//--------------------------------------------------------------------
+
+void SfxViewShell::SetWindow
+(
+ Window* pViewPort // Pointer auf das Datenfenster bzw. 0 im Destruktor
+)
+
+/* [Beschreibung]
+
+ Mit dieser Methode wird der SfxViewShell das Datenfenster mitgeteilt.
+ Dieses wird f"ur den In-Place-Container und f"ur das korrekte
+ Wiederherstellen des Focus ben"otigt.
+
+ Selbst In-Place-aktiv ist das Umsetzen des ViewPort-Windows verboten.
+*/
+
+{
+ if( pWindow == pViewPort )
+ return;
+
+ // ggf. vorhandene IP-Clients disconnecten
+ SvInPlaceClientMemberList *pClients = GetIPClientList_Impl(FALSE);
+ if ( pClients )
+ {
+ SvInPlaceClientRef aIPClient;
+ USHORT nCount = (USHORT)pClients->Count();
+ for (USHORT n=0; n<nCount; n++)
+ {
+ // Da beim DisConnect der Client immer aus der Liste entfernt wird,
+ // immer das 0-te Element holen
+ aIPClient = pClients->GetObject(0);
+ if( aIPClient.Is() )
+ {
+ if (aIPClient->GetIPObj())
+ {
+ aIPClient->DoDisconnect();
+ aIPClient.Clear();
+ }
+ }
+ }
+ }
+
+ // View-Port austauschen
+ BOOL bHadFocus = pWindow ? pWindow->HasChildPathFocus( TRUE ) : FALSE;
+ pWindow = pViewPort;
+ if ( bHadFocus && pWindow )
+ SFX_APP()->GrabFocus( pWindow );
+}
+
+//--------------------------------------------------------------------
+
+Size SfxViewShell::GetOptimalSizePixel() const
+{
+ DBG_CHKTHIS(SfxViewShell, 0);
+ DBG_ASSERT(pWindow, "Kein Fenster");
+/*
+ Rectangle aAppWinRect ( SfxApplicationWindow::Get()->GetClientAreaPixel() );
+ if ( aAppWinRect.IsEmpty() )
+ // Bei Hochfahren der Applikation ist die ClientArea noch
+ // nicht berechnet worden, wenn das erste Dokument erzeugt
+ // wird
+ aAppWinRect = Rectangle(Point(), Application::GetAppWindow()->GetOutputSizePixel());
+ else
+ aAppWinRect.Move( -aAppWinRect.Left(), -aAppWinRect.Top() );
+ Point aPoint( aAppWinRect.BottomRight() );
+ */
+
+ DBG_ERROR( "Useless call!" );
+ return Size();
+}
+
+//------------------------------------------------------------------------
+
+SfxViewShell::SfxViewShell
+(
+ SfxViewFrame* pViewFrame, /* <SfxViewFrame>, in dem diese View
+ dargestellt wird */
+ USHORT nFlags /* siehe <SfxViewShell-Flags> */
+)
+
+: SfxShell(this),
+ pImp( new SfxViewShell_Impl ),
+#if !SFX_VIEWSH_INCLUDES_CLIENTSH_HXX
+ pIPClientList( 0 ),
+#endif
+ pWindow(0),
+ pFrame(pViewFrame),
+ pSubShell(0),
+ bOptimizeEach(0 != (nFlags & SFX_VIEW_OPTIMIZE_EACH)),
+ bMaximizeFirst( 0 != (nFlags & SFX_VIEW_MAXIMIZE_FIRST) )
+ ,bNoNewWindow( 0 != (nFlags & SFX_VIEW_NO_NEWWINDOW) )
+{
+ DBG_CTOR(SfxViewShell, 0);
+
+ pImp->pController = 0;
+ pImp->bIsShowView =
+ !(SFX_VIEW_NO_SHOW == (nFlags & SFX_VIEW_NO_SHOW));
+ pImp->bUseObjectSize =
+ SFX_CREATE_MODE_EMBEDDED==pFrame->GetObjectShell()->GetCreateMode() &&
+ SFX_VIEW_OBJECTSIZE_EMBEDDED == (nFlags & SFX_VIEW_OBJECTSIZE_EMBEDDED);
+ pImp->bCanPrint = SFX_VIEW_CAN_PRINT == (nFlags & SFX_VIEW_CAN_PRINT);
+ pImp->bFrameSetImpl = nFlags & SFX_VIEW_IMPLEMENTED_AS_FRAMESET;
+ pImp->bHasPrintOptions =
+ SFX_VIEW_HAS_PRINTOPTIONS == (nFlags & SFX_VIEW_HAS_PRINTOPTIONS);
+ pImp->bPlugInsActive = TRUE;
+ if ( pFrame->GetParentViewFrame() )
+ pImp->bPlugInsActive = pFrame->GetParentViewFrame()->GetViewShell()->pImp->bPlugInsActive;
+ pImp->eScroll = SCROLLING_DEFAULT;
+ pImp->pSetDescr = NULL;
+ pImp->nPrinterLocks = 0;
+ pImp->pMenuBarResId = 0;
+ pImp->pAccelResId = 0;
+ pImp->pAccel = 0;
+ pImp->pMenu = 0;
+ pImp->bControllerSet = FALSE;
+ pImp->nFamily = 0xFFFF; // undefined, default set by TemplateDialog
+ SetMargin( pFrame->GetMargin_Impl() );
+
+ SetPool( &pViewFrame->GetObjectShell()->GetPool() );
+ StartListening(*SFX_APP());
+
+ // in Liste eintragen
+ const SfxViewShell *pThis = this; // wegen der kranken Array-Syntax
+ SfxViewShellArr_Impl &rViewArr = SFX_APP()->GetViewShells_Impl();
+ rViewArr.Insert(pThis, rViewArr.Count() );
+}
+
+//--------------------------------------------------------------------
+
+SfxViewShell::~SfxViewShell()
+{
+ DBG_DTOR(SfxViewShell, 0);
+
+ // aus Liste austragen
+ const SfxViewShell *pThis = this;
+ SfxViewShellArr_Impl &rViewArr = SFX_APP()->GetViewShells_Impl();
+ rViewArr.Remove( rViewArr.GetPos(pThis) );
+// if ( GetViewFrame()->GetFrame()->GetFrameSet_Impl() == pImp->pSetDescr )
+// GetViewFrame()->GetFrame()->SetFrameSet_Impl( NULL );
+// delete pImp->pSetDescr;
+
+ if ( pImp->pMenu )
+ {
+ SfxTopViewFrame* pTopView = PTR_CAST( SfxTopViewFrame, GetViewFrame()->GetTopViewFrame() );
+ SfxTopFrame *pTop = pTopView ? pTopView->GetTopFrame_Impl() : NULL;
+ if ( pTop )
+ {
+ Menu* pMenu = pImp->pMenu->GetMenu()->GetSVMenu();
+ if ( pMenu == pTop->GetMenuBar_Impl() )
+ pTop->SetMenuBar_Impl( 0 );
+ }
+
+ delete pImp->pMenu;
+ }
+
+ if ( pImp->pController )
+ {
+ pImp->pController->ReleaseShell_Impl();
+ pImp->pController->release();
+ }
+
+ delete pImp->pMenuBarResId;
+ delete pImp;
+
+#if !SFX_VIEWSH_INCLUDES_CLIENTSH_HXX
+ delete pIPClientList;
+#endif
+}
+
+//--------------------------------------------------------------------
+
+USHORT SfxViewShell::PrepareClose
+(
+ BOOL bUI, // TRUE: Dialoge etc. erlaubt, FALSE: silent-mode
+ BOOL bForBrowsing
+)
+{
+ SfxPrinter *pPrinter = GetPrinter();
+ if ( pPrinter && pPrinter->IsPrinting() )
+ {
+ if ( bUI )
+ {
+ MessBox aInfoBox( &GetViewFrame()->GetWindow(), SfxResId(MSG_CANT_CLOSE) );
+
+//(mba) if ( bForBrowsing && GetViewFrame()->GetFrame()->GetTask() )
+// aInfoBox.AddButton( String( SfxResId( RID_STR_NEW_TASK ) ), RET_NEWTASK, BUTTONDIALOG_DEFBUTTON | BUTTONDIALOG_FOCUSBUTTON );
+
+ USHORT nRet = aInfoBox.Execute();
+ if ( nRet == RET_NEWTASK )
+ return nRet;
+ }
+
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+//--------------------------------------------------------------------
+
+SfxViewShell* SfxViewShell::Current()
+{
+ SfxViewFrame *pCurrent = SfxViewFrame::Current();
+ return pCurrent ? pCurrent->GetViewShell() : NULL;
+}
+
+//--------------------------------------------------------------------
+
+SdrView* SfxViewShell::GetDrawView() const
+
+/* [Beschreibung]
+
+ Diese virtuelle Methode mu\s von den Subklassen "uberladen werden, wenn
+ der Property-Editor zur Verf"ugung stehen soll.
+
+ Die Default-Implementierung liefert immer 0.
+*/
+
+{
+ return 0;
+}
+
+//--------------------------------------------------------------------
+
+String SfxViewShell::GetSelectionText
+(
+ BOOL bCompleteWords /* FALSE (default)
+ Nur der tats"achlich selektierte Text wird
+ zur"uckgegeben.
+
+ TRUE
+ Der selektierte Text wird soweit erweitert,
+ da\s nur ganze W"orter zur"uckgegeben werden.
+ Als Worttrenner gelten White-Spaces und die
+ Satzzeichen .,; sowie einfache und doppelte
+ Anf"uhrungszeichen.
+ */
+)
+
+/* [Beschreibung]
+
+ Diese Methode kann von Anwendungsprogrammierer "uberladen werden,
+ um einen Text zur"uckzuliefern, der in der aktuellen Selektion
+ steht. Dieser wird z.B. beim Versenden (email) verwendet.
+
+ Mit bCompleteWords == TRUE ger"ufen, reicht z.B. auch der Cursor,
+ der in einer URL steht, um die gesamte URL zu liefern.
+*/
+
+{
+ return String();
+}
+
+//--------------------------------------------------------------------
+
+BOOL SfxViewShell::HasSelection( BOOL ) const
+
+/* [Beschreibung]
+
+ Mit dieser virtuellen Methode kann z.B. ein Dialog abfragen, ob in der
+ aktuellen View etwas selektiert ist. Wenn der Parameter <BOOL> TRUE ist,
+ wird abgefragt, ob Text selektiert ist.
+*/
+
+{
+ return FALSE;
+}
+
+//--------------------------------------------------------------------
+
+void SfxViewShell::SetSubShell( SfxShell *pShell )
+
+/* [Beschreibung]
+
+ Mit dieser Methode kann eine Selektions- oder Cursor-Shell angemeldet
+ werden, die automatisch unmittelbar nach der SfxViewShell auf den
+ SfxDispatcher gepusht wird, und automatisch umittelbar vor ihr
+ gepoppt wird.
+
+ Ist die SfxViewShell-Instanz bereits gepusht, dann wird pShell
+ sofort ebenfalls gepusht. Wird mit SetSubShell eine andere SfxShell
+ Instanz angemeldet, als vorher angemeldet war, wird die zuvor angemeldete
+ ggf. automatisch gepoppt. Mit pShell==0 kann daher die aktuelle
+ Sub-Shell abgemeldet werden.
+*/
+
+{
+ // ist diese ViewShell "uberhaupt aktiv?
+ SfxDispatcher *pDisp = pFrame->GetDispatcher();
+ if ( pDisp->IsActive(*this) )
+ {
+ // Dispatcher updaten
+ if ( pSubShell )
+ pDisp->Pop(*pSubShell);
+ if ( pShell )
+ pDisp->Push(*pShell);
+ pDisp->Flush();
+ }
+
+ pSubShell = pShell;
+}
+
+void SfxViewShell::AddSubShell( SfxShell& rShell )
+{
+ pImp->aArr.Insert( &rShell, pImp->aArr.Count() );
+ SfxDispatcher *pDisp = pFrame->GetDispatcher();
+ if ( pDisp->IsActive(*this) )
+ {
+ pDisp->Push(rShell);
+ pDisp->Flush();
+ }
+}
+
+void SfxViewShell::RemoveSubShell( SfxShell* pShell )
+{
+ SfxDispatcher *pDisp = pFrame->GetDispatcher();
+ if ( !pShell )
+ {
+ USHORT nCount = pImp->aArr.Count();
+ if ( pDisp->IsActive(*this) )
+ {
+ for ( USHORT n=nCount; n>0; n-- )
+ pDisp->Pop( *pImp->aArr[n-1] );
+ pDisp->Flush();
+ }
+
+ pImp->aArr.Remove(0, nCount);
+ }
+ else
+ {
+ USHORT nPos = pImp->aArr.GetPos( pShell );
+ if ( nPos != 0xFFFF )
+ {
+ pImp->aArr.Remove( nPos );
+ if ( pDisp->IsActive(*this) )
+ {
+ pDisp->RemoveShell_Impl( *pShell );
+ pDisp->Flush();
+ }
+ }
+ }
+}
+
+SfxShell* SfxViewShell::GetSubShell( USHORT nNo )
+{
+ USHORT nCount = pImp->aArr.Count();
+ if ( nNo<nCount )
+ return pImp->aArr[nCount-nNo-1];
+ return NULL;
+}
+
+void SfxViewShell::PushSubShells_Impl( BOOL bPush )
+{
+ USHORT nCount = pImp->aArr.Count();
+ SfxDispatcher *pDisp = pFrame->GetDispatcher();
+ if ( bPush )
+ {
+ for ( USHORT n=0; n<nCount; n++ )
+ pDisp->Push( *pImp->aArr[n] );
+
+// HACK(evtl. PushSubShells fuer SW virtuell machen oder im SW umbauen)
+// Notify( *this, SfxSimpleHint( SFX_HINT_RESERVED4 ) );
+ }
+ else if ( nCount )
+ {
+ pDisp->Pop( *pImp->aArr[0], SFX_SHELL_POP_UNTIL );
+
+// HACK(evtl. PushSubShells fuer SW virtuell machen oder im SW umbauen)
+// Notify( *this, SfxSimpleHint( SFX_HINT_RESERVED3 ) );
+ }
+
+ pDisp->Flush();
+}
+
+//--------------------------------------------------------------------
+
+void SfxViewShell::WriteUserData( String &, BOOL bBrowse )
+{
+}
+
+//--------------------------------------------------------------------
+
+void SfxViewShell::ReadUserData(const String &, BOOL bBrowse )
+{
+}
+
+//--------------------------------------------------------------------
+// returns the first shell of spec. type viewing the specified doc.
+
+SfxViewShell* SfxViewShell::GetFirst
+(
+ const TypeId* pType,
+ BOOL bOnlyVisible
+)
+{
+ SfxViewShellArr_Impl &rShells = SFX_APP()->GetViewShells_Impl();
+
+ // search for a SfxViewShell of the specified type
+ for ( USHORT nPos = 0; nPos < rShells.Count(); ++nPos )
+ {
+ SfxViewShell *pShell = rShells.GetObject(nPos);
+ if ( !pType || pShell->IsA(*pType) )
+ return pShell;
+ }
+
+ return 0;
+}
+
+//--------------------------------------------------------------------
+// returns the next shell of spec. type viewing the specified doc.
+
+SfxViewShell* SfxViewShell::GetNext
+(
+ const SfxViewShell& rPrev,
+ const TypeId* pType,
+ BOOL bOnlyVisible
+)
+{
+ SfxViewShellArr_Impl &rShells = SFX_APP()->GetViewShells_Impl();
+
+ // refind the specified predecessor
+ USHORT nPos;
+ for ( nPos = 0; nPos < rShells.Count(); ++nPos )
+ if ( rShells.GetObject(nPos) == &rPrev )
+ break;
+
+ // search for a Frame of the specified type
+ for ( ++nPos; nPos < rShells.Count(); ++nPos )
+ {
+ SfxViewShell *pShell = rShells.GetObject(nPos);
+ if ( !pType || pShell->IsA(*pType) )
+ return pShell;
+ }
+ return 0;
+}
+
+//--------------------------------------------------------------------
+
+void SfxViewShell::SFX_NOTIFY( SfxBroadcaster& rBC,
+ const TypeId& rBCType,
+ const SfxHint& rHint,
+ const TypeId& rHintType )
+{
+//! (pb) do we need here new implementation?
+#ifndef NOOLDSV
+ if ( rHint.ISA(SfxSysChangeHint) && SETTINGS_CHANGE_PRINTER ==
+ ( (const SfxSysChangeHint &)rHint ).GetChangeType() )
+ {
+ SfxPrinter *pPrinter = GetPrinter();
+ if ( pPrinter && pPrinter->IsDefPrinter() )
+ SetPrinter_Impl( new SfxPrinter(pPrinter->GetOptions().Clone()) );
+ }
+#endif
+}
+
+//--------------------------------------------------------------------
+
+FASTBOOL SfxViewShell::KeyInput( const KeyEvent &rKeyEvent )
+
+/* [Beschreibung]
+
+ Diese Methode f"uhrt das KeyEvent 'rKeyEvent' "uber die an dieser
+ SfxViewShell direkt oder indirekt (z.B. via Applikation) konfigurierten
+ Tasten (Accelerator) aus.
+
+
+ [R"uckgabewert]
+
+ FASTBOOL TRUE
+ die Taste ist konfiguriert, der betreffende
+ Handler wurde gerufen
+
+ FALSE
+ die Taste ist nicht konfiguriert, es konnte
+ also kein Handler gerufen werden
+
+
+ [Querverweise]
+ <SfxApplication::KeyInput(const KeyEvent&)>
+*/
+{
+ // sonst an einem der Accelerator-Mgr
+ SfxAcceleratorManager* pAccMgr = GetAccMgr_Impl();
+ if ( pAccMgr && pAccMgr->Call( rKeyEvent, GetViewFrame()->GetBindings() ) )
+ return TRUE;
+
+ return SFX_APP()->KeyInput( rKeyEvent );
+}
+
+FASTBOOL SfxViewShell::GlobalKeyInput_Impl( const KeyEvent &rKeyEvent )
+{
+ // sonst an einem der Accelerator-Mgr
+ SfxAcceleratorManager* pAccMgr = NULL;
+ pAccMgr = GetAccMgr_Impl();
+ if ( pAccMgr && pAccMgr->Call( rKeyEvent, pFrame->GetBindings(), TRUE ) )
+ return TRUE;
+
+ return SFX_APP()->KeyInput( rKeyEvent );
+}
+
+//--------------------------------------------------------------------
+
+void SfxViewShell::ShowCursor( FASTBOOL bOn )
+
+/* [Beschreibung]
+
+ Diese Methode mu\s von Subklassen "uberladen werden, damit vom SFx
+ aus der Cursor ein- und ausgeschaltet werden kann. Dies geschieht
+ z.B. bei laufendem <SfxProgress>.
+*/
+
+{
+}
+
+//--------------------------------------------------------------------
+
+void SfxViewShell::GotFocus() const
+
+/* [Beschreibung]
+
+ Diese Methode mu\s vom Applikationsentwickler gerufen werden, wenn
+ das Edit-Window den Focus erhalten hat. Der SFx hat so z.B. die
+ M"oglichkeit, den Accelerator einzuschalten.
+
+
+ [Anmerkung]
+
+ <StarView> liefert leider keine M"oglichkeit, solche Events
+ 'von der Seite' einzuh"angen.
+*/
+
+{
+}
+
+//--------------------------------------------------------------------
+
+ErrCode SfxViewShell::DoVerb(long nVerb)
+
+/* [Beschreibung]
+
+ Virtuelle Methode, um am selektierten Objekt ein Verb auszuf"uhren.
+ Da dieses Objekt nur den abgeleiteten Klassen bekannt ist, mu DoVerb
+ dort "uberlschrieben werden.
+
+*/
+
+{
+ return ERRCODE_SO_NOVERBS;
+}
+
+//--------------------------------------------------------------------
+
+void SfxViewShell::DisconnectClients_Impl(SvInPlaceClient *pIP)
+
+/* [Beschreibung]
+
+ Diese Methode dient dazu, bei UI-Aktivierung eins IPClients alle anderen
+ noch bestehenden Verbindungen zu trennen.
+
+*/
+
+{
+
+ // SO2 stellt sicher, da\s nur ein Object gleichzeitig UI-aktiv ist.
+ // Aus Speicherplatzgr"unden werden aber alle Objekte, die nicht aktiv
+ // sind oder sein m"ussen, disconnected.
+
+ SvInPlaceClientMemberList *pClients = GetIPClientList_Impl(FALSE);
+ if ( !pClients )
+ return;
+
+ SvInPlaceClientRef aIPClient;
+ for ( USHORT n=0; n < pClients->Count(); )
+ {
+ aIPClient = pClients->GetObject(n);
+ if( aIPClient.Is() && aIPClient != pIP && aIPClient->GetIPObj() &&
+ !(aIPClient->GetIPObj()->GetMiscStatus() & SVOBJ_MISCSTATUS_ACTIVATEWHENVISIBLE) )
+ aIPClient->DoDisconnect();
+ else
+ n++;
+ }
+}
+
+//--------------------------------------------------------------------
+
+void SfxViewShell::DisconnectAllClients()
+{
+ SvInPlaceClientMemberList *pClients = GetIPClientList_Impl(FALSE);
+ if ( !pClients )
+ return;
+
+ SvInPlaceClientRef aIPClient;
+ for ( USHORT n=0; n<pClients->Count(); )
+ {
+ aIPClient = pClients->GetObject(n);
+ if( aIPClient.Is() && aIPClient->GetIPObj() )
+ aIPClient->DoDisconnect();
+ else
+ n++;
+ }
+}
+
+//--------------------------------------------------------------------
+
+BOOL SfxViewShell::UseObjectSize() const
+{
+ return pImp->bUseObjectSize;
+}
+
+//--------------------------------------------------------------------
+
+void SfxViewShell::QueryObjAreaPixel( Rectangle& ) const
+{
+}
+
+//--------------------------------------------------------------------
+
+void SfxViewShell::AdjustVisArea(const Rectangle& rRect)
+{
+ DBG_ASSERT (pFrame, "Kein Frame?");
+
+ SfxInPlaceObject *pObj = pFrame->GetObjectShell()->GetInPlaceObject();
+ if ( !pObj )
+ return;
+
+ if ( UseObjectSize() )
+ {
+ Point aPos = rRect.TopLeft();
+ Size aSize = pObj->GetVisArea().GetSize();
+ pObj->SetVisArea( Rectangle(aPos, aSize) );
+ }
+ else
+ pObj->SetVisArea( rRect );
+}
+
+//--------------------------------------------------------------------
+
+void SfxViewShell::VisAreaChanged(const Rectangle& rVisArea)
+{
+ SvInPlaceClientMemberList *pClients = GetIPClientList_Impl(FALSE);
+ if ( !pClients )
+ return;
+
+ SvInPlaceClientRef aIPClient;
+ for (USHORT n=0; n < pClients->Count(); n++)
+ {
+ // Die Liste enth"alt alle connected clients
+ aIPClient = pClients->GetObject(n);
+ if( aIPClient.Is() )
+ CheckIPClient_Impl( aIPClient, rVisArea );
+ }
+}
+
+
+//--------------------------------------------------------------------
+
+void SfxViewShell::CheckIPClient_Impl( SvInPlaceClient *pIPClient,
+ const Rectangle& rVisArea )
+{
+ if ( GetObjectShell()->IsInClose() )
+ return;
+
+ SfxIniManager* pIniMgr = SFX_INIMANAGER();
+ BOOL bApplets = pIniMgr->IsAppletsEnabled();
+ BOOL bActive = pIPClient->IsInPlaceActive();
+ BOOL bPlugIn = FALSE;
+#ifdef SOLAR_PLUGIN
+ bPlugIn = Application::IsRemoteServer() ? FALSE : (USHORT)pIniMgr->Get( SFX_KEY_INET_EXE_PLUGIN ).ToInt32();
+#endif
+
+ SvAppletObjectRef aAppRef = pIPClient->GetIPObj();
+ SvPlugInObjectRef aPlugRef = pIPClient->GetIPObj();
+ SfxFrameObjectRef aFrameRef = pIPClient->GetIPObj();
+
+ if ( !pImp->bPlugInsActive && ( aPlugRef.Is() || aAppRef.Is() || aFrameRef.Is() ) )
+ {
+ if ( bActive )
+ pIPClient->GetProtocol().Reset2Open();
+ return;
+ }
+
+ BOOL bAlwaysActive = ( pIPClient->GetIPObj()->GetMiscStatus() == SVOBJ_MISCSTATUS_ALWAYSACTIVATE );
+
+ if ( bAlwaysActive || rVisArea.IsOver( pIPClient->GetClientData()->GetObjArea()) )
+ {
+ // Der Client ist connected und sichtbar.
+ if ( bActive )
+ {
+ // Wenn er aktiv ist, mu\s er benachrichtigt werden.
+ pIPClient->GetEnv()->OutDevScaleChanged();
+
+ if ( aPlugRef.Is() )
+ {
+ // Plugins sind nur sichtbar, wenn das entsprechende
+ // flag auch angeschaltet ist
+ if ( !bPlugIn )
+ {
+ pIPClient->GetProtocol().Reset2Open();
+ }
+ else if ( aPlugRef->GetPlugInMode() == PLUGIN_FULL )
+ {
+ SetBorderPixel(SvBorder());
+ Window *pWin = GetWindow();
+ Size aSize = pWin->GetOutputSizePixel();
+ aSize = pWin->PixelToLogic(aSize);
+ Rectangle aRect = Rectangle ( pWin->PixelToLogic(Point()), aSize);
+ pIPClient->GetClientData()->SetObjArea(aRect);
+ }
+ }
+ else if ( aAppRef.Is() && !bApplets )
+ {
+ // Java-Applets sind nicht aktiv, wenn Java in den
+ // Options ausgeschaltet wurde
+ pIPClient->GetProtocol().Reset2Open();
+ }
+ }
+ else
+ {
+ // Ist er es nicht, aber da\s Object soll aktiv sein,
+ // wenn es sichtbar ist, mu\s das Object aktiviert werden;
+ // bei Plugins und Applets sind noch die Flags auszuwerten
+ if ( pIPClient->GetIPObj()->GetMiscStatus() &
+ SVOBJ_MISCSTATUS_ACTIVATEWHENVISIBLE )
+ {
+ BOOL bActivate = TRUE;
+ if ( aPlugRef.Is() )
+ bActivate = bPlugIn;
+ else if ( aAppRef.Is() )
+ bActivate = bApplets;
+ if ( bActivate )
+ pIPClient->GetIPObj()->DoVerb(0);
+ }
+ }
+ }
+ else if ( bActive )
+ {
+ // Wenn er aktiv ist, mu\s er benachrichtigt werden.
+ pIPClient->GetEnv()->OutDevScaleChanged();
+
+ // Ein nicht sichtbarer client soll disconnected werden, wenn
+ // er (nur) aktiv ist, wenn er sichtbar ist.
+ // Wenn er dann wieder sichtbar wird, mu\s die Applikation
+ // ihn connecten, damit er in der client list erscheint!
+
+ // Auf Wunsch von MB erst mal entfernt !!
+// if ( pIPClient->GetIPObj()->GetMiscStatus() &
+// SVOBJ_MISCSTATUS_ACTIVATEWHENVISIBLE )
+// pIPClient->DoDisconnect();
+ }
+}
+
+//--------------------------------------------------------------------
+
+BOOL SfxViewShell::PlugInsActive() const
+{
+ return pImp->bPlugInsActive;
+}
+
+//--------------------------------------------------------------------
+
+void SfxViewShell::DiscardClients_Impl()
+
+/* [Beschreibung]
+
+ Diese Methode dient dazu, vor dem Schlie\sen eines Dokuments das
+ Speichern der Objekte zu verhindern, wenn der Benutzer Schlie\en ohne
+ Speichern gew"ahlt hatte.
+*/
+
+{
+ SvInPlaceClientMemberList *pClients = GetIPClientList_Impl(FALSE);
+ if ( !pClients )
+ return;
+
+ SvInPlaceClientRef aIPClient;
+ for (USHORT n=0; n < pClients->Count(); n++)
+ {
+ aIPClient = pClients->GetObject(n);
+ if( aIPClient.Is() )
+ {
+ if (aIPClient->GetIPObj())
+ {
+ aIPClient->GetIPObj()->SetAutoSave(FALSE);
+ aIPClient->DoDisconnect();
+ aIPClient.Clear();
+ }
+ }
+ }
+}
+
+//--------------------------------------------------------------------
+
+SfxScrollingMode SfxViewShell::GetScrollingMode() const
+{
+ return pImp->eScroll;
+}
+
+//--------------------------------------------------------------------
+
+void SfxViewShell::SetScrollingMode( SfxScrollingMode eMode )
+{
+ pImp->eScroll = eMode;
+}
+
+//--------------------------------------------------------------------
+
+SfxFrameSetDescriptor* SfxViewShell::GetFrameSet_Impl() const
+{
+ return pImp->pSetDescr;
+}
+
+//--------------------------------------------------------------------
+
+void SfxViewShell::SetFrameSet_Impl( SfxFrameSetDescriptor* pD )
+{
+// delete pImp->pSetDescr;
+ pImp->pSetDescr = pD;
+}
+
+//--------------------------------------------------------------------
+
+SfxObjectShell* SfxViewShell::GetObjectShell()
+{
+ return GetViewFrame()->GetObjectShell();
+}
+
+//--------------------------------------------------------------------
+
+const Size& SfxViewShell::GetMargin() const
+{
+ return pImp->aMargin;
+}
+
+//--------------------------------------------------------------------
+
+void SfxViewShell::SetMargin( const Size& rSize )
+{
+ // Der default-Margin wurde "geeicht" mit www.apple.com !!
+ Size aMargin = rSize;
+ if ( aMargin.Width() == -1 )
+ aMargin.Width() = DEFAULT_MARGIN_WIDTH;
+ if ( aMargin.Height() == -1 )
+ aMargin.Height() = DEFAULT_MARGIN_HEIGHT;
+
+ if ( aMargin != pImp->aMargin )
+ {
+ pImp->aMargin = aMargin;
+ MarginChanged();
+ }
+}
+
+//--------------------------------------------------------------------
+
+void SfxViewShell::MarginChanged()
+{
+}
+
+//--------------------------------------------------------------------
+
+BOOL SfxViewShell::IsShowView_Impl() const
+{
+ return pImp->bIsShowView;
+}
+
+//--------------------------------------------------------------------
+
+SfxFrame* SfxViewShell::GetSmartSelf( SfxFrame* pSelf, SfxMedium& rMedium )
+{
+ return pSelf;
+}
+
+//--------------------------------------------------------------------
+
+BOOL SfxViewShell::IsImplementedAsFrameset_Impl( ) const
+{
+ return pImp->bFrameSetImpl;
+}
+
+//------------------------------------------------------------------------
+
+void SfxViewShell::JumpToMark( const String& rMark )
+{
+ SfxStringItem aMarkItem( SID_JUMPTOMARK, rMark );
+ GetViewFrame()->GetDispatcher()->Execute(
+ SID_JUMPTOMARK,
+ SFX_CALLMODE_SYNCHRON|SFX_CALLMODE_RECORD,
+ &aMarkItem, 0L );
+}
+
+//------------------------------------------------------------------------
+
+#if !SFX_VIEWSH_INCLUDES_CLIENTSH_HXX
+
+void SfxViewShell::NewIPClient_Impl( SfxInPlaceClient *pIPClient )
+{
+ SvInPlaceClientMemberList *pClients = GetIPClientList_Impl(TRUE);
+ pClients->Insert(pIPClient);
+}
+
+void SfxViewShell::IPClientGone_Impl( SfxInPlaceClient *pIPClient )
+{
+ SvInPlaceClientMemberList *pClients = GetIPClientList_Impl(TRUE);
+ pClients->Remove(pIPClient);
+}
+
+SvInPlaceClientMemberList* SfxViewShell::GetIPClientList_Impl( BOOL bCreate ) const
+{
+ if ( !pIPClientList && bCreate )
+ ( (SfxViewShell*) this )->pIPClientList = new SvInPlaceClientMemberList;
+ return pIPClientList;
+}
+
+#endif
+
+SfxMenuBarManager* SfxViewShell::GetMenuBar_Impl( BOOL bPlugin )
+{
+ // F"ur das Menu wird auch ein Accelerator gebraucht
+ GetAccMgr_Impl();
+ SfxBindings& rBindings = GetViewFrame()->GetBindings();
+
+ // Wenn keine eigenen Bindings, dann kann MenuBarManager der Factory
+ // verwendet werden, der an den AppBindings h"angt
+// SfxMenuBarManager *pMgr = GetObjectShell()->GetFactory().GetMenuBar_Impl();
+// if ( pMgr && &rBindings == &pMgr->GetBindings() )
+// return pMgr;
+
+ if ( !pImp->pMenu )
+ {
+ sal_Bool bCheckPlugin = SfxApplication::IsPlugin();
+ if ( !pImp->pMenuBarResId )
+ {
+ const ResId* pId = bCheckPlugin ? GetObjectShell()->GetFactory().GetPluginMenuBarId()
+ : GetObjectShell()->GetFactory().GetMenuBarId();
+ if ( pId )
+ pImp->pMenuBarResId = new ResId( pId->GetId(), pId->GetResMgr() );
+ }
+
+ if ( pImp->pMenuBarResId && pImp->pMenuBarResId->GetId() )
+ pImp->pMenu = new SfxMenuBarManager( *pImp->pMenuBarResId, rBindings );
+ else
+ pImp->pMenu = new SfxMenuBarManager( rBindings, bCheckPlugin );
+ pImp->pMenu->Initialize( GetViewFrame()->ISA( SfxInPlaceFrame ) );
+ }
+
+ return pImp->pMenu;
+}
+
+SfxAcceleratorManager* SfxViewShell::GetAccMgr_Impl()
+{
+ return GetObjectShell()->GetFactory().GetAccMgr_Impl();
+}
+
+void SfxViewShell::SetMenuBar_Impl( const ResId& rId )
+{
+ if ( !pImp->pMenuBarResId ||
+ rId.GetId() != pImp->pMenuBarResId->GetId() ||
+ rId.GetResMgr() != pImp->pMenuBarResId->GetResMgr() )
+ {
+ DELETEZ( pImp->pMenuBarResId );
+
+ if ( pImp->pMenu )
+ {
+ SfxTopViewFrame* pTopView = PTR_CAST( SfxTopViewFrame, GetViewFrame()->GetTopViewFrame() );
+ SfxTopFrame *pTop = pTopView ? pTopView->GetTopFrame_Impl() : NULL;
+ if ( pTop )
+ {
+ Menu* pMenu = pImp->pMenu->GetMenu()->GetSVMenu();
+ if ( pMenu == pTop->GetMenuBar_Impl() )
+ pTop->SetMenuBar_Impl( 0 );
+ }
+
+ DELETEZ( pImp->pMenu );
+ }
+
+ if ( rId.GetId() )
+ pImp->pMenuBarResId = new ResId(rId);
+ }
+}
+
+void SfxViewShell::SetController( SfxBaseController* pController )
+{
+ pImp->pController = pController;
+ pImp->pController->acquire();
+ pImp->bControllerSet = TRUE;
+}
+
+Reference < XController > SfxViewShell::GetController()
+{
+ if ( !pImp->pController )
+ new SfxBaseController( this );
+ return pImp->pController;
+}
+
+