ooo-build r12774 - in trunk: . patches/dev300 patches/vba



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]