diff options
Diffstat (limited to 'sc/source/ui/view/tabvwsh5.cxx')
-rw-r--r-- | sc/source/ui/view/tabvwsh5.cxx | 428 |
1 files changed, 428 insertions, 0 deletions
diff --git a/sc/source/ui/view/tabvwsh5.cxx b/sc/source/ui/view/tabvwsh5.cxx new file mode 100644 index 000000000000..1a3dd6928a17 --- /dev/null +++ b/sc/source/ui/view/tabvwsh5.cxx @@ -0,0 +1,428 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sc.hxx" + + + +// INCLUDE --------------------------------------------------------------- +#define _ZFORLIST_DECLARE_TABLE +#include "scitems.hxx" +#include <svl/smplhint.hxx> +#include <svl/zforlist.hxx> +#include <svx/numfmtsh.hxx> +#include <svx/numinf.hxx> +#include <svx/svxids.hrc> +#include <sfx2/dispatch.hxx> +#include <sfx2/objsh.hxx> + +#include "tabvwsh.hxx" +#include "sc.hrc" +#include "global.hxx" +#include "docsh.hxx" +#include "document.hxx" +#include "cell.hxx" +#include "globstr.hrc" +#include "scmod.hxx" +#include "uiitems.hxx" +#include "editsh.hxx" +#include "hints.hxx" + + +//================================================================== + +void __EXPORT ScTabViewShell::Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) +{ + if (rHint.ISA(SfxSimpleHint)) // ohne Parameter + { + ULONG nSlot = ((SfxSimpleHint&)rHint).GetId(); + switch ( nSlot ) + { + case FID_DATACHANGED: + UpdateFormulas(); + break; + + case FID_REFMODECHANGED: + { + BOOL bRefMode = SC_MOD()->IsFormulaMode(); + if (!bRefMode) + StopRefMode(); + else + { + GetSelEngine()->Reset(); + GetFunctionSet()->SetAnchorFlag(TRUE); + // AnchorFlag, damit gleich mit Control angehaengt werden kann + } + } + break; + + case FID_KILLEDITVIEW: + case FID_KILLEDITVIEW_NOPAINT: + StopEditShell(); + KillEditView( nSlot == FID_KILLEDITVIEW_NOPAINT ); + break; + + case SFX_HINT_DOCCHANGED: + { + ScDocument* pDoc = GetViewData()->GetDocument(); + if (!pDoc->HasTable( GetViewData()->GetTabNo() )) + { + SetTabNo(0); + } + } + break; + + case SC_HINT_DRWLAYER_NEW: + MakeDrawView(); + break; + + case SC_HINT_DOC_SAVED: + { + // beim "Save as" kann ein vorher schreibgeschuetztes Dokument + // bearbeitbar werden, deshalb die Layer-Locks neu (#39884#) + // (Invalidate etc. passiert schon vom Sfx her) + // #42091# bei SID_EDITDOC kommt kein SFX_HINT_TITLECHANGED, darum + // der eigene Hint aus DoSaveCompleted + //! was ist mit SFX_HINT_SAVECOMPLETED ? + + UpdateLayerLocks(); + + // #54891# Design-Modus bei jedem Speichern anzupassen, waere zuviel + // (beim Speichern unter gleichem Namen soll er unveraendert bleiben) + // Darum nur bei SFX_HINT_MODECHANGED (vom ViewFrame) + } + break; + + case SFX_HINT_MODECHANGED: + // #54891#/#58510# Da man sich nicht mehr darauf verlassen kann, woher + // dieser Hint kommt, den Design-Modus immer dann umschalten, wenn der + // ReadOnly-Status sich wirklich geaendert hat: + + if ( GetViewData()->GetSfxDocShell()->IsReadOnly() != bReadOnly ) + { + bReadOnly = GetViewData()->GetSfxDocShell()->IsReadOnly(); + + SfxBoolItem aItem( SID_FM_DESIGN_MODE, !bReadOnly); + GetViewData()->GetDispatcher().Execute( SID_FM_DESIGN_MODE, SFX_CALLMODE_ASYNCHRON, + &aItem, 0L ); + + UpdateInputContext(); + } + break; + + case SC_HINT_SHOWRANGEFINDER: + PaintRangeFinder(); + break; + + case SC_HINT_FORCESETTAB: + SetTabNo( GetViewData()->GetTabNo(), TRUE ); + break; + + default: + break; + } + } + else if (rHint.ISA(ScPaintHint)) // neu zeichnen + { + ScPaintHint* pHint = (ScPaintHint*) &rHint; + USHORT nParts = pHint->GetParts(); + SCTAB nTab = GetViewData()->GetTabNo(); + if (pHint->GetStartTab() <= nTab && pHint->GetEndTab() >= nTab) + { + if (nParts & PAINT_EXTRAS) // zuerst, falls Tabelle weg ist !!! + if (PaintExtras()) + nParts = PAINT_ALL; + + // if the current sheet has pending row height updates (sheet links refreshed), + // execute them before invalidating the window + GetViewData()->GetDocShell()->UpdatePendingRowHeights( GetViewData()->GetTabNo() ); + + if (nParts & PAINT_SIZE) + RepeatResize(); //! InvalidateBorder ??? + if (nParts & PAINT_GRID) + PaintArea( pHint->GetStartCol(), pHint->GetStartRow(), + pHint->GetEndCol(), pHint->GetEndRow() ); + if (nParts & PAINT_MARKS) + PaintArea( pHint->GetStartCol(), pHint->GetStartRow(), + pHint->GetEndCol(), pHint->GetEndRow(), SC_UPDATE_MARKS ); + if (nParts & PAINT_LEFT) + PaintLeftArea( pHint->GetStartRow(), pHint->GetEndRow() ); + if (nParts & PAINT_TOP) + PaintTopArea( pHint->GetStartCol(), pHint->GetEndCol() ); + if (nParts & PAINT_INVERT) + InvertBlockMark( pHint->GetStartCol(), pHint->GetStartRow(), + pHint->GetEndCol(), pHint->GetEndRow() ); + + // #i84689# call UpdateAllOverlays here instead of in ScTabView::PaintArea + if (nParts & ( PAINT_LEFT | PAINT_TOP )) // only if widths or heights changed + UpdateAllOverlays(); + + HideNoteMarker(); + } + } + else if (rHint.ISA(ScEditViewHint)) // Edit-View anlegen + { + // ScEditViewHint kommt nur an aktiver View an + + ScEditViewHint* pHint = (ScEditViewHint*) &rHint; + SCTAB nTab = GetViewData()->GetTabNo(); + if ( pHint->GetTab() == nTab ) + { + SCCOL nCol = pHint->GetCol(); + SCROW nRow = pHint->GetRow(); + { + HideNoteMarker(); + + MakeEditView( pHint->GetEngine(), nCol, nRow ); + + StopEditShell(); // sollte nicht gesetzt sein + + ScSplitPos eActive = GetViewData()->GetActivePart(); + if ( GetViewData()->HasEditView(eActive) ) + { + // MakeEditView geht schief, wenn der Cursor ausserhalb des + // Bildschirms steht. GetEditView gibt dann eine nicht aktive + // View zurueck, darum die Abfrage HasEditView. + + EditView* pView = GetViewData()->GetEditView(eActive); // ist nicht 0 + + SetEditShell(pView ,TRUE); + } + } + } + } + else if (rHint.ISA(ScTablesHint)) // Tabelle eingefuegt / geloescht + { + // aktuelle Tabelle zuerst holen (kann bei DeleteTab an ViewData geaendert werden) + SCTAB nActiveTab = GetViewData()->GetTabNo(); + + const ScTablesHint& rTabHint = (const ScTablesHint&)rHint; + SCTAB nTab1 = rTabHint.GetTab1(); + SCTAB nTab2 = rTabHint.GetTab2(); + USHORT nId = rTabHint.GetId(); + switch (nId) + { + case SC_TAB_INSERTED: + GetViewData()->InsertTab( nTab1 ); + break; + case SC_TAB_DELETED: + GetViewData()->DeleteTab( nTab1 ); + break; + case SC_TAB_MOVED: + GetViewData()->MoveTab( nTab1, nTab2 ); + break; + case SC_TAB_COPIED: + GetViewData()->CopyTab( nTab1, nTab2 ); + break; + case SC_TAB_HIDDEN: + break; + default: + DBG_ERROR("unbekannter ScTablesHint"); + } + + // hier keine Abfrage auf IsActive() mehr, weil die Aktion von Basic ausgehen + // kann und dann auch die aktive View umgeschaltet werden muss. + + SCTAB nNewTab = nActiveTab; + BOOL bForce = FALSE; + switch (nId) + { + case SC_TAB_INSERTED: + if ( nTab1 <= nNewTab ) // vorher eingefuegt + ++nNewTab; + break; + case SC_TAB_DELETED: + if ( nTab1 < nNewTab ) // vorher geloescht + --nNewTab; + else if ( nTab1 == nNewTab ) // aktuelle geloescht + bForce = TRUE; + break; + case SC_TAB_MOVED: + if ( nNewTab == nTab1 ) // verschobene Tabelle + nNewTab = nTab2; + else if ( nTab1 < nTab2 ) // nach hinten verschoben + { + if ( nNewTab > nTab1 && nNewTab <= nTab2 ) // nachrueckender Bereich + --nNewTab; + } + else // nach vorne verschoben + { + if ( nNewTab >= nTab2 && nNewTab < nTab1 ) // nachrueckender Bereich + ++nNewTab; + } + break; + case SC_TAB_COPIED: + if ( nNewTab >= nTab2 ) // vorher eingefuegt + ++nNewTab; + break; + case SC_TAB_HIDDEN: + if ( nTab1 == nNewTab ) // aktuelle ausgeblendet + bForce = TRUE; + break; + } + + ScDocument* pDoc = GetViewData()->GetDocument(); + if ( nNewTab >= pDoc->GetTableCount() ) + nNewTab = pDoc->GetTableCount() - 1; + + SetTabNo( nNewTab, bForce ); + } + else if (rHint.ISA(ScIndexHint)) + { + const ScIndexHint& rIndexHint = (const ScIndexHint&)rHint; + USHORT nId = rIndexHint.GetId(); + USHORT nIndex = rIndexHint.GetIndex(); + switch (nId) + { + case SC_HINT_SHOWRANGEFINDER: + PaintRangeFinder( nIndex ); + break; + } + } + + SfxViewShell::Notify( rBC, rHint ); +} + +//------------------------------------------------------------------ + +void ScTabViewShell::MakeNumberInfoItem( ScDocument* pDoc, + ScViewData* pViewData, + SvxNumberInfoItem** ppItem ) +{ + //------------------------------ + // NumberInfo-Item konstruieren: + //------------------------------ + ScBaseCell* pCell = NULL; + SvxNumberValueType eValType = SVX_VALUE_TYPE_UNDEFINED; + double nCellValue = 0; + String aCellString; + + pDoc->GetCell( pViewData->GetCurX(), + pViewData->GetCurY(), + pViewData->GetTabNo(), + pCell ); + + if ( pCell ) + { + switch ( pCell->GetCellType() ) + { + case CELLTYPE_VALUE: + { + nCellValue = ((ScValueCell*)pCell)->GetValue(); + eValType = SVX_VALUE_TYPE_NUMBER; + aCellString.Erase(); + } + break; + + case CELLTYPE_STRING: + { + ((ScStringCell*)pCell)->GetString( aCellString ); + eValType = SVX_VALUE_TYPE_STRING; + } + break; + + case CELLTYPE_FORMULA: + { + if ( ((ScFormulaCell*)pCell)->IsValue() ) + { + nCellValue = ((ScFormulaCell*)pCell)->GetValue(); + eValType = SVX_VALUE_TYPE_NUMBER; + } + else + { + nCellValue = 0; + eValType = SVX_VALUE_TYPE_UNDEFINED; + } + aCellString.Erase(); + } + break; + + default: + nCellValue = 0; + eValType = SVX_VALUE_TYPE_UNDEFINED; + aCellString.Erase(); + } + } + else // Zelle noch leer (== nicht erzeugt) + { + nCellValue = 0; + eValType = SVX_VALUE_TYPE_UNDEFINED; + aCellString.Erase(); + } + + switch ( eValType ) + { + case SVX_VALUE_TYPE_STRING: + *ppItem = new SvxNumberInfoItem( + pDoc->GetFormatTable(), + aCellString, + SID_ATTR_NUMBERFORMAT_INFO ); + break; + + case SVX_VALUE_TYPE_NUMBER: + *ppItem = new SvxNumberInfoItem( + pDoc->GetFormatTable(), + nCellValue, + SID_ATTR_NUMBERFORMAT_INFO ); + break; + + case SVX_VALUE_TYPE_UNDEFINED: + default: + *ppItem = new SvxNumberInfoItem( + pDoc->GetFormatTable(), + (const USHORT) + SID_ATTR_NUMBERFORMAT_INFO ); + } +} + +//------------------------------------------------------------------ + +void ScTabViewShell::UpdateNumberFormatter( + ScDocument* pDoc, + const SvxNumberInfoItem& rInfoItem ) +{ + const sal_uInt32 nDelCount = rInfoItem.GetDelCount(); + + if ( nDelCount > 0 ) + { + const sal_uInt32* pDelArr = rInfoItem.GetDelArray(); + + for ( USHORT i=0; i<nDelCount; i++ ) + rInfoItem.GetNumberFormatter()->DeleteEntry( pDelArr[i] ); + } + + // sollte besser UpdateNumberFormats() heissen ? + pDoc->DeleteNumberFormat( rInfoItem.GetDelArray(), + rInfoItem.GetDelCount() ); +} + + + + + + |