ooo-build r12774 - in trunk: . patches/dev300 patches/vba
- From: jiaojh svn gnome org
- To: svn-commits-list gnome org
- Subject: ooo-build r12774 - in trunk: . patches/dev300 patches/vba
- Date: Wed, 4 Jun 2008 03:21:18 +0000 (UTC)
Author: jiaojh
Date: Wed Jun 4 03:21:18 2008
New Revision: 12774
URL: http://svn.gnome.org/viewvc/ooo-build?rev=12774&view=rev
Log:
* patches/dev300/vba-workbook-worksheet-events-dev300.diff:
* patches/dev300/vba-workbook-worksheet-events-buildfix.diff:
update vba events patch, it uses a new uno object.
and remove the buildfix patch because of merged it into
vba-workbook-worksheet-events-dev300.diff.
Removed:
trunk/patches/dev300/vba-workbook-worksheet-events2.diff
trunk/patches/vba/vba-workbook-worksheet-events-buildfix.diff
Modified:
trunk/ChangeLog
trunk/patches/dev300/apply
trunk/patches/vba/vba-workbook-worksheet-events-dev300.diff
Modified: trunk/patches/dev300/apply
==============================================================================
--- trunk/patches/dev300/apply (original)
+++ trunk/patches/dev300/apply Wed Jun 4 03:21:18 2008
@@ -1428,8 +1428,9 @@
vba-support-export-palette.diff, i#68900
+#merged into vba-workbook-worksheet-events-dev300.diff
+#vba-workbook-worksheet-events-buildfix.diff,
vba-workbook-worksheet-events-dev300.diff
-vba-workbook-worksheet-events-buildfix.diff
# superceeded by vbaevens-service-sources.diff
# leave here for a while 'till we are sure all is ok
Modified: trunk/patches/vba/vba-workbook-worksheet-events-dev300.diff
==============================================================================
--- trunk/patches/vba/vba-workbook-worksheet-events-dev300.diff (original)
+++ trunk/patches/vba/vba-workbook-worksheet-events-dev300.diff Wed Jun 4 03:21:18 2008
@@ -1,811 +1,270 @@
-diff -urp --exclude=CVS --exclude=unxlngx6.pro backup/sc/inc/document.hxx sc/inc/document.hxx
---- backup/sc/inc/document.hxx 2008-04-30 18:58:37.000000000 +0800
-+++ sc/inc/document.hxx 2008-04-30 19:02:20.000000000 +0800
-@@ -132,6 +132,7 @@ class ScAutoNameCache;
- class ScTemporaryChartLock;
- class ScLookupCache;
- struct ScLookupCacheMapImpl;
-+class ScVbaEventsHelper;
-
- namespace com { namespace sun { namespace star {
- namespace lang {
-@@ -306,6 +307,8 @@ private:
-
- Timer aTrackTimer;
-
-+ ScVbaEventsHelper* pVbaEventsHelper;
-+
- public:
- ScTabOpList aTableOpList; // list of ScInterpreterTableOpParams currently in use
- ScInterpreterTableOpParams aLastTableOpParams; // remember last params
-@@ -1713,6 +1716,8 @@ public:
- void GetSortParam( ScSortParam& rParam, SCTAB nTab );
- void SetSortParam( ScSortParam& rParam, SCTAB nTab );
-
-+ ScVbaEventsHelper* GetVbaEventsHelper();
-+
- /** Should only be GRAM_PODF or GRAM_ODFF. */
- void SetStorageGrammar( ScGrammar::Grammar eGrammar );
- ScGrammar::Grammar GetStorageGrammar() const
-diff -urp --exclude=CVS --exclude=unxlngx6.pro backup/sc/source/core/data/documen2.cxx sc/source/core/data/documen2.cxx
---- backup/sc/source/core/data/documen2.cxx 2008-04-30 18:58:42.000000000 +0800
-+++ sc/source/core/data/documen2.cxx 2008-04-30 19:02:20.000000000 +0800
-@@ -93,6 +93,7 @@
- #include "listenercalls.hxx"
- #include "recursionhelper.hxx"
- #include "lookupcache.hxx"
-+#include "vbaeventshelper.hxx"
-
- // pImpl because including lookupcache.hxx in document.hxx isn't wanted, and
- // dtor is convenient.
-@@ -146,6 +147,7 @@ ScDocument::ScDocument( ScDocumentMode e
- pRecursionHelper( NULL ),
- pAutoNameCache( NULL ),
- pLookupCacheMapImpl( NULL ),
-+ pVbaEventsHelper( NULL ),
- nUnoObjectId( 0 ),
- nRangeOverflowType( 0 ),
- aCurTextWidthCalcPos(MAXCOL,0,0),
-@@ -434,6 +436,12 @@ ScDocument::~ScDocument()
- delete pOtherObjects;
- delete pRecursionHelper;
-
-+ if( pVbaEventsHelper )
-+ {
-+ delete pVbaEventsHelper;
-+ pVbaEventsHelper = NULL;
-+ }
-+
- DBG_ASSERT( !pAutoNameCache, "AutoNameCache still set in dtor" );
- }
-
-@@ -1857,3 +1865,13 @@ void ScDocument::RemoveLookupCache( ScLo
- EndListeningArea( pCache->getRange(), &rCache);
- }
- }
+--- /dev/null 2007-05-04 18:54:36.000000000 +0800
++++ offapi/com/sun/star/document/VbaEventId.idl 2008-06-03 14:25:19.000000000 +0800
+@@ -0,0 +1,83 @@
++/*************************************************************************
++ *
++ * OpenOffice.org - a multi-platform office productivity suite
++ *
++ * $RCSfile$
++ *
++ * $Revision$
++ *
++ * last change: $Author$ $Date$
++ *
++ * The Contents of this file are made available subject to
++ * the terms of GNU Lesser General Public License Version 2.1.
++ *
++ *
++ * GNU Lesser General Public License Version 2.1
++ * =============================================
++ * Copyright 2005 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
++ *
++ ************************************************************************/
++#ifndef __org_openoffice_vba_VbaEventId_idl__
++#define __org_openoffice_vba_VbaEventId_idl__
+
-+ScVbaEventsHelper* ScDocument::GetVbaEventsHelper()
-+{
-+ if( !pVbaEventsHelper )
-+ {
-+ pVbaEventsHelper = new ScVbaEventsHelper( this );
-+ }
++//=============================================================================
+
-+ return pVbaEventsHelper;
-+}
-diff -urp --exclude=CVS --exclude=unxlngx6.pro backup/sc/source/core/data/documen7.cxx sc/source/core/data/documen7.cxx
---- backup/sc/source/core/data/documen7.cxx 2008-04-30 18:58:42.000000000 +0800
-+++ sc/source/core/data/documen7.cxx 2008-04-30 19:02:20.000000000 +0800
-@@ -59,6 +59,9 @@
-
-
- #include "globstr.hrc"
-+#include "vbaeventshelper.hxx"
-+#include <algorithm>
-+#include <vector>
-
- extern const ScFormulaCell* pLastFormulaTreeTop; // cellform.cxx Err527 WorkAround
-
-@@ -449,6 +452,7 @@ void ScDocument::TrackFormulas( ULONG nH
- ScFormulaCell* pTrack;
- ScFormulaCell* pNext;
- pTrack = pFormulaTrack;
-+ ::std::vector<SCTAB> aTabs;
- do
- {
- ScHint aHint( nHintId, pTrack->aPos, pTrack );
-@@ -458,6 +462,12 @@ void ScDocument::TrackFormulas( ULONG nH
- // Repaint fuer bedingte Formate mit relativen Referenzen:
- if ( pCondFormList )
- pCondFormList->SourceChanged( pTrack->aPos );
-+ ::std::vector<SCTAB>::iterator result;
-+ result = ::std::find( aTabs.begin(), aTabs.end(), pTrack->aPos.Tab() );
-+ if( result == aTabs.end() )
-+ {
-+ aTabs.push_back( pTrack->aPos.Tab() );
-+ }
- pTrack = pTrack->GetNextTrack();
- } while ( pTrack );
- pTrack = pFormulaTrack;
-@@ -480,6 +490,14 @@ void ScDocument::TrackFormulas( ULONG nH
- else
- SetForcedFormulaPending( TRUE );
- }
++module com { module sun { module star { module document {
++//=============================================================================
+
-+ ::std::vector<SCTAB>::iterator iter;
-+ for( iter = aTabs.begin(); iter != aTabs.end(); iter++ )
-+ {
-+ SCTAB nTab = *iter;
-+ uno::Sequence< uno::Any > aArgs;
-+ GetVbaEventsHelper()->executeSheetMacro( SC_VBAEVENT_SHEET_CALCULATE, nTab, aArgs );
-+ }
- }
- DBG_ASSERT( nFormulaTrackCount==0, "TrackFormulas: nFormulaTrackCount!=0" );
- }
-diff -urp --exclude=CVS --exclude=unxlngx6.pro backup/sc/source/core/tool/makefile.mk sc/source/core/tool/makefile.mk
---- backup/sc/source/core/tool/makefile.mk 2008-04-30 18:58:42.000000000 +0800
-+++ sc/source/core/tool/makefile.mk 2008-04-30 19:02:20.000000000 +0800
-@@ -110,7 +110,8 @@ SLOFILES = \
- $(SLO)$/unitconv.obj \
- $(SLO)$/userlist.obj \
- $(SLO)$/viewopti.obj \
-- $(SLO)$/zforauto.obj
-+ $(SLO)$/zforauto.obj \
-+ $(SLO)$/vbaeventshelper.obj
-
- EXCEPTIONSFILES= \
- $(SLO)$/addincol.obj \
-@@ -126,6 +127,7 @@ EXCEPTIONSFILES= \
- $(SLO)$/interpr5.obj \
- $(SLO)$/lookupcache.obj \
- $(SLO)$/prnsave.obj \
-+ $(SLO)$/vbaeventshelper.obj \
- $(SLO)$/token.obj
-
- # [kh] POWERPC compiler problem
-diff -urp --exclude=CVS --exclude=unxlngx6.pro backup/sc/source/ui/docshell/docsh.cxx sc/source/ui/docshell/docsh.cxx
---- backup/sc/source/ui/docshell/docsh.cxx 2008-04-30 18:58:42.000000000 +0800
-+++ sc/source/ui/docshell/docsh.cxx 2008-04-30 19:30:43.000000000 +0800
-@@ -28,6 +28,8 @@
- *
- ************************************************************************/
-
-+#define BEFORE 0
-+#define AFTER 1
- // MARKER(update_precomp.py): autogen include statement, do not remove
- #include "precompiled_sc.hxx"
- // System - Includes -----------------------------------------------------
-@@ -131,6 +133,9 @@
- #include <rtl/logfile.hxx>
-
- #include <comphelper/processfactory.hxx>
-+#include "uiitems.hxx"
-+#include "vbaeventshelper.hxx"
-+#include "cellsuno.hxx"
-
- using namespace com::sun::star;
-
-@@ -672,7 +677,6 @@ BOOL ScDocShell::SaveXML( SfxMedium* pSa
- BOOL __EXPORT ScDocShell::Load( SfxMedium& rMedium )
- {
- RTL_LOGFILE_CONTEXT_AUTHOR ( aLog, "sc", "nn93723", "ScDocShell::Load" );
--
- ScRefreshTimerProtector( aDocument.GetRefreshTimerControlAddress() );
-
- // only the latin script language is loaded
-@@ -715,10 +719,43 @@ BOOL __EXPORT ScDocShell::Load( SfxMediu
- aDocument.InvalidateTableArea();
-
- bIsEmpty = FALSE;
++constants VbaEventId
++{
++ // Worksheet
++ const long VBAEVENT_WORKSHEET_ACTIVATE = 1;
++ const long VBAEVENT_WORKSHEET_BEFOREDOUBLECLICK = 2;
++ const long VBAEVENT_WORKSHEET_BEFORERIGHTCLICK = 3;
++ const long VBAEVENT_WORKSHEET_CALCULATE = 4;
++ const long VBAEVENT_WORKSHEET_CHANGE = 5;
++ const long VBAEVENT_WORKSHEET_DEACTIVATE = 6;
++ const long VBAEVENT_WORKSHEET_FOLLOWHYPERLINK = 7;
++ const long VBAEVENT_WORKSHEET_PIVOTTABLEUPDATE = 8;
++ const long VBAEVENT_WORKSHEET_SELECTIONCHANGE = 9;
++ // Workbook
++ const long VBAEVENT_WORKBOOK_ACTIVATE = 20;
++ const long VBAEVENT_WORKBOOK_DEACTIVATE = 21;
++ const long VBAEVENT_WORKBOOK_OPEN = 22;
++ const long VBAEVENT_WORKBOOK_AUTOOPEN = 23;
++ const long VBAEVENT_WORKBOOK_BEFORECLOSE = 24;
++ const long VBAEVENT_WORKBOOK_BEFOREPRINT = 25;
++ const long VBAEVENT_WORKBOOK_BEFORESAVE = 26;
++ const long VBAEVENT_WORKBOOK_NEWSHEET = 27;
++ const long VBAEVENT_WORKBOOK_WINDOWACTIVATE = 28;
++ const long VBAEVENT_WORKBOOK_WINDOWDEACTIVATE = 29;
++ const long VBAEVENT_WORKBOOK_WINDOWRESIZE = 30;
++ const long VBAEVENT_WORKBOOK_WINDOWCOLSE = 31;
++ const long VBAEVENT_WORKBOOK_CLOSE = 32;
++ // Workbook_sheet
++ const long VBAEVENT_WORKBOOK_SHEET_ACTIVATE = 51;
++ const long VBAEVENT_WORKBOOK_SHEET_BEFOREDOUBLECLICK = 52;
++ const long VBAEVENT_WORKBOOK_SHEET_BEFORERIGHTCLICK = 53;
++ const long VBAEVENT_WORKBOOK_SHEET_CALCULATE = 54;
++ const long VBAEVENT_WORKBOOK_SHEET_CHANGE = 55;
++ const long VBAEVENT_WORKBOOK_SHEET_DEACTIVATE = 56;
++ const long VBAEVENT_WORKBOOK_SHEET_FOLLOWHYPERLINK = 57;
++ const long VBAEVENT_WORKBOOK_SHEET_PIVOTTABLEUPDATE = 58;
++ const long VBAEVENT_WORKBOOK_SHEET_SELECTIONCHANGE = 59;
++};
+
-+ // Handler for open workbook event
-+ aDocument.GetVbaEventsHelper()->processDocMacro();
++}; }; }; };
+
- FinishedLoading( SFX_LOADED_MAINDOCUMENT | SFX_LOADED_IMAGES );
- return bRet;
- }
-
-+// For Vba Event
-+// status, 0 before, 1 done...
-+sal_Bool __EXPORT ScDocShell::processVbaEvents( USHORT nStatus, USHORT nSlotId )
-+{
-+ USHORT nId = nSlotId;
-+ switch( nId )
-+ {
-+ case SID_SAVEDOC:
-+ {
-+ if( nStatus == BEFORE )
-+ return aDocument.GetVbaEventsHelper()->processDocBeforeSaveMacro( false );
-+ break;
-+ }
-+ case SID_SAVEASDOC:
-+ {
-+ if( nStatus == BEFORE )
-+ return aDocument.GetVbaEventsHelper()->processDocBeforeSaveMacro( true );
-+ break;
-+ }
-+ case SID_PRINTDOC:
-+ case SID_PRINTDOCDIRECT:
-+ {
-+ if( nStatus == BEFORE )
-+ return aDocument.GetVbaEventsHelper()->processDocBeforePrintMacro();
-+ break;
-+ }
-+ }
-+ return sal_False;
-+}
-
- void __EXPORT ScDocShell::Notify( SfxBroadcaster&, const SfxHint& rHint )
- {
-@@ -754,6 +791,12 @@ void __EXPORT ScDocShell::Notify( SfxBro
- pAutoStyleList = new ScAutoStyleList(this);
- pAutoStyleList->AddInitial( aRange, aName1, nTimeout, aName2 );
- }
-+ else if (rHint.ISA(ScTablesHint) )
-+ {
-+ USHORT nId = ((ScTablesHint&)rHint).GetId();
-+ SCTAB nTab = ((ScTablesHint&)rHint).GetTab1();
-+ aDocument.GetVbaEventsHelper()->processScTablesHint( nId, nTab );
-+ }
- else if ( rHint.ISA( SfxEventHint ) )
- {
- ULONG nEventId = ((SfxEventHint&)rHint).GetEventId();
-@@ -940,6 +983,13 @@ void __EXPORT ScDocShell::Notify( SfxBro
- }
- }
- break;
-+ case SFX_EVENT_ACTIVATEDOC:
-+ case SFX_EVENT_DEACTIVATEDOC:
-+ case SFX_EVENT_CLOSEDOC :
-+ case SFX_EVENT_CLOSEVIEW :
-+ case SFX_EVENT_OPENDOC:
-+ aDocument.GetVbaEventsHelper()->processSfxEventHint( (SfxEventHint&)rHint );
-+ break;
- default:
- {
- }
-@@ -1433,6 +1483,10 @@ BOOL __EXPORT ScDocShell::ConvertFrom( S
- if ( bSetRowHeights )
- UpdateAllRowHeights(); // with vdev or printer, depending on configuration
- }
++#endif
+--- /dev/null 2007-05-04 18:54:36.000000000 +0800
++++ offapi/com/sun/star/document/XVbaEventsHelper.idl 2008-06-03 14:25:19.000000000 +0800
+@@ -0,0 +1,54 @@
++/*************************************************************************
++ *
++ * OpenOffice.org - a multi-platform office productivity suite
++ *
++ * $RCSfile$
++ *
++ * $Revision$
++ *
++ * last change: $Author$ $Date$
++ *
++ * The Contents of this file are made available subject to
++ * the terms of GNU Lesser General Public License Version 2.1.
++ *
++ *
++ * GNU Lesser General Public License Version 2.1
++ * =============================================
++ * Copyright 2005 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
++ *
++ ************************************************************************/
++#ifndef __org_openoffice_vba_XVbaEventsHelper_idl__
++#define __org_openoffice_vba_XVbaEventsHelper_idl__
+
-+ // Handler for open workbook event
-+ aDocument.GetVbaEventsHelper()->processDocMacro();
++#ifndef __com_sun_star_uno_XInterface_idl__
++#include <com/sun/star/uno/XInterface.idl>
++#endif
++//=============================================================================
+
- FinishedLoading( SFX_LOADED_MAINDOCUMENT | SFX_LOADED_IMAGES );
-
- // #73762# invalidate eventually temporary table areas
-@@ -2209,7 +2263,6 @@ BOOL __EXPORT ScDocShell::SaveCompleted(
- return SfxObjectShell::SaveCompleted( xStor );
- }
-
--
- BOOL __EXPORT ScDocShell::DoSaveCompleted( SfxMedium * pNewStor )
- {
- BOOL bRet = SfxObjectShell::DoSaveCompleted( pNewStor );
-@@ -2246,6 +2299,11 @@ USHORT __EXPORT ScDocShell::PrepareClose
-
- DoEnterHandler();
-
-+ // start handler for possible veto from DocBefore_Close
-+ if ( !IsInPrepareClose() && aDocument.GetVbaEventsHelper()->processDocBeforeCloseMacro() )
-+ return sal_False;
-+ // end handler code
++module com { module sun { module star { module document {
++//=============================================================================
+
- USHORT nRet = SfxObjectShell::PrepareClose( bUI, bForBrowsing );
- if (nRet == TRUE) // TRUE = schliessen
- aDocument.DisableIdle(TRUE); // nicht mehr drin rumpfuschen !!!
-@@ -2455,6 +2513,42 @@ void ScDocShell::SetModified( BOOL bModi
- }
- }
-
-+void ScDocShell::PostContentChanged( const ScRange& rRange )
++interface XVbaEventsHelper
+{
-+// OSL_TRACE("ScDocShell::PostContentChanged. Changed Range Address: nTab1 = %d, nCol1 = %d, nRow1 = %d; nTab2 = %d, nCol2 = %d, nRow2 = %d;", rRange.aStart.Tab(), rRange.aStart.Col(), rRange.aStart.Row(), rRange.aEnd.Tab(), rRange.aEnd.Col(), rRange.aEnd.Row() );
++ // nTab -1 for workbook.
++ boolean ProcessCompatibleVbaEvent( [in] long VbaEvent, [in] sequence< any > aArgs );
++};
+
-+ ScRangeList aList;
-+ aList.Append(rRange);
-+ PostContentChanged(aList);
-+}
++}; }; }; };
+
-+void ScDocShell::PostContentChanged( const ScRangeList& rList )
-+{
-+#if 0
-+ String aStr;
-+ rList.Format(aStr, SCR_ABS, &aDocument, ScAddress::CONV_XL_A1);
-+ fprintf(stdout, "ScDocShell::PostContentChanged: range = '%s'\n",
-+ rtl::OUStringToOString(aStr, RTL_TEXTENCODING_UTF8).getStr());
+#endif
+--- /dev/null 2007-05-04 18:54:36.000000000 +0800
++++ offapi/com/sun/star/document/VbaEventsHelper.idl 2008-06-03 14:25:19.000000000 +0800
+@@ -0,0 +1,55 @@
++/*************************************************************************
++ *
++ * OpenOffice.org - a multi-platform office productivity suite
++ *
++ * $RCSfile$
++ *
++ * $Revision$
++ *
++ * last change: $Author$ $Date$
++ *
++ * The Contents of this file are made available subject to
++ * the terms of GNU Lesser General Public License Version 2.1.
++ *
++ *
++ * GNU Lesser General Public License Version 2.1
++ * =============================================
++ * Copyright 2005 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
++ *
++ ************************************************************************/
++#ifndef __org_openoffice_vba_VbaEventsHelper_idl__
++#define __org_openoffice_vba_VbaEventsHelper_idl__
+
-+ ScCellRangesBase* pObj = NULL;
-+ const ScRange& rRange = *(rList.GetObject(0));
-+ if( rList.Count() == 1 )
-+ {
-+ if (rRange.aStart == rRange.aEnd)
-+ pObj = new ScCellObj( this, rRange.aStart );
-+ else
-+ pObj = new ScCellRangeObj( this, rRange );
-+ }
-+ else
-+ pObj = new ScCellRangesObj( this, rList );
-+
-+ uno::Sequence< uno::Any > aArgs(1);
-+ aArgs[0] = uno::makeAny(uno::Reference<uno::XInterface>(static_cast<cppu::OWeakObject*>(pObj)));
-+
-+ SCTAB nTab = rRange.aStart.Tab();
-+ aDocument.GetVbaEventsHelper()->executeSheetMacro( SC_VBAEVENT_SHEET_CHANGE, nTab, aArgs );
-+}
-
- void ScDocShell::SetDocumentModified( BOOL bIsModified /* = TRUE */ )
- {
-diff -urp --exclude=CVS --exclude=unxlngx6.pro backup/sc/source/ui/inc/docsh.hxx sc/source/ui/inc/docsh.hxx
---- backup/sc/source/ui/inc/docsh.hxx 2008-04-30 18:58:38.000000000 +0800
-+++ sc/source/ui/inc/docsh.hxx 2008-04-30 19:10:47.000000000 +0800
-@@ -178,6 +178,7 @@ public:
- using SfxShell::Activate; // with BOOL bMDI
- using SfxShell::Deactivate; // with BOOL bMDI
- using SfxObjectShell::Print; // print styles
-+ virtual sal_Bool processVbaEvents( USHORT nStatus, USHORT nSlotId );
-
- virtual void Activate();
- virtual void Deactivate();
-@@ -326,6 +327,8 @@ public:
- void PostPaintExtras();
-
- void PostDataChanged();
-+ void PostContentChanged( const ScRange& rRange ); // for worsheet/workbook changed event
-+ void PostContentChanged( const ScRangeList& rList );
-
- void UpdatePaintExt( USHORT& rExtFlags, SCCOL nStartCol, SCROW nStartRow, SCTAB nStartTab,
- SCCOL nEndCol, SCROW nEndRow, SCTAB nEndTab );
-diff -urp --exclude=CVS --exclude=unxlngx6.pro backup/sc/source/ui/undo/undoblk3.cxx sc/source/ui/undo/undoblk3.cxx
---- backup/sc/source/ui/undo/undoblk3.cxx 2008-04-30 18:58:39.000000000 +0800
-+++ sc/source/ui/undo/undoblk3.cxx 2008-04-30 19:10:47.000000000 +0800
-@@ -112,6 +112,15 @@ ScUndoDeleteContents::ScUndoDeleteConten
- if ( !(aMarkData.IsMarked() || aMarkData.IsMultiMarked()) ) // keine Zelle markiert:
- aMarkData.SetMarkArea( aRange ); // Zelle unter Cursor markieren
-
-+ if (aMarkData.IsMarked() || aMarkData.IsMultiMarked())
-+ {
-+ ScRangeList aList;
-+ aMarkData.FillRangeListWithMarks(&aList, false);
-+ pDocShell->PostContentChanged(aList);
-+ }
-+ else
-+ pDocShell->PostContentChanged( aRange );
-+
- SetChangeTrack();
- }
-
-@@ -202,6 +211,15 @@ void ScUndoDeleteContents::DoChange( con
- if (pViewShell)
- pViewShell->CellContentChanged();
-
-+ if (aMarkData.IsMarked() || aMarkData.IsMultiMarked())
-+ {
-+ ScRangeList aList;
-+ aMarkData.FillRangeListWithMarks(&aList, false);
-+ pDocShell->PostContentChanged(aList);
-+ }
-+ else
-+ pDocShell->PostContentChanged( aRange );
++#ifndef __com_sun_star_uno_XInterface_idl__
++#include <com/sun/star/uno/XInterface.idl>
++#endif
++#include <com/sun/star/frame/XModel.idl>
++#include <com/sun/star/document/XVbaEventsHelper.idl>
++//=============================================================================
+
- ShowTable( aRange );
- }
-
-diff -urp --exclude=CVS --exclude=unxlngx6.pro backup/sc/source/ui/undo/undoblk.cxx sc/source/ui/undo/undoblk.cxx
---- backup/sc/source/ui/undo/undoblk.cxx 2008-04-30 18:58:39.000000000 +0800
-+++ sc/source/ui/undo/undoblk.cxx 2008-04-30 19:10:47.000000000 +0800
-@@ -124,6 +124,7 @@ ScUndoInsertCells::ScUndoInsertCells( Sc
- aEffRange.aEnd.SetRow(MAXROW);
- }
-
-+ pDocShell->PostContentChanged( aEffRange );
- SetChangeTrack();
- }
-
-@@ -259,6 +260,7 @@ void ScUndoInsertCells::DoChange( const
- if (pViewShell)
- pViewShell->CellContentChanged();
-
-+ pDocShell->PostContentChanged( aEffRange );
- ShowTable( aEffRange.aStart.Tab() );
- }
-
-@@ -332,6 +334,8 @@ ScUndoDeleteCells::ScUndoDeleteCells( Sc
- aEffRange.aEnd.SetRow(MAXROW);
- }
-
-+ pDocShell->PostContentChanged( aEffRange );
++module com { module sun { module star { module document {
++//=============================================================================
+
- SetChangeTrack();
- }
-
-@@ -464,6 +468,7 @@ void ScUndoDeleteCells::DoChange( const
-
- pDocShell->PostDataChanged();
- // CellContentChanged kommt mit der Markierung
-+ pDocShell->PostContentChanged( aWorkRange );
-
- ShowTable( aEffRange.aStart.Tab() );
- }
-@@ -713,6 +718,7 @@ ScUndoCut::ScUndoCut( ScDocShell* pNewDo
- pUndoDoc( pNewUndoDoc ),
- aExtendedRange( aRange )
- {
-+ pDocShell->PostContentChanged( aExtendedRange );
- SetChangeTrack();
- }
-
-@@ -771,6 +777,7 @@ void ScUndoCut::DoChange( const BOOL bUn
- pDocShell->PostDataChanged();
- if (pViewShell)
- pViewShell->CellContentChanged();
-+ pDocShell->PostContentChanged( aExtendedRange );
- }
-
- void __EXPORT ScUndoCut::Undo()
-@@ -837,6 +844,7 @@ ScUndoPaste::ScUndoPaste( ScDocShell* pN
-
- if ( pOptions )
- aPasteOptions = *pOptions; // used only for Repeat
-+ pDocShell->PostContentChanged( aBlockRange );
-
- SetChangeTrack();
- }
-@@ -1012,6 +1020,7 @@ void ScUndoPaste::DoChange( const BOOL b
- pDocShell->PostDataChanged();
- if (pViewShell)
- pViewShell->CellContentChanged();
-+ pDocShell->PostContentChanged( aDrawRange );
- }
-
- void __EXPORT ScUndoPaste::Undo()
-diff -urp --exclude=CVS --exclude=unxlngx6.pro backup/sc/source/ui/undo/undocell.cxx sc/source/ui/undo/undocell.cxx
---- backup/sc/source/ui/undo/undocell.cxx 2008-04-30 18:58:39.000000000 +0800
-+++ sc/source/ui/undo/undocell.cxx 2008-04-30 19:10:47.000000000 +0800
-@@ -213,6 +213,7 @@ ScUndoEnterData::ScUndoEnterData( ScDocS
- nTab( nNewTab ),
- nCount( nNewCount )
- {
-+ pDocShell->PostContentChanged( ScRange( ScAddress( nCol, nRow, nTab ) ) );
- SetChangeTrack();
- }
-
-@@ -249,6 +250,7 @@ void ScUndoEnterData::DoChange() const
- pViewShell->MoveCursorAbs( nCol, nRow, SC_FOLLOW_JUMP, FALSE, FALSE );
- }
-
-+ pDocShell->PostContentChanged( ScRange( ScAddress( nCol, nRow, nTab ) ) );
- pDocShell->PostDataChanged();
- }
-
-@@ -370,6 +372,7 @@ ScUndoEnterValue::ScUndoEnterValue( ScDo
- nValue ( nVal ),
- bNeedHeight ( bHeight )
- {
-+ pDocShell->PostContentChanged( ScRange( aPos ) );
- SetChangeTrack();
- }
-
-@@ -420,6 +423,8 @@ void __EXPORT ScUndoEnterValue::Undo()
-
- pDocShell->PostPaintCell( aPos.Col(), aPos.Row(), aPos.Tab() );
-
-+ pDocShell->PostContentChanged( ScRange( aPos ) );
++service VbaEventsHelper : XVbaEventsHelper
++{
++ createVbaEventsHelper( [in] ::com::sun::star::frame::XModel xModel );
++};
+
- ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack();
- if ( pChangeTrack )
- pChangeTrack->Undo( nEndChangeAction, nEndChangeAction );
-@@ -435,6 +440,8 @@ void __EXPORT ScUndoEnterValue::Redo()
- pDoc->SetValue( aPos.Col(), aPos.Row(), aPos.Tab(), nValue );
- pDocShell->PostPaintCell( aPos.Col(), aPos.Row(), aPos.Tab() );
-
-+ pDocShell->PostContentChanged( ScRange( aPos ) );
++}; }; }; };
+
- SetChangeTrack();
-
- EndRedo();
-@@ -464,6 +471,7 @@ ScUndoPutCell::ScUndoPutCell( ScDocShell
- pEnteredCell( pRedoCell ),
- bNeedHeight ( bHeight )
- {
-+ pDocShell->PostContentChanged( ScRange( aPos ) );
- SetChangeTrack();
- }
-
-@@ -516,6 +524,8 @@ void __EXPORT ScUndoPutCell::Undo()
-
- pDocShell->PostPaintCell( aPos.Col(), aPos.Row(), aPos.Tab() );
-
-+ pDocShell->PostContentChanged( ScRange( aPos ) );
++#endif
+--- /dev/null 2007-05-04 18:54:36.000000000 +0800
++++ offapi/com/sun/star/document/XDocumentEventCompatibleHelper.idl 2008-06-03 14:25:19.000000000 +0800
+@@ -0,0 +1,47 @@
++/*************************************************************************
++ *
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * Copyright 2008 by Sun Microsystems, Inc.
++ *
++ * OpenOffice.org - a multi-platform office productivity suite
++ *
++ * $RCSfile: XVbaEventHelper.idl,v $
++ * $Revision: 1.0 $
++ *
++ * This file is part of OpenOffice.org.
++ *
++ * OpenOffice.org is free software: you can redistribute it and/or modify
++ * it under the terms of the GNU Lesser General Public License version 3
++ * only, as published by the Free Software Foundation.
++ *
++ * OpenOffice.org 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 version 3 for more details
++ * (a copy is included in the LICENSE file that accompanied this code).
++ *
++ * You should have received a copy of the GNU Lesser General Public License
++ * version 3 along with OpenOffice.org. If not, see
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++#ifndef __com_sun_star_document_XDocumentEventCompatibleHelper_idl__
++#define __com_sun_star_document_XDocumentEventCompatibleHelper_idl__
+
- ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack();
- if ( pChangeTrack )
- pChangeTrack->Undo( nEndChangeAction, nEndChangeAction );
-@@ -546,6 +556,8 @@ void __EXPORT ScUndoPutCell::Redo()
-
- pDocShell->PostPaintCell( aPos.Col(), aPos.Row(), aPos.Tab() );
-
-+ pDocShell->PostContentChanged( ScRange( aPos ) );
++//=============================================================================
+
- SetChangeTrack();
-
- EndRedo();
-diff -urp --exclude=CVS --exclude=unxlngx6.pro backup/sc/source/ui/unoobj/viewuno.cxx sc/source/ui/unoobj/viewuno.cxx
---- backup/sc/source/ui/unoobj/viewuno.cxx 2008-04-30 18:58:41.000000000 +0800
-+++ sc/source/ui/unoobj/viewuno.cxx 2008-05-05 12:23:04.000000000 +0800
-@@ -71,6 +71,8 @@
- #include "gridwin.hxx"
- #include <com/sun/star/view/DocumentZoomType.hpp>
- #include "AccessibilityHints.hxx"
-+#include <com/sun/star/awt/MouseButton.hpp>
-+#include "vbaeventshelper.hxx"
-
- using namespace com::sun::star;
-
-@@ -480,7 +482,6 @@ ScTabViewObj::ScTabViewObj( ScTabViewShe
- aActivationListeners( 0 ),
- bDrawSelModeSet(sal_False)
- {
-- //! Listening oder so
- }
-
- ScTabViewObj::~ScTabViewObj()
-@@ -1206,36 +1207,64 @@ sal_Bool ScTabViewObj::MousePressed( con
- {
- sal_Bool bReturn(sal_False);
-
-- if (aMouseClickHandlers.Count())
-+ uno::Reference< uno::XInterface > xTarget = GetClickedObject(Point(e.X, e.Y));
++module com { module sun { module star { module document {
+
-+ if (xTarget.is())
- {
-- uno::Reference< uno::XInterface > xTarget = GetClickedObject(Point(e.X, e.Y));
-+ // Handle BeforeDoubleClick and BeforeRightClick events
-+ uno::Reference<table::XCell> xCell( xTarget, uno::UNO_QUERY );
-+ if( xCell.is() )
-+ {
-+ ScTabViewShell* pViewSh = GetViewShell();
-+ if ( pViewSh )
-+ {
-+ ScViewData* pViewData = pViewSh->GetViewData();
-+ if ( pViewData )
-+ {
-+ if( e.ClickCount == 2 || e.Buttons == ::com::sun::star::awt::MouseButton::RIGHT )
-+ {
-+ uno::Sequence< uno::Any > aArgs(2);
-+ sal_Bool bCancel = sal_False;
-+ aArgs[0] = getSelection();
-+ aArgs[1] <<= bCancel;
-+
-+ USHORT nEvent = SC_VBAEVENT_SHEET_BEFORERIGHTCLICK;
-+ if( e.ClickCount == 2 )
-+ nEvent = SC_VBAEVENT_SHEET_BEFOREDOUBLECLICK;
-
-- if (xTarget.is())
-- {
-- awt::EnhancedMouseEvent aMouseEvent;
-+ pViewData->GetDocument()->GetVbaEventsHelper()->executeSheetMacro( nEvent, pViewData->GetTabNo(), aArgs );
-
-- aMouseEvent.Buttons = e.Buttons;
-- aMouseEvent.X = e.X;
-- aMouseEvent.Y = e.Y;
-- aMouseEvent.ClickCount = e.ClickCount;
-- aMouseEvent.PopupTrigger = e.PopupTrigger;
-- aMouseEvent.Target = xTarget;
-+ // TODO... handle the cancel argument
-+ aArgs[1] >>= bCancel;
-+ }
-+ }
-+ }
-+ }
-+
-+ awt::EnhancedMouseEvent aMouseEvent;
-
-- for ( USHORT n=0; n<aMouseClickHandlers.Count(); n++ )
-+ aMouseEvent.Buttons = e.Buttons;
-+ aMouseEvent.X = e.X;
-+ aMouseEvent.Y = e.Y;
-+ aMouseEvent.ClickCount = e.ClickCount;
-+ aMouseEvent.PopupTrigger = e.PopupTrigger;
-+ aMouseEvent.Target = xTarget;
++//=============================================================================
++interface XDocumentEventCompatibleHelper
++{
++ boolean processCompatibleEvent( [in] short nStatus, [in] short nEventId );
++};
+
-+ for ( USHORT n=0; n<aMouseClickHandlers.Count(); n++ )
-+ {
-+ try
- {
-- try
-- {
-- if (!(*aMouseClickHandlers[n])->mousePressed( aMouseEvent ))
-- bReturn = sal_True;
-- }
-- catch ( uno::Exception& )
-- {
-- aMouseClickHandlers.DeleteAndDestroy(n);
-- --n; // because it will be increased again in the loop
-- }
-+ if (!(*aMouseClickHandlers[n])->mousePressed( aMouseEvent ))
-+ bReturn = sal_True;
-+ }
-+ catch ( uno::Exception& )
-+ {
-+ aMouseClickHandlers.DeleteAndDestroy(n);
-+ --n; // because it will be increased again in the loop
- }
- }
- }
++//=============================================================================
+
- return bReturn;
- }
-
-@@ -1709,6 +1738,18 @@ void SAL_CALL ScTabViewObj::removeSelect
-
- void ScTabViewObj::SelectionChanged()
- {
-+ ScTabViewShell* pViewSh = GetViewShell();
-+ if ( pViewSh )
-+ {
-+ ScViewData* pViewData = pViewSh->GetViewData();
-+ if ( pViewData )
-+ {
-+ uno::Sequence< uno::Any > aArgs(1);
-+ aArgs[0] = getSelection();
-+ pViewData->GetDocument()->GetVbaEventsHelper()->executeSheetMacro( SC_VBAEVENT_SHEET_SELECTIONCHANGE, pViewData->GetTabNo(), aArgs );
-+ }
-+ }
++}; }; }; };
+
- lang::EventObject aEvent;
- aEvent.Source.set(static_cast<cppu::OWeakObject*>(this));
- for ( USHORT n=0; n<aSelectionListeners.Count(); n++ )
-diff -urp --exclude=CVS --exclude=unxlngx6.pro backup/sc/source/ui/view/gridwin.cxx sc/source/ui/view/gridwin.cxx
---- backup/sc/source/ui/view/gridwin.cxx 2008-04-30 18:58:39.000000000 +0800
-+++ sc/source/ui/view/gridwin.cxx 2008-05-05 10:52:37.000000000 +0800
-@@ -149,6 +149,9 @@
- #include <svx/sdr/overlay/overlaymanager.hxx>
- #include <vcl/svapp.hxx>
-
-+#include "vbaeventshelper.hxx"
-+#include "cellsuno.hxx"
-+
- using namespace com::sun::star;
- using ::com::sun::star::uno::Sequence;
- using ::com::sun::star::uno::Any;
-@@ -398,6 +401,32 @@ void lcl_UnLockComment( SdrView* pView,
-
- }
-
-+sal_Bool lcl_GetHyperlinkCell(ScDocument* pDoc, SCCOL& rPosX, SCROW& rPosY, SCTAB nTab, ScBaseCell*& rpCell )
-+{
-+ BOOL bFound = FALSE;
-+ do
-+ {
-+ pDoc->GetCell( rPosX, rPosY, nTab, rpCell );
-+ if ( !rpCell || rpCell->GetCellType() == CELLTYPE_NOTE )
-+ {
-+ if ( rPosX <= 0 )
-+ return FALSE; // alles leer bis links
-+ else
-+ --rPosX; // weitersuchen
-+ }
-+ else if ( rpCell->GetCellType() == CELLTYPE_EDIT)
-+ bFound = TRUE;
-+ else if (rpCell->GetCellType() == CELLTYPE_FORMULA &&
-+ static_cast<ScFormulaCell*>(rpCell)->IsHyperLinkCell())
-+ bFound = TRUE;
-+ else
-+ return FALSE; // andere Zelle
-+ }
-+ while ( !bFound );
-+
-+ return bFound;
-+}
-+
- //==================================================================
-
- // WB_DIALOGCONTROL noetig fuer UNO-Controls
-@@ -1441,6 +1470,8 @@ void ScGridWindow::HandleMouseButtonDown
- SCCOL nOldColFBox = bWasFilterBox ? pFilterBox->GetCol() : 0;
- SCROW nOldRowFBox = bWasFilterBox ? pFilterBox->GetRow() : 0;
- #endif
-+#include "vbaeventshelper.hxx"
-+#include "cellsuno.hxx"
-
- ClickExtern(); // loescht FilterBox, wenn vorhanden
-
-@@ -2121,6 +2152,24 @@ void __EXPORT ScGridWindow::MouseButtonU
- {
- nMouseStatus = SC_GM_NONE; // keinen Doppelklick anfangen
- ScGlobal::OpenURL( aUrl, aTarget );
-+
-+ // fire worksheet_followhyperlink event
-+ Point aPos = rMEvt.GetPosPixel();
-+ SCsCOL nPosX;
-+ SCsROW nPosY;
-+ SCTAB nTab = pViewData->GetTabNo();
-+ pViewData->GetPosFromPixel( aPos.X(), aPos.Y(), eWhich, nPosX, nPosY );
-+ ScBaseCell* pCell = NULL;
-+
-+ BOOL bFound = lcl_GetHyperlinkCell( pDoc, nPosX, nPosY, nTab, pCell );
-+ if( bFound )
-+ {
-+ ScAddress aCellPos( nPosX, nPosY, nTab );
-+ ScCellObj* pObj = new ScCellObj( pViewData->GetDocShell(), aCellPos );
-+ uno::Sequence< uno::Any > aArgs(1);
-+ aArgs[0] = uno::makeAny(uno::Reference<uno::XInterface>(static_cast<cppu::OWeakObject*>(pObj)));
-+ pViewData->GetDocument()->GetVbaEventsHelper()->executeSheetMacro( SC_VBAEVENT_SHEET_FOLLOWHYPERLINK, pViewData->GetTabNo(), aArgs );
-+ }
- return;
- }
- }
-@@ -2440,13 +2489,13 @@ long ScGridWindow::PreNotify( NotifyEven
- if (xController.is())
- {
- ScTabViewObj* pImp = ScTabViewObj::getImplementation( xController );
-- if (pImp && pImp->IsMouseListening())
-+ if (pImp)
- {
- ::com::sun::star::awt::MouseEvent aEvent;
- lcl_InitMouseEvent( aEvent, *rNEvt.GetMouseEvent() );
- if ( rNEvt.GetWindow() )
- aEvent.Source = rNEvt.GetWindow()->GetComponentInterface();
-- if ( nType == EVENT_MOUSEBUTTONDOWN)
-+ if ( nType == EVENT_MOUSEBUTTONDOWN )
- pImp->MousePressed( aEvent );
- else
- pImp->MouseReleased( aEvent );
-@@ -4856,26 +4905,9 @@ BOOL ScGridWindow::GetEditUrlOrError( BO
- ScDocument* pDoc = pDocSh->GetDocument();
- ScBaseCell* pCell = NULL;
-
-- BOOL bFound = FALSE;
-- do
-- {
-- pDoc->GetCell( nPosX, nPosY, nTab, pCell );
-- if ( !pCell || pCell->GetCellType() == CELLTYPE_NOTE )
-- {
-- if ( nPosX <= 0 )
-- return FALSE; // alles leer bis links
-- else
-- --nPosX; // weitersuchen
-- }
-- else if ( pCell->GetCellType() == CELLTYPE_EDIT)
-- bFound = TRUE;
-- else if (pCell->GetCellType() == CELLTYPE_FORMULA &&
-- static_cast<ScFormulaCell*>(pCell)->IsHyperLinkCell())
-- bFound = TRUE;
-- else
-- return FALSE; // andere Zelle
-- }
-- while ( !bFound );
-+ BOOL bFound = lcl_GetHyperlinkCell( pDoc, nPosX, nPosY, nTab, pCell );
-+ if( !bFound )
-+ return FALSE;
-
- ScHideTextCursor aHideCursor( pViewData, eWhich ); // before GetEditArea (MapMode is changed)
-
-diff -urp --exclude=CVS --exclude=unxlngx6.pro backup/sc/source/ui/view/tabview3.cxx sc/source/ui/view/tabview3.cxx
---- backup/sc/source/ui/view/tabview3.cxx 2008-04-30 18:58:39.000000000 +0800
-+++ sc/source/ui/view/tabview3.cxx 2008-04-30 19:02:20.000000000 +0800
-@@ -80,6 +80,7 @@
- #include "AccessibilityHints.hxx"
- #include "rangeutl.hxx"
- #include "client.hxx"
-+#include "vbaeventshelper.hxx"
-
- #include <com/sun/star/chart2/data/HighlightedRange.hpp>
-
-@@ -1684,6 +1685,12 @@ void ScTabView::SetTabNo( SCTAB nTab, BO
- // nicht InputEnterHandler wegen Referenzeingabe !
-
- ScDocument* pDoc = aViewData.GetDocument();
-+ if( !bNew )
-+ {
-+ uno::Sequence< uno::Any > aArgs;
-+ pDoc->GetVbaEventsHelper()->executeSheetMacro( SC_VBAEVENT_SHEET_DEACTIVATE, aViewData.GetTabNo(), aArgs );
-+ }
-+
- pDoc->MakeTable( nTab );
-
- SCTAB nTabCount = pDoc->GetTableCount();
-@@ -1782,7 +1789,13 @@ void ScTabView::SetTabNo( SCTAB nTab, BO
- if ( pGridWin[i]->IsVisible() )
- pGridWin[i]->UpdateEditViewPos();
- }
--
-+
-+ if( !bNew )
-+ {
-+ uno::Sequence< uno::Any > aArgs;
-+ pDoc->GetVbaEventsHelper()->executeSheetMacro( SC_VBAEVENT_SHEET_ACTIVATE, aViewData.GetTabNo(), aArgs );
-+ }
-+
- TabChanged(); // DrawView
- aViewData.GetViewShell()->WindowChanged(); // falls das aktive Fenster anders ist
- if ( !bUnoRefDialog )
---- /dev/null 2007-09-22 03:12:45.000000000 +0800
-+++ sc/inc/vbaeventshelper.hxx 2008-05-05 10:49:36.000000000 +0800
-@@ -0,0 +1,96 @@
++#endif
+--- offapi/com/sun/star/document/makefile.mk.bak 2008-06-03 14:25:12.000000000 +0800
++++ offapi/com/sun/star/document/makefile.mk 2008-06-03 14:25:19.000000000 +0800
+@@ -109,6 +109,10 @@ IDLFILES=\
+ DocumentRevisionListPersistence.idl \
+ XDocumentLanguages.idl \
+ XCodeNameQuery.idl \
++ XDocumentEventCompatibleHelper.idl \
++ VbaEventId.idl \
++ XVbaEventsHelper.idl \
++ VbaEventsHelper.idl \
+
+
+ # ------------------------------------------------------------------
+--- /dev/null 2007-05-04 18:54:36.000000000 +0800
++++ sc/source/ui/vba/vbaeventshelper.hxx 2008-06-03 14:25:19.000000000 +0800
+@@ -0,0 +1,92 @@
+/*************************************************************************
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
@@ -848,63 +307,59 @@
+#include <cppuhelper/implbase1.hxx>
+#include <com/sun/star/container/XNameReplace.hpp>
+#include <com/sun/star/awt/XEnhancedMouseClickHandler.hpp>
++#include <com/sun/star/document/VbaEventId.hpp>
++#include <com/sun/star/document/XVbaEventsHelper.hpp>
++#include "vbahelper.hxx"
+
+using namespace com::sun::star;
+
-+#define SC_VBAEVENT_SHEET_START 10000
-+#define SC_VBAEVENT_SHEET_ACTIVATE SC_VBAEVENT_SHEET_START
-+#define SC_VBAEVENT_SHEET_BEFOREDOUBLECLICK SC_VBAEVENT_SHEET_START + 1
-+#define SC_VBAEVENT_SHEET_BEFORERIGHTCLICK SC_VBAEVENT_SHEET_START + 2
-+#define SC_VBAEVENT_SHEET_CALCULATE SC_VBAEVENT_SHEET_START + 3
-+#define SC_VBAEVENT_SHEET_CHANGE SC_VBAEVENT_SHEET_START + 4
-+#define SC_VBAEVENT_SHEET_DEACTIVATE SC_VBAEVENT_SHEET_START + 5
-+#define SC_VBAEVENT_SHEET_FOLLOWHYPERLINK SC_VBAEVENT_SHEET_START + 6
-+#define SC_VBAEVENT_SHEET_PIVOTTABLEUPDATE SC_VBAEVENT_SHEET_START + 7
-+#define SC_VBAEVENT_SHEET_SELECTIONCHANGE SC_VBAEVENT_SHEET_START + 8
++typedef ::cppu::WeakImplHelper1< com::sun::star::document::XVbaEventsHelper > VBAWorkbookEvent_BASE;
+
+//class ScTablesHint;
++class VbaWindowListener;
+class SfxEventHint;
-+class ScVbaEventsHelper
++class ImplVbaEventNameInfo;
++class ScVbaEventsHelper : public VBAWorkbookEvent_BASE
+{
+private:
+ ScDocument* pDoc;
++ css::uno::Reference< css::uno::XComponentContext > m_xContext;
++ VbaWindowListener* mpWindowListener;
++ sal_Bool mbOpened;
+
-+ String getWorkbookModuleName();
+ String getSheetModuleName( SCTAB nTab );
-+ sal_Bool addOpenDocEvent( const uno::Reference< container::XNameReplace >& xEvts, const String& sOpenMacro );
-+ String docMacroExists( SfxObjectShell* pShell, const String& sMod, const String& sMacro );
++ String workbookMacroExists( SfxObjectShell* pShell, const String& sMod, const String& sMacro );
+
+ uno::Any createWorkSheet( SfxObjectShell* pShell, SCTAB nTab );
+ uno::Any createRange( const uno::Any& aRange );
+ uno::Any createHyperlink( const uno::Any& rCell );
-+ void getSheetEventName( USHORT nEvent, String& rSheetScript, String& rWorkbookScript );
++ uno::Any createWindow( SfxObjectShell* pShell );
+ sal_Bool executeWorkBookMacro( SfxObjectShell* pShell, const String& sMacroName, uno::Sequence< uno::Any >& aArgs, uno::Any& aRet );
-+ sal_Bool processDocOpenMacro( SfxObjectShell* pShell );
-+ sal_Bool processDocActivateMacro( SfxObjectShell* pShell );
-+ sal_Bool processDocDeactivateMacro( SfxObjectShell* pShell );
-+ void processDocNewSheetMacro( SfxObjectShell* pShell, uno::Any aElement );
-+ uno::Any getVbaWindow( SfxObjectShell* pShell );
-+ sal_Bool addDocEvent( SfxObjectShell* pShell, const String& sEvt, const String& sOpenMacro );
-+ void processDocDeactivateMacroRun( SfxObjectShell* pShell );
++ sal_Bool processVbaEventWithCancel( const sal_Int32 nEventId );
++ sal_Bool processDocBeforeSaveMacro( sal_Bool bSaveAsUI );
++ void processVbaEventMacro_noreturn( const sal_Int32 nEventId );
++ void processVbaEventMacroWithArgs( const sal_Int32 nEventId, uno::Sequence< uno::Any >& rArgs );
++ void WorkbookWindowMacro( const sal_Int32 nHint );
++ SCTAB getTabFromArgs( const uno::Sequence< uno::Any > aArgs, const sal_Int32 nPos );
++protected:
++ rtl::OUString GetEventName( const sal_Int32 nId );
++ rtl::OUString getMacroPath( const sal_Int32 nEventId, const SCTAB nTab );
+
+public:
-+ ScVbaEventsHelper( ScDocument* pDocument ):pDoc( pDocument ){};
++ ScVbaEventsHelper( ScDocument* pDocument ):pDoc( pDocument ), mpWindowListener( NULL ), mbOpened( sal_False ){};
++ ScVbaEventsHelper( css::uno::Sequence< css::uno::Any > const& aArgs, css::uno::Reference< css::uno::XComponentContext > const& xContext );
++ ~ScVbaEventsHelper();
+ ScDocument* getDocument() { return pDoc; };
+ sal_Bool executeSheetMacro( USHORT nEvent, SCTAB nTab, uno::Sequence< uno::Any >& rArgs );
-+ sal_Bool processDocBeforeCloseMacro();
-+ sal_Bool processDocBeforePrintMacro();
-+ void processScTablesHint( USHORT nId, SCTAB nTab );
-+ void processWindowMacro( String sFuncName );
-+ void processSfxEventHint( const SfxEventHint& rHint );
-+ sal_Bool processDocBeforeSaveMacro( sal_Bool bSaveAsUI );
-+ sal_Bool processDocMacro();
++ // XVBAWorkbookEventHelper
++ virtual sal_Bool SAL_CALL ProcessCompatibleVbaEvent( sal_Int32 VbaEvent, const uno::Sequence< uno::Any >& aArgs ) throw (uno::RuntimeException);
+};
+
+#endif
+
---- /dev/null 2008-04-22 00:28:44.000000000 +0100
-+++ sc/source/core/tool/vbaeventshelper.cxx 2008-05-29 10:41:04.000000000 +0100
-@@ -0,0 +1,921 @@
+--- /dev/null 2007-05-04 18:54:36.000000000 +0800
++++ sc/source/ui/vba/vbaeventshelper.cxx 2008-06-04 10:32:41.000000000 +0800
+@@ -0,0 +1,1059 @@
+/*************************************************************************
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
@@ -940,6 +395,7 @@
+ *
+ ************************************************************************/
+#include "vbaeventshelper.hxx"
++#include "helperdecl.hxx"
+#include <sfx2/objsh.hxx>
+#include <basic/basmgr.hxx>
+#include <basic/sbmod.hxx>
@@ -952,32 +408,38 @@
+#include <toolkit/unohlp.hxx>
+#include <comphelper/processfactory.hxx>
+#include <cppuhelper/implbase1.hxx>
-+#ifndef _COM_SUN_STAR_SHEET_XSHEETCELLRANGECONTAINER_HPP_
++#include <cppuhelper/implbase2.hxx>
+#include <com/sun/star/sheet/XSheetCellRangeContainer.hpp>
-+#endif
+#include <com/sun/star/document/XEventsSupplier.hpp>
-+#ifndef _COM_SUN_STAR_SHEET_XCELLRANGEREFERRER_HPP_
+#include <com/sun/star/sheet/XCellRangeReferrer.hpp>
-+#endif
+#include <com/sun/star/table/XCell.hpp>
+#include <com/sun/star/sheet/XSpreadsheetDocument.hpp>
+#include <com/sun/star/sheet/XSpreadsheet.hpp>
+#include <com/sun/star/container/XNamed.hpp>
+#include <com/sun/star/awt/XWindowListener.hpp>
+#include <com/sun/star/awt/WindowEvent.hpp>
++#include <com/sun/star/awt/XMouseListener.hpp>
++#include <com/sun/star/awt/MouseEvent.hpp>
+#include <com/sun/star/lang/EventObject.hpp>
+#include <com/sun/star/awt/MouseButton.hpp>
+#include "cellsuno.hxx"
++
++#include <map>
++
++using namespace std;
+using namespace com::sun::star;
++using namespace org::openoffice;
++using namespace com::sun::star::document::VbaEventId;
+
+const static String sLibrary( RTL_CONSTASCII_USTRINGPARAM("Standard"));
-+const static String sModule( RTL_CONSTASCII_USTRINGPARAM("ThisWorkbook"));
+
+const static rtl::OUString sUrlPart0 = rtl::OUString::createFromAscii( "vnd.sun.star.script:");
+const static rtl::OUString sUrlPart1 = rtl::OUString::createFromAscii( "vnd.sun.star.script:Standard.");
+const static rtl::OUString sUrlPart2 = rtl::OUString::createFromAscii( "?language=Basic&location=document");
+
++//typedef ::cppu::WeakImplHelper2< awt::XWindowListener, awt::XMouseListener > WindowListener_BASE;
+typedef ::cppu::WeakImplHelper1< awt::XWindowListener > WindowListener_BASE;
++
+class VbaWindowListener : public WindowListener_BASE
+{
+ ScVbaEventsHelper* pVbaEventsHelper;
@@ -1001,7 +463,7 @@
+};
+VbaWindowListener::VbaWindowListener( ScVbaEventsHelper* pHelper ) : pVbaEventsHelper( pHelper )
+{
-+ m_xModel.set( pVbaEventsHelper->getDocument()->GetDocumentShell()->GetModel(), uno::UNO_QUERY_THROW );
++ m_xModel.set( pVbaEventsHelper->getDocument()->GetDocumentShell()->GetModel(), uno::UNO_QUERY );
+ m_bPrepare = sal_False;
+ //m_pTimer = 0;
+}
@@ -1010,13 +472,22 @@
+{
+ try
+ {
-+ if( m_xModel.is() )
++ if( pVbaEventsHelper )
+ {
-+ uno::Reference< frame::XModel > xModel( m_xModel, uno::UNO_QUERY_THROW );
-+ uno::Reference< frame::XController > xController( xModel->getCurrentController(), uno::UNO_QUERY_THROW );
-+ uno::Reference< frame::XFrame > xFrame( xController->getFrame(), uno::UNO_QUERY_THROW );
-+ uno::Reference< awt::XWindow > xWindow( xFrame->getContainerWindow(), uno::UNO_QUERY_THROW );
-+ return xWindow;
++ if( m_xModel.is() )
++ {
++ uno::Reference< frame::XController > xController( m_xModel->getCurrentController(), uno::UNO_QUERY );
++ if( xController.is() )
++ {
++ uno::Reference< frame::XFrame > xFrame( xController->getFrame(), uno::UNO_QUERY );
++ if( xFrame.is() )
++ {
++ uno::Reference< awt::XWindow > xWindow( xFrame->getContainerWindow(), uno::UNO_QUERY );
++ if( xWindow.is() )
++ return xWindow;
++ }
++ }
++ }
+ }
+ }
+ catch( uno::Exception& e )
@@ -1039,25 +510,31 @@
+void
+VbaWindowListener::startWindowLinstener()
+{
-+ uno::Reference< awt::XWindow > xWindow( GetContainerWindow(), uno::UNO_QUERY_THROW );
-+ xWindow->addWindowListener( this );
++ OSL_TRACE( "VbaWindowListener::startWindowLinstener" );
++ uno::Reference< awt::XWindow > xWindow( GetContainerWindow(), uno::UNO_QUERY );
++ if( xWindow.is() )
++ xWindow->addWindowListener( this );
+}
+void
+VbaWindowListener::stopWindowLinstener()
+{
-+ uno::Reference< awt::XWindow > xWindow( GetContainerWindow(), uno::UNO_QUERY_THROW );
-+ xWindow->removeWindowListener( this );
++ OSL_TRACE( "VbaWindowListener::stopWindowLinstener" );
++ uno::Reference< awt::XWindow > xWindow( GetContainerWindow(), uno::UNO_QUERY );
++ if( xWindow.is() )
++ {
++ xWindow->removeWindowListener( this );
++ pVbaEventsHelper = NULL;
++ }
+}
+void
+VbaWindowListener::processWindowResizeMacro()
+{
-+ const static String sWindowResize( RTL_CONSTASCII_USTRINGPARAM("Workbook_WindowResize") );
-+ if( m_xModel.is() )
-+ pVbaEventsHelper->processWindowMacro( sWindowResize );
++ if( pVbaEventsHelper )
++ pVbaEventsHelper->ProcessCompatibleVbaEvent( VBAEVENT_WORKBOOK_WINDOWRESIZE, uno::Sequence< uno::Any >() );
+}
+IMPL_LINK( VbaWindowListener, fireResizeMacro, Timer*, pTimer )
+{
-+ if( m_bPrepare && pTimer )
++ if( pVbaEventsHelper && m_bPrepare && pTimer )
+ {
+ if( IsMouseReleased() )
+ {
@@ -1105,18 +582,119 @@
+void SAL_CALL
+VbaWindowListener::disposing( const lang::EventObject& /*aEvent*/ ) throw ( uno::RuntimeException )
+{
-+ m_xModel->dispose();
+ OSL_TRACE("\tVbaWindowListener::disposing");
++ pVbaEventsHelper = NULL;
+}
+
-+String ScVbaEventsHelper::getWorkbookModuleName()
++class ImplVbaEventNameInfo
+{
-+ String sCodeName; // leave blank to force a search of all modules
-+ if ( ScExtDocOptions* pExtDocOpts = pDoc->GetExtDocOptions() )
-+ {
-+ sCodeName = pDoc->GetCodeName();
-+ }
-+ return sCodeName;
++private:
++ map< sal_Int32, rtl::OUString > m_aEventNameMap;
++
++protected:
++ static ImplVbaEventNameInfo* pImplVbaEventNameInfo;
++ ImplVbaEventNameInfo() { InitImplVbaEventNameInfo(); }
++private:
++ void insert( const sal_Int32 nId, const rtl::OUString sEventName )
++ {
++ m_aEventNameMap.insert( make_pair( nId, sEventName ) );
++ }
++ void InitImplVbaEventNameInfo();
++public:
++ virtual ~ImplVbaEventNameInfo();
++ rtl::OUString getEventName( const sal_Int32 nId )
++ {
++ map< sal_Int32, rtl::OUString >::iterator iter = m_aEventNameMap.find( nId );
++ if( iter != m_aEventNameMap.end() )
++ return iter->second;
++ return rtl::OUString();
++ }
++ static ImplVbaEventNameInfo* GetImplVbaEventNameInfo();
++};
++ImplVbaEventNameInfo* ImplVbaEventNameInfo::pImplVbaEventNameInfo = NULL;
++
++ImplVbaEventNameInfo::~ImplVbaEventNameInfo()
++{
++ if( pImplVbaEventNameInfo )
++ delete pImplVbaEventNameInfo;
++}
++
++ImplVbaEventNameInfo*
++ImplVbaEventNameInfo::GetImplVbaEventNameInfo()
++{
++ if( !pImplVbaEventNameInfo )
++ {
++ pImplVbaEventNameInfo = new ImplVbaEventNameInfo;
++ }
++ return pImplVbaEventNameInfo;
++}
++
++#define CREATEOUSTRING(asciistr) rtl::OUString::createFromAscii(asciistr)
++
++#define INSERT_EVENT_INFO( Object, Event, ObjectName, EventName ) \
++ insert( VBAEVENT_##Object##_##Event, ObjectName + CREATEOUSTRING( EventName ) )
++
++#define INSERT_WORKSHEET_EVENT_INFO( Event, EventName ) \
++ INSERT_EVENT_INFO( WORKSHEET, Event,CREATEOUSTRING("Worksheet_"), EventName ); \
++ INSERT_EVENT_INFO( WORKBOOK_SHEET, Event, CREATEOUSTRING("Workbook_Sheet"), EventName )
++
++#define INSERT_WORKBOOK_EVENT_INFO( Event, EventName ) \
++ INSERT_EVENT_INFO( WORKBOOK, Event, CREATEOUSTRING("Workbook_"), EventName )
++
++void ImplVbaEventNameInfo::InitImplVbaEventNameInfo()
++{
++ INSERT_WORKSHEET_EVENT_INFO( ACTIVATE, "Activate");
++ INSERT_WORKSHEET_EVENT_INFO( BEFOREDOUBLECLICK, "BeforeDoubleClick" );
++ INSERT_WORKSHEET_EVENT_INFO( BEFORERIGHTCLICK, "BeforeRightClick" );
++ INSERT_WORKSHEET_EVENT_INFO( CALCULATE, "Calculate" );
++ INSERT_WORKSHEET_EVENT_INFO( CHANGE, "Change" );
++ INSERT_WORKSHEET_EVENT_INFO( DEACTIVATE, "Deactivate" );
++ INSERT_WORKSHEET_EVENT_INFO( FOLLOWHYPERLINK, "FollowHyperlink" );
++ INSERT_WORKSHEET_EVENT_INFO( PIVOTTABLEUPDATE, "PivotTableUpdate" );
++ INSERT_WORKSHEET_EVENT_INFO( SELECTIONCHANGE, "SelectionChange" );
++
++ // Workbook
++ INSERT_WORKBOOK_EVENT_INFO( ACTIVATE, "Activate" );
++ INSERT_WORKBOOK_EVENT_INFO( DEACTIVATE, "Deactivate" );
++ INSERT_WORKBOOK_EVENT_INFO( OPEN, "Open" );
++ // AUTOOPEN doesn't be used. TODO, this should be "auto_open"
++ INSERT_WORKBOOK_EVENT_INFO( BEFORECLOSE, "BeforeClose" );
++ INSERT_WORKBOOK_EVENT_INFO( BEFOREPRINT, "BeforePrint" );
++ INSERT_WORKBOOK_EVENT_INFO( BEFORESAVE, "BeforeSave" );
++ INSERT_WORKBOOK_EVENT_INFO( NEWSHEET, "NewSheet" );
++ INSERT_WORKBOOK_EVENT_INFO( WINDOWACTIVATE, "WindowActivate" );
++ INSERT_WORKBOOK_EVENT_INFO( WINDOWDEACTIVATE, "WindowDeactivate" );
++ INSERT_WORKBOOK_EVENT_INFO( WINDOWRESIZE, "WindowResize" );
++ // VBAEVENT_WORKBOOK_WINDOWCOLSE and VBAEVENT_WORKBOOK_CLOSE doesn't be used
++}
++
++ScVbaEventsHelper::ScVbaEventsHelper( uno::Sequence< css::uno::Any > const& aArgs, uno::Reference< uno::XComponentContext > const& xContext )
++ : m_xContext( xContext ), mpWindowListener( NULL ), mbOpened( sal_False )
++{
++ OSL_TRACE( "ScVbaEventsHelper::ScVbaEventsHelper" );
++ uno::Reference< frame::XModel > xModel ( getXSomethingFromArgs< frame::XModel >( aArgs, 0 ), uno::UNO_QUERY );
++ ScDocShell* pDocShell = getDocShell( xModel );
++ pDoc = pDocShell->GetDocument();
++}
++
++ScVbaEventsHelper::~ScVbaEventsHelper()
++{
++ OSL_TRACE("ScVbaEventsHelper::~ScVbaEventsHelper");
++ if( mpWindowListener )
++ {
++ mpWindowListener->stopWindowLinstener();
++ mpWindowListener = NULL;
++ }
++}
++
++rtl::OUString
++ScVbaEventsHelper::GetEventName( const sal_Int32 nId )
++{
++ rtl::OUString sEventName;
++ ImplVbaEventNameInfo* pEventInfo = ImplVbaEventNameInfo::GetImplVbaEventNameInfo();
++ if( pEventInfo )
++ sEventName = pEventInfo->getEventName( nId );
++ return sEventName;
+}
+
+// Treat the args as possible inouts ( convertion at bottom of method )
@@ -1126,8 +704,6 @@
+ // document saved from XL then we won't be able to determine the codename for the Workbook
+ // Module, so... we have no choice but to search all modules for the moment, thus the macro
+ // passed in should be the fully specified name.
-+ //rtl::OUString sCodeName = getWorkbookModuleName( pShell );
-+ //rtl::OUString sUrl = sUrlPart1.concat( sCodeName ).concat( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(".") ) ).concat( sMacroName ).concat( sUrlPart2 );
+ rtl::OUString sUrl = sUrlPart0.concat( sMacroName ).concat( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(".") ) ).concat( sUrlPart2 ) ;
+ uno::Sequence< sal_Int16 > aOutArgsIndex;
+ uno::Sequence< uno::Any > aOutArgs;
@@ -1151,7 +727,7 @@
+ }
+ return sal_True;
+}
-+String ScVbaEventsHelper::docMacroExists( SfxObjectShell* pShell, const String& sMod, const String& sMacro )
++String ScVbaEventsHelper::workbookMacroExists( SfxObjectShell* pShell, const String& sMod, const String& sMacro )
+{
+ String sFullName;
+ // would use the script provider to see if the macro exists but
@@ -1201,61 +777,16 @@
+ return sFullName;
+}
+
-+sal_Bool ScVbaEventsHelper::processDocBeforeCloseMacro()
++sal_Bool ScVbaEventsHelper::processVbaEventWithCancel( const sal_Int32 nEventId )
+{
++ uno::Sequence< uno::Any > aArgs( 1 );
+ sal_Bool bCancel = sal_False;
-+ SfxObjectShell* pShell = pDoc->GetDocumentShell();
-+ if( pShell )
-+ {
-+ uno::Any aRet;
-+ uno::Sequence< uno::Any > aArgs( 1 );
-+ aArgs[ 0 ] <<= bCancel;
-+ const static String sBeforeClose( RTL_CONSTASCII_USTRINGPARAM("Workbook_BeforeClose") );
-+ rtl::OUString workbookModule = getWorkbookModuleName();
-+ String sFullClose = docMacroExists( pShell, workbookModule, sBeforeClose );
-+ if ( sFullClose.Len() > 0 )
-+ {
-+ if ( !executeWorkBookMacro( pShell, sFullClose, aArgs, aRet ) )
-+ return sal_False;
-+ }
-+ aArgs[ 0 ] >>= bCancel;
-+ }
++ aArgs[ 0 ] <<= bCancel;
++ processVbaEventMacroWithArgs( nEventId, aArgs );
++ aArgs[ 0 ] >>= bCancel;
+ return bCancel;
+}
+
-+sal_Bool ScVbaEventsHelper::addOpenDocEvent( const uno::Reference< container::XNameReplace >& xEvts, const String& sOpenMacro )
-+{
-+ sal_Bool result = sal_False;
-+ const rtl::OUString sUrl = sUrlPart0.concat( sOpenMacro ).concat( sUrlPart2 );
-+ const static rtl::OUString sEvtType( RTL_CONSTASCII_USTRINGPARAM("EventType") );
-+ const static rtl::OUString sScript( RTL_CONSTASCII_USTRINGPARAM("Script") );
-+ const static rtl::OUString sEvt( RTL_CONSTASCII_USTRINGPARAM("OnLoad") );
-+ if ( xEvts.is() )
-+ {
-+ uno::Sequence< beans::PropertyValue > aEvents;
-+ xEvts->getByName( sEvt ) >>= aEvents;
-+ uno::Sequence< beans::PropertyValue > aOpenEvt( 2 );
-+ aOpenEvt[ 0 ].Name = sEvtType;
-+ aOpenEvt[ 0 ].Value = uno::makeAny(sScript);
-+ aOpenEvt[ 1 ].Name = sScript;
-+ aOpenEvt[ 1 ].Value = uno::makeAny(sUrl);
-+ sal_Int32 nPos = aEvents.getLength();
-+
-+ sal_Int32 nNewSize = aEvents.getLength() + aOpenEvt.getLength();
-+ if ( nNewSize > aEvents.getLength() )
-+ aEvents.realloc( nNewSize );
-+
-+ for ( sal_Int32 nIndex = nPos, nCpyIndex = 0; nIndex<nNewSize; nIndex++, nCpyIndex++ )
-+ aEvents[ nIndex ] = aOpenEvt[ nCpyIndex ];
-+
-+ uno::Any aParam = uno::makeAny( aEvents );
-+
-+ xEvts->replaceByName( sEvt, aParam );
-+ result = sal_True;
-+ }
-+ return result;
-+}
-+
+uno::Any ScVbaEventsHelper::createWorkSheet( SfxObjectShell* pShell, SCTAB nTab )
+{
+ uno::Any aRet;
@@ -1337,7 +868,6 @@
+ uno::Sequence< uno::Any > aArgs(2);
+ aArgs[0] = uno::Any( uno::Reference< uno::XInterface >() ); // dummy parent
+ aArgs[1] <<= rCell;
-+ //aArgs[1] <<= uno::makeAny( rtl::OUString( aItem ) );
+
+ aRet <<= xSMgr->createInstanceWithArgumentsAndContext( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("org.openoffice.excel.Hyperlink") ), aArgs, xCtx );
+ }
@@ -1352,188 +882,180 @@
+ return aRet;
+}
+
-+void ScVbaEventsHelper::getSheetEventName( USHORT nEvent, String& rSheetScript, String& rWorkbookScript )
-+{
-+ switch( nEvent )
-+ {
-+ case SC_VBAEVENT_SHEET_ACTIVATE:
-+ {
-+ rSheetScript = String( RTL_CONSTASCII_USTRINGPARAM("Worksheet_Activate") );
-+ rWorkbookScript = String( RTL_CONSTASCII_USTRINGPARAM("Workbook_SheetActivate") );
-+ break;
-+ }
-+ case SC_VBAEVENT_SHEET_BEFOREDOUBLECLICK:
-+ {
-+ rSheetScript = String( RTL_CONSTASCII_USTRINGPARAM("Worksheet_BeforeDoubleClick") );
-+ rWorkbookScript = String( RTL_CONSTASCII_USTRINGPARAM("Workbook_SheetBeforeDoubleClick") );
-+ break;
-+ }
-+ case SC_VBAEVENT_SHEET_BEFORERIGHTCLICK:
-+ {
-+ rSheetScript = String( RTL_CONSTASCII_USTRINGPARAM("Worksheet_BeforeRightClick") );
-+ rWorkbookScript = String( RTL_CONSTASCII_USTRINGPARAM("Workbook_SheetBeforeRightClick") );
-+ break;
-+ }
-+ case SC_VBAEVENT_SHEET_CALCULATE:
-+ {
-+ rSheetScript = String( RTL_CONSTASCII_USTRINGPARAM("Worksheet_Calculate") );
-+ rWorkbookScript = String( RTL_CONSTASCII_USTRINGPARAM("Workbook_SheetCalculate") );
-+ break;
-+ }
-+ case SC_VBAEVENT_SHEET_CHANGE:
-+ {
-+ rSheetScript = String( RTL_CONSTASCII_USTRINGPARAM("Worksheet_Change") );
-+ rWorkbookScript = String( RTL_CONSTASCII_USTRINGPARAM("Workbook_SheetChange") );
-+ break;
-+ }
-+ case SC_VBAEVENT_SHEET_DEACTIVATE:
-+ {
-+ rSheetScript = String( RTL_CONSTASCII_USTRINGPARAM("Worksheet_Deactivate") );
-+ rWorkbookScript = String( RTL_CONSTASCII_USTRINGPARAM("Workbook_SheetDeactivate") );
-+ break;
-+ }
-+ case SC_VBAEVENT_SHEET_FOLLOWHYPERLINK:
-+ {
-+ rSheetScript = String( RTL_CONSTASCII_USTRINGPARAM("Worksheet_FollowHyperlink") );
-+ rWorkbookScript = String( RTL_CONSTASCII_USTRINGPARAM("Workbook_SheetFollowHyperlink") );
-+ break;
-+ }
-+ case SC_VBAEVENT_SHEET_PIVOTTABLEUPDATE:
-+ {
-+ rSheetScript = String( RTL_CONSTASCII_USTRINGPARAM("Worksheet_PivotTableUpdate") );
-+ rWorkbookScript = String( RTL_CONSTASCII_USTRINGPARAM("Workbook_SheetPivotTableUpdate") );
-+ break;
-+ }
-+ case SC_VBAEVENT_SHEET_SELECTIONCHANGE:
-+ {
-+ rSheetScript = String( RTL_CONSTASCII_USTRINGPARAM("Worksheet_SelectionChange") );
-+ rWorkbookScript = String( RTL_CONSTASCII_USTRINGPARAM("Workbook_SheetSelectionChange") );
-+ break;
-+ }
-+ default:
-+ break;
-+ }
-+
-+ return;
-+}
-+
+String ScVbaEventsHelper::getSheetModuleName( SCTAB nTab )
+{
-+ String aCodeName; // leave blank to force full search
++ ScExtDocOptions* pExtOptions = pDoc->GetExtDocOptions();
++ String aCodeName;
++ pDoc->GetName( nTab, aCodeName);
+ // Use code name if that exists
-+ if ( ScExtDocOptions* pExtOptions = pDoc->GetExtDocOptions() )
-+ // for an imported excel doc we always have the codename
-+ pDoc->GetCodeName( nTab, aCodeName );
++ if ( pExtOptions )
++ aCodeName = pExtOptions->GetCodeName( nTab );
+ return aCodeName;
+}
+
++rtl::OUString
++ScVbaEventsHelper::getMacroPath( const sal_Int32 nEventId, const SCTAB nTab )
++{
++ SfxObjectShell* pShell = pDoc->GetDocumentShell();
++ rtl::OUString sMacroPath;
++ rtl::OUString sMacroName = GetEventName( nEventId );
++ switch( nEventId )
++ {
++ // Worksheet
++ case VBAEVENT_WORKSHEET_ACTIVATE :
++ case VBAEVENT_WORKSHEET_BEFOREDOUBLECLICK :
++ case VBAEVENT_WORKSHEET_BEFORERIGHTCLICK :
++ case VBAEVENT_WORKSHEET_CALCULATE :
++ case VBAEVENT_WORKSHEET_CHANGE :
++ case VBAEVENT_WORKSHEET_DEACTIVATE :
++ case VBAEVENT_WORKSHEET_FOLLOWHYPERLINK :
++ case VBAEVENT_WORKSHEET_PIVOTTABLEUPDATE :
++ case VBAEVENT_WORKSHEET_SELECTIONCHANGE :
++ {
++ rtl::OUString aSheetModuleName = getSheetModuleName( nTab );
++ sMacroPath = workbookMacroExists( pShell, aSheetModuleName, sMacroName );
++ break;
++ }
++ // Workbook
++ case VBAEVENT_WORKBOOK_ACTIVATE :
++ case VBAEVENT_WORKBOOK_DEACTIVATE :
++ case VBAEVENT_WORKBOOK_OPEN :
++ case VBAEVENT_WORKBOOK_AUTOOPEN :
++ case VBAEVENT_WORKBOOK_BEFORECLOSE :
++ case VBAEVENT_WORKBOOK_BEFOREPRINT :
++ case VBAEVENT_WORKBOOK_BEFORESAVE :
++ case VBAEVENT_WORKBOOK_NEWSHEET :
++ case VBAEVENT_WORKBOOK_WINDOWACTIVATE :
++ case VBAEVENT_WORKBOOK_WINDOWDEACTIVATE :
++ case VBAEVENT_WORKBOOK_WINDOWRESIZE :
++ case VBAEVENT_WORKBOOK_WINDOWCOLSE :
++ case VBAEVENT_WORKBOOK_CLOSE :
++ // Workbook_sheet
++ case VBAEVENT_WORKBOOK_SHEET_ACTIVATE :
++ case VBAEVENT_WORKBOOK_SHEET_BEFOREDOUBLECLICK :
++ case VBAEVENT_WORKBOOK_SHEET_BEFORERIGHTCLICK :
++ case VBAEVENT_WORKBOOK_SHEET_CALCULATE :
++ case VBAEVENT_WORKBOOK_SHEET_CHANGE :
++ case VBAEVENT_WORKBOOK_SHEET_DEACTIVATE :
++ case VBAEVENT_WORKBOOK_SHEET_FOLLOWHYPERLINK :
++ case VBAEVENT_WORKBOOK_SHEET_PIVOTTABLEUPDATE :
++ case VBAEVENT_WORKBOOK_SHEET_SELECTIONCHANGE :
++ {
++ ScExtDocOptions* pExtOptions = pDoc->GetExtDocOptions();
++ if( pExtOptions )
++ {
++ ScExtDocSettings aExtDocSettings = pExtOptions->GetDocSettings();
++ String sWorkbookModuleName = aExtDocSettings.maGlobCodeName;
++ sMacroPath = workbookMacroExists( pShell, sWorkbookModuleName, sMacroName );
++ }
++ else
++ {
++ // TODO need this?
++ sMacroPath = workbookMacroExists( pShell, rtl::OUString(), sMacroName );
++ }
++ break;
++ }
++ default:
++ break;
++ }
++ return sMacroPath;
++}
++
+sal_Bool ScVbaEventsHelper::executeSheetMacro( USHORT nEvent, SCTAB nTab, uno::Sequence< uno::Any >& rArgs )
+{
+ SfxObjectShell* pShell = pDoc->GetDocumentShell();
-+ if( !pShell )
-+ return sal_False;
+
+ sal_Bool result = sal_False;
+ uno::Sequence< uno::Any > aArgs;
+ uno::Any aRet;
+
-+ String aSheetScript;
-+ String aWorkbookScript;
-+
-+ getSheetEventName( nEvent, aSheetScript, aWorkbookScript );
-+
-+ String aSheetModuleName = getSheetModuleName( nTab );
-+ String aSheetMacro = docMacroExists( pShell, aSheetModuleName, aSheetScript );
-+ String aWorkbookMacro = docMacroExists( pShell, String(), aWorkbookScript );
-+ if( aSheetMacro.Len() > 0 || aWorkbookMacro.Len() > 0 )
++ rtl::OUString sMacroPath = getMacroPath( nEvent, nTab );
++ if( sMacroPath.getLength() )
+ {
+ switch( nEvent )
+ {
-+ case SC_VBAEVENT_SHEET_ACTIVATE:
-+ case SC_VBAEVENT_SHEET_CALCULATE:
-+ case SC_VBAEVENT_SHEET_DEACTIVATE:
++ case VBAEVENT_WORKSHEET_ACTIVATE:
++ case VBAEVENT_WORKSHEET_CALCULATE:
++ case VBAEVENT_WORKSHEET_DEACTIVATE:
+ {
+ // no arguments
-+ if( aSheetMacro.Len() > 0 )
-+ result = executeWorkBookMacro( pShell, aSheetMacro, aArgs, aRet );
-+
-+ if( aWorkbookMacro.Len() > 0 )
-+ {
-+ aArgs = uno::Sequence< uno::Any >(1);
-+ aArgs[0] = createWorkSheet( pShell, nTab );
-+ result = executeWorkBookMacro( pShell, aWorkbookMacro, aArgs, aRet );
-+ }
-+
++ result = executeWorkBookMacro( pShell, sMacroPath, aArgs, aRet );
+ break;
+ }
-+ case SC_VBAEVENT_SHEET_CHANGE:
-+ case SC_VBAEVENT_SHEET_SELECTIONCHANGE:
++ case VBAEVENT_WORKBOOK_SHEET_DEACTIVATE :
++ case VBAEVENT_WORKBOOK_SHEET_CALCULATE :
++ case VBAEVENT_WORKBOOK_SHEET_ACTIVATE :
++ {
++ aArgs = uno::Sequence< uno::Any >(1);
++ aArgs[0] = createWorkSheet( pShell, nTab );
++ result = executeWorkBookMacro( pShell, sMacroPath, aArgs, aRet );
++ break;
++ }
++ case VBAEVENT_WORKSHEET_CHANGE:
++ case VBAEVENT_WORKSHEET_SELECTIONCHANGE:
+ {
+ // one argument: range
+ uno::Any aRange = createRange( rArgs[0] );
-+ if( aSheetMacro.Len() > 0 )
-+ {
-+ aArgs = uno::Sequence< uno::Any >(1);
-+ aArgs[0] = aRange;
-+ result = executeWorkBookMacro( pShell, aSheetMacro, aArgs, aRet );
-+ }
-+
-+ if( aWorkbookMacro.Len() > 0 )
-+ {
-+ aArgs = uno::Sequence< uno::Any >(2);
-+ aArgs[0] = createWorkSheet( pShell, nTab );
-+ aArgs[1] = aRange;
-+ result = executeWorkBookMacro( pShell, aWorkbookMacro, aArgs, aRet );
-+ }
++ aArgs = uno::Sequence< uno::Any >(1);
++ aArgs[0] = aRange;
++ result = executeWorkBookMacro( pShell, sMacroPath, aArgs, aRet );
+ break;
+ }
-+ case SC_VBAEVENT_SHEET_BEFOREDOUBLECLICK:
-+ case SC_VBAEVENT_SHEET_BEFORERIGHTCLICK:
++ case VBAEVENT_WORKBOOK_SHEET_CHANGE :
++ case VBAEVENT_WORKBOOK_SHEET_SELECTIONCHANGE :
++ {
++ uno::Any aRange = createRange( rArgs[0] );
++ aArgs = uno::Sequence< uno::Any >(2);
++ aArgs[0] = createWorkSheet( pShell, nTab );
++ aArgs[1] = aRange;
++ result = executeWorkBookMacro( pShell, sMacroPath, aArgs, aRet );
++ break;
++ }
++ case VBAEVENT_WORKSHEET_BEFOREDOUBLECLICK:
++ case VBAEVENT_WORKSHEET_BEFORERIGHTCLICK:
+ {
+ // two aruments: range and cancel
+ uno::Any aRange = createRange( rArgs[0] );
-+ if( aSheetMacro.Len() > 0 )
-+ {
-+ aArgs = uno::Sequence< uno::Any >(2);
-+ aArgs[0] = aRange;
-+ aArgs[1] = rArgs[1];
-+ result = executeWorkBookMacro( pShell, aSheetMacro, aArgs, aRet );
-+ // return the cancel value
-+ rArgs[1] = aArgs[1];
-+ }
-+
-+ if( aWorkbookMacro.Len() > 0 )
-+ {
-+ aArgs = uno::Sequence< uno::Any >(3);
-+ aArgs[0] = createWorkSheet( pShell, nTab );
-+ aArgs[1] = aRange;
-+ aArgs[2] = aArgs[1];
-+ result = executeWorkBookMacro( pShell, aWorkbookMacro, aArgs, aRet );
-+ rArgs[2] = aArgs[2];
-+ }
++ aArgs = uno::Sequence< uno::Any >(2);
++ aArgs[0] = aRange;
++ aArgs[1] = rArgs[1];
++ result = executeWorkBookMacro( pShell, sMacroPath, aArgs, aRet );
++ // return the cancel value
++ rArgs[1] = aArgs[1];
+ break;
+ }
-+ case SC_VBAEVENT_SHEET_FOLLOWHYPERLINK:
++ case VBAEVENT_WORKBOOK_SHEET_BEFOREDOUBLECLICK :
++ case VBAEVENT_WORKBOOK_SHEET_BEFORERIGHTCLICK :
++ {
++ uno::Any aRange = createRange( rArgs[0] );
++ aArgs = uno::Sequence< uno::Any >(3);
++ aArgs[0] = createWorkSheet( pShell, nTab );
++ aArgs[1] = aRange;
++ aArgs[2] = aArgs[1];
++ result = executeWorkBookMacro( pShell, sMacroPath, aArgs, aRet );
++ rArgs[2] = aArgs[2];
++ break;
++ }
++ case VBAEVENT_WORKSHEET_FOLLOWHYPERLINK:
+ {
+ // one argument: hyperlink
+ uno::Any aHyperlink = createHyperlink( rArgs[0] );
-+ if( aSheetMacro.Len() > 0 )
-+ {
-+ aArgs = uno::Sequence< uno::Any >(1);
-+ aArgs[0] = aHyperlink;
-+ result = executeWorkBookMacro( pShell, aSheetMacro, aArgs, aRet );
-+ }
-+
-+ if( aWorkbookMacro.Len() > 0 )
-+ {
-+ aArgs = uno::Sequence< uno::Any >(2);
-+ aArgs[0] = createWorkSheet( pShell, nTab );
-+ aArgs[1] = aHyperlink;
-+ result = executeWorkBookMacro( pShell, aWorkbookMacro, aArgs, aRet );
-+ }
++ aArgs = uno::Sequence< uno::Any >(1);
++ aArgs[0] = aHyperlink;
++ result = executeWorkBookMacro( pShell, sMacroPath, aArgs, aRet );
+ break;
+ }
-+ case SC_VBAEVENT_SHEET_PIVOTTABLEUPDATE:
++ case VBAEVENT_WORKBOOK_SHEET_FOLLOWHYPERLINK :
++ {
++ uno::Any aHyperlink = createHyperlink( rArgs[0] );
++ aArgs = uno::Sequence< uno::Any >(2);
++ aArgs[0] = createWorkSheet( pShell, nTab );
++ aArgs[1] = aHyperlink;
++ result = executeWorkBookMacro( pShell, sMacroPath, aArgs, aRet );
++ break;
++ }
++ case VBAEVENT_WORKSHEET_PIVOTTABLEUPDATE:
++ case VBAEVENT_WORKBOOK_SHEET_PIVOTTABLEUPDATE :
+ {
+ // one argument: pivottable
+ break;
@@ -1544,291 +1066,1394 @@
+ return result;
+}
+
-+sal_Bool ScVbaEventsHelper::processDocBeforePrintMacro( )
++uno::Any ScVbaEventsHelper::createWindow( SfxObjectShell* pShell )
+{
-+ SfxObjectShell* pShell = pDoc->GetDocumentShell();
-+ if( !pShell )
-+ return sal_False;
-+
-+ uno::Any aRet;
-+ uno::Sequence< uno::Any > aArgs( 1 );
-+ sal_Bool bCancel = sal_False;
-+ aArgs[ 0 ] <<= bCancel;
-+ const static String sBeforeClose( RTL_CONSTASCII_USTRINGPARAM("Workbook_BeforePrint") );
-+ rtl::OUString workbookModule = getWorkbookModuleName();
-+ String sFullClose = docMacroExists( pShell, workbookModule, sBeforeClose );
-+ if ( sFullClose.Len() > 0 )
-+ {
-+ if ( !executeWorkBookMacro( pShell, sFullClose, aArgs, aRet ) )
-+ return sal_False;
++ try
++ {
++ uno::Reference< lang::XMultiServiceFactory > xSF( comphelper::getProcessServiceFactory(), uno::UNO_QUERY );
++ uno::Reference< frame::XModel > xModel( pShell->GetModel(), uno::UNO_QUERY );
++ uno::Sequence< uno::Any > aWindowArgs(2);
++ aWindowArgs[0] = uno::Any( uno::Reference< uno::XInterface > () );
++ aWindowArgs[1] = uno::Any( xModel );
++ uno::Reference< uno::XInterface > xWindow( xSF->createInstanceWithArguments( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("org.openoffice.excel.Window" ) ), aWindowArgs ), uno::UNO_QUERY );
++ if( xWindow.is() )
++ return uno::makeAny( xWindow );
++ }
++ catch( uno::Exception& e )
++ {
+ }
-+ aArgs[ 0 ] >>= bCancel;
-+ return bCancel;
++ return uno::Any();
+}
+
-+void ScVbaEventsHelper::processDocNewSheetMacro( SfxObjectShell* pShell, uno::Any aElement )
++void ScVbaEventsHelper::processVbaEventMacro_noreturn( const sal_Int32 nEventId )
+{
-+ uno::Any aRet;
-+ if( aElement.hasValue() )
-+ {
-+ uno::Sequence< uno::Any > aArgs(1);
-+ aArgs[0] = aElement;
-+ const static String sNewSheet( RTL_CONSTASCII_USTRINGPARAM("Workbook_NewSheet") );
-+ rtl::OUString workbookModule = getWorkbookModuleName();
-+ String sFullClose = docMacroExists( pShell, workbookModule, sNewSheet );
-+ if ( sFullClose.Len() > 0 )
-+ {
-+ executeWorkBookMacro( pShell, sFullClose, aArgs, aRet );
-+ }
-+ }
++ uno::Sequence< uno::Any > aArgs;
++ processVbaEventMacroWithArgs( nEventId, aArgs );
+}
+
-+#define SC_TAB_INSERTED 1
-+void ScVbaEventsHelper::processScTablesHint( USHORT nId, SCTAB nTab )
++void ScVbaEventsHelper::processVbaEventMacroWithArgs( const sal_Int32 nEventId, uno::Sequence< uno::Any >& rArgs )
+{
+ SfxObjectShell* pShell = pDoc->GetDocumentShell();
-+ if( pShell )
++ if( !pShell )
++ return;
++
++ rtl::OUString sMacroPath = getMacroPath( nEventId, -1 );
++ if( sMacroPath.getLength() )
+ {
-+// USHORT nId = rHint.GetId();
-+// SCTAB nTab = rHint.GetTab1();
-+ if( nId == SC_TAB_INSERTED )
-+ {
-+ processDocNewSheetMacro( pShell, createWorkSheet( pShell, nTab ) );
-+ }
++ uno::Any aRet;
++ executeWorkBookMacro( pShell, sMacroPath, rArgs, aRet );
+ }
+}
+
-+void ScVbaEventsHelper::processWindowMacro( String sFuncName )
++void ScVbaEventsHelper::WorkbookWindowMacro( const sal_Int32 nHint )
+{
+ SfxObjectShell* pShell = pDoc->GetDocumentShell();
+ if( !pShell )
+ return;
-+ uno::Any aElement = getVbaWindow( pShell );
++ uno::Sequence< uno::Any > aArgs(1);
++ uno::Any aElement = createWindow( pShell );
++ aArgs[0] = aElement;
++ switch( nHint )
++ {
++ case VBAEVENT_WORKBOOK_WINDOWACTIVATE:
++ case VBAEVENT_WORKBOOK_WINDOWDEACTIVATE:
++ case VBAEVENT_WORKBOOK_WINDOWRESIZE:
++ // it will be called when close the doc. but should not launch the macro.
++ processVbaEventMacroWithArgs( nHint, aArgs );
++ break;
++ case VBAEVENT_WORKBOOK_WINDOWCOLSE:
++ // ProcessCompatibleVbaEvent( VBAEVENT_WORKBOOK_WINDOWDEACTIVATE, uno::Sequence< uno::Any >() );
++ // does Doc be closed surely? if yes. should frie the workbook deactivate event.
++ ProcessCompatibleVbaEvent( VBAEVENT_WORKBOOK_DEACTIVATE, uno::Sequence< uno::Any >() );
++ break;
++ default:
++ break;
++ }
++}
++
++sal_Bool ScVbaEventsHelper::processDocBeforeSaveMacro( sal_Bool bSaveAsUI )
++{
++ uno::Sequence< uno::Any > aArgs( 2 );
++ sal_Bool bCancel = sal_False;
++ aArgs[ 0 ] <<= bSaveAsUI;
++ aArgs[ 1 ] <<= bCancel;
++ processVbaEventMacroWithArgs( VBAEVENT_WORKBOOK_BEFORESAVE, aArgs );
++ aArgs[ 1 ] >>= bCancel;
++ return bCancel;
++}
+
-+ uno::Any aRet;
-+ if( aElement.hasValue() && ( sFuncName.Len() > 0 ) )
++SCTAB
++ScVbaEventsHelper::getTabFromArgs( const uno::Sequence< uno::Any > aArgs, const sal_Int32 nPos )
++{
++ SCTAB nTab = -1;
++ uno::Reference< sheet::XCellRangeAddressable > xCellRangeAddressable( getXSomethingFromArgs< sheet::XCellRangeAddressable >( aArgs, nPos ), uno::UNO_QUERY );
++ if( xCellRangeAddressable.is() )
+ {
-+ uno::Sequence< uno::Any > aArgs(1);
-+ aArgs[0] = aElement;
-+ rtl::OUString workbookModule = getWorkbookModuleName();
-+ String sMacro = docMacroExists( pShell, workbookModule, sFuncName );
-+ if ( sMacro.Len() > 0 )
-+ {
-+ executeWorkBookMacro( pShell, sMacro, aArgs, aRet );
-+ }
++ table::CellRangeAddress aAddress = xCellRangeAddressable->getRangeAddress();
++ nTab = aAddress.Sheet;
+ }
++ return nTab;
+}
-+uno::Any ScVbaEventsHelper::getVbaWindow( SfxObjectShell* pShell )
++
++#define INVALID_TAB -1
++
++sal_Bool SAL_CALL
++ScVbaEventsHelper::ProcessCompatibleVbaEvent( sal_Int32 VbaEvent, const uno::Sequence< uno::Any >& aArgs ) throw (uno::RuntimeException)
+{
-+ try
++ SfxObjectShell* pShell = pDoc->GetDocumentShell();
++ if( !pShell )
++ return sal_False;
++
++ sal_Int32 nTab = INVALID_TAB;
++ uno::Sequence< uno::Any > aTmpArgs( aArgs );
++ switch( VbaEvent )
+ {
-+ uno::Reference< lang::XMultiServiceFactory > xSF( comphelper::getProcessServiceFactory(), uno::UNO_QUERY );
-+ uno::Reference< frame::XModel > xModel( pShell->GetModel(), uno::UNO_QUERY );
-+ uno::Sequence< uno::Any > aWindowArgs(2);
-+ aWindowArgs[0] = uno::Any( uno::Reference< uno::XInterface > () );
-+ aWindowArgs[1] = uno::Any( xModel );
-+ uno::Reference< uno::XInterface > xWindow( xSF->createInstanceWithArguments( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("org.openoffice.excel.Window" ) ), aWindowArgs ), uno::UNO_QUERY );
-+ if( xWindow.is() )
-+ return uno::makeAny( xWindow );
++ // Worksheet
++ case VBAEVENT_WORKSHEET_ACTIVATE :
++ {
++ if( aArgs[0] >>= nTab )
++ {
++ executeSheetMacro( (USHORT)VbaEvent, (SCTAB)nTab, aTmpArgs );
++ // recursive call related workbook sheet event.
++ ProcessCompatibleVbaEvent( VBAEVENT_WORKBOOK_SHEET_ACTIVATE, aArgs );
++ }
++ break;
++ }
++ case VBAEVENT_WORKSHEET_BEFOREDOUBLECLICK :
++ {
++ nTab = getTabFromArgs( aTmpArgs, 0 );
++ if( nTab > INVALID_TAB )
++ {
++ executeSheetMacro( (USHORT)VbaEvent, (SCTAB)nTab, aTmpArgs );
++ ProcessCompatibleVbaEvent( VBAEVENT_WORKBOOK_SHEET_BEFOREDOUBLECLICK, aArgs );
++ }
++ break;
++ }
++ case VBAEVENT_WORKSHEET_BEFORERIGHTCLICK :
++ {
++ nTab = getTabFromArgs( aTmpArgs, 0 );
++ if( nTab > INVALID_TAB )
++ {
++ executeSheetMacro( (USHORT)VbaEvent, (SCTAB)nTab, aTmpArgs );
++ ProcessCompatibleVbaEvent( VBAEVENT_WORKBOOK_SHEET_BEFORERIGHTCLICK, aArgs );
++ }
++ break;
++ }
++ case VBAEVENT_WORKSHEET_CALCULATE :
++ {
++ if( aArgs[0] >>= nTab )
++ {
++ executeSheetMacro( (USHORT)VbaEvent, (SCTAB)nTab, aTmpArgs );
++ ProcessCompatibleVbaEvent( VBAEVENT_WORKBOOK_SHEET_CALCULATE, aArgs );
++ }
++ break;
++ }
++ case VBAEVENT_WORKSHEET_CHANGE :
++ {
++ nTab = getTabFromArgs( aTmpArgs, 0 );
++ if( nTab > INVALID_TAB )
++ {
++ executeSheetMacro( (USHORT)VbaEvent, (SCTAB)nTab, aTmpArgs );
++ ProcessCompatibleVbaEvent( VBAEVENT_WORKBOOK_SHEET_CHANGE, aArgs );
++ }
++ break;
++ }
++ case VBAEVENT_WORKSHEET_DEACTIVATE :
++ {
++ if( aArgs[0] >>= nTab )
++ {
++ executeSheetMacro( (USHORT)VbaEvent, (SCTAB)nTab, aTmpArgs );
++ ProcessCompatibleVbaEvent( VBAEVENT_WORKBOOK_SHEET_DEACTIVATE, aArgs );
++ }
++ break;
++ }
++ case VBAEVENT_WORKSHEET_FOLLOWHYPERLINK :
++ {
++ nTab = getTabFromArgs( aTmpArgs, 0 );
++ if( nTab > INVALID_TAB )
++ {
++ executeSheetMacro( (USHORT)VbaEvent, (SCTAB)nTab, aTmpArgs );
++ ProcessCompatibleVbaEvent( VBAEVENT_WORKBOOK_SHEET_FOLLOWHYPERLINK, aArgs );
++ }
++ break;
++ }
++ case VBAEVENT_WORKSHEET_PIVOTTABLEUPDATE :
++ // TODO
++ break;
++ case VBAEVENT_WORKSHEET_SELECTIONCHANGE :
++ {
++ nTab = getTabFromArgs( aTmpArgs, 0 );
++ if( nTab > INVALID_TAB )
++ {
++ executeSheetMacro( (USHORT)VbaEvent, (SCTAB)nTab, aTmpArgs );
++ ProcessCompatibleVbaEvent( VBAEVENT_WORKBOOK_SHEET_SELECTIONCHANGE, aArgs );
++ }
++ break;
++ }
++ // Workbook_sheet
++ case VBAEVENT_WORKBOOK_SHEET_ACTIVATE :
++ {
++ if( aArgs[0] >>= nTab )
++ {
++ executeSheetMacro( (USHORT)VbaEvent, (SCTAB)nTab, aTmpArgs );
++ }
++ break;
++ }
++ case VBAEVENT_WORKBOOK_SHEET_BEFOREDOUBLECLICK :
++ {
++ nTab = getTabFromArgs( aTmpArgs, 0 );
++ if( nTab > INVALID_TAB )
++ {
++ executeSheetMacro( (USHORT)VbaEvent, (SCTAB)nTab, aTmpArgs );
++ }
++ break;
++ }
++ case VBAEVENT_WORKBOOK_SHEET_BEFORERIGHTCLICK :
++ {
++ nTab = getTabFromArgs( aTmpArgs, 0 );
++ if( nTab > INVALID_TAB )
++ {
++ executeSheetMacro( (USHORT)VbaEvent, (SCTAB)nTab, aTmpArgs );
++ }
++ break;
++ }
++ case VBAEVENT_WORKBOOK_SHEET_CALCULATE :
++ {
++ if( aArgs[0] >>= nTab )
++ {
++ executeSheetMacro( (USHORT)VbaEvent, (SCTAB)nTab, aTmpArgs );
++ }
++ break;
++ }
++ case VBAEVENT_WORKBOOK_SHEET_CHANGE :
++ {
++ nTab = getTabFromArgs( aTmpArgs, 0 );
++ if( nTab > INVALID_TAB )
++ {
++ executeSheetMacro( (USHORT)VbaEvent, (SCTAB)nTab, aTmpArgs );
++ }
++ break;
++ }
++ case VBAEVENT_WORKBOOK_SHEET_DEACTIVATE :
++ {
++ if( aArgs[0] >>= nTab )
++ {
++ executeSheetMacro( (USHORT)VbaEvent, (SCTAB)nTab, aTmpArgs );
++ }
++ break;
++ }
++ case VBAEVENT_WORKBOOK_SHEET_FOLLOWHYPERLINK :
++ {
++ nTab = getTabFromArgs( aTmpArgs, 0 );
++ if( nTab > INVALID_TAB )
++ {
++ executeSheetMacro( (USHORT)VbaEvent, (SCTAB)nTab, aTmpArgs );
++ }
++ break;
++ }
++ case VBAEVENT_WORKBOOK_SHEET_PIVOTTABLEUPDATE :
++ // TODO
++ break;
++ case VBAEVENT_WORKBOOK_SHEET_SELECTIONCHANGE :
++ {
++ nTab = getTabFromArgs( aTmpArgs, 0 );
++ if( nTab > INVALID_TAB )
++ {
++ executeSheetMacro( (USHORT)VbaEvent, (SCTAB)nTab, aTmpArgs );
++ }
++ break;
++ }
++ // Workbook
++ case VBAEVENT_WORKBOOK_ACTIVATE :
++ {
++ // if workbook open event do not be fired. fired it before
++ // workbook activate event to compatible with MSO.
++ if( !mbOpened )
++ {
++ ProcessCompatibleVbaEvent( VBAEVENT_WORKBOOK_OPEN, aArgs );
++ }
++ processVbaEventMacro_noreturn( VBAEVENT_WORKBOOK_ACTIVATE );
++ // workbook window activate event same as this one
++ ProcessCompatibleVbaEvent( VBAEVENT_WORKBOOK_WINDOWACTIVATE, aArgs );
++ break;
++ }
++ case VBAEVENT_WORKBOOK_DEACTIVATE :
++ {
++ processVbaEventMacro_noreturn( VBAEVENT_WORKBOOK_DEACTIVATE );
++ // same as workbook window deactivate
++ ProcessCompatibleVbaEvent( VBAEVENT_WORKBOOK_WINDOWDEACTIVATE, aArgs );
++ break;
++ }
++ case VBAEVENT_WORKBOOK_OPEN :
++ {
++ // process workbook open macro
++ // does auto open work here?
++ //WorkbookAutoOpen();
++ if( !mbOpened )
++ {
++ processVbaEventMacro_noreturn( VBAEVENT_WORKBOOK_OPEN );
++ mbOpened = sal_True;
++ }
++ // register the window listener.
++ if( !mpWindowListener )
++ {
++ mpWindowListener = new VbaWindowListener( this );
++ mpWindowListener->startWindowLinstener();
++ }
++ break;
++ }
++ case VBAEVENT_WORKBOOK_AUTOOPEN :
++ break;
++ case VBAEVENT_WORKBOOK_BEFORECLOSE :
++ {
++ sal_Bool bCancel = processVbaEventWithCancel( VbaEvent );
++ if( mpWindowListener && !bCancel )
++ {
++ mpWindowListener->stopWindowLinstener();
++ mpWindowListener = NULL;
++ }
++ return bCancel;
++ }
++ case VBAEVENT_WORKBOOK_BEFOREPRINT :
++ {
++ return processVbaEventWithCancel( VbaEvent );
++ }
++ case VBAEVENT_WORKBOOK_BEFORESAVE :
++ {
++ sal_Bool bUISave = sal_Bool();
++ if( aArgs.getLength() && ( aArgs[0] >>= bUISave ) )
++ return processDocBeforeSaveMacro( bUISave );
++ }
++ case VBAEVENT_WORKBOOK_NEWSHEET :
++ {
++ SCTAB nTabNum;
++ if( aArgs.getLength() && ( aArgs[0] >>= nTabNum ) )
++ {
++ uno::Sequence< uno::Any > rArgs(1);
++ rArgs[0] = createWorkSheet( pShell, nTabNum );
++ processVbaEventMacroWithArgs( VBAEVENT_WORKBOOK_NEWSHEET, rArgs );
++ }
++ break;
++ }
++ case VBAEVENT_WORKBOOK_WINDOWACTIVATE :
++ case VBAEVENT_WORKBOOK_WINDOWDEACTIVATE :
++ case VBAEVENT_WORKBOOK_WINDOWRESIZE :
++ case VBAEVENT_WORKBOOK_WINDOWCOLSE :
++ WorkbookWindowMacro( VbaEvent );
++ break;
++ case VBAEVENT_WORKBOOK_CLOSE :
++ break;
++ default:
++ OSL_TRACE( "Invalid Event" );
+ }
-+ catch( uno::Exception& e )
++
++ return sal_True;
++}
++
++namespace vbaeventshelper
++{
++namespace sdecl = comphelper::service_decl;
++sdecl::class_<ScVbaEventsHelper, sdecl::with_args<true> > serviceImpl;
++extern sdecl::ServiceDecl const serviceDecl(
++ serviceImpl,
++ "ScVbaEventsHelper",
++ "com.sun.star.document.VbaEventsHelper" );
++}
+--- sc/source/ui/vba/service.cxx.orig 2008-06-03 14:25:12.000000000 +0800
++++ sc/source/ui/vba/service.cxx 2008-06-03 14:25:19.000000000 +0800
+@@ -69,6 +69,10 @@ namespace hyperlink
+ {
+ extern sdecl::ServiceDecl const serviceDecl;
+ }
++namespace vbaeventshelper
++{
++extern sdecl::ServiceDecl const serviceDecl;
++}
+
+
+ extern "C"
+@@ -87,7 +91,7 @@ extern "C"
+
+ // Component registration
+ if ( component_writeInfoHelper( pServiceManager, pRegistryKey,
+- range::serviceDecl, workbook::serviceDecl, worksheet::serviceDecl, globals::serviceDecl, userform::serviceDecl, window::serviceDecl, hyperlink::serviceDecl ) )
++ range::serviceDecl, workbook::serviceDecl, worksheet::serviceDecl, globals::serviceDecl, userform::serviceDecl, window::serviceDecl, hyperlink::serviceDecl ) && component_writeInfoHelper( pServiceManager, pRegistryKey, vbaeventshelper::serviceDecl ) )
+ {
+ // Singleton registration
+ try
+@@ -116,6 +120,8 @@ extern "C"
+ OSL_TRACE("In component_getFactory for %s", pImplName );
+ void* pRet = component_getFactoryHelper(
+ pImplName, pServiceManager, pRegistryKey, range::serviceDecl, workbook::serviceDecl, worksheet::serviceDecl, globals::serviceDecl, userform::serviceDecl, window::serviceDecl, hyperlink::serviceDecl );
++ if( !pRet )
++ pRet = component_getFactoryHelper( pImplName, pServiceManager, pRegistryKey, vbaeventshelper::serviceDecl );
+ OSL_TRACE("Ret is 0x%x", pRet);
+ return pRet;
+ }
+--- sc/inc/document.hxx.orig 2008-06-03 14:24:49.000000000 +0800
++++ sc/inc/document.hxx 2008-06-03 14:25:19.000000000 +0800
+@@ -42,6 +42,7 @@
+ #include "brdcst.hxx"
+ #include "tabopparams.hxx"
+ #include "grammar.hxx"
++//#include <org/openoffice/vba/XVBAWorkbookEventHelper.hpp>
+
+ #include <memory>
+ #include <map>
+@@ -134,6 +135,7 @@ class ScAutoNameCache;
+ class ScTemporaryChartLock;
+ class ScLookupCache;
+ struct ScLookupCacheMapImpl;
++//class ScVbaEventsHelper;
+
+ namespace com { namespace sun { namespace star {
+ namespace lang {
+@@ -151,6 +153,9 @@ namespace com { namespace sun { namespac
+ }
+ } } }
+
++namespace com { namespace sun { namespace star { namespace document {
++ class XVbaEventsHelper;
++} } } }
+ #include <svtools/zforlist.hxx>
+ /*
+ #ifdef _ZFORLIST_DECLARE_TABLE
+@@ -309,6 +314,9 @@ private:
+
+ Timer aTrackTimer;
+
++ //ScVbaEventsHelper* pVbaEventsHelper;
++ com::sun::star::uno::Reference< com::sun::star::document::XVbaEventsHelper > rVbaEventsHelper;
++
+ public:
+ ScTabOpList aTableOpList; // list of ScInterpreterTableOpParams currently in use
+ ScInterpreterTableOpParams aLastTableOpParams; // remember last params
+@@ -1722,6 +1730,8 @@ public:
+ void GetSortParam( ScSortParam& rParam, SCTAB nTab );
+ void SetSortParam( ScSortParam& rParam, SCTAB nTab );
+
++ com::sun::star::uno::Reference< com::sun::star::document::XVbaEventsHelper > GetVbaEventsHelper();
++
+ /** Should only be GRAM_PODF or GRAM_ODFF. */
+ void SetStorageGrammar( ScGrammar::Grammar eGrammar );
+ ScGrammar::Grammar GetStorageGrammar() const
+--- sc/source/core/data/documen2.cxx.orig 2008-06-03 14:24:49.000000000 +0800
++++ sc/source/core/data/documen2.cxx 2008-06-03 14:25:19.000000000 +0800
+@@ -93,6 +93,7 @@
+ #include "listenercalls.hxx"
+ #include "recursionhelper.hxx"
+ #include "lookupcache.hxx"
++#include <com/sun/star/document/XVbaEventsHelper.hpp>
+
+ // pImpl because including lookupcache.hxx in document.hxx isn't wanted, and
+ // dtor is convenient.
+@@ -147,6 +148,7 @@ ScDocument::ScDocument( ScDocumentMode e
+ pRecursionHelper( NULL ),
+ pAutoNameCache( NULL ),
+ pLookupCacheMapImpl( NULL ),
++ //rVbaEventsHelper( NULL ),
+ nUnoObjectId( 0 ),
+ nRangeOverflowType( 0 ),
+ aCurTextWidthCalcPos(MAXCOL,0,0),
+@@ -434,6 +436,12 @@ ScDocument::~ScDocument()
+ delete pOtherObjects;
+ delete pRecursionHelper;
+
++ /*if( rVbaEventsHelper )
++ {
++ delete pVbaEventsHelper;
++ pVbaEventsHelper = NULL;
++ }*/
++
+ DBG_ASSERT( !pAutoNameCache, "AutoNameCache still set in dtor" );
+ }
+
+@@ -1863,3 +1871,26 @@ void ScDocument::RemoveLookupCache( ScLo
+ EndListeningArea( pCache->getRange(), &rCache);
+ }
+ }
++
++using namespace com::sun::star;
++uno::Reference< document::XVbaEventsHelper >
++ScDocument::GetVbaEventsHelper()
++{
++ if( !rVbaEventsHelper.is() )
++ {
++ try
++ {
++ uno::Reference< lang::XMultiServiceFactory > xSF( comphelper::getProcessServiceFactory(), uno::UNO_QUERY );
++ uno::Reference< frame::XModel > xModel( pShell->GetModel(), uno::UNO_QUERY );
++ uno::Sequence< uno::Any > aArgs(1);
++ aArgs[0] = uno::Any( xModel );
++ uno::Reference< document::XVbaEventsHelper > xVbaEventsHelper( xSF->createInstanceWithArguments( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.document.VbaEventsHelper" ) ), aArgs ), uno::UNO_QUERY );
++ // helper will always be created successfully.
++ rVbaEventsHelper.set( xVbaEventsHelper, uno::UNO_QUERY );
++ }
++ catch( uno::Exception& e )
++ {
++ }
++ }
++ return rVbaEventsHelper;
++}
+--- sc/source/core/data/documen7.cxx.orig 2008-06-03 14:25:12.000000000 +0800
++++ sc/source/core/data/documen7.cxx 2008-06-03 14:25:19.000000000 +0800
+@@ -59,7 +59,15 @@
+
+
+ #include "globstr.hrc"
++#include <algorithm>
++#include <vector>
+
++
++#include <com/sun/star/document/XVbaEventsHelper.hpp>
++#include <com/sun/star/document/VbaEventId.hpp>
++
++using namespace com::sun::star;
++using namespace com::sun::star::document::VbaEventId;
+ extern const ScFormulaCell* pLastFormulaTreeTop; // cellform.cxx Err527 WorkAround
+
+ // STATIC DATA -----------------------------------------------------------
+@@ -449,6 +457,7 @@ void ScDocument::TrackFormulas( ULONG nH
+ ScFormulaCell* pTrack;
+ ScFormulaCell* pNext;
+ pTrack = pFormulaTrack;
++ ::std::vector<SCTAB> aTabs;
+ do
+ {
+ ScHint aHint( nHintId, pTrack->aPos, pTrack );
+@@ -458,6 +467,12 @@ void ScDocument::TrackFormulas( ULONG nH
+ // Repaint fuer bedingte Formate mit relativen Referenzen:
+ if ( pCondFormList )
+ pCondFormList->SourceChanged( pTrack->aPos );
++ ::std::vector<SCTAB>::iterator result;
++ result = ::std::find( aTabs.begin(), aTabs.end(), pTrack->aPos.Tab() );
++ if( result == aTabs.end() )
++ {
++ aTabs.push_back( pTrack->aPos.Tab() );
++ }
+ pTrack = pTrack->GetNextTrack();
+ } while ( pTrack );
+ pTrack = pFormulaTrack;
+@@ -480,6 +495,18 @@ void ScDocument::TrackFormulas( ULONG nH
+ else
+ SetForcedFormulaPending( TRUE );
+ }
++
++ ::std::vector<SCTAB>::iterator iter;
++ for( iter = aTabs.begin(); iter != aTabs.end(); iter++ )
++ {
++ uno::Reference< document::XVbaEventsHelper > xVbaEventsHelper ( GetVbaEventsHelper(), uno::UNO_QUERY );
++ if( xVbaEventsHelper.is() )
++ {
++ uno::Sequence< uno::Any > aArgs(1);
++ aArgs[0] <<= *iter;
++ xVbaEventsHelper->ProcessCompatibleVbaEvent( VBAEVENT_WORKSHEET_CALCULATE, aArgs );
++ }
++ }
+ }
+ DBG_ASSERT( nFormulaTrackCount==0, "TrackFormulas: nFormulaTrackCount!=0" );
+ }
+--- sc/source/core/tool/makefile.mk.orig 2008-06-03 14:25:12.000000000 +0800
++++ sc/source/core/tool/makefile.mk 2008-06-03 14:25:19.000000000 +0800
+@@ -158,3 +158,11 @@ $(INCCOM)$/osversiondef.hxx :
+
+ $(SLO)$/interpr5.obj : $(INCCOM)$/osversiondef.hxx
+
++ALLTAR : \
++ $(MISC)$/$(TARGET).don \
++
++$(SLOFILES) : $(MISC)$/$(TARGET).don
++
++$(MISC)$/$(TARGET).don : $(SOLARBINDIR)$/oovbaapi.rdb
++ +$(CPPUMAKER) -O$(INCCOM)$/$(TARGET) -BUCR $(SOLARBINDIR)$/oovbaapi.rdb -X$(SOLARBINDIR)$/types.rdb && echo > $@
++ echo $@
+--- sc/source/ui/docshell/docsh.cxx.orig 2008-06-03 14:24:49.000000000 +0800
++++ sc/source/ui/docshell/docsh.cxx 2008-06-04 10:42:22.000000000 +0800
+@@ -126,6 +126,13 @@
+ #include <rtl/logfile.hxx>
+
+ #include <comphelper/processfactory.hxx>
++#include "uiitems.hxx"
++#include "cellsuno.hxx"
++#include <com/sun/star/document/XVbaEventsHelper.hpp>
++#include <com/sun/star/document/VbaEventId.hpp>
++
++using namespace com::sun::star;
++using namespace com::sun::star::document::VbaEventId;
+
+ using namespace com::sun::star;
+
+@@ -714,9 +721,70 @@ BOOL __EXPORT ScDocShell::Load( SfxMediu
+ return bRet;
+ }
+
++void lcl_processCompatibleSfxHint( uno::Reference< document::XVbaEventsHelper > xVbaEventsHelper, const SfxHint& rHint )
++{
++ if (rHint.ISA(ScTablesHint) )
++ {
++ USHORT nId = ((ScTablesHint&)rHint).GetId();
++ SCTAB nTab = ((ScTablesHint&)rHint).GetTab1();
++ if( nId == SC_TAB_INSERTED )
++ {
++ uno::Sequence< uno::Any > aArgs(1);
++ aArgs[0] <<= nTab;
++ xVbaEventsHelper->ProcessCompatibleVbaEvent( VBAEVENT_WORKBOOK_NEWSHEET, aArgs );
++ }
++ }
++ else if ( rHint.ISA( SfxEventHint ) )
++ {
++ ULONG nEventId = ((SfxEventHint&)rHint).GetEventId();
++ switch ( nEventId )
++ {
++ case SFX_EVENT_ACTIVATEDOC:
++ {
++ uno::Sequence< uno::Any > aArgs;
++ xVbaEventsHelper->ProcessCompatibleVbaEvent( VBAEVENT_WORKBOOK_ACTIVATE, aArgs );
++ }
++ break;
++ case SFX_EVENT_DEACTIVATEDOC:
++ {
++ uno::Sequence< uno::Any > aArgs;
++ xVbaEventsHelper->ProcessCompatibleVbaEvent( VBAEVENT_WORKBOOK_DEACTIVATE, aArgs );
++ }
++ break;
++ case SFX_EVENT_CLOSEDOC :
++ {
++ uno::Sequence< uno::Any > aArgs;
++ xVbaEventsHelper->ProcessCompatibleVbaEvent( VBAEVENT_WORKBOOK_CLOSE, aArgs );
++ }
++ break;
++ case SFX_EVENT_CLOSEVIEW :
++ {
++ uno::Sequence< uno::Any > aArgs;
++ xVbaEventsHelper->ProcessCompatibleVbaEvent( VBAEVENT_WORKBOOK_WINDOWCOLSE, aArgs );
++ }
++ break;
++ case SFX_EVENT_OPENDOC:
++ {
++ // some later than workbook activate.
++ uno::Sequence< uno::Any > aArgs;
++ xVbaEventsHelper->ProcessCompatibleVbaEvent( VBAEVENT_WORKBOOK_OPEN, aArgs );
++ }
++ break;
++ default:
++ {
++ }
++ break;
++ }
++ }
++}
+
+ void __EXPORT ScDocShell::Notify( SfxBroadcaster&, const SfxHint& rHint )
+ {
++ uno::Reference< document::XVbaEventsHelper > xVbaEventsHelper ( aDocument.GetVbaEventsHelper(), uno::UNO_QUERY );
++ if ( xVbaEventsHelper.is() )
++ {
++ lcl_processCompatibleSfxHint( xVbaEventsHelper, rHint );
++ }
+ if (rHint.ISA(SfxSimpleHint)) // ohne Parameter
+ {
+ ULONG nSlot = ((const SfxSimpleHint&)rHint).GetId();
+@@ -2276,6 +2344,16 @@ USHORT __EXPORT ScDocShell::PrepareClose
+
+ DoEnterHandler();
+
++ // start handler for possible veto from DocBefore_Close
++ uno::Sequence< uno::Any > aArgs;
++ uno::Reference< document::XVbaEventsHelper > xVbaEventsHelper ( aDocument.GetVbaEventsHelper(), uno::UNO_QUERY );
++ if ( !IsInPrepareClose() && xVbaEventsHelper.is() )
++ {
++ if ( xVbaEventsHelper->ProcessCompatibleVbaEvent( VBAEVENT_WORKBOOK_BEFORECLOSE, aArgs ) )
++ return sal_False;
++ }
++ // end handler code
++
+ USHORT nRet = SfxObjectShell::PrepareClose( bUI, bForBrowsing );
+ if (nRet == TRUE) // TRUE = schliessen
+ aDocument.DisableIdle(TRUE); // nicht mehr drin rumpfuschen !!!
+@@ -2485,6 +2563,43 @@ void ScDocShell::SetModified( BOOL bModi
+ }
+ }
+
++void ScDocShell::PostContentChanged( const ScRange& rRange )
++{
++// OSL_TRACE("ScDocShell::PostContentChanged. Changed Range Address: nTab1 = %d, nCol1 = %d, nRow1 = %d; nTab2 = %d, nCol2 = %d, nRow2 = %d;", rRange.aStart.Tab(), rRange.aStart.Col(), rRange.aStart.Row(), rRange.aEnd.Tab(), rRange.aEnd.Col(), rRange.aEnd.Row() );
++
++ ScRangeList aList;
++ aList.Append(rRange);
++ PostContentChanged(aList);
++}
++
++void ScDocShell::PostContentChanged( const ScRangeList& rList )
++{
++#if 0
++ String aStr;
++ rList.Format(aStr, SCR_ABS, &aDocument, ScAddress::CONV_XL_A1);
++ fprintf(stdout, "ScDocShell::PostContentChanged: range = '%s'\n",
++ rtl::OUStringToOString(aStr, RTL_TEXTENCODING_UTF8).getStr());
++#endif
++
++ ScCellRangesBase* pObj = NULL;
++ const ScRange& rRange = *(rList.GetObject(0));
++ if( rList.Count() == 1 )
++ {
++ if (rRange.aStart == rRange.aEnd)
++ pObj = new ScCellObj( this, rRange.aStart );
++ else
++ pObj = new ScCellRangeObj( this, rRange );
++ }
++ else
++ pObj = new ScCellRangesObj( this, rList );
++
++ uno::Sequence< uno::Any > aArgs(1);
++ aArgs[0] = uno::makeAny(uno::Reference<uno::XInterface>(static_cast<cppu::OWeakObject*>(pObj)));
++
++ uno::Reference< document::XVbaEventsHelper > xVbaEventsHelper( aDocument.GetVbaEventsHelper(), uno::UNO_QUERY );
++ if ( xVbaEventsHelper.is() )
++ xVbaEventsHelper->ProcessCompatibleVbaEvent( VBAEVENT_WORKSHEET_CHANGE, aArgs );
++}
+
+ void ScDocShell::SetDocumentModified( BOOL bIsModified /* = TRUE */ )
+ {
+--- sc/source/ui/inc/docsh.hxx.orig 2008-06-03 14:24:49.000000000 +0800
++++ sc/source/ui/inc/docsh.hxx 2008-06-03 14:25:19.000000000 +0800
+@@ -47,6 +47,7 @@
+ #include "refreshtimer.hxx"
+
+ #include <hash_map>
++#include <cppuhelper/implbase1.hxx>
+
+ class ScEditEngineDefaulter;
+ class FontList;
+@@ -325,6 +326,8 @@ public:
+ void PostPaintExtras();
+
+ void PostDataChanged();
++ void PostContentChanged( const ScRange& rRange ); // for worsheet/workbook changed event
++ void PostContentChanged( const ScRangeList& rList );
+
+ void UpdatePaintExt( USHORT& rExtFlags, SCCOL nStartCol, SCROW nStartRow, SCTAB nStartTab,
+ SCCOL nEndCol, SCROW nEndRow, SCTAB nEndTab );
+--- sc/source/ui/undo/undoblk3.cxx.orig 2008-06-03 14:25:12.000000000 +0800
++++ sc/source/ui/undo/undoblk3.cxx 2008-06-03 14:25:19.000000000 +0800
+@@ -79,7 +79,17 @@ TYPEINIT1(ScUndoInsertAreaLink, SfxUndo
+ TYPEINIT1(ScUndoRemoveAreaLink, SfxUndoAction);
+ TYPEINIT1(ScUndoUpdateAreaLink, SfxUndoAction);
+
+-
++void lcl_PostContentChanged( ScDocShell* pDocShell, const ScMarkData& rMark, const ScRange& rRange )
++{
++ if (rMark.IsMarked() || rMark.IsMultiMarked())
++ {
++ ScRangeList aList;
++ rMark.FillRangeListWithMarks(&aList, false);
++ pDocShell->PostContentChanged(aList);
++ }
++ else
++ pDocShell->PostContentChanged( rRange );
++}
+ // To Do:
+ /*A*/ // SetOptimalHeight auf Dokument, wenn keine View
+
+@@ -113,6 +123,8 @@ ScUndoDeleteContents::ScUndoDeleteConten
+ aMarkData.SetMarkArea( aRange ); // Zelle unter Cursor markieren
+
+ SetChangeTrack();
++
++ lcl_PostContentChanged( pDocShell, aMarkData, aRange );
+ }
+
+
+@@ -213,6 +225,7 @@ void __EXPORT ScUndoDeleteContents::Undo
+ BeginUndo();
+ DoChange( TRUE );
+ EndUndo();
++ lcl_PostContentChanged( pDocShell, aMarkData, aRange );
+ }
+
+
+@@ -223,6 +236,7 @@ void __EXPORT ScUndoDeleteContents::Redo
+ BeginRedo();
+ DoChange( FALSE );
+ EndRedo();
++ lcl_PostContentChanged( pDocShell, aMarkData, aRange );
+ }
+
+
+--- sc/source/ui/undo/undoblk.cxx.orig 2008-06-03 14:25:12.000000000 +0800
++++ sc/source/ui/undo/undoblk.cxx 2008-06-03 14:25:19.000000000 +0800
+@@ -125,6 +125,7 @@ ScUndoInsertCells::ScUndoInsertCells( Sc
+ }
+
+ SetChangeTrack();
++ pDocShell->PostContentChanged( aEffRange );
+ }
+
+ __EXPORT ScUndoInsertCells::~ScUndoInsertCells()
+@@ -271,6 +272,7 @@ void __EXPORT ScUndoInsertCells::Undo()
+ BeginUndo();
+ DoChange( TRUE );
+ EndUndo();
++ pDocShell->PostContentChanged( aEffRange );
+ }
+
+ void __EXPORT ScUndoInsertCells::Redo()
+@@ -279,6 +281,7 @@ void __EXPORT ScUndoInsertCells::Redo()
+ BeginRedo();
+ DoChange( FALSE );
+ EndRedo();
++ pDocShell->PostContentChanged( aEffRange );
+
+ if ( pPasteUndo )
+ pPasteUndo->Redo(); // redo paste last
+@@ -333,6 +336,7 @@ ScUndoDeleteCells::ScUndoDeleteCells( Sc
+ }
+
+ SetChangeTrack();
++ pDocShell->PostContentChanged( aEffRange );
+ }
+
+ __EXPORT ScUndoDeleteCells::~ScUndoDeleteCells()
+@@ -474,6 +478,7 @@ void __EXPORT ScUndoDeleteCells::Undo()
+ BeginUndo();
+ DoChange( TRUE );
+ EndUndo();
++ pDocShell->PostContentChanged( aEffRange );
+ SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) );
+
+ // Markierung erst nach EndUndo
+@@ -488,6 +493,7 @@ void __EXPORT ScUndoDeleteCells::Redo()
+ BeginRedo();
+ DoChange( FALSE);
+ EndRedo();
++ pDocShell->PostContentChanged( aEffRange );
+ SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) );
+
+ ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
+@@ -714,6 +720,7 @@ ScUndoCut::ScUndoCut( ScDocShell* pNewDo
+ aExtendedRange( aRange )
+ {
+ SetChangeTrack();
++ pDocShell->PostContentChanged( aExtendedRange );
+ }
+
+ __EXPORT ScUndoCut::~ScUndoCut()
+@@ -778,6 +785,7 @@ void __EXPORT ScUndoCut::Undo()
+ BeginUndo();
+ DoChange( TRUE );
+ EndUndo();
++ pDocShell->PostContentChanged( aExtendedRange );
+ }
+
+ void __EXPORT ScUndoCut::Redo()
+@@ -788,6 +796,7 @@ void __EXPORT ScUndoCut::Redo()
+ DoChange( FALSE );
+ EnableDrawAdjust( pDoc, TRUE ); //! include in ScBlockUndo?
+ EndRedo();
++ pDocShell->PostContentChanged( aExtendedRange );
+ }
+
+ void __EXPORT ScUndoCut::Repeat(SfxRepeatTarget& rTarget)
+@@ -839,6 +848,7 @@ ScUndoPaste::ScUndoPaste( ScDocShell* pN
+ aPasteOptions = *pOptions; // used only for Repeat
+
+ SetChangeTrack();
++ pDocShell->PostContentChanged( aBlockRange );
+ }
+
+ __EXPORT ScUndoPaste::~ScUndoPaste()
+@@ -1020,6 +1030,7 @@ void __EXPORT ScUndoPaste::Undo()
+ DoChange( TRUE );
+ ShowTable( aBlockRange );
+ EndUndo();
++ pDocShell->PostContentChanged( aBlockRange );
+ SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) );
+ }
+
+@@ -1031,6 +1042,7 @@ void __EXPORT ScUndoPaste::Redo()
+ DoChange( FALSE );
+ EnableDrawAdjust( pDoc, TRUE ); //! include in ScBlockUndo?
+ EndRedo();
++ pDocShell->PostContentChanged( aBlockRange );
+ SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) );
+ }
+
+--- sc/source/ui/undo/undocell.cxx.orig 2008-06-03 14:25:12.000000000 +0800
++++ sc/source/ui/undo/undocell.cxx 2008-06-03 14:25:19.000000000 +0800
+@@ -214,6 +214,7 @@ ScUndoEnterData::ScUndoEnterData( ScDocS
+ nCount( nNewCount )
+ {
+ SetChangeTrack();
++ pDocShell->PostContentChanged( ScRange( ScAddress( nCol, nRow, nTab ) ) );
+ }
+
+ __EXPORT ScUndoEnterData::~ScUndoEnterData()
+@@ -319,6 +320,7 @@ void __EXPORT ScUndoEnterData::Undo()
+
+ DoChange();
+ EndUndo();
++ pDocShell->PostContentChanged( ScRange( ScAddress( nCol, nRow, nTab ) ) );
+ }
+
+ void __EXPORT ScUndoEnterData::Redo()
+@@ -340,6 +342,7 @@ void __EXPORT ScUndoEnterData::Redo()
+
+ DoChange();
+ EndRedo();
++ pDocShell->PostContentChanged( ScRange( ScAddress( nCol, nRow, nTab ) ) );
+ }
+
+ void __EXPORT ScUndoEnterData::Repeat(SfxRepeatTarget& rTarget)
+@@ -371,6 +374,7 @@ ScUndoEnterValue::ScUndoEnterValue( ScDo
+ bNeedHeight ( bHeight )
+ {
+ SetChangeTrack();
++ pDocShell->PostContentChanged( ScRange( aPos ) );
+ }
+
+ __EXPORT ScUndoEnterValue::~ScUndoEnterValue()
+@@ -425,6 +429,7 @@ void __EXPORT ScUndoEnterValue::Undo()
+ pChangeTrack->Undo( nEndChangeAction, nEndChangeAction );
+
+ EndUndo();
++ pDocShell->PostContentChanged( ScRange( aPos ) );
+ }
+
+ void __EXPORT ScUndoEnterValue::Redo()
+@@ -438,6 +443,7 @@ void __EXPORT ScUndoEnterValue::Redo()
+ SetChangeTrack();
+
+ EndRedo();
++ pDocShell->PostContentChanged( ScRange( aPos ) );
+ }
+
+ void __EXPORT ScUndoEnterValue::Repeat(SfxRepeatTarget& /* rTarget */)
+@@ -465,6 +471,7 @@ ScUndoPutCell::ScUndoPutCell( ScDocShell
+ bNeedHeight ( bHeight )
+ {
+ SetChangeTrack();
++ pDocShell->PostContentChanged( ScRange( aPos ) );
+ }
+
+ __EXPORT ScUndoPutCell::~ScUndoPutCell()
+@@ -521,6 +528,7 @@ void __EXPORT ScUndoPutCell::Undo()
+ pChangeTrack->Undo( nEndChangeAction, nEndChangeAction );
+
+ EndUndo();
++ pDocShell->PostContentChanged( ScRange( aPos ) );
+ }
+
+ void __EXPORT ScUndoPutCell::Redo()
+@@ -549,6 +557,7 @@ void __EXPORT ScUndoPutCell::Redo()
+ SetChangeTrack();
+
+ EndRedo();
++ pDocShell->PostContentChanged( ScRange( aPos ) );
+ }
+
+ void __EXPORT ScUndoPutCell::Repeat(SfxRepeatTarget& /* rTarget */)
+--- sc/source/ui/unoobj/viewuno.cxx.orig 2008-06-03 14:25:12.000000000 +0800
++++ sc/source/ui/unoobj/viewuno.cxx 2008-06-03 14:25:19.000000000 +0800
+@@ -71,8 +71,12 @@
+ #include "gridwin.hxx"
+ #include <com/sun/star/view/DocumentZoomType.hpp>
+ #include "AccessibilityHints.hxx"
++#include <com/sun/star/awt/MouseButton.hpp>
++#include <com/sun/star/document/XVbaEventsHelper.hpp>
++#include <com/sun/star/document/VbaEventId.hpp>
+
+ using namespace com::sun::star;
++using namespace com::sun::star::document::VbaEventId;
+
+ //------------------------------------------------------------------------
+
+@@ -480,7 +484,6 @@ ScTabViewObj::ScTabViewObj( ScTabViewShe
+ aActivationListeners( 0 ),
+ bDrawSelModeSet(sal_False)
+ {
+- //! Listening oder so
+ }
+
+ ScTabViewObj::~ScTabViewObj()
+@@ -1206,36 +1209,67 @@ sal_Bool ScTabViewObj::MousePressed( con
+ {
+ sal_Bool bReturn(sal_False);
+
+- if (aMouseClickHandlers.Count())
+- {
+- uno::Reference< uno::XInterface > xTarget = GetClickedObject(Point(e.X, e.Y));
++ uno::Reference< uno::XInterface > xTarget = GetClickedObject(Point(e.X, e.Y));
+
+- if (xTarget.is())
+- {
+- awt::EnhancedMouseEvent aMouseEvent;
++ if (xTarget.is())
++ {
++ // Handle BeforeDoubleClick and BeforeRightClick events
++ uno::Reference<table::XCell> xCell( xTarget, uno::UNO_QUERY );
++ if( xCell.is() )
++ {
++ ScTabViewShell* pViewSh = GetViewShell();
++ if ( pViewSh )
++ {
++ ScViewData* pViewData = pViewSh->GetViewData();
++ if ( pViewData )
++ {
++ if( e.ClickCount == 2 || e.Buttons == ::com::sun::star::awt::MouseButton::RIGHT )
++ {
++ uno::Reference< document::XVbaEventsHelper > xVbaEventsHelper( pViewData->GetDocument()->GetVbaEventsHelper(), uno::UNO_QUERY );
++ if( xVbaEventsHelper.is() )
++ {
++ uno::Sequence< uno::Any > aArgs(2);
++ sal_Bool bCancel = sal_False;
++ aArgs[0] = getSelection();
++ aArgs[1] <<= bCancel;
++
++ USHORT nEvent = VBAEVENT_WORKSHEET_BEFORERIGHTCLICK;
++ if( e.ClickCount == 2 )
++ nEvent = VBAEVENT_WORKSHEET_BEFOREDOUBLECLICK;
++ xVbaEventsHelper->ProcessCompatibleVbaEvent( nEvent, aArgs );
++
++ // TODO... handle the cancel argument
++ aArgs[1] >>= bCancel;
++ }
++ }
++ }
++ }
++ }
++
++ awt::EnhancedMouseEvent aMouseEvent;
+
+- aMouseEvent.Buttons = e.Buttons;
+- aMouseEvent.X = e.X;
+- aMouseEvent.Y = e.Y;
+- aMouseEvent.ClickCount = e.ClickCount;
+- aMouseEvent.PopupTrigger = e.PopupTrigger;
+- aMouseEvent.Target = xTarget;
++ aMouseEvent.Buttons = e.Buttons;
++ aMouseEvent.X = e.X;
++ aMouseEvent.Y = e.Y;
++ aMouseEvent.ClickCount = e.ClickCount;
++ aMouseEvent.PopupTrigger = e.PopupTrigger;
++ aMouseEvent.Target = xTarget;
+
+- for ( USHORT n=0; n<aMouseClickHandlers.Count(); n++ )
++ for ( USHORT n=0; n<aMouseClickHandlers.Count(); n++ )
++ {
++ try
+ {
+- try
+- {
+- if (!(*aMouseClickHandlers[n])->mousePressed( aMouseEvent ))
+- bReturn = sal_True;
+- }
+- catch ( uno::Exception& )
+- {
+- aMouseClickHandlers.DeleteAndDestroy(n);
+- --n; // because it will be increased again in the loop
+- }
++ if (!(*aMouseClickHandlers[n])->mousePressed( aMouseEvent ))
++ bReturn = sal_True;
++ }
++ catch ( uno::Exception& )
++ {
++ aMouseClickHandlers.DeleteAndDestroy(n);
++ --n; // because it will be increased again in the loop
+ }
+ }
+ }
++
+ return bReturn;
+ }
+
+@@ -1709,6 +1743,22 @@ void SAL_CALL ScTabViewObj::removeSelect
+
+ void ScTabViewObj::SelectionChanged()
+ {
++ ScTabViewShell* pViewSh = GetViewShell();
++ if ( pViewSh )
+ {
++ ScViewData* pViewData = pViewSh->GetViewData();
++ if ( pViewData )
++ {
++ uno::Reference< document::XVbaEventsHelper > xVbaEventsHelper( pViewData->GetDocument()->GetVbaEventsHelper(), uno::UNO_QUERY );
++ if( xVbaEventsHelper.is() )
++ {
++ uno::Sequence< uno::Any > aArgs(1);
++ aArgs[0] = getSelection();
++ xVbaEventsHelper->ProcessCompatibleVbaEvent( VBAEVENT_WORKSHEET_SELECTIONCHANGE, aArgs );
++ }
++ }
+ }
-+ return uno::Any();
-+}
+
-+sal_Bool ScVbaEventsHelper::addDocEvent( SfxObjectShell* pShell, const String& sEvt, const String& sOpenMacro )
+ lang::EventObject aEvent;
+ aEvent.Source.set(static_cast<cppu::OWeakObject*>(this));
+ for ( USHORT n=0; n<aSelectionListeners.Count(); n++ )
+--- sc/source/ui/unoobj/docuno.cxx.orig 2008-06-03 14:25:12.000000000 +0800
++++ sc/source/ui/unoobj/docuno.cxx 2008-06-03 16:01:07.000000000 +0800
+@@ -92,7 +92,12 @@
+ #include "rangeutl.hxx"
+ #include "ViewSettingsSequenceDefines.hxx"
+
++#define BEFORE 0
++#define AFTER 1
++#include <com/sun/star/document/XVbaEventsHelper.hpp>
++#include <com/sun/star/document/VbaEventId.hpp>
+ using namespace com::sun::star;
++using namespace com::sun::star::document::VbaEventId;
+
+ //------------------------------------------------------------------------
+
+@@ -329,6 +334,7 @@ uno::Any SAL_CALL ScModelObj::queryInter
+ SC_QUERYINTERFACE( document::XLinkTargetSupplier )
+ SC_QUERYINTERFACE( beans::XPropertySet )
+ SC_QUERYINTERFACE( document::XCodeNameQuery )
++ SC_QUERYINTERFACE( document::XDocumentEventCompatibleHelper)
+ SC_QUERYINTERFACE( lang::XMultiServiceFactory )
+ SC_QUERYINTERFACE( lang::XServiceInfo )
+
+@@ -1730,6 +1736,52 @@ ScModelObj::getCodeNameForObject( const
+ // Probably should throw here ( if !bMatched )
+ return sCodeName;
+ }
++// XVbaEventHelper
++// For Vba Event
++// status, 0 before, 1 done...
++sal_Bool SAL_CALL
++ScModelObj::processCompatibleEvent( sal_Int16 nStatus, sal_Int16 nSlotId ) throw( ::com::sun::star::uno::RuntimeException )
+{
-+ sal_Bool result = sal_False;
-+ const rtl::OUString sUrl = sUrlPart0.concat( sOpenMacro ).concat( sUrlPart2 );
-+ const static rtl::OUString sEvtType( RTL_CONSTASCII_USTRINGPARAM("EventType") );
-+ const static rtl::OUString sScript( RTL_CONSTASCII_USTRINGPARAM("Script") );
-+ uno::Reference< document::XEventsSupplier > xEvtSupplier( pShell->GetModel(), uno::UNO_QUERY );
-+
-+ if ( xEvtSupplier.is() )
-+ {
-+ uno::Reference< container::XNameReplace > xEvts( xEvtSupplier->getEvents(), uno::UNO_QUERY );
-+ if ( xEvts.is() )
-+ {
-+ if( xEvts->hasByName( sEvt ) )
++ USHORT nId = nSlotId;
++ uno::Reference< document::XVbaEventsHelper > xVbaEventsHelper( GetDocument()->GetVbaEventsHelper(), uno::UNO_QUERY );
++ if( xVbaEventsHelper.is() )
++ {
++ switch( nId )
++ {
++ case SID_SAVEDOC:
++ {
++ if( nStatus == BEFORE )
++ {
++ uno::Sequence< uno::Any > aArgs(1);
++ aArgs[0] <<= sal_False;
++ return xVbaEventsHelper->ProcessCompatibleVbaEvent( VBAEVENT_WORKBOOK_BEFORESAVE, aArgs );
++ }
++ break;
++ }
++ case SID_SAVEASDOC:
++ {
++ if( nStatus == BEFORE )
++ {
++ uno::Sequence< uno::Any > aArgs(1);
++ aArgs[0] <<= sal_True;
++ return xVbaEventsHelper->ProcessCompatibleVbaEvent( VBAEVENT_WORKBOOK_BEFORESAVE, aArgs );
++ }
++ break;
++ }
++ case SID_PRINTDOC:
++ case SID_PRINTDOCDIRECT:
+ {
-+ if( !xEvts->getByName( sEvt ).hasValue() )
++ if( nStatus == BEFORE )
+ {
-+ uno::Sequence< beans::PropertyValue > aEvt( 2 );
-+ aEvt[ 0 ].Name = sEvtType;
-+ aEvt[ 0 ].Value = uno::makeAny(sScript);
-+ aEvt[ 1 ].Name = sScript;
-+ aEvt[ 1 ].Value = uno::makeAny(sUrl);
-+
-+ uno::Any aParam = uno::makeAny( aEvt );
-+ xEvts->replaceByName( sEvt, aParam );
-+ result = sal_True;
++ uno::Sequence< uno::Any > aArgs;
++ return xVbaEventsHelper->ProcessCompatibleVbaEvent( VBAEVENT_WORKBOOK_BEFOREPRINT, aArgs );
+ }
++ break;
+ }
-+ }
++ }
+ }
-+ return result;
++ return sal_False;
+}
+ // XServiceInfo
+
+ rtl::OUString SAL_CALL ScModelObj::getImplementationName() throw(uno::RuntimeException)
+--- sc/inc/docuno.hxx.orig 2008-06-03 14:25:12.000000000 +0800
++++ sc/inc/docuno.hxx 2008-06-03 14:25:19.000000000 +0800
+@@ -55,6 +55,7 @@
+ #include <com/sun/star/sheet/XSheetAnnotations.hpp>
+ #include <com/sun/star/beans/XPropertySet.hpp>
+ #include <com/sun/star/sheet/XCellRangesAccess.hpp>
++#include <com/sun/star/document/XDocumentEventCompatibleHelper.hpp>
+ #include <cppuhelper/implbase2.hxx>
+ #include <cppuhelper/implbase3.hxx>
+ #include <cppuhelper/implbase4.hxx>
+@@ -89,6 +90,7 @@ class SC_DLLPUBLIC ScModelObj : public S
+ public com::sun::star::document::XLinkTargetSupplier,
+ public com::sun::star::beans::XPropertySet,
+ public com::sun::star::document::XCodeNameQuery,
++ public com::sun::star::document::XDocumentEventCompatibleHelper,
+ public SvxFmMSFactory, // derived from XMultiServiceFactory
+ public com::sun::star::lang::XServiceInfo
+ {
+@@ -303,6 +305,8 @@ public:
+ throw(::com::sun::star::uno::RuntimeException);
+ virtual rtl::OUString SAL_CALL getCodeNameForObject( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& aObj )
+ throw(::com::sun::star::uno::RuntimeException);
++ // XVbaEventHelper
++ virtual sal_Bool SAL_CALL processCompatibleEvent( sal_Int16 nStatus, sal_Int16 nEventId ) throw (::com::sun::star::uno::RuntimeException);
+ };
+
+
+--- sc/source/ui/view/gridwin.cxx.orig 2008-06-03 14:24:49.000000000 +0800
++++ sc/source/ui/view/gridwin.cxx 2008-06-03 14:25:19.000000000 +0800
+@@ -150,7 +150,13 @@
+ #include <svx/sdr/overlay/overlaymanager.hxx>
+ #include <vcl/svapp.hxx>
+
++#include "cellsuno.hxx"
+
++#include <com/sun/star/document/XVbaEventsHelper.hpp>
++#include <com/sun/star/document/VbaEventId.hpp>
+
-+sal_Bool ScVbaEventsHelper::processDocActivateMacro( SfxObjectShell* pShell )
-+{
-+ sal_Bool result = sal_True;
-+ const static rtl::OUString sAtctivateMacro( RTL_CONSTASCII_USTRINGPARAM("Workbook_Activate") );
-+ const static rtl::OUString sOnFocusEvt( RTL_CONSTASCII_USTRINGPARAM("OnFocus") );
-+ rtl::OUString sWorkbookModule = getWorkbookModuleName();
-+ String sFullOnFocus = docMacroExists( pShell, sWorkbookModule, sAtctivateMacro );
-+ if( sFullOnFocus.Len() > 0 )
-+ {
-+ if( !addDocEvent( pShell, sOnFocusEvt, sFullOnFocus ) )
-+ return sal_False;
-+ }
-+ return result;
-+}
-+
-+sal_Bool ScVbaEventsHelper::processDocDeactivateMacro( SfxObjectShell* pShell )
+ using namespace com::sun::star;
++using namespace com::sun::star::document::VbaEventId;
+ using ::com::sun::star::uno::Sequence;
+ using ::com::sun::star::uno::Any;
+
+@@ -399,6 +405,32 @@ void lcl_UnLockComment( SdrView* pView,
+
+ }
+
++sal_Bool lcl_GetHyperlinkCell(ScDocument* pDoc, SCCOL& rPosX, SCROW& rPosY, SCTAB nTab, ScBaseCell*& rpCell )
+{
-+ sal_Bool result = sal_True;
-+ const static rtl::OUString sDeatctivateMacro( RTL_CONSTASCII_USTRINGPARAM("Workbook_Deactivate") );
-+ const static rtl::OUString sOnFocusEvt( RTL_CONSTASCII_USTRINGPARAM("OnUnfocus") );
-+ rtl::OUString sWorkbookModule = getWorkbookModuleName();
-+ String sFullUnOnfocus = docMacroExists( pShell, sWorkbookModule, sDeatctivateMacro );
-+ if( sFullUnOnfocus.Len() > 0 )
-+ {
-+ if( !addDocEvent( pShell, sOnFocusEvt, sFullUnOnfocus ) )
-+ return sal_False;
-+ }
-+ return result;
-+}
++ BOOL bFound = FALSE;
++ do
++ {
++ pDoc->GetCell( rPosX, rPosY, nTab, rpCell );
++ if ( !rpCell || rpCell->GetCellType() == CELLTYPE_NOTE )
++ {
++ if ( rPosX <= 0 )
++ return FALSE; // alles leer bis links
++ else
++ --rPosX; // weitersuchen
++ }
++ else if ( rpCell->GetCellType() == CELLTYPE_EDIT)
++ bFound = TRUE;
++ else if (rpCell->GetCellType() == CELLTYPE_FORMULA &&
++ static_cast<ScFormulaCell*>(rpCell)->IsHyperLinkCell())
++ bFound = TRUE;
++ else
++ return FALSE; // andere Zelle
++ }
++ while ( !bFound );
+
-+void ScVbaEventsHelper::processDocDeactivateMacroRun( SfxObjectShell* pShell )
-+{
-+ uno::Any aRet;
-+ uno::Sequence< uno::Any > aArgs;
-+ const static String sDeactivate( RTL_CONSTASCII_USTRINGPARAM("Workbook_Deactivate") );
-+ rtl::OUString sWorkbookModule = getWorkbookModuleName();
-+ String sDeactivateMacro = docMacroExists( pShell, sWorkbookModule, sDeactivate );
-+ if ( sDeactivateMacro.Len() > 0 )
-+ {
-+ executeWorkBookMacro( pShell, sDeactivateMacro, aArgs, aRet );
-+ }
++ return bFound;
+}
+
-+void ScVbaEventsHelper::processSfxEventHint( const SfxEventHint& rHint )
-+{
-+ SfxObjectShell* pShell = pDoc->GetDocumentShell();
-+ if( !pShell )
-+ return;
-+ ULONG nEventId = rHint.GetEventId();
-+ const static String sWindowActivate( RTL_CONSTASCII_USTRINGPARAM("Workbook_WindowActivate") );
-+ const static String sWindowDeactivate( RTL_CONSTASCII_USTRINGPARAM("Workbook_WindowDeactivate") );
-+ switch( nEventId )
-+ {
-+ case SFX_EVENT_ACTIVATEDOC :
-+ processWindowMacro( sWindowActivate );
-+ break;
-+ case SFX_EVENT_DEACTIVATEDOC :
-+ // it will be called when close the doc. but will not launch the macro.
-+ processWindowMacro( sWindowDeactivate );
-+ break;
-+ case SFX_EVENT_CLOSEDOC :
-+ // the macro will not be called at this time, because of the doc has died.
-+ //processDocDeactivateMacroRun( pShell );
-+ break;
-+ case SFX_EVENT_CLOSEVIEW :
-+ processWindowMacro( sWindowDeactivate );
-+ // does Doc be closed surely?
-+ processDocDeactivateMacroRun( pShell );
-+ break;
-+ case SFX_EVENT_OPENDOC :
-+ {
-+ //VbaWindowListener* pListener = new VbaWindowListener( this );
-+ //pListener->startWindowLinstener();
-+ break;
-+ }
-+ default:
-+ break;
-+ }
-+}
+ //==================================================================
+
+ // WB_DIALOGCONTROL noetig fuer UNO-Controls
+@@ -1443,6 +1475,7 @@ void ScGridWindow::HandleMouseButtonDown
+ SCCOL nOldColFBox = bWasFilterBox ? pFilterBox->GetCol() : 0;
+ SCROW nOldRowFBox = bWasFilterBox ? pFilterBox->GetRow() : 0;
+ #endif
++#include "cellsuno.hxx"
+
+ ClickExtern(); // loescht FilterBox, wenn vorhanden
+
+@@ -2123,6 +2156,26 @@ void __EXPORT ScGridWindow::MouseButtonU
+ {
+ nMouseStatus = SC_GM_NONE; // keinen Doppelklick anfangen
+ ScGlobal::OpenURL( aUrl, aTarget );
++
++ // fire worksheet_followhyperlink event
++ Point aPos = rMEvt.GetPosPixel();
++ SCsCOL nPosX;
++ SCsROW nPosY;
++ SCTAB nTab = pViewData->GetTabNo();
++ pViewData->GetPosFromPixel( aPos.X(), aPos.Y(), eWhich, nPosX, nPosY );
++ ScBaseCell* pCell = NULL;
+
-+sal_Bool ScVbaEventsHelper::processDocBeforeSaveMacro( sal_Bool bSaveAsUI )
-+{
-+ SfxObjectShell* pShell = pDoc->GetDocumentShell();
-+ if( !pShell )
-+ return sal_False;
-+
-+ uno::Any aRet;
-+ uno::Sequence< uno::Any > aArgs( 2 );
-+ sal_Bool bCancel = sal_False;
-+ aArgs[ 0 ] <<= bSaveAsUI;
-+ aArgs[ 1 ] <<= bCancel;
-+ const static String sBeforeClose( RTL_CONSTASCII_USTRINGPARAM("Workbook_BeforeSave") );
-+ rtl::OUString workbookModule = getWorkbookModuleName();
-+ String sFullClose = docMacroExists( pShell, workbookModule, sBeforeClose );
-+ if ( sFullClose.Len() > 0 )
-+ {
-+ if ( !executeWorkBookMacro( pShell, sFullClose, aArgs, aRet ) )
-+ return sal_False;
-+ }
-+ aArgs[ 1 ] >>= bCancel;
-+ return bCancel;
-+}
++ BOOL bFound = lcl_GetHyperlinkCell( pDoc, nPosX, nPosY, nTab, pCell );
++ if( bFound )
++ {
++ ScAddress aCellPos( nPosX, nPosY, nTab );
++ ScCellObj* pObj = new ScCellObj( pViewData->GetDocShell(), aCellPos );
++ uno::Sequence< uno::Any > aArgs(1);
++ aArgs[0] = uno::makeAny(uno::Reference<uno::XInterface>(static_cast<cppu::OWeakObject*>(pObj)));
++ uno::Reference< document::XVbaEventsHelper > xVbaEventsHelper ( pViewData->GetDocument()->GetVbaEventsHelper(), uno::UNO_QUERY );
++ if( xVbaEventsHelper.is() )
++ xVbaEventsHelper->ProcessCompatibleVbaEvent( VBAEVENT_WORKSHEET_FOLLOWHYPERLINK, aArgs );
++ }
+ return;
+ }
+ }
+@@ -2442,13 +2495,13 @@ long ScGridWindow::PreNotify( NotifyEven
+ if (xController.is())
+ {
+ ScTabViewObj* pImp = ScTabViewObj::getImplementation( xController );
+- if (pImp && pImp->IsMouseListening())
++ if (pImp)
+ {
+ ::com::sun::star::awt::MouseEvent aEvent;
+ lcl_InitMouseEvent( aEvent, *rNEvt.GetMouseEvent() );
+ if ( rNEvt.GetWindow() )
+ aEvent.Source = rNEvt.GetWindow()->GetComponentInterface();
+- if ( nType == EVENT_MOUSEBUTTONDOWN)
++ if ( nType == EVENT_MOUSEBUTTONDOWN )
+ pImp->MousePressed( aEvent );
+ else
+ pImp->MouseReleased( aEvent );
+@@ -4858,26 +4911,9 @@ BOOL ScGridWindow::GetEditUrlOrError( BO
+ ScDocument* pDoc = pDocSh->GetDocument();
+ ScBaseCell* pCell = NULL;
+
+- BOOL bFound = FALSE;
+- do
+- {
+- pDoc->GetCell( nPosX, nPosY, nTab, pCell );
+- if ( !pCell || pCell->GetCellType() == CELLTYPE_NOTE )
+- {
+- if ( nPosX <= 0 )
+- return FALSE; // alles leer bis links
+- else
+- --nPosX; // weitersuchen
+- }
+- else if ( pCell->GetCellType() == CELLTYPE_EDIT)
+- bFound = TRUE;
+- else if (pCell->GetCellType() == CELLTYPE_FORMULA &&
+- static_cast<ScFormulaCell*>(pCell)->IsHyperLinkCell())
+- bFound = TRUE;
+- else
+- return FALSE; // andere Zelle
+- }
+- while ( !bFound );
++ BOOL bFound = lcl_GetHyperlinkCell( pDoc, nPosX, nPosY, nTab, pCell );
++ if( !bFound )
++ return FALSE;
+
+ ScHideTextCursor aHideCursor( pViewData, eWhich ); // before GetEditArea (MapMode is changed)
+
+--- sc/source/ui/view/tabview3.cxx.orig 2008-06-03 14:24:49.000000000 +0800
++++ sc/source/ui/view/tabview3.cxx 2008-06-03 14:25:19.000000000 +0800
+@@ -82,6 +82,10 @@
+ #include "client.hxx"
+
+ #include <com/sun/star/chart2/data/HighlightedRange.hpp>
++#include <com/sun/star/document/XVbaEventsHelper.hpp>
++#include <com/sun/star/document/VbaEventId.hpp>
+
-+sal_Bool ScVbaEventsHelper::processDocOpenMacro( SfxObjectShell* pShell )
-+{
-+ sal_Bool result = sal_True;
-+ // no point adding a handler for unless it exists
-+ // probably worth just doing this on import of xl document
-+
++using namespace com::sun::star::document::VbaEventId;
+
+ namespace
+ {
+@@ -1685,6 +1689,17 @@ void ScTabView::SetTabNo( SCTAB nTab, BO
+ // nicht InputEnterHandler wegen Referenzeingabe !
+
+ ScDocument* pDoc = aViewData.GetDocument();
++ if( !bNew )
++ {
++ uno::Reference< document::XVbaEventsHelper > xVbaEventsHelper ( pDoc->GetVbaEventsHelper(), uno::UNO_QUERY );
++ if( xVbaEventsHelper.is() )
++ {
++ uno::Sequence< uno::Any > aArgs(1);
++ aArgs[0] <<= aViewData.GetTabNo();
++ xVbaEventsHelper->ProcessCompatibleVbaEvent( VBAEVENT_WORKSHEET_DEACTIVATE, aArgs );
++ }
++ }
++
+ pDoc->MakeTable( nTab );
+
+ SCTAB nTabCount = pDoc->GetTableCount();
+@@ -1783,7 +1798,18 @@ void ScTabView::SetTabNo( SCTAB nTab, BO
+ if ( pGridWin[i]->IsVisible() )
+ pGridWin[i]->UpdateEditViewPos();
+ }
+-
+
-+ // Urk due to async nature, re-enterency and other horrors of the load
-+ // process, its seems the most sensible thing is to hook into the
-+ // document event broadcaster
-+ const static rtl::OUString sOpenMacro( RTL_CONSTASCII_USTRINGPARAM("Workbook_Open") );
-+ const static rtl::OUString sAuto_OpenMacro( RTL_CONSTASCII_USTRINGPARAM("auto_open") );
-+ const static rtl::OUString sOnLoadEvt( RTL_CONSTASCII_USTRINGPARAM("OnLoad") );
-+
-+ // until ObjectModules ( and persisting of codename ) are supported if this is a
-+ // document saved from XL then we won't be able to determine the codename for the Workbook
-+ // Module, so... we have no choice but to search all modules for the moment
-+ rtl::OUString workbookModule = getWorkbookModuleName();
-+ String sFullOpen = docMacroExists( pShell, workbookModule, sOpenMacro );
-+ if ( sFullOpen.Len() > 0 )
-+ {
-+ if ( !addDocEvent( pShell, sOnLoadEvt, sFullOpen ) )
-+ return sal_False;
-+ }
-+ // deep sigh, you can only specify one event binding not multiple ones, thats crap
-+/*
-+ String sFullAuto = docMacroExists( pShell, workbookModule, sAuto_OpenMacro );
-+ if ( sFullAuto.Len() > 0 )
++ if( !bNew )
+ {
-+ if ( !addOpenDocEvent( xEvts, sFullAuto ) )
-+ return sal_False;
++ uno::Reference< document::XVbaEventsHelper > xVbaEventsHelper ( pDoc->GetVbaEventsHelper(), uno::UNO_QUERY );
++ if( xVbaEventsHelper.is() )
++ {
++ uno::Sequence< uno::Any > aArgs(1);
++ aArgs[0] <<= aViewData.GetTabNo();
++ xVbaEventsHelper->ProcessCompatibleVbaEvent( VBAEVENT_WORKSHEET_ACTIVATE, aArgs );
++ }
+ }
-+*/
-+
-+ return result;
-+}
-+sal_Bool ScVbaEventsHelper::processDocMacro()
-+{
-+ SfxObjectShell* pShell = pDoc->GetDocumentShell();
-+ if( !pShell )
-+ return sal_False;
-+ sal_Bool result = sal_True;
-+ if ( !processDocOpenMacro( pShell ) )
-+ result = sal_False;
-+ if( !processDocActivateMacro( pShell ) )
-+ result = sal_False;
-+ if( !processDocDeactivateMacro( pShell ) )
-+ result = sal_False;
-+
-+ return result;
-+}
-+
---- /data4/sles/ooo-mLnew/ooo-build/build/ooc680-m2/sfx2/inc/objsh.hxx 2006-05-02 17:01:46.000000000 +0100
-+++ sfx2/inc/sfx2/objsh.hxx 2006-06-02 13:29:01.000000000 +0100
-@@ -427,7 +427,8 @@ public:
++
+ TabChanged(); // DrawView
+ aViewData.GetViewShell()->WindowChanged(); // falls das aktive Fenster anders ist
+ if ( !bUnoRefDialog )
+--- sc/source/ui/vba/makefile.mk.orig 2008-06-03 14:24:59.000000000 +0800
++++ sc/source/ui/vba/makefile.mk 2008-06-03 14:25:28.000000000 +0800
+@@ -127,6 +127,7 @@ SLOFILES= \
+ $(SLO)$/vbacommandbars.obj \
+ $(SLO)$/vbahyperlink.obj \
+ $(SLO)$/vbapagesetup.obj \
++ $(SLO)$/vbaeventshelper.obj \
+ $(SLO)$/service.obj \
+
+
+--- sfx2/inc/sfx2/objsh.hxx.orig 2008-06-04 11:30:47.000000000 +0800
++++ sfx2/inc/sfx2/objsh.hxx 2008-06-04 10:41:41.000000000 +0800
+@@ -304,6 +304,7 @@ public:
+ void SetNoName();
+ sal_Bool IsInModalMode() const;
+ sal_Bool HasModalViews() const;
++ sal_Bool IsInPrepareClose() const;
+ sal_Bool IsHelpDocument() const;
+
+ sal_Bool IsDocShared() const;
+@@ -403,7 +404,8 @@ public:
const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aParams,
::com::sun::star::uno::Any& aRet,
::com::sun::star::uno::Sequence< sal_Int16 >& aOutParamIndex,
@@ -1838,7 +2463,7 @@
);
static ErrCode CallXScript(
-@@ -455,7 +455,8 @@ public:
+@@ -412,7 +414,8 @@ public:
const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aParams,
::com::sun::star::uno::Any& aRet,
::com::sun::star::uno::Sequence< sal_Int16 >& aOutParamIndex,
@@ -1848,9 +2473,9 @@
);
/** adjusts the internal macro mode, according to the current security settings
---- /data4/sles/ooo-mLnew/ooo-build/build/ooc680-m2/sfx2/source/doc/objmisc.cxx 2006-05-22 08:25:06.000000000 +0100
-+++ sfx2/source/doc/objmisc.cxx 2006-06-02 13:29:02.000000000 +0100
-@@ -1515,7 +1515,7 @@
+--- sfx2/source/doc/objmisc.cxx.orig 2008-06-04 11:20:37.000000000 +0800
++++ sfx2/source/doc/objmisc.cxx 2008-06-03 18:53:21.000000000 +0800
+@@ -1591,7 +1591,7 @@ namespace
}
ErrCode SfxObjectShell::CallXScript( const Reference< XInterface >& _rxScriptContext, const ::rtl::OUString& _rScriptURL,
@@ -1859,7 +2484,7 @@
{
OSL_TRACE( "in CallXScript" );
ErrCode nErr = ERRCODE_NONE;
-@@ -1556,7 +1556,7 @@ ErrCode SfxObjectShell::CallXScript( con
+@@ -1632,7 +1632,7 @@ ErrCode SfxObjectShell::CallXScript( con
nErr = ERRCODE_BASIC_INTERNAL_ERROR;
}
@@ -1868,7 +2493,7 @@
{
::std::auto_ptr< VclAbstractDialog > pScriptErrDlg;
SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create();
-@@ -1580,9 +1580,9 @@ ErrCode SfxObjectShell::CallXScript( con
+@@ -1656,9 +1656,9 @@ ErrCode SfxObjectShell::CallXScript( con
::com::sun::star::uno::Any& aRet,
::com::sun::star::uno::Sequence< sal_Int16 >& aOutParamIndex,
::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >&
@@ -1880,21 +2505,9 @@
}
//-------------------------------------------------------------------------
---- sfx2/inc/sfx2/objsh.hxx.bak 2008-04-07 16:25:30.000000000 +0800
-+++ sfx2/inc/sfx2/objsh.hxx 2008-04-07 16:27:16.000000000 +0800
-@@ -315,6 +315,9 @@ public:
- sal_Bool Stamp_GetPrintCancelState() const;
-
- using SotObject::GetInterface;
-+ // status, 0 before, 1 done...
-+ virtual sal_Bool processVbaEvents( USHORT nStatus, USHORT nSlotId )
-+ { (void)nSlotId; (void)nStatus; return sal_False; }
-
- // Document-Shell Iterator
- static SfxObjectShell* GetFirst( const TypeId* pType = 0,
---- sfx2/source/doc/objserv.cxx.orig 2008-04-03 16:06:37.000000000 +0800
-+++ sfx2/source/doc/objserv.cxx 2008-04-07 16:27:16.000000000 +0800
-@@ -33,6 +33,8 @@
+--- sfx2/source/doc/objserv.cxx.orig 2008-06-03 14:24:49.000000000 +0800
++++ sfx2/source/doc/objserv.cxx 2008-06-03 14:25:19.000000000 +0800
+@@ -28,6 +28,8 @@
*
************************************************************************/
@@ -1903,24 +2516,36 @@
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sfx2.hxx"
-@@ -596,6 +598,14 @@ void SfxObjectShell::ExecFile_Impl(SfxRe
+@@ -109,6 +111,7 @@
+ #include <com/sun/star/document/XDocumentInfo.hpp>
+ #include <com/sun/star/document/XDocumentInfoSupplier.hpp>
+ #include <com/sun/star/document/XDocumentProperties.hpp>
++#include <com/sun/star/document/XDocumentEventCompatibleHelper.hpp>
+
+ #ifndef _SFX_HELPID_HRC
+ #include "helpid.hrc"
+@@ -522,6 +525,18 @@ void SfxObjectShell::ExecFile_Impl(SfxRe
case SID_SAVEASDOC:
case SID_SAVEDOC:
{
+ if( nId == SID_SAVEDOC || nId == SID_SAVEASDOC )
+ {
-+ if( processVbaEvents( BEFORE, nId ) )
++ uno::Reference< document::XDocumentEventCompatibleHelper > xVbaEventHelper( GetModel(), uno::UNO_QUERY );
++ if( xVbaEventHelper.is() )
+ {
-+ rReq.SetReturnValue( SfxBoolItem( 0, sal_True ) );
-+ return;
++ if( xVbaEventHelper->processCompatibleEvent( BEFORE, nId ) )
++ {
++ rReq.SetReturnValue( SfxBoolItem( 0, sal_True ) );
++ return;
++ }
+ }
+ }
//!! detaillierte Auswertung eines Fehlercodes
SfxObjectShellRef xLock( this );
---- sfx2/source/view/viewprn.cxx.orig 2008-03-06 00:56:43.000000000 +0800
-+++ sfx2/source/view/viewprn.cxx 2008-04-07 16:27:16.000000000 +0800
-@@ -33,6 +33,7 @@
+--- sfx2/source/view/viewprn.cxx.orig 2008-06-03 14:25:12.000000000 +0800
++++ sfx2/source/view/viewprn.cxx 2008-06-03 14:25:19.000000000 +0800
+@@ -28,10 +28,12 @@
*
************************************************************************/
@@ -1928,30 +2553,72 @@
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sfx2.hxx"
-@@ -426,6 +427,14 @@ void SfxViewShell::ExecPrint_Impl( SfxRe
+ #include <com/sun/star/document/XDocumentProperties.hpp>
++#include <com/sun/star/document/XDocumentEventCompatibleHelper.hpp>
+ #include <com/sun/star/view/PrintableState.hpp>
+ #include <svtools/itempool.hxx>
+ #ifndef _MSGBOX_HXX //autogen
+@@ -67,6 +69,8 @@
+ #include "view.hrc"
+ #include "helpid.hrc"
+
++using namespace com::sun::star;
++
+ TYPEINIT1(SfxPrintingHint, SfxHint);
+
+ // -----------------------------------------------------------------------
+@@ -405,6 +409,22 @@ void SfxViewShell::ExecPrint_Impl( SfxRe
case SID_SETUPPRINTER:
case SID_PRINTER_NAME :
{
+ if( nId == SID_PRINTDOC )
+ {
-+ if( GetObjectShell() && GetObjectShell()->processVbaEvents( BEFORE, nId ) )
++ SfxObjectShell* pDoc = GetObjectShell();
++ if( pDoc )
+ {
-+ rReq.SetReturnValue(SfxBoolItem(0,FALSE));
-+ return;
++ uno::Reference< document::XDocumentEventCompatibleHelper > xVbaEventHelper( pDoc->GetModel(), uno::UNO_QUERY );
++ if( xVbaEventHelper.is() )
++ {
++ if( xVbaEventHelper->processCompatibleEvent( BEFORE, nId ) )
++ {
++ rReq.SetReturnValue(SfxBoolItem(0,FALSE));
++ return;
++ }
++ }
+ }
+ }
// quiet mode (AppEvent, API call)
SFX_REQUEST_ARG(rReq, pSilentItem, SfxBoolItem, SID_SILENT, FALSE);
bSilent = pSilentItem && pSilentItem->GetValue();
-@@ -735,6 +744,11 @@ void SfxViewShell::ExecPrint_Impl( SfxRe
+@@ -714,6 +734,15 @@ void SfxViewShell::ExecPrint_Impl( SfxRe
if ( SID_PRINTDOCDIRECT == nId )
{
SfxObjectShell* pDoc = GetObjectShell();
-+ if( pDoc->processVbaEvents( BEFORE, nId ) )
++ uno::Reference< document::XDocumentEventCompatibleHelper > xVbaEventHelper( pDoc->GetModel(), uno::UNO_QUERY );
++ if( xVbaEventHelper.is() )
+ {
-+ rReq.SetReturnValue(SfxBoolItem(0,FALSE));
-+ return;
++ if( xVbaEventHelper->processCompatibleEvent( BEFORE, nId ) )
++ {
++ rReq.SetReturnValue(SfxBoolItem(0,FALSE));
++ return;
++ }
+ }
bool bDetectHidden = ( !bSilent && pDoc );
if ( bDetectHidden && pDoc->QueryHiddenInformation( WhenPrinting, NULL ) != RET_YES )
return;
+--- sfx2/source/doc/objxtor.cxx.orig 2008-06-03 18:53:27.000000000 +0800
++++ sfx2/source/doc/objxtor.cxx 2008-06-04 10:41:41.000000000 +0800
+@@ -594,6 +594,13 @@ SfxObjectShell* SfxObjectShell::Current(
+ return pFrame ? pFrame->GetObjectShell() : 0;
+ }
+
++//-------------------------------------------------------------------------
++
++sal_Bool SfxObjectShell::IsInPrepareClose() const
++{
++ return pImp->bInPrepareClose;
++}
++
+ //------------------------------------------------------------------------
+
+ struct BoolEnv_Impl
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]