xref: /AOO41X/main/sc/source/ui/unoobj/viewuno.cxx (revision d0db51eca8e6c012809d7d2ad3a91746f4e794b6)
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 
lcl_GetViewOptPropertyMap()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 
ScViewPaneBase(ScTabViewShell * pViewSh,sal_uInt16 nP)136 ScViewPaneBase::ScViewPaneBase(ScTabViewShell* pViewSh, sal_uInt16 nP) :
137     pViewShell( pViewSh ),
138     nPane( nP )
139 {
140     if (pViewShell)
141         StartListening(*pViewShell);
142 }
143 
~ScViewPaneBase()144 ScViewPaneBase::~ScViewPaneBase()
145 {
146     if (pViewShell)
147         EndListening(*pViewShell);
148 }
149 
Notify(SfxBroadcaster &,const SfxHint & rHint)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 
queryInterface(const uno::Type & rType)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 
getTypes()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 
getImplementationId()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 
getFirstVisibleColumn()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 
setFirstVisibleColumn(sal_Int32 nFirstVisibleColumn)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 
getFirstVisibleRow()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 
setFirstVisibleRow(sal_Int32 nFirstVisibleRow)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 
getVisibleRange()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 
getReferredCells()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 {
lcl_prepareFormShellCall(ScTabViewShell * _pViewShell,sal_uInt16 _nPane,FmFormShell * & _rpFormShell,Window * & _rpWindow,SdrView * & _rpSdrView)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
getFormController(const uno::Reference<form::XForm> & _Form)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 
isFormDesignMode()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 
setFormDesignMode(::sal_Bool _DesignMode)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 
getControl(const uno::Reference<awt::XControlModel> & xModel)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 
GetVisArea() const400 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 
ScViewPaneObj(ScTabViewShell * pViewSh,sal_uInt16 nP)436 ScViewPaneObj::ScViewPaneObj(ScTabViewShell* pViewSh, sal_uInt16 nP) :
437     ScViewPaneBase( pViewSh, nP )
438 {
439 }
440 
~ScViewPaneObj()441 ScViewPaneObj::~ScViewPaneObj()
442 {
443 }
444 
queryInterface(const uno::Type & rType)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 
acquire()456 void SAL_CALL ScViewPaneObj::acquire() throw()
457 {
458     OWeakObject::acquire();
459 }
460 
release()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 
ScTabViewObj(ScTabViewShell * pViewSh)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 
~ScTabViewObj()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 
queryInterface(const uno::Type & rType)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 
acquire()532 void SAL_CALL ScTabViewObj::acquire() throw()
533 {
534     SfxBaseController::acquire();
535 }
536 
release()537 void SAL_CALL ScTabViewObj::release() throw()
538 {
539     SfxBaseController::release();
540 }
541 
lcl_CallActivate(ScDocShell * pDocSh,SCTAB nTab,sal_Int32 nEvent)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 
SheetChanged(bool bSameTabButMoved)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 
getTypes()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 
getImplementationId()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 
lcl_TabInRanges(SCTAB nTab,const ScRangeList & rRanges)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 
lcl_ShowObject(ScTabViewShell & rViewSh,ScDrawView & rDrawView,SdrObject * pSelObj)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 
select(const uno::Any & aSelection)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 
getSelection()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 
createEnumeration()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 
getCount()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 
getByIndex(sal_Int32 nIndex)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 
getElementType()1105 uno::Type SAL_CALL ScTabViewObj::getElementType() throw(uno::RuntimeException)
1106 {
1107     ScUnoGuard aGuard;
1108     return getCppuType((uno::Reference<sheet::XViewPane>*)0);
1109 }
1110 
hasElements()1111 sal_Bool SAL_CALL ScTabViewObj::hasElements() throw(uno::RuntimeException)
1112 {
1113     ScUnoGuard aGuard;
1114     return ( getCount() != 0 );
1115 }
1116 
1117 // XSpreadsheetView
1118 
GetObjectByIndex_Impl(sal_uInt16 nIndex) const1119 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 
getActiveSheet()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 
setActiveSheet(const uno::Reference<sheet::XSpreadsheet> & xActiveSheet)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 
GetClickedObject(const Point & rPoint) const1204 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 
IsMouseListening() const1258 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 
MousePressed(const awt::MouseEvent & e)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         aMouseEvent.Modifiers = e.Modifiers;
1289 
1290         for ( sal_uInt16 n=0; n<aMouseClickHandlers.Count(); n++ )
1291         {
1292             try
1293             {
1294                 if (!(*aMouseClickHandlers[n])->mousePressed( aMouseEvent ))
1295                     bReturn = sal_True;
1296             }
1297             catch ( uno::Exception& )
1298             {
1299                 aMouseClickHandlers.DeleteAndDestroy(n);
1300                 --n; // because it will be increased again in the loop
1301             }
1302         }
1303     }
1304 
1305     // handle sheet events
1306     bool bDoubleClick = ( e.Buttons == awt::MouseButton::LEFT && e.ClickCount == 2 );
1307     bool bRightClick = ( e.Buttons == awt::MouseButton::RIGHT && e.ClickCount == 1 );
1308     if ( ( bDoubleClick || bRightClick ) && !bReturn && xTarget.is())
1309     {
1310         sal_Int32 nEvent = bDoubleClick ? SC_SHEETEVENT_DOUBLECLICK : SC_SHEETEVENT_RIGHTCLICK;
1311 
1312         ScTabViewShell* pViewSh = GetViewShell();
1313         ScViewData* pViewData = pViewSh->GetViewData();
1314         ScDocShell* pDocSh = pViewData->GetDocShell();
1315         ScDocument* pDoc = pDocSh->GetDocument();
1316         SCTAB nTab = pViewData->GetTabNo();
1317         const ScSheetEvents* pEvents = pDoc->GetSheetEvents(nTab);
1318         if (pEvents)
1319         {
1320             const rtl::OUString* pScript = pEvents->GetScript(nEvent);
1321             if (pScript)
1322             {
1323                 // the macro parameter is the clicked object, as in the mousePressed call above
1324                 uno::Sequence<uno::Any> aParams(1);
1325                 aParams[0] <<= xTarget;
1326 
1327                 uno::Any aRet;
1328                 uno::Sequence<sal_Int16> aOutArgsIndex;
1329                 uno::Sequence<uno::Any> aOutArgs;
1330 
1331                 /*ErrCode eRet =*/ pDocSh->CallXScript( *pScript, aParams, aRet, aOutArgsIndex, aOutArgs );
1332 
1333                 // look for a boolean return value of true
1334                 sal_Bool bRetValue = sal_False;
1335                 if (aRet >>= bRetValue)
1336                 {
1337                     if (bRetValue)
1338                         bReturn = sal_True;
1339                 }
1340             }
1341         }
1342 
1343         // execute VBA event handler
1344         if (!bReturn && xTarget.is()) try
1345         {
1346             uno::Reference< script::vba::XVBAEventProcessor > xVbaEvents( pDoc->GetVbaEventProcessor(), uno::UNO_SET_THROW );
1347             // the parameter is the clicked object, as in the mousePressed call above
1348             uno::Sequence< uno::Any > aArgs( 1 );
1349             aArgs[ 0 ] <<= xTarget;
1350             xVbaEvents->processVbaEvent( ScSheetEvents::GetVbaSheetEventId( nEvent ), aArgs );
1351         }
1352         catch( util::VetoException& )
1353         {
1354             bReturn = sal_True;
1355         }
1356         catch( uno::Exception& )
1357         {
1358         }
1359     }
1360 
1361     return bReturn;
1362 }
1363 
MouseReleased(const awt::MouseEvent & e)1364 sal_Bool ScTabViewObj::MouseReleased( const awt::MouseEvent& e )
1365                                     throw (uno::RuntimeException)
1366 {
1367     sal_Bool bReturn(sal_False);
1368 
1369     if (aMouseClickHandlers.Count())
1370     {
1371         uno::Reference< uno::XInterface > xTarget = GetClickedObject(Point(e.X, e.Y));
1372 
1373         if (xTarget.is())
1374         {
1375             awt::EnhancedMouseEvent aMouseEvent;
1376 
1377             aMouseEvent.Buttons = e.Buttons;
1378             aMouseEvent.X = e.X;
1379             aMouseEvent.Y = e.Y;
1380             aMouseEvent.ClickCount = e.ClickCount;
1381             aMouseEvent.PopupTrigger = e.PopupTrigger;
1382             aMouseEvent.Target = xTarget;
1383             aMouseEvent.Modifiers = e.Modifiers;
1384 
1385             for ( sal_uInt16 n=0; n<aMouseClickHandlers.Count(); n++ )
1386             {
1387                 try
1388                 {
1389                     if (!(*aMouseClickHandlers[n])->mouseReleased( aMouseEvent ))
1390                         bReturn = sal_True;
1391                 }
1392                 catch ( uno::Exception& )
1393                 {
1394                     aMouseClickHandlers.DeleteAndDestroy(n);
1395                     --n; // because it will be increased again in the loop
1396                 }
1397             }
1398         }
1399     }
1400     return bReturn;
1401 }
1402 
1403 // XEnhancedMouseClickBroadcaster
1404 
StartMouseListening()1405 void ScTabViewObj::StartMouseListening()
1406 {
1407 }
1408 
EndMouseListening()1409 void ScTabViewObj::EndMouseListening()
1410 {
1411     sal_uInt16 nCount(aMouseClickHandlers.Count());
1412     lang::EventObject aEvent;
1413     aEvent.Source = (cppu::OWeakObject*)this;
1414     for ( sal_uInt16 n=0; n<nCount; n++ )
1415     {
1416         try
1417         {
1418             (*aMouseClickHandlers[n])->disposing(aEvent);
1419         }
1420         catch ( uno::Exception& )
1421         {
1422         }
1423     }
1424     aMouseClickHandlers.DeleteAndDestroy(0, nCount);
1425 }
1426 
StartActivationListening()1427 void ScTabViewObj::StartActivationListening()
1428 {
1429 }
1430 
EndActivationListening()1431 void ScTabViewObj::EndActivationListening()
1432 {
1433     sal_uInt16 nCount = aActivationListeners.Count();
1434     lang::EventObject aEvent;
1435     aEvent.Source = (cppu::OWeakObject*)this;
1436     for ( sal_uInt16 n=0; n<nCount; n++ )
1437     {
1438         try
1439         {
1440             (*aActivationListeners[n])->disposing(aEvent);
1441         }
1442         catch ( uno::Exception& )
1443         {
1444         }
1445     }
1446     aActivationListeners.DeleteAndDestroy(0, nCount);
1447 }
1448 
addEnhancedMouseClickHandler(const uno::Reference<awt::XEnhancedMouseClickHandler> & aListener)1449 void SAL_CALL ScTabViewObj::addEnhancedMouseClickHandler( const uno::Reference< awt::XEnhancedMouseClickHandler >& aListener )
1450                                     throw (uno::RuntimeException)
1451 {
1452     ScUnoGuard aGuard;
1453 
1454     if (aListener.is())
1455     {
1456         sal_uInt16 nCount = aMouseClickHandlers.Count();
1457         uno::Reference<awt::XEnhancedMouseClickHandler> *pObj =
1458                 new uno::Reference<awt::XEnhancedMouseClickHandler>( aListener );
1459         aMouseClickHandlers.Insert( pObj, nCount );
1460 
1461         if (aMouseClickHandlers.Count() == 1 && nCount == 0) // only if a listener added
1462             StartMouseListening();
1463     }
1464 }
1465 
removeEnhancedMouseClickHandler(const uno::Reference<awt::XEnhancedMouseClickHandler> & aListener)1466 void SAL_CALL ScTabViewObj::removeEnhancedMouseClickHandler( const uno::Reference< awt::XEnhancedMouseClickHandler >& aListener )
1467                                     throw (uno::RuntimeException)
1468 {
1469     ScUnoGuard aGuard;
1470     sal_uInt16 nCount = aMouseClickHandlers.Count();
1471     for ( sal_uInt16 n=nCount; n--; )
1472     {
1473         uno::Reference<awt::XEnhancedMouseClickHandler> *pObj = aMouseClickHandlers[n];
1474         if ( *pObj == aListener )
1475             aMouseClickHandlers.DeleteAndDestroy( n );
1476     }
1477     if ((aMouseClickHandlers.Count() == 0) && (nCount > 0)) // only if last listener removed
1478         EndMouseListening();
1479 }
1480 
1481 // XActivationBroadcaster
1482 
addActivationEventListener(const uno::Reference<sheet::XActivationEventListener> & aListener)1483 void SAL_CALL ScTabViewObj::addActivationEventListener( const uno::Reference< sheet::XActivationEventListener >& aListener )
1484                                     throw (uno::RuntimeException)
1485 {
1486     ScUnoGuard aGuard;
1487 
1488     if (aListener.is())
1489     {
1490         sal_uInt16 nCount = aActivationListeners.Count();
1491         uno::Reference<sheet::XActivationEventListener> *pObj =
1492                 new uno::Reference<sheet::XActivationEventListener>( aListener );
1493         aActivationListeners.Insert( pObj, nCount );
1494 
1495         if (aActivationListeners.Count() == 1 && nCount == 0) // only if a listener added
1496             StartActivationListening();
1497     }
1498 }
1499 
removeActivationEventListener(const uno::Reference<sheet::XActivationEventListener> & aListener)1500 void SAL_CALL ScTabViewObj::removeActivationEventListener( const uno::Reference< sheet::XActivationEventListener >& aListener )
1501                                     throw (uno::RuntimeException)
1502 {
1503     ScUnoGuard aGuard;
1504     sal_uInt16 nCount = aActivationListeners.Count();
1505     for ( sal_uInt16 n=nCount; n--; )
1506     {
1507         uno::Reference<sheet::XActivationEventListener> *pObj = aActivationListeners[n];
1508         if ( *pObj == aListener )
1509             aActivationListeners.DeleteAndDestroy( n );
1510     }
1511     if ((aActivationListeners.Count() == 0) && (nCount > 0)) // only if last listener removed
1512         EndActivationListening();
1513 }
1514 
1515 //  PageBreakMode / Zoom sind Properties
1516 
1517 #if 0
1518 
1519 sal_Bool ScTabViewObj::getPagebreakMode(void) const
1520 {
1521     ScUnoGuard aGuard;
1522     ScTabViewShell* pViewSh = GetViewShell();
1523     if (pViewSh)
1524         return pViewSh->GetViewData()->IsPagebreakMode();
1525     return sal_False;
1526 }
1527 
1528 void ScTabViewObj::setPagebreakMode(sal_Bool PagebreakMode)
1529 {
1530     ScUnoGuard aGuard;
1531     ScTabViewShell* pViewSh = GetViewShell();
1532     if (pViewSh)
1533         pViewSh->SetPagebreakMode(PagebreakMode);
1534 }
1535 
1536 #endif
1537 
GetZoom(void) const1538 sal_Int16 ScTabViewObj::GetZoom(void) const
1539 {
1540     ScTabViewShell* pViewSh = GetViewShell();
1541     if (pViewSh)
1542     {
1543         const Fraction& rZoomY = pViewSh->GetViewData()->GetZoomY();    // Y wird angezeigt
1544         return (sal_Int16)(( rZoomY.GetNumerator() * 100 ) / rZoomY.GetDenominator());
1545     }
1546     return 0;
1547 }
1548 
SetZoom(sal_Int16 nZoom)1549 void ScTabViewObj::SetZoom(sal_Int16 nZoom)
1550 {
1551     ScTabViewShell* pViewSh = GetViewShell();
1552     if (pViewSh)
1553     {
1554         if ( nZoom != GetZoom() && nZoom != 0 )
1555         {
1556             if (!pViewSh->GetViewData()->IsPagebreakMode())
1557             {
1558                 ScModule* pScMod = SC_MOD();
1559                 ScAppOptions aNewOpt(pScMod->GetAppOptions());
1560                 aNewOpt.SetZoom( nZoom );
1561                 aNewOpt.SetZoomType( pViewSh->GetViewData()->GetView()->GetZoomType() );
1562                 pScMod->SetAppOptions( aNewOpt );
1563             }
1564         }
1565         Fraction aFract( nZoom, 100 );
1566         pViewSh->SetZoom( aFract, aFract, sal_True );
1567         pViewSh->PaintGrid();
1568         pViewSh->PaintTop();
1569         pViewSh->PaintLeft();
1570         pViewSh->GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOM );
1571         pViewSh->GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOMSLIDER );
1572     }
1573 }
1574 
GetZoomType(void) const1575 sal_Int16 ScTabViewObj::GetZoomType(void) const
1576 {
1577     sal_Int16 aZoomType = view::DocumentZoomType::OPTIMAL;
1578     ScTabViewShell* pViewSh = GetViewShell();
1579     if (pViewSh)
1580     {
1581         SvxZoomType eZoomType = pViewSh->GetViewData()->GetView()->GetZoomType();
1582         switch (eZoomType)
1583         {
1584         case SVX_ZOOM_PERCENT:
1585             aZoomType = view::DocumentZoomType::BY_VALUE;
1586             break;
1587         case SVX_ZOOM_OPTIMAL:
1588             aZoomType = view::DocumentZoomType::OPTIMAL;
1589             break;
1590         case SVX_ZOOM_WHOLEPAGE:
1591             aZoomType = view::DocumentZoomType::ENTIRE_PAGE;
1592             break;
1593         case SVX_ZOOM_PAGEWIDTH:
1594             aZoomType = view::DocumentZoomType::PAGE_WIDTH;
1595             break;
1596         case SVX_ZOOM_PAGEWIDTH_NOBORDER:
1597             aZoomType = view::DocumentZoomType::PAGE_WIDTH_EXACT;
1598             break;
1599         }
1600     }
1601     return aZoomType;
1602 }
1603 
SetZoomType(sal_Int16 aZoomType)1604 void ScTabViewObj::SetZoomType(sal_Int16 aZoomType)
1605 {
1606     ScTabViewShell* pViewSh = GetViewShell();
1607     if (pViewSh)
1608     {
1609         ScDBFunc* pView = pViewSh->GetViewData()->GetView();
1610         if (pView)
1611         {
1612             SvxZoomType eZoomType;
1613             switch (aZoomType)
1614             {
1615             case view::DocumentZoomType::BY_VALUE:
1616                 eZoomType = SVX_ZOOM_PERCENT;
1617                 break;
1618             case view::DocumentZoomType::OPTIMAL:
1619                 eZoomType = SVX_ZOOM_OPTIMAL;
1620                 break;
1621             case view::DocumentZoomType::ENTIRE_PAGE:
1622                 eZoomType = SVX_ZOOM_WHOLEPAGE;
1623                 break;
1624             case view::DocumentZoomType::PAGE_WIDTH:
1625                 eZoomType = SVX_ZOOM_PAGEWIDTH;
1626                 break;
1627             case view::DocumentZoomType::PAGE_WIDTH_EXACT:
1628                 eZoomType = SVX_ZOOM_PAGEWIDTH_NOBORDER;
1629                 break;
1630             default:
1631                 eZoomType = SVX_ZOOM_OPTIMAL;
1632             }
1633             sal_Int16 nZoom(GetZoom());
1634             sal_Int16 nOldZoom(nZoom);
1635             if ( eZoomType == SVX_ZOOM_PERCENT )
1636             {
1637                 if ( nZoom < MINZOOM )  nZoom = MINZOOM;
1638                 if ( nZoom > MAXZOOM )  nZoom = MAXZOOM;
1639             }
1640             else
1641                 nZoom = pView->CalcZoom( eZoomType, nOldZoom );
1642 
1643             switch ( eZoomType )
1644             {
1645                 case SVX_ZOOM_WHOLEPAGE:
1646                 case SVX_ZOOM_PAGEWIDTH:
1647                     pView->SetZoomType( eZoomType, sal_True );
1648                     break;
1649 
1650                 default:
1651                     pView->SetZoomType( SVX_ZOOM_PERCENT, sal_True );
1652             }
1653             SetZoom( nZoom );
1654         }
1655     }
1656 }
1657 
getIsWindowSplit()1658 sal_Bool SAL_CALL ScTabViewObj::getIsWindowSplit() throw(uno::RuntimeException)
1659 {
1660     ScUnoGuard aGuard;
1661     //  wie Menue-Slot SID_WINDOW_SPLIT
1662 
1663     ScTabViewShell* pViewSh = GetViewShell();
1664     if (pViewSh)
1665     {
1666         ScViewData* pViewData = pViewSh->GetViewData();
1667         return ( pViewData->GetHSplitMode() == SC_SPLIT_NORMAL ||
1668                  pViewData->GetVSplitMode() == SC_SPLIT_NORMAL );
1669     }
1670 
1671     return sal_False;
1672 }
1673 
hasFrozenPanes()1674 sal_Bool SAL_CALL ScTabViewObj::hasFrozenPanes() throw(uno::RuntimeException)
1675 {
1676     ScUnoGuard aGuard;
1677     //  wie Menue-Slot SID_WINDOW_FIX
1678 
1679     ScTabViewShell* pViewSh = GetViewShell();
1680     if (pViewSh)
1681     {
1682         ScViewData* pViewData = pViewSh->GetViewData();
1683         return ( pViewData->GetHSplitMode() == SC_SPLIT_FIX ||
1684                  pViewData->GetVSplitMode() == SC_SPLIT_FIX );
1685     }
1686 
1687     return sal_False;
1688 }
1689 
getSplitHorizontal()1690 sal_Int32 SAL_CALL ScTabViewObj::getSplitHorizontal() throw(uno::RuntimeException)
1691 {
1692     ScUnoGuard aGuard;
1693     ScTabViewShell* pViewSh = GetViewShell();
1694     if (pViewSh)
1695     {
1696         ScViewData* pViewData = pViewSh->GetViewData();
1697         if ( pViewData->GetHSplitMode() != SC_SPLIT_NONE )
1698             return pViewData->GetHSplitPos();
1699     }
1700     return 0;
1701 }
1702 
getSplitVertical()1703 sal_Int32 SAL_CALL ScTabViewObj::getSplitVertical() throw(uno::RuntimeException)
1704 {
1705     ScUnoGuard aGuard;
1706     ScTabViewShell* pViewSh = GetViewShell();
1707     if (pViewSh)
1708     {
1709         ScViewData* pViewData = pViewSh->GetViewData();
1710         if ( pViewData->GetVSplitMode() != SC_SPLIT_NONE )
1711             return pViewData->GetVSplitPos();
1712     }
1713     return 0;
1714 }
1715 
getSplitColumn()1716 sal_Int32 SAL_CALL ScTabViewObj::getSplitColumn() throw(uno::RuntimeException)
1717 {
1718     ScUnoGuard aGuard;
1719     ScTabViewShell* pViewSh = GetViewShell();
1720     if (pViewSh)
1721     {
1722         ScViewData* pViewData = pViewSh->GetViewData();
1723         if ( pViewData->GetHSplitMode() != SC_SPLIT_NONE )
1724         {
1725             long nSplit = pViewData->GetHSplitPos();
1726 
1727             ScSplitPos ePos = SC_SPLIT_BOTTOMLEFT;
1728             if ( pViewData->GetVSplitMode() != SC_SPLIT_NONE )
1729                 ePos = SC_SPLIT_TOPLEFT;
1730 
1731             SCsCOL nCol;
1732             SCsROW nRow;
1733             pViewData->GetPosFromPixel( nSplit, 0, ePos, nCol, nRow, sal_False );
1734             if ( nCol > 0 )
1735                 return nCol;
1736         }
1737     }
1738     return 0;
1739 }
1740 
getSplitRow()1741 sal_Int32 SAL_CALL ScTabViewObj::getSplitRow() throw(uno::RuntimeException)
1742 {
1743     ScUnoGuard aGuard;
1744     ScTabViewShell* pViewSh = GetViewShell();
1745     if (pViewSh)
1746     {
1747         ScViewData* pViewData = pViewSh->GetViewData();
1748         if ( pViewData->GetVSplitMode() != SC_SPLIT_NONE )
1749         {
1750             long nSplit = pViewData->GetVSplitPos();
1751 
1752             ScSplitPos ePos = SC_SPLIT_TOPLEFT;     // es ist vertikal geteilt
1753             SCsCOL nCol;
1754             SCsROW nRow;
1755             pViewData->GetPosFromPixel( 0, nSplit, ePos, nCol, nRow, sal_False );
1756             if ( nRow > 0 )
1757                 return nRow;
1758         }
1759     }
1760     return 0;
1761 }
1762 
splitAtPosition(sal_Int32 nPixelX,sal_Int32 nPixelY)1763 void SAL_CALL ScTabViewObj::splitAtPosition( sal_Int32 nPixelX, sal_Int32 nPixelY )
1764                                                 throw(uno::RuntimeException)
1765 {
1766     ScUnoGuard aGuard;
1767     ScTabViewShell* pViewSh = GetViewShell();
1768     if (pViewSh)
1769     {
1770         pViewSh->SplitAtPixel( Point( nPixelX, nPixelY ), sal_True, sal_True );
1771         pViewSh->FreezeSplitters( sal_False );
1772         pViewSh->InvalidateSplit();
1773     }
1774 }
1775 
freezeAtPosition(sal_Int32 nColumns,sal_Int32 nRows)1776 void SAL_CALL ScTabViewObj::freezeAtPosition( sal_Int32 nColumns, sal_Int32 nRows )
1777                                                 throw(uno::RuntimeException)
1778 {
1779     ScUnoGuard aGuard;
1780     ScTabViewShell* pViewSh = GetViewShell();
1781     if (pViewSh)
1782     {
1783         //  erst alles aufheben -> kein Stress mit Scrolling zwischendurch o.ae.
1784 
1785         pViewSh->RemoveSplit();
1786 
1787         Point aWinStart;
1788         Window* pWin = pViewSh->GetWindowByPos( SC_SPLIT_BOTTOMLEFT );
1789         if (pWin)
1790             aWinStart = pWin->GetPosPixel();
1791 
1792         ScViewData* pViewData = pViewSh->GetViewData();
1793         Point aSplit(pViewData->GetScrPos( (SCCOL)nColumns, (SCROW)nRows, SC_SPLIT_BOTTOMLEFT, sal_True ));
1794         aSplit += aWinStart;
1795 
1796         pViewSh->SplitAtPixel( aSplit, sal_True, sal_True );
1797         pViewSh->FreezeSplitters( sal_True );
1798         pViewSh->InvalidateSplit();
1799     }
1800 }
1801 
addSelectionChangeListener(const uno::Reference<view::XSelectionChangeListener> & xListener)1802 void SAL_CALL ScTabViewObj::addSelectionChangeListener(
1803                 const uno::Reference<view::XSelectionChangeListener>& xListener )
1804                                                     throw(uno::RuntimeException)
1805 {
1806     ScUnoGuard aGuard;
1807     uno::Reference<view::XSelectionChangeListener>* pObj =
1808             new uno::Reference<view::XSelectionChangeListener>( xListener );
1809     aSelectionListeners.Insert( pObj, aSelectionListeners.Count() );
1810 }
1811 
removeSelectionChangeListener(const uno::Reference<view::XSelectionChangeListener> & xListener)1812 void SAL_CALL ScTabViewObj::removeSelectionChangeListener(
1813                 const uno::Reference< view::XSelectionChangeListener >& xListener )
1814                                                     throw(uno::RuntimeException)
1815 {
1816     ScUnoGuard aGuard;
1817     sal_uInt16 nCount = aSelectionListeners.Count();
1818     for ( sal_uInt16 n=nCount; n--; )
1819     {
1820         uno::Reference<view::XSelectionChangeListener> *pObj = aSelectionListeners[n];
1821         if ( *pObj == xListener )       //! wozu der Mumpitz mit queryInterface?
1822         {
1823             aSelectionListeners.DeleteAndDestroy( n );
1824             break;
1825         }
1826     }
1827 }
1828 
SelectionChanged()1829 void ScTabViewObj::SelectionChanged()
1830 {
1831     lang::EventObject aEvent;
1832     aEvent.Source.set(static_cast<cppu::OWeakObject*>(this));
1833     for ( sal_uInt16 n=0; n<aSelectionListeners.Count(); n++ )
1834         (*aSelectionListeners[n])->selectionChanged( aEvent );
1835 
1836     // handle sheet events
1837     ScTabViewShell* pViewSh = GetViewShell();
1838     ScViewData* pViewData = pViewSh->GetViewData();
1839     ScDocShell* pDocSh = pViewData->GetDocShell();
1840     ScDocument* pDoc = pDocSh->GetDocument();
1841     SCTAB nTab = pViewData->GetTabNo();
1842     const ScSheetEvents* pEvents = pDoc->GetSheetEvents(nTab);
1843     if (pEvents)
1844     {
1845         const rtl::OUString* pScript = pEvents->GetScript(SC_SHEETEVENT_SELECT);
1846         if (pScript)
1847         {
1848             // the macro parameter is the selection as returned by getSelection
1849             uno::Sequence<uno::Any> aParams(1);
1850             aParams[0] = getSelection();
1851             uno::Any aRet;
1852             uno::Sequence<sal_Int16> aOutArgsIndex;
1853             uno::Sequence<uno::Any> aOutArgs;
1854             /*ErrCode eRet =*/ pDocSh->CallXScript( *pScript, aParams, aRet, aOutArgsIndex, aOutArgs );
1855         }
1856     }
1857 
1858     // execute VBA event handler
1859     try
1860     {
1861         uno::Reference< script::vba::XVBAEventProcessor > xVbaEvents( pDoc->GetVbaEventProcessor(), uno::UNO_SET_THROW );
1862         // the parameter is the clicked object, as in the mousePressed call above
1863         uno::Sequence< uno::Any > aArgs( 1 );
1864         aArgs[ 0 ] <<= getSelection();
1865         xVbaEvents->processVbaEvent( ScSheetEvents::GetVbaSheetEventId( SC_SHEETEVENT_SELECT ), aArgs );
1866     }
1867     catch( uno::Exception& )
1868     {
1869     }
1870 }
1871 
1872 
1873 //  XPropertySet (View-Optionen)
1874 //! auch an der Applikation anbieten?
1875 
getPropertySetInfo()1876 uno::Reference<beans::XPropertySetInfo> SAL_CALL ScTabViewObj::getPropertySetInfo()
1877                                                         throw(uno::RuntimeException)
1878 {
1879     ScUnoGuard aGuard;
1880     static uno::Reference<beans::XPropertySetInfo> aRef(
1881         new SfxItemPropertySetInfo( aPropSet.getPropertyMap() ));
1882     return aRef;
1883 }
1884 
setPropertyValue(const rtl::OUString & aPropertyName,const uno::Any & aValue)1885 void SAL_CALL ScTabViewObj::setPropertyValue(
1886                         const rtl::OUString& aPropertyName, const uno::Any& aValue )
1887                 throw(beans::UnknownPropertyException, beans::PropertyVetoException,
1888                         lang::IllegalArgumentException, lang::WrappedTargetException,
1889                         uno::RuntimeException)
1890 {
1891     ScUnoGuard aGuard;
1892     String aString(aPropertyName);
1893 
1894     ScTabViewShell* pViewSh = GetViewShell();
1895     if (pViewSh)
1896     {
1897         ScViewData* pViewData = pViewSh->GetViewData();
1898         const ScViewOptions& rOldOpt = pViewSh->GetViewData()->GetOptions();
1899         ScViewOptions aNewOpt(rOldOpt);
1900 
1901         if ( aString.EqualsAscii( SC_UNO_COLROWHDR ) || aString.EqualsAscii( OLD_UNO_COLROWHDR ) )
1902             aNewOpt.SetOption( VOPT_HEADER, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
1903         else if ( aString.EqualsAscii( SC_UNO_HORSCROLL ) || aString.EqualsAscii( OLD_UNO_HORSCROLL ) )
1904             aNewOpt.SetOption( VOPT_HSCROLL, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
1905         else if ( aString.EqualsAscii( SC_UNO_OUTLSYMB ) || aString.EqualsAscii( OLD_UNO_OUTLSYMB ) )
1906             aNewOpt.SetOption( VOPT_OUTLINER, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
1907         else if ( aString.EqualsAscii( SC_UNO_SHEETTABS ) || aString.EqualsAscii( OLD_UNO_SHEETTABS ) )
1908             aNewOpt.SetOption( VOPT_TABCONTROLS, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
1909         else if ( aString.EqualsAscii( SC_UNO_SHOWANCHOR ) )
1910             aNewOpt.SetOption( VOPT_ANCHOR, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
1911         else if ( aString.EqualsAscii( SC_UNO_SHOWFORM ) )
1912             aNewOpt.SetOption( VOPT_FORMULAS, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
1913         else if ( aString.EqualsAscii( SC_UNO_SHOWGRID ) )
1914             aNewOpt.SetOption( VOPT_GRID, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
1915         else if ( aString.EqualsAscii( SC_UNO_SHOWHELP ) )
1916             aNewOpt.SetOption( VOPT_HELPLINES, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
1917         else if ( aString.EqualsAscii( SC_UNO_SHOWNOTES ) )
1918             aNewOpt.SetOption( VOPT_NOTES, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
1919         else if ( aString.EqualsAscii( SC_UNO_SHOWPAGEBR ) )
1920             aNewOpt.SetOption( VOPT_PAGEBREAKS, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
1921         else if ( aString.EqualsAscii( SC_UNO_SHOWZERO ) )
1922             aNewOpt.SetOption( VOPT_NULLVALS, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
1923         else if ( aString.EqualsAscii( SC_UNO_SHOWSOLID ) )
1924             aNewOpt.SetOption( VOPT_SOLIDHANDLES, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
1925         else if ( aString.EqualsAscii( SC_UNO_VALUEHIGH ) || aString.EqualsAscii( OLD_UNO_VALUEHIGH ) )
1926             aNewOpt.SetOption( VOPT_SYNTAX, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
1927         else if ( aString.EqualsAscii( SC_UNO_VERTSCROLL ) || aString.EqualsAscii( OLD_UNO_VERTSCROLL ) )
1928             aNewOpt.SetOption( VOPT_VSCROLL, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
1929         else if ( aString.EqualsAscii( SC_UNO_SHOWOBJ ) )
1930         {
1931             sal_Int16 nIntVal = 0;
1932             if ( aValue >>= nIntVal )
1933             {
1934                 //#i80528# adapt to new range eventually
1935                 if((sal_Int16)VOBJ_MODE_HIDE < nIntVal) nIntVal = (sal_Int16)VOBJ_MODE_SHOW;
1936 
1937                 aNewOpt.SetObjMode( VOBJ_TYPE_OLE, (ScVObjMode)nIntVal);
1938             }
1939         }
1940         else if ( aString.EqualsAscii( SC_UNO_SHOWCHARTS ) )
1941         {
1942             sal_Int16 nIntVal = 0;
1943             if ( aValue >>= nIntVal )
1944             {
1945                 //#i80528# adapt to new range eventually
1946                 if((sal_Int16)VOBJ_MODE_HIDE < nIntVal) nIntVal = (sal_Int16)VOBJ_MODE_SHOW;
1947 
1948                 aNewOpt.SetObjMode( VOBJ_TYPE_CHART, (ScVObjMode)nIntVal);
1949             }
1950         }
1951         else if ( aString.EqualsAscii( SC_UNO_SHOWDRAW ) )
1952         {
1953             sal_Int16 nIntVal = 0;
1954             if ( aValue >>= nIntVal )
1955             {
1956                 //#i80528# adapt to new range eventually
1957                 if((sal_Int16)VOBJ_MODE_HIDE < nIntVal) nIntVal = (sal_Int16)VOBJ_MODE_SHOW;
1958 
1959                 aNewOpt.SetObjMode( VOBJ_TYPE_DRAW, (ScVObjMode)nIntVal);
1960             }
1961         }
1962         else if ( aString.EqualsAscii( SC_UNO_GRIDCOLOR ) )
1963         {
1964             sal_Int32 nIntVal = 0;
1965             if ( aValue >>= nIntVal )
1966                 aNewOpt.SetGridColor( nIntVal, String() );
1967         }
1968         else if ( aString.EqualsAscii( SC_UNO_ZOOMTYPE ) )
1969         {
1970             sal_Int16 nIntVal = 0;
1971             if ( aValue >>= nIntVal )
1972                 SetZoomType(nIntVal);
1973         }
1974         else if ( aString.EqualsAscii( SC_UNO_ZOOMVALUE ) )
1975         {
1976             sal_Int16 nIntVal = 0;
1977             if ( aValue >>= nIntVal )
1978                 SetZoom(nIntVal);
1979         }
1980 
1981         //  Optionen werden an der View und am Dokument (fuer neue Views) gesetzt,
1982         //  damit sie beim Speichern erhalten bleiben.
1983         //! An der App (Module) braeuchte man noch eine Extra-Moeglichkeit,
1984         //! das einzustellen (fuer neue Dokumente)
1985 
1986         if ( aNewOpt != rOldOpt )
1987         {
1988             pViewData->SetOptions( aNewOpt );
1989             pViewData->GetDocument()->SetViewOptions( aNewOpt );
1990             pViewData->GetDocShell()->SetDocumentModified();    //! wirklich?
1991 
1992             pViewSh->UpdateFixPos();
1993             pViewSh->PaintGrid();
1994             pViewSh->PaintTop();
1995             pViewSh->PaintLeft();
1996             pViewSh->PaintExtras();
1997             pViewSh->InvalidateBorder();
1998 
1999             SfxBindings& rBindings = pViewSh->GetViewFrame()->GetBindings();
2000             rBindings.Invalidate( FID_TOGGLEHEADERS ); // -> Checks im Menue
2001             rBindings.Invalidate( FID_TOGGLESYNTAX );
2002         }
2003     }
2004 }
2005 
getPropertyValue(const rtl::OUString & aPropertyName)2006 uno::Any SAL_CALL ScTabViewObj::getPropertyValue( const rtl::OUString& aPropertyName )
2007                 throw(beans::UnknownPropertyException, lang::WrappedTargetException,
2008                         uno::RuntimeException)
2009 {
2010     ScUnoGuard aGuard;
2011     String aString(aPropertyName);
2012     uno::Any aRet;
2013 
2014     ScTabViewShell* pViewSh = GetViewShell();
2015     if (pViewSh)
2016     {
2017         const ScViewOptions& rOpt = pViewSh->GetViewData()->GetOptions();
2018 
2019         if ( aString.EqualsAscii( SC_UNO_COLROWHDR ) || aString.EqualsAscii( OLD_UNO_COLROWHDR ) )
2020             ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_HEADER ) );
2021         else if ( aString.EqualsAscii( SC_UNO_HORSCROLL ) || aString.EqualsAscii( OLD_UNO_HORSCROLL ) )
2022             ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_HSCROLL ) );
2023         else if ( aString.EqualsAscii( SC_UNO_OUTLSYMB ) || aString.EqualsAscii( OLD_UNO_OUTLSYMB ) )
2024             ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_OUTLINER ) );
2025         else if ( aString.EqualsAscii( SC_UNO_SHEETTABS ) || aString.EqualsAscii( OLD_UNO_SHEETTABS ) )
2026             ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_TABCONTROLS ) );
2027         else if ( aString.EqualsAscii( SC_UNO_SHOWANCHOR ) ) ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_ANCHOR ) );
2028         else if ( aString.EqualsAscii( SC_UNO_SHOWFORM ) )   ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_FORMULAS ) );
2029         else if ( aString.EqualsAscii( SC_UNO_SHOWGRID ) )   ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_GRID ) );
2030         else if ( aString.EqualsAscii( SC_UNO_SHOWHELP ) )   ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_HELPLINES ) );
2031         else if ( aString.EqualsAscii( SC_UNO_SHOWNOTES ) )  ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_NOTES ) );
2032         else if ( aString.EqualsAscii( SC_UNO_SHOWPAGEBR ) ) ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_PAGEBREAKS ) );
2033         else if ( aString.EqualsAscii( SC_UNO_SHOWZERO ) )   ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_NULLVALS ) );
2034         else if ( aString.EqualsAscii( SC_UNO_SHOWSOLID ) )  ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_SOLIDHANDLES ) );
2035         else if ( aString.EqualsAscii( SC_UNO_VALUEHIGH ) || aString.EqualsAscii( OLD_UNO_VALUEHIGH ) )
2036             ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_SYNTAX ) );
2037         else if ( aString.EqualsAscii( SC_UNO_VERTSCROLL ) || aString.EqualsAscii( OLD_UNO_VERTSCROLL ) )
2038             ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_VSCROLL ) );
2039         else if ( aString.EqualsAscii( SC_UNO_SHOWOBJ ) )    aRet <<= (sal_Int16)( rOpt.GetObjMode( VOBJ_TYPE_OLE ) );
2040         else if ( aString.EqualsAscii( SC_UNO_SHOWCHARTS ) ) aRet <<= (sal_Int16)( rOpt.GetObjMode( VOBJ_TYPE_CHART ) );
2041         else if ( aString.EqualsAscii( SC_UNO_SHOWDRAW ) )   aRet <<= (sal_Int16)( rOpt.GetObjMode( VOBJ_TYPE_DRAW ) );
2042         else if ( aString.EqualsAscii( SC_UNO_GRIDCOLOR ) )  aRet <<= (sal_Int32)( rOpt.GetGridColor().GetColor() );
2043         else if ( aString.EqualsAscii( SC_UNO_VISAREA ) ) aRet <<= GetVisArea();
2044         else if ( aString.EqualsAscii( SC_UNO_ZOOMTYPE ) ) aRet <<= GetZoomType();
2045         else if ( aString.EqualsAscii( SC_UNO_ZOOMVALUE ) ) aRet <<= GetZoom();
2046         else if ( aString.EqualsAscii( SC_UNO_VISAREASCREEN ) )
2047         {
2048             ScViewData* pViewData = pViewSh->GetViewData();
2049             Window* pActiveWin = ( pViewData ? pViewData->GetActiveWin() : NULL );
2050             if ( pActiveWin )
2051             {
2052                 Rectangle aRect = pActiveWin->GetWindowExtentsRelative( NULL );
2053                 aRet <<= AWTRectangle( aRect );
2054             }
2055         }
2056     }
2057 
2058     return aRet;
2059 }
2060 
addPropertyChangeListener(const::rtl::OUString &,const uno::Reference<beans::XPropertyChangeListener> & xListener)2061 void SAL_CALL ScTabViewObj::addPropertyChangeListener( const ::rtl::OUString& /* aPropertyName */,
2062                                     const uno::Reference<beans::XPropertyChangeListener >& xListener )
2063                                 throw(beans::UnknownPropertyException,
2064                                     lang::WrappedTargetException,
2065                                     uno::RuntimeException)
2066 {
2067     ScUnoGuard aGuard;
2068     uno::Reference<beans::XPropertyChangeListener>* pObj =
2069             new uno::Reference<beans::XPropertyChangeListener>( xListener );
2070     aPropertyChgListeners.Insert( pObj, aPropertyChgListeners.Count() );
2071 }
2072 
removePropertyChangeListener(const::rtl::OUString &,const uno::Reference<beans::XPropertyChangeListener> & xListener)2073 void SAL_CALL ScTabViewObj::removePropertyChangeListener( const ::rtl::OUString& /* aPropertyName */,
2074                                     const uno::Reference<beans::XPropertyChangeListener >& xListener )
2075                                 throw(beans::UnknownPropertyException,
2076                                     lang::WrappedTargetException,
2077                                     uno::RuntimeException)
2078 {
2079     ScUnoGuard aGuard;
2080     sal_uInt16 nCount = aPropertyChgListeners.Count();
2081     for ( sal_uInt16 n=nCount; n--; )
2082     {
2083         uno::Reference<beans::XPropertyChangeListener> *pObj = aPropertyChgListeners[n];
2084         if ( *pObj == xListener )       //! wozu der Mumpitz mit queryInterface?
2085         {
2086             aPropertyChgListeners.DeleteAndDestroy( n );
2087             break;
2088         }
2089     }
2090 }
2091 
addVetoableChangeListener(const::rtl::OUString &,const uno::Reference<beans::XVetoableChangeListener> &)2092 void SAL_CALL ScTabViewObj::addVetoableChangeListener( const ::rtl::OUString& /* PropertyName */,
2093                                     const uno::Reference<beans::XVetoableChangeListener >& /* aListener */ )
2094                                 throw(beans::UnknownPropertyException,
2095                                     lang::WrappedTargetException,
2096                                     uno::RuntimeException)
2097 {
2098 }
2099 
removeVetoableChangeListener(const::rtl::OUString &,const uno::Reference<beans::XVetoableChangeListener> &)2100 void SAL_CALL ScTabViewObj::removeVetoableChangeListener( const ::rtl::OUString& /* PropertyName */,
2101                                     const uno::Reference<beans::XVetoableChangeListener >& /* aListener */ )
2102                                 throw(beans::UnknownPropertyException,
2103                                     lang::WrappedTargetException,
2104                                     uno::RuntimeException)
2105 {
2106 }
2107 
VisAreaChanged()2108 void ScTabViewObj::VisAreaChanged()
2109 {
2110     beans::PropertyChangeEvent aEvent;
2111     aEvent.Source.set(static_cast<cppu::OWeakObject*>(this));
2112     for ( sal_uInt16 n=0; n<aPropertyChgListeners.Count(); n++ )
2113         (*aPropertyChgListeners[n])->propertyChange( aEvent );
2114 }
2115 
2116 // XRangeSelection
2117 
startRangeSelection(const uno::Sequence<beans::PropertyValue> & aArguments)2118 void SAL_CALL ScTabViewObj::startRangeSelection(
2119                                 const uno::Sequence<beans::PropertyValue>& aArguments )
2120                                     throw(uno::RuntimeException)
2121 {
2122     ScUnoGuard aGuard;
2123     ScTabViewShell* pViewSh = GetViewShell();
2124     if (pViewSh)
2125     {
2126         String aInitVal, aTitle;
2127         sal_Bool bCloseOnButtonUp = sal_False;
2128         sal_Bool bSingleCell = sal_False;
2129         sal_Bool bMultiSelection = sal_False;
2130 
2131         rtl::OUString aStrVal;
2132         const beans::PropertyValue* pPropArray = aArguments.getConstArray();
2133         long nPropCount = aArguments.getLength();
2134         for (long i = 0; i < nPropCount; i++)
2135         {
2136             const beans::PropertyValue& rProp = pPropArray[i];
2137             String aPropName(rProp.Name);
2138 
2139             if (aPropName.EqualsAscii( SC_UNONAME_CLOSEONUP ))
2140                 bCloseOnButtonUp = ScUnoHelpFunctions::GetBoolFromAny( rProp.Value );
2141             else if (aPropName.EqualsAscii( SC_UNONAME_TITLE ))
2142             {
2143                 if ( rProp.Value >>= aStrVal )
2144                     aTitle = String( aStrVal );
2145             }
2146             else if (aPropName.EqualsAscii( SC_UNONAME_INITVAL ))
2147             {
2148                 if ( rProp.Value >>= aStrVal )
2149                     aInitVal = String( aStrVal );
2150             }
2151             else if (aPropName.EqualsAscii( SC_UNONAME_SINGLECELL ))
2152                 bSingleCell = ScUnoHelpFunctions::GetBoolFromAny( rProp.Value );
2153             else if (aPropName.EqualsAscii( SC_UNONAME_MULTISEL ))
2154                 bMultiSelection = ScUnoHelpFunctions::GetBoolFromAny( rProp.Value );
2155         }
2156 
2157         pViewSh->StartSimpleRefDialog( aTitle, aInitVal, bCloseOnButtonUp, bSingleCell, bMultiSelection );
2158     }
2159 }
2160 
abortRangeSelection()2161 void SAL_CALL ScTabViewObj::abortRangeSelection() throw(uno::RuntimeException)
2162 {
2163     ScUnoGuard aGuard;
2164     ScTabViewShell* pViewSh = GetViewShell();
2165     if (pViewSh)
2166         pViewSh->StopSimpleRefDialog();
2167 }
2168 
addRangeSelectionListener(const uno::Reference<sheet::XRangeSelectionListener> & xListener)2169 void SAL_CALL ScTabViewObj::addRangeSelectionListener(
2170                                 const uno::Reference<sheet::XRangeSelectionListener>& xListener )
2171                                     throw(uno::RuntimeException)
2172 {
2173     ScUnoGuard aGuard;
2174     uno::Reference<sheet::XRangeSelectionListener>* pObj =
2175             new uno::Reference<sheet::XRangeSelectionListener>( xListener );
2176     aRangeSelListeners.Insert( pObj, aRangeSelListeners.Count() );
2177 }
2178 
removeRangeSelectionListener(const uno::Reference<sheet::XRangeSelectionListener> & xListener)2179 void SAL_CALL ScTabViewObj::removeRangeSelectionListener(
2180                                 const uno::Reference<sheet::XRangeSelectionListener>& xListener )
2181                                     throw(uno::RuntimeException)
2182 {
2183     ScUnoGuard aGuard;
2184     sal_uInt16 nCount = aRangeSelListeners.Count();
2185     for ( sal_uInt16 n=nCount; n--; )
2186     {
2187         uno::Reference<sheet::XRangeSelectionListener> *pObj = aRangeSelListeners[n];
2188         if ( *pObj == xListener )
2189         {
2190             aRangeSelListeners.DeleteAndDestroy( n );
2191             break;
2192         }
2193     }
2194 }
2195 
addRangeSelectionChangeListener(const uno::Reference<sheet::XRangeSelectionChangeListener> & xListener)2196 void SAL_CALL ScTabViewObj::addRangeSelectionChangeListener(
2197                                 const uno::Reference<sheet::XRangeSelectionChangeListener>& xListener )
2198                                     throw(uno::RuntimeException)
2199 {
2200     ScUnoGuard aGuard;
2201     uno::Reference<sheet::XRangeSelectionChangeListener>* pObj =
2202             new uno::Reference<sheet::XRangeSelectionChangeListener>( xListener );
2203     aRangeChgListeners.Insert( pObj, aRangeChgListeners.Count() );
2204 }
2205 
removeRangeSelectionChangeListener(const uno::Reference<sheet::XRangeSelectionChangeListener> & xListener)2206 void SAL_CALL ScTabViewObj::removeRangeSelectionChangeListener(
2207                                 const uno::Reference<sheet::XRangeSelectionChangeListener>& xListener )
2208                                     throw(uno::RuntimeException)
2209 {
2210     ScUnoGuard aGuard;
2211     sal_uInt16 nCount = aRangeChgListeners.Count();
2212     for ( sal_uInt16 n=nCount; n--; )
2213     {
2214         uno::Reference<sheet::XRangeSelectionChangeListener> *pObj = aRangeChgListeners[n];
2215         if ( *pObj == xListener )
2216         {
2217             aRangeChgListeners.DeleteAndDestroy( n );
2218             break;
2219         }
2220     }
2221 }
2222 
RangeSelDone(const String & rText)2223 void ScTabViewObj::RangeSelDone( const String& rText )
2224 {
2225     sheet::RangeSelectionEvent aEvent;
2226     aEvent.Source.set(static_cast<cppu::OWeakObject*>(this));
2227     aEvent.RangeDescriptor = rtl::OUString( rText );
2228 
2229     for ( sal_uInt16 n=0; n<aRangeSelListeners.Count(); n++ )
2230         (*aRangeSelListeners[n])->done( aEvent );
2231 }
2232 
RangeSelAborted(const String & rText)2233 void ScTabViewObj::RangeSelAborted( const String& rText )
2234 {
2235     sheet::RangeSelectionEvent aEvent;
2236     aEvent.Source.set(static_cast<cppu::OWeakObject*>(this));
2237     aEvent.RangeDescriptor = rtl::OUString( rText );
2238 
2239     for ( sal_uInt16 n=0; n<aRangeSelListeners.Count(); n++ )
2240         (*aRangeSelListeners[n])->aborted( aEvent );
2241 }
2242 
RangeSelChanged(const String & rText)2243 void ScTabViewObj::RangeSelChanged( const String& rText )
2244 {
2245     sheet::RangeSelectionEvent aEvent;
2246     aEvent.Source.set(static_cast<cppu::OWeakObject*>(this));
2247     aEvent.RangeDescriptor = rtl::OUString( rText );
2248 
2249     for ( sal_uInt16 n=0; n<aRangeChgListeners.Count(); n++ )
2250         (*aRangeChgListeners[n])->descriptorChanged( aEvent );
2251 }
2252 
2253 // XServiceInfo
2254 
getImplementationName()2255 rtl::OUString SAL_CALL ScTabViewObj::getImplementationName() throw(uno::RuntimeException)
2256 {
2257     return rtl::OUString::createFromAscii( "ScTabViewObj" );
2258 }
2259 
supportsService(const rtl::OUString & rServiceName)2260 sal_Bool SAL_CALL ScTabViewObj::supportsService( const rtl::OUString& rServiceName )
2261                                                     throw(uno::RuntimeException)
2262 {
2263     String aServiceStr( rServiceName );
2264     return aServiceStr.EqualsAscii( SCTABVIEWOBJ_SERVICE ) ||
2265            aServiceStr.EqualsAscii( SCVIEWSETTINGS_SERVICE );
2266 }
2267 
getSupportedServiceNames()2268 uno::Sequence<rtl::OUString> SAL_CALL ScTabViewObj::getSupportedServiceNames()
2269                                                     throw(uno::RuntimeException)
2270 {
2271     uno::Sequence<rtl::OUString> aRet(2);
2272     rtl::OUString* pArray = aRet.getArray();
2273     pArray[0] = rtl::OUString::createFromAscii( SCTABVIEWOBJ_SERVICE );
2274     pArray[1] = rtl::OUString::createFromAscii( SCVIEWSETTINGS_SERVICE );
2275     return aRet;
2276 }
2277 
2278 // XUnoTunnel
2279 
getSomething(const uno::Sequence<sal_Int8> & rId)2280 sal_Int64 SAL_CALL ScTabViewObj::getSomething(
2281                 const uno::Sequence<sal_Int8 >& rId ) throw(uno::RuntimeException)
2282 {
2283     if ( rId.getLength() == 16 &&
2284           0 == rtl_compareMemory( getUnoTunnelId().getConstArray(),
2285                                     rId.getConstArray(), 16 ) )
2286     {
2287         return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this));
2288     }
2289     return 0;
2290 }
2291 
2292 // static
getUnoTunnelId()2293 const uno::Sequence<sal_Int8>& ScTabViewObj::getUnoTunnelId()
2294 {
2295     static uno::Sequence<sal_Int8> * pSeq = 0;
2296     if( !pSeq )
2297     {
2298         osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() );
2299         if( !pSeq )
2300         {
2301             static uno::Sequence< sal_Int8 > aSeq( 16 );
2302             rtl_createUuid( (sal_uInt8*)aSeq.getArray(), 0, sal_True );
2303             pSeq = &aSeq;
2304         }
2305     }
2306     return *pSeq;
2307 }
2308 
2309 // static
getImplementation(const uno::Reference<uno::XInterface> xObj)2310 ScTabViewObj* ScTabViewObj::getImplementation( const uno::Reference<uno::XInterface> xObj )
2311 {
2312     ScTabViewObj* pRet = NULL;
2313     uno::Reference<lang::XUnoTunnel> xUT( xObj, uno::UNO_QUERY );
2314     if (xUT.is())
2315         pRet = reinterpret_cast<ScTabViewObj*>(sal::static_int_cast<sal_IntPtr>(xUT->getSomething(getUnoTunnelId())));
2316     return pRet;
2317 }
2318 
getTransferable()2319 ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XTransferable > SAL_CALL ScTabViewObj::getTransferable(  ) throw (::com::sun::star::uno::RuntimeException)
2320 {
2321     ScUnoGuard aGuard;
2322     ScEditShell* pShell = PTR_CAST( ScEditShell, GetViewShell()->GetViewFrame()->GetDispatcher()->GetShell(0) );
2323     if (pShell)
2324         return pShell->GetEditView()->GetTransferable();
2325 
2326     ScDrawTextObjectBar* pTextShell = PTR_CAST( ScDrawTextObjectBar, GetViewShell()->GetViewFrame()->GetDispatcher()->GetShell(0) );
2327     if (pTextShell)
2328     {
2329         ScViewData* pViewData = GetViewShell()->GetViewData();
2330         ScDrawView* pView = pViewData->GetScDrawView();
2331         OutlinerView* pOutView = pView->GetTextEditOutlinerView();
2332         if (pOutView)
2333             return pOutView->GetEditView().GetTransferable();
2334     }
2335 
2336     ScDrawShell* pDrawShell = PTR_CAST( ScDrawShell, GetViewShell()->GetViewFrame()->GetDispatcher()->GetShell(0) );
2337     if (pDrawShell)
2338         return pDrawShell->GetDrawView()->CopyToTransferable();
2339 
2340     ScTransferObj* pObj = GetViewShell()->CopyToTransferable();
2341     uno::Reference<datatransfer::XTransferable> xTransferable( pObj );
2342     return xTransferable;
2343 }
2344 
insertTransferable(const::com::sun::star::uno::Reference<::com::sun::star::datatransfer::XTransferable> & xTrans)2345 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)
2346 {
2347     ScUnoGuard aGuard;
2348     ScEditShell* pShell = PTR_CAST( ScEditShell, GetViewShell()->GetViewFrame()->GetDispatcher()->GetShell(0) );
2349     if (pShell)
2350         pShell->GetEditView()->InsertText( xTrans, ::rtl::OUString(), sal_False );
2351     else
2352     {
2353         ScDrawTextObjectBar* pTextShell = PTR_CAST( ScDrawTextObjectBar, GetViewShell()->GetViewFrame()->GetDispatcher()->GetShell(0) );
2354         if (pTextShell)
2355         {
2356             ScViewData* pViewData = GetViewShell()->GetViewData();
2357             ScDrawView* pView = pViewData->GetScDrawView();
2358             OutlinerView* pOutView = pView->GetTextEditOutlinerView();
2359             if ( pOutView )
2360             {
2361                 pOutView->GetEditView().InsertText( xTrans, ::rtl::OUString(), sal_False );
2362                 return;
2363             }
2364         }
2365 
2366         GetViewShell()->PasteFromTransferable( xTrans );
2367     }
2368 }
2369 
2370 //------------------------------------------------------------------------
2371 
2372 
2373 
2374 
2375