2000-09-18 16:07:07 +00:00
|
|
|
/*************************************************************************
|
|
|
|
*
|
|
|
|
* $RCSfile: objxtor.cxx,v $
|
|
|
|
*
|
2001-06-25 10:19:35 +00:00
|
|
|
* $Revision: 1.16 $
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2001-06-25 10:19:35 +00:00
|
|
|
* last change: $Author: ab $ $Date: 2001-06-25 11:16:51 $
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
|
|
|
* 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): _______________________________________
|
|
|
|
*
|
|
|
|
*
|
|
|
|
************************************************************************/
|
|
|
|
|
|
|
|
#include "arrdecl.hxx"
|
|
|
|
|
2001-02-21 14:57:01 +00:00
|
|
|
#ifndef _VOS_MUTEX_HXX_
|
|
|
|
#include <vos/mutex.hxx>
|
|
|
|
#endif
|
|
|
|
|
2001-02-09 11:41:01 +00:00
|
|
|
#ifndef _SV_RESARY_HXX
|
|
|
|
#include <vcl/resary.hxx>
|
|
|
|
#endif
|
2000-09-18 16:07:07 +00:00
|
|
|
#ifndef _MSGBOX_HXX //autogen
|
|
|
|
#include <vcl/msgbox.hxx>
|
|
|
|
#endif
|
|
|
|
#ifndef _WRKWIN_HXX //autogen
|
|
|
|
#include <vcl/wrkwin.hxx>
|
|
|
|
#endif
|
2001-02-21 14:57:01 +00:00
|
|
|
#ifndef _SV_SVAPP_HXX
|
|
|
|
#include <vcl/svapp.hxx>
|
|
|
|
#endif
|
2000-09-18 16:07:07 +00:00
|
|
|
#ifndef _SFXENUMITEM_HXX //autogen
|
|
|
|
#include <svtools/eitem.hxx>
|
|
|
|
#endif
|
|
|
|
#ifndef _RTTI_HXX //autogen
|
|
|
|
#include <tools/rtti.hxx>
|
|
|
|
#endif
|
|
|
|
#ifndef _SFXLSTNER_HXX //autogen
|
|
|
|
#include <svtools/lstner.hxx>
|
|
|
|
#endif
|
|
|
|
#ifndef _SB_SBSTAR_HXX //autogen
|
|
|
|
#include <basic/sbstar.hxx>
|
|
|
|
#endif
|
|
|
|
#ifndef _SFXSTRITEM_HXX
|
|
|
|
#include <svtools/stritem.hxx>
|
|
|
|
#endif
|
|
|
|
#pragma hdrstop
|
|
|
|
|
|
|
|
#ifndef _SBXCLASS_HXX //autogen
|
|
|
|
#include <svtools/sbx.hxx>
|
|
|
|
#endif
|
2001-06-11 09:02:02 +00:00
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
#include "objsh.hxx"
|
|
|
|
|
|
|
|
#ifndef _BASIC_SBUNO_HXX
|
|
|
|
#include <basic/sbuno.hxx>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef _SFXECODE_HXX
|
|
|
|
#include <svtools/sfxecode.hxx>
|
|
|
|
#endif
|
|
|
|
#ifndef _EHDL_HXX
|
|
|
|
#include <svtools/ehdl.hxx>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include <svtools/urihelper.hxx>
|
2000-11-08 13:25:58 +00:00
|
|
|
#include <svtools/pathoptions.hxx>
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
#include "picklist.hxx"
|
|
|
|
#include "docfac.hxx"
|
|
|
|
#include "docfile.hxx"
|
|
|
|
#include "event.hxx"
|
|
|
|
#include "cfgmgr.hxx"
|
|
|
|
#include "dispatch.hxx"
|
|
|
|
#include "viewsh.hxx"
|
|
|
|
#include "interno.hxx"
|
|
|
|
#include "sfxresid.hxx"
|
|
|
|
#include "objshimp.hxx"
|
|
|
|
#include "appbas.hxx"
|
|
|
|
#include "sfxtypes.hxx"
|
|
|
|
#include "evntconf.hxx"
|
|
|
|
#include "request.hxx"
|
|
|
|
#include "doc.hrc"
|
2001-02-09 11:41:01 +00:00
|
|
|
#include "sfxlocal.hrc"
|
2000-09-18 16:07:07 +00:00
|
|
|
#include "docinf.hxx"
|
|
|
|
#include "objuno.hxx"
|
|
|
|
#include "appdata.hxx"
|
|
|
|
#include "appuno.hxx"
|
|
|
|
#include "sfxsids.hrc"
|
|
|
|
#include "basmgr.hxx"
|
2001-03-28 10:01:45 +00:00
|
|
|
#include "dlgcont.hxx"
|
|
|
|
#include "scriptcont.hxx"
|
2001-06-11 09:02:02 +00:00
|
|
|
#include "imgmgr.hxx"
|
|
|
|
#include "tbxconf.hxx"
|
|
|
|
#include "accmgr.hxx"
|
2001-03-28 10:01:45 +00:00
|
|
|
|
|
|
|
using namespace ::com::sun::star::uno;
|
|
|
|
using namespace ::com::sun::star::script;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
#ifndef _UNO_MAPPING_HXX_
|
|
|
|
#include <uno/mapping.hxx>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
//====================================================================
|
|
|
|
|
|
|
|
DBG_NAME(SfxObjectShell);
|
|
|
|
|
|
|
|
#define DocumentInfo
|
|
|
|
#include "sfxslots.hxx"
|
|
|
|
|
|
|
|
extern AsynchronLink* pPendingCloser;
|
|
|
|
|
|
|
|
//=========================================================================
|
|
|
|
|
|
|
|
TYPEINIT1(SfxObjectShell, SfxShell);
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
|
|
|
SfxObjectShell_Impl::~SfxObjectShell_Impl()
|
|
|
|
{
|
|
|
|
if ( pPendingCloser == pCloser )
|
|
|
|
pPendingCloser = 0;
|
|
|
|
delete pCloser;
|
|
|
|
}
|
|
|
|
|
|
|
|
// initializes a document from a file-description
|
|
|
|
|
|
|
|
SfxObjectShell::SfxObjectShell
|
|
|
|
(
|
|
|
|
SfxObjectCreateMode eMode /* Zweck, zu dem die SfxObjectShell
|
|
|
|
erzeugt wird:
|
|
|
|
|
|
|
|
SFX_CREATE_MODE_EMBEDDED (default)
|
|
|
|
als SO-Server aus einem anderen
|
|
|
|
Dokument heraus
|
|
|
|
|
|
|
|
SFX_CREATE_MODE_STANDARD,
|
|
|
|
als normales, selbst"aendig ge"offnetes
|
|
|
|
Dokument
|
|
|
|
|
|
|
|
SFX_CREATE_MODE_PREVIEW
|
|
|
|
um ein Preview durchzuf"uhren,
|
|
|
|
ggf. werden weniger Daten ben"otigt
|
|
|
|
|
|
|
|
SFX_CREATE_MODE_ORGANIZER
|
|
|
|
um im Organizer dargestellt zu
|
|
|
|
werden, hier werden keine Inhalte
|
|
|
|
ben"otigt */
|
|
|
|
)
|
|
|
|
|
|
|
|
/* [Beschreibung]
|
|
|
|
|
|
|
|
Konstruktor der Klasse SfxObjectShell.
|
|
|
|
*/
|
|
|
|
|
|
|
|
: pImp( new SfxObjectShell_Impl ),
|
|
|
|
_pFactory( 0 ),
|
|
|
|
eCreateMode(eMode),
|
|
|
|
pStyleSheetPool(0),
|
|
|
|
pMedium(0)
|
|
|
|
{
|
|
|
|
DBG_CTOR(SfxObjectShell, 0);
|
|
|
|
|
|
|
|
bHasName = sal_False;
|
|
|
|
SfxShell::SetName( GetTitle() );
|
|
|
|
nViewNo = 0;
|
|
|
|
|
|
|
|
// Aggregation InPlaceObject+Automation
|
|
|
|
//(mba) AddInterface( SvDispatch::ClassFactory() );
|
|
|
|
|
|
|
|
SfxObjectShell *pThis = this;
|
|
|
|
SfxObjectShellArr_Impl &rArr = SFX_APP()->GetObjectShells_Impl();
|
|
|
|
rArr.C40_INSERT( SfxObjectShell, pThis, rArr.Count() );
|
|
|
|
pImp->bInList = sal_True;
|
|
|
|
pImp->nLoadedFlags = SFX_LOADED_ALL;
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
|
|
|
// virtual dtor of typical base-class SfxObjectShell
|
|
|
|
|
|
|
|
SfxObjectShell::~SfxObjectShell()
|
|
|
|
{
|
|
|
|
DBG_DTOR(SfxObjectShell, 0);
|
|
|
|
|
|
|
|
if ( IsEnableSetModified() )
|
|
|
|
EnableSetModified( sal_False );
|
|
|
|
|
|
|
|
// Niemals GetInPlaceObject() aufrufen, der Zugriff auf den
|
|
|
|
// Ableitungszweig SfxInternObject ist wegen eines Compiler Bugs nicht
|
|
|
|
// erlaubt
|
|
|
|
SfxObjectShell::Close();
|
2001-01-19 08:56:00 +00:00
|
|
|
if ( pImp->xModel.is() )
|
|
|
|
pImp->xModel->dispose();
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
DELETEX(pMedium);
|
|
|
|
DELETEX(pImp->pEventConfig);
|
2001-06-11 09:02:02 +00:00
|
|
|
DELETEX(pImp->pImageManager);
|
|
|
|
DELETEX(pImp->pTbxConfig);
|
2000-09-18 16:07:07 +00:00
|
|
|
DELETEX(pImp->pCfgMgr);
|
2001-06-11 09:02:02 +00:00
|
|
|
DELETEX(pImp->pReloadTimer );
|
|
|
|
DELETEX(pImp->pAccMgr);
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
SfxApplication *pSfxApp = SFX_APP();
|
|
|
|
if ( USHRT_MAX != pImp->nVisualDocumentNumber )
|
|
|
|
pSfxApp->ReleaseIndex(pImp->nVisualDocumentNumber);
|
|
|
|
|
|
|
|
// Basic-Manager zerst"oren
|
|
|
|
if ( pImp->pBasicMgr )
|
|
|
|
DELETEX(pImp->pBasicMgr);
|
2001-03-28 10:01:45 +00:00
|
|
|
if( pImp->pBasicLibContainer )
|
2001-05-11 12:39:00 +00:00
|
|
|
{
|
|
|
|
pImp->pBasicLibContainer->releaseEventSource();
|
2001-03-28 10:01:45 +00:00
|
|
|
pImp->pBasicLibContainer->release();
|
2001-05-11 12:39:00 +00:00
|
|
|
}
|
2001-03-28 10:01:45 +00:00
|
|
|
if( pImp->pDialogLibContainer )
|
2001-05-11 12:39:00 +00:00
|
|
|
{
|
|
|
|
pImp->pDialogLibContainer->releaseEventSource();
|
2001-03-28 10:01:45 +00:00
|
|
|
pImp->pDialogLibContainer->release();
|
2001-05-11 12:39:00 +00:00
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if ( pSfxApp->GetDdeService() )
|
|
|
|
pSfxApp->RemoveDdeTopic( this );
|
|
|
|
|
|
|
|
delete pImp->pDocInfo;
|
|
|
|
if ( pImp->xModel.is() )
|
|
|
|
pImp->xModel = ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel > ();
|
|
|
|
|
|
|
|
delete pImp;
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
|
|
|
SfxObjectFactory& SfxObjectShell::GetFactory() const
|
|
|
|
{
|
|
|
|
return *_pFactory;
|
|
|
|
}
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
|
|
|
void SfxObjectShell::ViewAssigned()
|
|
|
|
|
|
|
|
/* [Beschreibung]
|
|
|
|
|
|
|
|
Diese Methode wird gerufen, wenn eine ::com::sun::star::sdbcx::View zugewiesen wird.
|
|
|
|
*/
|
|
|
|
|
|
|
|
{
|
|
|
|
// Spaetestens jetzt die Factory initialisieren (wegen HelpFileName)
|
|
|
|
GetFactory().DoInitFactory();
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
// closes the Object and all its views
|
|
|
|
|
|
|
|
sal_Bool SfxObjectShell::Close()
|
|
|
|
{
|
|
|
|
{DBG_CHKTHIS(SfxObjectShell, 0);}
|
|
|
|
if ( !pImp->bClosing )
|
|
|
|
{
|
|
|
|
// falls noch ein Progress l"auft, nicht schlie\sen
|
|
|
|
if ( GetProgress() )
|
|
|
|
return sal_False;
|
|
|
|
|
|
|
|
// aus Document-Liste austragen
|
|
|
|
SfxApplication *pSfxApp = SFX_APP();
|
|
|
|
SfxObjectShellArr_Impl &rDocs = pSfxApp->GetObjectShells_Impl();
|
|
|
|
const SfxObjectShell *pThis = this;
|
|
|
|
sal_uInt16 nPos = rDocs.GetPos(pThis);
|
|
|
|
if ( nPos < rDocs.Count() )
|
|
|
|
rDocs.Remove( nPos );
|
|
|
|
pImp->bInList = sal_False;
|
|
|
|
|
|
|
|
// Broadcasten (w"ahrend dessen festhalten)
|
|
|
|
pImp->bClosing = sal_True;
|
|
|
|
SfxObjectShellRef aRef(this);
|
|
|
|
/*
|
2001-03-09 16:55:57 +00:00
|
|
|
// Ist leider zu sp"at, da kaum noch Macros laufen, wenn keine View
|
2000-09-18 16:07:07 +00:00
|
|
|
// mehr da ist!
|
|
|
|
if ( _pFactory && _pFactory->GetFlags() & SFXOBJECTSHELL_HASOPENDOC )
|
|
|
|
// Event nur bei echten Dokumenten
|
|
|
|
pSfxApp->NotifyEvent( SfxEventHint(SFX_EVENT_CLOSEDOC, this) );
|
|
|
|
*/
|
2001-03-09 16:55:57 +00:00
|
|
|
Broadcast( SfxSimpleHint(SFX_HINT_DEINITIALIZING) );
|
2000-09-18 16:07:07 +00:00
|
|
|
//pImp->bClosing = sal_False;
|
|
|
|
}
|
|
|
|
|
|
|
|
return sal_True;
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
|
|
|
// returns a pointer the first SfxDocument of specified type
|
|
|
|
|
|
|
|
SfxObjectShell* SfxObjectShell::GetFirst
|
|
|
|
(
|
|
|
|
const TypeId* pType ,
|
|
|
|
sal_Bool bOnlyVisible
|
|
|
|
)
|
|
|
|
{
|
|
|
|
SfxObjectShellArr_Impl &rDocs = SFX_APP()->GetObjectShells_Impl();
|
|
|
|
|
|
|
|
// seach for a SfxDocument of the specified type
|
|
|
|
for ( sal_uInt16 nPos = 0; nPos < rDocs.Count(); ++nPos )
|
|
|
|
{
|
|
|
|
SfxObjectShell* pSh = rDocs.GetObject( nPos );
|
|
|
|
if ( bOnlyVisible && pSh->IsPreview() && pSh->IsReadOnly() )
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if ( ( !pType || pSh->IsA(*pType) ) &&
|
|
|
|
( !bOnlyVisible || SfxViewFrame::GetFirst( pSh, 0, sal_True )))
|
|
|
|
return pSh;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
|
|
|
// returns a pointer to the next SfxDocument of specified type behind *pDoc
|
|
|
|
|
|
|
|
SfxObjectShell* SfxObjectShell::GetNext
|
|
|
|
(
|
|
|
|
const SfxObjectShell& rPrev,
|
|
|
|
const TypeId* pType,
|
|
|
|
sal_Bool bOnlyVisible
|
|
|
|
)
|
|
|
|
{
|
|
|
|
SfxObjectShellArr_Impl &rDocs = SFX_APP()->GetObjectShells_Impl();
|
|
|
|
|
|
|
|
// refind the specified predecessor
|
|
|
|
sal_uInt16 nPos;
|
|
|
|
for ( nPos = 0; nPos < rDocs.Count(); ++nPos )
|
|
|
|
if ( rDocs.GetObject(nPos) == &rPrev )
|
|
|
|
break;
|
|
|
|
|
|
|
|
// search for the next SfxDocument of the specified type
|
|
|
|
for ( ++nPos; nPos < rDocs.Count(); ++nPos )
|
|
|
|
{
|
|
|
|
SfxObjectShell* pSh = rDocs.GetObject( nPos );
|
|
|
|
if ( bOnlyVisible && pSh->IsPreview() && pSh->IsReadOnly() )
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if ( ( !pType || pSh->IsA(*pType) ) &&
|
|
|
|
( !bOnlyVisible || SfxViewFrame::GetFirst( pSh, 0, sal_True )))
|
|
|
|
return pSh;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
|
|
|
SfxObjectShell* SfxObjectShell::Current()
|
|
|
|
{
|
|
|
|
SfxViewFrame *pFrame = SFX_APP()->GetViewFrame();
|
|
|
|
return pFrame ? pFrame->GetObjectShell() : 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
|
|
|
|
sal_Bool SfxObjectShell::IsInPrepareClose() const
|
|
|
|
|
|
|
|
/* [Beschreibung]
|
|
|
|
|
|
|
|
Diese Methode liefert sal_True, falls gerade ein PrepareClose laeuft.
|
|
|
|
*/
|
|
|
|
|
|
|
|
{
|
|
|
|
return pImp->bInPrepareClose;
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------
|
|
|
|
|
|
|
|
struct BoolEnv_Impl
|
|
|
|
{
|
|
|
|
SfxObjectShell_Impl* pImp;
|
|
|
|
BoolEnv_Impl( SfxObjectShell_Impl* pImpP) : pImp( pImpP )
|
|
|
|
{ pImpP->bInPrepareClose = sal_True; }
|
|
|
|
~BoolEnv_Impl() { pImp->bInPrepareClose = sal_False; }
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
sal_uInt16 SfxObjectShell::PrepareClose
|
|
|
|
(
|
|
|
|
sal_Bool bUI, // sal_True: Dialoge etc. erlaubt, sal_False: silent-mode
|
|
|
|
sal_Bool bForBrowsing
|
|
|
|
)
|
|
|
|
{
|
|
|
|
if( pImp->bInPrepareClose || pImp->bPreparedForClose )
|
|
|
|
return sal_True;
|
|
|
|
BoolEnv_Impl aBoolEnv( pImp );
|
|
|
|
|
|
|
|
// DocModalDialog?
|
|
|
|
if ( IsInModalMode() )
|
|
|
|
return sal_False;
|
|
|
|
|
|
|
|
SfxViewFrame* pFirst = SfxViewFrame::GetFirst( this );
|
|
|
|
if( pFirst && !pFirst->GetFrame()->PrepareClose_Impl( bUI, bForBrowsing ) )
|
|
|
|
return sal_False;
|
|
|
|
|
|
|
|
// prepare views for closing
|
|
|
|
for ( SfxViewFrame* pFrm = SfxViewFrame::GetFirst(
|
|
|
|
this, TYPE(SfxViewFrame));
|
|
|
|
pFrm; pFrm = SfxViewFrame::GetNext( *pFrm, this ) )
|
|
|
|
{
|
|
|
|
DBG_ASSERT(pFrm->GetViewShell(),"KeineShell");
|
|
|
|
if ( pFrm->GetViewShell() )
|
|
|
|
{
|
|
|
|
sal_uInt16 nRet = pFrm->GetViewShell()->PrepareClose( bUI, bForBrowsing );
|
|
|
|
if ( nRet != sal_True )
|
|
|
|
return nRet;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if( GetInPlaceObject() && GetInPlaceObject()->GetClient())
|
|
|
|
{
|
|
|
|
pImp->bPreparedForClose = sal_True;
|
|
|
|
return sal_True;
|
|
|
|
}
|
|
|
|
|
|
|
|
// ggf. nachfragen, ob gespeichert werden soll
|
|
|
|
// nur fuer in sichtbaren Fenstern dargestellte Dokumente fragen
|
|
|
|
SfxViewFrame *pFrame = SfxObjectShell::Current() == this
|
|
|
|
? SfxViewFrame::Current() : SfxViewFrame::GetFirst( this );
|
|
|
|
while ( pFrame && (pFrame->GetFrameType() & SFXFRAME_SERVER ) )
|
|
|
|
pFrame = SfxViewFrame::GetNext( *pFrame, this );
|
|
|
|
|
|
|
|
SfxApplication *pSfxApp = SFX_APP();
|
|
|
|
pSfxApp->NotifyEvent( SfxEventHint(SFX_EVENT_PREPARECLOSEDOC, this) );
|
|
|
|
sal_Bool bClose = sal_False;
|
|
|
|
if ( bUI && IsModified() )
|
|
|
|
{
|
|
|
|
if ( pFrame )
|
|
|
|
{
|
|
|
|
// minimierte restoren
|
|
|
|
SfxFrame* pTop = pFrame->GetTopFrame();
|
|
|
|
pSfxApp->SetViewFrame( pTop->GetCurrentViewFrame() );
|
|
|
|
pFrame->GetFrame()->Appear();
|
|
|
|
|
|
|
|
// fragen, ob gespeichert werden soll
|
|
|
|
String aText( SfxResId( STR_QUERY_SAVE_DOCUMENT ) );
|
|
|
|
aText.SearchAndReplace( DEFINE_CONST_UNICODE( "$(DOC)" ),
|
|
|
|
GetTitle( SFX_TITLE_PICKLIST ) );
|
|
|
|
/*HACK for plugin::destroy()*/
|
|
|
|
// Don't show SAVE dialog in plugin mode! We save our document in every way.
|
|
|
|
short nRet = RET_YES;
|
|
|
|
if( SfxApplication::IsPlugin() == sal_False )
|
|
|
|
{
|
|
|
|
QueryBox aQBox( &pFrame->GetWindow(), WB_YES_NO_CANCEL | WB_DEF_YES, aText );
|
|
|
|
aQBox.SetButtonText( BUTTONID_NO, SfxResId( STR_NOSAVEANDCLOSE ) );
|
|
|
|
aQBox.SetButtonText( BUTTONID_YES, SfxResId( STR_SAVEDOC ) );
|
|
|
|
//(mba)/task if ( bForBrowsing )
|
|
|
|
// aQBox.AddButton( String( SfxResId( RID_STR_NEW_TASK ) ), RET_NEWTASK, BUTTONDIALOG_DEFBUTTON | BUTTONDIALOG_FOCUSBUTTON );
|
|
|
|
nRet = aQBox.Execute();
|
|
|
|
}
|
|
|
|
/*HACK for plugin::destroy()*/
|
|
|
|
|
|
|
|
if ( RET_YES == nRet )
|
|
|
|
{
|
|
|
|
sal_Bool bVersion = GetDocInfo().IsSaveVersionOnClose();
|
|
|
|
|
|
|
|
// per Dispatcher speichern
|
|
|
|
const SfxPoolItem *pPoolItem;
|
|
|
|
if ( bVersion )
|
|
|
|
{
|
|
|
|
SfxStringItem aItem( SID_VERSION, String( SfxResId( STR_AUTOMATICVERSION ) ) );
|
|
|
|
SfxBoolItem aWarnItem( SID_FAIL_ON_WARNING, TRUE );
|
|
|
|
const SfxPoolItem* ppArgs[] = { &aItem, &aWarnItem, 0 };
|
2000-10-20 16:12:47 +00:00
|
|
|
pPoolItem = pFrame->GetBindings().ExecuteSynchron( SID_SAVEDOC, ppArgs );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
SfxBoolItem aWarnItem( SID_FAIL_ON_WARNING, TRUE );
|
|
|
|
const SfxPoolItem* ppArgs[] = { &aWarnItem, 0 };
|
2000-10-20 16:12:47 +00:00
|
|
|
pPoolItem = pFrame->GetBindings().ExecuteSynchron( SID_SAVEDOC, ppArgs );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
2000-10-20 16:12:47 +00:00
|
|
|
if ( !pPoolItem || ( pPoolItem->ISA(SfxBoolItem) && !( (const SfxBoolItem*) pPoolItem )->GetValue() ) )
|
2000-09-18 16:07:07 +00:00
|
|
|
return sal_False;
|
|
|
|
else
|
|
|
|
bClose = sal_True;
|
|
|
|
}
|
|
|
|
else if ( RET_CANCEL == nRet )
|
|
|
|
// abgebrochen
|
|
|
|
return sal_False;
|
|
|
|
else if ( RET_NEWTASK == nRet )
|
|
|
|
{
|
|
|
|
return RET_NEWTASK;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// Bei Nein nicht noch Informationlost
|
|
|
|
bClose = sal_True;
|
|
|
|
|
|
|
|
// nicht mehr aus Cache nachladen
|
|
|
|
MemCache_Impl &rCache = SfxPickList_Impl::Get()->GetMemCache();
|
|
|
|
rCache.RemoveObject( this );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// ggf. hinweisen, da\s unter Fremdformat gespeichert
|
|
|
|
if( pMedium )
|
|
|
|
{
|
|
|
|
SFX_ITEMSET_ARG( pMedium->GetItemSet(), pIgnoreInformationLost,
|
|
|
|
SfxBoolItem, SID_DOC_IGNOREINFORMATIONLOST, sal_False);
|
|
|
|
if( pIgnoreInformationLost && pIgnoreInformationLost->GetValue() )
|
|
|
|
bUI = sal_False;
|
|
|
|
}
|
|
|
|
if ( bUI && !bClose && IsInformationLost() )
|
|
|
|
{
|
|
|
|
// minimierte restoren
|
|
|
|
SfxFrame* pTop = pFrame->GetTopFrame();
|
|
|
|
pSfxApp->SetViewFrame( pTop->GetCurrentViewFrame() );
|
|
|
|
pFrame->GetFrame()->Appear();
|
|
|
|
QueryBox aBox( &pFrame->GetWindow(), SfxResId(MSG_CONFIRM_FILTER));
|
|
|
|
if ( RET_NO == aBox.Execute() )
|
|
|
|
return sal_False;
|
|
|
|
}
|
|
|
|
|
|
|
|
pImp->bPreparedForClose = sal_True;
|
|
|
|
return sal_True;
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
|
|
|
BasicManager* SfxObjectShell::GetBasicManager() const
|
|
|
|
{
|
|
|
|
return HasBasic() ? pImp->pBasicMgr : SFX_APP()->GetBasicManager();
|
|
|
|
}
|
|
|
|
|
|
|
|
sal_Bool SfxObjectShell::HasBasic() const
|
|
|
|
{
|
|
|
|
if ( !pImp->bBasicInitialized )
|
|
|
|
{
|
|
|
|
String aName( GetMedium()->GetName() );
|
|
|
|
((SfxObjectShell*)this)->InitBasicManager_Impl( GetStorage(), aName.Len() ? &aName : NULL );
|
|
|
|
}
|
|
|
|
return pImp->pBasicMgr != NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
2001-03-28 10:01:45 +00:00
|
|
|
Reference< XLibraryContainer > SfxObjectShell::GetDialogContainer()
|
|
|
|
{
|
|
|
|
Reference< XLibraryContainer > xRet
|
|
|
|
= static_cast< XLibraryContainer* >( pImp->pDialogLibContainer );
|
|
|
|
return xRet;
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
|
|
|
Reference< XLibraryContainer > SfxObjectShell::GetBasicContainer()
|
|
|
|
{
|
|
|
|
Reference< XLibraryContainer > xRet
|
|
|
|
= static_cast< XLibraryContainer* >( pImp->pBasicLibContainer );
|
|
|
|
return xRet;
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
StarBASIC* SfxObjectShell::GetBasic() const
|
|
|
|
{
|
|
|
|
return GetBasicManager()->GetLib(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
|
|
|
void SfxObjectShell::InitBasicManager_Impl
|
|
|
|
(
|
|
|
|
SvStorage* pStor /* Storage, aus dem das Dokument geladen wird
|
|
|
|
(aus <SvPersist::Load()>) bzw. 0, falls es
|
|
|
|
sich um ein neues Dokument handelt
|
|
|
|
(aus <SvPersist::InitNew()>). */
|
|
|
|
, const String* pName
|
|
|
|
)
|
|
|
|
/* [Beschreibung]
|
|
|
|
|
|
|
|
Erzeugt einen Dokument-BasicManager und l"adt diesen ggf. (pStor != 0)
|
|
|
|
aus dem Storage.
|
|
|
|
|
|
|
|
|
|
|
|
[Anmerkung]
|
|
|
|
|
|
|
|
Diese Methode mu"s aus den "Uberladungen von <SvPersist::Load()> (mit
|
|
|
|
dem pStor aus dem Parameter von Load()) sowie aus der "Uberladung
|
|
|
|
von <SvPersist::InitNew()> (mit pStor = 0) gerufen werden.
|
|
|
|
*/
|
|
|
|
|
|
|
|
{
|
|
|
|
StarBASIC *pAppBasic = SFX_APP()->GetBasic();
|
|
|
|
DBG_ASSERT( !pImp->bBasicInitialized && !pImp->pBasicMgr, "Lokaler BasicManager bereits vorhanden");
|
|
|
|
|
|
|
|
pImp->bBasicInitialized = TRUE;
|
2001-06-25 10:19:35 +00:00
|
|
|
BasicManager* pBasicManager;
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( pStor )
|
|
|
|
{
|
|
|
|
String aOldURL = INetURLObject::GetBaseURL();
|
|
|
|
String aNewURL;
|
|
|
|
if( HasName() )
|
|
|
|
aNewURL = GetMedium()->GetName();
|
|
|
|
else
|
|
|
|
{
|
|
|
|
aNewURL = GetDocInfo().GetTemplateFileName();
|
|
|
|
// Bei Templates keine ::com::sun::star::util::URL...
|
|
|
|
aNewURL = URIHelper::SmartRelToAbs( aNewURL );
|
|
|
|
}
|
|
|
|
INetURLObject::SetBaseURL( aNewURL );
|
|
|
|
|
|
|
|
// load BASIC-manager
|
|
|
|
SfxErrorContext aErrContext( ERRCTX_SFX_LOADBASIC, GetTitle() );
|
2000-11-08 13:25:58 +00:00
|
|
|
#if SUPD<613//MUSTINI
|
2000-09-18 16:07:07 +00:00
|
|
|
SfxIniManager *pIniMgr = SFX_APP()->GetIniManager();
|
|
|
|
String aAppBasicDir( pIniMgr->Get(SFX_KEY_BASIC_PATH) );
|
2000-11-08 13:25:58 +00:00
|
|
|
#else
|
|
|
|
String aAppBasicDir = SvtPathOptions().GetBasicPath();
|
|
|
|
#endif
|
2001-06-25 10:19:35 +00:00
|
|
|
pImp->pBasicMgr = pBasicManager = new BasicManager( *pStor, pAppBasic, &aAppBasicDir );
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( pImp->pBasicMgr->HasErrors() )
|
|
|
|
{
|
|
|
|
// handle errors
|
|
|
|
BasicError *pErr = pImp->pBasicMgr->GetFirstError();
|
|
|
|
while ( pErr )
|
|
|
|
{
|
|
|
|
// show message to user
|
|
|
|
if ( ERRCODE_BUTTON_CANCEL ==
|
|
|
|
ErrorHandler::HandleError( pErr->GetErrorId() ) )
|
|
|
|
{
|
|
|
|
// user wants to break loading of BASIC-manager
|
|
|
|
delete pImp->pBasicMgr;
|
|
|
|
pStor = 0;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
pErr = pImp->pBasicMgr->GetNextError();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
INetURLObject::SetBaseURL( aOldURL );
|
|
|
|
}
|
|
|
|
|
|
|
|
// not loaded?
|
|
|
|
if ( !pStor )
|
|
|
|
{
|
|
|
|
// create new BASIC-manager
|
|
|
|
StarBASIC *pBas = new StarBASIC(pAppBasic);
|
|
|
|
pBas->SetFlag( SBX_EXTSEARCH );
|
2001-06-25 10:19:35 +00:00
|
|
|
pImp->pBasicMgr = pBasicManager = new BasicManager( pBas );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
2001-06-12 14:58:06 +00:00
|
|
|
// Standard lib name
|
|
|
|
rtl::OUString aStdLibName( RTL_CONSTASCII_USTRINGPARAM( "Standard" ) );
|
|
|
|
|
2001-03-28 10:01:45 +00:00
|
|
|
// Basic container
|
|
|
|
SfxScriptLibraryContainer* pBasicCont = new SfxScriptLibraryContainer
|
2001-06-25 10:19:35 +00:00
|
|
|
( DEFINE_CONST_UNICODE( "StarBasic" ), pBasicManager, pStor );
|
2001-03-28 10:01:45 +00:00
|
|
|
pBasicCont->acquire(); // Hold via UNO
|
2001-06-12 09:41:53 +00:00
|
|
|
Reference< XLibraryContainer > xBasicCont = static_cast< XLibraryContainer* >( pBasicCont );
|
2001-06-12 14:58:06 +00:00
|
|
|
if ( xBasicCont.is() && !xBasicCont->hasByName( aStdLibName ) )
|
|
|
|
xBasicCont->createLibrary( aStdLibName ); // create Standard library
|
2001-03-28 10:01:45 +00:00
|
|
|
pImp->pBasicLibContainer = pBasicCont;
|
|
|
|
|
|
|
|
// Dialog container
|
|
|
|
SfxDialogLibraryContainer* pDialogCont = new SfxDialogLibraryContainer( pStor );
|
|
|
|
pDialogCont->acquire(); // Hold via UNO
|
2001-06-12 09:41:53 +00:00
|
|
|
Reference< XLibraryContainer > xDialogCont = static_cast< XLibraryContainer* >( pDialogCont );
|
2001-06-12 14:58:06 +00:00
|
|
|
if ( xDialogCont.is() && !xDialogCont->hasByName( aStdLibName ) )
|
|
|
|
xDialogCont->createLibrary( aStdLibName ); // create Standard library
|
2001-03-28 10:01:45 +00:00
|
|
|
pImp->pDialogLibContainer = pDialogCont;
|
|
|
|
|
|
|
|
BasicManagerImpl* pBasMgrImpl = new BasicManagerImpl();
|
2001-06-25 10:19:35 +00:00
|
|
|
pBasMgrImpl->xScriptCont = xBasicCont;
|
|
|
|
pBasMgrImpl->xDialogCont = xDialogCont;
|
|
|
|
pBasicManager->SetImpl( pBasMgrImpl );
|
2001-03-28 10:01:45 +00:00
|
|
|
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
// damit auch Dialoge etc. 'qualifiziert' angesprochen werden k"onnen
|
|
|
|
StarBASIC *pBas = pImp->pBasicMgr->GetLib(0);
|
|
|
|
// Initialize Uno
|
|
|
|
//pBas->setRoot( GetModel() );
|
|
|
|
sal_Bool bWasModified = pBas->IsModified();
|
|
|
|
pBas->SetParent( pAppBasic );
|
|
|
|
|
|
|
|
// Properties im Doc-BASIC
|
|
|
|
// ThisComponent
|
|
|
|
::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > xInterface ( GetModel(), ::com::sun::star::uno::UNO_QUERY );
|
|
|
|
::com::sun::star::uno::Any aComponent;
|
|
|
|
aComponent <<= xInterface;
|
|
|
|
SbxObjectRef xUnoObj = GetSbUnoObject( DEFINE_CONST_UNICODE("ThisComponent"), aComponent );
|
|
|
|
xUnoObj->SetFlag( SBX_DONTSTORE );
|
|
|
|
pBas->Insert( xUnoObj );
|
|
|
|
|
2001-03-28 10:01:45 +00:00
|
|
|
// Basic container
|
|
|
|
Any aBasicCont;
|
|
|
|
aBasicCont <<= xBasicCont;
|
|
|
|
xUnoObj = GetSbUnoObject( DEFINE_CONST_UNICODE("BasicLibraries"), aBasicCont );
|
|
|
|
pBas->Insert( xUnoObj );
|
|
|
|
|
|
|
|
// Dialog container
|
|
|
|
Any aDialogCont;
|
|
|
|
aDialogCont <<= xDialogCont;
|
2001-05-11 14:29:34 +00:00
|
|
|
xUnoObj = GetSbUnoObject( DEFINE_CONST_UNICODE("DialogLibraries"), aDialogCont );
|
2001-03-28 10:01:45 +00:00
|
|
|
pBas->Insert( xUnoObj );
|
|
|
|
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
// Modify-Flag wird bei MakeVariable gesetzt
|
|
|
|
pBas->SetModified( bWasModified );
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
#if 0 //(mba)
|
|
|
|
SotObjectRef SfxObjectShell::CreateAggObj( const SotFactory* pFact )
|
|
|
|
{
|
|
|
|
// SvDispatch?
|
|
|
|
SotFactory* pDispFact = SvDispatch::ClassFactory();
|
|
|
|
if( pFact == pDispFact )
|
|
|
|
return( (SfxShellObject*)GetSbxObject() );
|
|
|
|
|
|
|
|
// sonst unbekannte Aggregation
|
|
|
|
DBG_ERROR("unkekannte Factory");
|
|
|
|
SotObjectRef aSvObjectRef;
|
|
|
|
return aSvObjectRef;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
|
|
|
sal_uInt16 SfxObjectShell::Count()
|
|
|
|
{
|
|
|
|
return SFX_APP()->GetObjectShells_Impl().Count();
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
|
|
|
sal_Bool SfxObjectShell::DoClose()
|
|
|
|
{
|
|
|
|
return Close();
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
|
|
|
void SfxObjectShell::SetLastMark_Impl( const String &rMark )
|
|
|
|
{
|
|
|
|
pImp->aMark = rMark;
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
|
|
|
const String& SfxObjectShell::GetLastMark_Impl() const
|
|
|
|
{
|
|
|
|
return pImp->aMark;
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
|
|
|
SfxObjectShell* SfxObjectShell::GetObjectShell()
|
|
|
|
{
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
2001-02-09 11:41:01 +00:00
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
|
|
|
SEQUENCE< OUSTRING > SfxObjectShell::GetEventNames()
|
|
|
|
{
|
2001-02-21 14:57:01 +00:00
|
|
|
::vos::OGuard aGuard( Application::GetSolarMutex() );
|
|
|
|
|
2001-02-09 11:41:01 +00:00
|
|
|
ResStringArray aEventNames( SfxResId( EVENT_NAMES_ARY ) );
|
|
|
|
USHORT nCount = aEventNames.Count();
|
|
|
|
|
|
|
|
SEQUENCE < OUSTRING > aSequence( nCount );
|
|
|
|
|
|
|
|
OUSTRING* pNames = aSequence.getArray();
|
|
|
|
|
|
|
|
for ( USHORT i=0; i<nCount; i++ )
|
|
|
|
{
|
|
|
|
pNames[i] = aEventNames.GetString( i );
|
|
|
|
}
|
|
|
|
|
|
|
|
return aSequence;
|
|
|
|
}
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
//--------------------------------------------------------------------
|
|
|
|
/* ASDBG
|
|
|
|
void SfxObjectShell::SetModel( SfxModel* pModel )
|
|
|
|
{
|
|
|
|
if ( pImp->xModel.is() )
|
|
|
|
DBG_WARNING( "Model already set!" );
|
|
|
|
pImp->xModel = pModel;
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
|
|
|
XModel* SfxObjectShell::GetModel()
|
|
|
|
{
|
|
|
|
return pImp->xModel;
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
|
|
|
void SfxObjectShell::SetModel( SfxBaseModel* pModel )
|
|
|
|
{
|
|
|
|
if ( pImp->xModel.is() )
|
|
|
|
DBG_WARNING( "Model already set!" );
|
|
|
|
|
|
|
|
pImp->xModel = pModel;
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
|
|
|
::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel > SfxObjectShell::GetModel()
|
|
|
|
{
|
|
|
|
return pImp->xModel;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SfxObjectShell::SetBaseModel( SfxBaseModel* pModel )
|
|
|
|
{
|
|
|
|
if ( pImp->xModel.is() )
|
|
|
|
DBG_WARNING( "Model already set!" );
|
|
|
|
|
|
|
|
pImp->xModel = pModel;
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
|
|
|
::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel > SfxObjectShell::GetBaseModel()
|
|
|
|
{
|
|
|
|
return pImp->xModel;
|
|
|
|
}
|
|
|
|
|