xref: /trunk/main/sc/source/ui/unoobj/viewuno.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sc.hxx"
30 
31 #include <com/sun/star/awt/MouseButton.hpp>
32 #include <com/sun/star/script/vba/VBAEventId.hpp>
33 #include <com/sun/star/script/vba/XVBAEventProcessor.hpp>
34 #include <com/sun/star/view/DocumentZoomType.hpp>
35 
36 #include <editeng/outliner.hxx>
37 #include <svx/fmdpage.hxx>
38 #include <svx/svditer.hxx>
39 #include <svx/svdmark.hxx>
40 #include <svx/svdouno.hxx>
41 #include <svx/svdpage.hxx>
42 #include <svx/svdpagv.hxx>
43 #include <svx/svdview.hxx>
44 #include <svx/unoshape.hxx>
45 #include <svx/unoshcol.hxx>
46 #include <svx/fmshell.hxx>
47 #include <sfx2/bindings.hxx>
48 #include <sfx2/dispatch.hxx>
49 #include <sfx2/printer.hxx>
50 #include <sfx2/request.hxx>
51 #include <sfx2/viewfrm.hxx>
52 #include <rtl/uuid.h>
53 #include <toolkit/helper/convert.hxx>
54 #include <toolkit/helper/vclunohelper.hxx>
55 
56 #include "drawsh.hxx"
57 #include "drtxtob.hxx"
58 #include "transobj.hxx"
59 #include "editsh.hxx"
60 #include "viewuno.hxx"
61 #include "cellsuno.hxx"
62 #include "miscuno.hxx"
63 #include "tabvwsh.hxx"
64 #include "docsh.hxx"
65 #include "drwlayer.hxx"
66 #include "drawview.hxx"
67 #include "fupoor.hxx"
68 #include "sc.hrc"
69 #include "unoguard.hxx"
70 #include "unonames.hxx"
71 #include "scmod.hxx"
72 #include "appoptio.hxx"
73 #include "gridwin.hxx"
74 #include "sheetevents.hxx"
75 #include "AccessibilityHints.hxx"
76 #include <svx/sdrhittesthelper.hxx>
77 
78 using namespace com::sun::star;
79 
80 //------------------------------------------------------------------------
81 
82 //! Clipping-Markierungen
83 
84 //  alles ohne Which-ID, Map nur fuer PropertySetInfo
85 
86 const SfxItemPropertyMapEntry* lcl_GetViewOptPropertyMap()
87 {
88     static SfxItemPropertyMapEntry aViewOptPropertyMap_Impl[] =
89     {
90         {MAP_CHAR_LEN(OLD_UNO_COLROWHDR),   0,  &getBooleanCppuType(),          0, 0},
91         {MAP_CHAR_LEN(SC_UNO_GRIDCOLOR),    0,  &getCppuType((sal_Int32*)0),    0, 0},
92         {MAP_CHAR_LEN(SC_UNO_COLROWHDR),    0,  &getBooleanCppuType(),          0, 0},
93         {MAP_CHAR_LEN(SC_UNO_HORSCROLL),    0,  &getBooleanCppuType(),          0, 0},
94         {MAP_CHAR_LEN(SC_UNO_SHEETTABS),    0,  &getBooleanCppuType(),          0, 0},
95         {MAP_CHAR_LEN(SC_UNO_VERTSCROLL),   0,  &getBooleanCppuType(),          0, 0},
96         {MAP_CHAR_LEN(SC_UNO_HIDESPELL),    0,  &getBooleanCppuType(),          0, 0},  /* deprecated #i91949 */
97         {MAP_CHAR_LEN(OLD_UNO_HORSCROLL),   0,  &getBooleanCppuType(),          0, 0},
98         {MAP_CHAR_LEN(SC_UNO_OUTLSYMB),     0,  &getBooleanCppuType(),          0, 0},
99         {MAP_CHAR_LEN(SC_UNO_VALUEHIGH),    0,  &getBooleanCppuType(),          0, 0},
100         {MAP_CHAR_LEN(OLD_UNO_OUTLSYMB),    0,  &getBooleanCppuType(),          0, 0},
101         {MAP_CHAR_LEN(OLD_UNO_SHEETTABS),   0,  &getBooleanCppuType(),          0, 0},
102         {MAP_CHAR_LEN(SC_UNO_SHOWANCHOR),   0,  &getBooleanCppuType(),          0, 0},
103         {MAP_CHAR_LEN(SC_UNO_SHOWCHARTS),   0,  &getCppuType((sal_Int16*)0),    0, 0},
104         {MAP_CHAR_LEN(SC_UNO_SHOWDRAW),     0,  &getCppuType((sal_Int16*)0),    0, 0},
105         {MAP_CHAR_LEN(SC_UNO_SHOWFORM),     0,  &getBooleanCppuType(),          0, 0},
106         {MAP_CHAR_LEN(SC_UNO_SHOWGRID),     0,  &getBooleanCppuType(),          0, 0},
107         {MAP_CHAR_LEN(SC_UNO_SHOWHELP),     0,  &getBooleanCppuType(),          0, 0},
108         {MAP_CHAR_LEN(SC_UNO_SHOWNOTES),    0,  &getBooleanCppuType(),          0, 0},
109         {MAP_CHAR_LEN(SC_UNO_SHOWOBJ),      0,  &getCppuType((sal_Int16*)0),    0, 0},
110         {MAP_CHAR_LEN(SC_UNO_SHOWPAGEBR),   0,  &getBooleanCppuType(),          0, 0},
111         {MAP_CHAR_LEN(SC_UNO_SHOWZERO),     0,  &getBooleanCppuType(),          0, 0},
112         {MAP_CHAR_LEN(SC_UNO_SHOWSOLID),    0,  &getBooleanCppuType(),          0, 0},
113         {MAP_CHAR_LEN(OLD_UNO_VALUEHIGH),   0,  &getBooleanCppuType(),          0, 0},
114         {MAP_CHAR_LEN(OLD_UNO_VERTSCROLL),  0,  &getBooleanCppuType(),          0, 0},
115         {MAP_CHAR_LEN(SC_UNO_VISAREA),      0,  &getCppuType((awt::Rectangle*)0), 0, 0},
116         {MAP_CHAR_LEN(SC_UNO_ZOOMTYPE),     0,  &getCppuType((sal_Int16*)0),    0, 0},
117         {MAP_CHAR_LEN(SC_UNO_ZOOMVALUE),    0,  &getCppuType((sal_Int16*)0),    0, 0},
118         {MAP_CHAR_LEN(SC_UNO_VISAREASCREEN),0,  &getCppuType((awt::Rectangle*)0), 0, 0},
119         {0,0,0,0,0,0}
120     };
121     return aViewOptPropertyMap_Impl;
122 }
123 
124 //------------------------------------------------------------------------
125 
126 SV_IMPL_PTRARR( XRangeSelectionListenerArr_Impl, XRangeSelectionListenerPtr );
127 SV_IMPL_PTRARR( XRangeSelectionChangeListenerArr_Impl, XRangeSelectionChangeListenerPtr );
128 SV_IMPL_PTRARR( XSelectionChangeListenerArr_Impl, XSelectionChangeListenerPtr );
129 SV_IMPL_PTRARR( XViewPropertyChangeListenerArr_Impl, XViewPropertyChangeListenerPtr );
130 SV_IMPL_PTRARR( XMouseClickHandlerArr_Impl, XMouseClickHandlerPtr );
131 SV_IMPL_PTRARR( XActivationEventListenerArr_Impl, XActivationEventListenerPtr );
132 
133 #define SCTABVIEWOBJ_SERVICE        "com.sun.star.sheet.SpreadsheetView"
134 #define SCVIEWSETTINGS_SERVICE      "com.sun.star.sheet.SpreadsheetViewSettings"
135 
136 SC_SIMPLE_SERVICE_INFO( ScViewPaneBase, "ScViewPaneObj", "com.sun.star.sheet.SpreadsheetViewPane" )
137 
138 //------------------------------------------------------------------------
139 
140 ScViewPaneBase::ScViewPaneBase(ScTabViewShell* pViewSh, sal_uInt16 nP) :
141     pViewShell( pViewSh ),
142     nPane( nP )
143 {
144     if (pViewShell)
145         StartListening(*pViewShell);
146 }
147 
148 ScViewPaneBase::~ScViewPaneBase()
149 {
150     if (pViewShell)
151         EndListening(*pViewShell);
152 }
153 
154 void ScViewPaneBase::Notify( SfxBroadcaster&, const SfxHint& rHint )
155 {
156     if ( rHint.ISA( SfxSimpleHint ) &&
157             ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING )
158         pViewShell = NULL;
159 }
160 
161 uno::Any SAL_CALL ScViewPaneBase::queryInterface( const uno::Type& rType )
162                                                 throw(uno::RuntimeException)
163 {
164     SC_QUERYINTERFACE( sheet::XViewPane )
165     SC_QUERYINTERFACE( sheet::XCellRangeReferrer )
166     SC_QUERYINTERFACE( view::XFormLayerAccess )
167     SC_QUERYINTERFACE( view::XControlAccess )
168     SC_QUERYINTERFACE( lang::XServiceInfo )
169     SC_QUERYINTERFACE( lang::XTypeProvider )
170 
171     return uno::Any();          // OWeakObject is in derived objects
172 }
173 
174 uno::Sequence<uno::Type> SAL_CALL ScViewPaneBase::getTypes() throw(uno::RuntimeException)
175 {
176     static uno::Sequence<uno::Type> aTypes;
177     if ( aTypes.getLength() == 0 )
178     {
179         aTypes.realloc(5);
180         uno::Type* pPtr = aTypes.getArray();
181         pPtr[0] = getCppuType((const uno::Reference<sheet::XViewPane>*)0);
182         pPtr[1] = getCppuType((const uno::Reference<sheet::XCellRangeReferrer>*)0);
183         pPtr[2] = getCppuType((const uno::Reference<view::XFormLayerAccess>*)0);
184         pPtr[3] = getCppuType((const uno::Reference<lang::XServiceInfo>*)0);
185         pPtr[4] = getCppuType((const uno::Reference<lang::XTypeProvider>*)0);
186     }
187     return aTypes;
188 }
189 
190 uno::Sequence<sal_Int8> SAL_CALL ScViewPaneBase::getImplementationId()
191                                                     throw(uno::RuntimeException)
192 {
193     static uno::Sequence< sal_Int8 > aId;
194     if( aId.getLength() == 0 )
195     {
196         aId.realloc( 16 );
197         rtl_createUuid( (sal_uInt8 *)aId.getArray(), 0, sal_True );
198     }
199     return aId;
200 }
201 
202 // XViewPane
203 
204 sal_Int32 SAL_CALL ScViewPaneBase::getFirstVisibleColumn() throw(uno::RuntimeException)
205 {
206     ScUnoGuard aGuard;
207     if (pViewShell)
208     {
209         ScViewData* pViewData = pViewShell->GetViewData();
210         ScSplitPos eWhich = ( nPane == SC_VIEWPANE_ACTIVE ) ?
211                                 pViewData->GetActivePart() :
212                                 (ScSplitPos) nPane;
213         ScHSplitPos eWhichH = WhichH( eWhich );
214 
215         return pViewData->GetPosX( eWhichH );
216     }
217     DBG_ERROR("keine View ?!?");    //! Exception?
218     return 0;
219 }
220 
221 void SAL_CALL ScViewPaneBase::setFirstVisibleColumn( sal_Int32 nFirstVisibleColumn )
222                                                 throw(uno::RuntimeException)
223 {
224     ScUnoGuard aGuard;
225     if (pViewShell)
226     {
227         ScViewData* pViewData = pViewShell->GetViewData();
228         ScSplitPos eWhich = ( nPane == SC_VIEWPANE_ACTIVE ) ?
229                                 pViewData->GetActivePart() :
230                                 (ScSplitPos) nPane;
231         ScHSplitPos eWhichH = WhichH( eWhich );
232 
233         long nDeltaX = ((long)nFirstVisibleColumn) - pViewData->GetPosX( eWhichH );
234         pViewShell->ScrollX( nDeltaX, eWhichH );
235     }
236 }
237 
238 sal_Int32 SAL_CALL ScViewPaneBase::getFirstVisibleRow() throw(uno::RuntimeException)
239 {
240     ScUnoGuard aGuard;
241     if (pViewShell)
242     {
243         ScViewData* pViewData = pViewShell->GetViewData();
244         ScSplitPos eWhich = ( nPane == SC_VIEWPANE_ACTIVE ) ?
245                                 pViewData->GetActivePart() :
246                                 (ScSplitPos) nPane;
247         ScVSplitPos eWhichV = WhichV( eWhich );
248 
249         return pViewData->GetPosY( eWhichV );
250     }
251     DBG_ERROR("keine View ?!?");    //! Exception?
252     return 0;
253 }
254 
255 void SAL_CALL ScViewPaneBase::setFirstVisibleRow( sal_Int32 nFirstVisibleRow )
256                                                 throw(uno::RuntimeException)
257 {
258     ScUnoGuard aGuard;
259     if (pViewShell)
260     {
261         ScViewData* pViewData = pViewShell->GetViewData();
262         ScSplitPos eWhich = ( nPane == SC_VIEWPANE_ACTIVE ) ?
263                                 pViewData->GetActivePart() :
264                                 (ScSplitPos) nPane;
265         ScVSplitPos eWhichV = WhichV( eWhich );
266 
267         long nDeltaY = ((long)nFirstVisibleRow) - pViewData->GetPosY( eWhichV );
268         pViewShell->ScrollY( nDeltaY, eWhichV );
269     }
270 }
271 
272 table::CellRangeAddress SAL_CALL ScViewPaneBase::getVisibleRange() throw(uno::RuntimeException)
273 {
274     ScUnoGuard aGuard;
275     table::CellRangeAddress aAdr;
276     if (pViewShell)
277     {
278         ScViewData* pViewData = pViewShell->GetViewData();
279         ScSplitPos eWhich = ( nPane == SC_VIEWPANE_ACTIVE ) ?
280                                 pViewData->GetActivePart() :
281                                 (ScSplitPos) nPane;
282         ScHSplitPos eWhichH = WhichH( eWhich );
283         ScVSplitPos eWhichV = WhichV( eWhich );
284 
285         //  VisibleCellsX gibt nur komplett sichtbare Zellen,
286         //  VisibleRange in Excel auch teilweise sichtbare.
287         //! anpassen ???
288 
289         SCCOL nVisX = pViewData->VisibleCellsX( eWhichH );
290         SCROW nVisY = pViewData->VisibleCellsY( eWhichV );
291         if (!nVisX) nVisX = 1;  // irgendwas muss ja im Range sein
292         if (!nVisY) nVisY = 1;
293         aAdr.Sheet       = pViewData->GetTabNo();
294         aAdr.StartColumn = pViewData->GetPosX( eWhichH );
295         aAdr.StartRow    = pViewData->GetPosY( eWhichV );
296         aAdr.EndColumn   = aAdr.StartColumn + nVisX - 1;
297         aAdr.EndRow      = aAdr.StartRow    + nVisY - 1;
298     }
299     return aAdr;
300 }
301 
302 // XCellRangeSource
303 
304 uno::Reference<table::XCellRange> SAL_CALL ScViewPaneBase::getReferredCells()
305                                                 throw(uno::RuntimeException)
306 {
307     ScUnoGuard aGuard;
308     if (pViewShell)
309     {
310         ScDocShell* pDocSh = pViewShell->GetViewData()->GetDocShell();
311 
312         table::CellRangeAddress aAdr(getVisibleRange());        //! Hilfsfunktion mit ScRange?
313         ScRange aRange( (SCCOL)aAdr.StartColumn, (SCROW)aAdr.StartRow, aAdr.Sheet,
314                         (SCCOL)aAdr.EndColumn, (SCROW)aAdr.EndRow, aAdr.Sheet );
315         if ( aRange.aStart == aRange.aEnd )
316             return new ScCellObj( pDocSh, aRange.aStart );
317         else
318             return new ScCellRangeObj( pDocSh, aRange );
319     }
320 
321     return NULL;
322 }
323 
324 namespace
325 {
326     bool lcl_prepareFormShellCall( ScTabViewShell* _pViewShell, sal_uInt16 _nPane, FmFormShell*& _rpFormShell, Window*& _rpWindow, SdrView*& _rpSdrView )
327     {
328         if ( !_pViewShell )
329             return false;
330 
331         ScViewData* pViewData = _pViewShell->GetViewData();
332         ScSplitPos eWhich = ( _nPane == SC_VIEWPANE_ACTIVE ) ?
333                                 pViewData->GetActivePart() :
334                                 (ScSplitPos) _nPane;
335         _rpWindow = _pViewShell->GetWindowByPos( eWhich );
336         _rpSdrView = _pViewShell->GetSdrView();
337         _rpFormShell = _pViewShell->GetFormShell();
338         return ( _rpFormShell != NULL ) && ( _rpSdrView != NULL )&& ( _rpWindow != NULL );
339     }
340 }
341 
342 // XFormLayerAccess
343 uno::Reference< form::runtime::XFormController > SAL_CALL ScViewPaneBase::getFormController( const uno::Reference< form::XForm >& _Form ) throw (uno::RuntimeException)
344 {
345     ScUnoGuard aGuard;
346 
347     uno::Reference< form::runtime::XFormController > xController;
348 
349     Window* pWindow( NULL );
350     SdrView* pSdrView( NULL );
351     FmFormShell* pFormShell( NULL );
352     if ( lcl_prepareFormShellCall( pViewShell, nPane, pFormShell, pWindow, pSdrView ) )
353         xController = pFormShell->GetFormController( _Form, *pSdrView, *pWindow );
354 
355     return xController;
356 }
357 
358 ::sal_Bool SAL_CALL ScViewPaneBase::isFormDesignMode(  ) throw (uno::RuntimeException)
359 {
360     ScUnoGuard aGuard;
361 
362     sal_Bool bIsFormDesignMode( sal_True );
363 
364     FmFormShell* pFormShell( pViewShell ? pViewShell->GetFormShell() : NULL );
365     if ( pFormShell )
366         bIsFormDesignMode = pFormShell->IsDesignMode();
367 
368     return bIsFormDesignMode;
369 }
370 
371 void SAL_CALL ScViewPaneBase::setFormDesignMode( ::sal_Bool _DesignMode ) throw (uno::RuntimeException)
372 {
373     ScUnoGuard aGuard;
374 
375     Window* pWindow( NULL );
376     SdrView* pSdrView( NULL );
377     FmFormShell* pFormShell( NULL );
378     if ( lcl_prepareFormShellCall( pViewShell, nPane, pFormShell, pWindow, pSdrView ) )
379         pFormShell->SetDesignMode( _DesignMode );
380 }
381 
382 // XControlAccess
383 
384 uno::Reference<awt::XControl> SAL_CALL ScViewPaneBase::getControl(
385                             const uno::Reference<awt::XControlModel>& xModel )
386                 throw(container::NoSuchElementException, uno::RuntimeException)
387 {
388     ScUnoGuard aGuard;
389 
390     uno::Reference<awt::XControl> xRet;
391 
392     Window* pWindow( NULL );
393     SdrView* pSdrView( NULL );
394     FmFormShell* pFormShell( NULL );
395     if ( lcl_prepareFormShellCall( pViewShell, nPane, pFormShell, pWindow, pSdrView ) )
396         pFormShell->GetFormControl( xModel, *pSdrView, *pWindow, xRet );
397 
398     if ( !xRet.is() )
399         throw container::NoSuchElementException();      // no control found
400 
401     return xRet;
402 }
403 
404 awt::Rectangle ScViewPaneBase::GetVisArea() const
405 {
406     awt::Rectangle aVisArea;
407     if (pViewShell)
408     {
409         ScSplitPos eWhich = ( nPane == SC_VIEWPANE_ACTIVE ) ?
410                                 pViewShell->GetViewData()->GetActivePart() :
411                                 (ScSplitPos) nPane;
412         ScGridWindow* pWindow = (ScGridWindow*)pViewShell->GetWindowByPos(eWhich);
413         ScDocument* pDoc = pViewShell->GetViewData()->GetDocument();
414         if (pWindow && pDoc)
415         {
416             ScHSplitPos eWhichH = ((eWhich == SC_SPLIT_TOPLEFT) || (eWhich == SC_SPLIT_BOTTOMLEFT)) ?
417                                     SC_SPLIT_LEFT : SC_SPLIT_RIGHT;
418             ScVSplitPos eWhichV = ((eWhich == SC_SPLIT_TOPLEFT) || (eWhich == SC_SPLIT_TOPRIGHT)) ?
419                                     SC_SPLIT_TOP : SC_SPLIT_BOTTOM;
420             ScAddress aCell(pViewShell->GetViewData()->GetPosX(eWhichH),
421                 pViewShell->GetViewData()->GetPosY(eWhichV),
422                 pViewShell->GetViewData()->GetTabNo());
423             Rectangle aCellRect( pDoc->GetMMRect( aCell.Col(), aCell.Row(), aCell.Col(), aCell.Row(), aCell.Tab() ) );
424             Size aVisSize( pWindow->PixelToLogic( pWindow->GetSizePixel(), pWindow->GetDrawMapMode( sal_True ) ) );
425             Point aVisPos( aCellRect.TopLeft() );
426             if ( pDoc->IsLayoutRTL( aCell.Tab() ) )
427             {
428                 aVisPos = aCellRect.TopRight();
429                 aVisPos.X() -= aVisSize.Width();
430             }
431             Rectangle aVisRect( aVisPos, aVisSize );
432             aVisArea = AWTRectangle(aVisRect);
433         }
434     }
435     return aVisArea;
436 }
437 
438 //------------------------------------------------------------------------
439 
440 ScViewPaneObj::ScViewPaneObj(ScTabViewShell* pViewSh, sal_uInt16 nP) :
441     ScViewPaneBase( pViewSh, nP )
442 {
443 }
444 
445 ScViewPaneObj::~ScViewPaneObj()
446 {
447 }
448 
449 uno::Any SAL_CALL ScViewPaneObj::queryInterface( const uno::Type& rType )
450                                                 throw(uno::RuntimeException)
451 {
452     //  ScViewPaneBase has everything except OWeakObject
453 
454     uno::Any aRet(ScViewPaneBase::queryInterface( rType ));
455     if (!aRet.hasValue())
456         aRet = OWeakObject::queryInterface( rType );
457     return aRet;
458 }
459 
460 void SAL_CALL ScViewPaneObj::acquire() throw()
461 {
462     OWeakObject::acquire();
463 }
464 
465 void SAL_CALL ScViewPaneObj::release() throw()
466 {
467     OWeakObject::release();
468 }
469 
470 //------------------------------------------------------------------------
471 
472 //  Default-ctor wird fuer SMART_REFLECTION_IMPLEMENTATION gebraucht
473 
474 //UNUSED2008-05  ScTabViewObj::ScTabViewObj() :
475 //UNUSED2008-05  ScViewPaneBase( NULL, SC_VIEWPANE_ACTIVE ),
476 //UNUSED2008-05  SfxBaseController( NULL ),
477 //UNUSED2008-05  aPropSet( lcl_GetViewOptPropertyMap() ),
478 //UNUSED2008-05  aMouseClickHandlers( 0 ),
479 //UNUSED2008-05  aActivationListeners( 0 ),
480 //UNUSED2008-05  bDrawSelModeSet(sal_False),
481 //UNUSED2008-05  bFilteredRangeSelection(sal_True)
482 //UNUSED2008-05  {
483 //UNUSED2008-05  }
484 
485 ScTabViewObj::ScTabViewObj( ScTabViewShell* pViewSh ) :
486     ScViewPaneBase( pViewSh, SC_VIEWPANE_ACTIVE ),
487     SfxBaseController( pViewSh ),
488     aPropSet( lcl_GetViewOptPropertyMap() ),
489     aMouseClickHandlers( 0 ),
490     aActivationListeners( 0 ),
491     nPreviousTab( 0 ),
492     bDrawSelModeSet(sal_False)
493 {
494     if (pViewSh)
495         nPreviousTab = pViewSh->GetViewData()->GetTabNo();
496 }
497 
498 ScTabViewObj::~ScTabViewObj()
499 {
500     //! Listening oder so
501     if (aMouseClickHandlers.Count())
502     {
503         acquire();
504         EndMouseListening();
505     }
506     if (aActivationListeners.Count())
507     {
508         acquire();
509         EndActivationListening();
510     }
511 }
512 
513 uno::Any SAL_CALL ScTabViewObj::queryInterface( const uno::Type& rType )
514                                                 throw(uno::RuntimeException)
515 {
516     SC_QUERYINTERFACE( sheet::XSpreadsheetView )
517     SC_QUERYINTERFACE( sheet::XEnhancedMouseClickBroadcaster )
518     SC_QUERYINTERFACE( sheet::XActivationBroadcaster )
519     SC_QUERYINTERFACE( container::XEnumerationAccess )
520     SC_QUERYINTERFACE( container::XIndexAccess )
521     SC_QUERY_MULTIPLE( container::XElementAccess, container::XIndexAccess )
522     SC_QUERYINTERFACE( view::XSelectionSupplier )
523     SC_QUERYINTERFACE( beans::XPropertySet )
524     SC_QUERYINTERFACE( sheet::XViewSplitable )
525     SC_QUERYINTERFACE( sheet::XViewFreezable )
526     SC_QUERYINTERFACE( sheet::XRangeSelection )
527     SC_QUERYINTERFACE( lang::XUnoTunnel )
528     SC_QUERYINTERFACE( datatransfer::XTransferableSupplier )
529 
530     uno::Any aRet(ScViewPaneBase::queryInterface( rType ));
531     if (!aRet.hasValue())
532         aRet = SfxBaseController::queryInterface( rType );
533     return aRet;
534 }
535 
536 void SAL_CALL ScTabViewObj::acquire() throw()
537 {
538     SfxBaseController::acquire();
539 }
540 
541 void SAL_CALL ScTabViewObj::release() throw()
542 {
543     SfxBaseController::release();
544 }
545 
546 void lcl_CallActivate( ScDocShell* pDocSh, SCTAB nTab, sal_Int32 nEvent )
547 {
548     ScDocument* pDoc = pDocSh->GetDocument();
549     // when deleting a sheet, nPreviousTab can be invalid
550     // (could be handled with reference updates)
551     if (!pDoc->HasTable(nTab))
552         return;
553 
554     const ScSheetEvents* pEvents = pDoc->GetSheetEvents(nTab);
555     if (pEvents)
556     {
557         const rtl::OUString* pScript = pEvents->GetScript(nEvent);
558         if (pScript)
559         {
560             uno::Any aRet;
561             uno::Sequence<uno::Any> aParams;
562             uno::Sequence<sal_Int16> aOutArgsIndex;
563             uno::Sequence<uno::Any> aOutArgs;
564             /*ErrCode eRet =*/ pDocSh->CallXScript( *pScript, aParams, aRet, aOutArgsIndex, aOutArgs );
565         }
566     }
567 
568     // execute VBA event handlers
569     try
570     {
571         uno::Reference< script::vba::XVBAEventProcessor > xVbaEvents( pDoc->GetVbaEventProcessor(), uno::UNO_SET_THROW );
572         // the parameter is the clicked object, as in the mousePressed call above
573         uno::Sequence< uno::Any > aArgs( 1 );
574         aArgs[ 0 ] <<= nTab;
575         xVbaEvents->processVbaEvent( ScSheetEvents::GetVbaSheetEventId( nEvent ), aArgs );
576     }
577     catch( uno::Exception& )
578     {
579     }
580 }
581 
582 void ScTabViewObj::SheetChanged( bool bSameTabButMoved )
583 {
584     if ( !GetViewShell() )
585         return;
586 
587     ScViewData* pViewData = GetViewShell()->GetViewData();
588     ScDocShell* pDocSh = pViewData->GetDocShell();
589     if (aActivationListeners.Count() > 0)
590     {
591         sheet::ActivationEvent aEvent;
592         uno::Reference< sheet::XSpreadsheetView > xView(this);
593         uno::Reference< uno::XInterface > xSource(xView, uno::UNO_QUERY);
594         aEvent.Source = xSource;
595         aEvent.ActiveSheet = new ScTableSheetObj(pDocSh, pViewData->GetTabNo());
596         for ( sal_uInt16 n=0; n<aActivationListeners.Count(); n++ )
597         {
598             try
599             {
600                 (*aActivationListeners[n])->activeSpreadsheetChanged( aEvent );
601             }
602             catch( uno::Exception& )
603             {
604                 aActivationListeners.DeleteAndDestroy( n );
605                 --n; // because it will be increased again in the loop
606             }
607         }
608     }
609 
610     /*  Handle sheet events, but do not trigger event handlers, if the old
611         active sheet gets re-activated after inserting/deleting/moving a sheet. */
612     SCTAB nNewTab = pViewData->GetTabNo();
613     if ( !bSameTabButMoved && (nNewTab != nPreviousTab) )
614     {
615         lcl_CallActivate( pDocSh, nPreviousTab, SC_SHEETEVENT_UNFOCUS );
616         lcl_CallActivate( pDocSh, nNewTab, SC_SHEETEVENT_FOCUS );
617     }
618     nPreviousTab = nNewTab;
619 }
620 
621 uno::Sequence<uno::Type> SAL_CALL ScTabViewObj::getTypes() throw(uno::RuntimeException)
622 {
623     static uno::Sequence<uno::Type> aTypes;
624     if ( aTypes.getLength() == 0 )
625     {
626         uno::Sequence<uno::Type> aViewPaneTypes(ScViewPaneBase::getTypes());
627         long nViewPaneLen = aViewPaneTypes.getLength();
628         const uno::Type* pViewPanePtr = aViewPaneTypes.getConstArray();
629 
630         uno::Sequence<uno::Type> aControllerTypes(SfxBaseController::getTypes());
631         long nControllerLen = aControllerTypes.getLength();
632         const uno::Type* pControllerPtr = aControllerTypes.getConstArray();
633 
634         long nParentLen = nViewPaneLen + nControllerLen;
635 
636         aTypes.realloc( nParentLen + 12 );
637         uno::Type* pPtr = aTypes.getArray();
638         pPtr[nParentLen + 0] = getCppuType((const uno::Reference<sheet::XSpreadsheetView>*)0);
639         pPtr[nParentLen + 1] = getCppuType((const uno::Reference<container::XEnumerationAccess>*)0);
640         pPtr[nParentLen + 2] = getCppuType((const uno::Reference<container::XIndexAccess>*)0);
641         pPtr[nParentLen + 3] = getCppuType((const uno::Reference<view::XSelectionSupplier>*)0);
642         pPtr[nParentLen + 4] = getCppuType((const uno::Reference<beans::XPropertySet>*)0);
643         pPtr[nParentLen + 5] = getCppuType((const uno::Reference<sheet::XViewSplitable>*)0);
644         pPtr[nParentLen + 6] = getCppuType((const uno::Reference<sheet::XViewFreezable>*)0);
645         pPtr[nParentLen + 7] = getCppuType((const uno::Reference<sheet::XRangeSelection>*)0);
646         pPtr[nParentLen + 8] = getCppuType((const uno::Reference<lang::XUnoTunnel>*)0);
647         pPtr[nParentLen + 9] = getCppuType((const uno::Reference<sheet::XEnhancedMouseClickBroadcaster>*)0);
648         pPtr[nParentLen + 10] = getCppuType((const uno::Reference<sheet::XActivationBroadcaster>*)0);
649         pPtr[nParentLen + 11] = getCppuType((const uno::Reference<datatransfer::XTransferableSupplier>*)0);
650 
651         long i;
652         for (i=0; i<nViewPaneLen; i++)
653             pPtr[i] = pViewPanePtr[i];              // parent types first
654         for (i=0; i<nControllerLen; i++)
655             pPtr[nViewPaneLen+i] = pControllerPtr[i];
656     }
657     return aTypes;
658 }
659 
660 uno::Sequence<sal_Int8> SAL_CALL ScTabViewObj::getImplementationId()
661                                                 throw(uno::RuntimeException)
662 {
663     static uno::Sequence< sal_Int8 > aId;
664     if( aId.getLength() == 0 )
665     {
666         aId.realloc( 16 );
667         rtl_createUuid( (sal_uInt8 *)aId.getArray(), 0, sal_True );
668     }
669     return aId;
670 }
671 
672 // XDocumentView
673 
674 sal_Bool lcl_TabInRanges( SCTAB nTab, const ScRangeList& rRanges )
675 {
676     sal_uLong nCount = rRanges.Count();
677     for (sal_uLong i=0; i<nCount; i++)
678     {
679         const ScRange* pRange = rRanges.GetObject(i);
680         if ( nTab >= pRange->aStart.Tab() && nTab <= pRange->aEnd.Tab() )
681             return sal_True;
682     }
683     return sal_False;
684 }
685 
686 void lcl_ShowObject( ScTabViewShell& rViewSh, ScDrawView& rDrawView, SdrObject* pSelObj )
687 {
688     sal_Bool bFound = sal_False;
689     SCTAB nObjectTab = 0;
690 
691     SdrModel* pModel = rDrawView.GetModel();
692     sal_uInt16 nPageCount = pModel->GetPageCount();
693     for (sal_uInt16 i=0; i<nPageCount && !bFound; i++)
694     {
695         SdrPage* pPage = pModel->GetPage(i);
696         if (pPage)
697         {
698             SdrObjListIter aIter( *pPage, IM_DEEPWITHGROUPS );
699             SdrObject* pObject = aIter.Next();
700             while (pObject && !bFound)
701             {
702                 if ( pObject == pSelObj )
703                 {
704                     bFound = sal_True;
705                     nObjectTab = static_cast<SCTAB>(i);
706                 }
707                 pObject = aIter.Next();
708             }
709         }
710     }
711 
712     if (bFound)
713     {
714         rViewSh.SetTabNo( nObjectTab );
715         rViewSh.ScrollToObject( pSelObj );
716     }
717 }
718 
719 sal_Bool SAL_CALL ScTabViewObj::select( const uno::Any& aSelection )
720                         throw(lang::IllegalArgumentException, uno::RuntimeException)
721 {
722     ScUnoGuard aGuard;
723     ScTabViewShell* pViewSh = GetViewShell();
724 
725     if ( !pViewSh )
726         return sal_False;
727 
728     //! Type of aSelection can be some specific interface instead of XInterface
729 
730     sal_Bool bRet = sal_False;
731     uno::Reference<uno::XInterface> xInterface(aSelection, uno::UNO_QUERY);
732     if ( !xInterface.is() )  //clear all selections
733     {
734         ScDrawView* pDrawView = pViewSh->GetScDrawView();
735         if (pDrawView)
736         {
737             pDrawView->ScEndTextEdit();
738             pDrawView->UnmarkAll();
739         }
740         else //#102232#; if there is  no DrawView remove range selection
741             pViewSh->Unmark();
742         bRet = sal_True;
743     }
744 
745     if (bDrawSelModeSet) // remove DrawSelMode if set by API; if necessary it will be set again later
746     {
747         pViewSh->SetDrawSelMode(sal_False);
748         pViewSh->UpdateLayerLocks();
749         bDrawSelModeSet = sal_False;
750     }
751 
752     if (bRet)
753         return bRet;
754 
755 
756     ScCellRangesBase* pRangesImp = ScCellRangesBase::getImplementation( xInterface );
757     uno::Reference<drawing::XShapes> xShapeColl( xInterface, uno::UNO_QUERY );
758     uno::Reference<drawing::XShape> xShapeSel( xInterface, uno::UNO_QUERY );
759     SvxShape* pShapeImp = SvxShape::getImplementation( xShapeSel );
760 
761     if (pRangesImp)                                     // Zell-Ranges
762     {
763         ScViewData* pViewData = pViewSh->GetViewData();
764         if ( pViewData->GetDocShell() == pRangesImp->GetDocShell() )
765         {
766             //  Zuerst evtl. Drawing-Selektion aufheben
767             //  (MarkListHasChanged hebt Tabellen-Selektion auf)
768 
769             ScDrawView* pDrawView = pViewSh->GetScDrawView();
770             if (pDrawView)
771             {
772                 pDrawView->ScEndTextEdit();
773                 pDrawView->UnmarkAll();
774             }
775             FuPoor* pFunc = pViewSh->GetDrawFuncPtr();
776             if ( pFunc && pFunc->GetSlotID() != SID_OBJECT_SELECT )
777             {
778                 //  Slot der Zeichenfunktion nochmal ausfuehren -> abschalten
779                 SfxDispatcher* pDisp = pViewSh->GetDispatcher();
780                 if (pDisp)
781                     pDisp->Execute( pFunc->GetSlotID(), SFX_CALLMODE_SYNCHRON );
782             }
783             pViewSh->SetDrawShell(sal_False);
784             pViewSh->SetDrawSelMode(sal_False); // nach dem Dispatcher-Execute
785 
786             //  Ranges selektieren
787 
788             const ScRangeList& rRanges = pRangesImp->GetRangeList();
789             sal_uLong nRangeCount = rRanges.Count();
790             // for empty range list, remove selection (cursor remains where it was)
791             if ( nRangeCount == 0 )
792                 pViewSh->Unmark();
793             else if ( nRangeCount == 1 )
794                 pViewSh->MarkRange( *rRanges.GetObject(0) );
795             else
796             {
797                 //  Mehrfachselektion
798 
799                 const ScRange* pFirst = rRanges.GetObject(0);
800                 if ( pFirst && !lcl_TabInRanges( pViewData->GetTabNo(), rRanges ) )
801                     pViewSh->SetTabNo( pFirst->aStart.Tab() );
802                 pViewSh->DoneBlockMode();
803                 pViewSh->InitOwnBlockMode();
804                 pViewData->GetMarkData().MarkFromRangeList( rRanges, sal_True );
805                 pViewSh->MarkDataChanged();
806                 pViewData->GetDocShell()->PostPaintGridAll();   // Markierung (alt&neu)
807                 if ( pFirst )
808                 {
809                     pViewSh->AlignToCursor( pFirst->aStart.Col(), pFirst->aStart.Row(),
810                                                 SC_FOLLOW_JUMP );
811                     pViewSh->SetCursor( pFirst->aStart.Col(), pFirst->aStart.Row() );
812                 }
813 
814                 //! Methode an der View, um RangeList zu selektieren
815             }
816             bRet = sal_True;
817         }
818     }
819     else if ( pShapeImp || xShapeColl.is() )            // Drawing-Layer
820     {
821         ScDrawView* pDrawView = pViewSh->GetScDrawView();
822         if (pDrawView)
823         {
824             pDrawView->ScEndTextEdit();
825             pDrawView->UnmarkAll();
826 
827             if (pShapeImp)      // einzelnes Shape
828             {
829                 SdrObject *pObj = pShapeImp->GetSdrObject();
830                 if (pObj)
831                 {
832                     lcl_ShowObject( *pViewSh, *pDrawView, pObj );
833                     SdrPageView* pPV = pDrawView->GetSdrPageView();
834                     if ( pPV && pObj->GetPage() == pPV->GetPage() )
835                     {
836                         pDrawView->MarkObj( pObj, pPV );
837                         bRet = sal_True;
838                     }
839                 }
840             }
841             else                // Shape-Collection (xShapeColl ist nicht 0)
842             {
843                 //  Es wird auf die Tabelle des ersten Objekts umgeschaltet,
844                 //  und alle Objekte selektiert, die auf dieser Tabelle liegen
845                 //! Exception, wenn Objekte auf verschiedenen Tabellen?
846 
847                 SdrPageView* pPV = NULL;
848                 long nCount = xShapeColl->getCount();
849                 if (nCount)
850                 {
851                     sal_Bool bAllMarked(sal_True);
852                     for ( long i = 0; i < nCount; i++ )
853                     {
854                         uno::Reference<drawing::XShape> xShapeInt(xShapeColl->getByIndex(i), uno::UNO_QUERY);
855                         if (xShapeInt.is())
856                         {
857                             SvxShape* pShape = SvxShape::getImplementation( xShapeInt );
858                             if (pShape)
859                             {
860                                 SdrObject *pObj = pShape->GetSdrObject();
861                                 if (pObj)
862                                 {
863                                     if (!bDrawSelModeSet && (pObj->GetLayer() == SC_LAYER_BACK))
864                                     {
865                                         pViewSh->SetDrawSelMode(sal_True);
866                                         pViewSh->UpdateLayerLocks();
867                                         bDrawSelModeSet = sal_True;
868                                     }
869                                     if (!pPV)               // erstes Objekt
870                                     {
871                                         lcl_ShowObject( *pViewSh, *pDrawView, pObj );
872                                         pPV = pDrawView->GetSdrPageView();
873                                     }
874                                     if ( pPV && pObj->GetPage() == pPV->GetPage() )
875                                     {
876                                         if (pDrawView->IsObjMarkable( pObj, pPV ))
877                                             pDrawView->MarkObj( pObj, pPV );
878                                         else
879                                             bAllMarked = sal_False;
880                                     }
881                                 }
882                             }
883                         }
884                     }
885                     if (bAllMarked)
886                         bRet = sal_True;
887                 }
888                 else
889                     bRet = sal_True; // empty XShapes (all shapes are deselected)
890             }
891 
892             if (bRet)
893                 pViewSh->SetDrawShell(sal_True);
894         }
895     }
896 
897     if (!bRet)
898         throw lang::IllegalArgumentException();
899 
900     return bRet;
901 }
902 
903 uno::Any SAL_CALL ScTabViewObj::getSelection() throw(uno::RuntimeException)
904 {
905     ScUnoGuard aGuard;
906     ScTabViewShell* pViewSh = GetViewShell();
907     ScCellRangesBase* pObj = NULL;
908     if (pViewSh)
909     {
910         //  Ist auf dem Drawing-Layer etwas selektiert?
911 
912         SdrView* pDrawView = pViewSh->GetSdrView();
913         if (pDrawView)
914         {
915             const SdrMarkList& rMarkList = pDrawView->GetMarkedObjectList();
916             sal_uLong nMarkCount = rMarkList.GetMarkCount();
917             if (nMarkCount)
918             {
919                 //  ShapeCollection erzeugen (wie in SdXImpressView::getSelection im Draw)
920                 //  Zurueckgegeben wird XInterfaceRef, das muss das UsrObject-XInterface sein
921 
922                 SvxShapeCollection* pShapes = new SvxShapeCollection();
923                 uno::Reference<uno::XInterface> xRet(static_cast<cppu::OWeakObject*>(pShapes));
924 
925                 for (sal_uLong i=0; i<nMarkCount; i++)
926                 {
927                     SdrObject* pDrawObj = rMarkList.GetMark(i)->GetMarkedSdrObj();
928                     if (pDrawObj)
929                     {
930                         uno::Reference<drawing::XShape> xShape( pDrawObj->getUnoShape(), uno::UNO_QUERY );
931                         if (xShape.is())
932                             pShapes->add(xShape);
933                     }
934                 }
935                 return uno::makeAny(xRet);
936             }
937         }
938 
939         //  sonst Tabellen-(Zellen-)Selektion
940 
941         ScViewData* pViewData = pViewSh->GetViewData();
942         ScDocShell* pDocSh = pViewData->GetDocShell();
943 
944         const ScMarkData& rMark = pViewData->GetMarkData();
945         SCTAB nTabs = rMark.GetSelectCount();
946 
947         ScRange aRange;
948         ScMarkType eMarkType = pViewData->GetSimpleArea(aRange);
949         if ( nTabs == 1 && (eMarkType == SC_MARK_SIMPLE) )
950         {
951             if (aRange.aStart == aRange.aEnd)
952                 pObj = new ScCellObj( pDocSh, aRange.aStart );
953             else
954                 pObj = new ScCellRangeObj( pDocSh, aRange );
955         }
956         else if ( nTabs == 1 && (eMarkType == SC_MARK_SIMPLE_FILTERED) )
957         {
958             ScMarkData aFilteredMark( rMark );
959             ScViewUtil::UnmarkFiltered( aFilteredMark, pDocSh->GetDocument());
960             ScRangeList aRangeList;
961             aFilteredMark.FillRangeListWithMarks( &aRangeList, sal_False);
962             // Theoretically a selection may start and end on a filtered row.
963             switch (aRangeList.Count())
964             {
965                 case 0:
966                     // No unfiltered row, we have to return some object, so
967                     // here is one with no ranges.
968                     pObj = new ScCellRangesObj( pDocSh, aRangeList );
969                     break;
970                 case 1:
971                     {
972                         const ScRange& rRange = *(aRangeList.GetObject(0));
973                         if (rRange.aStart == rRange.aEnd)
974                             pObj = new ScCellObj( pDocSh, rRange.aStart );
975                         else
976                             pObj = new ScCellRangeObj( pDocSh, rRange );
977                     }
978                     break;
979                 default:
980                     pObj = new ScCellRangesObj( pDocSh, aRangeList );
981             }
982         }
983         else            //  Mehrfachselektion
984         {
985             ScRangeListRef xRanges;
986             pViewData->GetMultiArea( xRanges );
987 
988             //  bei mehreren Tabellen Ranges kopieren
989             //! sollte eigentlich schon in ScMarkData::FillRangeListWithMarks passieren?
990             if ( nTabs > 1 )
991                 rMark.ExtendRangeListTables( xRanges );
992 
993             pObj = new ScCellRangesObj( pDocSh, *xRanges );
994         }
995 
996         if ( !rMark.IsMarked() && !rMark.IsMultiMarked() )
997         {
998             //  remember if the selection was from the cursor position without anything selected
999             //  (used when rendering the selection)
1000 
1001             pObj->SetCursorOnly( sal_True );
1002         }
1003     }
1004 
1005     return uno::makeAny(uno::Reference<uno::XInterface>(static_cast<cppu::OWeakObject*>(pObj)));
1006 }
1007 
1008 
1009 #if 0
1010 // XPrintable
1011 
1012 rtl::OUString ScTabViewObj::getPrinterName(void) const
1013 {
1014     ScUnoGuard aGuard;
1015     ScTabViewShell* pViewSh = GetViewShell();
1016     if (pViewSh)
1017     {
1018         SfxPrinter* pPrinter = pViewSh->GetPrinter(sal_True);
1019         if (pPrinter)
1020             return pPrinter->GetName();
1021     }
1022 
1023     DBG_ERROR("getPrinterName: keine View oder kein Printer");
1024     return rtl::OUString();
1025 }
1026 
1027 void ScTabViewObj::setPrinterName(const rtl::OUString& PrinterName)
1028 {
1029     ScUnoGuard aGuard;
1030     //  Drucker setzen - wie in SfxViewShell::ExecPrint_Impl
1031 
1032     ScTabViewShell* pViewSh = GetViewShell();
1033     if (pViewSh)
1034     {
1035         SfxPrinter* pPrinter = pViewSh->GetPrinter(sal_True);
1036         if (pPrinter)
1037         {
1038             String aString(PrinterName);
1039             SfxPrinter* pNewPrinter = new SfxPrinter( pPrinter->GetOptions().Clone(), aString );
1040             if (pNewPrinter->IsKnown())
1041                 pViewSh->SetPrinter( pNewPrinter, SFX_PRINTER_PRINTER );
1042             else
1043                 delete pNewPrinter;
1044         }
1045     }
1046 }
1047 
1048 XPropertySetRef ScTabViewObj::createPrintOptions(void)
1049 {
1050     ScUnoGuard aGuard;
1051     return new ScPrintSettingsObj;      //! ScPrintSettingsObj implementieren!
1052 }
1053 
1054 void ScTabViewObj::print(const XPropertySetRef& xOptions)
1055 {
1056     ScUnoGuard aGuard;
1057     ScTabViewShell* pViewSh = GetViewShell();
1058     if (pViewSh)
1059     {
1060         //! xOptions auswerten (wie denn?)
1061 
1062         SfxRequest aReq( SID_PRINTDOCDIRECT, SFX_CALLMODE_SYNCHRON, pViewSh->GetPool() );
1063         pViewSh->ExecuteSlot( aReq );
1064     }
1065 }
1066 #endif
1067 
1068 // XEnumerationAccess
1069 
1070 uno::Reference<container::XEnumeration> SAL_CALL ScTabViewObj::createEnumeration()
1071                                                     throw(uno::RuntimeException)
1072 {
1073     ScUnoGuard aGuard;
1074     return new ScIndexEnumeration(this, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sheet.SpreadsheetViewPanesEnumeration")));
1075 }
1076 
1077 // XIndexAccess
1078 
1079 sal_Int32 SAL_CALL ScTabViewObj::getCount() throw(uno::RuntimeException)
1080 {
1081     ScUnoGuard aGuard;
1082     ScTabViewShell* pViewSh = GetViewShell();
1083     sal_uInt16 nPanes = 0;
1084     if (pViewSh)
1085     {
1086         nPanes = 1;
1087         ScViewData* pViewData = pViewSh->GetViewData();
1088         if ( pViewData->GetHSplitMode() != SC_SPLIT_NONE )
1089             nPanes *= 2;
1090         if ( pViewData->GetVSplitMode() != SC_SPLIT_NONE )
1091             nPanes *= 2;
1092     }
1093     return nPanes;
1094 }
1095 
1096 uno::Any SAL_CALL ScTabViewObj::getByIndex( sal_Int32 nIndex )
1097                             throw(lang::IndexOutOfBoundsException,
1098                                     lang::WrappedTargetException, uno::RuntimeException)
1099 {
1100     ScUnoGuard aGuard;
1101     uno::Reference<sheet::XViewPane> xPane(GetObjectByIndex_Impl((sal_uInt16)nIndex));
1102     if (xPane.is())
1103         return uno::makeAny(xPane);
1104     else
1105         throw lang::IndexOutOfBoundsException();
1106 //    return uno::Any();
1107 }
1108 
1109 uno::Type SAL_CALL ScTabViewObj::getElementType() throw(uno::RuntimeException)
1110 {
1111     ScUnoGuard aGuard;
1112     return getCppuType((uno::Reference<sheet::XViewPane>*)0);
1113 }
1114 
1115 sal_Bool SAL_CALL ScTabViewObj::hasElements() throw(uno::RuntimeException)
1116 {
1117     ScUnoGuard aGuard;
1118     return ( getCount() != 0 );
1119 }
1120 
1121 // XSpreadsheetView
1122 
1123 ScViewPaneObj* ScTabViewObj::GetObjectByIndex_Impl(sal_uInt16 nIndex) const
1124 {
1125     static ScSplitPos ePosHV[4] =
1126         { SC_SPLIT_TOPLEFT, SC_SPLIT_BOTTOMLEFT, SC_SPLIT_TOPRIGHT, SC_SPLIT_BOTTOMRIGHT };
1127 
1128     ScTabViewShell* pViewSh = GetViewShell();
1129     if (pViewSh)
1130     {
1131         ScSplitPos eWhich = SC_SPLIT_BOTTOMLEFT;    // default Position
1132         sal_Bool bError = sal_False;
1133         ScViewData* pViewData = pViewSh->GetViewData();
1134         sal_Bool bHor = ( pViewData->GetHSplitMode() != SC_SPLIT_NONE );
1135         sal_Bool bVer = ( pViewData->GetVSplitMode() != SC_SPLIT_NONE );
1136         if ( bHor && bVer )
1137         {
1138             //  links oben, links unten, rechts oben, rechts unten - wie in Excel
1139             if ( nIndex < 4 )
1140                 eWhich = ePosHV[nIndex];
1141             else
1142                 bError = sal_True;
1143         }
1144         else if ( bHor )
1145         {
1146             if ( nIndex > 1 )
1147                 bError = sal_True;
1148             else if ( nIndex == 1 )
1149                 eWhich = SC_SPLIT_BOTTOMRIGHT;
1150             // sonst SC_SPLIT_BOTTOMLEFT
1151         }
1152         else if ( bVer )
1153         {
1154             if ( nIndex > 1 )
1155                 bError = sal_True;
1156             else if ( nIndex == 0 )
1157                 eWhich = SC_SPLIT_TOPLEFT;
1158             // sonst SC_SPLIT_BOTTOMLEFT
1159         }
1160         else if ( nIndex > 0 )
1161             bError = sal_True;          // nicht geteilt: nur 0 gueltig
1162 
1163         if (!bError)
1164             return new ScViewPaneObj( pViewSh, sal::static_int_cast<sal_uInt16>(eWhich) );
1165     }
1166 
1167     return NULL;
1168 }
1169 
1170 uno::Reference<sheet::XSpreadsheet> SAL_CALL ScTabViewObj::getActiveSheet()
1171                                                 throw(uno::RuntimeException)
1172 {
1173     ScUnoGuard aGuard;
1174     ScTabViewShell* pViewSh = GetViewShell();
1175     if (pViewSh)
1176     {
1177         ScViewData* pData = pViewSh->GetViewData();
1178         SCTAB nTab = pData->GetTabNo();
1179         return new ScTableSheetObj( pData->GetDocShell(), nTab );
1180     }
1181     return NULL;
1182 }
1183 
1184 void SAL_CALL ScTabViewObj::setActiveSheet( const uno::Reference<sheet::XSpreadsheet>& xActiveSheet )
1185                                                 throw(uno::RuntimeException)
1186 {
1187     ScUnoGuard aGuard;
1188 
1189     ScTabViewShell* pViewSh = GetViewShell();
1190     if ( pViewSh && xActiveSheet.is() )
1191     {
1192         //  XSpreadsheet und ScCellRangesBase -> muss ein Sheet sein
1193 
1194         ScCellRangesBase* pRangesImp = ScCellRangesBase::getImplementation( xActiveSheet );
1195         if ( pRangesImp && pViewSh->GetViewData()->GetDocShell() == pRangesImp->GetDocShell() )
1196         {
1197             const ScRangeList& rRanges = pRangesImp->GetRangeList();
1198             if ( rRanges.Count() == 1 )
1199             {
1200                 SCTAB nNewTab = rRanges.GetObject(0)->aStart.Tab();
1201                 if ( pViewSh->GetViewData()->GetDocument()->HasTable(nNewTab) )
1202                     pViewSh->SetTabNo( nNewTab );
1203             }
1204         }
1205     }
1206 }
1207 
1208 uno::Reference< uno::XInterface > ScTabViewObj::GetClickedObject(const Point& rPoint) const
1209 {
1210     uno::Reference< uno::XInterface > xTarget;
1211     if (GetViewShell())
1212     {
1213         SCsCOL nX;
1214         SCsROW nY;
1215         ScViewData* pData = GetViewShell()->GetViewData();
1216         ScSplitPos eSplitMode = pData->GetActivePart();
1217         SCTAB nTab(pData->GetTabNo());
1218         pData->GetPosFromPixel( rPoint.X(), rPoint.Y(), eSplitMode, nX, nY);
1219 
1220         ScAddress aCellPos (nX, nY, nTab);
1221         ScCellObj* pCellObj = new ScCellObj(pData->GetDocShell(), aCellPos);
1222 
1223         xTarget.set(uno::Reference<table::XCell>(pCellObj), uno::UNO_QUERY);
1224 
1225         ScDocument* pDoc = pData->GetDocument();
1226         if (pDoc && pDoc->GetDrawLayer())
1227         {
1228             SdrPage* pDrawPage = NULL;
1229             ScDrawLayer* pDrawLayer = pDoc->GetDrawLayer();
1230             if (pDrawLayer->HasObjects() && (pDrawLayer->GetPageCount() > nTab))
1231                 pDrawPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
1232 
1233             SdrView* pDrawView = GetViewShell()->GetSdrView();
1234 
1235             if (pDrawPage && pDrawView && pDrawView->GetSdrPageView())
1236             {
1237                 Window* pActiveWin = pData->GetActiveWin();
1238                 Point aPos = pActiveWin->PixelToLogic(rPoint);
1239 
1240                 sal_uInt16 nHitLog = (sal_uInt16) pActiveWin->PixelToLogic(
1241                                  Size(pDrawView->GetHitTolerancePixel(),0)).Width();
1242 
1243                 sal_uInt32 nCount(pDrawPage->GetObjCount());
1244                 sal_Bool bFound(sal_False);
1245                 sal_uInt32 i(0);
1246                 while (i < nCount && !bFound)
1247                 {
1248                     SdrObject* pObj = pDrawPage->GetObj(i);
1249                     if (pObj && SdrObjectPrimitiveHit(*pObj, aPos, nHitLog, *pDrawView->GetSdrPageView(), 0, false))
1250                     {
1251                         xTarget.set(pObj->getUnoShape(), uno::UNO_QUERY);
1252                         bFound = sal_True;
1253                     }
1254                     ++i;
1255                 }
1256             }
1257         }
1258     }
1259     return xTarget;
1260 }
1261 
1262 bool ScTabViewObj::IsMouseListening() const
1263 {
1264     if ( aMouseClickHandlers.Count() > 0 )
1265         return true;
1266 
1267     // also include sheet events, because MousePressed must be called for them
1268     ScViewData* pViewData = GetViewShell()->GetViewData();
1269     ScDocument* pDoc = pViewData->GetDocument();
1270     SCTAB nTab = pViewData->GetTabNo();
1271     return
1272         pDoc->HasSheetEventScript( nTab, SC_SHEETEVENT_RIGHTCLICK, true ) ||
1273         pDoc->HasSheetEventScript( nTab, SC_SHEETEVENT_DOUBLECLICK, true );
1274 }
1275 
1276 sal_Bool ScTabViewObj::MousePressed( const awt::MouseEvent& e )
1277                                     throw (::uno::RuntimeException)
1278 {
1279     sal_Bool bReturn(sal_False);
1280 
1281     uno::Reference< uno::XInterface > xTarget = GetClickedObject(Point(e.X, e.Y));
1282     if (aMouseClickHandlers.Count() && xTarget.is())
1283     {
1284         awt::EnhancedMouseEvent aMouseEvent;
1285 
1286         aMouseEvent.Buttons = e.Buttons;
1287         aMouseEvent.X = e.X;
1288         aMouseEvent.Y = e.Y;
1289         aMouseEvent.ClickCount = e.ClickCount;
1290         aMouseEvent.PopupTrigger = e.PopupTrigger;
1291         aMouseEvent.Target = xTarget;
1292 
1293         for ( sal_uInt16 n=0; n<aMouseClickHandlers.Count(); n++ )
1294         {
1295             try
1296             {
1297                 if (!(*aMouseClickHandlers[n])->mousePressed( aMouseEvent ))
1298                     bReturn = sal_True;
1299             }
1300             catch ( uno::Exception& )
1301             {
1302                 aMouseClickHandlers.DeleteAndDestroy(n);
1303                 --n; // because it will be increased again in the loop
1304             }
1305         }
1306     }
1307 
1308     // handle sheet events
1309     bool bDoubleClick = ( e.Buttons == awt::MouseButton::LEFT && e.ClickCount == 2 );
1310     bool bRightClick = ( e.Buttons == awt::MouseButton::RIGHT && e.ClickCount == 1 );
1311     if ( ( bDoubleClick || bRightClick ) && !bReturn && xTarget.is())
1312     {
1313         sal_Int32 nEvent = bDoubleClick ? SC_SHEETEVENT_DOUBLECLICK : SC_SHEETEVENT_RIGHTCLICK;
1314 
1315         ScTabViewShell* pViewSh = GetViewShell();
1316         ScViewData* pViewData = pViewSh->GetViewData();
1317         ScDocShell* pDocSh = pViewData->GetDocShell();
1318         ScDocument* pDoc = pDocSh->GetDocument();
1319         SCTAB nTab = pViewData->GetTabNo();
1320         const ScSheetEvents* pEvents = pDoc->GetSheetEvents(nTab);
1321         if (pEvents)
1322         {
1323             const rtl::OUString* pScript = pEvents->GetScript(nEvent);
1324             if (pScript)
1325             {
1326                 // the macro parameter is the clicked object, as in the mousePressed call above
1327                 uno::Sequence<uno::Any> aParams(1);
1328                 aParams[0] <<= xTarget;
1329 
1330                 uno::Any aRet;
1331                 uno::Sequence<sal_Int16> aOutArgsIndex;
1332                 uno::Sequence<uno::Any> aOutArgs;
1333 
1334                 /*ErrCode eRet =*/ pDocSh->CallXScript( *pScript, aParams, aRet, aOutArgsIndex, aOutArgs );
1335 
1336                 // look for a boolean return value of true
1337                 sal_Bool bRetValue = sal_False;
1338                 if (aRet >>= bRetValue)
1339                 {
1340                     if (bRetValue)
1341                         bReturn = sal_True;
1342                 }
1343             }
1344         }
1345 
1346         // execute VBA event handler
1347         if (!bReturn && xTarget.is()) try
1348         {
1349             uno::Reference< script::vba::XVBAEventProcessor > xVbaEvents( pDoc->GetVbaEventProcessor(), uno::UNO_SET_THROW );
1350             // the parameter is the clicked object, as in the mousePressed call above
1351             uno::Sequence< uno::Any > aArgs( 1 );
1352             aArgs[ 0 ] <<= xTarget;
1353             xVbaEvents->processVbaEvent( ScSheetEvents::GetVbaSheetEventId( nEvent ), aArgs );
1354         }
1355         catch( util::VetoException& )
1356         {
1357             bReturn = sal_True;
1358         }
1359         catch( uno::Exception& )
1360         {
1361         }
1362     }
1363 
1364     return bReturn;
1365 }
1366 
1367 sal_Bool ScTabViewObj::MouseReleased( const awt::MouseEvent& e )
1368                                     throw (uno::RuntimeException)
1369 {
1370     sal_Bool bReturn(sal_False);
1371 
1372     if (aMouseClickHandlers.Count())
1373     {
1374         uno::Reference< uno::XInterface > xTarget = GetClickedObject(Point(e.X, e.Y));
1375 
1376         if (xTarget.is())
1377         {
1378             awt::EnhancedMouseEvent aMouseEvent;
1379 
1380             aMouseEvent.Buttons = e.Buttons;
1381             aMouseEvent.X = e.X;
1382             aMouseEvent.Y = e.Y;
1383             aMouseEvent.ClickCount = e.ClickCount;
1384             aMouseEvent.PopupTrigger = e.PopupTrigger;
1385             aMouseEvent.Target = xTarget;
1386 
1387             for ( sal_uInt16 n=0; n<aMouseClickHandlers.Count(); n++ )
1388             {
1389                 try
1390                 {
1391                     if (!(*aMouseClickHandlers[n])->mouseReleased( aMouseEvent ))
1392                         bReturn = sal_True;
1393                 }
1394                 catch ( uno::Exception& )
1395                 {
1396                     aMouseClickHandlers.DeleteAndDestroy(n);
1397                     --n; // because it will be increased again in the loop
1398                 }
1399             }
1400         }
1401     }
1402     return bReturn;
1403 }
1404 
1405 // XEnhancedMouseClickBroadcaster
1406 
1407 void ScTabViewObj::StartMouseListening()
1408 {
1409 }
1410 
1411 void ScTabViewObj::EndMouseListening()
1412 {
1413     sal_uInt16 nCount(aMouseClickHandlers.Count());
1414     lang::EventObject aEvent;
1415     aEvent.Source = (cppu::OWeakObject*)this;
1416     for ( sal_uInt16 n=0; n<nCount; n++ )
1417     {
1418         try
1419         {
1420             (*aMouseClickHandlers[n])->disposing(aEvent);
1421         }
1422         catch ( uno::Exception& )
1423         {
1424         }
1425     }
1426     aMouseClickHandlers.DeleteAndDestroy(0, nCount);
1427 }
1428 
1429 void ScTabViewObj::StartActivationListening()
1430 {
1431 }
1432 
1433 void ScTabViewObj::EndActivationListening()
1434 {
1435     sal_uInt16 nCount = aActivationListeners.Count();
1436     lang::EventObject aEvent;
1437     aEvent.Source = (cppu::OWeakObject*)this;
1438     for ( sal_uInt16 n=0; n<nCount; n++ )
1439     {
1440         try
1441         {
1442             (*aActivationListeners[n])->disposing(aEvent);
1443         }
1444         catch ( uno::Exception& )
1445         {
1446         }
1447     }
1448     aActivationListeners.DeleteAndDestroy(0, nCount);
1449 }
1450 
1451 void SAL_CALL ScTabViewObj::addEnhancedMouseClickHandler( const uno::Reference< awt::XEnhancedMouseClickHandler >& aListener )
1452                                     throw (uno::RuntimeException)
1453 {
1454     ScUnoGuard aGuard;
1455 
1456     if (aListener.is())
1457     {
1458         sal_uInt16 nCount = aMouseClickHandlers.Count();
1459         uno::Reference<awt::XEnhancedMouseClickHandler> *pObj =
1460                 new uno::Reference<awt::XEnhancedMouseClickHandler>( aListener );
1461         aMouseClickHandlers.Insert( pObj, nCount );
1462 
1463         if (aMouseClickHandlers.Count() == 1 && nCount == 0) // only if a listener added
1464             StartMouseListening();
1465     }
1466 }
1467 
1468 void SAL_CALL ScTabViewObj::removeEnhancedMouseClickHandler( const uno::Reference< awt::XEnhancedMouseClickHandler >& aListener )
1469                                     throw (uno::RuntimeException)
1470 {
1471     ScUnoGuard aGuard;
1472     sal_uInt16 nCount = aMouseClickHandlers.Count();
1473     for ( sal_uInt16 n=nCount; n--; )
1474     {
1475         uno::Reference<awt::XEnhancedMouseClickHandler> *pObj = aMouseClickHandlers[n];
1476         if ( *pObj == aListener )
1477             aMouseClickHandlers.DeleteAndDestroy( n );
1478     }
1479     if ((aMouseClickHandlers.Count() == 0) && (nCount > 0)) // only if last listener removed
1480         EndMouseListening();
1481 }
1482 
1483 // XActivationBroadcaster
1484 
1485 void SAL_CALL ScTabViewObj::addActivationEventListener( const uno::Reference< sheet::XActivationEventListener >& aListener )
1486                                     throw (uno::RuntimeException)
1487 {
1488     ScUnoGuard aGuard;
1489 
1490     if (aListener.is())
1491     {
1492         sal_uInt16 nCount = aActivationListeners.Count();
1493         uno::Reference<sheet::XActivationEventListener> *pObj =
1494                 new uno::Reference<sheet::XActivationEventListener>( aListener );
1495         aActivationListeners.Insert( pObj, nCount );
1496 
1497         if (aActivationListeners.Count() == 1 && nCount == 0) // only if a listener added
1498             StartActivationListening();
1499     }
1500 }
1501 
1502 void SAL_CALL ScTabViewObj::removeActivationEventListener( const uno::Reference< sheet::XActivationEventListener >& aListener )
1503                                     throw (uno::RuntimeException)
1504 {
1505     ScUnoGuard aGuard;
1506     sal_uInt16 nCount = aActivationListeners.Count();
1507     for ( sal_uInt16 n=nCount; n--; )
1508     {
1509         uno::Reference<sheet::XActivationEventListener> *pObj = aActivationListeners[n];
1510         if ( *pObj == aListener )
1511             aActivationListeners.DeleteAndDestroy( n );
1512     }
1513     if ((aActivationListeners.Count() == 0) && (nCount > 0)) // only if last listener removed
1514         EndActivationListening();
1515 }
1516 
1517 //  PageBreakMode / Zoom sind Properties
1518 
1519 #if 0
1520 
1521 sal_Bool ScTabViewObj::getPagebreakMode(void) const
1522 {
1523     ScUnoGuard aGuard;
1524     ScTabViewShell* pViewSh = GetViewShell();
1525     if (pViewSh)
1526         return pViewSh->GetViewData()->IsPagebreakMode();
1527     return sal_False;
1528 }
1529 
1530 void ScTabViewObj::setPagebreakMode(sal_Bool PagebreakMode)
1531 {
1532     ScUnoGuard aGuard;
1533     ScTabViewShell* pViewSh = GetViewShell();
1534     if (pViewSh)
1535         pViewSh->SetPagebreakMode(PagebreakMode);
1536 }
1537 
1538 #endif
1539 
1540 sal_Int16 ScTabViewObj::GetZoom(void) const
1541 {
1542     ScTabViewShell* pViewSh = GetViewShell();
1543     if (pViewSh)
1544     {
1545         const Fraction& rZoomY = pViewSh->GetViewData()->GetZoomY();    // Y wird angezeigt
1546         return (sal_Int16)(( rZoomY.GetNumerator() * 100 ) / rZoomY.GetDenominator());
1547     }
1548     return 0;
1549 }
1550 
1551 void ScTabViewObj::SetZoom(sal_Int16 nZoom)
1552 {
1553     ScTabViewShell* pViewSh = GetViewShell();
1554     if (pViewSh)
1555     {
1556         if ( nZoom != GetZoom() && nZoom != 0 )
1557         {
1558             if (!pViewSh->GetViewData()->IsPagebreakMode())
1559             {
1560                 ScModule* pScMod = SC_MOD();
1561                 ScAppOptions aNewOpt(pScMod->GetAppOptions());
1562                 aNewOpt.SetZoom( nZoom );
1563                 aNewOpt.SetZoomType( pViewSh->GetViewData()->GetView()->GetZoomType() );
1564                 pScMod->SetAppOptions( aNewOpt );
1565             }
1566         }
1567         Fraction aFract( nZoom, 100 );
1568         pViewSh->SetZoom( aFract, aFract, sal_True );
1569         pViewSh->PaintGrid();
1570         pViewSh->PaintTop();
1571         pViewSh->PaintLeft();
1572         pViewSh->GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOM );
1573         pViewSh->GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOMSLIDER );
1574     }
1575 }
1576 
1577 sal_Int16 ScTabViewObj::GetZoomType(void) const
1578 {
1579     sal_Int16 aZoomType = view::DocumentZoomType::OPTIMAL;
1580     ScTabViewShell* pViewSh = GetViewShell();
1581     if (pViewSh)
1582     {
1583         SvxZoomType eZoomType = pViewSh->GetViewData()->GetView()->GetZoomType();
1584         switch (eZoomType)
1585         {
1586         case SVX_ZOOM_PERCENT:
1587             aZoomType = view::DocumentZoomType::BY_VALUE;
1588             break;
1589         case SVX_ZOOM_OPTIMAL:
1590             aZoomType = view::DocumentZoomType::OPTIMAL;
1591             break;
1592         case SVX_ZOOM_WHOLEPAGE:
1593             aZoomType = view::DocumentZoomType::ENTIRE_PAGE;
1594             break;
1595         case SVX_ZOOM_PAGEWIDTH:
1596             aZoomType = view::DocumentZoomType::PAGE_WIDTH;
1597             break;
1598         case SVX_ZOOM_PAGEWIDTH_NOBORDER:
1599             aZoomType = view::DocumentZoomType::PAGE_WIDTH_EXACT;
1600             break;
1601         }
1602     }
1603     return aZoomType;
1604 }
1605 
1606 void ScTabViewObj::SetZoomType(sal_Int16 aZoomType)
1607 {
1608     ScTabViewShell* pViewSh = GetViewShell();
1609     if (pViewSh)
1610     {
1611         ScDBFunc* pView = pViewSh->GetViewData()->GetView();
1612         if (pView)
1613         {
1614             SvxZoomType eZoomType;
1615             switch (aZoomType)
1616             {
1617             case view::DocumentZoomType::BY_VALUE:
1618                 eZoomType = SVX_ZOOM_PERCENT;
1619                 break;
1620             case view::DocumentZoomType::OPTIMAL:
1621                 eZoomType = SVX_ZOOM_OPTIMAL;
1622                 break;
1623             case view::DocumentZoomType::ENTIRE_PAGE:
1624                 eZoomType = SVX_ZOOM_WHOLEPAGE;
1625                 break;
1626             case view::DocumentZoomType::PAGE_WIDTH:
1627                 eZoomType = SVX_ZOOM_PAGEWIDTH;
1628                 break;
1629             case view::DocumentZoomType::PAGE_WIDTH_EXACT:
1630                 eZoomType = SVX_ZOOM_PAGEWIDTH_NOBORDER;
1631                 break;
1632             default:
1633                 eZoomType = SVX_ZOOM_OPTIMAL;
1634             }
1635             sal_Int16 nZoom(GetZoom());
1636             sal_Int16 nOldZoom(nZoom);
1637             if ( eZoomType == SVX_ZOOM_PERCENT )
1638             {
1639                 if ( nZoom < MINZOOM )  nZoom = MINZOOM;
1640                 if ( nZoom > MAXZOOM )  nZoom = MAXZOOM;
1641             }
1642             else
1643                 nZoom = pView->CalcZoom( eZoomType, nOldZoom );
1644 
1645             switch ( eZoomType )
1646             {
1647                 case SVX_ZOOM_WHOLEPAGE:
1648                 case SVX_ZOOM_PAGEWIDTH:
1649                     pView->SetZoomType( eZoomType, sal_True );
1650                     break;
1651 
1652                 default:
1653                     pView->SetZoomType( SVX_ZOOM_PERCENT, sal_True );
1654             }
1655             SetZoom( nZoom );
1656         }
1657     }
1658 }
1659 
1660 sal_Bool SAL_CALL ScTabViewObj::getIsWindowSplit() throw(uno::RuntimeException)
1661 {
1662     ScUnoGuard aGuard;
1663     //  wie Menue-Slot SID_WINDOW_SPLIT
1664 
1665     ScTabViewShell* pViewSh = GetViewShell();
1666     if (pViewSh)
1667     {
1668         ScViewData* pViewData = pViewSh->GetViewData();
1669         return ( pViewData->GetHSplitMode() == SC_SPLIT_NORMAL ||
1670                  pViewData->GetVSplitMode() == SC_SPLIT_NORMAL );
1671     }
1672 
1673     return sal_False;
1674 }
1675 
1676 sal_Bool SAL_CALL ScTabViewObj::hasFrozenPanes() throw(uno::RuntimeException)
1677 {
1678     ScUnoGuard aGuard;
1679     //  wie Menue-Slot SID_WINDOW_FIX
1680 
1681     ScTabViewShell* pViewSh = GetViewShell();
1682     if (pViewSh)
1683     {
1684         ScViewData* pViewData = pViewSh->GetViewData();
1685         return ( pViewData->GetHSplitMode() == SC_SPLIT_FIX ||
1686                  pViewData->GetVSplitMode() == SC_SPLIT_FIX );
1687     }
1688 
1689     return sal_False;
1690 }
1691 
1692 sal_Int32 SAL_CALL ScTabViewObj::getSplitHorizontal() throw(uno::RuntimeException)
1693 {
1694     ScUnoGuard aGuard;
1695     ScTabViewShell* pViewSh = GetViewShell();
1696     if (pViewSh)
1697     {
1698         ScViewData* pViewData = pViewSh->GetViewData();
1699         if ( pViewData->GetHSplitMode() != SC_SPLIT_NONE )
1700             return pViewData->GetHSplitPos();
1701     }
1702     return 0;
1703 }
1704 
1705 sal_Int32 SAL_CALL ScTabViewObj::getSplitVertical() throw(uno::RuntimeException)
1706 {
1707     ScUnoGuard aGuard;
1708     ScTabViewShell* pViewSh = GetViewShell();
1709     if (pViewSh)
1710     {
1711         ScViewData* pViewData = pViewSh->GetViewData();
1712         if ( pViewData->GetVSplitMode() != SC_SPLIT_NONE )
1713             return pViewData->GetVSplitPos();
1714     }
1715     return 0;
1716 }
1717 
1718 sal_Int32 SAL_CALL ScTabViewObj::getSplitColumn() throw(uno::RuntimeException)
1719 {
1720     ScUnoGuard aGuard;
1721     ScTabViewShell* pViewSh = GetViewShell();
1722     if (pViewSh)
1723     {
1724         ScViewData* pViewData = pViewSh->GetViewData();
1725         if ( pViewData->GetHSplitMode() != SC_SPLIT_NONE )
1726         {
1727             long nSplit = pViewData->GetHSplitPos();
1728 
1729             ScSplitPos ePos = SC_SPLIT_BOTTOMLEFT;
1730             if ( pViewData->GetVSplitMode() != SC_SPLIT_NONE )
1731                 ePos = SC_SPLIT_TOPLEFT;
1732 
1733             SCsCOL nCol;
1734             SCsROW nRow;
1735             pViewData->GetPosFromPixel( nSplit, 0, ePos, nCol, nRow, sal_False );
1736             if ( nCol > 0 )
1737                 return nCol;
1738         }
1739     }
1740     return 0;
1741 }
1742 
1743 sal_Int32 SAL_CALL ScTabViewObj::getSplitRow() throw(uno::RuntimeException)
1744 {
1745     ScUnoGuard aGuard;
1746     ScTabViewShell* pViewSh = GetViewShell();
1747     if (pViewSh)
1748     {
1749         ScViewData* pViewData = pViewSh->GetViewData();
1750         if ( pViewData->GetVSplitMode() != SC_SPLIT_NONE )
1751         {
1752             long nSplit = pViewData->GetVSplitPos();
1753 
1754             ScSplitPos ePos = SC_SPLIT_TOPLEFT;     // es ist vertikal geteilt
1755             SCsCOL nCol;
1756             SCsROW nRow;
1757             pViewData->GetPosFromPixel( 0, nSplit, ePos, nCol, nRow, sal_False );
1758             if ( nRow > 0 )
1759                 return nRow;
1760         }
1761     }
1762     return 0;
1763 }
1764 
1765 void SAL_CALL ScTabViewObj::splitAtPosition( sal_Int32 nPixelX, sal_Int32 nPixelY )
1766                                                 throw(uno::RuntimeException)
1767 {
1768     ScUnoGuard aGuard;
1769     ScTabViewShell* pViewSh = GetViewShell();
1770     if (pViewSh)
1771     {
1772         pViewSh->SplitAtPixel( Point( nPixelX, nPixelY ), sal_True, sal_True );
1773         pViewSh->FreezeSplitters( sal_False );
1774         pViewSh->InvalidateSplit();
1775     }
1776 }
1777 
1778 void SAL_CALL ScTabViewObj::freezeAtPosition( sal_Int32 nColumns, sal_Int32 nRows )
1779                                                 throw(uno::RuntimeException)
1780 {
1781     ScUnoGuard aGuard;
1782     ScTabViewShell* pViewSh = GetViewShell();
1783     if (pViewSh)
1784     {
1785         //  erst alles aufheben -> kein Stress mit Scrolling zwischendurch o.ae.
1786 
1787         pViewSh->RemoveSplit();
1788 
1789         Point aWinStart;
1790         Window* pWin = pViewSh->GetWindowByPos( SC_SPLIT_BOTTOMLEFT );
1791         if (pWin)
1792             aWinStart = pWin->GetPosPixel();
1793 
1794         ScViewData* pViewData = pViewSh->GetViewData();
1795         Point aSplit(pViewData->GetScrPos( (SCCOL)nColumns, (SCROW)nRows, SC_SPLIT_BOTTOMLEFT, sal_True ));
1796         aSplit += aWinStart;
1797 
1798         pViewSh->SplitAtPixel( aSplit, sal_True, sal_True );
1799         pViewSh->FreezeSplitters( sal_True );
1800         pViewSh->InvalidateSplit();
1801     }
1802 }
1803 
1804 void SAL_CALL ScTabViewObj::addSelectionChangeListener(
1805                 const uno::Reference<view::XSelectionChangeListener>& xListener )
1806                                                     throw(uno::RuntimeException)
1807 {
1808     ScUnoGuard aGuard;
1809     uno::Reference<view::XSelectionChangeListener>* pObj =
1810             new uno::Reference<view::XSelectionChangeListener>( xListener );
1811     aSelectionListeners.Insert( pObj, aSelectionListeners.Count() );
1812 }
1813 
1814 void SAL_CALL ScTabViewObj::removeSelectionChangeListener(
1815                 const uno::Reference< view::XSelectionChangeListener >& xListener )
1816                                                     throw(uno::RuntimeException)
1817 {
1818     ScUnoGuard aGuard;
1819     sal_uInt16 nCount = aSelectionListeners.Count();
1820     for ( sal_uInt16 n=nCount; n--; )
1821     {
1822         uno::Reference<view::XSelectionChangeListener> *pObj = aSelectionListeners[n];
1823         if ( *pObj == xListener )       //! wozu der Mumpitz mit queryInterface?
1824         {
1825             aSelectionListeners.DeleteAndDestroy( n );
1826             break;
1827         }
1828     }
1829 }
1830 
1831 void ScTabViewObj::SelectionChanged()
1832 {
1833     lang::EventObject aEvent;
1834     aEvent.Source.set(static_cast<cppu::OWeakObject*>(this));
1835     for ( sal_uInt16 n=0; n<aSelectionListeners.Count(); n++ )
1836         (*aSelectionListeners[n])->selectionChanged( aEvent );
1837 
1838     // handle sheet events
1839     ScTabViewShell* pViewSh = GetViewShell();
1840     ScViewData* pViewData = pViewSh->GetViewData();
1841     ScDocShell* pDocSh = pViewData->GetDocShell();
1842     ScDocument* pDoc = pDocSh->GetDocument();
1843     SCTAB nTab = pViewData->GetTabNo();
1844     const ScSheetEvents* pEvents = pDoc->GetSheetEvents(nTab);
1845     if (pEvents)
1846     {
1847         const rtl::OUString* pScript = pEvents->GetScript(SC_SHEETEVENT_SELECT);
1848         if (pScript)
1849         {
1850             // the macro parameter is the selection as returned by getSelection
1851             uno::Sequence<uno::Any> aParams(1);
1852             aParams[0] = getSelection();
1853             uno::Any aRet;
1854             uno::Sequence<sal_Int16> aOutArgsIndex;
1855             uno::Sequence<uno::Any> aOutArgs;
1856             /*ErrCode eRet =*/ pDocSh->CallXScript( *pScript, aParams, aRet, aOutArgsIndex, aOutArgs );
1857         }
1858     }
1859 
1860     // execute VBA event handler
1861     try
1862     {
1863         uno::Reference< script::vba::XVBAEventProcessor > xVbaEvents( pDoc->GetVbaEventProcessor(), uno::UNO_SET_THROW );
1864         // the parameter is the clicked object, as in the mousePressed call above
1865         uno::Sequence< uno::Any > aArgs( 1 );
1866         aArgs[ 0 ] <<= getSelection();
1867         xVbaEvents->processVbaEvent( ScSheetEvents::GetVbaSheetEventId( SC_SHEETEVENT_SELECT ), aArgs );
1868     }
1869     catch( uno::Exception& )
1870     {
1871     }
1872 }
1873 
1874 
1875 //  XPropertySet (View-Optionen)
1876 //! auch an der Applikation anbieten?
1877 
1878 uno::Reference<beans::XPropertySetInfo> SAL_CALL ScTabViewObj::getPropertySetInfo()
1879                                                         throw(uno::RuntimeException)
1880 {
1881     ScUnoGuard aGuard;
1882     static uno::Reference<beans::XPropertySetInfo> aRef(
1883         new SfxItemPropertySetInfo( aPropSet.getPropertyMap() ));
1884     return aRef;
1885 }
1886 
1887 void SAL_CALL ScTabViewObj::setPropertyValue(
1888                         const rtl::OUString& aPropertyName, const uno::Any& aValue )
1889                 throw(beans::UnknownPropertyException, beans::PropertyVetoException,
1890                         lang::IllegalArgumentException, lang::WrappedTargetException,
1891                         uno::RuntimeException)
1892 {
1893     ScUnoGuard aGuard;
1894     String aString(aPropertyName);
1895 
1896     ScTabViewShell* pViewSh = GetViewShell();
1897     if (pViewSh)
1898     {
1899         ScViewData* pViewData = pViewSh->GetViewData();
1900         const ScViewOptions& rOldOpt = pViewSh->GetViewData()->GetOptions();
1901         ScViewOptions aNewOpt(rOldOpt);
1902 
1903         if ( aString.EqualsAscii( SC_UNO_COLROWHDR ) || aString.EqualsAscii( OLD_UNO_COLROWHDR ) )
1904             aNewOpt.SetOption( VOPT_HEADER, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
1905         else if ( aString.EqualsAscii( SC_UNO_HORSCROLL ) || aString.EqualsAscii( OLD_UNO_HORSCROLL ) )
1906             aNewOpt.SetOption( VOPT_HSCROLL, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
1907         else if ( aString.EqualsAscii( SC_UNO_OUTLSYMB ) || aString.EqualsAscii( OLD_UNO_OUTLSYMB ) )
1908             aNewOpt.SetOption( VOPT_OUTLINER, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
1909         else if ( aString.EqualsAscii( SC_UNO_SHEETTABS ) || aString.EqualsAscii( OLD_UNO_SHEETTABS ) )
1910             aNewOpt.SetOption( VOPT_TABCONTROLS, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
1911         else if ( aString.EqualsAscii( SC_UNO_SHOWANCHOR ) )
1912             aNewOpt.SetOption( VOPT_ANCHOR, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
1913         else if ( aString.EqualsAscii( SC_UNO_SHOWFORM ) )
1914             aNewOpt.SetOption( VOPT_FORMULAS, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
1915         else if ( aString.EqualsAscii( SC_UNO_SHOWGRID ) )
1916             aNewOpt.SetOption( VOPT_GRID, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
1917         else if ( aString.EqualsAscii( SC_UNO_SHOWHELP ) )
1918             aNewOpt.SetOption( VOPT_HELPLINES, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
1919         else if ( aString.EqualsAscii( SC_UNO_SHOWNOTES ) )
1920             aNewOpt.SetOption( VOPT_NOTES, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
1921         else if ( aString.EqualsAscii( SC_UNO_SHOWPAGEBR ) )
1922             aNewOpt.SetOption( VOPT_PAGEBREAKS, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
1923         else if ( aString.EqualsAscii( SC_UNO_SHOWZERO ) )
1924             aNewOpt.SetOption( VOPT_NULLVALS, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
1925         else if ( aString.EqualsAscii( SC_UNO_SHOWSOLID ) )
1926             aNewOpt.SetOption( VOPT_SOLIDHANDLES, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
1927         else if ( aString.EqualsAscii( SC_UNO_VALUEHIGH ) || aString.EqualsAscii( OLD_UNO_VALUEHIGH ) )
1928             aNewOpt.SetOption( VOPT_SYNTAX, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
1929         else if ( aString.EqualsAscii( SC_UNO_VERTSCROLL ) || aString.EqualsAscii( OLD_UNO_VERTSCROLL ) )
1930             aNewOpt.SetOption( VOPT_VSCROLL, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
1931         else if ( aString.EqualsAscii( SC_UNO_SHOWOBJ ) )
1932         {
1933             sal_Int16 nIntVal = 0;
1934             if ( aValue >>= nIntVal )
1935             {
1936                 //#i80528# adapt to new range eventually
1937                 if((sal_Int16)VOBJ_MODE_HIDE < nIntVal) nIntVal = (sal_Int16)VOBJ_MODE_SHOW;
1938 
1939                 aNewOpt.SetObjMode( VOBJ_TYPE_OLE, (ScVObjMode)nIntVal);
1940             }
1941         }
1942         else if ( aString.EqualsAscii( SC_UNO_SHOWCHARTS ) )
1943         {
1944             sal_Int16 nIntVal = 0;
1945             if ( aValue >>= nIntVal )
1946             {
1947                 //#i80528# adapt to new range eventually
1948                 if((sal_Int16)VOBJ_MODE_HIDE < nIntVal) nIntVal = (sal_Int16)VOBJ_MODE_SHOW;
1949 
1950                 aNewOpt.SetObjMode( VOBJ_TYPE_CHART, (ScVObjMode)nIntVal);
1951             }
1952         }
1953         else if ( aString.EqualsAscii( SC_UNO_SHOWDRAW ) )
1954         {
1955             sal_Int16 nIntVal = 0;
1956             if ( aValue >>= nIntVal )
1957             {
1958                 //#i80528# adapt to new range eventually
1959                 if((sal_Int16)VOBJ_MODE_HIDE < nIntVal) nIntVal = (sal_Int16)VOBJ_MODE_SHOW;
1960 
1961                 aNewOpt.SetObjMode( VOBJ_TYPE_DRAW, (ScVObjMode)nIntVal);
1962             }
1963         }
1964         else if ( aString.EqualsAscii( SC_UNO_GRIDCOLOR ) )
1965         {
1966             sal_Int32 nIntVal = 0;
1967             if ( aValue >>= nIntVal )
1968                 aNewOpt.SetGridColor( nIntVal, String() );
1969         }
1970         else if ( aString.EqualsAscii( SC_UNO_ZOOMTYPE ) )
1971         {
1972             sal_Int16 nIntVal = 0;
1973             if ( aValue >>= nIntVal )
1974                 SetZoomType(nIntVal);
1975         }
1976         else if ( aString.EqualsAscii( SC_UNO_ZOOMVALUE ) )
1977         {
1978             sal_Int16 nIntVal = 0;
1979             if ( aValue >>= nIntVal )
1980                 SetZoom(nIntVal);
1981         }
1982 
1983         //  Optionen werden an der View und am Dokument (fuer neue Views) gesetzt,
1984         //  damit sie beim Speichern erhalten bleiben.
1985         //! An der App (Module) braeuchte man noch eine Extra-Moeglichkeit,
1986         //! das einzustellen (fuer neue Dokumente)
1987 
1988         if ( aNewOpt != rOldOpt )
1989         {
1990             pViewData->SetOptions( aNewOpt );
1991             pViewData->GetDocument()->SetViewOptions( aNewOpt );
1992             pViewData->GetDocShell()->SetDocumentModified();    //! wirklich?
1993 
1994             pViewSh->UpdateFixPos();
1995             pViewSh->PaintGrid();
1996             pViewSh->PaintTop();
1997             pViewSh->PaintLeft();
1998             pViewSh->PaintExtras();
1999             pViewSh->InvalidateBorder();
2000 
2001             SfxBindings& rBindings = pViewSh->GetViewFrame()->GetBindings();
2002             rBindings.Invalidate( FID_TOGGLEHEADERS ); // -> Checks im Menue
2003             rBindings.Invalidate( FID_TOGGLESYNTAX );
2004         }
2005     }
2006 }
2007 
2008 uno::Any SAL_CALL ScTabViewObj::getPropertyValue( const rtl::OUString& aPropertyName )
2009                 throw(beans::UnknownPropertyException, lang::WrappedTargetException,
2010                         uno::RuntimeException)
2011 {
2012     ScUnoGuard aGuard;
2013     String aString(aPropertyName);
2014     uno::Any aRet;
2015 
2016     ScTabViewShell* pViewSh = GetViewShell();
2017     if (pViewSh)
2018     {
2019         const ScViewOptions& rOpt = pViewSh->GetViewData()->GetOptions();
2020 
2021         if ( aString.EqualsAscii( SC_UNO_COLROWHDR ) || aString.EqualsAscii( OLD_UNO_COLROWHDR ) )
2022             ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_HEADER ) );
2023         else if ( aString.EqualsAscii( SC_UNO_HORSCROLL ) || aString.EqualsAscii( OLD_UNO_HORSCROLL ) )
2024             ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_HSCROLL ) );
2025         else if ( aString.EqualsAscii( SC_UNO_OUTLSYMB ) || aString.EqualsAscii( OLD_UNO_OUTLSYMB ) )
2026             ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_OUTLINER ) );
2027         else if ( aString.EqualsAscii( SC_UNO_SHEETTABS ) || aString.EqualsAscii( OLD_UNO_SHEETTABS ) )
2028             ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_TABCONTROLS ) );
2029         else if ( aString.EqualsAscii( SC_UNO_SHOWANCHOR ) ) ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_ANCHOR ) );
2030         else if ( aString.EqualsAscii( SC_UNO_SHOWFORM ) )   ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_FORMULAS ) );
2031         else if ( aString.EqualsAscii( SC_UNO_SHOWGRID ) )   ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_GRID ) );
2032         else if ( aString.EqualsAscii( SC_UNO_SHOWHELP ) )   ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_HELPLINES ) );
2033         else if ( aString.EqualsAscii( SC_UNO_SHOWNOTES ) )  ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_NOTES ) );
2034         else if ( aString.EqualsAscii( SC_UNO_SHOWPAGEBR ) ) ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_PAGEBREAKS ) );
2035         else if ( aString.EqualsAscii( SC_UNO_SHOWZERO ) )   ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_NULLVALS ) );
2036         else if ( aString.EqualsAscii( SC_UNO_SHOWSOLID ) )  ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_SOLIDHANDLES ) );
2037         else if ( aString.EqualsAscii( SC_UNO_VALUEHIGH ) || aString.EqualsAscii( OLD_UNO_VALUEHIGH ) )
2038             ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_SYNTAX ) );
2039         else if ( aString.EqualsAscii( SC_UNO_VERTSCROLL ) || aString.EqualsAscii( OLD_UNO_VERTSCROLL ) )
2040             ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_VSCROLL ) );
2041         else if ( aString.EqualsAscii( SC_UNO_SHOWOBJ ) )    aRet <<= (sal_Int16)( rOpt.GetObjMode( VOBJ_TYPE_OLE ) );
2042         else if ( aString.EqualsAscii( SC_UNO_SHOWCHARTS ) ) aRet <<= (sal_Int16)( rOpt.GetObjMode( VOBJ_TYPE_CHART ) );
2043         else if ( aString.EqualsAscii( SC_UNO_SHOWDRAW ) )   aRet <<= (sal_Int16)( rOpt.GetObjMode( VOBJ_TYPE_DRAW ) );
2044         else if ( aString.EqualsAscii( SC_UNO_GRIDCOLOR ) )  aRet <<= (sal_Int32)( rOpt.GetGridColor().GetColor() );
2045         else if ( aString.EqualsAscii( SC_UNO_VISAREA ) ) aRet <<= GetVisArea();
2046         else if ( aString.EqualsAscii( SC_UNO_ZOOMTYPE ) ) aRet <<= GetZoomType();
2047         else if ( aString.EqualsAscii( SC_UNO_ZOOMVALUE ) ) aRet <<= GetZoom();
2048         else if ( aString.EqualsAscii( SC_UNO_VISAREASCREEN ) )
2049         {
2050             ScViewData* pViewData = pViewSh->GetViewData();
2051             Window* pActiveWin = ( pViewData ? pViewData->GetActiveWin() : NULL );
2052             if ( pActiveWin )
2053             {
2054                 Rectangle aRect = pActiveWin->GetWindowExtentsRelative( NULL );
2055                 aRet <<= AWTRectangle( aRect );
2056             }
2057         }
2058     }
2059 
2060     return aRet;
2061 }
2062 
2063 void SAL_CALL ScTabViewObj::addPropertyChangeListener( const ::rtl::OUString& /* aPropertyName */,
2064                                     const uno::Reference<beans::XPropertyChangeListener >& xListener )
2065                                 throw(beans::UnknownPropertyException,
2066                                     lang::WrappedTargetException,
2067                                     uno::RuntimeException)
2068 {
2069     ScUnoGuard aGuard;
2070     uno::Reference<beans::XPropertyChangeListener>* pObj =
2071             new uno::Reference<beans::XPropertyChangeListener>( xListener );
2072     aPropertyChgListeners.Insert( pObj, aPropertyChgListeners.Count() );
2073 }
2074 
2075 void SAL_CALL ScTabViewObj::removePropertyChangeListener( const ::rtl::OUString& /* aPropertyName */,
2076                                     const uno::Reference<beans::XPropertyChangeListener >& xListener )
2077                                 throw(beans::UnknownPropertyException,
2078                                     lang::WrappedTargetException,
2079                                     uno::RuntimeException)
2080 {
2081     ScUnoGuard aGuard;
2082     sal_uInt16 nCount = aPropertyChgListeners.Count();
2083     for ( sal_uInt16 n=nCount; n--; )
2084     {
2085         uno::Reference<beans::XPropertyChangeListener> *pObj = aPropertyChgListeners[n];
2086         if ( *pObj == xListener )       //! wozu der Mumpitz mit queryInterface?
2087         {
2088             aPropertyChgListeners.DeleteAndDestroy( n );
2089             break;
2090         }
2091     }
2092 }
2093 
2094 void SAL_CALL ScTabViewObj::addVetoableChangeListener( const ::rtl::OUString& /* PropertyName */,
2095                                     const uno::Reference<beans::XVetoableChangeListener >& /* aListener */ )
2096                                 throw(beans::UnknownPropertyException,
2097                                     lang::WrappedTargetException,
2098                                     uno::RuntimeException)
2099 {
2100 }
2101 
2102 void SAL_CALL ScTabViewObj::removeVetoableChangeListener( const ::rtl::OUString& /* PropertyName */,
2103                                     const uno::Reference<beans::XVetoableChangeListener >& /* aListener */ )
2104                                 throw(beans::UnknownPropertyException,
2105                                     lang::WrappedTargetException,
2106                                     uno::RuntimeException)
2107 {
2108 }
2109 
2110 void ScTabViewObj::VisAreaChanged()
2111 {
2112     beans::PropertyChangeEvent aEvent;
2113     aEvent.Source.set(static_cast<cppu::OWeakObject*>(this));
2114     for ( sal_uInt16 n=0; n<aPropertyChgListeners.Count(); n++ )
2115         (*aPropertyChgListeners[n])->propertyChange( aEvent );
2116 }
2117 
2118 // XRangeSelection
2119 
2120 void SAL_CALL ScTabViewObj::startRangeSelection(
2121                                 const uno::Sequence<beans::PropertyValue>& aArguments )
2122                                     throw(uno::RuntimeException)
2123 {
2124     ScUnoGuard aGuard;
2125     ScTabViewShell* pViewSh = GetViewShell();
2126     if (pViewSh)
2127     {
2128         String aInitVal, aTitle;
2129         sal_Bool bCloseOnButtonUp = sal_False;
2130         sal_Bool bSingleCell = sal_False;
2131         sal_Bool bMultiSelection = sal_False;
2132 
2133         rtl::OUString aStrVal;
2134         const beans::PropertyValue* pPropArray = aArguments.getConstArray();
2135         long nPropCount = aArguments.getLength();
2136         for (long i = 0; i < nPropCount; i++)
2137         {
2138             const beans::PropertyValue& rProp = pPropArray[i];
2139             String aPropName(rProp.Name);
2140 
2141             if (aPropName.EqualsAscii( SC_UNONAME_CLOSEONUP ))
2142                 bCloseOnButtonUp = ScUnoHelpFunctions::GetBoolFromAny( rProp.Value );
2143             else if (aPropName.EqualsAscii( SC_UNONAME_TITLE ))
2144             {
2145                 if ( rProp.Value >>= aStrVal )
2146                     aTitle = String( aStrVal );
2147             }
2148             else if (aPropName.EqualsAscii( SC_UNONAME_INITVAL ))
2149             {
2150                 if ( rProp.Value >>= aStrVal )
2151                     aInitVal = String( aStrVal );
2152             }
2153             else if (aPropName.EqualsAscii( SC_UNONAME_SINGLECELL ))
2154                 bSingleCell = ScUnoHelpFunctions::GetBoolFromAny( rProp.Value );
2155             else if (aPropName.EqualsAscii( SC_UNONAME_MULTISEL ))
2156                 bMultiSelection = ScUnoHelpFunctions::GetBoolFromAny( rProp.Value );
2157         }
2158 
2159         pViewSh->StartSimpleRefDialog( aTitle, aInitVal, bCloseOnButtonUp, bSingleCell, bMultiSelection );
2160     }
2161 }
2162 
2163 void SAL_CALL ScTabViewObj::abortRangeSelection() throw(uno::RuntimeException)
2164 {
2165     ScUnoGuard aGuard;
2166     ScTabViewShell* pViewSh = GetViewShell();
2167     if (pViewSh)
2168         pViewSh->StopSimpleRefDialog();
2169 }
2170 
2171 void SAL_CALL ScTabViewObj::addRangeSelectionListener(
2172                                 const uno::Reference<sheet::XRangeSelectionListener>& xListener )
2173                                     throw(uno::RuntimeException)
2174 {
2175     ScUnoGuard aGuard;
2176     uno::Reference<sheet::XRangeSelectionListener>* pObj =
2177             new uno::Reference<sheet::XRangeSelectionListener>( xListener );
2178     aRangeSelListeners.Insert( pObj, aRangeSelListeners.Count() );
2179 }
2180 
2181 void SAL_CALL ScTabViewObj::removeRangeSelectionListener(
2182                                 const uno::Reference<sheet::XRangeSelectionListener>& xListener )
2183                                     throw(uno::RuntimeException)
2184 {
2185     ScUnoGuard aGuard;
2186     sal_uInt16 nCount = aRangeSelListeners.Count();
2187     for ( sal_uInt16 n=nCount; n--; )
2188     {
2189         uno::Reference<sheet::XRangeSelectionListener> *pObj = aRangeSelListeners[n];
2190         if ( *pObj == xListener )
2191         {
2192             aRangeSelListeners.DeleteAndDestroy( n );
2193             break;
2194         }
2195     }
2196 }
2197 
2198 void SAL_CALL ScTabViewObj::addRangeSelectionChangeListener(
2199                                 const uno::Reference<sheet::XRangeSelectionChangeListener>& xListener )
2200                                     throw(uno::RuntimeException)
2201 {
2202     ScUnoGuard aGuard;
2203     uno::Reference<sheet::XRangeSelectionChangeListener>* pObj =
2204             new uno::Reference<sheet::XRangeSelectionChangeListener>( xListener );
2205     aRangeChgListeners.Insert( pObj, aRangeChgListeners.Count() );
2206 }
2207 
2208 void SAL_CALL ScTabViewObj::removeRangeSelectionChangeListener(
2209                                 const uno::Reference<sheet::XRangeSelectionChangeListener>& xListener )
2210                                     throw(uno::RuntimeException)
2211 {
2212     ScUnoGuard aGuard;
2213     sal_uInt16 nCount = aRangeChgListeners.Count();
2214     for ( sal_uInt16 n=nCount; n--; )
2215     {
2216         uno::Reference<sheet::XRangeSelectionChangeListener> *pObj = aRangeChgListeners[n];
2217         if ( *pObj == xListener )
2218         {
2219             aRangeChgListeners.DeleteAndDestroy( n );
2220             break;
2221         }
2222     }
2223 }
2224 
2225 void ScTabViewObj::RangeSelDone( const String& rText )
2226 {
2227     sheet::RangeSelectionEvent aEvent;
2228     aEvent.Source.set(static_cast<cppu::OWeakObject*>(this));
2229     aEvent.RangeDescriptor = rtl::OUString( rText );
2230 
2231     for ( sal_uInt16 n=0; n<aRangeSelListeners.Count(); n++ )
2232         (*aRangeSelListeners[n])->done( aEvent );
2233 }
2234 
2235 void ScTabViewObj::RangeSelAborted( const String& rText )
2236 {
2237     sheet::RangeSelectionEvent aEvent;
2238     aEvent.Source.set(static_cast<cppu::OWeakObject*>(this));
2239     aEvent.RangeDescriptor = rtl::OUString( rText );
2240 
2241     for ( sal_uInt16 n=0; n<aRangeSelListeners.Count(); n++ )
2242         (*aRangeSelListeners[n])->aborted( aEvent );
2243 }
2244 
2245 void ScTabViewObj::RangeSelChanged( const String& rText )
2246 {
2247     sheet::RangeSelectionEvent aEvent;
2248     aEvent.Source.set(static_cast<cppu::OWeakObject*>(this));
2249     aEvent.RangeDescriptor = rtl::OUString( rText );
2250 
2251     for ( sal_uInt16 n=0; n<aRangeChgListeners.Count(); n++ )
2252         (*aRangeChgListeners[n])->descriptorChanged( aEvent );
2253 }
2254 
2255 // XServiceInfo
2256 
2257 rtl::OUString SAL_CALL ScTabViewObj::getImplementationName() throw(uno::RuntimeException)
2258 {
2259     return rtl::OUString::createFromAscii( "ScTabViewObj" );
2260 }
2261 
2262 sal_Bool SAL_CALL ScTabViewObj::supportsService( const rtl::OUString& rServiceName )
2263                                                     throw(uno::RuntimeException)
2264 {
2265     String aServiceStr( rServiceName );
2266     return aServiceStr.EqualsAscii( SCTABVIEWOBJ_SERVICE ) ||
2267            aServiceStr.EqualsAscii( SCVIEWSETTINGS_SERVICE );
2268 }
2269 
2270 uno::Sequence<rtl::OUString> SAL_CALL ScTabViewObj::getSupportedServiceNames()
2271                                                     throw(uno::RuntimeException)
2272 {
2273     uno::Sequence<rtl::OUString> aRet(2);
2274     rtl::OUString* pArray = aRet.getArray();
2275     pArray[0] = rtl::OUString::createFromAscii( SCTABVIEWOBJ_SERVICE );
2276     pArray[1] = rtl::OUString::createFromAscii( SCVIEWSETTINGS_SERVICE );
2277     return aRet;
2278 }
2279 
2280 // XUnoTunnel
2281 
2282 sal_Int64 SAL_CALL ScTabViewObj::getSomething(
2283                 const uno::Sequence<sal_Int8 >& rId ) throw(uno::RuntimeException)
2284 {
2285     if ( rId.getLength() == 16 &&
2286           0 == rtl_compareMemory( getUnoTunnelId().getConstArray(),
2287                                     rId.getConstArray(), 16 ) )
2288     {
2289         return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this));
2290     }
2291     return 0;
2292 }
2293 
2294 // static
2295 const uno::Sequence<sal_Int8>& ScTabViewObj::getUnoTunnelId()
2296 {
2297     static uno::Sequence<sal_Int8> * pSeq = 0;
2298     if( !pSeq )
2299     {
2300         osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() );
2301         if( !pSeq )
2302         {
2303             static uno::Sequence< sal_Int8 > aSeq( 16 );
2304             rtl_createUuid( (sal_uInt8*)aSeq.getArray(), 0, sal_True );
2305             pSeq = &aSeq;
2306         }
2307     }
2308     return *pSeq;
2309 }
2310 
2311 // static
2312 ScTabViewObj* ScTabViewObj::getImplementation( const uno::Reference<uno::XInterface> xObj )
2313 {
2314     ScTabViewObj* pRet = NULL;
2315     uno::Reference<lang::XUnoTunnel> xUT( xObj, uno::UNO_QUERY );
2316     if (xUT.is())
2317         pRet = reinterpret_cast<ScTabViewObj*>(sal::static_int_cast<sal_IntPtr>(xUT->getSomething(getUnoTunnelId())));
2318     return pRet;
2319 }
2320 
2321 ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XTransferable > SAL_CALL ScTabViewObj::getTransferable(  ) throw (::com::sun::star::uno::RuntimeException)
2322 {
2323     ScUnoGuard aGuard;
2324     ScEditShell* pShell = PTR_CAST( ScEditShell, GetViewShell()->GetViewFrame()->GetDispatcher()->GetShell(0) );
2325     if (pShell)
2326         return pShell->GetEditView()->GetTransferable();
2327 
2328     ScDrawTextObjectBar* pTextShell = PTR_CAST( ScDrawTextObjectBar, GetViewShell()->GetViewFrame()->GetDispatcher()->GetShell(0) );
2329     if (pTextShell)
2330     {
2331         ScViewData* pViewData = GetViewShell()->GetViewData();
2332         ScDrawView* pView = pViewData->GetScDrawView();
2333         OutlinerView* pOutView = pView->GetTextEditOutlinerView();
2334         if (pOutView)
2335             return pOutView->GetEditView().GetTransferable();
2336     }
2337 
2338     ScDrawShell* pDrawShell = PTR_CAST( ScDrawShell, GetViewShell()->GetViewFrame()->GetDispatcher()->GetShell(0) );
2339     if (pDrawShell)
2340         return pDrawShell->GetDrawView()->CopyToTransferable();
2341 
2342     ScTransferObj* pObj = GetViewShell()->CopyToTransferable();
2343     uno::Reference<datatransfer::XTransferable> xTransferable( pObj );
2344     return xTransferable;
2345 }
2346 
2347 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)
2348 {
2349     ScUnoGuard aGuard;
2350     ScEditShell* pShell = PTR_CAST( ScEditShell, GetViewShell()->GetViewFrame()->GetDispatcher()->GetShell(0) );
2351     if (pShell)
2352         pShell->GetEditView()->InsertText( xTrans, ::rtl::OUString(), sal_False );
2353     else
2354     {
2355         ScDrawTextObjectBar* pTextShell = PTR_CAST( ScDrawTextObjectBar, GetViewShell()->GetViewFrame()->GetDispatcher()->GetShell(0) );
2356         if (pTextShell)
2357         {
2358             ScViewData* pViewData = GetViewShell()->GetViewData();
2359             ScDrawView* pView = pViewData->GetScDrawView();
2360             OutlinerView* pOutView = pView->GetTextEditOutlinerView();
2361             if ( pOutView )
2362             {
2363                 pOutView->GetEditView().InsertText( xTrans, ::rtl::OUString(), sal_False );
2364                 return;
2365             }
2366         }
2367 
2368         GetViewShell()->PasteFromTransferable( xTrans );
2369     }
2370 }
2371 
2372 //------------------------------------------------------------------------
2373 
2374 
2375 
2376 
2377