1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: tabvwsh5.cxx,v $
10 * $Revision: 1.13.32.1 $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_sc.hxx"
36 // INCLUDE ---------------------------------------------------------------
37 #define _ZFORLIST_DECLARE_TABLE
38 #include "scitems.hxx"
39 #include <svtools/smplhint.hxx>
40 #include <svtools/zforlist.hxx>
41 #include <svx/numfmtsh.hxx>
42 #include <svx/numinf.hxx>
43 #include <svx/svxids.hrc>
44 #include <sfx2/dispatch.hxx>
45 #include <sfx2/objsh.hxx>
47 #include "tabvwsh.hxx"
51 #include "document.hxx"
53 #include "globstr.hrc"
55 #include "uiitems.hxx"
60 //==================================================================
62 void __EXPORT
ScTabViewShell::Notify( SfxBroadcaster
& rBC
, const SfxHint
& rHint
)
64 if (rHint
.ISA(SfxSimpleHint
)) // ohne Parameter
66 ULONG nSlot
= ((SfxSimpleHint
&)rHint
).GetId();
73 case FID_REFMODECHANGED
:
75 BOOL bRefMode
= SC_MOD()->IsFormulaMode();
80 GetSelEngine()->Reset();
81 GetFunctionSet()->SetAnchorFlag(TRUE
);
82 // AnchorFlag, damit gleich mit Control angehaengt werden kann
87 case FID_KILLEDITVIEW
:
88 case FID_KILLEDITVIEW_NOPAINT
:
90 KillEditView( nSlot
== FID_KILLEDITVIEW_NOPAINT
);
93 case SFX_HINT_DOCCHANGED
:
95 ScDocument
* pDoc
= GetViewData()->GetDocument();
96 if (!pDoc
->HasTable( GetViewData()->GetTabNo() ))
103 case SC_HINT_DRWLAYER_NEW
:
107 case SC_HINT_DOC_SAVED
:
109 // beim "Save as" kann ein vorher schreibgeschuetztes Dokument
110 // bearbeitbar werden, deshalb die Layer-Locks neu (#39884#)
111 // (Invalidate etc. passiert schon vom Sfx her)
112 // #42091# bei SID_EDITDOC kommt kein SFX_HINT_TITLECHANGED, darum
113 // der eigene Hint aus DoSaveCompleted
114 //! was ist mit SFX_HINT_SAVECOMPLETED ?
118 // #54891# Design-Modus bei jedem Speichern anzupassen, waere zuviel
119 // (beim Speichern unter gleichem Namen soll er unveraendert bleiben)
120 // Darum nur bei SFX_HINT_MODECHANGED (vom ViewFrame)
124 case SFX_HINT_MODECHANGED
:
125 // #54891#/#58510# Da man sich nicht mehr darauf verlassen kann, woher
126 // dieser Hint kommt, den Design-Modus immer dann umschalten, wenn der
127 // ReadOnly-Status sich wirklich geaendert hat:
129 if ( GetViewData()->GetSfxDocShell()->IsReadOnly() != bReadOnly
)
131 bReadOnly
= GetViewData()->GetSfxDocShell()->IsReadOnly();
133 SfxBoolItem
aItem( SID_FM_DESIGN_MODE
, !bReadOnly
);
134 GetViewData()->GetDispatcher().Execute( SID_FM_DESIGN_MODE
, SFX_CALLMODE_ASYNCHRON
,
137 UpdateInputContext();
141 case SC_HINT_SHOWRANGEFINDER
:
145 case SC_HINT_FORCESETTAB
:
146 SetTabNo( GetViewData()->GetTabNo(), TRUE
);
153 else if (rHint
.ISA(ScPaintHint
)) // neu zeichnen
155 ScPaintHint
* pHint
= (ScPaintHint
*) &rHint
;
156 USHORT nParts
= pHint
->GetParts();
157 SCTAB nTab
= GetViewData()->GetTabNo();
158 if (pHint
->GetStartTab() <= nTab
&& pHint
->GetEndTab() >= nTab
)
160 if (nParts
& PAINT_EXTRAS
) // zuerst, falls Tabelle weg ist !!!
164 // if the current sheet has pending row height updates (sheet links refreshed),
165 // execute them before invalidating the window
166 GetViewData()->GetDocShell()->UpdatePendingRowHeights( GetViewData()->GetTabNo() );
168 if (nParts
& PAINT_SIZE
)
169 RepeatResize(); //! InvalidateBorder ???
170 if (nParts
& PAINT_GRID
)
171 PaintArea( pHint
->GetStartCol(), pHint
->GetStartRow(),
172 pHint
->GetEndCol(), pHint
->GetEndRow() );
173 if (nParts
& PAINT_MARKS
)
174 PaintArea( pHint
->GetStartCol(), pHint
->GetStartRow(),
175 pHint
->GetEndCol(), pHint
->GetEndRow(), SC_UPDATE_MARKS
);
176 if (nParts
& PAINT_LEFT
)
177 PaintLeftArea( pHint
->GetStartRow(), pHint
->GetEndRow() );
178 if (nParts
& PAINT_TOP
)
179 PaintTopArea( pHint
->GetStartCol(), pHint
->GetEndCol() );
180 if (nParts
& PAINT_INVERT
)
181 InvertBlockMark( pHint
->GetStartCol(), pHint
->GetStartRow(),
182 pHint
->GetEndCol(), pHint
->GetEndRow() );
184 // #i84689# call UpdateAllOverlays here instead of in ScTabView::PaintArea
185 if (nParts
& ( PAINT_LEFT
| PAINT_TOP
)) // only if widths or heights changed
191 else if (rHint
.ISA(ScEditViewHint
)) // Edit-View anlegen
193 // ScEditViewHint kommt nur an aktiver View an
195 ScEditViewHint
* pHint
= (ScEditViewHint
*) &rHint
;
196 SCTAB nTab
= GetViewData()->GetTabNo();
197 if ( pHint
->GetTab() == nTab
)
199 SCCOL nCol
= pHint
->GetCol();
200 SCROW nRow
= pHint
->GetRow();
204 MakeEditView( pHint
->GetEngine(), nCol
, nRow
);
206 StopEditShell(); // sollte nicht gesetzt sein
208 ScSplitPos eActive
= GetViewData()->GetActivePart();
209 if ( GetViewData()->HasEditView(eActive
) )
211 // MakeEditView geht schief, wenn der Cursor ausserhalb des
212 // Bildschirms steht. GetEditView gibt dann eine nicht aktive
213 // View zurueck, darum die Abfrage HasEditView.
215 EditView
* pView
= GetViewData()->GetEditView(eActive
); // ist nicht 0
217 SetEditShell(pView
,TRUE
);
222 else if (rHint
.ISA(ScTablesHint
)) // Tabelle eingefuegt / geloescht
224 // aktuelle Tabelle zuerst holen (kann bei DeleteTab an ViewData geaendert werden)
225 SCTAB nActiveTab
= GetViewData()->GetTabNo();
227 const ScTablesHint
& rTabHint
= (const ScTablesHint
&)rHint
;
228 SCTAB nTab1
= rTabHint
.GetTab1();
229 SCTAB nTab2
= rTabHint
.GetTab2();
230 USHORT nId
= rTabHint
.GetId();
233 case SC_TAB_INSERTED
:
234 GetViewData()->InsertTab( nTab1
);
237 GetViewData()->DeleteTab( nTab1
);
240 GetViewData()->MoveTab( nTab1
, nTab2
);
243 GetViewData()->CopyTab( nTab1
, nTab2
);
248 DBG_ERROR("unbekannter ScTablesHint");
251 // hier keine Abfrage auf IsActive() mehr, weil die Aktion von Basic ausgehen
252 // kann und dann auch die aktive View umgeschaltet werden muss.
254 SCTAB nNewTab
= nActiveTab
;
258 case SC_TAB_INSERTED
:
259 if ( nTab1
<= nNewTab
) // vorher eingefuegt
263 if ( nTab1
< nNewTab
) // vorher geloescht
265 else if ( nTab1
== nNewTab
) // aktuelle geloescht
269 if ( nNewTab
== nTab1
) // verschobene Tabelle
271 else if ( nTab1
< nTab2
) // nach hinten verschoben
273 if ( nNewTab
> nTab1
&& nNewTab
<= nTab2
) // nachrueckender Bereich
276 else // nach vorne verschoben
278 if ( nNewTab
>= nTab2
&& nNewTab
< nTab1
) // nachrueckender Bereich
283 if ( nNewTab
>= nTab2
) // vorher eingefuegt
287 if ( nTab1
== nNewTab
) // aktuelle ausgeblendet
292 ScDocument
* pDoc
= GetViewData()->GetDocument();
293 if ( nNewTab
>= pDoc
->GetTableCount() )
294 nNewTab
= pDoc
->GetTableCount() - 1;
296 SetTabNo( nNewTab
, bForce
);
298 else if (rHint
.ISA(ScIndexHint
))
300 const ScIndexHint
& rIndexHint
= (const ScIndexHint
&)rHint
;
301 USHORT nId
= rIndexHint
.GetId();
302 USHORT nIndex
= rIndexHint
.GetIndex();
305 case SC_HINT_SHOWRANGEFINDER
:
306 PaintRangeFinder( nIndex
);
311 SfxViewShell::Notify( rBC
, rHint
);
314 //------------------------------------------------------------------
316 void ScTabViewShell::MakeNumberInfoItem( ScDocument
* pDoc
,
317 ScViewData
* pViewData
,
318 SvxNumberInfoItem
** ppItem
)
320 //------------------------------
321 // NumberInfo-Item konstruieren:
322 //------------------------------
323 ScBaseCell
* pCell
= NULL
;
324 SvxNumberValueType eValType
= SVX_VALUE_TYPE_UNDEFINED
;
325 double nCellValue
= 0;
328 pDoc
->GetCell( pViewData
->GetCurX(),
329 pViewData
->GetCurY(),
330 pViewData
->GetTabNo(),
335 switch ( pCell
->GetCellType() )
339 nCellValue
= ((ScValueCell
*)pCell
)->GetValue();
340 eValType
= SVX_VALUE_TYPE_NUMBER
;
345 case CELLTYPE_STRING
:
347 ((ScStringCell
*)pCell
)->GetString( aCellString
);
348 eValType
= SVX_VALUE_TYPE_STRING
;
352 case CELLTYPE_FORMULA
:
354 if ( ((ScFormulaCell
*)pCell
)->IsValue() )
356 nCellValue
= ((ScFormulaCell
*)pCell
)->GetValue();
357 eValType
= SVX_VALUE_TYPE_NUMBER
;
362 eValType
= SVX_VALUE_TYPE_UNDEFINED
;
370 eValType
= SVX_VALUE_TYPE_UNDEFINED
;
374 else // Zelle noch leer (== nicht erzeugt)
377 eValType
= SVX_VALUE_TYPE_UNDEFINED
;
383 case SVX_VALUE_TYPE_STRING
:
384 *ppItem
= new SvxNumberInfoItem(
385 pDoc
->GetFormatTable(),
387 SID_ATTR_NUMBERFORMAT_INFO
);
390 case SVX_VALUE_TYPE_NUMBER
:
391 *ppItem
= new SvxNumberInfoItem(
392 pDoc
->GetFormatTable(),
394 SID_ATTR_NUMBERFORMAT_INFO
);
397 case SVX_VALUE_TYPE_UNDEFINED
:
399 *ppItem
= new SvxNumberInfoItem(
400 pDoc
->GetFormatTable(),
402 SID_ATTR_NUMBERFORMAT_INFO
);
406 //------------------------------------------------------------------
408 void ScTabViewShell::UpdateNumberFormatter(
410 const SvxNumberInfoItem
& rInfoItem
)
412 const sal_uInt32 nDelCount
= rInfoItem
.GetDelCount();
416 const sal_uInt32
* pDelArr
= rInfoItem
.GetDelArray();
418 for ( USHORT i
=0; i
<nDelCount
; i
++ )
419 rInfoItem
.GetNumberFormatter()->DeleteEntry( pDelArr
[i
] );
422 // sollte besser UpdateNumberFormats() heissen ?
423 pDoc
->DeleteNumberFormat( rInfoItem
.GetDelArray(),
424 rInfoItem
.GetDelCount() );