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