Files
libreoffice/sc/source/ui/view/viewfun6.cxx

361 lines
11 KiB
C++
Raw Normal View History

2000-09-18 16:07:07 +00:00
/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
2000-09-18 16:07:07 +00:00
*
* Copyright 2000, 2010 Oracle and/or its affiliates.
2000-09-18 16:07:07 +00:00
*
* OpenOffice.org - a multi-platform office productivity suite
2000-09-18 16:07:07 +00:00
*
* This file is part of OpenOffice.org.
2000-09-18 16:07:07 +00:00
*
* 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.
2000-09-18 16:07:07 +00:00
*
* 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).
2000-09-18 16:07:07 +00:00
*
* 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.
2000-09-18 16:07:07 +00:00
*
************************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sc.hxx"
2000-09-18 16:07:07 +00:00
#include <svx/svdundo.hxx>
#include <svx/svdocapt.hxx>
2000-09-18 16:07:07 +00:00
#include <sfx2/bindings.hxx>
#include <sfx2/dispatch.hxx>
#include <vcl/msgbox.hxx>
#include <vcl/sound.hxx>
#include "svl/zforlist.hxx"
2000-09-18 16:07:07 +00:00
#include "viewfunc.hxx"
#include "detfunc.hxx"
#include "detdata.hxx"
#include "viewdata.hxx"
#include "drwlayer.hxx"
#include "docsh.hxx"
#include "undocell.hxx"
#include "futext.hxx"
#include "docfunc.hxx"
#include "globstr.hrc"
#include "sc.hrc"
#include "fusel.hxx"
#include "reftokenhelper.hxx"
#include "externalrefmgr.hxx"
#include "cell.hxx"
#include <vector>
using ::rtl::OUString;
using ::rtl::OUStringBuffer;
using ::std::vector;
2000-09-18 16:07:07 +00:00
#define D_TIMEFACTOR 86400.0
2000-09-18 16:07:07 +00:00
//==================================================================
void ScViewFunc::DetectiveAddPred()
{
ScDocShell* pDocSh = GetViewData()->GetDocShell();
BOOL bDone = pDocSh->GetDocFunc().
DetectiveAddPred( GetViewData()->GetCurPos() );
if (!bDone)
Sound::Beep();
RecalcPPT(); //! use broadcast in DocFunc instead?
2000-09-18 16:07:07 +00:00
}
void ScViewFunc::DetectiveDelPred()
{
ScDocShell* pDocSh = GetViewData()->GetDocShell();
BOOL bDone = pDocSh->GetDocFunc().
DetectiveDelPred( GetViewData()->GetCurPos() );
if (!bDone)
Sound::Beep();
RecalcPPT();
2000-09-18 16:07:07 +00:00
}
void ScViewFunc::DetectiveAddSucc()
{
ScDocShell* pDocSh = GetViewData()->GetDocShell();
BOOL bDone = pDocSh->GetDocFunc().
DetectiveAddSucc( GetViewData()->GetCurPos() );
if (!bDone)
Sound::Beep();
RecalcPPT();
2000-09-18 16:07:07 +00:00
}
void ScViewFunc::DetectiveDelSucc()
{
ScDocShell* pDocSh = GetViewData()->GetDocShell();
BOOL bDone = pDocSh->GetDocFunc().
DetectiveDelSucc( GetViewData()->GetCurPos() );
if (!bDone)
Sound::Beep();
RecalcPPT();
2000-09-18 16:07:07 +00:00
}
void ScViewFunc::DetectiveAddError()
{
ScDocShell* pDocSh = GetViewData()->GetDocShell();
BOOL bDone = pDocSh->GetDocFunc().
DetectiveAddError( GetViewData()->GetCurPos() );
if (!bDone)
Sound::Beep();
RecalcPPT();
2000-09-18 16:07:07 +00:00
}
void ScViewFunc::DetectiveDelAll()
{
ScDocShell* pDocSh = GetViewData()->GetDocShell();
BOOL bDone = pDocSh->GetDocFunc().
DetectiveDelAll( GetViewData()->GetTabNo() );
if (!bDone)
Sound::Beep();
RecalcPPT();
2000-09-18 16:07:07 +00:00
}
void ScViewFunc::DetectiveMarkInvalid()
{
ScDocShell* pDocSh = GetViewData()->GetDocShell();
BOOL bDone = pDocSh->GetDocFunc().
DetectiveMarkInvalid( GetViewData()->GetTabNo() );
if (!bDone)
Sound::Beep();
RecalcPPT();
2000-09-18 16:07:07 +00:00
}
void ScViewFunc::DetectiveRefresh()
{
ScDocShell* pDocSh = GetViewData()->GetDocShell();
BOOL bDone = pDocSh->GetDocFunc().DetectiveRefresh();
if (!bDone)
Sound::Beep();
RecalcPPT();
2000-09-18 16:07:07 +00:00
}
static void lcl_jumpToRange(const ScRange& rRange, ScViewData* pView, ScDocument* pDoc)
{
String aAddrText;
rRange.Format(aAddrText, SCR_ABS_3D, pDoc);
SfxStringItem aPosItem(SID_CURRENTCELL, aAddrText);
SfxBoolItem aUnmarkItem(FN_PARAM_1, TRUE); // remove existing selection
pView->GetDispatcher().Execute(
SID_CURRENTCELL, SFX_CALLMODE_SYNCHRON | SFX_CALLMODE_RECORD,
&aPosItem, &aUnmarkItem, 0L);
}
void ScViewFunc::MarkAndJumpToRanges(const ScRangeList& rRanges)
{
ScViewData* pView = GetViewData();
ScDocShell* pDocSh = pView->GetDocShell();
ScRangeList aRanges(rRanges);
ScRange* p = aRanges.First();
ScRangeList aRangesToMark;
ScAddress aCurPos = pView->GetCurPos();
for (; p; p = aRanges.Next())
{
// Collect only those ranges that are on the same sheet as the current
// cursor.
if (p->aStart.Tab() == aCurPos.Tab())
aRangesToMark.Append(*p);
}
if (!aRangesToMark.Count())
return;
// Jump to the first range of all precedent ranges.
p = aRangesToMark.First();
lcl_jumpToRange(*p, pView, pDocSh->GetDocument());
for (; p; p = aRangesToMark.Next())
MarkRange(*p, false, true);
}
void ScViewFunc::DetectiveMarkPred()
{
ScViewData* pView = GetViewData();
ScDocShell* pDocSh = pView->GetDocShell();
ScDocument* pDoc = pDocSh->GetDocument();
ScMarkData& rMarkData = pView->GetMarkData();
ScAddress aCurPos = pView->GetCurPos();
ScRangeList aRanges;
if (rMarkData.IsMarked() || rMarkData.IsMultiMarked())
rMarkData.FillRangeListWithMarks(&aRanges, false);
else
aRanges.Append(aCurPos);
vector<ScSharedTokenRef> aRefTokens;
pDocSh->GetDocFunc().DetectiveCollectAllPreds(aRanges, aRefTokens);
if (aRefTokens.empty())
// No precedents found. Nothing to do.
return;
ScSharedTokenRef p = aRefTokens.front();
if (ScRefTokenHelper::isExternalRef(p))
{
// This is external. Open the external document if available, and
// jump to the destination.
sal_uInt16 nFileId = p->GetIndex();
ScExternalRefManager* pRefMgr = pDoc->GetExternalRefManager();
const String* pPath = pRefMgr->getExternalFileName(nFileId);
ScRange aRange;
if (pPath && ScRefTokenHelper::getRangeFromToken(aRange, p, true))
{
const String& rTabName = p->GetString();
OUStringBuffer aBuf;
aBuf.append(*pPath);
aBuf.append(sal_Unicode('#'));
aBuf.append(rTabName);
aBuf.append(sal_Unicode('.'));
String aRangeStr;
aRange.Format(aRangeStr, SCA_VALID);
aBuf.append(aRangeStr);
ScGlobal::OpenURL(aBuf.makeStringAndClear(), String());
}
return;
}
else
{
ScRange aRange;
ScRefTokenHelper::getRangeFromToken(aRange, p, false);
if (aRange.aStart.Tab() != aCurPos.Tab())
{
// The first precedent range is on a different sheet. Jump to it
// immediately and forget the rest.
lcl_jumpToRange(aRange, pView, pDoc);
return;
}
}
ScRangeList aDestRanges;
ScRefTokenHelper::getRangeListFromTokens(aDestRanges, aRefTokens);
MarkAndJumpToRanges(aDestRanges);
}
void ScViewFunc::DetectiveMarkSucc()
{
ScViewData* pView = GetViewData();
ScDocShell* pDocSh = pView->GetDocShell();
ScMarkData& rMarkData = pView->GetMarkData();
ScAddress aCurPos = pView->GetCurPos();
ScRangeList aRanges;
if (rMarkData.IsMarked() || rMarkData.IsMultiMarked())
rMarkData.FillRangeListWithMarks(&aRanges, false);
else
aRanges.Append(aCurPos);
vector<ScSharedTokenRef> aRefTokens;
pDocSh->GetDocFunc().DetectiveCollectAllSuccs(aRanges, aRefTokens);
if (aRefTokens.empty())
// No dependants found. Nothing to do.
return;
ScRangeList aDestRanges;
ScRefTokenHelper::getRangeListFromTokens(aDestRanges, aRefTokens);
MarkAndJumpToRanges(aDestRanges);
}
void ScViewFunc::InsertCurrentTime(short nCellFmt, const OUString& rUndoStr)
{
ScViewData* pViewData = GetViewData();
ScAddress aCurPos = pViewData->GetCurPos();
ScDocShell* pDocSh = pViewData->GetDocShell();
ScDocument* pDoc = pDocSh->GetDocument();
SfxUndoManager* pUndoMgr = pDocSh->GetUndoManager();
SvNumberFormatter* pFormatter = pDoc->GetFormatTable();
Date aActDate;
double fDate = aActDate - *pFormatter->GetNullDate();
Time aActTime;
double fTime =
aActTime.Get100Sec() / 100.0 + aActTime.GetSec() +
(aActTime.GetMin() * 60.0) + (aActTime.GetHour() * 3600.0);
fTime /= D_TIMEFACTOR;
pUndoMgr->EnterListAction(rUndoStr, rUndoStr);
pDocSh->GetDocFunc().PutCell(aCurPos, new ScValueCell(fDate+fTime), false);
SetNumberFormat(nCellFmt);
pUndoMgr->LeaveListAction();
}
2000-09-18 16:07:07 +00:00
//---------------------------------------------------------------------------
void ScViewFunc::ShowNote( bool bShow )
2000-09-18 16:07:07 +00:00
{
if( bShow )
2002-04-10 09:30:45 +00:00
HideNoteMarker();
const ScViewData& rViewData = *GetViewData();
ScAddress aPos( rViewData.GetCurX(), rViewData.GetCurY(), rViewData.GetTabNo() );
// show note moved to ScDocFunc, to be able to use it in notesuno.cxx
rViewData.GetDocShell()->GetDocFunc().ShowNote( aPos, bShow );
2000-09-18 16:07:07 +00:00
}
void ScViewFunc::EditNote()
{
// zum Editieren einblenden und aktivieren
ScDocShell* pDocSh = GetViewData()->GetDocShell();
ScDocument* pDoc = pDocSh->GetDocument();
SCCOL nCol = GetViewData()->GetCurX();
SCROW nRow = GetViewData()->GetCurY();
SCTAB nTab = GetViewData()->GetTabNo();
ScAddress aPos( nCol, nRow, nTab );
2000-09-18 16:07:07 +00:00
// start drawing undo to catch undo action for insertion of the caption object
pDocSh->MakeDrawLayer();
ScDrawLayer* pDrawLayer = pDoc->GetDrawLayer();
pDrawLayer->BeginCalcUndo();
// generated undo action is processed in FuText::StopEditMode
// get existing note or create a new note (including caption drawing object)
if( ScPostIt* pNote = pDoc->GetOrCreateNote( aPos ) )
2000-09-18 16:07:07 +00:00
{
// hide temporary note caption
2002-04-10 09:30:45 +00:00
HideNoteMarker();
// show caption object without changing internal visibility state
CWS-TOOLING: integrate CWS dr70 2009-06-09 13:52:02 +0200 dr r272770 : #i101930# SXC import broken 2009-06-05 11:50:16 +0200 dr r272675 : #i10000# compiler warning 2009-06-05 11:24:39 +0200 dr r272674 : #i10000# compiler warning 2009-06-05 10:35:22 +0200 dr r272668 : #i10000# compiler warning 2009-06-04 16:53:32 +0200 dr r272646 : CWS-TOOLING: rebase CWS dr70 to trunk@272291 (milestone: DEV300:m49) 2009-06-04 14:50:45 +0200 dr r272633 : #i10000# compiler warning 2009-06-03 18:50:57 +0200 dr r272603 : #i101930# fix ODS export of uninit'ed notes, do not craete note captions in UpdatePendingRowHeights 2009-05-28 11:11:17 +0200 dr r272384 : #i101930# note captions must be created before changing row/column size 2009-05-27 15:48:44 +0200 iha r272356 : #i101925# metafile creation is requested superfluously during inplace editing 2009-05-27 15:46:44 +0200 iha r272355 : #i101925# metafile creation is requested superfluously during inplace editing 2009-05-27 15:06:58 +0200 iha r272349 : #i101928# superfluous paint calls while entering and editing charts 2009-05-27 15:01:08 +0200 iha r272348 : #i101928# superfluous paint calls while entering and editing charts 2009-05-26 14:43:39 +0200 dr r272303 : #i101930# import performance: invisible cell notes cache caption data 2009-05-22 18:44:19 +0200 dr r272205 : #i101930# preparations for uninitialized notes (performance), adapted ODF import filter 2009-05-14 19:50:43 +0200 dr r271918 : #i101930# 'recycle' the shapes already created while loading cell notes 2009-05-06 16:07:45 +0200 dr r271598 : #i100827# improve performance of HTML query filter, patch by mmeeks, slightly modified 2009-05-06 11:02:38 +0200 dr r271577 : #i100827# improve performance of HTML query filter, patch by mmeeks 2009-05-06 10:50:13 +0200 dr r271575 : #i86650# improve performance of HTML query filter 2009-05-05 10:09:44 +0200 nn r271502 : #i101428# better handling of non-existing view data 2009-04-29 16:42:57 +0200 nn r271384 : #i101428# after loading, update row heights per sheet on demand
2009-07-03 12:42:53 +00:00
pNote->ShowCaptionTemp( aPos );
2002-04-10 09:30:45 +00:00
CWS-TOOLING: integrate CWS dr70 2009-06-09 13:52:02 +0200 dr r272770 : #i101930# SXC import broken 2009-06-05 11:50:16 +0200 dr r272675 : #i10000# compiler warning 2009-06-05 11:24:39 +0200 dr r272674 : #i10000# compiler warning 2009-06-05 10:35:22 +0200 dr r272668 : #i10000# compiler warning 2009-06-04 16:53:32 +0200 dr r272646 : CWS-TOOLING: rebase CWS dr70 to trunk@272291 (milestone: DEV300:m49) 2009-06-04 14:50:45 +0200 dr r272633 : #i10000# compiler warning 2009-06-03 18:50:57 +0200 dr r272603 : #i101930# fix ODS export of uninit'ed notes, do not craete note captions in UpdatePendingRowHeights 2009-05-28 11:11:17 +0200 dr r272384 : #i101930# note captions must be created before changing row/column size 2009-05-27 15:48:44 +0200 iha r272356 : #i101925# metafile creation is requested superfluously during inplace editing 2009-05-27 15:46:44 +0200 iha r272355 : #i101925# metafile creation is requested superfluously during inplace editing 2009-05-27 15:06:58 +0200 iha r272349 : #i101928# superfluous paint calls while entering and editing charts 2009-05-27 15:01:08 +0200 iha r272348 : #i101928# superfluous paint calls while entering and editing charts 2009-05-26 14:43:39 +0200 dr r272303 : #i101930# import performance: invisible cell notes cache caption data 2009-05-22 18:44:19 +0200 dr r272205 : #i101930# preparations for uninitialized notes (performance), adapted ODF import filter 2009-05-14 19:50:43 +0200 dr r271918 : #i101930# 'recycle' the shapes already created while loading cell notes 2009-05-06 16:07:45 +0200 dr r271598 : #i100827# improve performance of HTML query filter, patch by mmeeks, slightly modified 2009-05-06 11:02:38 +0200 dr r271577 : #i100827# improve performance of HTML query filter, patch by mmeeks 2009-05-06 10:50:13 +0200 dr r271575 : #i86650# improve performance of HTML query filter 2009-05-05 10:09:44 +0200 nn r271502 : #i101428# better handling of non-existing view data 2009-04-29 16:42:57 +0200 nn r271384 : #i101428# after loading, update row heights per sheet on demand
2009-07-03 12:42:53 +00:00
/* Drawing object has been created in ScDocument::GetOrCreateNote() or
in ScPostIt::ShowCaptionTemp(), so ScPostIt::GetCaption() should
return a caption object. */
if( SdrCaptionObj* pCaption = pNote->GetCaption() )
2000-09-18 16:07:07 +00:00
{
// #i33764# enable the resize handles before starting edit mode
if( FuPoor* pDraw = GetDrawFuncPtr() )
static_cast< FuSelection* >( pDraw )->ActivateNoteHandles( pCaption );
2000-09-18 16:07:07 +00:00
// activate object (as in FuSelection::TestComment)
GetViewData()->GetDispatcher().Execute( SID_DRAW_NOTEEDIT, SFX_CALLMODE_SYNCHRON | SFX_CALLMODE_RECORD );
2000-09-18 16:07:07 +00:00
// jetzt den erzeugten FuText holen und in den EditModus setzen
FuPoor* pPoor = GetDrawFuncPtr();
if ( pPoor && (pPoor->GetSlotID() == SID_DRAW_NOTEEDIT) ) // hat keine RTTI
2000-09-18 16:07:07 +00:00
{
ScrollToObject( pCaption ); // Objekt komplett sichtbar machen
static_cast< FuText* >( pPoor )->SetInEditMode( pCaption );
2000-09-18 16:07:07 +00:00
}
}
}
}