blob: 0425709c12cd8ad3a2e2a5a1fc7d6038ab57a694 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sc.hxx"
#include <com/sun/star/awt/MouseButton.hpp>
#include <com/sun/star/script/vba/VBAEventId.hpp>
#include <com/sun/star/script/vba/XVBAEventProcessor.hpp>
#include <com/sun/star/view/DocumentZoomType.hpp>
#include <editeng/outliner.hxx>
#include <svx/fmdpage.hxx>
#include <svx/svditer.hxx>
#include <svx/svdmark.hxx>
#include <svx/svdouno.hxx>
#include <svx/svdpage.hxx>
#include <svx/svdpagv.hxx>
#include <svx/svdview.hxx>
#include <svx/unoshape.hxx>
#include <svx/unoshcol.hxx>
#include <svx/fmshell.hxx>
#include <sfx2/bindings.hxx>
#include <sfx2/dispatch.hxx>
#include <sfx2/printer.hxx>
#include <sfx2/request.hxx>
#include <sfx2/viewfrm.hxx>
#include <rtl/uuid.h>
#include <toolkit/helper/convert.hxx>
#include <toolkit/helper/vclunohelper.hxx>
#include "drawsh.hxx"
#include "drtxtob.hxx"
#include "transobj.hxx"
#include "editsh.hxx"
#include "viewuno.hxx"
#include "cellsuno.hxx"
#include "miscuno.hxx"
#include "tabvwsh.hxx"
#include "docsh.hxx"
#include "drwlayer.hxx"
#include "drawview.hxx"
#include "fupoor.hxx"
#include "sc.hrc"
#include "unoguard.hxx"
#include "unonames.hxx"
#include "scmod.hxx"
#include "appoptio.hxx"
#include "gridwin.hxx"
#include "sheetevents.hxx"
#include "AccessibilityHints.hxx"
#include <svx/sdrhittesthelper.hxx>
using namespace com::sun::star;
//------------------------------------------------------------------------
//! Clipping-Markierungen
// alles ohne Which-ID, Map nur fuer PropertySetInfo
const SfxItemPropertyMapEntry* lcl_GetViewOptPropertyMap()
{
static SfxItemPropertyMapEntry aViewOptPropertyMap_Impl[] =
{
{MAP_CHAR_LEN(OLD_UNO_COLROWHDR), 0, &getBooleanCppuType(), 0, 0},
{MAP_CHAR_LEN(SC_UNO_GRIDCOLOR), 0, &getCppuType((sal_Int32*)0), 0, 0},
{MAP_CHAR_LEN(SC_UNO_COLROWHDR), 0, &getBooleanCppuType(), 0, 0},
{MAP_CHAR_LEN(SC_UNO_HORSCROLL), 0, &getBooleanCppuType(), 0, 0},
{MAP_CHAR_LEN(SC_UNO_SHEETTABS), 0, &getBooleanCppuType(), 0, 0},
{MAP_CHAR_LEN(SC_UNO_VERTSCROLL), 0, &getBooleanCppuType(), 0, 0},
{MAP_CHAR_LEN(SC_UNO_HIDESPELL), 0, &getBooleanCppuType(), 0, 0}, /* deprecated #i91949 */
{MAP_CHAR_LEN(OLD_UNO_HORSCROLL), 0, &getBooleanCppuType(), 0, 0},
{MAP_CHAR_LEN(SC_UNO_OUTLSYMB), 0, &getBooleanCppuType(), 0, 0},
{MAP_CHAR_LEN(SC_UNO_VALUEHIGH), 0, &getBooleanCppuType(), 0, 0},
{MAP_CHAR_LEN(OLD_UNO_OUTLSYMB), 0, &getBooleanCppuType(), 0, 0},
{MAP_CHAR_LEN(OLD_UNO_SHEETTABS), 0, &getBooleanCppuType(), 0, 0},
{MAP_CHAR_LEN(SC_UNO_SHOWANCHOR), 0, &getBooleanCppuType(), 0, 0},
{MAP_CHAR_LEN(SC_UNO_SHOWCHARTS), 0, &getCppuType((sal_Int16*)0), 0, 0},
{MAP_CHAR_LEN(SC_UNO_SHOWDRAW), 0, &getCppuType((sal_Int16*)0), 0, 0},
{MAP_CHAR_LEN(SC_UNO_SHOWFORM), 0, &getBooleanCppuType(), 0, 0},
{MAP_CHAR_LEN(SC_UNO_SHOWGRID), 0, &getBooleanCppuType(), 0, 0},
{MAP_CHAR_LEN(SC_UNO_SHOWHELP), 0, &getBooleanCppuType(), 0, 0},
{MAP_CHAR_LEN(SC_UNO_SHOWNOTES), 0, &getBooleanCppuType(), 0, 0},
{MAP_CHAR_LEN(SC_UNO_SHOWOBJ), 0, &getCppuType((sal_Int16*)0), 0, 0},
{MAP_CHAR_LEN(SC_UNO_SHOWPAGEBR), 0, &getBooleanCppuType(), 0, 0},
{MAP_CHAR_LEN(SC_UNO_SHOWZERO), 0, &getBooleanCppuType(), 0, 0},
{MAP_CHAR_LEN(SC_UNO_SHOWSOLID), 0, &getBooleanCppuType(), 0, 0},
{MAP_CHAR_LEN(OLD_UNO_VALUEHIGH), 0, &getBooleanCppuType(), 0, 0},
{MAP_CHAR_LEN(OLD_UNO_VERTSCROLL), 0, &getBooleanCppuType(), 0, 0},
{MAP_CHAR_LEN(SC_UNO_VISAREA), 0, &getCppuType((awt::Rectangle*)0), 0, 0},
{MAP_CHAR_LEN(SC_UNO_ZOOMTYPE), 0, &getCppuType((sal_Int16*)0), 0, 0},
{MAP_CHAR_LEN(SC_UNO_ZOOMVALUE), 0, &getCppuType((sal_Int16*)0), 0, 0},
{MAP_CHAR_LEN(SC_UNO_VISAREASCREEN),0, &getCppuType((awt::Rectangle*)0), 0, 0},
{0,0,0,0,0,0}
};
return aViewOptPropertyMap_Impl;
}
//------------------------------------------------------------------------
SV_IMPL_PTRARR( XRangeSelectionListenerArr_Impl, XRangeSelectionListenerPtr );
SV_IMPL_PTRARR( XRangeSelectionChangeListenerArr_Impl, XRangeSelectionChangeListenerPtr );
SV_IMPL_PTRARR( XSelectionChangeListenerArr_Impl, XSelectionChangeListenerPtr );
SV_IMPL_PTRARR( XViewPropertyChangeListenerArr_Impl, XViewPropertyChangeListenerPtr );
SV_IMPL_PTRARR( XMouseClickHandlerArr_Impl, XMouseClickHandlerPtr );
SV_IMPL_PTRARR( XActivationEventListenerArr_Impl, XActivationEventListenerPtr );
#define SCTABVIEWOBJ_SERVICE "com.sun.star.sheet.SpreadsheetView"
#define SCVIEWSETTINGS_SERVICE "com.sun.star.sheet.SpreadsheetViewSettings"
SC_SIMPLE_SERVICE_INFO( ScViewPaneBase, "ScViewPaneObj", "com.sun.star.sheet.SpreadsheetViewPane" )
//------------------------------------------------------------------------
ScViewPaneBase::ScViewPaneBase(ScTabViewShell* pViewSh, sal_uInt16 nP) :
pViewShell( pViewSh ),
nPane( nP )
{
if (pViewShell)
StartListening(*pViewShell);
}
ScViewPaneBase::~ScViewPaneBase()
{
if (pViewShell)
EndListening(*pViewShell);
}
void ScViewPaneBase::Notify( SfxBroadcaster&, const SfxHint& rHint )
{
if ( rHint.ISA( SfxSimpleHint ) &&
((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING )
pViewShell = NULL;
}
uno::Any SAL_CALL ScViewPaneBase::queryInterface( const uno::Type& rType )
throw(uno::RuntimeException)
{
SC_QUERYINTERFACE( sheet::XViewPane )
SC_QUERYINTERFACE( sheet::XCellRangeReferrer )
SC_QUERYINTERFACE( view::XFormLayerAccess )
SC_QUERYINTERFACE( view::XControlAccess )
SC_QUERYINTERFACE( lang::XServiceInfo )
SC_QUERYINTERFACE( lang::XTypeProvider )
return uno::Any(); // OWeakObject is in derived objects
}
uno::Sequence<uno::Type> SAL_CALL ScViewPaneBase::getTypes() throw(uno::RuntimeException)
{
static uno::Sequence<uno::Type> aTypes;
if ( aTypes.getLength() == 0 )
{
aTypes.realloc(5);
uno::Type* pPtr = aTypes.getArray();
pPtr[0] = getCppuType((const uno::Reference<sheet::XViewPane>*)0);
pPtr[1] = getCppuType((const uno::Reference<sheet::XCellRangeReferrer>*)0);
pPtr[2] = getCppuType((const uno::Reference<view::XFormLayerAccess>*)0);
pPtr[3] = getCppuType((const uno::Reference<lang::XServiceInfo>*)0);
pPtr[4] = getCppuType((const uno::Reference<lang::XTypeProvider>*)0);
}
return aTypes;
}
uno::Sequence<sal_Int8> SAL_CALL ScViewPaneBase::getImplementationId()
throw(uno::RuntimeException)
{
static uno::Sequence< sal_Int8 > aId;
if( aId.getLength() == 0 )
{
aId.realloc( 16 );
rtl_createUuid( (sal_uInt8 *)aId.getArray(), 0, sal_True );
}
return aId;
}
// XViewPane
sal_Int32 SAL_CALL ScViewPaneBase::getFirstVisibleColumn() throw(uno::RuntimeException)
{
ScUnoGuard aGuard;
if (pViewShell)
{
ScViewData* pViewData = pViewShell->GetViewData();
ScSplitPos eWhich = ( nPane == SC_VIEWPANE_ACTIVE ) ?
pViewData->GetActivePart() :
(ScSplitPos) nPane;
ScHSplitPos eWhichH = WhichH( eWhich );
return pViewData->GetPosX( eWhichH );
}
DBG_ERROR("keine View ?!?"); //! Exception?
return 0;
}
void SAL_CALL ScViewPaneBase::setFirstVisibleColumn( sal_Int32 nFirstVisibleColumn )
throw(uno::RuntimeException)
{
ScUnoGuard aGuard;
if (pViewShell)
{
ScViewData* pViewData = pViewShell->GetViewData();
ScSplitPos eWhich = ( nPane == SC_VIEWPANE_ACTIVE ) ?
pViewData->GetActivePart() :
(ScSplitPos) nPane;
ScHSplitPos eWhichH = WhichH( eWhich );
long nDeltaX = ((long)nFirstVisibleColumn) - pViewData->GetPosX( eWhichH );
pViewShell->ScrollX( nDeltaX, eWhichH );
}
}
sal_Int32 SAL_CALL ScViewPaneBase::getFirstVisibleRow() throw(uno::RuntimeException)
{
ScUnoGuard aGuard;
if (pViewShell)
{
ScViewData* pViewData = pViewShell->GetViewData();
ScSplitPos eWhich = ( nPane == SC_VIEWPANE_ACTIVE ) ?
pViewData->GetActivePart() :
(ScSplitPos) nPane;
ScVSplitPos eWhichV = WhichV( eWhich );
return pViewData->GetPosY( eWhichV );
}
DBG_ERROR("keine View ?!?"); //! Exception?
return 0;
}
void SAL_CALL ScViewPaneBase::setFirstVisibleRow( sal_Int32 nFirstVisibleRow )
throw(uno::RuntimeException)
{
ScUnoGuard aGuard;
if (pViewShell)
{
ScViewData* pViewData = pViewShell->GetViewData();
ScSplitPos eWhich = ( nPane == SC_VIEWPANE_ACTIVE ) ?
pViewData->GetActivePart() :
(ScSplitPos) nPane;
ScVSplitPos eWhichV = WhichV( eWhich );
long nDeltaY = ((long)nFirstVisibleRow) - pViewData->GetPosY( eWhichV );
pViewShell->ScrollY( nDeltaY, eWhichV );
}
}
table::CellRangeAddress SAL_CALL ScViewPaneBase::getVisibleRange() throw(uno::RuntimeException)
{
ScUnoGuard aGuard;
table::CellRangeAddress aAdr;
if (pViewShell)
{
ScViewData* pViewData = pViewShell->GetViewData();
ScSplitPos eWhich = ( nPane == SC_VIEWPANE_ACTIVE ) ?
pViewData->GetActivePart() :
(ScSplitPos) nPane;
ScHSplitPos eWhichH = WhichH( eWhich );
ScVSplitPos eWhichV = WhichV( eWhich );
// VisibleCellsX gibt nur komplett sichtbare Zellen,
// VisibleRange in Excel auch teilweise sichtbare.
//! anpassen ???
SCCOL nVisX = pViewData->VisibleCellsX( eWhichH );
SCROW nVisY = pViewData->VisibleCellsY( eWhichV );
if (!nVisX) nVisX = 1; // irgendwas muss ja im Range sein
if (!nVisY) nVisY = 1;
aAdr.Sheet = pViewData->GetTabNo();
aAdr.StartColumn = pViewData->GetPosX( eWhichH );
aAdr.StartRow = pViewData->GetPosY( eWhichV );
aAdr.EndColumn = aAdr.StartColumn + nVisX - 1;
aAdr.EndRow = aAdr.StartRow + nVisY - 1;
}
return aAdr;
}
// XCellRangeSource
uno::Reference<table::XCellRange> SAL_CALL ScViewPaneBase::getReferredCells()
throw(uno::RuntimeException)
{
ScUnoGuard aGuard;
if (pViewShell)
{
ScDocShell* pDocSh = pViewShell->GetViewData()->GetDocShell();
table::CellRangeAddress aAdr(getVisibleRange()); //! Hilfsfunktion mit ScRange?
ScRange aRange( (SCCOL)aAdr.StartColumn, (SCROW)aAdr.StartRow, aAdr.Sheet,
(SCCOL)aAdr.EndColumn, (SCROW)aAdr.EndRow, aAdr.Sheet );
if ( aRange.aStart == aRange.aEnd )
return new ScCellObj( pDocSh, aRange.aStart );
else
return new ScCellRangeObj( pDocSh, aRange );
}
return NULL;
}
namespace
{
bool lcl_prepareFormShellCall( ScTabViewShell* _pViewShell, sal_uInt16 _nPane, FmFormShell*& _rpFormShell, Window*& _rpWindow, SdrView*& _rpSdrView )
{
if ( !_pViewShell )
return false;
ScViewData* pViewData = _pViewShell->GetViewData();
ScSplitPos eWhich = ( _nPane == SC_VIEWPANE_ACTIVE ) ?
pViewData->GetActivePart() :
(ScSplitPos) _nPane;
_rpWindow = _pViewShell->GetWindowByPos( eWhich );
_rpSdrView = _pViewShell->GetSdrView();
_rpFormShell = _pViewShell->GetFormShell();
return ( _rpFormShell != NULL ) && ( _rpSdrView != NULL )&& ( _rpWindow != NULL );
}
}
// XFormLayerAccess
uno::Reference< form::runtime::XFormController > SAL_CALL ScViewPaneBase::getFormController( const uno::Reference< form::XForm >& _Form ) throw (uno::RuntimeException)
{
ScUnoGuard aGuard;
uno::Reference< form::runtime::XFormController > xController;
Window* pWindow( NULL );
SdrView* pSdrView( NULL );
FmFormShell* pFormShell( NULL );
if ( lcl_prepareFormShellCall( pViewShell, nPane, pFormShell, pWindow, pSdrView ) )
xController = pFormShell->GetFormController( _Form, *pSdrView, *pWindow );
return xController;
}
::sal_Bool SAL_CALL ScViewPaneBase::isFormDesignMode( ) throw (uno::RuntimeException)
{
ScUnoGuard aGuard;
sal_Bool bIsFormDesignMode( sal_True );
FmFormShell* pFormShell( pViewShell ? pViewShell->GetFormShell() : NULL );
if ( pFormShell )
bIsFormDesignMode = pFormShell->IsDesignMode();
return bIsFormDesignMode;
}
void SAL_CALL ScViewPaneBase::setFormDesignMode( ::sal_Bool _DesignMode ) throw (uno::RuntimeException)
{
ScUnoGuard aGuard;
Window* pWindow( NULL );
SdrView* pSdrView( NULL );
FmFormShell* pFormShell( NULL );
if ( lcl_prepareFormShellCall( pViewShell, nPane, pFormShell, pWindow, pSdrView ) )
pFormShell->SetDesignMode( _DesignMode );
}
// XControlAccess
uno::Reference<awt::XControl> SAL_CALL ScViewPaneBase::getControl(
const uno::Reference<awt::XControlModel>& xModel )
throw(container::NoSuchElementException, uno::RuntimeException)
{
ScUnoGuard aGuard;
uno::Reference<awt::XControl> xRet;
Window* pWindow( NULL );
SdrView* pSdrView( NULL );
FmFormShell* pFormShell( NULL );
if ( lcl_prepareFormShellCall( pViewShell, nPane, pFormShell, pWindow, pSdrView ) )
pFormShell->GetFormControl( xModel, *pSdrView, *pWindow, xRet );
if ( !xRet.is() )
throw container::NoSuchElementException(); // no control found
return xRet;
}
awt::Rectangle ScViewPaneBase::GetVisArea() const
{
awt::Rectangle aVisArea;
if (pViewShell)
{
ScSplitPos eWhich = ( nPane == SC_VIEWPANE_ACTIVE ) ?
pViewShell->GetViewData()->GetActivePart() :
(ScSplitPos) nPane;
ScGridWindow* pWindow = (ScGridWindow*)pViewShell->GetWindowByPos(eWhich);
ScDocument* pDoc = pViewShell->GetViewData()->GetDocument();
if (pWindow && pDoc)
{
ScHSplitPos eWhichH = ((eWhich == SC_SPLIT_TOPLEFT) || (eWhich == SC_SPLIT_BOTTOMLEFT)) ?
SC_SPLIT_LEFT : SC_SPLIT_RIGHT;
ScVSplitPos eWhichV = ((eWhich == SC_SPLIT_TOPLEFT) || (eWhich == SC_SPLIT_TOPRIGHT)) ?
SC_SPLIT_TOP : SC_SPLIT_BOTTOM;
ScAddress aCell(pViewShell->GetViewData()->GetPosX(eWhichH),
pViewShell->GetViewData()->GetPosY(eWhichV),
pViewShell->GetViewData()->GetTabNo());
Rectangle aCellRect( pDoc->GetMMRect( aCell.Col(), aCell.Row(), aCell.Col(), aCell.Row(), aCell.Tab() ) );
Size aVisSize( pWindow->PixelToLogic( pWindow->GetSizePixel(), pWindow->GetDrawMapMode( sal_True ) ) );
Point aVisPos( aCellRect.TopLeft() );
if ( pDoc->IsLayoutRTL( aCell.Tab() ) )
{
aVisPos = aCellRect.TopRight();
aVisPos.X() -= aVisSize.Width();
}
Rectangle aVisRect( aVisPos, aVisSize );
aVisArea = AWTRectangle(aVisRect);
}
}
return aVisArea;
}
//------------------------------------------------------------------------
ScViewPaneObj::ScViewPaneObj(ScTabViewShell* pViewSh, sal_uInt16 nP) :
ScViewPaneBase( pViewSh, nP )
{
}
ScViewPaneObj::~ScViewPaneObj()
{
}
uno::Any SAL_CALL ScViewPaneObj::queryInterface( const uno::Type& rType )
throw(uno::RuntimeException)
{
// ScViewPaneBase has everything except OWeakObject
uno::Any aRet(ScViewPaneBase::queryInterface( rType ));
if (!aRet.hasValue())
aRet = OWeakObject::queryInterface( rType );
return aRet;
}
void SAL_CALL ScViewPaneObj::acquire() throw()
{
OWeakObject::acquire();
}
void SAL_CALL ScViewPaneObj::release() throw()
{
OWeakObject::release();
}
//------------------------------------------------------------------------
// Default-ctor wird fuer SMART_REFLECTION_IMPLEMENTATION gebraucht
//UNUSED2008-05 ScTabViewObj::ScTabViewObj() :
//UNUSED2008-05 ScViewPaneBase( NULL, SC_VIEWPANE_ACTIVE ),
//UNUSED2008-05 SfxBaseController( NULL ),
//UNUSED2008-05 aPropSet( lcl_GetViewOptPropertyMap() ),
//UNUSED2008-05 aMouseClickHandlers( 0 ),
//UNUSED2008-05 aActivationListeners( 0 ),
//UNUSED2008-05 bDrawSelModeSet(sal_False),
//UNUSED2008-05 bFilteredRangeSelection(sal_True)
//UNUSED2008-05 {
//UNUSED2008-05 }
ScTabViewObj::ScTabViewObj( ScTabViewShell* pViewSh ) :
ScViewPaneBase( pViewSh, SC_VIEWPANE_ACTIVE ),
SfxBaseController( pViewSh ),
aPropSet( lcl_GetViewOptPropertyMap() ),
aMouseClickHandlers( 0 ),
aActivationListeners( 0 ),
nPreviousTab( 0 ),
bDrawSelModeSet(sal_False)
{
if (pViewSh)
nPreviousTab = pViewSh->GetViewData()->GetTabNo();
}
ScTabViewObj::~ScTabViewObj()
{
//! Listening oder so
if (aMouseClickHandlers.Count())
{
acquire();
EndMouseListening();
}
if (aActivationListeners.Count())
{
acquire();
EndActivationListening();
}
}
uno::Any SAL_CALL ScTabViewObj::queryInterface( const uno::Type& rType )
throw(uno::RuntimeException)
{
SC_QUERYINTERFACE( sheet::XSpreadsheetView )
SC_QUERYINTERFACE( sheet::XEnhancedMouseClickBroadcaster )
SC_QUERYINTERFACE( sheet::XActivationBroadcaster )
SC_QUERYINTERFACE( container::XEnumerationAccess )
SC_QUERYINTERFACE( container::XIndexAccess )
SC_QUERY_MULTIPLE( container::XElementAccess, container::XIndexAccess )
SC_QUERYINTERFACE( view::XSelectionSupplier )
SC_QUERYINTERFACE( beans::XPropertySet )
SC_QUERYINTERFACE( sheet::XViewSplitable )
SC_QUERYINTERFACE( sheet::XViewFreezable )
SC_QUERYINTERFACE( sheet::XRangeSelection )
SC_QUERYINTERFACE( lang::XUnoTunnel )
SC_QUERYINTERFACE( datatransfer::XTransferableSupplier )
uno::Any aRet(ScViewPaneBase::queryInterface( rType ));
if (!aRet.hasValue())
aRet = SfxBaseController::queryInterface( rType );
return aRet;
}
void SAL_CALL ScTabViewObj::acquire() throw()
{
SfxBaseController::acquire();
}
void SAL_CALL ScTabViewObj::release() throw()
{
SfxBaseController::release();
}
void lcl_CallActivate( ScDocShell* pDocSh, SCTAB nTab, sal_Int32 nEvent )
{
ScDocument* pDoc = pDocSh->GetDocument();
// when deleting a sheet, nPreviousTab can be invalid
// (could be handled with reference updates)
if (!pDoc->HasTable(nTab))
return;
const ScSheetEvents* pEvents = pDoc->GetSheetEvents(nTab);
if (pEvents)
{
const rtl::OUString* pScript = pEvents->GetScript(nEvent);
if (pScript)
{
uno::Any aRet;
uno::Sequence<uno::Any> aParams;
uno::Sequence<sal_Int16> aOutArgsIndex;
uno::Sequence<uno::Any> aOutArgs;
/*ErrCode eRet =*/ pDocSh->CallXScript( *pScript, aParams, aRet, aOutArgsIndex, aOutArgs );
}
}
// execute VBA event handlers
try
{
uno::Reference< script::vba::XVBAEventProcessor > xVbaEvents( pDoc->GetVbaEventProcessor(), uno::UNO_SET_THROW );
// the parameter is the clicked object, as in the mousePressed call above
uno::Sequence< uno::Any > aArgs( 1 );
aArgs[ 0 ] <<= nTab;
xVbaEvents->processVbaEvent( ScSheetEvents::GetVbaSheetEventId( nEvent ), aArgs );
}
catch( uno::Exception& )
{
}
}
void ScTabViewObj::SheetChanged( bool bSameTabButMoved )
{
if ( !GetViewShell() )
return;
ScViewData* pViewData = GetViewShell()->GetViewData();
ScDocShell* pDocSh = pViewData->GetDocShell();
if (aActivationListeners.Count() > 0)
{
sheet::ActivationEvent aEvent;
uno::Reference< sheet::XSpreadsheetView > xView(this);
uno::Reference< uno::XInterface > xSource(xView, uno::UNO_QUERY);
aEvent.Source = xSource;
aEvent.ActiveSheet = new ScTableSheetObj(pDocSh, pViewData->GetTabNo());
for ( sal_uInt16 n=0; n<aActivationListeners.Count(); n++ )
{
try
{
(*aActivationListeners[n])->activeSpreadsheetChanged( aEvent );
}
catch( uno::Exception& )
{
aActivationListeners.DeleteAndDestroy( n );
--n; // because it will be increased again in the loop
}
}
}
/* Handle sheet events, but do not trigger event handlers, if the old
active sheet gets re-activated after inserting/deleting/moving a sheet. */
SCTAB nNewTab = pViewData->GetTabNo();
if ( !bSameTabButMoved && (nNewTab != nPreviousTab) )
{
lcl_CallActivate( pDocSh, nPreviousTab, SC_SHEETEVENT_UNFOCUS );
lcl_CallActivate( pDocSh, nNewTab, SC_SHEETEVENT_FOCUS );
}
nPreviousTab = nNewTab;
}
uno::Sequence<uno::Type> SAL_CALL ScTabViewObj::getTypes() throw(uno::RuntimeException)
{
static uno::Sequence<uno::Type> aTypes;
if ( aTypes.getLength() == 0 )
{
uno::Sequence<uno::Type> aViewPaneTypes(ScViewPaneBase::getTypes());
long nViewPaneLen = aViewPaneTypes.getLength();
const uno::Type* pViewPanePtr = aViewPaneTypes.getConstArray();
uno::Sequence<uno::Type> aControllerTypes(SfxBaseController::getTypes());
long nControllerLen = aControllerTypes.getLength();
const uno::Type* pControllerPtr = aControllerTypes.getConstArray();
long nParentLen = nViewPaneLen + nControllerLen;
aTypes.realloc( nParentLen + 12 );
uno::Type* pPtr = aTypes.getArray();
pPtr[nParentLen + 0] = getCppuType((const uno::Reference<sheet::XSpreadsheetView>*)0);
pPtr[nParentLen + 1] = getCppuType((const uno::Reference<container::XEnumerationAccess>*)0);
pPtr[nParentLen + 2] = getCppuType((const uno::Reference<container::XIndexAccess>*)0);
pPtr[nParentLen + 3] = getCppuType((const uno::Reference<view::XSelectionSupplier>*)0);
pPtr[nParentLen + 4] = getCppuType((const uno::Reference<beans::XPropertySet>*)0);
pPtr[nParentLen + 5] = getCppuType((const uno::Reference<sheet::XViewSplitable>*)0);
pPtr[nParentLen + 6] = getCppuType((const uno::Reference<sheet::XViewFreezable>*)0);
pPtr[nParentLen + 7] = getCppuType((const uno::Reference<sheet::XRangeSelection>*)0);
pPtr[nParentLen + 8] = getCppuType((const uno::Reference<lang::XUnoTunnel>*)0);
pPtr[nParentLen + 9] = getCppuType((const uno::Reference<sheet::XEnhancedMouseClickBroadcaster>*)0);
pPtr[nParentLen + 10] = getCppuType((const uno::Reference<sheet::XActivationBroadcaster>*)0);
pPtr[nParentLen + 11] = getCppuType((const uno::Reference<datatransfer::XTransferableSupplier>*)0);
long i;
for (i=0; i<nViewPaneLen; i++)
pPtr[i] = pViewPanePtr[i]; // parent types first
for (i=0; i<nControllerLen; i++)
pPtr[nViewPaneLen+i] = pControllerPtr[i];
}
return aTypes;
}
uno::Sequence<sal_Int8> SAL_CALL ScTabViewObj::getImplementationId()
throw(uno::RuntimeException)
{
static uno::Sequence< sal_Int8 > aId;
if( aId.getLength() == 0 )
{
aId.realloc( 16 );
rtl_createUuid( (sal_uInt8 *)aId.getArray(), 0, sal_True );
}
return aId;
}
// XDocumentView
sal_Bool lcl_TabInRanges( SCTAB nTab, const ScRangeList& rRanges )
{
sal_uLong nCount = rRanges.Count();
for (sal_uLong i=0; i<nCount; i++)
{
const ScRange* pRange = rRanges.GetObject(i);
if ( nTab >= pRange->aStart.Tab() && nTab <= pRange->aEnd.Tab() )
return sal_True;
}
return sal_False;
}
void lcl_ShowObject( ScTabViewShell& rViewSh, ScDrawView& rDrawView, SdrObject* pSelObj )
{
sal_Bool bFound = sal_False;
SCTAB nObjectTab = 0;
SdrModel* pModel = rDrawView.GetModel();
sal_uInt16 nPageCount = pModel->GetPageCount();
for (sal_uInt16 i=0; i<nPageCount && !bFound; i++)
{
SdrPage* pPage = pModel->GetPage(i);
if (pPage)
{
SdrObjListIter aIter( *pPage, IM_DEEPWITHGROUPS );
SdrObject* pObject = aIter.Next();
while (pObject && !bFound)
{
if ( pObject == pSelObj )
{
bFound = sal_True;
nObjectTab = static_cast<SCTAB>(i);
}
pObject = aIter.Next();
}
}
}
if (bFound)
{
rViewSh.SetTabNo( nObjectTab );
rViewSh.ScrollToObject( pSelObj );
}
}
sal_Bool SAL_CALL ScTabViewObj::select( const uno::Any& aSelection )
throw(lang::IllegalArgumentException, uno::RuntimeException)
{
ScUnoGuard aGuard;
ScTabViewShell* pViewSh = GetViewShell();
if ( !pViewSh )
return sal_False;
//! Type of aSelection can be some specific interface instead of XInterface
sal_Bool bRet = sal_False;
uno::Reference<uno::XInterface> xInterface(aSelection, uno::UNO_QUERY);
if ( !xInterface.is() ) //clear all selections
{
ScDrawView* pDrawView = pViewSh->GetScDrawView();
if (pDrawView)
{
pDrawView->ScEndTextEdit();
pDrawView->UnmarkAll();
}
else //#102232#; if there is no DrawView remove range selection
pViewSh->Unmark();
bRet = sal_True;
}
if (bDrawSelModeSet) // remove DrawSelMode if set by API; if necessary it will be set again later
{
pViewSh->SetDrawSelMode(sal_False);
pViewSh->UpdateLayerLocks();
bDrawSelModeSet = sal_False;
}
if (bRet)
return bRet;
ScCellRangesBase* pRangesImp = ScCellRangesBase::getImplementation( xInterface );
uno::Reference<drawing::XShapes> xShapeColl( xInterface, uno::UNO_QUERY );
uno::Reference<drawing::XShape> xShapeSel( xInterface, uno::UNO_QUERY );
SvxShape* pShapeImp = SvxShape::getImplementation( xShapeSel );
if (pRangesImp) // Zell-Ranges
{
ScViewData* pViewData = pViewSh->GetViewData();
if ( pViewData->GetDocShell() == pRangesImp->GetDocShell() )
{
// Zuerst evtl. Drawing-Selektion aufheben
// (MarkListHasChanged hebt Tabellen-Selektion auf)
ScDrawView* pDrawView = pViewSh->GetScDrawView();
if (pDrawView)
{
pDrawView->ScEndTextEdit();
pDrawView->UnmarkAll();
}
FuPoor* pFunc = pViewSh->GetDrawFuncPtr();
if ( pFunc && pFunc->GetSlotID() != SID_OBJECT_SELECT )
{
// Slot der Zeichenfunktion nochmal ausfuehren -> abschalten
SfxDispatcher* pDisp = pViewSh->GetDispatcher();
if (pDisp)
pDisp->Execute( pFunc->GetSlotID(), SFX_CALLMODE_SYNCHRON );
}
pViewSh->SetDrawShell(sal_False);
pViewSh->SetDrawSelMode(sal_False); // nach dem Dispatcher-Execute
// Ranges selektieren
const ScRangeList& rRanges = pRangesImp->GetRangeList();
sal_uLong nRangeCount = rRanges.Count();
// for empty range list, remove selection (cursor remains where it was)
if ( nRangeCount == 0 )
pViewSh->Unmark();
else if ( nRangeCount == 1 )
pViewSh->MarkRange( *rRanges.GetObject(0) );
else
{
// Mehrfachselektion
const ScRange* pFirst = rRanges.GetObject(0);
if ( pFirst && !lcl_TabInRanges( pViewData->GetTabNo(), rRanges ) )
pViewSh->SetTabNo( pFirst->aStart.Tab() );
pViewSh->DoneBlockMode();
pViewSh->InitOwnBlockMode();
pViewData->GetMarkData().MarkFromRangeList( rRanges, sal_True );
pViewSh->MarkDataChanged();
pViewData->GetDocShell()->PostPaintGridAll(); // Markierung (alt&neu)
if ( pFirst )
{
pViewSh->AlignToCursor( pFirst->aStart.Col(), pFirst->aStart.Row(),
SC_FOLLOW_JUMP );
pViewSh->SetCursor( pFirst->aStart.Col(), pFirst->aStart.Row() );
}
//! Methode an der View, um RangeList zu selektieren
}
bRet = sal_True;
}
}
else if ( pShapeImp || xShapeColl.is() ) // Drawing-Layer
{
ScDrawView* pDrawView = pViewSh->GetScDrawView();
if (pDrawView)
{
pDrawView->ScEndTextEdit();
pDrawView->UnmarkAll();
if (pShapeImp) // einzelnes Shape
{
SdrObject *pObj = pShapeImp->GetSdrObject();
if (pObj)
{
lcl_ShowObject( *pViewSh, *pDrawView, pObj );
SdrPageView* pPV = pDrawView->GetSdrPageView();
if ( pPV && pObj->GetPage() == pPV->GetPage() )
{
pDrawView->MarkObj( pObj, pPV );
bRet = sal_True;
}
}
}
else // Shape-Collection (xShapeColl ist nicht 0)
{
// Es wird auf die Tabelle des ersten Objekts umgeschaltet,
// und alle Objekte selektiert, die auf dieser Tabelle liegen
//! Exception, wenn Objekte auf verschiedenen Tabellen?
SdrPageView* pPV = NULL;
long nCount = xShapeColl->getCount();
if (nCount)
{
sal_Bool bAllMarked(sal_True);
for ( long i = 0; i < nCount; i++ )
{
uno::Reference<drawing::XShape> xShapeInt(xShapeColl->getByIndex(i), uno::UNO_QUERY);
if (xShapeInt.is())
{
SvxShape* pShape = SvxShape::getImplementation( xShapeInt );
if (pShape)
{
SdrObject *pObj = pShape->GetSdrObject();
if (pObj)
{
if (!bDrawSelModeSet && (pObj->GetLayer() == SC_LAYER_BACK))
{
pViewSh->SetDrawSelMode(sal_True);
pViewSh->UpdateLayerLocks();
bDrawSelModeSet = sal_True;
}
if (!pPV) // erstes Objekt
{
lcl_ShowObject( *pViewSh, *pDrawView, pObj );
pPV = pDrawView->GetSdrPageView();
}
if ( pPV && pObj->GetPage() == pPV->GetPage() )
{
if (pDrawView->IsObjMarkable( pObj, pPV ))
pDrawView->MarkObj( pObj, pPV );
else
bAllMarked = sal_False;
}
}
}
}
}
if (bAllMarked)
bRet = sal_True;
}
else
bRet = sal_True; // empty XShapes (all shapes are deselected)
}
if (bRet)
pViewSh->SetDrawShell(sal_True);
}
}
if (!bRet)
throw lang::IllegalArgumentException();
return bRet;
}
uno::Any SAL_CALL ScTabViewObj::getSelection() throw(uno::RuntimeException)
{
ScUnoGuard aGuard;
ScTabViewShell* pViewSh = GetViewShell();
ScCellRangesBase* pObj = NULL;
if (pViewSh)
{
// Ist auf dem Drawing-Layer etwas selektiert?
SdrView* pDrawView = pViewSh->GetSdrView();
if (pDrawView)
{
const SdrMarkList& rMarkList = pDrawView->GetMarkedObjectList();
sal_uLong nMarkCount = rMarkList.GetMarkCount();
if (nMarkCount)
{
// ShapeCollection erzeugen (wie in SdXImpressView::getSelection im Draw)
// Zurueckgegeben wird XInterfaceRef, das muss das UsrObject-XInterface sein
SvxShapeCollection* pShapes = new SvxShapeCollection();
uno::Reference<uno::XInterface> xRet(static_cast<cppu::OWeakObject*>(pShapes));
for (sal_uLong i=0; i<nMarkCount; i++)
{
SdrObject* pDrawObj = rMarkList.GetMark(i)->GetMarkedSdrObj();
if (pDrawObj)
{
uno::Reference<drawing::XShape> xShape( pDrawObj->getUnoShape(), uno::UNO_QUERY );
if (xShape.is())
pShapes->add(xShape);
}
}
return uno::makeAny(xRet);
}
}
// sonst Tabellen-(Zellen-)Selektion
ScViewData* pViewData = pViewSh->GetViewData();
ScDocShell* pDocSh = pViewData->GetDocShell();
const ScMarkData& rMark = pViewData->GetMarkData();
SCTAB nTabs = rMark.GetSelectCount();
ScRange aRange;
ScMarkType eMarkType = pViewData->GetSimpleArea(aRange);
if ( nTabs == 1 && (eMarkType == SC_MARK_SIMPLE) )
{
if (aRange.aStart == aRange.aEnd)
pObj = new ScCellObj( pDocSh, aRange.aStart );
else
pObj = new ScCellRangeObj( pDocSh, aRange );
}
else if ( nTabs == 1 && (eMarkType == SC_MARK_SIMPLE_FILTERED) )
{
ScMarkData aFilteredMark( rMark );
ScViewUtil::UnmarkFiltered( aFilteredMark, pDocSh->GetDocument());
ScRangeList aRangeList;
aFilteredMark.FillRangeListWithMarks( &aRangeList, sal_False);
// Theoretically a selection may start and end on a filtered row.
switch (aRangeList.Count())
{
case 0:
// No unfiltered row, we have to return some object, so
// here is one with no ranges.
pObj = new ScCellRangesObj( pDocSh, aRangeList );
break;
case 1:
{
const ScRange& rRange = *(aRangeList.GetObject(0));
if (rRange.aStart == rRange.aEnd)
pObj = new ScCellObj( pDocSh, rRange.aStart );
else
pObj = new ScCellRangeObj( pDocSh, rRange );
}
break;
default:
pObj = new ScCellRangesObj( pDocSh, aRangeList );
}
}
else // Mehrfachselektion
{
ScRangeListRef xRanges;
pViewData->GetMultiArea( xRanges );
// bei mehreren Tabellen Ranges kopieren
//! sollte eigentlich schon in ScMarkData::FillRangeListWithMarks passieren?
if ( nTabs > 1 )
rMark.ExtendRangeListTables( xRanges );
pObj = new ScCellRangesObj( pDocSh, *xRanges );
}
if ( !rMark.IsMarked() && !rMark.IsMultiMarked() )
{
// remember if the selection was from the cursor position without anything selected
// (used when rendering the selection)
pObj->SetCursorOnly( sal_True );
}
}
return uno::makeAny(uno::Reference<uno::XInterface>(static_cast<cppu::OWeakObject*>(pObj)));
}
#if 0
// XPrintable
rtl::OUString ScTabViewObj::getPrinterName(void) const
{
ScUnoGuard aGuard;
ScTabViewShell* pViewSh = GetViewShell();
if (pViewSh)
{
SfxPrinter* pPrinter = pViewSh->GetPrinter(sal_True);
if (pPrinter)
return pPrinter->GetName();
}
DBG_ERROR("getPrinterName: keine View oder kein Printer");
return rtl::OUString();
}
void ScTabViewObj::setPrinterName(const rtl::OUString& PrinterName)
{
ScUnoGuard aGuard;
// Drucker setzen - wie in SfxViewShell::ExecPrint_Impl
ScTabViewShell* pViewSh = GetViewShell();
if (pViewSh)
{
SfxPrinter* pPrinter = pViewSh->GetPrinter(sal_True);
if (pPrinter)
{
String aString(PrinterName);
SfxPrinter* pNewPrinter = new SfxPrinter( pPrinter->GetOptions().Clone(), aString );
if (pNewPrinter->IsKnown())
pViewSh->SetPrinter( pNewPrinter, SFX_PRINTER_PRINTER );
else
delete pNewPrinter;
}
}
}
XPropertySetRef ScTabViewObj::createPrintOptions(void)
{
ScUnoGuard aGuard;
return new ScPrintSettingsObj; //! ScPrintSettingsObj implementieren!
}
void ScTabViewObj::print(const XPropertySetRef& xOptions)
{
ScUnoGuard aGuard;
ScTabViewShell* pViewSh = GetViewShell();
if (pViewSh)
{
//! xOptions auswerten (wie denn?)
SfxRequest aReq( SID_PRINTDOCDIRECT, SFX_CALLMODE_SYNCHRON, pViewSh->GetPool() );
pViewSh->ExecuteSlot( aReq );
}
}
#endif
// XEnumerationAccess
uno::Reference<container::XEnumeration> SAL_CALL ScTabViewObj::createEnumeration()
throw(uno::RuntimeException)
{
ScUnoGuard aGuard;
return new ScIndexEnumeration(this, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sheet.SpreadsheetViewPanesEnumeration")));
}
// XIndexAccess
sal_Int32 SAL_CALL ScTabViewObj::getCount() throw(uno::RuntimeException)
{
ScUnoGuard aGuard;
ScTabViewShell* pViewSh = GetViewShell();
sal_uInt16 nPanes = 0;
if (pViewSh)
{
nPanes = 1;
ScViewData* pViewData = pViewSh->GetViewData();
if ( pViewData->GetHSplitMode() != SC_SPLIT_NONE )
nPanes *= 2;
if ( pViewData->GetVSplitMode() != SC_SPLIT_NONE )
nPanes *= 2;
}
return nPanes;
}
uno::Any SAL_CALL ScTabViewObj::getByIndex( sal_Int32 nIndex )
throw(lang::IndexOutOfBoundsException,
lang::WrappedTargetException, uno::RuntimeException)
{
ScUnoGuard aGuard;
uno::Reference<sheet::XViewPane> xPane(GetObjectByIndex_Impl((sal_uInt16)nIndex));
if (xPane.is())
return uno::makeAny(xPane);
else
throw lang::IndexOutOfBoundsException();
// return uno::Any();
}
uno::Type SAL_CALL ScTabViewObj::getElementType() throw(uno::RuntimeException)
{
ScUnoGuard aGuard;
return getCppuType((uno::Reference<sheet::XViewPane>*)0);
}
sal_Bool SAL_CALL ScTabViewObj::hasElements() throw(uno::RuntimeException)
{
ScUnoGuard aGuard;
return ( getCount() != 0 );
}
// XSpreadsheetView
ScViewPaneObj* ScTabViewObj::GetObjectByIndex_Impl(sal_uInt16 nIndex) const
{
static ScSplitPos ePosHV[4] =
{ SC_SPLIT_TOPLEFT, SC_SPLIT_BOTTOMLEFT, SC_SPLIT_TOPRIGHT, SC_SPLIT_BOTTOMRIGHT };
ScTabViewShell* pViewSh = GetViewShell();
if (pViewSh)
{
ScSplitPos eWhich = SC_SPLIT_BOTTOMLEFT; // default Position
sal_Bool bError = sal_False;
ScViewData* pViewData = pViewSh->GetViewData();
sal_Bool bHor = ( pViewData->GetHSplitMode() != SC_SPLIT_NONE );
sal_Bool bVer = ( pViewData->GetVSplitMode() != SC_SPLIT_NONE );
if ( bHor && bVer )
{
// links oben, links unten, rechts oben, rechts unten - wie in Excel
if ( nIndex < 4 )
eWhich = ePosHV[nIndex];
else
bError = sal_True;
}
else if ( bHor )
{
if ( nIndex > 1 )
bError = sal_True;
else if ( nIndex == 1 )
eWhich = SC_SPLIT_BOTTOMRIGHT;
// sonst SC_SPLIT_BOTTOMLEFT
}
else if ( bVer )
{
if ( nIndex > 1 )
bError = sal_True;
else if ( nIndex == 0 )
eWhich = SC_SPLIT_TOPLEFT;
// sonst SC_SPLIT_BOTTOMLEFT
}
else if ( nIndex > 0 )
bError = sal_True; // nicht geteilt: nur 0 gueltig
if (!bError)
return new ScViewPaneObj( pViewSh, sal::static_int_cast<sal_uInt16>(eWhich) );
}
return NULL;
}
uno::Reference<sheet::XSpreadsheet> SAL_CALL ScTabViewObj::getActiveSheet()
throw(uno::RuntimeException)
{
ScUnoGuard aGuard;
ScTabViewShell* pViewSh = GetViewShell();
if (pViewSh)
{
ScViewData* pData = pViewSh->GetViewData();
SCTAB nTab = pData->GetTabNo();
return new ScTableSheetObj( pData->GetDocShell(), nTab );
}
return NULL;
}
void SAL_CALL ScTabViewObj::setActiveSheet( const uno::Reference<sheet::XSpreadsheet>& xActiveSheet )
throw(uno::RuntimeException)
{
ScUnoGuard aGuard;
ScTabViewShell* pViewSh = GetViewShell();
if ( pViewSh && xActiveSheet.is() )
{
// XSpreadsheet und ScCellRangesBase -> muss ein Sheet sein
ScCellRangesBase* pRangesImp = ScCellRangesBase::getImplementation( xActiveSheet );
if ( pRangesImp && pViewSh->GetViewData()->GetDocShell() == pRangesImp->GetDocShell() )
{
const ScRangeList& rRanges = pRangesImp->GetRangeList();
if ( rRanges.Count() == 1 )
{
SCTAB nNewTab = rRanges.GetObject(0)->aStart.Tab();
if ( pViewSh->GetViewData()->GetDocument()->HasTable(nNewTab) )
pViewSh->SetTabNo( nNewTab );
}
}
}
}
uno::Reference< uno::XInterface > ScTabViewObj::GetClickedObject(const Point& rPoint) const
{
uno::Reference< uno::XInterface > xTarget;
if (GetViewShell())
{
SCsCOL nX;
SCsROW nY;
ScViewData* pData = GetViewShell()->GetViewData();
ScSplitPos eSplitMode = pData->GetActivePart();
SCTAB nTab(pData->GetTabNo());
pData->GetPosFromPixel( rPoint.X(), rPoint.Y(), eSplitMode, nX, nY);
ScAddress aCellPos (nX, nY, nTab);
ScCellObj* pCellObj = new ScCellObj(pData->GetDocShell(), aCellPos);
xTarget.set(uno::Reference<table::XCell>(pCellObj), uno::UNO_QUERY);
ScDocument* pDoc = pData->GetDocument();
if (pDoc && pDoc->GetDrawLayer())
{
SdrPage* pDrawPage = NULL;
ScDrawLayer* pDrawLayer = pDoc->GetDrawLayer();
if (pDrawLayer->HasObjects() && (pDrawLayer->GetPageCount() > nTab))
pDrawPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
SdrView* pDrawView = GetViewShell()->GetSdrView();
if (pDrawPage && pDrawView && pDrawView->GetSdrPageView())
{
Window* pActiveWin = pData->GetActiveWin();
Point aPos = pActiveWin->PixelToLogic(rPoint);
sal_uInt16 nHitLog = (sal_uInt16) pActiveWin->PixelToLogic(
Size(pDrawView->GetHitTolerancePixel(),0)).Width();
sal_uInt32 nCount(pDrawPage->GetObjCount());
sal_Bool bFound(sal_False);
sal_uInt32 i(0);
while (i < nCount && !bFound)
{
SdrObject* pObj = pDrawPage->GetObj(i);
if (pObj && SdrObjectPrimitiveHit(*pObj, aPos, nHitLog, *pDrawView->GetSdrPageView(), 0, false))
{
xTarget.set(pObj->getUnoShape(), uno::UNO_QUERY);
bFound = sal_True;
}
++i;
}
}
}
}
return xTarget;
}
bool ScTabViewObj::IsMouseListening() const
{
if ( aMouseClickHandlers.Count() > 0 )
return true;
// also include sheet events, because MousePressed must be called for them
ScViewData* pViewData = GetViewShell()->GetViewData();
ScDocument* pDoc = pViewData->GetDocument();
SCTAB nTab = pViewData->GetTabNo();
return
pDoc->HasSheetEventScript( nTab, SC_SHEETEVENT_RIGHTCLICK, true ) ||
pDoc->HasSheetEventScript( nTab, SC_SHEETEVENT_DOUBLECLICK, true );
}
sal_Bool ScTabViewObj::MousePressed( const awt::MouseEvent& e )
throw (::uno::RuntimeException)
{
sal_Bool bReturn(sal_False);
uno::Reference< uno::XInterface > xTarget = GetClickedObject(Point(e.X, e.Y));
if (aMouseClickHandlers.Count() && xTarget.is())
{
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.Modifiers = e.Modifiers;
for ( sal_uInt16 n=0; n<aMouseClickHandlers.Count(); n++ )
{
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
}
}
}
// handle sheet events
bool bDoubleClick = ( e.Buttons == awt::MouseButton::LEFT && e.ClickCount == 2 );
bool bRightClick = ( e.Buttons == awt::MouseButton::RIGHT && e.ClickCount == 1 );
if ( ( bDoubleClick || bRightClick ) && !bReturn && xTarget.is())
{
sal_Int32 nEvent = bDoubleClick ? SC_SHEETEVENT_DOUBLECLICK : SC_SHEETEVENT_RIGHTCLICK;
ScTabViewShell* pViewSh = GetViewShell();
ScViewData* pViewData = pViewSh->GetViewData();
ScDocShell* pDocSh = pViewData->GetDocShell();
ScDocument* pDoc = pDocSh->GetDocument();
SCTAB nTab = pViewData->GetTabNo();
const ScSheetEvents* pEvents = pDoc->GetSheetEvents(nTab);
if (pEvents)
{
const rtl::OUString* pScript = pEvents->GetScript(nEvent);
if (pScript)
{
// the macro parameter is the clicked object, as in the mousePressed call above
uno::Sequence<uno::Any> aParams(1);
aParams[0] <<= xTarget;
uno::Any aRet;
uno::Sequence<sal_Int16> aOutArgsIndex;
uno::Sequence<uno::Any> aOutArgs;
/*ErrCode eRet =*/ pDocSh->CallXScript( *pScript, aParams, aRet, aOutArgsIndex, aOutArgs );
// look for a boolean return value of true
sal_Bool bRetValue = sal_False;
if (aRet >>= bRetValue)
{
if (bRetValue)
bReturn = sal_True;
}
}
}
// execute VBA event handler
if (!bReturn && xTarget.is()) try
{
uno::Reference< script::vba::XVBAEventProcessor > xVbaEvents( pDoc->GetVbaEventProcessor(), uno::UNO_SET_THROW );
// the parameter is the clicked object, as in the mousePressed call above
uno::Sequence< uno::Any > aArgs( 1 );
aArgs[ 0 ] <<= xTarget;
xVbaEvents->processVbaEvent( ScSheetEvents::GetVbaSheetEventId( nEvent ), aArgs );
}
catch( util::VetoException& )
{
bReturn = sal_True;
}
catch( uno::Exception& )
{
}
}
return bReturn;
}
sal_Bool ScTabViewObj::MouseReleased( const awt::MouseEvent& e )
throw (uno::RuntimeException)
{
sal_Bool bReturn(sal_False);
if (aMouseClickHandlers.Count())
{
uno::Reference< uno::XInterface > xTarget = GetClickedObject(Point(e.X, e.Y));
if (xTarget.is())
{
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.Modifiers = e.Modifiers;
for ( sal_uInt16 n=0; n<aMouseClickHandlers.Count(); n++ )
{
try
{
if (!(*aMouseClickHandlers[n])->mouseReleased( aMouseEvent ))
bReturn = sal_True;
}
catch ( uno::Exception& )
{
aMouseClickHandlers.DeleteAndDestroy(n);
--n; // because it will be increased again in the loop
}
}
}
}
return bReturn;
}
// XEnhancedMouseClickBroadcaster
void ScTabViewObj::StartMouseListening()
{
}
void ScTabViewObj::EndMouseListening()
{
sal_uInt16 nCount(aMouseClickHandlers.Count());
lang::EventObject aEvent;
aEvent.Source = (cppu::OWeakObject*)this;
for ( sal_uInt16 n=0; n<nCount; n++ )
{
try
{
(*aMouseClickHandlers[n])->disposing(aEvent);
}
catch ( uno::Exception& )
{
}
}
aMouseClickHandlers.DeleteAndDestroy(0, nCount);
}
void ScTabViewObj::StartActivationListening()
{
}
void ScTabViewObj::EndActivationListening()
{
sal_uInt16 nCount = aActivationListeners.Count();
lang::EventObject aEvent;
aEvent.Source = (cppu::OWeakObject*)this;
for ( sal_uInt16 n=0; n<nCount; n++ )
{
try
{
(*aActivationListeners[n])->disposing(aEvent);
}
catch ( uno::Exception& )
{
}
}
aActivationListeners.DeleteAndDestroy(0, nCount);
}
void SAL_CALL ScTabViewObj::addEnhancedMouseClickHandler( const uno::Reference< awt::XEnhancedMouseClickHandler >& aListener )
throw (uno::RuntimeException)
{
ScUnoGuard aGuard;
if (aListener.is())
{
sal_uInt16 nCount = aMouseClickHandlers.Count();
uno::Reference<awt::XEnhancedMouseClickHandler> *pObj =
new uno::Reference<awt::XEnhancedMouseClickHandler>( aListener );
aMouseClickHandlers.Insert( pObj, nCount );
if (aMouseClickHandlers.Count() == 1 && nCount == 0) // only if a listener added
StartMouseListening();
}
}
void SAL_CALL ScTabViewObj::removeEnhancedMouseClickHandler( const uno::Reference< awt::XEnhancedMouseClickHandler >& aListener )
throw (uno::RuntimeException)
{
ScUnoGuard aGuard;
sal_uInt16 nCount = aMouseClickHandlers.Count();
for ( sal_uInt16 n=nCount; n--; )
{
uno::Reference<awt::XEnhancedMouseClickHandler> *pObj = aMouseClickHandlers[n];
if ( *pObj == aListener )
aMouseClickHandlers.DeleteAndDestroy( n );
}
if ((aMouseClickHandlers.Count() == 0) && (nCount > 0)) // only if last listener removed
EndMouseListening();
}
// XActivationBroadcaster
void SAL_CALL ScTabViewObj::addActivationEventListener( const uno::Reference< sheet::XActivationEventListener >& aListener )
throw (uno::RuntimeException)
{
ScUnoGuard aGuard;
if (aListener.is())
{
sal_uInt16 nCount = aActivationListeners.Count();
uno::Reference<sheet::XActivationEventListener> *pObj =
new uno::Reference<sheet::XActivationEventListener>( aListener );
aActivationListeners.Insert( pObj, nCount );
if (aActivationListeners.Count() == 1 && nCount == 0) // only if a listener added
StartActivationListening();
}
}
void SAL_CALL ScTabViewObj::removeActivationEventListener( const uno::Reference< sheet::XActivationEventListener >& aListener )
throw (uno::RuntimeException)
{
ScUnoGuard aGuard;
sal_uInt16 nCount = aActivationListeners.Count();
for ( sal_uInt16 n=nCount; n--; )
{
uno::Reference<sheet::XActivationEventListener> *pObj = aActivationListeners[n];
if ( *pObj == aListener )
aActivationListeners.DeleteAndDestroy( n );
}
if ((aActivationListeners.Count() == 0) && (nCount > 0)) // only if last listener removed
EndActivationListening();
}
// PageBreakMode / Zoom sind Properties
#if 0
sal_Bool ScTabViewObj::getPagebreakMode(void) const
{
ScUnoGuard aGuard;
ScTabViewShell* pViewSh = GetViewShell();
if (pViewSh)
return pViewSh->GetViewData()->IsPagebreakMode();
return sal_False;
}
void ScTabViewObj::setPagebreakMode(sal_Bool PagebreakMode)
{
ScUnoGuard aGuard;
ScTabViewShell* pViewSh = GetViewShell();
if (pViewSh)
pViewSh->SetPagebreakMode(PagebreakMode);
}
#endif
sal_Int16 ScTabViewObj::GetZoom(void) const
{
ScTabViewShell* pViewSh = GetViewShell();
if (pViewSh)
{
const Fraction& rZoomY = pViewSh->GetViewData()->GetZoomY(); // Y wird angezeigt
return (sal_Int16)(( rZoomY.GetNumerator() * 100 ) / rZoomY.GetDenominator());
}
return 0;
}
void ScTabViewObj::SetZoom(sal_Int16 nZoom)
{
ScTabViewShell* pViewSh = GetViewShell();
if (pViewSh)
{
if ( nZoom != GetZoom() && nZoom != 0 )
{
if (!pViewSh->GetViewData()->IsPagebreakMode())
{
ScModule* pScMod = SC_MOD();
ScAppOptions aNewOpt(pScMod->GetAppOptions());
aNewOpt.SetZoom( nZoom );
aNewOpt.SetZoomType( pViewSh->GetViewData()->GetView()->GetZoomType() );
pScMod->SetAppOptions( aNewOpt );
}
}
Fraction aFract( nZoom, 100 );
pViewSh->SetZoom( aFract, aFract, sal_True );
pViewSh->PaintGrid();
pViewSh->PaintTop();
pViewSh->PaintLeft();
pViewSh->GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOM );
pViewSh->GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOMSLIDER );
}
}
sal_Int16 ScTabViewObj::GetZoomType(void) const
{
sal_Int16 aZoomType = view::DocumentZoomType::OPTIMAL;
ScTabViewShell* pViewSh = GetViewShell();
if (pViewSh)
{
SvxZoomType eZoomType = pViewSh->GetViewData()->GetView()->GetZoomType();
switch (eZoomType)
{
case SVX_ZOOM_PERCENT:
aZoomType = view::DocumentZoomType::BY_VALUE;
break;
case SVX_ZOOM_OPTIMAL:
aZoomType = view::DocumentZoomType::OPTIMAL;
break;
case SVX_ZOOM_WHOLEPAGE:
aZoomType = view::DocumentZoomType::ENTIRE_PAGE;
break;
case SVX_ZOOM_PAGEWIDTH:
aZoomType = view::DocumentZoomType::PAGE_WIDTH;
break;
case SVX_ZOOM_PAGEWIDTH_NOBORDER:
aZoomType = view::DocumentZoomType::PAGE_WIDTH_EXACT;
break;
}
}
return aZoomType;
}
void ScTabViewObj::SetZoomType(sal_Int16 aZoomType)
{
ScTabViewShell* pViewSh = GetViewShell();
if (pViewSh)
{
ScDBFunc* pView = pViewSh->GetViewData()->GetView();
if (pView)
{
SvxZoomType eZoomType;
switch (aZoomType)
{
case view::DocumentZoomType::BY_VALUE:
eZoomType = SVX_ZOOM_PERCENT;
break;
case view::DocumentZoomType::OPTIMAL:
eZoomType = SVX_ZOOM_OPTIMAL;
break;
case view::DocumentZoomType::ENTIRE_PAGE:
eZoomType = SVX_ZOOM_WHOLEPAGE;
break;
case view::DocumentZoomType::PAGE_WIDTH:
eZoomType = SVX_ZOOM_PAGEWIDTH;
break;
case view::DocumentZoomType::PAGE_WIDTH_EXACT:
eZoomType = SVX_ZOOM_PAGEWIDTH_NOBORDER;
break;
default:
eZoomType = SVX_ZOOM_OPTIMAL;
}
sal_Int16 nZoom(GetZoom());
sal_Int16 nOldZoom(nZoom);
if ( eZoomType == SVX_ZOOM_PERCENT )
{
if ( nZoom < MINZOOM ) nZoom = MINZOOM;
if ( nZoom > MAXZOOM ) nZoom = MAXZOOM;
}
else
nZoom = pView->CalcZoom( eZoomType, nOldZoom );
switch ( eZoomType )
{
case SVX_ZOOM_WHOLEPAGE:
case SVX_ZOOM_PAGEWIDTH:
pView->SetZoomType( eZoomType, sal_True );
break;
default:
pView->SetZoomType( SVX_ZOOM_PERCENT, sal_True );
}
SetZoom( nZoom );
}
}
}
sal_Bool SAL_CALL ScTabViewObj::getIsWindowSplit() throw(uno::RuntimeException)
{
ScUnoGuard aGuard;
// wie Menue-Slot SID_WINDOW_SPLIT
ScTabViewShell* pViewSh = GetViewShell();
if (pViewSh)
{
ScViewData* pViewData = pViewSh->GetViewData();
return ( pViewData->GetHSplitMode() == SC_SPLIT_NORMAL ||
pViewData->GetVSplitMode() == SC_SPLIT_NORMAL );
}
return sal_False;
}
sal_Bool SAL_CALL ScTabViewObj::hasFrozenPanes() throw(uno::RuntimeException)
{
ScUnoGuard aGuard;
// wie Menue-Slot SID_WINDOW_FIX
ScTabViewShell* pViewSh = GetViewShell();
if (pViewSh)
{
ScViewData* pViewData = pViewSh->GetViewData();
return ( pViewData->GetHSplitMode() == SC_SPLIT_FIX ||
pViewData->GetVSplitMode() == SC_SPLIT_FIX );
}
return sal_False;
}
sal_Int32 SAL_CALL ScTabViewObj::getSplitHorizontal() throw(uno::RuntimeException)
{
ScUnoGuard aGuard;
ScTabViewShell* pViewSh = GetViewShell();
if (pViewSh)
{
ScViewData* pViewData = pViewSh->GetViewData();
if ( pViewData->GetHSplitMode() != SC_SPLIT_NONE )
return pViewData->GetHSplitPos();
}
return 0;
}
sal_Int32 SAL_CALL ScTabViewObj::getSplitVertical() throw(uno::RuntimeException)
{
ScUnoGuard aGuard;
ScTabViewShell* pViewSh = GetViewShell();
if (pViewSh)
{
ScViewData* pViewData = pViewSh->GetViewData();
if ( pViewData->GetVSplitMode() != SC_SPLIT_NONE )
return pViewData->GetVSplitPos();
}
return 0;
}
sal_Int32 SAL_CALL ScTabViewObj::getSplitColumn() throw(uno::RuntimeException)
{
ScUnoGuard aGuard;
ScTabViewShell* pViewSh = GetViewShell();
if (pViewSh)
{
ScViewData* pViewData = pViewSh->GetViewData();
if ( pViewData->GetHSplitMode() != SC_SPLIT_NONE )
{
long nSplit = pViewData->GetHSplitPos();
ScSplitPos ePos = SC_SPLIT_BOTTOMLEFT;
if ( pViewData->GetVSplitMode() != SC_SPLIT_NONE )
ePos = SC_SPLIT_TOPLEFT;
SCsCOL nCol;
SCsROW nRow;
pViewData->GetPosFromPixel( nSplit, 0, ePos, nCol, nRow, sal_False );
if ( nCol > 0 )
return nCol;
}
}
return 0;
}
sal_Int32 SAL_CALL ScTabViewObj::getSplitRow() throw(uno::RuntimeException)
{
ScUnoGuard aGuard;
ScTabViewShell* pViewSh = GetViewShell();
if (pViewSh)
{
ScViewData* pViewData = pViewSh->GetViewData();
if ( pViewData->GetVSplitMode() != SC_SPLIT_NONE )
{
long nSplit = pViewData->GetVSplitPos();
ScSplitPos ePos = SC_SPLIT_TOPLEFT; // es ist vertikal geteilt
SCsCOL nCol;
SCsROW nRow;
pViewData->GetPosFromPixel( 0, nSplit, ePos, nCol, nRow, sal_False );
if ( nRow > 0 )
return nRow;
}
}
return 0;
}
void SAL_CALL ScTabViewObj::splitAtPosition( sal_Int32 nPixelX, sal_Int32 nPixelY )
throw(uno::RuntimeException)
{
ScUnoGuard aGuard;
ScTabViewShell* pViewSh = GetViewShell();
if (pViewSh)
{
pViewSh->SplitAtPixel( Point( nPixelX, nPixelY ), sal_True, sal_True );
pViewSh->FreezeSplitters( sal_False );
pViewSh->InvalidateSplit();
}
}
void SAL_CALL ScTabViewObj::freezeAtPosition( sal_Int32 nColumns, sal_Int32 nRows )
throw(uno::RuntimeException)
{
ScUnoGuard aGuard;
ScTabViewShell* pViewSh = GetViewShell();
if (pViewSh)
{
// erst alles aufheben -> kein Stress mit Scrolling zwischendurch o.ae.
pViewSh->RemoveSplit();
Point aWinStart;
Window* pWin = pViewSh->GetWindowByPos( SC_SPLIT_BOTTOMLEFT );
if (pWin)
aWinStart = pWin->GetPosPixel();
ScViewData* pViewData = pViewSh->GetViewData();
Point aSplit(pViewData->GetScrPos( (SCCOL)nColumns, (SCROW)nRows, SC_SPLIT_BOTTOMLEFT, sal_True ));
aSplit += aWinStart;
pViewSh->SplitAtPixel( aSplit, sal_True, sal_True );
pViewSh->FreezeSplitters( sal_True );
pViewSh->InvalidateSplit();
}
}
void SAL_CALL ScTabViewObj::addSelectionChangeListener(
const uno::Reference<view::XSelectionChangeListener>& xListener )
throw(uno::RuntimeException)
{
ScUnoGuard aGuard;
uno::Reference<view::XSelectionChangeListener>* pObj =
new uno::Reference<view::XSelectionChangeListener>( xListener );
aSelectionListeners.Insert( pObj, aSelectionListeners.Count() );
}
void SAL_CALL ScTabViewObj::removeSelectionChangeListener(
const uno::Reference< view::XSelectionChangeListener >& xListener )
throw(uno::RuntimeException)
{
ScUnoGuard aGuard;
sal_uInt16 nCount = aSelectionListeners.Count();
for ( sal_uInt16 n=nCount; n--; )
{
uno::Reference<view::XSelectionChangeListener> *pObj = aSelectionListeners[n];
if ( *pObj == xListener ) //! wozu der Mumpitz mit queryInterface?
{
aSelectionListeners.DeleteAndDestroy( n );
break;
}
}
}
void ScTabViewObj::SelectionChanged()
{
lang::EventObject aEvent;
aEvent.Source.set(static_cast<cppu::OWeakObject*>(this));
for ( sal_uInt16 n=0; n<aSelectionListeners.Count(); n++ )
(*aSelectionListeners[n])->selectionChanged( aEvent );
// handle sheet events
ScTabViewShell* pViewSh = GetViewShell();
ScViewData* pViewData = pViewSh->GetViewData();
ScDocShell* pDocSh = pViewData->GetDocShell();
ScDocument* pDoc = pDocSh->GetDocument();
SCTAB nTab = pViewData->GetTabNo();
const ScSheetEvents* pEvents = pDoc->GetSheetEvents(nTab);
if (pEvents)
{
const rtl::OUString* pScript = pEvents->GetScript(SC_SHEETEVENT_SELECT);
if (pScript)
{
// the macro parameter is the selection as returned by getSelection
uno::Sequence<uno::Any> aParams(1);
aParams[0] = getSelection();
uno::Any aRet;
uno::Sequence<sal_Int16> aOutArgsIndex;
uno::Sequence<uno::Any> aOutArgs;
/*ErrCode eRet =*/ pDocSh->CallXScript( *pScript, aParams, aRet, aOutArgsIndex, aOutArgs );
}
}
// execute VBA event handler
try
{
uno::Reference< script::vba::XVBAEventProcessor > xVbaEvents( pDoc->GetVbaEventProcessor(), uno::UNO_SET_THROW );
// the parameter is the clicked object, as in the mousePressed call above
uno::Sequence< uno::Any > aArgs( 1 );
aArgs[ 0 ] <<= getSelection();
xVbaEvents->processVbaEvent( ScSheetEvents::GetVbaSheetEventId( SC_SHEETEVENT_SELECT ), aArgs );
}
catch( uno::Exception& )
{
}
}
// XPropertySet (View-Optionen)
//! auch an der Applikation anbieten?
uno::Reference<beans::XPropertySetInfo> SAL_CALL ScTabViewObj::getPropertySetInfo()
throw(uno::RuntimeException)
{
ScUnoGuard aGuard;
static uno::Reference<beans::XPropertySetInfo> aRef(
new SfxItemPropertySetInfo( aPropSet.getPropertyMap() ));
return aRef;
}
void SAL_CALL ScTabViewObj::setPropertyValue(
const rtl::OUString& aPropertyName, const uno::Any& aValue )
throw(beans::UnknownPropertyException, beans::PropertyVetoException,
lang::IllegalArgumentException, lang::WrappedTargetException,
uno::RuntimeException)
{
ScUnoGuard aGuard;
String aString(aPropertyName);
ScTabViewShell* pViewSh = GetViewShell();
if (pViewSh)
{
ScViewData* pViewData = pViewSh->GetViewData();
const ScViewOptions& rOldOpt = pViewSh->GetViewData()->GetOptions();
ScViewOptions aNewOpt(rOldOpt);
if ( aString.EqualsAscii( SC_UNO_COLROWHDR ) || aString.EqualsAscii( OLD_UNO_COLROWHDR ) )
aNewOpt.SetOption( VOPT_HEADER, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
else if ( aString.EqualsAscii( SC_UNO_HORSCROLL ) || aString.EqualsAscii( OLD_UNO_HORSCROLL ) )
aNewOpt.SetOption( VOPT_HSCROLL, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
else if ( aString.EqualsAscii( SC_UNO_OUTLSYMB ) || aString.EqualsAscii( OLD_UNO_OUTLSYMB ) )
aNewOpt.SetOption( VOPT_OUTLINER, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
else if ( aString.EqualsAscii( SC_UNO_SHEETTABS ) || aString.EqualsAscii( OLD_UNO_SHEETTABS ) )
aNewOpt.SetOption( VOPT_TABCONTROLS, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
else if ( aString.EqualsAscii( SC_UNO_SHOWANCHOR ) )
aNewOpt.SetOption( VOPT_ANCHOR, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
else if ( aString.EqualsAscii( SC_UNO_SHOWFORM ) )
aNewOpt.SetOption( VOPT_FORMULAS, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
else if ( aString.EqualsAscii( SC_UNO_SHOWGRID ) )
aNewOpt.SetOption( VOPT_GRID, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
else if ( aString.EqualsAscii( SC_UNO_SHOWHELP ) )
aNewOpt.SetOption( VOPT_HELPLINES, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
else if ( aString.EqualsAscii( SC_UNO_SHOWNOTES ) )
aNewOpt.SetOption( VOPT_NOTES, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
else if ( aString.EqualsAscii( SC_UNO_SHOWPAGEBR ) )
aNewOpt.SetOption( VOPT_PAGEBREAKS, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
else if ( aString.EqualsAscii( SC_UNO_SHOWZERO ) )
aNewOpt.SetOption( VOPT_NULLVALS, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
else if ( aString.EqualsAscii( SC_UNO_SHOWSOLID ) )
aNewOpt.SetOption( VOPT_SOLIDHANDLES, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
else if ( aString.EqualsAscii( SC_UNO_VALUEHIGH ) || aString.EqualsAscii( OLD_UNO_VALUEHIGH ) )
aNewOpt.SetOption( VOPT_SYNTAX, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
else if ( aString.EqualsAscii( SC_UNO_VERTSCROLL ) || aString.EqualsAscii( OLD_UNO_VERTSCROLL ) )
aNewOpt.SetOption( VOPT_VSCROLL, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
else if ( aString.EqualsAscii( SC_UNO_SHOWOBJ ) )
{
sal_Int16 nIntVal = 0;
if ( aValue >>= nIntVal )
{
//#i80528# adapt to new range eventually
if((sal_Int16)VOBJ_MODE_HIDE < nIntVal) nIntVal = (sal_Int16)VOBJ_MODE_SHOW;
aNewOpt.SetObjMode( VOBJ_TYPE_OLE, (ScVObjMode)nIntVal);
}
}
else if ( aString.EqualsAscii( SC_UNO_SHOWCHARTS ) )
{
sal_Int16 nIntVal = 0;
if ( aValue >>= nIntVal )
{
//#i80528# adapt to new range eventually
if((sal_Int16)VOBJ_MODE_HIDE < nIntVal) nIntVal = (sal_Int16)VOBJ_MODE_SHOW;
aNewOpt.SetObjMode( VOBJ_TYPE_CHART, (ScVObjMode)nIntVal);
}
}
else if ( aString.EqualsAscii( SC_UNO_SHOWDRAW ) )
{
sal_Int16 nIntVal = 0;
if ( aValue >>= nIntVal )
{
//#i80528# adapt to new range eventually
if((sal_Int16)VOBJ_MODE_HIDE < nIntVal) nIntVal = (sal_Int16)VOBJ_MODE_SHOW;
aNewOpt.SetObjMode( VOBJ_TYPE_DRAW, (ScVObjMode)nIntVal);
}
}
else if ( aString.EqualsAscii( SC_UNO_GRIDCOLOR ) )
{
sal_Int32 nIntVal = 0;
if ( aValue >>= nIntVal )
aNewOpt.SetGridColor( nIntVal, String() );
}
else if ( aString.EqualsAscii( SC_UNO_ZOOMTYPE ) )
{
sal_Int16 nIntVal = 0;
if ( aValue >>= nIntVal )
SetZoomType(nIntVal);
}
else if ( aString.EqualsAscii( SC_UNO_ZOOMVALUE ) )
{
sal_Int16 nIntVal = 0;
if ( aValue >>= nIntVal )
SetZoom(nIntVal);
}
// Optionen werden an der View und am Dokument (fuer neue Views) gesetzt,
// damit sie beim Speichern erhalten bleiben.
//! An der App (Module) braeuchte man noch eine Extra-Moeglichkeit,
//! das einzustellen (fuer neue Dokumente)
if ( aNewOpt != rOldOpt )
{
pViewData->SetOptions( aNewOpt );
pViewData->GetDocument()->SetViewOptions( aNewOpt );
pViewData->GetDocShell()->SetDocumentModified(); //! wirklich?
pViewSh->UpdateFixPos();
pViewSh->PaintGrid();
pViewSh->PaintTop();
pViewSh->PaintLeft();
pViewSh->PaintExtras();
pViewSh->InvalidateBorder();
SfxBindings& rBindings = pViewSh->GetViewFrame()->GetBindings();
rBindings.Invalidate( FID_TOGGLEHEADERS ); // -> Checks im Menue
rBindings.Invalidate( FID_TOGGLESYNTAX );
}
}
}
uno::Any SAL_CALL ScTabViewObj::getPropertyValue( const rtl::OUString& aPropertyName )
throw(beans::UnknownPropertyException, lang::WrappedTargetException,
uno::RuntimeException)
{
ScUnoGuard aGuard;
String aString(aPropertyName);
uno::Any aRet;
ScTabViewShell* pViewSh = GetViewShell();
if (pViewSh)
{
const ScViewOptions& rOpt = pViewSh->GetViewData()->GetOptions();
if ( aString.EqualsAscii( SC_UNO_COLROWHDR ) || aString.EqualsAscii( OLD_UNO_COLROWHDR ) )
ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_HEADER ) );
else if ( aString.EqualsAscii( SC_UNO_HORSCROLL ) || aString.EqualsAscii( OLD_UNO_HORSCROLL ) )
ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_HSCROLL ) );
else if ( aString.EqualsAscii( SC_UNO_OUTLSYMB ) || aString.EqualsAscii( OLD_UNO_OUTLSYMB ) )
ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_OUTLINER ) );
else if ( aString.EqualsAscii( SC_UNO_SHEETTABS ) || aString.EqualsAscii( OLD_UNO_SHEETTABS ) )
ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_TABCONTROLS ) );
else if ( aString.EqualsAscii( SC_UNO_SHOWANCHOR ) ) ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_ANCHOR ) );
else if ( aString.EqualsAscii( SC_UNO_SHOWFORM ) ) ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_FORMULAS ) );
else if ( aString.EqualsAscii( SC_UNO_SHOWGRID ) ) ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_GRID ) );
else if ( aString.EqualsAscii( SC_UNO_SHOWHELP ) ) ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_HELPLINES ) );
else if ( aString.EqualsAscii( SC_UNO_SHOWNOTES ) ) ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_NOTES ) );
else if ( aString.EqualsAscii( SC_UNO_SHOWPAGEBR ) ) ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_PAGEBREAKS ) );
else if ( aString.EqualsAscii( SC_UNO_SHOWZERO ) ) ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_NULLVALS ) );
else if ( aString.EqualsAscii( SC_UNO_SHOWSOLID ) ) ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_SOLIDHANDLES ) );
else if ( aString.EqualsAscii( SC_UNO_VALUEHIGH ) || aString.EqualsAscii( OLD_UNO_VALUEHIGH ) )
ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_SYNTAX ) );
else if ( aString.EqualsAscii( SC_UNO_VERTSCROLL ) || aString.EqualsAscii( OLD_UNO_VERTSCROLL ) )
ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_VSCROLL ) );
else if ( aString.EqualsAscii( SC_UNO_SHOWOBJ ) ) aRet <<= (sal_Int16)( rOpt.GetObjMode( VOBJ_TYPE_OLE ) );
else if ( aString.EqualsAscii( SC_UNO_SHOWCHARTS ) ) aRet <<= (sal_Int16)( rOpt.GetObjMode( VOBJ_TYPE_CHART ) );
else if ( aString.EqualsAscii( SC_UNO_SHOWDRAW ) ) aRet <<= (sal_Int16)( rOpt.GetObjMode( VOBJ_TYPE_DRAW ) );
else if ( aString.EqualsAscii( SC_UNO_GRIDCOLOR ) ) aRet <<= (sal_Int32)( rOpt.GetGridColor().GetColor() );
else if ( aString.EqualsAscii( SC_UNO_VISAREA ) ) aRet <<= GetVisArea();
else if ( aString.EqualsAscii( SC_UNO_ZOOMTYPE ) ) aRet <<= GetZoomType();
else if ( aString.EqualsAscii( SC_UNO_ZOOMVALUE ) ) aRet <<= GetZoom();
else if ( aString.EqualsAscii( SC_UNO_VISAREASCREEN ) )
{
ScViewData* pViewData = pViewSh->GetViewData();
Window* pActiveWin = ( pViewData ? pViewData->GetActiveWin() : NULL );
if ( pActiveWin )
{
Rectangle aRect = pActiveWin->GetWindowExtentsRelative( NULL );
aRet <<= AWTRectangle( aRect );
}
}
}
return aRet;
}
void SAL_CALL ScTabViewObj::addPropertyChangeListener( const ::rtl::OUString& /* aPropertyName */,
const uno::Reference<beans::XPropertyChangeListener >& xListener )
throw(beans::UnknownPropertyException,
lang::WrappedTargetException,
uno::RuntimeException)
{
ScUnoGuard aGuard;
uno::Reference<beans::XPropertyChangeListener>* pObj =
new uno::Reference<beans::XPropertyChangeListener>( xListener );
aPropertyChgListeners.Insert( pObj, aPropertyChgListeners.Count() );
}
void SAL_CALL ScTabViewObj::removePropertyChangeListener( const ::rtl::OUString& /* aPropertyName */,
const uno::Reference<beans::XPropertyChangeListener >& xListener )
throw(beans::UnknownPropertyException,
lang::WrappedTargetException,
uno::RuntimeException)
{
ScUnoGuard aGuard;
sal_uInt16 nCount = aPropertyChgListeners.Count();
for ( sal_uInt16 n=nCount; n--; )
{
uno::Reference<beans::XPropertyChangeListener> *pObj = aPropertyChgListeners[n];
if ( *pObj == xListener ) //! wozu der Mumpitz mit queryInterface?
{
aPropertyChgListeners.DeleteAndDestroy( n );
break;
}
}
}
void SAL_CALL ScTabViewObj::addVetoableChangeListener( const ::rtl::OUString& /* PropertyName */,
const uno::Reference<beans::XVetoableChangeListener >& /* aListener */ )
throw(beans::UnknownPropertyException,
lang::WrappedTargetException,
uno::RuntimeException)
{
}
void SAL_CALL ScTabViewObj::removeVetoableChangeListener( const ::rtl::OUString& /* PropertyName */,
const uno::Reference<beans::XVetoableChangeListener >& /* aListener */ )
throw(beans::UnknownPropertyException,
lang::WrappedTargetException,
uno::RuntimeException)
{
}
void ScTabViewObj::VisAreaChanged()
{
beans::PropertyChangeEvent aEvent;
aEvent.Source.set(static_cast<cppu::OWeakObject*>(this));
for ( sal_uInt16 n=0; n<aPropertyChgListeners.Count(); n++ )
(*aPropertyChgListeners[n])->propertyChange( aEvent );
}
// XRangeSelection
void SAL_CALL ScTabViewObj::startRangeSelection(
const uno::Sequence<beans::PropertyValue>& aArguments )
throw(uno::RuntimeException)
{
ScUnoGuard aGuard;
ScTabViewShell* pViewSh = GetViewShell();
if (pViewSh)
{
String aInitVal, aTitle;
sal_Bool bCloseOnButtonUp = sal_False;
sal_Bool bSingleCell = sal_False;
sal_Bool bMultiSelection = sal_False;
rtl::OUString aStrVal;
const beans::PropertyValue* pPropArray = aArguments.getConstArray();
long nPropCount = aArguments.getLength();
for (long i = 0; i < nPropCount; i++)
{
const beans::PropertyValue& rProp = pPropArray[i];
String aPropName(rProp.Name);
if (aPropName.EqualsAscii( SC_UNONAME_CLOSEONUP ))
bCloseOnButtonUp = ScUnoHelpFunctions::GetBoolFromAny( rProp.Value );
else if (aPropName.EqualsAscii( SC_UNONAME_TITLE ))
{
if ( rProp.Value >>= aStrVal )
aTitle = String( aStrVal );
}
else if (aPropName.EqualsAscii( SC_UNONAME_INITVAL ))
{
if ( rProp.Value >>= aStrVal )
aInitVal = String( aStrVal );
}
else if (aPropName.EqualsAscii( SC_UNONAME_SINGLECELL ))
bSingleCell = ScUnoHelpFunctions::GetBoolFromAny( rProp.Value );
else if (aPropName.EqualsAscii( SC_UNONAME_MULTISEL ))
bMultiSelection = ScUnoHelpFunctions::GetBoolFromAny( rProp.Value );
}
pViewSh->StartSimpleRefDialog( aTitle, aInitVal, bCloseOnButtonUp, bSingleCell, bMultiSelection );
}
}
void SAL_CALL ScTabViewObj::abortRangeSelection() throw(uno::RuntimeException)
{
ScUnoGuard aGuard;
ScTabViewShell* pViewSh = GetViewShell();
if (pViewSh)
pViewSh->StopSimpleRefDialog();
}
void SAL_CALL ScTabViewObj::addRangeSelectionListener(
const uno::Reference<sheet::XRangeSelectionListener>& xListener )
throw(uno::RuntimeException)
{
ScUnoGuard aGuard;
uno::Reference<sheet::XRangeSelectionListener>* pObj =
new uno::Reference<sheet::XRangeSelectionListener>( xListener );
aRangeSelListeners.Insert( pObj, aRangeSelListeners.Count() );
}
void SAL_CALL ScTabViewObj::removeRangeSelectionListener(
const uno::Reference<sheet::XRangeSelectionListener>& xListener )
throw(uno::RuntimeException)
{
ScUnoGuard aGuard;
sal_uInt16 nCount = aRangeSelListeners.Count();
for ( sal_uInt16 n=nCount; n--; )
{
uno::Reference<sheet::XRangeSelectionListener> *pObj = aRangeSelListeners[n];
if ( *pObj == xListener )
{
aRangeSelListeners.DeleteAndDestroy( n );
break;
}
}
}
void SAL_CALL ScTabViewObj::addRangeSelectionChangeListener(
const uno::Reference<sheet::XRangeSelectionChangeListener>& xListener )
throw(uno::RuntimeException)
{
ScUnoGuard aGuard;
uno::Reference<sheet::XRangeSelectionChangeListener>* pObj =
new uno::Reference<sheet::XRangeSelectionChangeListener>( xListener );
aRangeChgListeners.Insert( pObj, aRangeChgListeners.Count() );
}
void SAL_CALL ScTabViewObj::removeRangeSelectionChangeListener(
const uno::Reference<sheet::XRangeSelectionChangeListener>& xListener )
throw(uno::RuntimeException)
{
ScUnoGuard aGuard;
sal_uInt16 nCount = aRangeChgListeners.Count();
for ( sal_uInt16 n=nCount; n--; )
{
uno::Reference<sheet::XRangeSelectionChangeListener> *pObj = aRangeChgListeners[n];
if ( *pObj == xListener )
{
aRangeChgListeners.DeleteAndDestroy( n );
break;
}
}
}
void ScTabViewObj::RangeSelDone( const String& rText )
{
sheet::RangeSelectionEvent aEvent;
aEvent.Source.set(static_cast<cppu::OWeakObject*>(this));
aEvent.RangeDescriptor = rtl::OUString( rText );
for ( sal_uInt16 n=0; n<aRangeSelListeners.Count(); n++ )
(*aRangeSelListeners[n])->done( aEvent );
}
void ScTabViewObj::RangeSelAborted( const String& rText )
{
sheet::RangeSelectionEvent aEvent;
aEvent.Source.set(static_cast<cppu::OWeakObject*>(this));
aEvent.RangeDescriptor = rtl::OUString( rText );
for ( sal_uInt16 n=0; n<aRangeSelListeners.Count(); n++ )
(*aRangeSelListeners[n])->aborted( aEvent );
}
void ScTabViewObj::RangeSelChanged( const String& rText )
{
sheet::RangeSelectionEvent aEvent;
aEvent.Source.set(static_cast<cppu::OWeakObject*>(this));
aEvent.RangeDescriptor = rtl::OUString( rText );
for ( sal_uInt16 n=0; n<aRangeChgListeners.Count(); n++ )
(*aRangeChgListeners[n])->descriptorChanged( aEvent );
}
// XServiceInfo
rtl::OUString SAL_CALL ScTabViewObj::getImplementationName() throw(uno::RuntimeException)
{
return rtl::OUString::createFromAscii( "ScTabViewObj" );
}
sal_Bool SAL_CALL ScTabViewObj::supportsService( const rtl::OUString& rServiceName )
throw(uno::RuntimeException)
{
String aServiceStr( rServiceName );
return aServiceStr.EqualsAscii( SCTABVIEWOBJ_SERVICE ) ||
aServiceStr.EqualsAscii( SCVIEWSETTINGS_SERVICE );
}
uno::Sequence<rtl::OUString> SAL_CALL ScTabViewObj::getSupportedServiceNames()
throw(uno::RuntimeException)
{
uno::Sequence<rtl::OUString> aRet(2);
rtl::OUString* pArray = aRet.getArray();
pArray[0] = rtl::OUString::createFromAscii( SCTABVIEWOBJ_SERVICE );
pArray[1] = rtl::OUString::createFromAscii( SCVIEWSETTINGS_SERVICE );
return aRet;
}
// XUnoTunnel
sal_Int64 SAL_CALL ScTabViewObj::getSomething(
const uno::Sequence<sal_Int8 >& rId ) throw(uno::RuntimeException)
{
if ( rId.getLength() == 16 &&
0 == rtl_compareMemory( getUnoTunnelId().getConstArray(),
rId.getConstArray(), 16 ) )
{
return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this));
}
return 0;
}
// static
const uno::Sequence<sal_Int8>& ScTabViewObj::getUnoTunnelId()
{
static uno::Sequence<sal_Int8> * pSeq = 0;
if( !pSeq )
{
osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() );
if( !pSeq )
{
static uno::Sequence< sal_Int8 > aSeq( 16 );
rtl_createUuid( (sal_uInt8*)aSeq.getArray(), 0, sal_True );
pSeq = &aSeq;
}
}
return *pSeq;
}
// static
ScTabViewObj* ScTabViewObj::getImplementation( const uno::Reference<uno::XInterface> xObj )
{
ScTabViewObj* pRet = NULL;
uno::Reference<lang::XUnoTunnel> xUT( xObj, uno::UNO_QUERY );
if (xUT.is())
pRet = reinterpret_cast<ScTabViewObj*>(sal::static_int_cast<sal_IntPtr>(xUT->getSomething(getUnoTunnelId())));
return pRet;
}
::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XTransferable > SAL_CALL ScTabViewObj::getTransferable( ) throw (::com::sun::star::uno::RuntimeException)
{
ScUnoGuard aGuard;
ScEditShell* pShell = PTR_CAST( ScEditShell, GetViewShell()->GetViewFrame()->GetDispatcher()->GetShell(0) );
if (pShell)
return pShell->GetEditView()->GetTransferable();
ScDrawTextObjectBar* pTextShell = PTR_CAST( ScDrawTextObjectBar, GetViewShell()->GetViewFrame()->GetDispatcher()->GetShell(0) );
if (pTextShell)
{
ScViewData* pViewData = GetViewShell()->GetViewData();
ScDrawView* pView = pViewData->GetScDrawView();
OutlinerView* pOutView = pView->GetTextEditOutlinerView();
if (pOutView)
return pOutView->GetEditView().GetTransferable();
}
ScDrawShell* pDrawShell = PTR_CAST( ScDrawShell, GetViewShell()->GetViewFrame()->GetDispatcher()->GetShell(0) );
if (pDrawShell)
return pDrawShell->GetDrawView()->CopyToTransferable();
ScTransferObj* pObj = GetViewShell()->CopyToTransferable();
uno::Reference<datatransfer::XTransferable> xTransferable( pObj );
return xTransferable;
}
void SAL_CALL ScTabViewObj::insertTransferable( const ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XTransferable >& xTrans ) throw (::com::sun::star::datatransfer::UnsupportedFlavorException, ::com::sun::star::uno::RuntimeException)
{
ScUnoGuard aGuard;
ScEditShell* pShell = PTR_CAST( ScEditShell, GetViewShell()->GetViewFrame()->GetDispatcher()->GetShell(0) );
if (pShell)
pShell->GetEditView()->InsertText( xTrans, ::rtl::OUString(), sal_False );
else
{
ScDrawTextObjectBar* pTextShell = PTR_CAST( ScDrawTextObjectBar, GetViewShell()->GetViewFrame()->GetDispatcher()->GetShell(0) );
if (pTextShell)
{
ScViewData* pViewData = GetViewShell()->GetViewData();
ScDrawView* pView = pViewData->GetScDrawView();
OutlinerView* pOutView = pView->GetTextEditOutlinerView();
if ( pOutView )
{
pOutView->GetEditView().InsertText( xTrans, ::rtl::OUString(), sal_False );
return;
}
}
GetViewShell()->PasteFromTransferable( xTrans );
}
}
//------------------------------------------------------------------------