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