1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #include "scitems.hxx"
21 #include <svl/smplhint.hxx>
22 #include <svl/zforlist.hxx>
23 #include <svx/numfmtsh.hxx>
24 #include <svx/numinf.hxx>
25 #include <svx/svxids.hrc>
26 #include <sfx2/dispatch.hxx>
27 #include <sfx2/objsh.hxx>
29 #include "tabvwsh.hxx"
33 #include "document.hxx"
34 #include "formulacell.hxx"
35 #include "globstr.hrc"
37 #include "uiitems.hxx"
40 #include "cellvalue.hxx"
41 #include <svl/sharedstring.hxx>
43 void ScTabViewShell::Notify( SfxBroadcaster
& rBC
, const SfxHint
& rHint
)
45 if (dynamic_cast<const SfxSimpleHint
*>(&rHint
)) // ohne Parameter
47 sal_uLong nSlot
= static_cast<const SfxSimpleHint
&>(rHint
).GetId();
54 case FID_REFMODECHANGED
:
56 bool bRefMode
= SC_MOD()->IsFormulaMode();
61 GetSelEngine()->Reset();
62 GetFunctionSet().SetAnchorFlag(true);
63 // AnchorFlag, damit gleich mit Control angehaengt werden kann
68 case FID_KILLEDITVIEW
:
69 case FID_KILLEDITVIEW_NOPAINT
:
71 KillEditView( nSlot
== FID_KILLEDITVIEW_NOPAINT
);
74 case SFX_HINT_DOCCHANGED
:
76 ScDocument
* pDoc
= GetViewData().GetDocument();
77 if (!pDoc
->HasTable( GetViewData().GetTabNo() ))
84 case SC_HINT_DRWLAYER_NEW
:
88 case SC_HINT_DOC_SAVED
:
90 // beim "Save as" kann ein vorher schreibgeschuetztes Dokument
91 // bearbeitbar werden, deshalb die Layer-Locks neu (#39884#)
92 // (Invalidate etc. passiert schon vom Sfx her)
93 // bei SID_EDITDOC kommt kein SFX_HINT_TITLECHANGED, darum
94 // der eigene Hint aus DoSaveCompleted
95 //! was ist mit SFX_HINT_SAVECOMPLETED ?
99 // Design-Modus bei jedem Speichern anzupassen, waere zuviel
100 // (beim Speichern unter gleichem Namen soll er unveraendert bleiben)
101 // Darum nur bei SFX_HINT_MODECHANGED (vom ViewFrame)
105 case SFX_HINT_MODECHANGED
:
106 // Da man sich nicht mehr darauf verlassen kann, woher
107 // dieser Hint kommt, den Design-Modus immer dann umschalten, wenn der
108 // ReadOnly-Status sich wirklich geaendert hat:
110 if ( GetViewData().GetSfxDocShell()->IsReadOnly() != bReadOnly
)
112 bReadOnly
= GetViewData().GetSfxDocShell()->IsReadOnly();
114 SfxBoolItem
aItem( SID_FM_DESIGN_MODE
, !bReadOnly
);
115 GetViewData().GetDispatcher().Execute( SID_FM_DESIGN_MODE
, SfxCallMode::ASYNCHRON
,
118 UpdateInputContext();
122 case SC_HINT_SHOWRANGEFINDER
:
126 case SC_HINT_FORCESETTAB
:
127 SetTabNo( GetViewData().GetTabNo(), true );
134 else if (dynamic_cast<const ScPaintHint
*>(&rHint
)) // neu zeichnen
136 const ScPaintHint
* pHint
= static_cast<const ScPaintHint
*>(&rHint
);
137 sal_uInt16 nParts
= pHint
->GetParts();
138 SCTAB nTab
= GetViewData().GetTabNo();
139 if (pHint
->GetStartTab() <= nTab
&& pHint
->GetEndTab() >= nTab
)
141 if (nParts
& PAINT_EXTRAS
) // zuerst, falls Tabelle weg ist !!!
145 // if the current sheet has pending row height updates (sheet links refreshed),
146 // execute them before invalidating the window
147 GetViewData().GetDocShell()->UpdatePendingRowHeights( GetViewData().GetTabNo() );
149 if (nParts
& PAINT_SIZE
)
150 RepeatResize(); //! InvalidateBorder ???
151 if (nParts
& PAINT_GRID
)
152 PaintArea( pHint
->GetStartCol(), pHint
->GetStartRow(),
153 pHint
->GetEndCol(), pHint
->GetEndRow() );
154 if (nParts
& PAINT_MARKS
)
155 PaintArea( pHint
->GetStartCol(), pHint
->GetStartRow(),
156 pHint
->GetEndCol(), pHint
->GetEndRow(), SC_UPDATE_MARKS
);
157 if (nParts
& PAINT_LEFT
)
158 PaintLeftArea( pHint
->GetStartRow(), pHint
->GetEndRow() );
159 if (nParts
& PAINT_TOP
)
160 PaintTopArea( pHint
->GetStartCol(), pHint
->GetEndCol() );
162 // #i84689# call UpdateAllOverlays here instead of in ScTabView::PaintArea
163 if (nParts
& ( PAINT_LEFT
| PAINT_TOP
)) // only if widths or heights changed
169 else if (dynamic_cast<const ScEditViewHint
*>(&rHint
)) // Edit-View anlegen
171 // ScEditViewHint kommt nur an aktiver View an
173 const ScEditViewHint
* pHint
= static_cast<const ScEditViewHint
*>(&rHint
);
174 SCTAB nTab
= GetViewData().GetTabNo();
175 if ( pHint
->GetTab() == nTab
)
177 SCCOL nCol
= pHint
->GetCol();
178 SCROW nRow
= pHint
->GetRow();
182 MakeEditView( pHint
->GetEngine(), nCol
, nRow
);
184 StopEditShell(); // sollte nicht gesetzt sein
186 ScSplitPos eActive
= GetViewData().GetActivePart();
187 if ( GetViewData().HasEditView(eActive
) )
189 // MakeEditView geht schief, wenn der Cursor ausserhalb des
190 // Bildschirms steht. GetEditView gibt dann eine nicht aktive
191 // View zurueck, darum die Abfrage HasEditView.
193 EditView
* pView
= GetViewData().GetEditView(eActive
); // ist nicht 0
195 SetEditShell(pView
, true);
200 else if (dynamic_cast<const ScTablesHint
*>(&rHint
)) // Tabelle eingefuegt / geloescht
202 // aktuelle Tabelle zuerst holen (kann bei DeleteTab an ViewData geaendert werden)
203 SCTAB nActiveTab
= GetViewData().GetTabNo();
205 const ScTablesHint
& rTabHint
= static_cast<const ScTablesHint
&>(rHint
);
206 SCTAB nTab1
= rTabHint
.GetTab1();
207 SCTAB nTab2
= rTabHint
.GetTab2();
208 sal_uInt16 nId
= rTabHint
.GetId();
211 case SC_TAB_INSERTED
:
212 GetViewData().InsertTab( nTab1
);
215 GetViewData().DeleteTab( nTab1
);
218 GetViewData().MoveTab( nTab1
, nTab2
);
221 GetViewData().CopyTab( nTab1
, nTab2
);
225 case SC_TABS_INSERTED
:
226 GetViewData().InsertTabs( nTab1
, nTab2
);
228 case SC_TABS_DELETED
:
229 GetViewData().DeleteTabs( nTab1
, nTab2
);
232 OSL_FAIL("unbekannter ScTablesHint");
235 // hier keine Abfrage auf IsActive() mehr, weil die Aktion von Basic ausgehen
236 // kann und dann auch die aktive View umgeschaltet werden muss.
238 SCTAB nNewTab
= nActiveTab
;
239 bool bStayOnActiveTab
= true;
242 case SC_TAB_INSERTED
:
243 if ( nTab1
<= nNewTab
) // vorher eingefuegt
247 if ( nTab1
< nNewTab
) // vorher geloescht
249 else if ( nTab1
== nNewTab
) // aktuelle geloescht
250 bStayOnActiveTab
= false;
253 if ( nNewTab
== nTab1
) // verschobene Tabelle
255 else if ( nTab1
< nTab2
) // nach hinten verschoben
257 if ( nNewTab
> nTab1
&& nNewTab
<= nTab2
) // nachrueckender Bereich
260 else // nach vorne verschoben
262 if ( nNewTab
>= nTab2
&& nNewTab
< nTab1
) // nachrueckender Bereich
267 if ( nNewTab
>= nTab2
) // vorher eingefuegt
271 if ( nTab1
== nNewTab
) // aktuelle ausgeblendet
272 bStayOnActiveTab
= false;
274 case SC_TABS_INSERTED
:
275 if ( nTab1
<= nNewTab
)
278 case SC_TABS_DELETED
:
279 if ( nTab1
< nNewTab
)
284 ScDocument
* pDoc
= GetViewData().GetDocument();
285 if ( nNewTab
>= pDoc
->GetTableCount() )
286 nNewTab
= pDoc
->GetTableCount() - 1;
288 bool bForce
= !bStayOnActiveTab
;
289 SetTabNo( nNewTab
, bForce
, false, bStayOnActiveTab
);
291 else if (dynamic_cast<const ScIndexHint
*>(&rHint
))
293 const ScIndexHint
& rIndexHint
= static_cast<const ScIndexHint
&>(rHint
);
294 sal_uInt16 nId
= rIndexHint
.GetId();
295 sal_uInt16 nIndex
= rIndexHint
.GetIndex();
298 case SC_HINT_SHOWRANGEFINDER
:
299 PaintRangeFinder( nIndex
);
304 SfxViewShell::Notify( rBC
, rHint
);
307 SvxNumberInfoItem
* ScTabViewShell::MakeNumberInfoItem( ScDocument
* pDoc
, ScViewData
* pViewData
)
310 // NumberInfo-Item konstruieren:
312 SvxNumberValueType eValType
= SVX_VALUE_TYPE_UNDEFINED
;
313 double nCellValue
= 0;
314 OUString aCellString
;
316 ScRefCellValue aCell
;
317 aCell
.assign(*pDoc
, pViewData
->GetCurPos());
319 switch (aCell
.meType
)
323 nCellValue
= aCell
.mfValue
;
324 eValType
= SVX_VALUE_TYPE_NUMBER
;
328 case CELLTYPE_STRING
:
330 aCellString
= aCell
.mpString
->getString();
331 eValType
= SVX_VALUE_TYPE_STRING
;
335 case CELLTYPE_FORMULA
:
337 if (aCell
.mpFormula
->IsValue())
339 nCellValue
= aCell
.mpFormula
->GetValue();
340 eValType
= SVX_VALUE_TYPE_NUMBER
;
345 eValType
= SVX_VALUE_TYPE_UNDEFINED
;
352 eValType
= SVX_VALUE_TYPE_UNDEFINED
;
357 case SVX_VALUE_TYPE_STRING
:
358 return new SvxNumberInfoItem(
359 pDoc
->GetFormatTable(),
361 SID_ATTR_NUMBERFORMAT_INFO
);
363 case SVX_VALUE_TYPE_NUMBER
:
364 return new SvxNumberInfoItem(
365 pDoc
->GetFormatTable(),
367 SID_ATTR_NUMBERFORMAT_INFO
);
369 case SVX_VALUE_TYPE_UNDEFINED
:
374 return new SvxNumberInfoItem(
375 pDoc
->GetFormatTable(), static_cast<const sal_uInt16
>(SID_ATTR_NUMBERFORMAT_INFO
));
378 void ScTabViewShell::UpdateNumberFormatter(
379 const SvxNumberInfoItem
& rInfoItem
)
381 const sal_uInt32 nDelCount
= rInfoItem
.GetDelCount();
385 const sal_uInt32
* pDelArr
= rInfoItem
.GetDelArray();
387 for ( sal_uInt16 i
=0; i
<nDelCount
; i
++ )
388 rInfoItem
.GetNumberFormatter()->DeleteEntry( pDelArr
[i
] );
392 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */