2000-09-18 16:07:07 +00:00
|
|
|
/*************************************************************************
|
|
|
|
*
|
2008-04-11 00:47:54 +00:00
|
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2008-04-11 00:47:54 +00:00
|
|
|
* Copyright 2008 by Sun Microsystems, Inc.
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2008-04-11 00:47:54 +00:00
|
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2008-04-11 00:47:54 +00:00
|
|
|
* $RCSfile: viewfunc.cxx,v $
|
2009-03-02 14:19:13 +00:00
|
|
|
* $Revision: 1.46.18.4 $
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2008-04-11 00:47:54 +00:00
|
|
|
* This file is part of OpenOffice.org.
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2008-04-11 00:47:54 +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
|
|
|
*
|
2008-04-11 00:47:54 +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
|
|
|
*
|
2008-04-11 00:47:54 +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
|
|
|
*
|
|
|
|
************************************************************************/
|
|
|
|
|
2006-07-21 14:26:39 +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 ---------------------------------------------------------------
|
|
|
|
|
|
|
|
#include "scitems.hxx"
|
2002-03-04 18:38:57 +00:00
|
|
|
#include <svx/eeitem.hxx>
|
2007-05-10 16:04:32 +00:00
|
|
|
|
2006-05-02 14:54:05 +00:00
|
|
|
#include <sfx2/app.hxx>
|
2000-09-18 16:07:07 +00:00
|
|
|
#include <svx/algitem.hxx>
|
|
|
|
#include <svx/boxitem.hxx>
|
|
|
|
#include <svx/editobj.hxx>
|
|
|
|
#include <svx/editview.hxx>
|
|
|
|
#include <svx/langitem.hxx>
|
2000-11-24 17:07:45 +00:00
|
|
|
#include <svx/scripttypeitem.hxx>
|
2000-09-18 16:07:07 +00:00
|
|
|
#include <sfx2/bindings.hxx>
|
|
|
|
#include <svtools/zforlist.hxx>
|
|
|
|
#include <svtools/zformat.hxx>
|
|
|
|
#include <vcl/msgbox.hxx>
|
|
|
|
#include <vcl/sound.hxx>
|
|
|
|
#include <vcl/virdev.hxx>
|
|
|
|
#include <vcl/waitobj.hxx>
|
|
|
|
#include <vcl/wrkwin.hxx>
|
|
|
|
#include <stdlib.h> // qsort
|
|
|
|
|
|
|
|
#include "viewfunc.hxx"
|
|
|
|
#include "tabvwsh.hxx"
|
|
|
|
#include "docsh.hxx"
|
|
|
|
#include "attrib.hxx"
|
|
|
|
#include "patattr.hxx"
|
|
|
|
#include "docpool.hxx"
|
|
|
|
#include "uiitems.hxx"
|
|
|
|
#include "sc.hrc"
|
|
|
|
#include "undocell.hxx"
|
|
|
|
#include "undoblk.hxx"
|
|
|
|
#include "undotab.hxx"
|
|
|
|
#include "refundo.hxx"
|
|
|
|
#include "dbcolect.hxx"
|
|
|
|
#include "olinetab.hxx"
|
|
|
|
#include "rangeutl.hxx"
|
|
|
|
#include "rangenam.hxx"
|
|
|
|
#include "globstr.hrc"
|
|
|
|
#include "global.hxx"
|
|
|
|
#include "stlsheet.hxx"
|
|
|
|
#include "editutil.hxx"
|
2004-05-10 15:09:33 +00:00
|
|
|
//CHINA001 #include "namecrea.hxx" // wegen Flags
|
2000-09-18 16:07:07 +00:00
|
|
|
#include "cell.hxx"
|
|
|
|
#include "scresid.hxx"
|
|
|
|
#include "inputhdl.hxx"
|
|
|
|
#include "scmod.hxx"
|
|
|
|
#include "inputopt.hxx"
|
|
|
|
#include "compiler.hxx"
|
|
|
|
#include "docfunc.hxx"
|
|
|
|
#include "appoptio.hxx"
|
2000-11-24 17:07:45 +00:00
|
|
|
#include "dociter.hxx"
|
2001-05-11 16:11:53 +00:00
|
|
|
#include "sizedev.hxx"
|
2002-11-20 13:36:29 +00:00
|
|
|
#include "editable.hxx"
|
2004-05-10 15:09:33 +00:00
|
|
|
#include "scui_def.hxx" //CHINA001
|
2008-03-07 10:23:12 +00:00
|
|
|
#include "funcdesc.hxx"
|
2009-02-17 09:19:30 +00:00
|
|
|
#include "docuno.hxx"
|
|
|
|
#include "cellsuno.hxx"
|
2000-09-18 16:07:07 +00:00
|
|
|
//==================================================================
|
|
|
|
|
|
|
|
ScViewFunc::ScViewFunc( Window* pParent, ScDocShell& rDocSh, ScTabViewShell* pViewShell ) :
|
|
|
|
ScTabView( pParent, rDocSh, pViewShell ),
|
|
|
|
bFormatValid( FALSE )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2008-09-30 05:48:28 +00:00
|
|
|
//UNUSED2008-05 ScViewFunc::ScViewFunc( Window* pParent, const ScViewFunc& rViewFunc, ScTabViewShell* pViewShell ) :
|
|
|
|
//UNUSED2008-05 ScTabView( pParent, rViewFunc, pViewShell ),
|
|
|
|
//UNUSED2008-05 bFormatValid( FALSE )
|
|
|
|
//UNUSED2008-05 {
|
|
|
|
//UNUSED2008-05 }
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
ScViewFunc::~ScViewFunc()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
void ScViewFunc::StartFormatArea()
|
|
|
|
{
|
|
|
|
// ueberhaupt aktiviert?
|
|
|
|
if ( !SC_MOD()->GetInputOptions().GetExtendFormat() )
|
|
|
|
return;
|
|
|
|
|
2003-03-26 17:07:02 +00:00
|
|
|
// start only with single cell (marked or cursor position)
|
|
|
|
ScRange aMarkRange;
|
2008-04-18 10:50:48 +00:00
|
|
|
BOOL bOk = (GetViewData()->GetSimpleArea( aMarkRange ) == SC_MARK_SIMPLE);
|
2003-03-26 17:07:02 +00:00
|
|
|
if ( bOk && aMarkRange.aStart != aMarkRange.aEnd )
|
2000-09-18 16:07:07 +00:00
|
|
|
bOk = FALSE;
|
|
|
|
|
|
|
|
if (bOk)
|
|
|
|
{
|
|
|
|
bFormatValid = TRUE;
|
2003-03-26 17:07:02 +00:00
|
|
|
aFormatSource = aMarkRange.aStart;
|
|
|
|
aFormatArea = ScRange( aFormatSource );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
bFormatValid = FALSE; // keinen alten Bereich behalten
|
|
|
|
}
|
|
|
|
|
2004-06-04 11:11:19 +00:00
|
|
|
BOOL ScViewFunc::TestFormatArea( SCCOL nCol, SCROW nRow, SCTAB nTab, BOOL bAttrChanged )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
// ueberhaupt aktiviert?
|
|
|
|
if ( !SC_MOD()->GetInputOptions().GetExtendFormat() )
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
// Test: Eingabe mit Zahlformat (bAttrChanged) immer als neue Attributierung behandeln
|
|
|
|
// (alte Area verwerfen). Wenn das nicht gewollt ist, den if-Teil weglassen:
|
|
|
|
if ( bAttrChanged )
|
|
|
|
{
|
|
|
|
StartFormatArea();
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
//! Abfrage, ob Zelle leer war ???
|
|
|
|
|
|
|
|
BOOL bFound = FALSE;
|
|
|
|
ScRange aNewRange = aFormatArea;
|
|
|
|
if ( bFormatValid && nTab == aFormatSource.Tab() )
|
|
|
|
{
|
|
|
|
if ( nRow >= aFormatArea.aStart.Row() && nRow <= aFormatArea.aEnd.Row() )
|
|
|
|
{
|
|
|
|
// innerhalb ?
|
|
|
|
if ( nCol >= aFormatArea.aStart.Col() && nCol <= aFormatArea.aEnd.Col() )
|
|
|
|
{
|
|
|
|
bFound = TRUE; // Bereich nicht aendern
|
|
|
|
}
|
|
|
|
// links ?
|
|
|
|
if ( nCol+1 == aFormatArea.aStart.Col() )
|
|
|
|
{
|
|
|
|
bFound = TRUE;
|
|
|
|
aNewRange.aStart.SetCol( nCol );
|
|
|
|
}
|
|
|
|
// rechts ?
|
|
|
|
if ( nCol == aFormatArea.aEnd.Col()+1 )
|
|
|
|
{
|
|
|
|
bFound = TRUE;
|
|
|
|
aNewRange.aEnd.SetCol( nCol );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( nCol >= aFormatArea.aStart.Col() && nCol <= aFormatArea.aEnd.Col() )
|
|
|
|
{
|
|
|
|
// oben ?
|
|
|
|
if ( nRow+1 == aFormatArea.aStart.Row() )
|
|
|
|
{
|
|
|
|
bFound = TRUE;
|
|
|
|
aNewRange.aStart.SetRow( nRow );
|
|
|
|
}
|
|
|
|
// unten ?
|
|
|
|
if ( nRow == aFormatArea.aEnd.Row()+1 )
|
|
|
|
{
|
|
|
|
bFound = TRUE;
|
|
|
|
aNewRange.aEnd.SetRow( nRow );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (bFound)
|
|
|
|
aFormatArea = aNewRange; // erweitern
|
|
|
|
else
|
|
|
|
{
|
|
|
|
bFormatValid = FALSE; // ausserhalb -> abbrechen
|
|
|
|
if ( bAttrChanged ) // Wert mit Zahlformat eingegeben?
|
|
|
|
StartFormatArea(); // dann ggf. neu starten
|
|
|
|
}
|
|
|
|
|
|
|
|
return bFound;
|
|
|
|
}
|
|
|
|
|
2004-06-04 11:11:19 +00:00
|
|
|
void ScViewFunc::DoAutoAttributes( SCCOL nCol, SCROW nRow, SCTAB nTab,
|
2000-09-18 16:07:07 +00:00
|
|
|
BOOL bAttrChanged, BOOL bAddUndo )
|
|
|
|
{
|
|
|
|
ScDocShell* pDocSh = GetViewData()->GetDocShell();
|
|
|
|
ScDocument* pDoc = pDocSh->GetDocument();
|
2001-02-14 14:34:08 +00:00
|
|
|
if (bAddUndo && !pDoc->IsUndoEnabled())
|
|
|
|
bAddUndo = FALSE;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
const ScPatternAttr* pSource = pDoc->GetPattern(
|
|
|
|
aFormatSource.Col(), aFormatSource.Row(), nTab );
|
|
|
|
if ( !((const ScMergeAttr&)pSource->GetItem(ATTR_MERGE)).IsMerged() )
|
|
|
|
{
|
|
|
|
const ScPatternAttr* pDocOld = pDoc->GetPattern( nCol, nRow, nTab );
|
|
|
|
// pDocOld ist nur bis zum Apply... gueltig!
|
|
|
|
|
|
|
|
ScPatternAttr* pOldPattern = NULL;
|
|
|
|
if ( bAddUndo )
|
|
|
|
pOldPattern = new ScPatternAttr( *pDocOld );
|
|
|
|
|
|
|
|
const ScStyleSheet* pSrcStyle = pSource->GetStyleSheet();
|
|
|
|
if ( pSrcStyle && pSrcStyle != pDocOld->GetStyleSheet() )
|
|
|
|
pDoc->ApplyStyle( nCol, nRow, nTab, *pSrcStyle );
|
|
|
|
pDoc->ApplyPattern( nCol, nRow, nTab, *pSource );
|
|
|
|
AdjustRowHeight( nRow, nRow, TRUE ); //! nicht doppelt ?
|
|
|
|
|
|
|
|
if ( bAddUndo )
|
|
|
|
{
|
|
|
|
const ScPatternAttr* pNewPattern = pDoc->GetPattern( nCol, nRow, nTab );
|
|
|
|
|
|
|
|
pDocSh->GetUndoManager()->AddUndoAction(
|
|
|
|
new ScUndoCursorAttr( pDocSh, nCol, nRow, nTab,
|
|
|
|
pOldPattern, pNewPattern, pSource,
|
|
|
|
TRUE ) );
|
|
|
|
|
|
|
|
delete pOldPattern; // wird im Undo kopiert (Pool)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( bAttrChanged ) // Wert mit Zahlformat eingegeben?
|
|
|
|
aFormatSource.Set( nCol, nRow, nTab ); // dann als neue Quelle
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
// Hilfsroutinen
|
|
|
|
|
2004-06-04 11:11:19 +00:00
|
|
|
USHORT ScViewFunc::GetOptimalColWidth( SCCOL nCol, SCTAB nTab, BOOL bFormula )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2001-10-31 14:59:24 +00:00
|
|
|
ScDocShell* pDocSh = GetViewData()->GetDocShell();
|
|
|
|
ScDocument* pDoc = pDocSh->GetDocument();
|
2000-09-18 16:07:07 +00:00
|
|
|
ScMarkData& rMark = GetViewData()->GetMarkData();
|
2001-10-31 14:59:24 +00:00
|
|
|
|
|
|
|
double nPPTX = GetViewData()->GetPPTX();
|
|
|
|
double nPPTY = GetViewData()->GetPPTY();
|
|
|
|
Fraction aZoomX = GetViewData()->GetZoomX();
|
|
|
|
Fraction aZoomY = GetViewData()->GetZoomY();
|
|
|
|
|
|
|
|
ScSizeDeviceProvider aProv(pDocSh);
|
|
|
|
if (aProv.IsPrinter())
|
|
|
|
{
|
|
|
|
nPPTX = aProv.GetPPTX();
|
|
|
|
nPPTY = aProv.GetPPTY();
|
|
|
|
aZoomX = aZoomY = Fraction( 1, 1 );
|
|
|
|
}
|
|
|
|
|
|
|
|
USHORT nTwips = pDoc->GetOptimalColWidth( nCol, nTab, aProv.GetDevice(),
|
|
|
|
nPPTX, nPPTY, aZoomX, aZoomY, bFormula, &rMark );
|
2000-09-18 16:07:07 +00:00
|
|
|
return nTwips;
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL ScViewFunc::SelectionEditable( BOOL* pOnlyNotBecauseOfMatrix /* = NULL */ )
|
|
|
|
{
|
|
|
|
BOOL bRet;
|
|
|
|
ScDocument* pDoc = GetViewData()->GetDocument();
|
|
|
|
ScMarkData& rMark = GetViewData()->GetMarkData();
|
|
|
|
if (rMark.IsMarked() || rMark.IsMultiMarked())
|
|
|
|
bRet = pDoc->IsSelectionEditable( rMark, pOnlyNotBecauseOfMatrix );
|
|
|
|
else
|
|
|
|
{
|
2004-06-04 11:11:19 +00:00
|
|
|
SCCOL nCol = GetViewData()->GetCurX();
|
|
|
|
SCROW nRow = GetViewData()->GetCurY();
|
|
|
|
SCTAB nTab = GetViewData()->GetTabNo();
|
2000-09-18 16:07:07 +00:00
|
|
|
bRet = pDoc->IsBlockEditable( nTab, nCol, nRow, nCol, nRow,
|
|
|
|
pOnlyNotBecauseOfMatrix );
|
|
|
|
}
|
|
|
|
return bRet;
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifndef LRU_MAX
|
|
|
|
#define LRU_MAX 10
|
|
|
|
#endif
|
|
|
|
|
|
|
|
BOOL lcl_FunctionKnown( USHORT nOpCode )
|
|
|
|
{
|
|
|
|
const ScFunctionList* pFuncList = ScGlobal::GetStarCalcFunctionList();
|
|
|
|
if ( pFuncList )
|
|
|
|
{
|
|
|
|
ULONG nCount = pFuncList->GetCount();
|
|
|
|
for (ULONG i=0; i<nCount; i++)
|
|
|
|
if ( pFuncList->GetFunction(i)->nFIndex == nOpCode )
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL lcl_AddFunction( ScAppOptions& rAppOpt, USHORT nOpCode )
|
|
|
|
{
|
|
|
|
USHORT nOldCount = rAppOpt.GetLRUFuncListCount();
|
|
|
|
USHORT* pOldList = rAppOpt.GetLRUFuncList();
|
|
|
|
USHORT nPos;
|
|
|
|
for (nPos=0; nPos<nOldCount; nPos++)
|
|
|
|
if (pOldList[nPos] == nOpCode) // is the function already in the list?
|
|
|
|
{
|
|
|
|
if ( nPos == 0 )
|
|
|
|
return FALSE; // already at the top -> no change
|
|
|
|
|
|
|
|
// count doesn't change, so the original array is modified
|
|
|
|
|
|
|
|
for (USHORT nCopy=nPos; nCopy>0; nCopy--)
|
|
|
|
pOldList[nCopy] = pOldList[nCopy-1];
|
|
|
|
pOldList[0] = nOpCode;
|
|
|
|
|
|
|
|
return TRUE; // list has changed
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !lcl_FunctionKnown( nOpCode ) )
|
|
|
|
return FALSE; // not in function list -> no change
|
|
|
|
|
|
|
|
USHORT nNewCount = Min( (USHORT)(nOldCount + 1), (USHORT)LRU_MAX );
|
|
|
|
USHORT nNewList[LRU_MAX];
|
|
|
|
nNewList[0] = nOpCode;
|
|
|
|
for (nPos=1; nPos<nNewCount; nPos++)
|
|
|
|
nNewList[nPos] = pOldList[nPos-1];
|
|
|
|
rAppOpt.SetLRUFuncList( nNewList, nNewCount );
|
|
|
|
|
|
|
|
return TRUE; // list has changed
|
|
|
|
}
|
|
|
|
|
|
|
|
// eigentliche Funktionen
|
|
|
|
|
|
|
|
// Eingabe - Undo OK
|
|
|
|
|
2004-06-04 11:11:19 +00:00
|
|
|
void ScViewFunc::EnterData( SCCOL nCol, SCROW nRow, SCTAB nTab, const String& rString,
|
2009-02-11 15:19:01 +00:00
|
|
|
BOOL bRecord, const EditTextObject* pData )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
ScDocument* pDoc = GetViewData()->GetDocument();
|
|
|
|
ScMarkData& rMark = GetViewData()->GetMarkData();
|
2004-06-04 11:11:19 +00:00
|
|
|
SCTAB nTabCount = pDoc->GetTableCount();
|
|
|
|
SCTAB nSelCount = rMark.GetSelectCount();
|
|
|
|
SCTAB i;
|
2001-02-14 14:34:08 +00:00
|
|
|
if (bRecord && !pDoc->IsUndoEnabled())
|
|
|
|
bRecord = FALSE;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
ScDocShell* pDocSh = GetViewData()->GetDocShell();
|
|
|
|
ScDocShellModificator aModificator( *pDocSh );
|
|
|
|
|
2002-11-20 13:36:29 +00:00
|
|
|
ScEditableTester aTester( pDoc, nCol,nRow, nCol,nRow, rMark );
|
|
|
|
if (aTester.IsEditable())
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
BOOL bEditDeleted = FALSE;
|
2000-11-24 17:07:45 +00:00
|
|
|
BYTE nOldScript = 0;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
ScBaseCell** ppOldCells = NULL;
|
|
|
|
BOOL* pHasFormat = NULL;
|
|
|
|
ULONG* pOldFormats = NULL;
|
2004-06-04 11:11:19 +00:00
|
|
|
SCTAB* pTabs = NULL;
|
|
|
|
SCTAB nUndoPos = 0;
|
2009-02-11 15:19:01 +00:00
|
|
|
EditTextObject* pUndoData = NULL;
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( bRecord )
|
|
|
|
{
|
|
|
|
ppOldCells = new ScBaseCell*[nSelCount];
|
|
|
|
pHasFormat = new BOOL[nSelCount];
|
|
|
|
pOldFormats = new ULONG[nSelCount];
|
2004-06-04 11:11:19 +00:00
|
|
|
pTabs = new SCTAB[nSelCount];
|
2000-09-18 16:07:07 +00:00
|
|
|
nUndoPos = 0;
|
|
|
|
|
|
|
|
for (i=0; i<nTabCount; i++)
|
|
|
|
if (rMark.GetTableSelect(i))
|
|
|
|
{
|
|
|
|
pTabs[nUndoPos] = i;
|
|
|
|
ScBaseCell* pDocCell;
|
|
|
|
pDoc->GetCell( nCol, nRow, i, pDocCell );
|
|
|
|
if ( pDocCell )
|
|
|
|
{
|
2009-03-02 14:19:13 +00:00
|
|
|
ppOldCells[nUndoPos] = pDocCell->CloneWithoutNote( *pDoc );
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( pDocCell->GetCellType() == CELLTYPE_EDIT )
|
|
|
|
bEditDeleted = TRUE;
|
2000-11-24 17:07:45 +00:00
|
|
|
|
|
|
|
BYTE nDocScript = pDoc->GetScriptType( nCol, nRow, i, pDocCell );
|
|
|
|
if ( nOldScript == 0 )
|
|
|
|
nOldScript = nDocScript;
|
|
|
|
else if ( nDocScript != nOldScript )
|
|
|
|
bEditDeleted = TRUE;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ppOldCells[nUndoPos] = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
const SfxPoolItem* pItem;
|
|
|
|
const ScPatternAttr* pPattern = pDoc->GetPattern(nCol, nRow, i);
|
|
|
|
if ( SFX_ITEM_SET == pPattern->GetItemSet().GetItemState(
|
|
|
|
ATTR_VALUE_FORMAT,FALSE,&pItem) )
|
|
|
|
{
|
|
|
|
pHasFormat[nUndoPos] = TRUE;
|
|
|
|
pOldFormats[nUndoPos] = ((const SfxUInt32Item*)pItem)->GetValue();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
pHasFormat[nUndoPos] = FALSE;
|
|
|
|
|
|
|
|
++nUndoPos;
|
|
|
|
}
|
|
|
|
|
|
|
|
DBG_ASSERT( nUndoPos==nSelCount, "nUndoPos!=nSelCount" );
|
2009-02-11 15:19:01 +00:00
|
|
|
|
|
|
|
pUndoData = ( pData ? pData->Clone() : NULL );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
2007-10-02 14:22:22 +00:00
|
|
|
bool bFormula = false;
|
|
|
|
|
|
|
|
// a single '=' character is handled as string (needed for special filters)
|
|
|
|
if ( rString.Len() > 1 )
|
|
|
|
{
|
|
|
|
if ( rString.GetChar(0) == '=' )
|
|
|
|
{
|
|
|
|
// handle as formula
|
|
|
|
bFormula = true;
|
|
|
|
}
|
|
|
|
else if ( rString.GetChar(0) == '+' || rString.GetChar(0) == '-' )
|
|
|
|
{
|
|
|
|
// if there is more than one leading '+' or '-' character, remove the additional ones
|
|
|
|
String aString( rString );
|
|
|
|
xub_StrLen nIndex = 1;
|
|
|
|
xub_StrLen nLen = aString.Len();
|
|
|
|
while ( nIndex < nLen && ( aString.GetChar( nIndex ) == '+' || aString.GetChar( nIndex ) == '-' ) )
|
|
|
|
{
|
|
|
|
++nIndex;
|
|
|
|
}
|
|
|
|
aString.Erase( 1, nIndex - 1 );
|
|
|
|
|
|
|
|
// if the remaining part without the leading '+' or '-' character
|
|
|
|
// is non-empty and not a number, handle as formula
|
|
|
|
if ( aString.Len() > 1 )
|
|
|
|
{
|
|
|
|
sal_uInt32 nFormat = 0;
|
|
|
|
pDoc->GetNumberFormat( nCol, nRow, nTab, nFormat );
|
|
|
|
SvNumberFormatter* pFormatter = pDoc->GetFormatTable();
|
|
|
|
double fNumber = 0;
|
|
|
|
if ( !pFormatter->IsNumberFormat( aString, nFormat, fNumber ) )
|
|
|
|
{
|
|
|
|
bFormula = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
BOOL bNumFmtChanged = FALSE;
|
2007-10-02 14:22:22 +00:00
|
|
|
if ( bFormula )
|
2000-09-18 16:07:07 +00:00
|
|
|
{ // Formel, compile mit AutoCorrection
|
|
|
|
for (i=0; i<nTabCount; i++)
|
|
|
|
if (rMark.GetTableSelect(i))
|
|
|
|
break;
|
|
|
|
ScAddress aPos( nCol, nRow, i );
|
CWS-TOOLING: integrate CWS frmdlg
2008-12-18 09:13:09 +0100 oj r265667 : merge from odff05
2008-12-18 07:58:16 +0100 oj r265658 : #i94555# patch from <regina>, ODFF:
Add GAMMA, CHISQDIST, CHISQINV.
Make the 'cumulative' parameter of GAMMADIST optional.
Adapt the domain of CHIDIST to allow negative x.
Remove the constraint "degrees of freedom < 1.0E5" from CHIDIST and CHIINV.
Plus a mechanism to write the now optional parameter of GAMMADIST to PODF and
ODFF if omitted, for backwards compatibility.
2008-12-15 14:06:11 +0100 oj r265490 : CWS-TOOLING: rebase CWS frmdlg to trunk@264807 (milestone: DEV300:m37)
2008-12-15 13:55:28 +0100 oj r265488 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:55:07 +0100 oj r265487 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:54:48 +0100 oj r265486 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:54:36 +0100 oj r265485 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:54:24 +0100 oj r265484 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:48:11 +0100 oj r265483 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:31:12 +0100 oj r265479 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:13:58 +0100 oj r265477 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:10:09 +0100 oj r265476 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:05:11 +0100 oj r265475 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 10:47:17 +0100 oj r265467 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 10:46:19 +0100 oj r265466 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 10:45:47 +0100 oj r265465 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 07:35:07 +0100 oj r265458 : add dependency to formula
2008-12-15 07:34:24 +0100 oj r265457 : add dependency to formula
2008-12-12 13:22:00 +0100 msc r265413 : #i97089#
2008-12-12 13:20:25 +0100 msc r265412 : #i97089#
2008-12-12 12:35:12 +0100 msc r265406 : #i97089#
2008-12-12 12:34:16 +0100 msc r265405 : #i97089#
2008-12-12 12:33:05 +0100 msc r265404 : #i97089#
2008-12-12 12:31:11 +0100 msc r265403 : #i97089#
2008-12-08 11:59:10 +0100 oj r264981 : insert RTL_LOG
2008-12-08 11:50:17 +0100 oj r264980 : some small changes
2008-12-05 12:57:57 +0100 oj r264902 : eof changed
2008-12-05 12:56:46 +0100 oj r264901 : eof changed
2008-12-05 12:28:47 +0100 oj r264899 : wrong var used
2008-12-05 10:08:57 +0100 oj r264890 : token order reversed
2008-12-04 13:49:22 +0100 oc r264843 : #i96688: Adapt autotests because of outsourced functionwizard
2008-12-04 13:45:27 +0100 oc r264842 : #i96688: Adapt autotests because of outsourced functionwizard
2008-12-04 13:42:54 +0100 oc r264841 : #i96688: Adapt autotests because of outsourced functionwizard
2008-12-04 13:37:41 +0100 oc r264840 : #i96688: Adapt autotests because of outsourced functionwizard
2008-12-04 13:34:11 +0100 oc r264839 : #i96688: Adapt autotests because of outsourced functionwizard
2008-12-04 12:35:31 +0100 oj r264835 : new help ids for struct and function tabpage
2008-12-04 12:00:35 +0100 oj r264828 : set explicit help id
2008-12-03 14:53:27 +0100 oj r264786 : #i96845# change ref button
2008-12-03 14:51:49 +0100 oj r264785 : #i96845# change ref button
2008-12-03 08:51:57 +0100 oj r264746 : convert dos to unix lineends
2008-12-03 08:50:45 +0100 oj r264745 : convert dos to unix lineends
2008-12-03 08:50:05 +0100 oj r264744 : convert dos to unix lineends
2008-12-02 12:28:33 +0100 oj r264686 : clear help text when new helpid is set
2008-12-02 12:28:02 +0100 oj r264685 : set help id for listbox category
2008-12-02 07:15:56 +0100 oj r264655 : remove define to auto generate help ids
2008-12-01 14:36:43 +0100 oj r264604 : use temp var
2008-12-01 14:18:31 +0100 oj r264601 : moved ScJumpToken to formula
2008-12-01 14:18:11 +0100 oj r264600 : moved ScJumpToken to formula
2008-12-01 14:14:35 +0100 oj r264599 : moved ScJumpToken from sc
2008-12-01 10:48:51 +0100 oj r264589 : change quickhelptext from Shrink to Select
2008-12-01 10:28:41 +0100 oj r264588 : fix opcode data, has to be Any.Void
2008-11-28 11:16:48 +0100 oj r264532 : add help ids
2008-11-28 10:16:56 +0100 oj r264529 : set help id
2008-11-28 10:16:43 +0100 oj r264528 : set help id
2008-11-26 13:55:04 +0100 oj r264381 : #94535# use of optional instead of deleting a string myself and some small changes
2008-11-26 09:53:20 +0100 oj r264346 : compile error with debug/without debug
2008-11-25 07:41:28 +0100 oj r264271 : put static into the method which make use of them
2008-11-24 08:16:07 +0100 oj r264196 : removed not needed classes for op code
2008-11-24 08:13:44 +0100 oj r264195 : removed not needed classes for op code
2008-11-21 14:05:53 +0100 oj r264135 : make GetOpCode inline
2008-11-21 12:35:27 +0100 oj r264124 : hold symbols
2008-11-20 09:27:27 +0100 oj r264028 : merged code from DEV300_m35 which got lost
2008-11-19 20:42:12 +0100 oj r264022 : more changes for formula dialog remove
2008-11-19 20:37:41 +0100 oj r264021 : removed unused var
2008-11-19 20:35:35 +0100 oj r264020 : some more changes at token
2008-11-19 10:59:47 +0100 oj r263967 : deleted
2008-11-19 10:58:24 +0100 oj r263966 : add forui and for res files
2008-11-18 15:27:36 +0100 oj r263777 : unused para removed
2008-11-18 15:23:23 +0100 oj r263775 : add insert button to add field dlg
2008-11-18 13:39:53 +0100 oj r263764 : enable the formula dialog as well for conditional print as for conditional formatting
2008-11-18 12:03:25 +0100 oj r263760 : rename isRef in IsRef
2008-11-17 11:46:16 +0100 oj r263711 : patches for function handling
2008-11-17 11:36:22 +0100 oj r263710 : add new for forui and res file
2008-11-17 09:21:12 +0100 oj r263704 : patches for some resource for libformula
2008-11-15 12:45:30 +0100 oj r263701 : changes for formula editor extraction
2008-11-07 08:23:27 +0100 oj r263416 : merge from DEV300:m35
2008-11-07 08:22:35 +0100 oj r263415 : merge from DEV300:m35
2008-11-07 08:22:16 +0100 oj r263414 : merge from DEV300:m35
2008-11-07 08:21:41 +0100 oj r263413 : merge from DEV300:m35
2008-11-07 08:21:31 +0100 oj r263412 : merge from DEV300:m35
2008-11-07 08:20:38 +0100 oj r263411 : merge from DEV300:m35
2008-11-07 08:20:00 +0100 oj r263410 : merge from DEV300:m35
2008-11-07 08:18:50 +0100 oj r263409 : merge from DEV300:m35
2008-11-07 08:18:19 +0100 oj r263408 : merge from DEV300:m35
2008-11-07 08:10:27 +0100 oj r263407 : merge from DEV300:m35
2008-10-21 07:43:46 +0200 oj r262560 : some compile errors resolved
2008-10-17 16:40:01 +0200 oj r262291 : dep for 1st target
2008-10-07 10:08:39 +0200 oj r262077 : copy
2008-10-07 09:45:31 +0200 oj r262076 : #i94535#
2008-10-07 09:44:26 +0200 oj r262075 : #i94535# new base class
2008-10-07 09:43:21 +0200 oj r262074 : moved to formula
2008-10-07 09:41:51 +0200 oj r262073 : new images
2008-10-07 09:03:01 +0200 oj r262072 : new ids for formula
2008-10-02 08:46:27 +0200 oj r262024 : #i94535# move the formula compiler to formula
2008-10-02 08:08:54 +0200 oj r262023 : #i94535#
2008-10-02 08:06:28 +0200 oj r262022 : #i94535#
2008-10-02 08:05:52 +0200 oj r262021 : #i94535#
2008-10-01 17:15:29 +0200 oj r262014 : #i94535#
2008-10-01 17:12:40 +0200 oj r262013 : new module formula
2008-10-01 17:04:55 +0200 oj r262012 : #i94535#
2008-10-01 16:49:03 +0200 oj r262010 : #i94535#
2008-10-01 16:46:59 +0200 oj r262009 : #i94535#
2009-01-08 10:47:13 +00:00
|
|
|
ScCompiler aComp( pDoc, aPos);
|
|
|
|
aComp.SetGrammar(pDoc->GetGrammar());
|
2000-09-18 16:07:07 +00:00
|
|
|
//2do: AutoCorrection via CalcOptions abschaltbar machen
|
|
|
|
aComp.SetAutoCorrection( TRUE );
|
2008-07-22 13:45:24 +00:00
|
|
|
if ( rString.GetChar(0) == '+' || rString.GetChar(0) == '-' )
|
|
|
|
{
|
|
|
|
aComp.SetExtendedErrorDetection( true );
|
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
String aFormula( rString );
|
|
|
|
ScTokenArray* pArr;
|
|
|
|
BOOL bAgain;
|
|
|
|
do
|
|
|
|
{
|
|
|
|
bAgain = FALSE;
|
|
|
|
BOOL bAddEqual = FALSE;
|
|
|
|
ScTokenArray* pArrFirst = pArr = aComp.CompileString( aFormula );
|
|
|
|
BOOL bCorrected = aComp.IsCorrected();
|
|
|
|
if ( bCorrected )
|
|
|
|
{ // probieren, mit erster Parser-Korrektur neu zu parsen
|
|
|
|
pArr = aComp.CompileString( aComp.GetCorrectedFormula() );
|
|
|
|
}
|
2008-03-06 15:22:50 +00:00
|
|
|
if ( !pArr->GetCodeError() )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
bAddEqual = TRUE;
|
|
|
|
aComp.CompileTokenArray();
|
|
|
|
bCorrected |= aComp.IsCorrected();
|
|
|
|
}
|
|
|
|
if ( bCorrected )
|
|
|
|
{
|
|
|
|
String aCorrectedFormula;
|
|
|
|
if ( bAddEqual )
|
|
|
|
{
|
|
|
|
aCorrectedFormula = '=';
|
|
|
|
aCorrectedFormula += aComp.GetCorrectedFormula();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
aCorrectedFormula = aComp.GetCorrectedFormula();
|
|
|
|
short nResult;
|
|
|
|
if ( aCorrectedFormula.Len() == 1 )
|
|
|
|
nResult = RET_NO; // leere Formel, nur '='
|
|
|
|
else
|
|
|
|
{
|
|
|
|
String aMessage( ScResId( SCSTR_FORMULA_AUTOCORRECTION ) );
|
|
|
|
aMessage += aCorrectedFormula;
|
|
|
|
nResult = QueryBox( GetViewData()->GetDialogParent(),
|
|
|
|
WinBits(WB_YES_NO | WB_DEF_YES),
|
|
|
|
aMessage ).Execute();
|
|
|
|
}
|
|
|
|
if ( nResult == RET_YES )
|
|
|
|
{
|
|
|
|
aFormula = aCorrectedFormula;
|
|
|
|
if ( pArr != pArrFirst )
|
|
|
|
delete pArrFirst;
|
|
|
|
bAgain = TRUE;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if ( pArr != pArrFirst )
|
|
|
|
{
|
|
|
|
delete pArr;
|
|
|
|
pArr = pArrFirst;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} while ( bAgain );
|
|
|
|
// um in mehreren Tabellen eingesetzt zu werden, muss die Formel
|
|
|
|
// via ScFormulaCell copy-ctor evtl. wegen RangeNames neu kompiliert
|
|
|
|
// werden, gleiches Code-Array fuer alle Zellen geht nicht.
|
|
|
|
// Wenn das Array einen Fehler enthaelt, muss in den neu erzeugten
|
|
|
|
// Zellen RPN geloescht und der Fehler explizit gesetzt werden, da
|
|
|
|
// via FormulaCell copy-ctor und Interpreter das, wenn moeglich,
|
|
|
|
// wieder glattgebuegelt wird, zu intelligent.. z.B.: =1))
|
2008-03-06 15:22:50 +00:00
|
|
|
USHORT nError = pArr->GetCodeError();
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( !nError )
|
|
|
|
{
|
|
|
|
// #68693# update list of recent functions with all functions that
|
|
|
|
// are not within parentheses
|
|
|
|
|
|
|
|
ScModule* pScMod = SC_MOD();
|
|
|
|
ScAppOptions aAppOpt = pScMod->GetAppOptions();
|
|
|
|
BOOL bOptChanged = FALSE;
|
|
|
|
|
CWS-TOOLING: integrate CWS frmdlg
2008-12-18 09:13:09 +0100 oj r265667 : merge from odff05
2008-12-18 07:58:16 +0100 oj r265658 : #i94555# patch from <regina>, ODFF:
Add GAMMA, CHISQDIST, CHISQINV.
Make the 'cumulative' parameter of GAMMADIST optional.
Adapt the domain of CHIDIST to allow negative x.
Remove the constraint "degrees of freedom < 1.0E5" from CHIDIST and CHIINV.
Plus a mechanism to write the now optional parameter of GAMMADIST to PODF and
ODFF if omitted, for backwards compatibility.
2008-12-15 14:06:11 +0100 oj r265490 : CWS-TOOLING: rebase CWS frmdlg to trunk@264807 (milestone: DEV300:m37)
2008-12-15 13:55:28 +0100 oj r265488 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:55:07 +0100 oj r265487 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:54:48 +0100 oj r265486 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:54:36 +0100 oj r265485 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:54:24 +0100 oj r265484 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:48:11 +0100 oj r265483 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:31:12 +0100 oj r265479 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:13:58 +0100 oj r265477 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:10:09 +0100 oj r265476 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:05:11 +0100 oj r265475 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 10:47:17 +0100 oj r265467 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 10:46:19 +0100 oj r265466 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 10:45:47 +0100 oj r265465 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 07:35:07 +0100 oj r265458 : add dependency to formula
2008-12-15 07:34:24 +0100 oj r265457 : add dependency to formula
2008-12-12 13:22:00 +0100 msc r265413 : #i97089#
2008-12-12 13:20:25 +0100 msc r265412 : #i97089#
2008-12-12 12:35:12 +0100 msc r265406 : #i97089#
2008-12-12 12:34:16 +0100 msc r265405 : #i97089#
2008-12-12 12:33:05 +0100 msc r265404 : #i97089#
2008-12-12 12:31:11 +0100 msc r265403 : #i97089#
2008-12-08 11:59:10 +0100 oj r264981 : insert RTL_LOG
2008-12-08 11:50:17 +0100 oj r264980 : some small changes
2008-12-05 12:57:57 +0100 oj r264902 : eof changed
2008-12-05 12:56:46 +0100 oj r264901 : eof changed
2008-12-05 12:28:47 +0100 oj r264899 : wrong var used
2008-12-05 10:08:57 +0100 oj r264890 : token order reversed
2008-12-04 13:49:22 +0100 oc r264843 : #i96688: Adapt autotests because of outsourced functionwizard
2008-12-04 13:45:27 +0100 oc r264842 : #i96688: Adapt autotests because of outsourced functionwizard
2008-12-04 13:42:54 +0100 oc r264841 : #i96688: Adapt autotests because of outsourced functionwizard
2008-12-04 13:37:41 +0100 oc r264840 : #i96688: Adapt autotests because of outsourced functionwizard
2008-12-04 13:34:11 +0100 oc r264839 : #i96688: Adapt autotests because of outsourced functionwizard
2008-12-04 12:35:31 +0100 oj r264835 : new help ids for struct and function tabpage
2008-12-04 12:00:35 +0100 oj r264828 : set explicit help id
2008-12-03 14:53:27 +0100 oj r264786 : #i96845# change ref button
2008-12-03 14:51:49 +0100 oj r264785 : #i96845# change ref button
2008-12-03 08:51:57 +0100 oj r264746 : convert dos to unix lineends
2008-12-03 08:50:45 +0100 oj r264745 : convert dos to unix lineends
2008-12-03 08:50:05 +0100 oj r264744 : convert dos to unix lineends
2008-12-02 12:28:33 +0100 oj r264686 : clear help text when new helpid is set
2008-12-02 12:28:02 +0100 oj r264685 : set help id for listbox category
2008-12-02 07:15:56 +0100 oj r264655 : remove define to auto generate help ids
2008-12-01 14:36:43 +0100 oj r264604 : use temp var
2008-12-01 14:18:31 +0100 oj r264601 : moved ScJumpToken to formula
2008-12-01 14:18:11 +0100 oj r264600 : moved ScJumpToken to formula
2008-12-01 14:14:35 +0100 oj r264599 : moved ScJumpToken from sc
2008-12-01 10:48:51 +0100 oj r264589 : change quickhelptext from Shrink to Select
2008-12-01 10:28:41 +0100 oj r264588 : fix opcode data, has to be Any.Void
2008-11-28 11:16:48 +0100 oj r264532 : add help ids
2008-11-28 10:16:56 +0100 oj r264529 : set help id
2008-11-28 10:16:43 +0100 oj r264528 : set help id
2008-11-26 13:55:04 +0100 oj r264381 : #94535# use of optional instead of deleting a string myself and some small changes
2008-11-26 09:53:20 +0100 oj r264346 : compile error with debug/without debug
2008-11-25 07:41:28 +0100 oj r264271 : put static into the method which make use of them
2008-11-24 08:16:07 +0100 oj r264196 : removed not needed classes for op code
2008-11-24 08:13:44 +0100 oj r264195 : removed not needed classes for op code
2008-11-21 14:05:53 +0100 oj r264135 : make GetOpCode inline
2008-11-21 12:35:27 +0100 oj r264124 : hold symbols
2008-11-20 09:27:27 +0100 oj r264028 : merged code from DEV300_m35 which got lost
2008-11-19 20:42:12 +0100 oj r264022 : more changes for formula dialog remove
2008-11-19 20:37:41 +0100 oj r264021 : removed unused var
2008-11-19 20:35:35 +0100 oj r264020 : some more changes at token
2008-11-19 10:59:47 +0100 oj r263967 : deleted
2008-11-19 10:58:24 +0100 oj r263966 : add forui and for res files
2008-11-18 15:27:36 +0100 oj r263777 : unused para removed
2008-11-18 15:23:23 +0100 oj r263775 : add insert button to add field dlg
2008-11-18 13:39:53 +0100 oj r263764 : enable the formula dialog as well for conditional print as for conditional formatting
2008-11-18 12:03:25 +0100 oj r263760 : rename isRef in IsRef
2008-11-17 11:46:16 +0100 oj r263711 : patches for function handling
2008-11-17 11:36:22 +0100 oj r263710 : add new for forui and res file
2008-11-17 09:21:12 +0100 oj r263704 : patches for some resource for libformula
2008-11-15 12:45:30 +0100 oj r263701 : changes for formula editor extraction
2008-11-07 08:23:27 +0100 oj r263416 : merge from DEV300:m35
2008-11-07 08:22:35 +0100 oj r263415 : merge from DEV300:m35
2008-11-07 08:22:16 +0100 oj r263414 : merge from DEV300:m35
2008-11-07 08:21:41 +0100 oj r263413 : merge from DEV300:m35
2008-11-07 08:21:31 +0100 oj r263412 : merge from DEV300:m35
2008-11-07 08:20:38 +0100 oj r263411 : merge from DEV300:m35
2008-11-07 08:20:00 +0100 oj r263410 : merge from DEV300:m35
2008-11-07 08:18:50 +0100 oj r263409 : merge from DEV300:m35
2008-11-07 08:18:19 +0100 oj r263408 : merge from DEV300:m35
2008-11-07 08:10:27 +0100 oj r263407 : merge from DEV300:m35
2008-10-21 07:43:46 +0200 oj r262560 : some compile errors resolved
2008-10-17 16:40:01 +0200 oj r262291 : dep for 1st target
2008-10-07 10:08:39 +0200 oj r262077 : copy
2008-10-07 09:45:31 +0200 oj r262076 : #i94535#
2008-10-07 09:44:26 +0200 oj r262075 : #i94535# new base class
2008-10-07 09:43:21 +0200 oj r262074 : moved to formula
2008-10-07 09:41:51 +0200 oj r262073 : new images
2008-10-07 09:03:01 +0200 oj r262072 : new ids for formula
2008-10-02 08:46:27 +0200 oj r262024 : #i94535# move the formula compiler to formula
2008-10-02 08:08:54 +0200 oj r262023 : #i94535#
2008-10-02 08:06:28 +0200 oj r262022 : #i94535#
2008-10-02 08:05:52 +0200 oj r262021 : #i94535#
2008-10-01 17:15:29 +0200 oj r262014 : #i94535#
2008-10-01 17:12:40 +0200 oj r262013 : new module formula
2008-10-01 17:04:55 +0200 oj r262012 : #i94535#
2008-10-01 16:49:03 +0200 oj r262010 : #i94535#
2008-10-01 16:46:59 +0200 oj r262009 : #i94535#
2009-01-08 10:47:13 +00:00
|
|
|
formula::FormulaToken** ppToken = pArr->GetArray();
|
2000-09-18 16:07:07 +00:00
|
|
|
USHORT nTokens = pArr->GetLen();
|
|
|
|
USHORT nLevel = 0;
|
|
|
|
for (USHORT nTP=0; nTP<nTokens; nTP++)
|
|
|
|
{
|
CWS-TOOLING: integrate CWS frmdlg
2008-12-18 09:13:09 +0100 oj r265667 : merge from odff05
2008-12-18 07:58:16 +0100 oj r265658 : #i94555# patch from <regina>, ODFF:
Add GAMMA, CHISQDIST, CHISQINV.
Make the 'cumulative' parameter of GAMMADIST optional.
Adapt the domain of CHIDIST to allow negative x.
Remove the constraint "degrees of freedom < 1.0E5" from CHIDIST and CHIINV.
Plus a mechanism to write the now optional parameter of GAMMADIST to PODF and
ODFF if omitted, for backwards compatibility.
2008-12-15 14:06:11 +0100 oj r265490 : CWS-TOOLING: rebase CWS frmdlg to trunk@264807 (milestone: DEV300:m37)
2008-12-15 13:55:28 +0100 oj r265488 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:55:07 +0100 oj r265487 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:54:48 +0100 oj r265486 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:54:36 +0100 oj r265485 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:54:24 +0100 oj r265484 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:48:11 +0100 oj r265483 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:31:12 +0100 oj r265479 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:13:58 +0100 oj r265477 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:10:09 +0100 oj r265476 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:05:11 +0100 oj r265475 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 10:47:17 +0100 oj r265467 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 10:46:19 +0100 oj r265466 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 10:45:47 +0100 oj r265465 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 07:35:07 +0100 oj r265458 : add dependency to formula
2008-12-15 07:34:24 +0100 oj r265457 : add dependency to formula
2008-12-12 13:22:00 +0100 msc r265413 : #i97089#
2008-12-12 13:20:25 +0100 msc r265412 : #i97089#
2008-12-12 12:35:12 +0100 msc r265406 : #i97089#
2008-12-12 12:34:16 +0100 msc r265405 : #i97089#
2008-12-12 12:33:05 +0100 msc r265404 : #i97089#
2008-12-12 12:31:11 +0100 msc r265403 : #i97089#
2008-12-08 11:59:10 +0100 oj r264981 : insert RTL_LOG
2008-12-08 11:50:17 +0100 oj r264980 : some small changes
2008-12-05 12:57:57 +0100 oj r264902 : eof changed
2008-12-05 12:56:46 +0100 oj r264901 : eof changed
2008-12-05 12:28:47 +0100 oj r264899 : wrong var used
2008-12-05 10:08:57 +0100 oj r264890 : token order reversed
2008-12-04 13:49:22 +0100 oc r264843 : #i96688: Adapt autotests because of outsourced functionwizard
2008-12-04 13:45:27 +0100 oc r264842 : #i96688: Adapt autotests because of outsourced functionwizard
2008-12-04 13:42:54 +0100 oc r264841 : #i96688: Adapt autotests because of outsourced functionwizard
2008-12-04 13:37:41 +0100 oc r264840 : #i96688: Adapt autotests because of outsourced functionwizard
2008-12-04 13:34:11 +0100 oc r264839 : #i96688: Adapt autotests because of outsourced functionwizard
2008-12-04 12:35:31 +0100 oj r264835 : new help ids for struct and function tabpage
2008-12-04 12:00:35 +0100 oj r264828 : set explicit help id
2008-12-03 14:53:27 +0100 oj r264786 : #i96845# change ref button
2008-12-03 14:51:49 +0100 oj r264785 : #i96845# change ref button
2008-12-03 08:51:57 +0100 oj r264746 : convert dos to unix lineends
2008-12-03 08:50:45 +0100 oj r264745 : convert dos to unix lineends
2008-12-03 08:50:05 +0100 oj r264744 : convert dos to unix lineends
2008-12-02 12:28:33 +0100 oj r264686 : clear help text when new helpid is set
2008-12-02 12:28:02 +0100 oj r264685 : set help id for listbox category
2008-12-02 07:15:56 +0100 oj r264655 : remove define to auto generate help ids
2008-12-01 14:36:43 +0100 oj r264604 : use temp var
2008-12-01 14:18:31 +0100 oj r264601 : moved ScJumpToken to formula
2008-12-01 14:18:11 +0100 oj r264600 : moved ScJumpToken to formula
2008-12-01 14:14:35 +0100 oj r264599 : moved ScJumpToken from sc
2008-12-01 10:48:51 +0100 oj r264589 : change quickhelptext from Shrink to Select
2008-12-01 10:28:41 +0100 oj r264588 : fix opcode data, has to be Any.Void
2008-11-28 11:16:48 +0100 oj r264532 : add help ids
2008-11-28 10:16:56 +0100 oj r264529 : set help id
2008-11-28 10:16:43 +0100 oj r264528 : set help id
2008-11-26 13:55:04 +0100 oj r264381 : #94535# use of optional instead of deleting a string myself and some small changes
2008-11-26 09:53:20 +0100 oj r264346 : compile error with debug/without debug
2008-11-25 07:41:28 +0100 oj r264271 : put static into the method which make use of them
2008-11-24 08:16:07 +0100 oj r264196 : removed not needed classes for op code
2008-11-24 08:13:44 +0100 oj r264195 : removed not needed classes for op code
2008-11-21 14:05:53 +0100 oj r264135 : make GetOpCode inline
2008-11-21 12:35:27 +0100 oj r264124 : hold symbols
2008-11-20 09:27:27 +0100 oj r264028 : merged code from DEV300_m35 which got lost
2008-11-19 20:42:12 +0100 oj r264022 : more changes for formula dialog remove
2008-11-19 20:37:41 +0100 oj r264021 : removed unused var
2008-11-19 20:35:35 +0100 oj r264020 : some more changes at token
2008-11-19 10:59:47 +0100 oj r263967 : deleted
2008-11-19 10:58:24 +0100 oj r263966 : add forui and for res files
2008-11-18 15:27:36 +0100 oj r263777 : unused para removed
2008-11-18 15:23:23 +0100 oj r263775 : add insert button to add field dlg
2008-11-18 13:39:53 +0100 oj r263764 : enable the formula dialog as well for conditional print as for conditional formatting
2008-11-18 12:03:25 +0100 oj r263760 : rename isRef in IsRef
2008-11-17 11:46:16 +0100 oj r263711 : patches for function handling
2008-11-17 11:36:22 +0100 oj r263710 : add new for forui and res file
2008-11-17 09:21:12 +0100 oj r263704 : patches for some resource for libformula
2008-11-15 12:45:30 +0100 oj r263701 : changes for formula editor extraction
2008-11-07 08:23:27 +0100 oj r263416 : merge from DEV300:m35
2008-11-07 08:22:35 +0100 oj r263415 : merge from DEV300:m35
2008-11-07 08:22:16 +0100 oj r263414 : merge from DEV300:m35
2008-11-07 08:21:41 +0100 oj r263413 : merge from DEV300:m35
2008-11-07 08:21:31 +0100 oj r263412 : merge from DEV300:m35
2008-11-07 08:20:38 +0100 oj r263411 : merge from DEV300:m35
2008-11-07 08:20:00 +0100 oj r263410 : merge from DEV300:m35
2008-11-07 08:18:50 +0100 oj r263409 : merge from DEV300:m35
2008-11-07 08:18:19 +0100 oj r263408 : merge from DEV300:m35
2008-11-07 08:10:27 +0100 oj r263407 : merge from DEV300:m35
2008-10-21 07:43:46 +0200 oj r262560 : some compile errors resolved
2008-10-17 16:40:01 +0200 oj r262291 : dep for 1st target
2008-10-07 10:08:39 +0200 oj r262077 : copy
2008-10-07 09:45:31 +0200 oj r262076 : #i94535#
2008-10-07 09:44:26 +0200 oj r262075 : #i94535# new base class
2008-10-07 09:43:21 +0200 oj r262074 : moved to formula
2008-10-07 09:41:51 +0200 oj r262073 : new images
2008-10-07 09:03:01 +0200 oj r262072 : new ids for formula
2008-10-02 08:46:27 +0200 oj r262024 : #i94535# move the formula compiler to formula
2008-10-02 08:08:54 +0200 oj r262023 : #i94535#
2008-10-02 08:06:28 +0200 oj r262022 : #i94535#
2008-10-02 08:05:52 +0200 oj r262021 : #i94535#
2008-10-01 17:15:29 +0200 oj r262014 : #i94535#
2008-10-01 17:12:40 +0200 oj r262013 : new module formula
2008-10-01 17:04:55 +0200 oj r262012 : #i94535#
2008-10-01 16:49:03 +0200 oj r262010 : #i94535#
2008-10-01 16:46:59 +0200 oj r262009 : #i94535#
2009-01-08 10:47:13 +00:00
|
|
|
formula::FormulaToken* pTok = ppToken[nTP];
|
2000-09-18 16:07:07 +00:00
|
|
|
OpCode eOp = pTok->GetOpCode();
|
|
|
|
if ( eOp == ocOpen )
|
|
|
|
++nLevel;
|
|
|
|
else if ( eOp == ocClose && nLevel )
|
|
|
|
--nLevel;
|
2007-02-27 13:01:43 +00:00
|
|
|
if ( nLevel == 0 && pTok->IsFunction() &&
|
|
|
|
lcl_AddFunction( aAppOpt, sal::static_int_cast<USHORT>( eOp ) ) )
|
2000-09-18 16:07:07 +00:00
|
|
|
bOptChanged = TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( bOptChanged )
|
|
|
|
{
|
|
|
|
pScMod->SetAppOptions(aAppOpt);
|
|
|
|
pScMod->RecentFunctionsChanged();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
CWS-TOOLING: integrate CWS frmdlg
2008-12-18 09:13:09 +0100 oj r265667 : merge from odff05
2008-12-18 07:58:16 +0100 oj r265658 : #i94555# patch from <regina>, ODFF:
Add GAMMA, CHISQDIST, CHISQINV.
Make the 'cumulative' parameter of GAMMADIST optional.
Adapt the domain of CHIDIST to allow negative x.
Remove the constraint "degrees of freedom < 1.0E5" from CHIDIST and CHIINV.
Plus a mechanism to write the now optional parameter of GAMMADIST to PODF and
ODFF if omitted, for backwards compatibility.
2008-12-15 14:06:11 +0100 oj r265490 : CWS-TOOLING: rebase CWS frmdlg to trunk@264807 (milestone: DEV300:m37)
2008-12-15 13:55:28 +0100 oj r265488 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:55:07 +0100 oj r265487 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:54:48 +0100 oj r265486 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:54:36 +0100 oj r265485 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:54:24 +0100 oj r265484 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:48:11 +0100 oj r265483 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:31:12 +0100 oj r265479 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:13:58 +0100 oj r265477 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:10:09 +0100 oj r265476 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:05:11 +0100 oj r265475 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 10:47:17 +0100 oj r265467 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 10:46:19 +0100 oj r265466 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 10:45:47 +0100 oj r265465 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 07:35:07 +0100 oj r265458 : add dependency to formula
2008-12-15 07:34:24 +0100 oj r265457 : add dependency to formula
2008-12-12 13:22:00 +0100 msc r265413 : #i97089#
2008-12-12 13:20:25 +0100 msc r265412 : #i97089#
2008-12-12 12:35:12 +0100 msc r265406 : #i97089#
2008-12-12 12:34:16 +0100 msc r265405 : #i97089#
2008-12-12 12:33:05 +0100 msc r265404 : #i97089#
2008-12-12 12:31:11 +0100 msc r265403 : #i97089#
2008-12-08 11:59:10 +0100 oj r264981 : insert RTL_LOG
2008-12-08 11:50:17 +0100 oj r264980 : some small changes
2008-12-05 12:57:57 +0100 oj r264902 : eof changed
2008-12-05 12:56:46 +0100 oj r264901 : eof changed
2008-12-05 12:28:47 +0100 oj r264899 : wrong var used
2008-12-05 10:08:57 +0100 oj r264890 : token order reversed
2008-12-04 13:49:22 +0100 oc r264843 : #i96688: Adapt autotests because of outsourced functionwizard
2008-12-04 13:45:27 +0100 oc r264842 : #i96688: Adapt autotests because of outsourced functionwizard
2008-12-04 13:42:54 +0100 oc r264841 : #i96688: Adapt autotests because of outsourced functionwizard
2008-12-04 13:37:41 +0100 oc r264840 : #i96688: Adapt autotests because of outsourced functionwizard
2008-12-04 13:34:11 +0100 oc r264839 : #i96688: Adapt autotests because of outsourced functionwizard
2008-12-04 12:35:31 +0100 oj r264835 : new help ids for struct and function tabpage
2008-12-04 12:00:35 +0100 oj r264828 : set explicit help id
2008-12-03 14:53:27 +0100 oj r264786 : #i96845# change ref button
2008-12-03 14:51:49 +0100 oj r264785 : #i96845# change ref button
2008-12-03 08:51:57 +0100 oj r264746 : convert dos to unix lineends
2008-12-03 08:50:45 +0100 oj r264745 : convert dos to unix lineends
2008-12-03 08:50:05 +0100 oj r264744 : convert dos to unix lineends
2008-12-02 12:28:33 +0100 oj r264686 : clear help text when new helpid is set
2008-12-02 12:28:02 +0100 oj r264685 : set help id for listbox category
2008-12-02 07:15:56 +0100 oj r264655 : remove define to auto generate help ids
2008-12-01 14:36:43 +0100 oj r264604 : use temp var
2008-12-01 14:18:31 +0100 oj r264601 : moved ScJumpToken to formula
2008-12-01 14:18:11 +0100 oj r264600 : moved ScJumpToken to formula
2008-12-01 14:14:35 +0100 oj r264599 : moved ScJumpToken from sc
2008-12-01 10:48:51 +0100 oj r264589 : change quickhelptext from Shrink to Select
2008-12-01 10:28:41 +0100 oj r264588 : fix opcode data, has to be Any.Void
2008-11-28 11:16:48 +0100 oj r264532 : add help ids
2008-11-28 10:16:56 +0100 oj r264529 : set help id
2008-11-28 10:16:43 +0100 oj r264528 : set help id
2008-11-26 13:55:04 +0100 oj r264381 : #94535# use of optional instead of deleting a string myself and some small changes
2008-11-26 09:53:20 +0100 oj r264346 : compile error with debug/without debug
2008-11-25 07:41:28 +0100 oj r264271 : put static into the method which make use of them
2008-11-24 08:16:07 +0100 oj r264196 : removed not needed classes for op code
2008-11-24 08:13:44 +0100 oj r264195 : removed not needed classes for op code
2008-11-21 14:05:53 +0100 oj r264135 : make GetOpCode inline
2008-11-21 12:35:27 +0100 oj r264124 : hold symbols
2008-11-20 09:27:27 +0100 oj r264028 : merged code from DEV300_m35 which got lost
2008-11-19 20:42:12 +0100 oj r264022 : more changes for formula dialog remove
2008-11-19 20:37:41 +0100 oj r264021 : removed unused var
2008-11-19 20:35:35 +0100 oj r264020 : some more changes at token
2008-11-19 10:59:47 +0100 oj r263967 : deleted
2008-11-19 10:58:24 +0100 oj r263966 : add forui and for res files
2008-11-18 15:27:36 +0100 oj r263777 : unused para removed
2008-11-18 15:23:23 +0100 oj r263775 : add insert button to add field dlg
2008-11-18 13:39:53 +0100 oj r263764 : enable the formula dialog as well for conditional print as for conditional formatting
2008-11-18 12:03:25 +0100 oj r263760 : rename isRef in IsRef
2008-11-17 11:46:16 +0100 oj r263711 : patches for function handling
2008-11-17 11:36:22 +0100 oj r263710 : add new for forui and res file
2008-11-17 09:21:12 +0100 oj r263704 : patches for some resource for libformula
2008-11-15 12:45:30 +0100 oj r263701 : changes for formula editor extraction
2008-11-07 08:23:27 +0100 oj r263416 : merge from DEV300:m35
2008-11-07 08:22:35 +0100 oj r263415 : merge from DEV300:m35
2008-11-07 08:22:16 +0100 oj r263414 : merge from DEV300:m35
2008-11-07 08:21:41 +0100 oj r263413 : merge from DEV300:m35
2008-11-07 08:21:31 +0100 oj r263412 : merge from DEV300:m35
2008-11-07 08:20:38 +0100 oj r263411 : merge from DEV300:m35
2008-11-07 08:20:00 +0100 oj r263410 : merge from DEV300:m35
2008-11-07 08:18:50 +0100 oj r263409 : merge from DEV300:m35
2008-11-07 08:18:19 +0100 oj r263408 : merge from DEV300:m35
2008-11-07 08:10:27 +0100 oj r263407 : merge from DEV300:m35
2008-10-21 07:43:46 +0200 oj r262560 : some compile errors resolved
2008-10-17 16:40:01 +0200 oj r262291 : dep for 1st target
2008-10-07 10:08:39 +0200 oj r262077 : copy
2008-10-07 09:45:31 +0200 oj r262076 : #i94535#
2008-10-07 09:44:26 +0200 oj r262075 : #i94535# new base class
2008-10-07 09:43:21 +0200 oj r262074 : moved to formula
2008-10-07 09:41:51 +0200 oj r262073 : new images
2008-10-07 09:03:01 +0200 oj r262072 : new ids for formula
2008-10-02 08:46:27 +0200 oj r262024 : #i94535# move the formula compiler to formula
2008-10-02 08:08:54 +0200 oj r262023 : #i94535#
2008-10-02 08:06:28 +0200 oj r262022 : #i94535#
2008-10-02 08:05:52 +0200 oj r262021 : #i94535#
2008-10-01 17:15:29 +0200 oj r262014 : #i94535#
2008-10-01 17:12:40 +0200 oj r262013 : new module formula
2008-10-01 17:04:55 +0200 oj r262012 : #i94535#
2008-10-01 16:49:03 +0200 oj r262010 : #i94535#
2008-10-01 16:46:59 +0200 oj r262009 : #i94535#
2009-01-08 10:47:13 +00:00
|
|
|
ScFormulaCell aCell( pDoc, aPos, pArr,formula::FormulaGrammar::GRAM_DEFAULT, MM_NONE );
|
2000-09-18 16:07:07 +00:00
|
|
|
delete pArr;
|
|
|
|
BOOL bAutoCalc = pDoc->GetAutoCalc();
|
|
|
|
SvNumberFormatter* pFormatter = pDoc->GetFormatTable();
|
|
|
|
for ( ; i<nTabCount; i++)
|
|
|
|
{
|
|
|
|
if (rMark.GetTableSelect(i))
|
|
|
|
{
|
|
|
|
aPos.SetTab( i );
|
|
|
|
ULONG nIndex = (ULONG) ((SfxUInt32Item*) pDoc->GetAttr(
|
|
|
|
nCol, nRow, i, ATTR_VALUE_FORMAT ))->GetValue();
|
2007-10-02 14:22:22 +00:00
|
|
|
if ( pFormatter->GetType( nIndex ) == NUMBERFORMAT_TEXT ||
|
|
|
|
( ( rString.GetChar(0) == '+' || rString.GetChar(0) == '-' ) && nError && rString.Equals( aFormula ) ) )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2009-02-11 15:19:01 +00:00
|
|
|
if ( pData )
|
|
|
|
{
|
|
|
|
ScEditCell* pCell = new ScEditCell( pData, pDoc, NULL );
|
|
|
|
pDoc->PutCell( aPos, pCell );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ScStringCell* pCell = new ScStringCell( aFormula );
|
|
|
|
pDoc->PutCell( aPos, pCell );
|
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2009-03-02 14:19:13 +00:00
|
|
|
ScFormulaCell* pCell = new ScFormulaCell( aCell, *pDoc, aPos );
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( nError )
|
|
|
|
{
|
|
|
|
pCell->GetCode()->DelRPN();
|
|
|
|
pCell->SetErrCode( nError );
|
2004-06-28 15:54:09 +00:00
|
|
|
if(pCell->GetCode()->IsHyperLink())
|
|
|
|
pCell->GetCode()->SetHyperLink(FALSE);
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
pDoc->PutCell( aPos, pCell );
|
|
|
|
if ( !bAutoCalc )
|
|
|
|
{ // einmal nur die Zelle berechnen und wieder dirty setzen
|
|
|
|
pCell->Interpret();
|
|
|
|
pCell->SetDirtyVar();
|
|
|
|
pDoc->PutInFormulaTree( pCell );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
for (i=0; i<nTabCount; i++)
|
|
|
|
if (rMark.GetTableSelect(i))
|
|
|
|
if (pDoc->SetString( nCol, nRow, i, rString ))
|
|
|
|
bNumFmtChanged = TRUE;
|
|
|
|
}
|
|
|
|
|
2000-11-24 17:07:45 +00:00
|
|
|
// row height must be changed if new text has a different script type
|
|
|
|
for (i=0; i<nTabCount && !bEditDeleted; i++)
|
|
|
|
if (rMark.GetTableSelect(i))
|
|
|
|
if ( pDoc->GetScriptType( nCol, nRow, i ) != nOldScript )
|
|
|
|
bEditDeleted = TRUE;
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
HideAllCursors();
|
|
|
|
|
|
|
|
if (bEditDeleted || pDoc->HasAttrib( nCol, nRow, nTab, nCol, nRow, nTab, HASATTR_NEEDHEIGHT ))
|
|
|
|
AdjustRowHeight(nRow,nRow);
|
|
|
|
|
|
|
|
BOOL bAutoFormat = TestFormatArea(nCol, nRow, nTab, bNumFmtChanged);
|
|
|
|
if (bAutoFormat)
|
|
|
|
DoAutoAttributes(nCol, nRow, nTab, bNumFmtChanged, bRecord);
|
|
|
|
|
|
|
|
if ( bRecord )
|
|
|
|
{ // wg. ChangeTrack erst jetzt
|
2009-02-11 15:19:01 +00:00
|
|
|
pDocSh->GetUndoManager()->AddUndoAction(
|
2000-09-18 16:07:07 +00:00
|
|
|
new ScUndoEnterData( pDocSh, nCol, nRow, nTab, nUndoPos, pTabs,
|
|
|
|
ppOldCells, pHasFormat, pOldFormats,
|
2009-02-11 15:19:01 +00:00
|
|
|
rString, pUndoData ) );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
for (i=0; i<nTabCount; i++)
|
|
|
|
if (rMark.GetTableSelect(i))
|
|
|
|
pDocSh->PostPaintCell( nCol, nRow, i );
|
|
|
|
|
|
|
|
ShowAllCursors();
|
|
|
|
|
|
|
|
pDocSh->UpdateOle(GetViewData());
|
2009-02-17 09:19:30 +00:00
|
|
|
|
|
|
|
// #i97876# Spreadsheet data changes are not notified
|
|
|
|
ScModelObj* pModelObj = ScModelObj::getImplementation( pDocSh->GetModel() );
|
|
|
|
if ( pModelObj && pModelObj->HasChangesListeners() )
|
|
|
|
{
|
|
|
|
ScRangeList aChangeRanges;
|
|
|
|
for ( i = 0; i < nTabCount; ++i )
|
|
|
|
{
|
|
|
|
if ( rMark.GetTableSelect( i ) )
|
|
|
|
{
|
|
|
|
aChangeRanges.Append( ScRange( nCol, nRow, i ) );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
pModelObj->NotifyChanges( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "cell-change" ) ), aChangeRanges );
|
|
|
|
}
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
aModificator.SetDocumentModified();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2002-11-20 13:36:29 +00:00
|
|
|
ErrorMessage(aTester.GetMessageId());
|
2000-09-18 16:07:07 +00:00
|
|
|
PaintArea( nCol, nRow, nCol, nRow ); // da steht evtl. noch die Edit-Engine
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Wert in einzele Zelle eintragen (nur auf nTab)
|
|
|
|
|
2009-03-02 14:19:13 +00:00
|
|
|
void ScViewFunc::EnterValue( SCCOL nCol, SCROW nRow, SCTAB nTab, const double& rValue )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
ScDocument* pDoc = GetViewData()->GetDocument();
|
|
|
|
ScDocShell* pDocSh = GetViewData()->GetDocShell();
|
2001-02-14 14:34:08 +00:00
|
|
|
BOOL bUndo (pDoc->IsUndoEnabled());
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if ( pDoc && pDocSh )
|
|
|
|
{
|
|
|
|
ScDocShellModificator aModificator( *pDocSh );
|
|
|
|
|
2002-11-20 13:36:29 +00:00
|
|
|
ScEditableTester aTester( pDoc, nTab, nCol,nRow, nCol,nRow );
|
|
|
|
if (aTester.IsEditable())
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2009-03-02 14:19:13 +00:00
|
|
|
ScAddress aPos( nCol, nRow, nTab );
|
|
|
|
ScBaseCell* pOldCell = pDoc->GetCell( aPos );
|
2000-09-18 16:07:07 +00:00
|
|
|
BOOL bNeedHeight = ( pOldCell && pOldCell->GetCellType() == CELLTYPE_EDIT )
|
|
|
|
|| pDoc->HasAttrib(
|
|
|
|
nCol,nRow,nTab, nCol,nRow,nTab, HASATTR_NEEDHEIGHT );
|
|
|
|
|
|
|
|
// Undo
|
2009-03-02 14:19:13 +00:00
|
|
|
ScBaseCell* pUndoCell = (bUndo && pOldCell) ? pOldCell->CloneWithoutNote( *pDoc ) : 0;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
pDoc->SetValue( nCol, nRow, nTab, rValue );
|
|
|
|
|
|
|
|
// wg. ChangeTrack nach Aenderung im Dokument
|
2001-02-14 14:34:08 +00:00
|
|
|
if (bUndo)
|
|
|
|
{
|
|
|
|
pDocSh->GetUndoManager()->AddUndoAction(
|
2009-03-02 14:19:13 +00:00
|
|
|
new ScUndoEnterValue( pDocSh, aPos, pUndoCell, rValue, bNeedHeight ) );
|
2001-02-14 14:34:08 +00:00
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
/*! Zeilenhoehe anpassen? Dann auch bei Undo...
|
|
|
|
if (bNeedHeight)
|
|
|
|
AdjustRowHeight(nRow,nRow);
|
|
|
|
*/
|
|
|
|
|
2009-03-02 14:19:13 +00:00
|
|
|
pDocSh->PostPaintCell( aPos );
|
2000-09-18 16:07:07 +00:00
|
|
|
pDocSh->UpdateOle(GetViewData());
|
|
|
|
aModificator.SetDocumentModified();
|
|
|
|
}
|
|
|
|
else
|
2002-11-20 13:36:29 +00:00
|
|
|
ErrorMessage(aTester.GetMessageId());
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2004-06-04 11:11:19 +00:00
|
|
|
void ScViewFunc::EnterData( SCCOL nCol, SCROW nRow, SCTAB nTab, const EditTextObject* pData,
|
2000-09-18 16:07:07 +00:00
|
|
|
BOOL bRecord, BOOL bTestSimple )
|
|
|
|
{
|
|
|
|
ScDocShell* pDocSh = GetViewData()->GetDocShell();
|
|
|
|
ScMarkData& rMark = GetViewData()->GetMarkData();
|
|
|
|
ScDocument* pDoc = pDocSh->GetDocument();
|
2001-02-14 14:34:08 +00:00
|
|
|
if (bRecord && !pDoc->IsUndoEnabled())
|
|
|
|
bRecord = FALSE;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
ScDocShellModificator aModificator( *pDocSh );
|
|
|
|
|
2002-11-20 13:36:29 +00:00
|
|
|
ScEditableTester aTester( pDoc, nTab, nCol,nRow, nCol,nRow );
|
|
|
|
if (aTester.IsEditable())
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
//
|
|
|
|
// Test auf Attribute
|
|
|
|
//
|
|
|
|
BOOL bSimple = FALSE;
|
|
|
|
BOOL bCommon = FALSE;
|
|
|
|
ScPatternAttr* pCellAttrs = NULL;
|
|
|
|
EditTextObject* pNewData = NULL;
|
|
|
|
String aString;
|
|
|
|
if (bTestSimple) // Testen, ob einfacher String ohne Attribute
|
|
|
|
{
|
|
|
|
const ScPatternAttr* pOldPattern = pDoc->GetPattern( nCol, nRow, nTab );
|
|
|
|
ScTabEditEngine aEngine( *pOldPattern, pDoc->GetEnginePool() );
|
|
|
|
aEngine.SetText(*pData);
|
|
|
|
|
2007-02-27 13:01:43 +00:00
|
|
|
ScEditAttrTester aAttrTester( &aEngine );
|
|
|
|
bSimple = !aAttrTester.NeedsObject();
|
|
|
|
bCommon = aAttrTester.NeedsCellAttr();
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2000-10-13 14:45:51 +00:00
|
|
|
// formulas have to be recognized even if they're formatted
|
|
|
|
// (but commmon attributes are still collected)
|
|
|
|
|
|
|
|
if ( !bSimple && aEngine.GetParagraphCount() == 1 )
|
|
|
|
{
|
|
|
|
String aParStr = aEngine.GetText( (USHORT) 0 );
|
|
|
|
if ( aParStr.GetChar(0) == '=' )
|
|
|
|
bSimple = TRUE;
|
|
|
|
}
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
if (bCommon) // Attribute fuer Tabelle
|
|
|
|
{
|
|
|
|
pCellAttrs = new ScPatternAttr( *pOldPattern );
|
2007-02-27 13:01:43 +00:00
|
|
|
pCellAttrs->GetFromEditItemSet( &aAttrTester.GetAttribs() );
|
2000-09-18 16:07:07 +00:00
|
|
|
//! remove common attributes from EditEngine?
|
|
|
|
}
|
|
|
|
|
|
|
|
if (bSimple)
|
|
|
|
aString = aEngine.GetText();
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// Undo
|
|
|
|
//
|
|
|
|
|
2004-06-04 11:11:19 +00:00
|
|
|
SCTAB nTabCount = pDoc->GetTableCount();
|
|
|
|
SCTAB nSelCount = rMark.GetSelectCount();
|
|
|
|
SCTAB i;
|
2000-09-18 16:07:07 +00:00
|
|
|
ScBaseCell** ppOldCells = NULL;
|
2004-06-04 11:11:19 +00:00
|
|
|
SCTAB* pTabs = NULL;
|
|
|
|
SCTAB nPos = 0;
|
2000-09-18 16:07:07 +00:00
|
|
|
EditTextObject* pUndoData = NULL;
|
|
|
|
if (bRecord && !bSimple)
|
|
|
|
{
|
|
|
|
ppOldCells = new ScBaseCell*[nSelCount];
|
2004-06-04 11:11:19 +00:00
|
|
|
pTabs = new SCTAB[nSelCount];
|
2000-09-18 16:07:07 +00:00
|
|
|
nPos = 0;
|
|
|
|
|
|
|
|
for (i=0; i<nTabCount; i++)
|
|
|
|
if (rMark.GetTableSelect(i))
|
|
|
|
{
|
|
|
|
pTabs[nPos] = i;
|
|
|
|
ScBaseCell* pDocCell;
|
|
|
|
pDoc->GetCell( nCol, nRow, i, pDocCell );
|
2009-03-02 14:19:13 +00:00
|
|
|
ppOldCells[nPos] = pDocCell ? pDocCell->CloneWithoutNote( *pDoc ) : 0;
|
2000-09-18 16:07:07 +00:00
|
|
|
++nPos;
|
|
|
|
}
|
|
|
|
|
|
|
|
DBG_ASSERT( nPos==nSelCount, "nPos!=nSelCount" );
|
|
|
|
|
|
|
|
pUndoData = pData->Clone();
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// Daten eintragen
|
|
|
|
//
|
|
|
|
|
|
|
|
if (bCommon)
|
|
|
|
pDoc->ApplyPattern(nCol,nRow,nTab,*pCellAttrs); //! Undo
|
|
|
|
|
|
|
|
if (bSimple)
|
|
|
|
{
|
|
|
|
if (bCommon)
|
|
|
|
AdjustRowHeight(nRow,nRow);
|
|
|
|
|
|
|
|
EnterData(nCol,nRow,nTab,aString,bRecord);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
for (i=0; i<nTabCount; i++)
|
|
|
|
if (rMark.GetTableSelect(i))
|
|
|
|
pDoc->PutCell( nCol, nRow, i, new ScEditCell( pData, pDoc, NULL ) );
|
|
|
|
|
|
|
|
if ( bRecord )
|
|
|
|
{ // wg. ChangeTrack erst jetzt
|
|
|
|
pDocSh->GetUndoManager()->AddUndoAction(
|
|
|
|
new ScUndoEnterData( pDocSh, nCol, nRow, nTab, nPos, pTabs,
|
|
|
|
ppOldCells, NULL, NULL, String(),
|
|
|
|
pUndoData ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
HideAllCursors();
|
|
|
|
|
|
|
|
AdjustRowHeight(nRow,nRow);
|
|
|
|
|
|
|
|
for (i=0; i<nTabCount; i++)
|
|
|
|
if (rMark.GetTableSelect(i))
|
|
|
|
pDocSh->PostPaintCell( nCol, nRow, i );
|
|
|
|
|
|
|
|
ShowAllCursors();
|
|
|
|
|
|
|
|
pDocSh->UpdateOle(GetViewData());
|
2009-02-17 09:19:30 +00:00
|
|
|
|
|
|
|
// #i97876# Spreadsheet data changes are not notified
|
|
|
|
ScModelObj* pModelObj = ScModelObj::getImplementation( pDocSh->GetModel() );
|
|
|
|
if ( pModelObj && pModelObj->HasChangesListeners() )
|
|
|
|
{
|
|
|
|
ScRangeList aChangeRanges;
|
|
|
|
for ( i = 0; i < nTabCount; ++i )
|
|
|
|
{
|
|
|
|
if ( rMark.GetTableSelect( i ) )
|
|
|
|
{
|
|
|
|
aChangeRanges.Append( ScRange( nCol, nRow, i ) );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
pModelObj->NotifyChanges( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "cell-change" ) ), aChangeRanges );
|
|
|
|
}
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
aModificator.SetDocumentModified();
|
|
|
|
}
|
|
|
|
|
|
|
|
delete pCellAttrs;
|
|
|
|
delete pNewData;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2002-11-20 13:36:29 +00:00
|
|
|
ErrorMessage(aTester.GetMessageId());
|
2000-09-18 16:07:07 +00:00
|
|
|
PaintArea( nCol, nRow, nCol, nRow ); // da steht evtl. noch die Edit-Engine
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void ScViewFunc::EnterDataAtCursor( const String& rString )
|
|
|
|
{
|
2004-06-04 11:11:19 +00:00
|
|
|
SCCOL nPosX = GetViewData()->GetCurX();
|
|
|
|
SCROW nPosY = GetViewData()->GetCurY();
|
|
|
|
SCTAB nTab = GetViewData()->GetTabNo();
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
EnterData( nPosX, nPosY, nTab, rString );
|
|
|
|
}
|
|
|
|
|
|
|
|
void ScViewFunc::EnterMatrix( const String& rString )
|
|
|
|
{
|
|
|
|
ScViewData* pData = GetViewData();
|
|
|
|
const ScMarkData& rMark = pData->GetMarkData();
|
|
|
|
if ( !rMark.IsMarked() && !rMark.IsMultiMarked() )
|
|
|
|
{
|
|
|
|
// nichts markiert -> automatisch Block mit Groesse des Ergebnisses
|
|
|
|
// Formel temporaer berechnen, um an die Groesse heranzukommen
|
|
|
|
|
|
|
|
ScDocument* pDoc = pData->GetDocument();
|
2004-06-04 11:11:19 +00:00
|
|
|
SCCOL nCol = pData->GetCurX();
|
|
|
|
SCROW nRow = pData->GetCurY();
|
|
|
|
SCTAB nTab = pData->GetTabNo();
|
CWS-TOOLING: integrate CWS frmdlg
2008-12-18 09:13:09 +0100 oj r265667 : merge from odff05
2008-12-18 07:58:16 +0100 oj r265658 : #i94555# patch from <regina>, ODFF:
Add GAMMA, CHISQDIST, CHISQINV.
Make the 'cumulative' parameter of GAMMADIST optional.
Adapt the domain of CHIDIST to allow negative x.
Remove the constraint "degrees of freedom < 1.0E5" from CHIDIST and CHIINV.
Plus a mechanism to write the now optional parameter of GAMMADIST to PODF and
ODFF if omitted, for backwards compatibility.
2008-12-15 14:06:11 +0100 oj r265490 : CWS-TOOLING: rebase CWS frmdlg to trunk@264807 (milestone: DEV300:m37)
2008-12-15 13:55:28 +0100 oj r265488 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:55:07 +0100 oj r265487 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:54:48 +0100 oj r265486 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:54:36 +0100 oj r265485 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:54:24 +0100 oj r265484 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:48:11 +0100 oj r265483 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:31:12 +0100 oj r265479 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:13:58 +0100 oj r265477 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:10:09 +0100 oj r265476 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:05:11 +0100 oj r265475 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 10:47:17 +0100 oj r265467 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 10:46:19 +0100 oj r265466 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 10:45:47 +0100 oj r265465 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 07:35:07 +0100 oj r265458 : add dependency to formula
2008-12-15 07:34:24 +0100 oj r265457 : add dependency to formula
2008-12-12 13:22:00 +0100 msc r265413 : #i97089#
2008-12-12 13:20:25 +0100 msc r265412 : #i97089#
2008-12-12 12:35:12 +0100 msc r265406 : #i97089#
2008-12-12 12:34:16 +0100 msc r265405 : #i97089#
2008-12-12 12:33:05 +0100 msc r265404 : #i97089#
2008-12-12 12:31:11 +0100 msc r265403 : #i97089#
2008-12-08 11:59:10 +0100 oj r264981 : insert RTL_LOG
2008-12-08 11:50:17 +0100 oj r264980 : some small changes
2008-12-05 12:57:57 +0100 oj r264902 : eof changed
2008-12-05 12:56:46 +0100 oj r264901 : eof changed
2008-12-05 12:28:47 +0100 oj r264899 : wrong var used
2008-12-05 10:08:57 +0100 oj r264890 : token order reversed
2008-12-04 13:49:22 +0100 oc r264843 : #i96688: Adapt autotests because of outsourced functionwizard
2008-12-04 13:45:27 +0100 oc r264842 : #i96688: Adapt autotests because of outsourced functionwizard
2008-12-04 13:42:54 +0100 oc r264841 : #i96688: Adapt autotests because of outsourced functionwizard
2008-12-04 13:37:41 +0100 oc r264840 : #i96688: Adapt autotests because of outsourced functionwizard
2008-12-04 13:34:11 +0100 oc r264839 : #i96688: Adapt autotests because of outsourced functionwizard
2008-12-04 12:35:31 +0100 oj r264835 : new help ids for struct and function tabpage
2008-12-04 12:00:35 +0100 oj r264828 : set explicit help id
2008-12-03 14:53:27 +0100 oj r264786 : #i96845# change ref button
2008-12-03 14:51:49 +0100 oj r264785 : #i96845# change ref button
2008-12-03 08:51:57 +0100 oj r264746 : convert dos to unix lineends
2008-12-03 08:50:45 +0100 oj r264745 : convert dos to unix lineends
2008-12-03 08:50:05 +0100 oj r264744 : convert dos to unix lineends
2008-12-02 12:28:33 +0100 oj r264686 : clear help text when new helpid is set
2008-12-02 12:28:02 +0100 oj r264685 : set help id for listbox category
2008-12-02 07:15:56 +0100 oj r264655 : remove define to auto generate help ids
2008-12-01 14:36:43 +0100 oj r264604 : use temp var
2008-12-01 14:18:31 +0100 oj r264601 : moved ScJumpToken to formula
2008-12-01 14:18:11 +0100 oj r264600 : moved ScJumpToken to formula
2008-12-01 14:14:35 +0100 oj r264599 : moved ScJumpToken from sc
2008-12-01 10:48:51 +0100 oj r264589 : change quickhelptext from Shrink to Select
2008-12-01 10:28:41 +0100 oj r264588 : fix opcode data, has to be Any.Void
2008-11-28 11:16:48 +0100 oj r264532 : add help ids
2008-11-28 10:16:56 +0100 oj r264529 : set help id
2008-11-28 10:16:43 +0100 oj r264528 : set help id
2008-11-26 13:55:04 +0100 oj r264381 : #94535# use of optional instead of deleting a string myself and some small changes
2008-11-26 09:53:20 +0100 oj r264346 : compile error with debug/without debug
2008-11-25 07:41:28 +0100 oj r264271 : put static into the method which make use of them
2008-11-24 08:16:07 +0100 oj r264196 : removed not needed classes for op code
2008-11-24 08:13:44 +0100 oj r264195 : removed not needed classes for op code
2008-11-21 14:05:53 +0100 oj r264135 : make GetOpCode inline
2008-11-21 12:35:27 +0100 oj r264124 : hold symbols
2008-11-20 09:27:27 +0100 oj r264028 : merged code from DEV300_m35 which got lost
2008-11-19 20:42:12 +0100 oj r264022 : more changes for formula dialog remove
2008-11-19 20:37:41 +0100 oj r264021 : removed unused var
2008-11-19 20:35:35 +0100 oj r264020 : some more changes at token
2008-11-19 10:59:47 +0100 oj r263967 : deleted
2008-11-19 10:58:24 +0100 oj r263966 : add forui and for res files
2008-11-18 15:27:36 +0100 oj r263777 : unused para removed
2008-11-18 15:23:23 +0100 oj r263775 : add insert button to add field dlg
2008-11-18 13:39:53 +0100 oj r263764 : enable the formula dialog as well for conditional print as for conditional formatting
2008-11-18 12:03:25 +0100 oj r263760 : rename isRef in IsRef
2008-11-17 11:46:16 +0100 oj r263711 : patches for function handling
2008-11-17 11:36:22 +0100 oj r263710 : add new for forui and res file
2008-11-17 09:21:12 +0100 oj r263704 : patches for some resource for libformula
2008-11-15 12:45:30 +0100 oj r263701 : changes for formula editor extraction
2008-11-07 08:23:27 +0100 oj r263416 : merge from DEV300:m35
2008-11-07 08:22:35 +0100 oj r263415 : merge from DEV300:m35
2008-11-07 08:22:16 +0100 oj r263414 : merge from DEV300:m35
2008-11-07 08:21:41 +0100 oj r263413 : merge from DEV300:m35
2008-11-07 08:21:31 +0100 oj r263412 : merge from DEV300:m35
2008-11-07 08:20:38 +0100 oj r263411 : merge from DEV300:m35
2008-11-07 08:20:00 +0100 oj r263410 : merge from DEV300:m35
2008-11-07 08:18:50 +0100 oj r263409 : merge from DEV300:m35
2008-11-07 08:18:19 +0100 oj r263408 : merge from DEV300:m35
2008-11-07 08:10:27 +0100 oj r263407 : merge from DEV300:m35
2008-10-21 07:43:46 +0200 oj r262560 : some compile errors resolved
2008-10-17 16:40:01 +0200 oj r262291 : dep for 1st target
2008-10-07 10:08:39 +0200 oj r262077 : copy
2008-10-07 09:45:31 +0200 oj r262076 : #i94535#
2008-10-07 09:44:26 +0200 oj r262075 : #i94535# new base class
2008-10-07 09:43:21 +0200 oj r262074 : moved to formula
2008-10-07 09:41:51 +0200 oj r262073 : new images
2008-10-07 09:03:01 +0200 oj r262072 : new ids for formula
2008-10-02 08:46:27 +0200 oj r262024 : #i94535# move the formula compiler to formula
2008-10-02 08:08:54 +0200 oj r262023 : #i94535#
2008-10-02 08:06:28 +0200 oj r262022 : #i94535#
2008-10-02 08:05:52 +0200 oj r262021 : #i94535#
2008-10-01 17:15:29 +0200 oj r262014 : #i94535#
2008-10-01 17:12:40 +0200 oj r262013 : new module formula
2008-10-01 17:04:55 +0200 oj r262012 : #i94535#
2008-10-01 16:49:03 +0200 oj r262010 : #i94535#
2008-10-01 16:46:59 +0200 oj r262009 : #i94535#
2009-01-08 10:47:13 +00:00
|
|
|
ScFormulaCell aFormCell( pDoc, ScAddress(nCol,nRow,nTab), rString,formula::FormulaGrammar::GRAM_DEFAULT, MM_FORMULA );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2004-06-04 11:11:19 +00:00
|
|
|
SCSIZE nSizeX;
|
|
|
|
SCSIZE nSizeY;
|
2000-09-18 16:07:07 +00:00
|
|
|
aFormCell.GetResultDimensions( nSizeX, nSizeY );
|
2007-02-27 13:01:43 +00:00
|
|
|
if ( nSizeX != 0 && nSizeY != 0 &&
|
|
|
|
nCol+nSizeX-1 <= sal::static_int_cast<SCSIZE>(MAXCOL) &&
|
|
|
|
nRow+nSizeY-1 <= sal::static_int_cast<SCSIZE>(MAXROW) )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2007-02-27 13:01:43 +00:00
|
|
|
ScRange aResult( nCol, nRow, nTab,
|
|
|
|
sal::static_int_cast<SCCOL>(nCol+nSizeX-1),
|
|
|
|
sal::static_int_cast<SCROW>(nRow+nSizeY-1), nTab );
|
2000-09-18 16:07:07 +00:00
|
|
|
MarkRange( aResult, FALSE );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
ScRange aRange;
|
2008-04-18 10:50:48 +00:00
|
|
|
if (pData->GetSimpleArea(aRange) == SC_MARK_SIMPLE)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
ScDocShell* pDocSh = pData->GetDocShell();
|
CWS-TOOLING: integrate CWS frmdlg
2008-12-18 09:13:09 +0100 oj r265667 : merge from odff05
2008-12-18 07:58:16 +0100 oj r265658 : #i94555# patch from <regina>, ODFF:
Add GAMMA, CHISQDIST, CHISQINV.
Make the 'cumulative' parameter of GAMMADIST optional.
Adapt the domain of CHIDIST to allow negative x.
Remove the constraint "degrees of freedom < 1.0E5" from CHIDIST and CHIINV.
Plus a mechanism to write the now optional parameter of GAMMADIST to PODF and
ODFF if omitted, for backwards compatibility.
2008-12-15 14:06:11 +0100 oj r265490 : CWS-TOOLING: rebase CWS frmdlg to trunk@264807 (milestone: DEV300:m37)
2008-12-15 13:55:28 +0100 oj r265488 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:55:07 +0100 oj r265487 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:54:48 +0100 oj r265486 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:54:36 +0100 oj r265485 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:54:24 +0100 oj r265484 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:48:11 +0100 oj r265483 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:31:12 +0100 oj r265479 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:13:58 +0100 oj r265477 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:10:09 +0100 oj r265476 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 13:05:11 +0100 oj r265475 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 10:47:17 +0100 oj r265467 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 10:46:19 +0100 oj r265466 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 10:45:47 +0100 oj r265465 : CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'
CWS: frmdlg
New MWS: DEV300
New milestone: m37
2008-12-15 07:35:07 +0100 oj r265458 : add dependency to formula
2008-12-15 07:34:24 +0100 oj r265457 : add dependency to formula
2008-12-12 13:22:00 +0100 msc r265413 : #i97089#
2008-12-12 13:20:25 +0100 msc r265412 : #i97089#
2008-12-12 12:35:12 +0100 msc r265406 : #i97089#
2008-12-12 12:34:16 +0100 msc r265405 : #i97089#
2008-12-12 12:33:05 +0100 msc r265404 : #i97089#
2008-12-12 12:31:11 +0100 msc r265403 : #i97089#
2008-12-08 11:59:10 +0100 oj r264981 : insert RTL_LOG
2008-12-08 11:50:17 +0100 oj r264980 : some small changes
2008-12-05 12:57:57 +0100 oj r264902 : eof changed
2008-12-05 12:56:46 +0100 oj r264901 : eof changed
2008-12-05 12:28:47 +0100 oj r264899 : wrong var used
2008-12-05 10:08:57 +0100 oj r264890 : token order reversed
2008-12-04 13:49:22 +0100 oc r264843 : #i96688: Adapt autotests because of outsourced functionwizard
2008-12-04 13:45:27 +0100 oc r264842 : #i96688: Adapt autotests because of outsourced functionwizard
2008-12-04 13:42:54 +0100 oc r264841 : #i96688: Adapt autotests because of outsourced functionwizard
2008-12-04 13:37:41 +0100 oc r264840 : #i96688: Adapt autotests because of outsourced functionwizard
2008-12-04 13:34:11 +0100 oc r264839 : #i96688: Adapt autotests because of outsourced functionwizard
2008-12-04 12:35:31 +0100 oj r264835 : new help ids for struct and function tabpage
2008-12-04 12:00:35 +0100 oj r264828 : set explicit help id
2008-12-03 14:53:27 +0100 oj r264786 : #i96845# change ref button
2008-12-03 14:51:49 +0100 oj r264785 : #i96845# change ref button
2008-12-03 08:51:57 +0100 oj r264746 : convert dos to unix lineends
2008-12-03 08:50:45 +0100 oj r264745 : convert dos to unix lineends
2008-12-03 08:50:05 +0100 oj r264744 : convert dos to unix lineends
2008-12-02 12:28:33 +0100 oj r264686 : clear help text when new helpid is set
2008-12-02 12:28:02 +0100 oj r264685 : set help id for listbox category
2008-12-02 07:15:56 +0100 oj r264655 : remove define to auto generate help ids
2008-12-01 14:36:43 +0100 oj r264604 : use temp var
2008-12-01 14:18:31 +0100 oj r264601 : moved ScJumpToken to formula
2008-12-01 14:18:11 +0100 oj r264600 : moved ScJumpToken to formula
2008-12-01 14:14:35 +0100 oj r264599 : moved ScJumpToken from sc
2008-12-01 10:48:51 +0100 oj r264589 : change quickhelptext from Shrink to Select
2008-12-01 10:28:41 +0100 oj r264588 : fix opcode data, has to be Any.Void
2008-11-28 11:16:48 +0100 oj r264532 : add help ids
2008-11-28 10:16:56 +0100 oj r264529 : set help id
2008-11-28 10:16:43 +0100 oj r264528 : set help id
2008-11-26 13:55:04 +0100 oj r264381 : #94535# use of optional instead of deleting a string myself and some small changes
2008-11-26 09:53:20 +0100 oj r264346 : compile error with debug/without debug
2008-11-25 07:41:28 +0100 oj r264271 : put static into the method which make use of them
2008-11-24 08:16:07 +0100 oj r264196 : removed not needed classes for op code
2008-11-24 08:13:44 +0100 oj r264195 : removed not needed classes for op code
2008-11-21 14:05:53 +0100 oj r264135 : make GetOpCode inline
2008-11-21 12:35:27 +0100 oj r264124 : hold symbols
2008-11-20 09:27:27 +0100 oj r264028 : merged code from DEV300_m35 which got lost
2008-11-19 20:42:12 +0100 oj r264022 : more changes for formula dialog remove
2008-11-19 20:37:41 +0100 oj r264021 : removed unused var
2008-11-19 20:35:35 +0100 oj r264020 : some more changes at token
2008-11-19 10:59:47 +0100 oj r263967 : deleted
2008-11-19 10:58:24 +0100 oj r263966 : add forui and for res files
2008-11-18 15:27:36 +0100 oj r263777 : unused para removed
2008-11-18 15:23:23 +0100 oj r263775 : add insert button to add field dlg
2008-11-18 13:39:53 +0100 oj r263764 : enable the formula dialog as well for conditional print as for conditional formatting
2008-11-18 12:03:25 +0100 oj r263760 : rename isRef in IsRef
2008-11-17 11:46:16 +0100 oj r263711 : patches for function handling
2008-11-17 11:36:22 +0100 oj r263710 : add new for forui and res file
2008-11-17 09:21:12 +0100 oj r263704 : patches for some resource for libformula
2008-11-15 12:45:30 +0100 oj r263701 : changes for formula editor extraction
2008-11-07 08:23:27 +0100 oj r263416 : merge from DEV300:m35
2008-11-07 08:22:35 +0100 oj r263415 : merge from DEV300:m35
2008-11-07 08:22:16 +0100 oj r263414 : merge from DEV300:m35
2008-11-07 08:21:41 +0100 oj r263413 : merge from DEV300:m35
2008-11-07 08:21:31 +0100 oj r263412 : merge from DEV300:m35
2008-11-07 08:20:38 +0100 oj r263411 : merge from DEV300:m35
2008-11-07 08:20:00 +0100 oj r263410 : merge from DEV300:m35
2008-11-07 08:18:50 +0100 oj r263409 : merge from DEV300:m35
2008-11-07 08:18:19 +0100 oj r263408 : merge from DEV300:m35
2008-11-07 08:10:27 +0100 oj r263407 : merge from DEV300:m35
2008-10-21 07:43:46 +0200 oj r262560 : some compile errors resolved
2008-10-17 16:40:01 +0200 oj r262291 : dep for 1st target
2008-10-07 10:08:39 +0200 oj r262077 : copy
2008-10-07 09:45:31 +0200 oj r262076 : #i94535#
2008-10-07 09:44:26 +0200 oj r262075 : #i94535# new base class
2008-10-07 09:43:21 +0200 oj r262074 : moved to formula
2008-10-07 09:41:51 +0200 oj r262073 : new images
2008-10-07 09:03:01 +0200 oj r262072 : new ids for formula
2008-10-02 08:46:27 +0200 oj r262024 : #i94535# move the formula compiler to formula
2008-10-02 08:08:54 +0200 oj r262023 : #i94535#
2008-10-02 08:06:28 +0200 oj r262022 : #i94535#
2008-10-02 08:05:52 +0200 oj r262021 : #i94535#
2008-10-01 17:15:29 +0200 oj r262014 : #i94535#
2008-10-01 17:12:40 +0200 oj r262013 : new module formula
2008-10-01 17:04:55 +0200 oj r262012 : #i94535#
2008-10-01 16:49:03 +0200 oj r262010 : #i94535#
2008-10-01 16:46:59 +0200 oj r262009 : #i94535#
2009-01-08 10:47:13 +00:00
|
|
|
BOOL bSuccess = pDocSh->GetDocFunc().EnterMatrix( aRange, &rMark, NULL, rString, FALSE, FALSE,formula::FormulaGrammar::GRAM_DEFAULT );
|
2000-09-18 16:07:07 +00:00
|
|
|
if (bSuccess)
|
|
|
|
pDocSh->UpdateOle(GetViewData());
|
|
|
|
}
|
|
|
|
else
|
|
|
|
ErrorMessage(STR_NOMULTISELECT);
|
|
|
|
}
|
|
|
|
|
2000-11-24 17:07:45 +00:00
|
|
|
BYTE ScViewFunc::GetSelectionScriptType()
|
|
|
|
{
|
|
|
|
BYTE nScript = 0;
|
|
|
|
|
|
|
|
ScDocument* pDoc = GetViewData()->GetDocument();
|
|
|
|
const ScMarkData& rMark = GetViewData()->GetMarkData();
|
|
|
|
if ( !rMark.IsMarked() && !rMark.IsMultiMarked() )
|
|
|
|
{
|
|
|
|
// no selection -> cursor
|
|
|
|
|
|
|
|
nScript = pDoc->GetScriptType( GetViewData()->GetCurX(),
|
|
|
|
GetViewData()->GetCurY(), GetViewData()->GetTabNo() );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ScRangeList aRanges;
|
|
|
|
rMark.FillRangeListWithMarks( &aRanges, FALSE );
|
|
|
|
ULONG nCount = aRanges.Count();
|
|
|
|
for (ULONG i=0; i<nCount; i++)
|
|
|
|
{
|
|
|
|
ScRange aRange = *aRanges.GetObject(i);
|
|
|
|
ScCellIterator aIter( pDoc, aRange );
|
|
|
|
ScBaseCell* pCell = aIter.GetFirst();
|
|
|
|
while ( pCell )
|
|
|
|
{
|
|
|
|
nScript |= pDoc->GetScriptType( aIter.GetCol(), aIter.GetRow(), aIter.GetTab(), pCell );
|
|
|
|
pCell = aIter.GetNext();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (nScript == 0)
|
2001-11-12 19:04:36 +00:00
|
|
|
nScript = ScGlobal::GetDefaultScriptType();
|
2000-11-24 17:07:45 +00:00
|
|
|
|
|
|
|
return nScript;
|
|
|
|
}
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
const ScPatternAttr* ScViewFunc::GetSelectionPattern()
|
|
|
|
{
|
2004-09-09 08:31:12 +00:00
|
|
|
// Don't use UnmarkFiltered in slot state functions, for performance reasons.
|
|
|
|
// The displayed state is always that of the whole selection including filtered rows.
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
const ScMarkData& rMark = GetViewData()->GetMarkData();
|
|
|
|
ScDocument* pDoc = GetViewData()->GetDocument();
|
|
|
|
if ( rMark.IsMarked() || rMark.IsMultiMarked() )
|
|
|
|
{
|
2004-09-09 08:31:12 +00:00
|
|
|
// MarkToMulti is no longer necessary for pDoc->GetSelectionPattern
|
2000-09-18 16:07:07 +00:00
|
|
|
const ScPatternAttr* pAttr = pDoc->GetSelectionPattern( rMark );
|
|
|
|
return pAttr;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2004-06-04 11:11:19 +00:00
|
|
|
SCCOL nCol = GetViewData()->GetCurX();
|
|
|
|
SCROW nRow = GetViewData()->GetCurY();
|
|
|
|
SCTAB nTab = GetViewData()->GetTabNo();
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2004-09-09 08:31:12 +00:00
|
|
|
ScMarkData aTempMark( rMark ); // copy sheet selection
|
2000-09-18 16:07:07 +00:00
|
|
|
aTempMark.SetMarkArea( ScRange( nCol, nRow, nTab ) );
|
|
|
|
const ScPatternAttr* pAttr = pDoc->GetSelectionPattern( aTempMark );
|
|
|
|
return pAttr;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void ScViewFunc::GetSelectionFrame( SvxBoxItem& rLineOuter,
|
|
|
|
SvxBoxInfoItem& rLineInner )
|
|
|
|
{
|
|
|
|
ScDocument* pDoc = GetViewData()->GetDocument();
|
2002-09-05 09:31:03 +00:00
|
|
|
const ScMarkData& rMark = GetViewData()->GetMarkData();
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if ( rMark.IsMarked() || rMark.IsMultiMarked() )
|
|
|
|
{
|
2002-09-05 09:31:03 +00:00
|
|
|
if ( rMark.IsMultiMarked() )
|
|
|
|
{
|
|
|
|
ScMarkData aNewMark( rMark ); // use local copy for MarkToSimple
|
|
|
|
aNewMark.MarkToSimple(); // simple block is needed for GetSelectionFrame
|
|
|
|
pDoc->GetSelectionFrame( aNewMark, rLineOuter, rLineInner );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
pDoc->GetSelectionFrame( rMark, rLineOuter, rLineInner );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
const ScPatternAttr* pAttrs =
|
|
|
|
pDoc->GetPattern( GetViewData()->GetCurX(),
|
|
|
|
GetViewData()->GetCurY(),
|
|
|
|
GetViewData()->GetTabNo() );
|
|
|
|
|
|
|
|
rLineOuter = (const SvxBoxItem&) (pAttrs->GetItem( ATTR_BORDER ));
|
|
|
|
rLineInner = (const SvxBoxInfoItem&)(pAttrs->GetItem( ATTR_BORDER_INNER ));
|
|
|
|
rLineInner.SetTable(FALSE);
|
2004-08-02 16:07:33 +00:00
|
|
|
rLineInner.SetDist(TRUE);
|
2000-09-18 16:07:07 +00:00
|
|
|
rLineInner.SetMinDist(FALSE);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// Attribute anwenden - Undo OK
|
|
|
|
//
|
|
|
|
// kompletter Set ( ATTR_STARTINDEX, ATTR_ENDINDEX )
|
|
|
|
//
|
|
|
|
|
|
|
|
void ScViewFunc::ApplyAttributes( const SfxItemSet* pDialogSet,
|
|
|
|
const SfxItemSet* pOldSet,
|
|
|
|
BOOL bRecord )
|
|
|
|
{
|
|
|
|
// nur wegen Matrix nicht editierbar? Attribute trotzdem ok
|
|
|
|
BOOL bOnlyNotBecauseOfMatrix;
|
|
|
|
if ( !SelectionEditable( &bOnlyNotBecauseOfMatrix ) && !bOnlyNotBecauseOfMatrix )
|
|
|
|
{
|
|
|
|
ErrorMessage(STR_PROTECTIONERR);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
ScPatternAttr aOldAttrs( new SfxItemSet(*pOldSet) );
|
|
|
|
ScPatternAttr aNewAttrs( new SfxItemSet(*pDialogSet) );
|
|
|
|
aNewAttrs.DeleteUnchanged( &aOldAttrs );
|
|
|
|
|
2001-01-11 17:31:08 +00:00
|
|
|
if ( pDialogSet->GetItemState( ATTR_VALUE_FORMAT ) == SFX_ITEM_SET )
|
|
|
|
{ // #82521# don't reset to default SYSTEM GENERAL if not intended
|
2005-12-14 14:12:16 +00:00
|
|
|
sal_uInt32 nOldFormat =
|
2001-01-11 17:31:08 +00:00
|
|
|
((const SfxUInt32Item&)pOldSet->Get( ATTR_VALUE_FORMAT )).GetValue();
|
2005-12-14 14:12:16 +00:00
|
|
|
sal_uInt32 nNewFormat =
|
2001-01-11 17:31:08 +00:00
|
|
|
((const SfxUInt32Item&)pDialogSet->Get( ATTR_VALUE_FORMAT )).GetValue();
|
|
|
|
if ( nNewFormat != nOldFormat )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2001-01-11 17:31:08 +00:00
|
|
|
SvNumberFormatter* pFormatter =
|
|
|
|
GetViewData()->GetDocument()->GetFormatTable();
|
|
|
|
const SvNumberformat* pOldEntry = pFormatter->GetEntry( nOldFormat );
|
|
|
|
LanguageType eOldLang =
|
|
|
|
pOldEntry ? pOldEntry->GetLanguage() : LANGUAGE_DONTKNOW;
|
|
|
|
const SvNumberformat* pNewEntry = pFormatter->GetEntry( nNewFormat );
|
|
|
|
LanguageType eNewLang =
|
|
|
|
pNewEntry ? pNewEntry->GetLanguage() : LANGUAGE_DONTKNOW;
|
|
|
|
if ( eNewLang != eOldLang )
|
|
|
|
{
|
|
|
|
aNewAttrs.GetItemSet().Put(
|
|
|
|
SvxLanguageItem( eNewLang, ATTR_LANGUAGE_FORMAT ) );
|
|
|
|
|
|
|
|
// #40606# nur die Sprache geaendert -> Zahlformat-Attribut nicht anfassen
|
2005-12-14 14:12:16 +00:00
|
|
|
sal_uInt32 nNewMod = nNewFormat % SV_COUNTRY_LANGUAGE_OFFSET;
|
2001-01-11 17:31:08 +00:00
|
|
|
if ( nNewMod == ( nOldFormat % SV_COUNTRY_LANGUAGE_OFFSET ) &&
|
|
|
|
nNewMod <= SV_MAX_ANZ_STANDARD_FORMATE )
|
|
|
|
aNewAttrs.GetItemSet().ClearItem( ATTR_VALUE_FORMAT );
|
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const SvxBoxItem* pOldOuter = (const SvxBoxItem*) &pOldSet->Get( ATTR_BORDER );
|
|
|
|
const SvxBoxItem* pNewOuter = (const SvxBoxItem*) &pDialogSet->Get( ATTR_BORDER );
|
|
|
|
const SvxBoxInfoItem* pOldInner = (const SvxBoxInfoItem*) &pOldSet->Get( ATTR_BORDER_INNER );
|
|
|
|
const SvxBoxInfoItem* pNewInner = (const SvxBoxInfoItem*) &pDialogSet->Get( ATTR_BORDER_INNER );
|
|
|
|
SfxItemSet& rNewSet = aNewAttrs.GetItemSet();
|
|
|
|
SfxItemPool* pNewPool = rNewSet.GetPool();
|
|
|
|
|
|
|
|
pNewPool->Put( *pNewOuter ); // noch nicht loeschen
|
|
|
|
pNewPool->Put( *pNewInner );
|
|
|
|
rNewSet.ClearItem( ATTR_BORDER );
|
|
|
|
rNewSet.ClearItem( ATTR_BORDER_INNER );
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Feststellen, ob Rahmenattribute zu setzen sind:
|
|
|
|
* 1. Neu != Alt
|
|
|
|
* 2. Ist eine der Linien nicht-DontCare (seit 238.f: IsxxValid())
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
BOOL bFrame = (pDialogSet->GetItemState( ATTR_BORDER ) != SFX_ITEM_DEFAULT)
|
|
|
|
|| (pDialogSet->GetItemState( ATTR_BORDER_INNER ) != SFX_ITEM_DEFAULT);
|
|
|
|
|
|
|
|
if ( pNewOuter==pOldOuter && pNewInner==pOldInner )
|
|
|
|
bFrame = FALSE;
|
|
|
|
|
|
|
|
// das sollte doch der Pool abfangen: ?!??!??
|
|
|
|
|
|
|
|
if ( bFrame && pNewOuter && pNewInner )
|
|
|
|
if ( *pNewOuter == *pOldOuter && *pNewInner == *pOldInner )
|
|
|
|
bFrame = FALSE;
|
|
|
|
|
|
|
|
if ( pNewInner )
|
|
|
|
{
|
|
|
|
bFrame = bFrame
|
|
|
|
&& ( pNewInner->IsValid(VALID_LEFT)
|
|
|
|
|| pNewInner->IsValid(VALID_RIGHT)
|
|
|
|
|| pNewInner->IsValid(VALID_TOP)
|
|
|
|
|| pNewInner->IsValid(VALID_BOTTOM)
|
|
|
|
|| pNewInner->IsValid(VALID_HORI)
|
|
|
|
|| pNewInner->IsValid(VALID_VERT) );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
bFrame = FALSE;
|
|
|
|
|
|
|
|
if (!bFrame)
|
|
|
|
ApplySelectionPattern( aNewAttrs, bRecord ); // nur normale
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// wenn neue Items Default-Items sind, so muessen die
|
|
|
|
// alten Items geputtet werden:
|
|
|
|
|
2003-03-26 17:07:02 +00:00
|
|
|
BOOL bDefNewOuter = ( SFX_ITEMS_STATICDEFAULT == pNewOuter->GetKind() );
|
|
|
|
BOOL bDefNewInner = ( SFX_ITEMS_STATICDEFAULT == pNewInner->GetKind() );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
ApplyPatternLines( aNewAttrs,
|
|
|
|
bDefNewOuter ? pOldOuter : pNewOuter,
|
|
|
|
bDefNewInner ? pOldInner : pNewInner,
|
|
|
|
bRecord );
|
|
|
|
}
|
|
|
|
|
|
|
|
pNewPool->Remove( *pNewOuter ); // freigeben
|
|
|
|
pNewPool->Remove( *pNewInner );
|
|
|
|
|
|
|
|
// Hoehen anpassen
|
|
|
|
AdjustBlockHeight();
|
|
|
|
|
|
|
|
// CellContentChanged wird von ApplySelectionPattern / ApplyPatternLines gerufen
|
|
|
|
}
|
|
|
|
|
|
|
|
void ScViewFunc::ApplyAttr( const SfxPoolItem& rAttrItem )
|
|
|
|
{
|
|
|
|
// nur wegen Matrix nicht editierbar? Attribute trotzdem ok
|
|
|
|
BOOL bOnlyNotBecauseOfMatrix;
|
|
|
|
if ( !SelectionEditable( &bOnlyNotBecauseOfMatrix ) && !bOnlyNotBecauseOfMatrix )
|
|
|
|
{
|
|
|
|
ErrorMessage(STR_PROTECTIONERR);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
ScPatternAttr aNewAttrs( new SfxItemSet( *GetViewData()->GetDocument()->GetPool(),
|
|
|
|
ATTR_PATTERN_START, ATTR_PATTERN_END ) );
|
|
|
|
|
|
|
|
aNewAttrs.GetItemSet().Put( rAttrItem );
|
|
|
|
// Wenn Ausrichtung eingestellt wird (ueber Buttons), immer Einzug 0
|
|
|
|
if ( rAttrItem.Which() == ATTR_HOR_JUSTIFY )
|
|
|
|
aNewAttrs.GetItemSet().Put( SfxUInt16Item( ATTR_INDENT, 0 ) );
|
|
|
|
ApplySelectionPattern( aNewAttrs );
|
|
|
|
|
|
|
|
AdjustBlockHeight();
|
|
|
|
|
|
|
|
// CellContentChanged wird von ApplySelectionPattern gerufen
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Pattern und Rahmen
|
|
|
|
|
|
|
|
void ScViewFunc::ApplyPatternLines( const ScPatternAttr& rAttr, const SvxBoxItem* pNewOuter,
|
|
|
|
const SvxBoxInfoItem* pNewInner, BOOL bRecord )
|
|
|
|
{
|
|
|
|
ScDocument* pDoc = GetViewData()->GetDocument();
|
|
|
|
ScMarkData& rMark = GetViewData()->GetMarkData();
|
2001-02-14 14:34:08 +00:00
|
|
|
if (bRecord && !pDoc->IsUndoEnabled())
|
|
|
|
bRecord = FALSE;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2004-06-04 11:11:19 +00:00
|
|
|
SCCOL nStartCol;
|
|
|
|
SCROW nStartRow;
|
|
|
|
SCTAB nStartTab;
|
|
|
|
SCCOL nEndCol;
|
|
|
|
SCROW nEndRow;
|
|
|
|
SCTAB nEndTab;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2008-04-18 10:50:48 +00:00
|
|
|
ScMarkType eMarkType = GetViewData()->GetSimpleArea( nStartCol, nStartRow,
|
|
|
|
nStartTab, nEndCol, nEndRow, nEndTab);
|
|
|
|
if (eMarkType == SC_MARK_SIMPLE || eMarkType == SC_MARK_SIMPLE_FILTERED)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2004-09-09 08:31:12 +00:00
|
|
|
bool bChangeSelection = false;
|
|
|
|
ScRange aMarkRange( nStartCol, nStartRow, nStartTab, nEndCol, nEndRow, nEndTab );
|
2008-04-18 10:50:48 +00:00
|
|
|
if ( eMarkType == SC_MARK_SIMPLE_FILTERED )
|
2004-09-09 08:31:12 +00:00
|
|
|
{
|
|
|
|
ScMarkData aVisibleMark( rMark );
|
|
|
|
ScViewUtil::UnmarkFiltered( aVisibleMark, pDoc );
|
|
|
|
ScRangeList aRangeList;
|
|
|
|
aVisibleMark.FillRangeListWithMarks( &aRangeList, FALSE );
|
|
|
|
if ( aRangeList.Count() > 0 )
|
|
|
|
{
|
|
|
|
// use the first range of visible cells
|
|
|
|
// (might also show an error message instead, or, later, allow multiple ranges)
|
|
|
|
|
|
|
|
aMarkRange = *aRangeList.GetObject(0);
|
|
|
|
}
|
|
|
|
else // all hidden -> cursor position
|
|
|
|
{
|
|
|
|
aMarkRange.aStart.SetCol(GetViewData()->GetCurX());
|
|
|
|
aMarkRange.aStart.SetRow(GetViewData()->GetCurY());
|
|
|
|
aMarkRange.aStart.SetTab(GetViewData()->GetTabNo());
|
|
|
|
aMarkRange.aEnd = aMarkRange.aStart;
|
|
|
|
}
|
|
|
|
aMarkRange.GetVars( nStartCol, nStartRow, nStartTab, nEndCol, nEndRow, nEndTab );
|
|
|
|
bChangeSelection = true; // change the selection to only the affected cells
|
|
|
|
}
|
|
|
|
|
2002-09-05 09:31:03 +00:00
|
|
|
rMark.MarkToSimple(); // not done by GetSimpleArea anymore
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
ScDocShell* pDocSh = GetViewData()->GetDocShell();
|
|
|
|
|
|
|
|
ScDocShellModificator aModificator( *pDocSh );
|
|
|
|
|
2004-09-09 08:31:12 +00:00
|
|
|
if (!rMark.IsMarked() || bChangeSelection)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
DoneBlockMode();
|
|
|
|
InitOwnBlockMode();
|
|
|
|
rMark.SetMarkArea( ScRange( nStartCol, nStartRow, nStartTab, nEndCol, nEndRow, nEndTab ) );
|
2008-02-19 14:42:20 +00:00
|
|
|
MarkDataChanged();
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (bRecord)
|
|
|
|
{
|
2004-06-04 11:11:19 +00:00
|
|
|
SCTAB nTabCount = pDoc->GetTableCount();
|
2000-09-18 16:07:07 +00:00
|
|
|
ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
|
|
|
|
pUndoDoc->InitUndo( pDoc, nStartTab, nStartTab );
|
2004-06-04 11:11:19 +00:00
|
|
|
for (SCTAB i=0; i<nTabCount; i++)
|
2000-09-18 16:07:07 +00:00
|
|
|
if (i != nStartTab && rMark.GetTableSelect(i))
|
|
|
|
pUndoDoc->AddUndoTab( i, i );
|
|
|
|
pDoc->CopyToDocument( nStartCol, nStartRow, 0, nEndCol, nEndRow, nTabCount-1,
|
|
|
|
IDF_ATTRIB, FALSE, pUndoDoc );
|
|
|
|
|
|
|
|
pDocSh->GetUndoManager()->AddUndoAction(
|
|
|
|
new ScUndoSelectionAttr( pDocSh, rMark,
|
|
|
|
nStartCol, nStartRow, nStartTab,
|
|
|
|
nEndCol, nEndRow, nEndTab,
|
|
|
|
pUndoDoc, FALSE, &rAttr, pNewOuter, pNewInner ) );
|
|
|
|
}
|
|
|
|
|
2004-02-03 12:08:40 +00:00
|
|
|
USHORT nExt = SC_PF_TESTMERGE;
|
|
|
|
pDocSh->UpdatePaintExt( nExt, nStartCol, nStartRow, nStartTab,
|
|
|
|
nEndCol, nEndRow, nEndTab ); // content before the change
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
pDoc->ApplySelectionFrame( rMark, pNewOuter, pNewInner );
|
|
|
|
|
2004-02-03 12:08:40 +00:00
|
|
|
pDocSh->UpdatePaintExt( nExt, nStartCol, nStartRow, nStartTab,
|
|
|
|
nEndCol, nEndRow, nEndTab ); // content after the change
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
rMark.MarkToMulti();
|
|
|
|
pDoc->ApplySelectionPattern( rAttr, rMark );
|
|
|
|
|
|
|
|
pDocSh->PostPaint( nStartCol, nStartRow, nStartTab,
|
|
|
|
nEndCol, nEndRow, nEndTab,
|
|
|
|
PAINT_GRID, nExt );
|
|
|
|
pDocSh->UpdateOle(GetViewData());
|
|
|
|
aModificator.SetDocumentModified();
|
|
|
|
CellContentChanged();
|
|
|
|
rMark.MarkToSimple();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{ // "Rahmen nicht auf Mehrfachselektion"
|
|
|
|
ErrorMessage(STR_MSSG_APPLYPATTLINES_0);
|
|
|
|
}
|
|
|
|
|
|
|
|
StartFormatArea();
|
|
|
|
}
|
|
|
|
|
|
|
|
// nur Pattern
|
|
|
|
|
|
|
|
void ScViewFunc::ApplySelectionPattern( const ScPatternAttr& rAttr,
|
|
|
|
BOOL bRecord, BOOL bCursorOnly )
|
|
|
|
{
|
|
|
|
ScViewData* pViewData = GetViewData();
|
|
|
|
ScDocShell* pDocSh = pViewData->GetDocShell();
|
|
|
|
ScDocument* pDoc = pDocSh->GetDocument();
|
2004-09-09 08:31:12 +00:00
|
|
|
ScMarkData aFuncMark( pViewData->GetMarkData() ); // local copy for UnmarkFiltered
|
|
|
|
ScViewUtil::UnmarkFiltered( aFuncMark, pDoc );
|
|
|
|
|
2001-02-14 14:34:08 +00:00
|
|
|
if (bRecord && !pDoc->IsUndoEnabled())
|
|
|
|
bRecord = FALSE;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2004-02-03 12:08:40 +00:00
|
|
|
// State from old ItemSet doesn't matter for paint flags, as any change will be
|
|
|
|
// from SFX_ITEM_SET in the new ItemSet (default is ignored in ApplyPattern).
|
|
|
|
// New alignment is checked (check in PostPaint isn't enough) in case a right
|
|
|
|
// alignment is changed to left.
|
|
|
|
const SfxItemSet& rNewSet = rAttr.GetItemSet();
|
|
|
|
BOOL bSetLines = rNewSet.GetItemState( ATTR_BORDER, TRUE ) == SFX_ITEM_SET ||
|
|
|
|
rNewSet.GetItemState( ATTR_SHADOW, TRUE ) == SFX_ITEM_SET;
|
|
|
|
BOOL bSetAlign = rNewSet.GetItemState( ATTR_HOR_JUSTIFY, TRUE ) == SFX_ITEM_SET;
|
|
|
|
|
|
|
|
USHORT nExtFlags = 0;
|
|
|
|
if ( bSetLines )
|
|
|
|
nExtFlags |= SC_PF_LINES;
|
|
|
|
if ( bSetAlign )
|
|
|
|
nExtFlags |= SC_PF_WHOLEROWS;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2004-02-03 12:08:40 +00:00
|
|
|
ScDocShellModificator aModificator( *pDocSh );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2004-09-09 08:31:12 +00:00
|
|
|
BOOL bMulti = aFuncMark.IsMultiMarked();
|
|
|
|
aFuncMark.MarkToMulti();
|
|
|
|
BOOL bOnlyTab = (!aFuncMark.IsMultiMarked() && !bCursorOnly && aFuncMark.GetSelectCount() > 1);
|
2000-09-18 16:07:07 +00:00
|
|
|
if (bOnlyTab)
|
|
|
|
{
|
2004-06-04 11:11:19 +00:00
|
|
|
SCCOL nCol = pViewData->GetCurX();
|
|
|
|
SCROW nRow = pViewData->GetCurY();
|
|
|
|
SCTAB nTab = pViewData->GetTabNo();
|
2004-09-09 08:31:12 +00:00
|
|
|
aFuncMark.SetMarkArea(ScRange(nCol,nRow,nTab));
|
|
|
|
aFuncMark.MarkToMulti();
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
2009-02-17 09:19:30 +00:00
|
|
|
ScRangeList aChangeRanges;
|
|
|
|
|
2004-09-09 08:31:12 +00:00
|
|
|
if (aFuncMark.IsMultiMarked() && !bCursorOnly)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2004-02-03 12:08:40 +00:00
|
|
|
ScRange aMarkRange;
|
2004-09-09 08:31:12 +00:00
|
|
|
aFuncMark.GetMultiMarkArea( aMarkRange );
|
2009-02-17 09:19:30 +00:00
|
|
|
SCTAB nTabCount = pDoc->GetTableCount();
|
|
|
|
for ( SCTAB i = 0; i < nTabCount; ++i )
|
|
|
|
{
|
|
|
|
if ( aFuncMark.GetTableSelect( i ) )
|
|
|
|
{
|
|
|
|
ScRange aChangeRange( aMarkRange );
|
|
|
|
aChangeRange.aStart.SetTab( i );
|
|
|
|
aChangeRange.aEnd.SetTab( i );
|
|
|
|
aChangeRanges.Append( aChangeRange );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2004-06-04 11:11:19 +00:00
|
|
|
SCCOL nStartCol = aMarkRange.aStart.Col();
|
|
|
|
SCROW nStartRow = aMarkRange.aStart.Row();
|
|
|
|
SCTAB nStartTab = aMarkRange.aStart.Tab();
|
|
|
|
SCCOL nEndCol = aMarkRange.aEnd.Col();
|
|
|
|
SCROW nEndRow = aMarkRange.aEnd.Row();
|
|
|
|
SCTAB nEndTab = aMarkRange.aEnd.Tab();
|
2004-02-03 12:08:40 +00:00
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
if (bRecord)
|
|
|
|
{
|
|
|
|
ScRange aCopyRange = aMarkRange;
|
|
|
|
aCopyRange.aStart.SetTab(0);
|
|
|
|
aCopyRange.aEnd.SetTab(nTabCount-1);
|
|
|
|
|
|
|
|
ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
|
|
|
|
pUndoDoc->InitUndo( pDoc, nStartTab, nStartTab );
|
2004-06-04 11:11:19 +00:00
|
|
|
for (SCTAB i=0; i<nTabCount; i++)
|
2004-09-09 08:31:12 +00:00
|
|
|
if (i != nStartTab && aFuncMark.GetTableSelect(i))
|
2000-09-18 16:07:07 +00:00
|
|
|
pUndoDoc->AddUndoTab( i, i );
|
2004-09-09 08:31:12 +00:00
|
|
|
pDoc->CopyToDocument( aCopyRange, IDF_ATTRIB, bMulti, pUndoDoc, &aFuncMark );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2004-09-09 08:31:12 +00:00
|
|
|
aFuncMark.MarkToMulti();
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
pDocSh->GetUndoManager()->AddUndoAction(
|
|
|
|
new ScUndoSelectionAttr(
|
2004-09-09 08:31:12 +00:00
|
|
|
pDocSh, aFuncMark,
|
2000-09-18 16:07:07 +00:00
|
|
|
nStartCol, nStartRow, nStartTab,
|
|
|
|
nEndCol, nEndRow, nEndTab,
|
|
|
|
pUndoDoc, bMulti, &rAttr ) );
|
|
|
|
}
|
|
|
|
|
2004-09-09 08:31:12 +00:00
|
|
|
pDoc->ApplySelectionPattern( rAttr, aFuncMark );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
pDocSh->PostPaint( nStartCol, nStartRow, nStartTab,
|
|
|
|
nEndCol, nEndRow, nEndTab,
|
2004-02-03 12:08:40 +00:00
|
|
|
PAINT_GRID, nExtFlags | SC_PF_TESTMERGE );
|
2000-09-18 16:07:07 +00:00
|
|
|
pDocSh->UpdateOle(GetViewData());
|
|
|
|
aModificator.SetDocumentModified();
|
|
|
|
CellContentChanged();
|
|
|
|
}
|
|
|
|
else // einzelne Zelle - Undo einfacher
|
|
|
|
{
|
2004-06-04 11:11:19 +00:00
|
|
|
SCCOL nCol = pViewData->GetCurX();
|
|
|
|
SCROW nRow = pViewData->GetCurY();
|
|
|
|
SCTAB nTab = pViewData->GetTabNo();
|
2009-02-17 09:19:30 +00:00
|
|
|
aChangeRanges.Append( ScRange( nCol, nRow, nTab ) );
|
2000-09-18 16:07:07 +00:00
|
|
|
ScPatternAttr* pOldPat = new ScPatternAttr(*pDoc->GetPattern( nCol, nRow, nTab ));
|
|
|
|
|
|
|
|
pDoc->ApplyPattern( nCol, nRow, nTab, rAttr );
|
|
|
|
|
|
|
|
const ScPatternAttr* pNewPat = pDoc->GetPattern( nCol, nRow, nTab );
|
|
|
|
|
|
|
|
if (bRecord)
|
|
|
|
{
|
|
|
|
pDocSh->GetUndoManager()->AddUndoAction(
|
|
|
|
new ScUndoCursorAttr( pDocSh,
|
|
|
|
nCol, nRow, nTab,
|
|
|
|
pOldPat, pNewPat, &rAttr,
|
|
|
|
FALSE ) ); // FALSE = nicht automatisch
|
|
|
|
}
|
|
|
|
delete pOldPat; // wird im Undo kopiert (Pool)
|
|
|
|
|
2004-02-03 12:08:40 +00:00
|
|
|
pDocSh->PostPaint( nCol,nRow,nTab, nCol,nRow,nTab, PAINT_GRID, nExtFlags | SC_PF_TESTMERGE );
|
2000-09-18 16:07:07 +00:00
|
|
|
pDocSh->UpdateOle(GetViewData());
|
|
|
|
aModificator.SetDocumentModified();
|
|
|
|
CellContentChanged();
|
|
|
|
}
|
|
|
|
|
2009-02-17 09:19:30 +00:00
|
|
|
// #i97876# Spreadsheet data changes are not notified
|
|
|
|
ScModelObj* pModelObj = ScModelObj::getImplementation( pDocSh->GetModel() );
|
|
|
|
if ( pModelObj && pModelObj->HasChangesListeners() )
|
|
|
|
{
|
|
|
|
::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > aProperties;
|
|
|
|
sal_Int32 nCount = 0;
|
2009-06-03 11:26:39 +00:00
|
|
|
const SfxItemPropertyMap* pMap = ScCellObj::GetCellPropertyMap();
|
|
|
|
PropertyEntryVector_t aPropVector = pMap->getPropertyEntries();
|
2009-02-17 09:19:30 +00:00
|
|
|
for ( USHORT nWhich = ATTR_PATTERN_START; nWhich <= ATTR_PATTERN_END; ++nWhich )
|
|
|
|
{
|
|
|
|
const SfxPoolItem* pItem = 0;
|
|
|
|
if ( rNewSet.GetItemState( nWhich, TRUE, &pItem ) == SFX_ITEM_SET && pItem )
|
|
|
|
{
|
2009-06-03 11:26:39 +00:00
|
|
|
PropertyEntryVector_t::const_iterator aIt = aPropVector.begin();
|
|
|
|
while ( aIt != aPropVector.end())
|
2009-02-17 09:19:30 +00:00
|
|
|
{
|
2009-06-03 11:26:39 +00:00
|
|
|
if ( aIt->nWID == nWhich )
|
2009-02-17 09:19:30 +00:00
|
|
|
{
|
|
|
|
::com::sun::star::uno::Any aVal;
|
2009-06-03 11:26:39 +00:00
|
|
|
pItem->QueryValue( aVal, aIt->nMemberId );
|
2009-02-17 09:19:30 +00:00
|
|
|
aProperties.realloc( nCount + 1 );
|
2009-06-03 11:26:39 +00:00
|
|
|
aProperties[ nCount ].Name = aIt->sName;
|
2009-02-17 09:19:30 +00:00
|
|
|
aProperties[ nCount ].Value <<= aVal;
|
|
|
|
++nCount;
|
|
|
|
}
|
2009-06-03 11:26:39 +00:00
|
|
|
++aIt;
|
2009-02-17 09:19:30 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
pModelObj->NotifyChanges( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "attribute" ) ), aChangeRanges, aProperties );
|
|
|
|
}
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
StartFormatArea();
|
|
|
|
}
|
|
|
|
|
2000-11-24 17:07:45 +00:00
|
|
|
void ScViewFunc::ApplyUserItemSet( const SfxItemSet& rItemSet )
|
|
|
|
{
|
|
|
|
// ItemSet from UI, may have different pool
|
|
|
|
|
|
|
|
BOOL bOnlyNotBecauseOfMatrix;
|
|
|
|
if ( !SelectionEditable( &bOnlyNotBecauseOfMatrix ) && !bOnlyNotBecauseOfMatrix )
|
|
|
|
{
|
|
|
|
ErrorMessage(STR_PROTECTIONERR);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
ScPatternAttr aNewAttrs( GetViewData()->GetDocument()->GetPool() );
|
|
|
|
SfxItemSet& rNewSet = aNewAttrs.GetItemSet();
|
|
|
|
rNewSet.Put( rItemSet, FALSE );
|
|
|
|
ApplySelectionPattern( aNewAttrs );
|
|
|
|
|
|
|
|
AdjustBlockHeight();
|
|
|
|
}
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
const SfxStyleSheet* ScViewFunc::GetStyleSheetFromMarked()
|
|
|
|
{
|
2004-09-09 08:31:12 +00:00
|
|
|
// Don't use UnmarkFiltered in slot state functions, for performance reasons.
|
|
|
|
// The displayed state is always that of the whole selection including filtered rows.
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
const ScStyleSheet* pSheet = NULL;
|
|
|
|
ScViewData* pViewData = GetViewData();
|
|
|
|
ScDocument* pDoc = pViewData->GetDocument();
|
|
|
|
ScMarkData& rMark = pViewData->GetMarkData();
|
|
|
|
|
|
|
|
if ( rMark.IsMarked() || rMark.IsMultiMarked() )
|
2004-09-09 08:31:12 +00:00
|
|
|
pSheet = pDoc->GetSelectionStyle( rMark ); // MarkToMulti isn't necessary
|
2000-09-18 16:07:07 +00:00
|
|
|
else
|
|
|
|
pSheet = pDoc->GetStyle( pViewData->GetCurX(),
|
|
|
|
pViewData->GetCurY(),
|
|
|
|
pViewData->GetTabNo() );
|
|
|
|
|
|
|
|
return pSheet;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ScViewFunc::SetStyleSheetToMarked( SfxStyleSheet* pStyleSheet, BOOL bRecord )
|
|
|
|
{
|
|
|
|
// nur wegen Matrix nicht editierbar? Attribute trotzdem ok
|
|
|
|
BOOL bOnlyNotBecauseOfMatrix;
|
|
|
|
if ( !SelectionEditable( &bOnlyNotBecauseOfMatrix ) && !bOnlyNotBecauseOfMatrix )
|
|
|
|
{
|
|
|
|
ErrorMessage(STR_PROTECTIONERR);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !pStyleSheet) return;
|
|
|
|
// -------------------------------------------------------------------
|
|
|
|
|
|
|
|
ScViewData* pViewData = GetViewData();
|
|
|
|
ScDocShell* pDocSh = pViewData->GetDocShell();
|
|
|
|
ScDocument* pDoc = pDocSh->GetDocument();
|
2004-09-09 08:31:12 +00:00
|
|
|
ScMarkData aFuncMark( pViewData->GetMarkData() ); // local copy for UnmarkFiltered
|
|
|
|
ScViewUtil::UnmarkFiltered( aFuncMark, pDoc );
|
2004-06-04 11:11:19 +00:00
|
|
|
SCTAB nTabCount = pDoc->GetTableCount();
|
2001-02-14 14:34:08 +00:00
|
|
|
if (bRecord && !pDoc->IsUndoEnabled())
|
|
|
|
bRecord = FALSE;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
ScDocShellModificator aModificator( *pDocSh );
|
|
|
|
|
2004-09-09 08:31:12 +00:00
|
|
|
if ( aFuncMark.IsMarked() || aFuncMark.IsMultiMarked() )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
ScRange aMarkRange;
|
2004-09-09 08:31:12 +00:00
|
|
|
aFuncMark.MarkToMulti();
|
|
|
|
aFuncMark.GetMultiMarkArea( aMarkRange );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if ( bRecord )
|
|
|
|
{
|
2004-06-04 11:11:19 +00:00
|
|
|
SCTAB nTab = pViewData->GetTabNo();
|
2000-09-18 16:07:07 +00:00
|
|
|
ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
|
|
|
|
pUndoDoc->InitUndo( pDoc, nTab, nTab );
|
2004-06-04 11:11:19 +00:00
|
|
|
for (SCTAB i=0; i<nTabCount; i++)
|
2004-09-09 08:31:12 +00:00
|
|
|
if (i != nTab && aFuncMark.GetTableSelect(i))
|
2000-09-18 16:07:07 +00:00
|
|
|
pUndoDoc->AddUndoTab( i, i );
|
|
|
|
|
|
|
|
ScRange aCopyRange = aMarkRange;
|
|
|
|
aCopyRange.aStart.SetTab(0);
|
|
|
|
aCopyRange.aEnd.SetTab(nTabCount-1);
|
2004-09-09 08:31:12 +00:00
|
|
|
pDoc->CopyToDocument( aCopyRange, IDF_ATTRIB, TRUE, pUndoDoc, &aFuncMark );
|
|
|
|
aFuncMark.MarkToMulti();
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
String aName = pStyleSheet->GetName();
|
|
|
|
pDocSh->GetUndoManager()->AddUndoAction(
|
2004-09-09 08:31:12 +00:00
|
|
|
new ScUndoSelectionStyle( pDocSh, aFuncMark, aMarkRange, aName, pUndoDoc ) );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
2004-09-09 08:31:12 +00:00
|
|
|
pDoc->ApplySelectionStyle( (ScStyleSheet&)*pStyleSheet, aFuncMark );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if (!AdjustBlockHeight())
|
|
|
|
pViewData->GetDocShell()->PostPaint( aMarkRange, PAINT_GRID );
|
|
|
|
|
2004-09-09 08:31:12 +00:00
|
|
|
aFuncMark.MarkToSimple();
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2004-06-04 11:11:19 +00:00
|
|
|
SCCOL nCol = pViewData->GetCurX();
|
|
|
|
SCROW nRow = pViewData->GetCurY();
|
|
|
|
SCTAB nTab = pViewData->GetTabNo();
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if ( bRecord )
|
|
|
|
{
|
|
|
|
ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
|
|
|
|
pUndoDoc->InitUndo( pDoc, nTab, nTab );
|
2004-06-04 11:11:19 +00:00
|
|
|
for (SCTAB i=0; i<nTabCount; i++)
|
2004-09-09 08:31:12 +00:00
|
|
|
if (i != nTab && aFuncMark.GetTableSelect(i))
|
2000-09-18 16:07:07 +00:00
|
|
|
pUndoDoc->AddUndoTab( i, i );
|
|
|
|
|
|
|
|
ScRange aCopyRange( nCol, nRow, 0, nCol, nRow, nTabCount-1 );
|
|
|
|
pDoc->CopyToDocument( aCopyRange, IDF_ATTRIB, FALSE, pUndoDoc );
|
|
|
|
|
|
|
|
ScRange aMarkRange ( nCol, nRow, nTab );
|
2004-09-09 08:31:12 +00:00
|
|
|
ScMarkData aUndoMark = aFuncMark;
|
2000-09-18 16:07:07 +00:00
|
|
|
aUndoMark.SetMultiMarkArea( aMarkRange );
|
|
|
|
|
|
|
|
String aName = pStyleSheet->GetName();
|
|
|
|
pDocSh->GetUndoManager()->AddUndoAction(
|
|
|
|
new ScUndoSelectionStyle( pDocSh, aUndoMark, aMarkRange, aName, pUndoDoc ) );
|
|
|
|
}
|
|
|
|
|
2004-06-04 11:11:19 +00:00
|
|
|
for (SCTAB i=0; i<nTabCount; i++)
|
2004-09-09 08:31:12 +00:00
|
|
|
if (aFuncMark.GetTableSelect(i))
|
2000-09-18 16:07:07 +00:00
|
|
|
pDoc->ApplyStyle( nCol, nRow, i, (ScStyleSheet&)*pStyleSheet );
|
|
|
|
|
|
|
|
if (!AdjustBlockHeight())
|
|
|
|
pViewData->GetDocShell()->PostPaintCell( nCol, nRow, nTab );
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
aModificator.SetDocumentModified();
|
|
|
|
|
|
|
|
StartFormatArea();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void ScViewFunc::RemoveStyleSheetInUse( SfxStyleSheet* pStyleSheet )
|
|
|
|
{
|
|
|
|
if ( !pStyleSheet) return;
|
|
|
|
// -------------------------------------------------------------------
|
|
|
|
|
|
|
|
ScViewData* pViewData = GetViewData();
|
|
|
|
ScDocument* pDoc = pViewData->GetDocument();
|
|
|
|
ScDocShell* pDocSh = pViewData->GetDocShell();
|
|
|
|
|
|
|
|
ScDocShellModificator aModificator( *pDocSh );
|
|
|
|
|
|
|
|
VirtualDevice aVirtDev;
|
|
|
|
aVirtDev.SetMapMode(MAP_PIXEL);
|
|
|
|
pDoc->StyleSheetChanged( pStyleSheet, TRUE, &aVirtDev,
|
|
|
|
pViewData->GetPPTX(),
|
|
|
|
pViewData->GetPPTY(),
|
|
|
|
pViewData->GetZoomX(),
|
|
|
|
pViewData->GetZoomY() );
|
|
|
|
|
|
|
|
pDocSh->PostPaint( 0,0,0, MAXCOL,MAXROW,MAXTAB, PAINT_GRID|PAINT_LEFT );
|
|
|
|
aModificator.SetDocumentModified();
|
|
|
|
|
|
|
|
ScInputHandler* pHdl = SC_MOD()->GetInputHdl();
|
|
|
|
if (pHdl)
|
|
|
|
pHdl->ForgetLastPattern();
|
|
|
|
}
|
|
|
|
|
|
|
|
void ScViewFunc::UpdateStyleSheetInUse( SfxStyleSheet* pStyleSheet )
|
|
|
|
{
|
|
|
|
if ( !pStyleSheet) return;
|
|
|
|
// -------------------------------------------------------------------
|
|
|
|
|
|
|
|
ScViewData* pViewData = GetViewData();
|
|
|
|
ScDocument* pDoc = pViewData->GetDocument();
|
|
|
|
ScDocShell* pDocSh = pViewData->GetDocShell();
|
|
|
|
|
|
|
|
ScDocShellModificator aModificator( *pDocSh );
|
|
|
|
|
|
|
|
VirtualDevice aVirtDev;
|
|
|
|
aVirtDev.SetMapMode(MAP_PIXEL);
|
|
|
|
pDoc->StyleSheetChanged( pStyleSheet, FALSE, &aVirtDev,
|
|
|
|
pViewData->GetPPTX(),
|
|
|
|
pViewData->GetPPTY(),
|
|
|
|
pViewData->GetZoomX(),
|
|
|
|
pViewData->GetZoomY() );
|
|
|
|
|
|
|
|
pDocSh->PostPaint( 0,0,0, MAXCOL,MAXROW,MAXTAB, PAINT_GRID|PAINT_LEFT );
|
|
|
|
aModificator.SetDocumentModified();
|
|
|
|
|
|
|
|
ScInputHandler* pHdl = SC_MOD()->GetInputHdl();
|
|
|
|
if (pHdl)
|
|
|
|
pHdl->ForgetLastPattern();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Zellen einfuegen - Undo OK
|
|
|
|
|
2002-10-09 10:00:13 +00:00
|
|
|
BOOL ScViewFunc::InsertCells( InsCellCmd eCmd, BOOL bRecord, BOOL bPartOfPaste )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
ScRange aRange;
|
2008-04-18 10:50:48 +00:00
|
|
|
if (GetViewData()->GetSimpleArea(aRange) == SC_MARK_SIMPLE)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
ScDocShell* pDocSh = GetViewData()->GetDocShell();
|
2008-12-11 08:36:38 +00:00
|
|
|
const ScMarkData& rMark = GetViewData()->GetMarkData();
|
|
|
|
BOOL bSuccess = pDocSh->GetDocFunc().InsertCells( aRange, &rMark, eCmd, bRecord, FALSE, bPartOfPaste );
|
2000-09-18 16:07:07 +00:00
|
|
|
if (bSuccess)
|
|
|
|
{
|
|
|
|
pDocSh->UpdateOle(GetViewData());
|
|
|
|
CellContentChanged();
|
2009-02-17 09:19:30 +00:00
|
|
|
|
|
|
|
// #i97876# Spreadsheet data changes are not notified
|
|
|
|
ScModelObj* pModelObj = ScModelObj::getImplementation( pDocSh->GetModel() );
|
|
|
|
if ( pModelObj && pModelObj->HasChangesListeners() )
|
|
|
|
{
|
|
|
|
if ( eCmd == INS_INSROWS || eCmd == INS_INSCOLS )
|
|
|
|
{
|
|
|
|
ScRangeList aChangeRanges;
|
|
|
|
aChangeRanges.Append( aRange );
|
|
|
|
::rtl::OUString aOperation = ( eCmd == INS_INSROWS ?
|
|
|
|
::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "insert-rows" ) ) :
|
|
|
|
::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "insert-columns" ) ) );
|
|
|
|
pModelObj->NotifyChanges( aOperation, aChangeRanges );
|
|
|
|
}
|
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
return bSuccess;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ErrorMessage(STR_NOMULTISELECT);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Zellen loeschen - Undo OK
|
|
|
|
|
|
|
|
void ScViewFunc::DeleteCells( DelCellCmd eCmd, BOOL bRecord )
|
|
|
|
{
|
|
|
|
ScRange aRange;
|
2008-04-18 10:50:48 +00:00
|
|
|
if ( GetViewData()->GetSimpleArea( aRange ) == SC_MARK_SIMPLE )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
ScDocShell* pDocSh = GetViewData()->GetDocShell();
|
2008-12-11 08:36:38 +00:00
|
|
|
const ScMarkData& rMark = GetViewData()->GetMarkData();
|
2009-02-11 15:19:01 +00:00
|
|
|
|
|
|
|
// #i94841# [Collaboration] When deleting rows is rejected, the content is sometimes wrong
|
|
|
|
if ( pDocSh->IsDocShared() && ( eCmd == DEL_DELROWS || eCmd == DEL_DELCOLS ) )
|
|
|
|
{
|
|
|
|
ScRange aDelRange( aRange.aStart );
|
|
|
|
SCCOLROW nCount = 0;
|
|
|
|
if ( eCmd == DEL_DELROWS )
|
|
|
|
{
|
|
|
|
nCount = sal::static_int_cast< SCCOLROW >( aRange.aEnd.Row() - aRange.aStart.Row() + 1 );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
nCount = sal::static_int_cast< SCCOLROW >( aRange.aEnd.Col() - aRange.aStart.Col() + 1 );
|
|
|
|
}
|
|
|
|
while ( nCount > 0 )
|
|
|
|
{
|
|
|
|
pDocSh->GetDocFunc().DeleteCells( aDelRange, &rMark, eCmd, bRecord, FALSE );
|
|
|
|
--nCount;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
pDocSh->GetDocFunc().DeleteCells( aRange, &rMark, eCmd, bRecord, FALSE );
|
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
pDocSh->UpdateOle(GetViewData());
|
|
|
|
CellContentChanged();
|
|
|
|
|
2009-02-17 09:19:30 +00:00
|
|
|
// #i97876# Spreadsheet data changes are not notified
|
|
|
|
ScModelObj* pModelObj = ScModelObj::getImplementation( pDocSh->GetModel() );
|
|
|
|
if ( pModelObj && pModelObj->HasChangesListeners() )
|
|
|
|
{
|
|
|
|
if ( eCmd == DEL_DELROWS || eCmd == DEL_DELCOLS )
|
|
|
|
{
|
|
|
|
ScRangeList aChangeRanges;
|
|
|
|
aChangeRanges.Append( aRange );
|
|
|
|
::rtl::OUString aOperation = ( eCmd == DEL_DELROWS ?
|
|
|
|
::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "delete-rows" ) ) :
|
|
|
|
::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "delete-columns" ) ) );
|
|
|
|
pModelObj->NotifyChanges( aOperation, aChangeRanges );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
// #58106# Cursor direkt hinter den geloeschten Bereich setzen
|
2004-06-04 11:11:19 +00:00
|
|
|
SCCOL nCurX = GetViewData()->GetCurX();
|
|
|
|
SCROW nCurY = GetViewData()->GetCurY();
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( eCmd==DEL_CELLSLEFT || eCmd==DEL_DELCOLS )
|
|
|
|
nCurX = aRange.aStart.Col();
|
|
|
|
else
|
|
|
|
nCurY = aRange.aStart.Row();
|
|
|
|
SetCursor( nCurX, nCurY );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (eCmd == DEL_DELCOLS)
|
|
|
|
DeleteMulti( FALSE, bRecord );
|
|
|
|
else if (eCmd == DEL_DELROWS)
|
|
|
|
DeleteMulti( TRUE, bRecord );
|
|
|
|
else
|
|
|
|
ErrorMessage(STR_NOMULTISELECT);
|
|
|
|
}
|
|
|
|
|
|
|
|
Unmark();
|
|
|
|
}
|
|
|
|
|
|
|
|
void ScViewFunc::DeleteMulti( BOOL bRows, BOOL bRecord )
|
|
|
|
{
|
|
|
|
ScDocShell* pDocSh = GetViewData()->GetDocShell();
|
|
|
|
ScDocShellModificator aModificator( *pDocSh );
|
2004-06-04 11:11:19 +00:00
|
|
|
SCTAB nTab = GetViewData()->GetTabNo();
|
2000-09-18 16:07:07 +00:00
|
|
|
ScDocument* pDoc = pDocSh->GetDocument();
|
2004-09-09 08:31:12 +00:00
|
|
|
ScMarkData aFuncMark( GetViewData()->GetMarkData() ); // local copy for UnmarkFiltered
|
|
|
|
ScViewUtil::UnmarkFiltered( aFuncMark, pDoc );
|
|
|
|
|
2001-02-14 14:34:08 +00:00
|
|
|
if (bRecord && !pDoc->IsUndoEnabled())
|
|
|
|
bRecord = FALSE;
|
2004-06-04 11:11:19 +00:00
|
|
|
SCCOLROW* pRanges = new SCCOLROW[MAXCOLROWCOUNT];
|
2004-09-09 08:31:12 +00:00
|
|
|
SCCOLROW nRangeCnt = bRows ? aFuncMark.GetMarkRowRanges( pRanges ) :
|
|
|
|
aFuncMark.GetMarkColumnRanges( pRanges );
|
2004-06-04 11:11:19 +00:00
|
|
|
if (nRangeCnt == 0)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2004-06-04 11:11:19 +00:00
|
|
|
pRanges[0] = pRanges[1] = bRows ? static_cast<SCCOLROW>(GetViewData()->GetCurY()) : static_cast<SCCOLROW>(GetViewData()->GetCurX());
|
2000-09-18 16:07:07 +00:00
|
|
|
nRangeCnt = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Test ob erlaubt
|
|
|
|
|
2004-06-04 11:11:19 +00:00
|
|
|
SCCOLROW* pOneRange = pRanges;
|
2005-10-21 11:10:08 +00:00
|
|
|
USHORT nErrorId = 0;
|
|
|
|
BOOL bNeedRefresh = FALSE;
|
2004-06-04 11:11:19 +00:00
|
|
|
SCCOLROW nRangeNo;
|
2005-10-21 11:10:08 +00:00
|
|
|
for (nRangeNo=0; nRangeNo<nRangeCnt && !nErrorId; nRangeNo++)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2004-06-04 11:11:19 +00:00
|
|
|
SCCOLROW nStart = *(pOneRange++);
|
|
|
|
SCCOLROW nEnd = *(pOneRange++);
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2005-10-21 11:10:08 +00:00
|
|
|
SCCOL nStartCol, nEndCol;
|
|
|
|
SCROW nStartRow, nEndRow;
|
|
|
|
if ( bRows )
|
|
|
|
{
|
|
|
|
nStartCol = 0;
|
|
|
|
nEndCol = MAXCOL;
|
|
|
|
nStartRow = static_cast<SCROW>(nStart);
|
|
|
|
nEndRow = static_cast<SCROW>(nEnd);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
nStartCol = static_cast<SCCOL>(nStart);
|
|
|
|
nEndCol = static_cast<SCCOL>(nEnd);
|
|
|
|
nStartRow = 0;
|
|
|
|
nEndRow = MAXROW;
|
|
|
|
}
|
|
|
|
|
|
|
|
// cell protection (only needed for first range, as all following cells are moved)
|
|
|
|
if ( nRangeNo == 0 )
|
|
|
|
{
|
|
|
|
// test to the end of the sheet
|
|
|
|
ScEditableTester aTester( pDoc, nTab, nStartCol, nStartRow, MAXCOL, MAXROW );
|
|
|
|
if (!aTester.IsEditable())
|
|
|
|
nErrorId = aTester.GetMessageId();
|
|
|
|
}
|
|
|
|
|
|
|
|
// merged cells
|
|
|
|
SCCOL nMergeStartX = nStartCol;
|
|
|
|
SCROW nMergeStartY = nStartRow;
|
|
|
|
SCCOL nMergeEndX = nEndCol;
|
|
|
|
SCROW nMergeEndY = nEndRow;
|
|
|
|
pDoc->ExtendMerge( nMergeStartX, nMergeStartY, nMergeEndX, nMergeEndY, nTab );
|
|
|
|
pDoc->ExtendOverlapped( nMergeStartX, nMergeStartY, nMergeEndX, nMergeEndY, nTab );
|
|
|
|
|
|
|
|
if ( nMergeStartX != nStartCol || nMergeStartY != nStartRow )
|
|
|
|
{
|
|
|
|
// Disallow deleting parts of a merged cell.
|
|
|
|
// Deleting the start is allowed (merge is removed), so the end doesn't have to be checked.
|
|
|
|
|
|
|
|
nErrorId = STR_MSSG_DELETECELLS_0;
|
|
|
|
}
|
|
|
|
if ( nMergeEndX != nEndCol || nMergeEndY != nEndRow )
|
|
|
|
{
|
|
|
|
// detect if the start of a merged cell is deleted, so the merge flags can be refreshed
|
|
|
|
|
|
|
|
bNeedRefresh = TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( nErrorId )
|
|
|
|
{
|
|
|
|
ErrorMessage( nErrorId );
|
|
|
|
delete[] pRanges;
|
|
|
|
return;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// ausfuehren
|
|
|
|
|
|
|
|
WaitObject aWait( GetFrameWin() ); // wichtig wegen TrackFormulas bei UpdateReference
|
|
|
|
|
|
|
|
ScDocument* pUndoDoc = NULL;
|
|
|
|
ScRefUndoData* pUndoData = NULL;
|
|
|
|
if (bRecord)
|
|
|
|
{
|
|
|
|
pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
|
|
|
|
pUndoDoc->InitUndo( pDoc, nTab, nTab, !bRows, bRows ); // Zeilenhoehen
|
|
|
|
|
|
|
|
pOneRange = pRanges;
|
|
|
|
for (nRangeNo=0; nRangeNo<nRangeCnt; nRangeNo++)
|
|
|
|
{
|
2004-06-04 11:11:19 +00:00
|
|
|
SCCOLROW nStart = *(pOneRange++);
|
|
|
|
SCCOLROW nEnd = *(pOneRange++);
|
2000-09-18 16:07:07 +00:00
|
|
|
if (bRows)
|
|
|
|
pDoc->CopyToDocument( 0,nStart,nTab, MAXCOL,nEnd,nTab, IDF_ALL,FALSE,pUndoDoc );
|
|
|
|
else
|
2004-06-04 11:11:19 +00:00
|
|
|
pDoc->CopyToDocument( static_cast<SCCOL>(nStart),0,nTab,
|
|
|
|
static_cast<SCCOL>(nEnd),MAXROW,nTab,
|
|
|
|
IDF_ALL,FALSE,pUndoDoc );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// alle Formeln wegen Referenzen
|
2004-06-04 11:11:19 +00:00
|
|
|
SCTAB nTabCount = pDoc->GetTableCount();
|
2000-09-18 16:07:07 +00:00
|
|
|
pUndoDoc->AddUndoTab( 0, nTabCount-1, FALSE, FALSE );
|
|
|
|
pDoc->CopyToDocument( 0,0,0, MAXCOL,MAXROW,MAXTAB, IDF_FORMULA,FALSE,pUndoDoc );
|
|
|
|
|
|
|
|
pUndoData = new ScRefUndoData( pDoc );
|
|
|
|
|
|
|
|
pDoc->BeginDrawUndo();
|
|
|
|
}
|
|
|
|
|
|
|
|
pOneRange = &pRanges[2*nRangeCnt]; // rueckwaerts
|
2005-10-21 11:10:08 +00:00
|
|
|
for (nRangeNo=0; nRangeNo<nRangeCnt; nRangeNo++)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2004-06-04 11:11:19 +00:00
|
|
|
SCCOLROW nEnd = *(--pOneRange);
|
|
|
|
SCCOLROW nStart = *(--pOneRange);
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if (bRows)
|
2004-06-04 11:11:19 +00:00
|
|
|
pDoc->DeleteRow( 0,nTab, MAXCOL,nTab, nStart, static_cast<SCSIZE>(nEnd-nStart+1) );
|
2000-09-18 16:07:07 +00:00
|
|
|
else
|
2004-06-04 11:11:19 +00:00
|
|
|
pDoc->DeleteCol( 0,nTab, MAXROW,nTab, static_cast<SCCOL>(nStart), static_cast<SCSIZE>(nEnd-nStart+1) );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
2005-10-21 11:10:08 +00:00
|
|
|
if (bNeedRefresh)
|
|
|
|
{
|
|
|
|
SCCOLROW nFirstStart = pRanges[0];
|
|
|
|
SCCOL nStartCol = bRows ? 0 : static_cast<SCCOL>(nFirstStart);
|
|
|
|
SCROW nStartRow = bRows ? static_cast<SCROW>(nFirstStart) : 0;
|
|
|
|
SCCOL nEndCol = MAXCOL;
|
|
|
|
SCROW nEndRow = MAXROW;
|
|
|
|
|
|
|
|
pDoc->RemoveFlagsTab( nStartCol, nStartRow, nEndCol, nEndRow, nTab, SC_MF_HOR | SC_MF_VER );
|
|
|
|
pDoc->ExtendMerge( nStartCol, nStartRow, nEndCol, nEndRow, nTab, TRUE );
|
|
|
|
}
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
if (bRecord)
|
|
|
|
{
|
|
|
|
pDocSh->GetUndoManager()->AddUndoAction(
|
2005-10-21 11:10:08 +00:00
|
|
|
new ScUndoDeleteMulti( pDocSh, bRows, bNeedRefresh, nTab, pRanges, nRangeCnt,
|
2000-09-18 16:07:07 +00:00
|
|
|
pUndoDoc, pUndoData ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!AdjustRowHeight(0, MAXROW))
|
2008-12-11 07:05:03 +00:00
|
|
|
{
|
2000-09-18 16:07:07 +00:00
|
|
|
if (bRows)
|
|
|
|
pDocSh->PostPaint( 0,pRanges[0],nTab, MAXCOL,MAXROW,nTab, PAINT_GRID | PAINT_LEFT );
|
|
|
|
else
|
2004-06-04 11:11:19 +00:00
|
|
|
pDocSh->PostPaint( static_cast<SCCOL>(pRanges[0]),0,nTab,
|
|
|
|
MAXCOL,MAXROW,nTab, PAINT_GRID | PAINT_TOP );
|
2008-12-11 07:05:03 +00:00
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
aModificator.SetDocumentModified();
|
|
|
|
|
|
|
|
CellContentChanged();
|
|
|
|
|
|
|
|
// #58106# Cursor direkt hinter den ersten geloeschten Bereich setzen
|
2004-06-04 11:11:19 +00:00
|
|
|
SCCOL nCurX = GetViewData()->GetCurX();
|
|
|
|
SCROW nCurY = GetViewData()->GetCurY();
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( bRows )
|
|
|
|
nCurY = pRanges[0];
|
|
|
|
else
|
2004-06-04 11:11:19 +00:00
|
|
|
nCurX = static_cast<SCCOL>(pRanges[0]);
|
2000-09-18 16:07:07 +00:00
|
|
|
SetCursor( nCurX, nCurY );
|
|
|
|
|
|
|
|
delete[] pRanges;
|
2005-09-28 11:20:28 +00:00
|
|
|
|
|
|
|
SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Inhalte loeschen
|
|
|
|
|
|
|
|
void ScViewFunc::DeleteContents( USHORT nFlags, BOOL bRecord )
|
|
|
|
{
|
|
|
|
// nur wegen Matrix nicht editierbar? Attribute trotzdem ok
|
|
|
|
BOOL bOnlyNotBecauseOfMatrix;
|
|
|
|
BOOL bEditable = SelectionEditable( &bOnlyNotBecauseOfMatrix );
|
|
|
|
if ( !bEditable )
|
|
|
|
{
|
|
|
|
if ( !(bOnlyNotBecauseOfMatrix &&
|
|
|
|
((nFlags & (IDF_ATTRIB | IDF_EDITATTR)) == nFlags)) )
|
|
|
|
{
|
2002-11-20 13:36:29 +00:00
|
|
|
ErrorMessage(bOnlyNotBecauseOfMatrix ? STR_MATRIXFRAGMENTERR : STR_PROTECTIONERR);
|
2000-09-18 16:07:07 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
ScRange aMarkRange;
|
|
|
|
BOOL bSimple = FALSE;
|
|
|
|
|
|
|
|
ScDocument* pDoc = GetViewData()->GetDocument();
|
|
|
|
ScDocShell* pDocSh = GetViewData()->GetDocShell();
|
2004-09-09 08:31:12 +00:00
|
|
|
ScMarkData aFuncMark( GetViewData()->GetMarkData() ); // local copy for UnmarkFiltered
|
|
|
|
ScViewUtil::UnmarkFiltered( aFuncMark, pDoc );
|
|
|
|
|
2001-02-14 14:34:08 +00:00
|
|
|
if (bRecord && !pDoc->IsUndoEnabled())
|
|
|
|
bRecord = FALSE;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
ScDocShellModificator aModificator( *pDocSh );
|
|
|
|
|
2004-09-09 08:31:12 +00:00
|
|
|
if ( !aFuncMark.IsMarked() && !aFuncMark.IsMultiMarked() )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
aMarkRange.aStart.SetCol(GetViewData()->GetCurX());
|
|
|
|
aMarkRange.aStart.SetRow(GetViewData()->GetCurY());
|
|
|
|
aMarkRange.aStart.SetTab(GetViewData()->GetTabNo());
|
|
|
|
aMarkRange.aEnd = aMarkRange.aStart;
|
|
|
|
if ( pDoc->HasAttrib( aMarkRange, HASATTR_MERGED ) )
|
|
|
|
{
|
2004-09-09 08:31:12 +00:00
|
|
|
// InitOwnBlockMode();
|
|
|
|
aFuncMark.SetMarkArea( aMarkRange );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
bSimple = TRUE;
|
|
|
|
}
|
|
|
|
|
2004-09-09 08:31:12 +00:00
|
|
|
aFuncMark.SetMarking(FALSE); // for MarkToMulti
|
|
|
|
aFuncMark.MarkToSimple(); // before bMulti test below
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2008-11-10 15:06:12 +00:00
|
|
|
DBG_ASSERT( aFuncMark.IsMarked() || aFuncMark.IsMultiMarked() || bSimple, "delete what?" );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
ScDocument* pUndoDoc = NULL;
|
2004-09-09 08:31:12 +00:00
|
|
|
BOOL bMulti = !bSimple && aFuncMark.IsMultiMarked();
|
2000-09-18 16:07:07 +00:00
|
|
|
if (!bSimple)
|
|
|
|
{
|
2004-09-09 08:31:12 +00:00
|
|
|
aFuncMark.MarkToMulti();
|
|
|
|
aFuncMark.GetMultiMarkArea( aMarkRange );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
ScRange aExtendedRange(aMarkRange);
|
|
|
|
if (!bSimple)
|
|
|
|
{
|
|
|
|
if ( pDoc->ExtendMerge( aExtendedRange, TRUE ) )
|
|
|
|
bMulti = FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
// keine Objekte auf geschuetzten Tabellen
|
|
|
|
BOOL bObjects = FALSE;
|
|
|
|
if ( nFlags & IDF_OBJECTS )
|
|
|
|
{
|
|
|
|
bObjects = TRUE;
|
2004-06-04 11:11:19 +00:00
|
|
|
SCTAB nTabCount = pDoc->GetTableCount();
|
|
|
|
for (SCTAB nTab=0; nTab<nTabCount; nTab++)
|
2004-09-09 08:31:12 +00:00
|
|
|
if (aFuncMark.GetTableSelect(nTab) && pDoc->IsTabProtected(nTab))
|
2000-09-18 16:07:07 +00:00
|
|
|
bObjects = FALSE;
|
|
|
|
}
|
|
|
|
|
2004-02-03 12:08:40 +00:00
|
|
|
USHORT nExtFlags = 0; // extra flags are needed only if attributes are deleted
|
|
|
|
if ( nFlags & IDF_ATTRIB )
|
|
|
|
pDocSh->UpdatePaintExt( nExtFlags, aMarkRange );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
// Reihenfolge:
|
|
|
|
// 1) BeginDrawUndo
|
|
|
|
// 2) Objekte loeschen (DrawUndo wird gefuellt)
|
|
|
|
// 3) Inhalte fuer Undo kopieren
|
|
|
|
// 4) Inhalte loeschen
|
|
|
|
// 5) Undo-Aktion anlegen
|
|
|
|
|
2006-10-27 14:29:41 +00:00
|
|
|
BOOL bDrawUndo = bObjects || ( nFlags & IDF_NOTE ); // needed for shown notes
|
|
|
|
if ( bDrawUndo && bRecord )
|
|
|
|
pDoc->BeginDrawUndo();
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
if (bObjects)
|
|
|
|
{
|
|
|
|
if (bMulti)
|
2004-09-09 08:31:12 +00:00
|
|
|
pDoc->DeleteObjectsInSelection( aFuncMark );
|
2000-09-18 16:07:07 +00:00
|
|
|
else
|
|
|
|
pDoc->DeleteObjectsInArea( aMarkRange.aStart.Col(), aMarkRange.aStart.Row(),
|
|
|
|
/*!*/ aMarkRange.aEnd.Col(), aMarkRange.aEnd.Row(),
|
2004-09-09 08:31:12 +00:00
|
|
|
aFuncMark );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if ( bRecord )
|
|
|
|
{
|
|
|
|
pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
|
2004-06-04 11:11:19 +00:00
|
|
|
SCTAB nTab = aMarkRange.aStart.Tab();
|
2000-09-18 16:07:07 +00:00
|
|
|
pUndoDoc->InitUndo( pDoc, nTab, nTab );
|
2004-06-04 11:11:19 +00:00
|
|
|
SCTAB nTabCount = pDoc->GetTableCount();
|
|
|
|
for (SCTAB i=0; i<nTabCount; i++)
|
2004-09-09 08:31:12 +00:00
|
|
|
if (i != nTab && aFuncMark.GetTableSelect(i))
|
2000-09-18 16:07:07 +00:00
|
|
|
pUndoDoc->AddUndoTab( i, i );
|
|
|
|
ScRange aCopyRange = aExtendedRange;
|
|
|
|
aCopyRange.aStart.SetTab(0);
|
|
|
|
aCopyRange.aEnd.SetTab(nTabCount-1);
|
|
|
|
|
|
|
|
// bei "Format/Standard" alle Attribute kopieren, weil CopyToDocument
|
|
|
|
// nur mit IDF_HARDATTR zu langsam ist:
|
|
|
|
USHORT nUndoDocFlags = nFlags;
|
|
|
|
if (nFlags & IDF_ATTRIB)
|
|
|
|
nUndoDocFlags |= IDF_ATTRIB;
|
|
|
|
if (nFlags & IDF_EDITATTR) // Edit-Engine-Attribute
|
|
|
|
nUndoDocFlags |= IDF_STRING; // -> Zellen werden geaendert
|
|
|
|
if (nFlags & IDF_NOTE)
|
|
|
|
nUndoDocFlags |= IDF_CONTENTS; // #68795# copy all cells with their notes
|
2009-03-02 14:19:13 +00:00
|
|
|
// do not copy note captions to undo document
|
|
|
|
nUndoDocFlags |= IDF_NOCAPTIONS;
|
2004-09-09 08:31:12 +00:00
|
|
|
pDoc->CopyToDocument( aCopyRange, nUndoDocFlags, bMulti, pUndoDoc, &aFuncMark );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
HideAllCursors(); // falls Zusammenfassung aufgehoben wird
|
|
|
|
if (bSimple)
|
|
|
|
pDoc->DeleteArea( aMarkRange.aStart.Col(), aMarkRange.aStart.Row(),
|
|
|
|
aMarkRange.aEnd.Col(), aMarkRange.aEnd.Row(),
|
2004-09-09 08:31:12 +00:00
|
|
|
aFuncMark, nFlags );
|
2000-09-18 16:07:07 +00:00
|
|
|
else
|
|
|
|
{
|
2004-09-09 08:31:12 +00:00
|
|
|
pDoc->DeleteSelection( nFlags, aFuncMark );
|
2009-03-02 14:19:13 +00:00
|
|
|
// aFuncMark.MarkToSimple();
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if ( bRecord )
|
|
|
|
{
|
|
|
|
pDocSh->GetUndoManager()->AddUndoAction(
|
2004-09-09 08:31:12 +00:00
|
|
|
new ScUndoDeleteContents( pDocSh, aFuncMark, aExtendedRange,
|
2006-10-27 14:29:41 +00:00
|
|
|
pUndoDoc, bMulti, nFlags, bDrawUndo ) );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (!AdjustRowHeight( aExtendedRange.aStart.Row(), aExtendedRange.aEnd.Row() ))
|
|
|
|
pDocSh->PostPaint( aExtendedRange, PAINT_GRID, nExtFlags );
|
|
|
|
|
|
|
|
pDocSh->UpdateOle(GetViewData());
|
2009-02-17 09:19:30 +00:00
|
|
|
|
|
|
|
// #i97876# Spreadsheet data changes are not notified
|
|
|
|
ScModelObj* pModelObj = ScModelObj::getImplementation( pDocSh->GetModel() );
|
|
|
|
if ( pModelObj && pModelObj->HasChangesListeners() )
|
|
|
|
{
|
|
|
|
ScRangeList aChangeRanges;
|
|
|
|
if ( bSimple )
|
|
|
|
{
|
|
|
|
aChangeRanges.Append( aMarkRange );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
aFuncMark.FillRangeListWithMarks( &aChangeRanges, FALSE );
|
|
|
|
}
|
|
|
|
pModelObj->NotifyChanges( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "cell-change" ) ), aChangeRanges );
|
|
|
|
}
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
aModificator.SetDocumentModified();
|
|
|
|
CellContentChanged();
|
|
|
|
ShowAllCursors();
|
|
|
|
|
|
|
|
if ( nFlags & IDF_ATTRIB )
|
|
|
|
{
|
|
|
|
if ( nFlags & IDF_CONTENTS )
|
|
|
|
ForgetFormatArea();
|
|
|
|
else
|
|
|
|
StartFormatArea(); // Attribute loeschen ist auch Attributierung
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Spaltenbreiten/Zeilenhoehen (ueber Header) - Undo OK
|
|
|
|
|
2004-06-04 11:11:19 +00:00
|
|
|
void ScViewFunc::SetWidthOrHeight( BOOL bWidth, SCCOLROW nRangeCnt, SCCOLROW* pRanges,
|
2000-11-16 12:13:46 +00:00
|
|
|
ScSizeMode eMode, USHORT nSizeTwips,
|
|
|
|
BOOL bRecord, BOOL bPaint, ScMarkData* pMarkData )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2004-06-04 11:11:19 +00:00
|
|
|
if (nRangeCnt == 0)
|
2000-09-18 16:07:07 +00:00
|
|
|
return;
|
|
|
|
|
2000-11-16 12:13:46 +00:00
|
|
|
// use view's mark if none specified
|
|
|
|
if ( !pMarkData )
|
|
|
|
pMarkData = &GetViewData()->GetMarkData();
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
ScDocShell* pDocSh = GetViewData()->GetDocShell();
|
|
|
|
ScDocument* pDoc = pDocSh->GetDocument();
|
2004-06-04 11:11:19 +00:00
|
|
|
SCTAB nTabCount = pDoc->GetTableCount();
|
|
|
|
SCTAB nFirstTab = pMarkData->GetFirstSelected();
|
|
|
|
SCTAB nCurTab = GetViewData()->GetTabNo();
|
|
|
|
SCTAB nTab;
|
2001-02-14 14:34:08 +00:00
|
|
|
if (bRecord && !pDoc->IsUndoEnabled())
|
|
|
|
bRecord = FALSE;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
ScDocShellModificator aModificator( *pDocSh );
|
|
|
|
|
|
|
|
BOOL bAllowed = TRUE;
|
2000-11-16 12:13:46 +00:00
|
|
|
for (nTab=0; nTab<nTabCount && bAllowed; nTab++)
|
|
|
|
if (pMarkData->GetTableSelect(nTab))
|
|
|
|
{
|
2004-06-04 11:11:19 +00:00
|
|
|
for ( SCCOLROW i=0; i<nRangeCnt && bAllowed; i++ )
|
2000-11-16 12:13:46 +00:00
|
|
|
{
|
|
|
|
BOOL bOnlyMatrix;
|
|
|
|
if (bWidth)
|
|
|
|
bAllowed = pDoc->IsBlockEditable( nTab,
|
2004-06-04 11:11:19 +00:00
|
|
|
static_cast<SCCOL>(pRanges[2*i]),0,
|
|
|
|
static_cast<SCCOL>(pRanges[2*i+1]),MAXROW,
|
|
|
|
&bOnlyMatrix ) || bOnlyMatrix;
|
2000-11-16 12:13:46 +00:00
|
|
|
else
|
2004-06-04 11:11:19 +00:00
|
|
|
bAllowed = pDoc->IsBlockEditable( nTab, 0,pRanges[2*i],
|
|
|
|
MAXCOL,pRanges[2*i+1], &bOnlyMatrix ) ||
|
|
|
|
bOnlyMatrix;
|
2000-11-16 12:13:46 +00:00
|
|
|
}
|
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( !bAllowed )
|
|
|
|
{
|
|
|
|
ErrorMessage(STR_PROTECTIONERR);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2004-06-04 11:11:19 +00:00
|
|
|
SCCOLROW nStart = pRanges[0];
|
|
|
|
SCCOLROW nEnd = pRanges[2*nRangeCnt-1];
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
BOOL bFormula = FALSE;
|
|
|
|
if ( eMode == SC_SIZE_OPTIMAL )
|
|
|
|
{
|
|
|
|
const ScViewOptions& rOpts = GetViewData()->GetOptions();
|
|
|
|
bFormula = rOpts.GetOption( VOPT_FORMULAS );
|
|
|
|
}
|
|
|
|
|
|
|
|
ScDocument* pUndoDoc = NULL;
|
|
|
|
ScOutlineTable* pUndoTab = NULL;
|
2004-06-04 11:11:19 +00:00
|
|
|
SCCOLROW* pUndoRanges = NULL;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if ( bRecord )
|
|
|
|
{
|
|
|
|
pDoc->BeginDrawUndo(); // Drawing Updates
|
|
|
|
|
|
|
|
pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
|
2000-11-16 12:13:46 +00:00
|
|
|
for (nTab=0; nTab<nTabCount; nTab++)
|
|
|
|
if (pMarkData->GetTableSelect(nTab))
|
|
|
|
{
|
|
|
|
if (bWidth)
|
|
|
|
{
|
|
|
|
if ( nTab == nFirstTab )
|
|
|
|
pUndoDoc->InitUndo( pDoc, nTab, nTab, TRUE, FALSE );
|
|
|
|
else
|
|
|
|
pUndoDoc->AddUndoTab( nTab, nTab, TRUE, FALSE );
|
2004-06-04 11:11:19 +00:00
|
|
|
pDoc->CopyToDocument( static_cast<SCCOL>(nStart), 0, nTab,
|
|
|
|
static_cast<SCCOL>(nEnd), MAXROW, nTab, IDF_NONE,
|
|
|
|
FALSE, pUndoDoc );
|
2000-11-16 12:13:46 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if ( nTab == nFirstTab )
|
|
|
|
pUndoDoc->InitUndo( pDoc, nTab, nTab, FALSE, TRUE );
|
|
|
|
else
|
|
|
|
pUndoDoc->AddUndoTab( nTab, nTab, FALSE, TRUE );
|
|
|
|
pDoc->CopyToDocument( 0, nStart, nTab, MAXCOL, nEnd, nTab, IDF_NONE, FALSE, pUndoDoc );
|
|
|
|
}
|
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2004-06-04 11:11:19 +00:00
|
|
|
pUndoRanges = new SCCOLROW[ 2*nRangeCnt ];
|
|
|
|
memmove( pUndoRanges, pRanges, 2*nRangeCnt*sizeof(SCCOLROW) );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2000-11-16 12:13:46 +00:00
|
|
|
//! outlines from all tables?
|
|
|
|
ScOutlineTable* pTable = pDoc->GetOutlineTable( nCurTab );
|
2000-09-18 16:07:07 +00:00
|
|
|
if (pTable)
|
|
|
|
pUndoTab = new ScOutlineTable( *pTable );
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( eMode==SC_SIZE_OPTIMAL || eMode==SC_SIZE_VISOPT )
|
2000-11-16 12:13:46 +00:00
|
|
|
pMarkData->MarkToMulti();
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
BOOL bShow = nSizeTwips > 0 || eMode != SC_SIZE_DIRECT;
|
|
|
|
BOOL bOutline = FALSE;
|
|
|
|
|
2000-11-16 12:13:46 +00:00
|
|
|
for (nTab=0; nTab<nTabCount; nTab++)
|
|
|
|
if (pMarkData->GetTableSelect(nTab))
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2004-06-04 11:11:19 +00:00
|
|
|
const SCCOLROW* pTabRanges = pRanges;
|
2000-11-16 12:13:46 +00:00
|
|
|
|
|
|
|
pDoc->IncSizeRecalcLevel( nTab ); // nicht fuer jede Spalte einzeln
|
2004-06-04 11:11:19 +00:00
|
|
|
for (SCCOLROW nRangeNo=0; nRangeNo<nRangeCnt; nRangeNo++)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2004-06-04 11:11:19 +00:00
|
|
|
SCCOLROW nStartNo = *(pTabRanges++);
|
|
|
|
SCCOLROW nEndNo = *(pTabRanges++);
|
2000-11-16 12:13:46 +00:00
|
|
|
|
|
|
|
if ( !bWidth ) // Hoehen immer blockweise
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2000-11-16 12:13:46 +00:00
|
|
|
if ( eMode==SC_SIZE_OPTIMAL || eMode==SC_SIZE_VISOPT )
|
|
|
|
{
|
|
|
|
BOOL bAll = ( eMode==SC_SIZE_OPTIMAL );
|
|
|
|
if (!bAll)
|
|
|
|
{
|
|
|
|
// fuer alle eingeblendeten CR_MANUALSIZE loeschen,
|
|
|
|
// dann SetOptimalHeight mit bShrink = FALSE
|
2004-08-20 08:19:24 +00:00
|
|
|
ScCompressedArrayIterator< SCROW, BYTE> aIter(
|
|
|
|
pDoc->GetRowFlagsArray( nTab), nStartNo,
|
|
|
|
nEndNo);
|
|
|
|
do
|
2000-11-16 12:13:46 +00:00
|
|
|
{
|
2004-08-20 08:19:24 +00:00
|
|
|
BYTE nOld = *aIter;
|
2000-11-16 12:13:46 +00:00
|
|
|
if ( (nOld & CR_HIDDEN) == 0 && ( nOld & CR_MANUALSIZE ) )
|
2004-08-20 08:19:24 +00:00
|
|
|
{
|
|
|
|
SCROW nRangeEnd = aIter.GetRangeEnd();
|
|
|
|
pDoc->SetRowFlags( aIter.GetRangeStart(),
|
|
|
|
nRangeEnd, nTab,
|
|
|
|
nOld & ~CR_MANUALSIZE);
|
|
|
|
aIter.Resync( nRangeEnd);
|
|
|
|
// Range may be extended due to merges and
|
|
|
|
// now aIter.GetRangeEnd() may point behind
|
|
|
|
// the previous row, but all flags of this
|
|
|
|
// range have the CR_MANUALSIZE bit
|
|
|
|
// removed, so it is safe to continue with
|
|
|
|
// the next range, not necessary to catch
|
|
|
|
// up with the remaining rows.
|
|
|
|
}
|
|
|
|
} while (aIter.NextRange());
|
2000-11-16 12:13:46 +00:00
|
|
|
}
|
2001-05-11 16:11:53 +00:00
|
|
|
|
|
|
|
double nPPTX = GetViewData()->GetPPTX();
|
|
|
|
double nPPTY = GetViewData()->GetPPTY();
|
|
|
|
Fraction aZoomX = GetViewData()->GetZoomX();
|
|
|
|
Fraction aZoomY = GetViewData()->GetZoomY();
|
|
|
|
|
|
|
|
ScSizeDeviceProvider aProv(pDocSh);
|
|
|
|
if (aProv.IsPrinter())
|
|
|
|
{
|
|
|
|
nPPTX = aProv.GetPPTX();
|
|
|
|
nPPTY = aProv.GetPPTY();
|
|
|
|
aZoomX = aZoomY = Fraction( 1, 1 );
|
|
|
|
}
|
|
|
|
|
|
|
|
pDoc->SetOptimalHeight( nStartNo, nEndNo, nTab, nSizeTwips, aProv.GetDevice(),
|
|
|
|
nPPTX, nPPTY, aZoomX, aZoomY, bAll );
|
2000-11-16 12:13:46 +00:00
|
|
|
if (bAll)
|
|
|
|
pDoc->ShowRows( nStartNo, nEndNo, nTab, TRUE );
|
|
|
|
|
|
|
|
// Manual-Flag wird bei bAll=TRUE schon in SetOptimalHeight gesetzt
|
|
|
|
// (an bei Extra-Height, sonst aus).
|
|
|
|
}
|
|
|
|
else if ( eMode==SC_SIZE_DIRECT )
|
|
|
|
{
|
|
|
|
if (nSizeTwips)
|
2003-04-08 15:34:56 +00:00
|
|
|
{
|
2000-11-16 12:13:46 +00:00
|
|
|
pDoc->SetRowHeightRange( nStartNo, nEndNo, nTab, nSizeTwips );
|
2003-04-08 15:34:56 +00:00
|
|
|
pDoc->SetManualHeight( nStartNo, nEndNo, nTab, TRUE ); // height was set manually
|
|
|
|
}
|
2000-11-16 12:13:46 +00:00
|
|
|
pDoc->ShowRows( nStartNo, nEndNo, nTab, nSizeTwips != 0 );
|
|
|
|
}
|
|
|
|
else if ( eMode==SC_SIZE_SHOW )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2000-11-16 12:13:46 +00:00
|
|
|
pDoc->ShowRows( nStartNo, nEndNo, nTab, TRUE );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
2000-11-16 12:13:46 +00:00
|
|
|
else // Spaltenbreiten
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2004-06-04 11:11:19 +00:00
|
|
|
for (SCCOL nCol=static_cast<SCCOL>(nStartNo); nCol<=static_cast<SCCOL>(nEndNo); nCol++)
|
2000-11-16 12:13:46 +00:00
|
|
|
{
|
|
|
|
if ( eMode != SC_SIZE_VISOPT ||
|
|
|
|
(pDoc->GetColFlags( nCol, nTab ) & CR_HIDDEN) == 0 )
|
|
|
|
{
|
|
|
|
USHORT nThisSize = nSizeTwips;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2000-11-16 12:13:46 +00:00
|
|
|
if ( eMode==SC_SIZE_OPTIMAL || eMode==SC_SIZE_VISOPT )
|
|
|
|
nThisSize = nSizeTwips + GetOptimalColWidth( nCol, nTab, bFormula );
|
|
|
|
if ( nThisSize )
|
|
|
|
pDoc->SetColWidth( nCol, nTab, nThisSize );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2000-11-16 12:13:46 +00:00
|
|
|
pDoc->ShowCol( nCol, nTab, bShow );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Outline anpassen
|
|
|
|
|
|
|
|
if (bWidth)
|
|
|
|
{
|
2004-06-04 11:11:19 +00:00
|
|
|
if ( pDoc->UpdateOutlineCol( static_cast<SCCOL>(nStartNo),
|
|
|
|
static_cast<SCCOL>(nEndNo), nTab, bShow ) )
|
2000-11-16 12:13:46 +00:00
|
|
|
bOutline = TRUE;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if ( pDoc->UpdateOutlineRow( nStartNo, nEndNo, nTab, bShow ) )
|
|
|
|
bOutline = TRUE;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
2000-11-16 12:13:46 +00:00
|
|
|
pDoc->DecSizeRecalcLevel( nTab ); // nicht fuer jede Spalte einzeln
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (!bOutline)
|
|
|
|
DELETEZ(pUndoTab);
|
|
|
|
|
|
|
|
if (bRecord)
|
|
|
|
{
|
|
|
|
pDocSh->GetUndoManager()->AddUndoAction(
|
2000-11-16 12:13:46 +00:00
|
|
|
new ScUndoWidthOrHeight( pDocSh, *pMarkData,
|
|
|
|
nStart, nCurTab, nEnd, nCurTab,
|
2000-09-18 16:07:07 +00:00
|
|
|
pUndoDoc, nRangeCnt, pUndoRanges,
|
|
|
|
pUndoTab, eMode, nSizeTwips, bWidth ) );
|
|
|
|
}
|
|
|
|
|
2000-11-16 12:13:46 +00:00
|
|
|
for (nTab=0; nTab<nTabCount; nTab++)
|
|
|
|
if (pMarkData->GetTableSelect(nTab))
|
|
|
|
pDoc->UpdatePageBreaks( nTab );
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
GetViewData()->GetView()->UpdateScrollBars();
|
|
|
|
|
|
|
|
if (bPaint)
|
|
|
|
{
|
|
|
|
HideCursor();
|
|
|
|
|
2000-11-16 12:13:46 +00:00
|
|
|
for (nTab=0; nTab<nTabCount; nTab++)
|
|
|
|
if (pMarkData->GetTableSelect(nTab))
|
|
|
|
{
|
|
|
|
if (bWidth)
|
|
|
|
{
|
2004-06-04 11:11:19 +00:00
|
|
|
if (pDoc->HasAttrib( static_cast<SCCOL>(nStart),0,nTab,
|
|
|
|
static_cast<SCCOL>(nEnd),MAXROW,nTab,
|
|
|
|
HASATTR_MERGED | HASATTR_OVERLAPPED ))
|
2000-11-16 12:13:46 +00:00
|
|
|
nStart = 0;
|
2004-06-04 11:11:19 +00:00
|
|
|
if (nStart > 0) // weiter oben anfangen wegen Linien und Cursor
|
2000-11-16 12:13:46 +00:00
|
|
|
--nStart;
|
2004-06-04 11:11:19 +00:00
|
|
|
pDocSh->PostPaint( static_cast<SCCOL>(nStart), 0, nTab,
|
|
|
|
MAXCOL, MAXROW, nTab, PAINT_GRID | PAINT_TOP );
|
2000-11-16 12:13:46 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (pDoc->HasAttrib( 0,nStart,nTab, MAXCOL,nEnd,nTab, HASATTR_MERGED | HASATTR_OVERLAPPED ))
|
|
|
|
nStart = 0;
|
2004-06-04 11:11:19 +00:00
|
|
|
if (nStart != 0)
|
2000-11-16 12:13:46 +00:00
|
|
|
--nStart;
|
|
|
|
pDocSh->PostPaint( 0, nStart, nTab, MAXCOL, MAXROW, nTab, PAINT_GRID | PAINT_LEFT );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
pDocSh->UpdateOle(GetViewData());
|
|
|
|
aModificator.SetDocumentModified();
|
|
|
|
|
|
|
|
ShowCursor();
|
|
|
|
}
|
2009-02-17 09:19:30 +00:00
|
|
|
|
|
|
|
// #i97876# Spreadsheet data changes are not notified
|
|
|
|
if ( bWidth )
|
|
|
|
{
|
|
|
|
ScModelObj* pModelObj = ScModelObj::getImplementation( pDocSh->GetModel() );
|
|
|
|
if ( pModelObj && pModelObj->HasChangesListeners() )
|
|
|
|
{
|
|
|
|
ScRangeList aChangeRanges;
|
|
|
|
for ( nTab = 0; nTab < nTabCount; ++nTab )
|
|
|
|
{
|
|
|
|
if ( pMarkData->GetTableSelect( nTab ) )
|
|
|
|
{
|
|
|
|
const SCCOLROW* pTabRanges = pRanges;
|
|
|
|
for ( SCCOLROW nRange = 0; nRange < nRangeCnt; ++nRange )
|
|
|
|
{
|
|
|
|
SCCOL nStartCol = static_cast< SCCOL >( *(pTabRanges++) );
|
|
|
|
SCCOL nEndCol = static_cast< SCCOL >( *(pTabRanges++) );
|
|
|
|
for ( SCCOL nCol = nStartCol; nCol <= nEndCol; ++nCol )
|
|
|
|
{
|
|
|
|
aChangeRanges.Append( ScRange( nCol, 0, nTab ) );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
pModelObj->NotifyChanges( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "column-resize" ) ), aChangeRanges );
|
|
|
|
}
|
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Spaltenbreiten/Zeilenhoehen (ueber Blockmarken)
|
|
|
|
|
|
|
|
void ScViewFunc::SetMarkedWidthOrHeight( BOOL bWidth, ScSizeMode eMode, USHORT nSizeTwips,
|
|
|
|
BOOL bRecord, BOOL bPaint )
|
|
|
|
{
|
|
|
|
ScMarkData& rMark = GetViewData()->GetMarkData();
|
|
|
|
|
|
|
|
rMark.MarkToMulti();
|
|
|
|
if (!rMark.IsMultiMarked())
|
|
|
|
{
|
2004-06-04 11:11:19 +00:00
|
|
|
SCCOL nCol = GetViewData()->GetCurX();
|
|
|
|
SCROW nRow = GetViewData()->GetCurY();
|
|
|
|
SCTAB nTab = GetViewData()->GetTabNo();
|
2000-09-18 16:07:07 +00:00
|
|
|
DoneBlockMode();
|
|
|
|
InitOwnBlockMode();
|
|
|
|
rMark.SetMultiMarkArea( ScRange( nCol,nRow,nTab ), TRUE );
|
2008-02-19 14:42:20 +00:00
|
|
|
MarkDataChanged();
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
2004-06-04 11:11:19 +00:00
|
|
|
SCCOLROW* pRanges = new SCCOLROW[MAXCOLROWCOUNT];
|
|
|
|
SCCOLROW nRangeCnt = 0;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if ( bWidth )
|
|
|
|
nRangeCnt = rMark.GetMarkColumnRanges( pRanges );
|
|
|
|
else
|
|
|
|
nRangeCnt = rMark.GetMarkRowRanges( pRanges );
|
|
|
|
|
|
|
|
SetWidthOrHeight( bWidth, nRangeCnt, pRanges, eMode, nSizeTwips, bRecord, bPaint );
|
|
|
|
|
|
|
|
delete[] pRanges;
|
|
|
|
rMark.MarkToSimple();
|
|
|
|
}
|
|
|
|
|
|
|
|
void ScViewFunc::ModifyCellSize( ScDirection eDir, BOOL bOptimal )
|
|
|
|
{
|
|
|
|
//! Schrittweiten einstellbar
|
|
|
|
// Schrittweite ist auch Minimum
|
|
|
|
USHORT nStepX = STD_COL_WIDTH / 5;
|
|
|
|
USHORT nStepY = ScGlobal::nStdRowHeight;
|
|
|
|
|
|
|
|
ScModule* pScMod = SC_MOD();
|
|
|
|
BOOL bAnyEdit = pScMod->IsInputMode();
|
2004-06-04 11:11:19 +00:00
|
|
|
SCCOL nCol = GetViewData()->GetCurX();
|
|
|
|
SCROW nRow = GetViewData()->GetCurY();
|
|
|
|
SCTAB nTab = GetViewData()->GetTabNo();
|
2001-10-31 14:59:24 +00:00
|
|
|
ScDocShell* pDocSh = GetViewData()->GetDocShell();
|
|
|
|
ScDocument* pDoc = pDocSh->GetDocument();
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
BOOL bAllowed, bOnlyMatrix;
|
|
|
|
if ( eDir == DIR_LEFT || eDir == DIR_RIGHT )
|
|
|
|
bAllowed = pDoc->IsBlockEditable( nTab, nCol,0, nCol,MAXROW, &bOnlyMatrix );
|
|
|
|
else
|
|
|
|
bAllowed = pDoc->IsBlockEditable( nTab, 0,nRow, MAXCOL,nRow, &bOnlyMatrix );
|
|
|
|
if ( !bAllowed && !bOnlyMatrix )
|
|
|
|
{
|
|
|
|
ErrorMessage(STR_PROTECTIONERR);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
HideAllCursors();
|
|
|
|
|
|
|
|
USHORT nWidth = pDoc->GetColWidth( nCol, nTab );
|
|
|
|
USHORT nHeight = pDoc->GetRowHeight( nRow, nTab );
|
2004-06-04 11:11:19 +00:00
|
|
|
SCCOLROW nRange[2];
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( eDir == DIR_LEFT || eDir == DIR_RIGHT )
|
|
|
|
{
|
|
|
|
if (bOptimal) // Breite dieser einen Zelle
|
|
|
|
{
|
|
|
|
if ( bAnyEdit )
|
|
|
|
{
|
|
|
|
// beim Editieren die aktuelle Breite der Eingabe
|
|
|
|
ScInputHandler* pHdl = pScMod->GetInputHdl( GetViewData()->GetViewShell() );
|
|
|
|
if (pHdl)
|
|
|
|
{
|
|
|
|
long nEdit = pHdl->GetTextSize().Width(); // in 1/100mm
|
|
|
|
|
|
|
|
const ScPatternAttr* pPattern = pDoc->GetPattern( nCol, nRow, nTab );
|
|
|
|
const SvxMarginItem& rMItem =
|
|
|
|
(const SvxMarginItem&)pPattern->GetItem(ATTR_MARGIN);
|
|
|
|
USHORT nMargin = rMItem.GetLeftMargin() + rMItem.GetRightMargin();
|
|
|
|
if ( ((const SvxHorJustifyItem&) pPattern->
|
|
|
|
GetItem( ATTR_HOR_JUSTIFY )).GetValue() == SVX_HOR_JUSTIFY_LEFT )
|
2007-02-27 13:01:43 +00:00
|
|
|
nMargin = sal::static_int_cast<USHORT>(
|
|
|
|
nMargin + ((const SfxUInt16Item&)pPattern->GetItem(ATTR_INDENT)).GetValue() );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
nWidth = (USHORT)(nEdit * pDocSh->GetOutputFactor() / HMM_PER_TWIPS)
|
|
|
|
+ nMargin + STD_EXTRA_WIDTH;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2001-10-31 14:59:24 +00:00
|
|
|
double nPPTX = GetViewData()->GetPPTX();
|
|
|
|
double nPPTY = GetViewData()->GetPPTY();
|
|
|
|
Fraction aZoomX = GetViewData()->GetZoomX();
|
|
|
|
Fraction aZoomY = GetViewData()->GetZoomY();
|
|
|
|
|
|
|
|
ScSizeDeviceProvider aProv(pDocSh);
|
|
|
|
if (aProv.IsPrinter())
|
|
|
|
{
|
|
|
|
nPPTX = aProv.GetPPTX();
|
|
|
|
nPPTY = aProv.GetPPTY();
|
|
|
|
aZoomX = aZoomY = Fraction( 1, 1 );
|
|
|
|
}
|
|
|
|
|
|
|
|
long nPixel = pDoc->GetNeededSize( nCol, nRow, nTab, aProv.GetDevice(),
|
|
|
|
nPPTX, nPPTY, aZoomX, aZoomY, TRUE );
|
|
|
|
USHORT nTwips = (USHORT)( nPixel / nPPTX );
|
2000-09-18 16:07:07 +00:00
|
|
|
if (nTwips != 0)
|
|
|
|
nWidth = nTwips + STD_EXTRA_WIDTH;
|
|
|
|
else
|
|
|
|
nWidth = STD_COL_WIDTH;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else // vergroessern / verkleinern
|
|
|
|
{
|
|
|
|
if ( eDir == DIR_RIGHT )
|
2007-02-27 13:01:43 +00:00
|
|
|
nWidth = sal::static_int_cast<USHORT>( nWidth + nStepX );
|
2000-09-18 16:07:07 +00:00
|
|
|
else if ( nWidth > nStepX )
|
2007-02-27 13:01:43 +00:00
|
|
|
nWidth = sal::static_int_cast<USHORT>( nWidth - nStepX );
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( nWidth < nStepX ) nWidth = nStepX;
|
|
|
|
if ( nWidth > MAX_COL_WIDTH ) nWidth = MAX_COL_WIDTH;
|
|
|
|
}
|
|
|
|
nRange[0] = nRange[1] = nCol;
|
|
|
|
SetWidthOrHeight( TRUE, 1, nRange, SC_SIZE_DIRECT, nWidth );
|
|
|
|
|
|
|
|
// hier bei Breite auch Hoehe anpassen (nur die eine Zeile)
|
|
|
|
|
|
|
|
if (!bAnyEdit)
|
|
|
|
{
|
|
|
|
const ScPatternAttr* pPattern = pDoc->GetPattern( nCol, nRow, nTab );
|
|
|
|
BOOL bNeedHeight =
|
|
|
|
((const SfxBoolItem&)pPattern->GetItem( ATTR_LINEBREAK )).GetValue() ||
|
|
|
|
((const SvxHorJustifyItem&)pPattern->
|
|
|
|
GetItem( ATTR_HOR_JUSTIFY )).GetValue() == SVX_HOR_JUSTIFY_BLOCK;
|
|
|
|
if (bNeedHeight)
|
|
|
|
AdjustRowHeight( nRow, nRow );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ScSizeMode eMode;
|
|
|
|
if (bOptimal)
|
|
|
|
{
|
|
|
|
eMode = SC_SIZE_OPTIMAL;
|
|
|
|
nHeight = 0;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
eMode = SC_SIZE_DIRECT;
|
|
|
|
if ( eDir == DIR_BOTTOM )
|
2007-02-27 13:01:43 +00:00
|
|
|
nHeight = sal::static_int_cast<USHORT>( nHeight + nStepY );
|
2000-09-18 16:07:07 +00:00
|
|
|
else if ( nHeight > nStepY )
|
2007-02-27 13:01:43 +00:00
|
|
|
nHeight = sal::static_int_cast<USHORT>( nHeight - nStepY );
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( nHeight < nStepY ) nHeight = nStepY;
|
|
|
|
if ( nHeight > MAX_COL_HEIGHT ) nHeight = MAX_COL_HEIGHT;
|
|
|
|
//! MAX_COL_HEIGHT umbenennen in MAX_ROW_HEIGHT in global.hxx !!!!!!
|
|
|
|
}
|
|
|
|
nRange[0] = nRange[1] = nRow;
|
|
|
|
SetWidthOrHeight( FALSE, 1, nRange, eMode, nHeight );
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( bAnyEdit )
|
|
|
|
{
|
|
|
|
UpdateEditView();
|
|
|
|
if ( pDoc->HasAttrib( nCol, nRow, nTab, nCol, nRow, nTab, HASATTR_NEEDHEIGHT ) )
|
|
|
|
{
|
|
|
|
ScInputHandler* pHdl = pScMod->GetInputHdl( GetViewData()->GetViewShell() );
|
|
|
|
if (pHdl)
|
|
|
|
pHdl->SetModified(); // damit bei Enter die Hoehe angepasst wird
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
ShowAllCursors();
|
|
|
|
}
|
|
|
|
|
2004-06-04 11:11:19 +00:00
|
|
|
void ScViewFunc::Protect( SCTAB nTab, const String& rPassword )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
ScMarkData& rMark = GetViewData()->GetMarkData();
|
|
|
|
ScDocShell* pDocSh = GetViewData()->GetDocShell();
|
2001-02-14 14:34:08 +00:00
|
|
|
ScDocument* pDoc = pDocSh->GetDocument();
|
2000-09-18 16:07:07 +00:00
|
|
|
ScDocFunc aFunc(*pDocSh);
|
2001-02-14 14:34:08 +00:00
|
|
|
BOOL bUndo(pDoc->IsUndoEnabled());
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if ( nTab == TABLEID_DOC || rMark.GetSelectCount() <= 1 )
|
|
|
|
aFunc.Protect( nTab, rPassword, FALSE );
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// modifying several tables is handled here
|
|
|
|
|
2001-02-14 14:34:08 +00:00
|
|
|
if (bUndo)
|
|
|
|
{
|
|
|
|
String aUndo = ScGlobal::GetRscString( STR_UNDO_PROTECT_TAB );
|
|
|
|
pDocSh->GetUndoManager()->EnterListAction( aUndo, aUndo );
|
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2004-06-04 11:11:19 +00:00
|
|
|
SCTAB nCount = pDocSh->GetDocument()->GetTableCount();
|
|
|
|
for ( SCTAB i=0; i<nCount; i++ )
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( rMark.GetTableSelect(i) )
|
|
|
|
aFunc.Protect( i, rPassword, FALSE );
|
|
|
|
|
2001-02-14 14:34:08 +00:00
|
|
|
if (bUndo)
|
|
|
|
pDocSh->GetUndoManager()->LeaveListAction();
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
UpdateLayerLocks(); //! broadcast to all views
|
|
|
|
}
|
|
|
|
|
2004-06-04 11:11:19 +00:00
|
|
|
BOOL ScViewFunc::Unprotect( SCTAB nTab, const String& rPassword )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
ScMarkData& rMark = GetViewData()->GetMarkData();
|
|
|
|
ScDocShell* pDocSh = GetViewData()->GetDocShell();
|
2001-02-14 14:34:08 +00:00
|
|
|
ScDocument* pDoc = pDocSh->GetDocument();
|
2000-09-18 16:07:07 +00:00
|
|
|
ScDocFunc aFunc(*pDocSh);
|
|
|
|
BOOL bChanged = FALSE;
|
2001-02-14 14:34:08 +00:00
|
|
|
BOOL bUndo (pDoc->IsUndoEnabled());
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if ( nTab == TABLEID_DOC || rMark.GetSelectCount() <= 1 )
|
|
|
|
bChanged = aFunc.Unprotect( nTab, rPassword, FALSE );
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// modifying several tables is handled here
|
|
|
|
|
2001-02-14 14:34:08 +00:00
|
|
|
if (bUndo)
|
|
|
|
{
|
|
|
|
String aUndo = ScGlobal::GetRscString( STR_UNDO_UNPROTECT_TAB );
|
|
|
|
pDocSh->GetUndoManager()->EnterListAction( aUndo, aUndo );
|
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2004-06-04 11:11:19 +00:00
|
|
|
SCTAB nCount = pDocSh->GetDocument()->GetTableCount();
|
|
|
|
for ( SCTAB i=0; i<nCount; i++ )
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( rMark.GetTableSelect(i) )
|
|
|
|
if ( aFunc.Unprotect( i, rPassword, FALSE ) )
|
|
|
|
bChanged = TRUE;
|
|
|
|
|
2001-02-14 14:34:08 +00:00
|
|
|
if (bUndo)
|
|
|
|
pDocSh->GetUndoManager()->LeaveListAction();
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (bChanged)
|
|
|
|
UpdateLayerLocks(); //! broadcast to all views
|
|
|
|
|
|
|
|
return bChanged;
|
|
|
|
}
|
|
|
|
|
2009-03-02 14:19:13 +00:00
|
|
|
void ScViewFunc::SetNoteText( const ScAddress& rPos, const String& rNoteText )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2009-03-02 14:19:13 +00:00
|
|
|
GetViewData()->GetDocShell()->GetDocFunc().SetNoteText( rPos, rNoteText, FALSE );
|
|
|
|
}
|
|
|
|
|
|
|
|
void ScViewFunc::ReplaceNote( const ScAddress& rPos, const String& rNoteText, const String* pAuthor, const String* pDate )
|
|
|
|
{
|
|
|
|
GetViewData()->GetDocShell()->GetDocFunc().ReplaceNote( rPos, rNoteText, pAuthor, pDate, FALSE );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void ScViewFunc::SetNumberFormat( short nFormatType, ULONG nAdd )
|
|
|
|
{
|
|
|
|
// nur wegen Matrix nicht editierbar? Attribute trotzdem ok
|
|
|
|
BOOL bOnlyNotBecauseOfMatrix;
|
|
|
|
if ( !SelectionEditable( &bOnlyNotBecauseOfMatrix ) && !bOnlyNotBecauseOfMatrix )
|
|
|
|
{
|
|
|
|
ErrorMessage(STR_PROTECTIONERR);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2005-12-14 14:12:16 +00:00
|
|
|
sal_uInt32 nNumberFormat = 0;
|
2000-09-18 16:07:07 +00:00
|
|
|
ScViewData* pViewData = GetViewData();
|
|
|
|
ScDocument* pDoc = pViewData->GetDocument();
|
|
|
|
SvNumberFormatter* pNumberFormatter = pDoc->GetFormatTable();
|
|
|
|
LanguageType eLanguage = ScGlobal::eLnge;
|
|
|
|
ScPatternAttr aNewAttrs( pDoc->GetPool() );
|
|
|
|
|
|
|
|
// #67936# always take language from cursor position, even if there is a selection
|
|
|
|
|
2005-12-14 14:12:16 +00:00
|
|
|
sal_uInt32 nCurrentNumberFormat;
|
2000-09-18 16:07:07 +00:00
|
|
|
pDoc->GetNumberFormat( pViewData->GetCurX(),
|
|
|
|
pViewData->GetCurY(),
|
|
|
|
pViewData->GetTabNo(),
|
|
|
|
nCurrentNumberFormat );
|
|
|
|
const SvNumberformat* pEntry = pNumberFormatter->GetEntry( nCurrentNumberFormat );
|
|
|
|
if (pEntry)
|
|
|
|
eLanguage = pEntry->GetLanguage(); // sonst ScGlobal::eLnge behalten
|
|
|
|
|
|
|
|
nNumberFormat = pNumberFormatter->GetStandardFormat( nFormatType, eLanguage ) + nAdd;
|
|
|
|
|
|
|
|
SfxItemSet& rSet = aNewAttrs.GetItemSet();
|
|
|
|
rSet.Put( SfxUInt32Item( ATTR_VALUE_FORMAT, nNumberFormat ) );
|
|
|
|
// ATTR_LANGUAGE_FORMAT nicht
|
|
|
|
ApplySelectionPattern( aNewAttrs, TRUE );
|
|
|
|
}
|
|
|
|
|
|
|
|
void ScViewFunc::SetNumFmtByStr( const String& rCode )
|
|
|
|
{
|
|
|
|
// nur wegen Matrix nicht editierbar? Attribute trotzdem ok
|
|
|
|
BOOL bOnlyNotBecauseOfMatrix;
|
|
|
|
if ( !SelectionEditable( &bOnlyNotBecauseOfMatrix ) && !bOnlyNotBecauseOfMatrix )
|
|
|
|
{
|
|
|
|
ErrorMessage(STR_PROTECTIONERR);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
ScViewData* pViewData = GetViewData();
|
|
|
|
ScDocument* pDoc = pViewData->GetDocument();
|
|
|
|
SvNumberFormatter* pFormatter = pDoc->GetFormatTable();
|
|
|
|
|
|
|
|
// Sprache immer von Cursorposition
|
|
|
|
|
2005-12-14 14:12:16 +00:00
|
|
|
sal_uInt32 nCurrentNumberFormat;
|
2000-09-18 16:07:07 +00:00
|
|
|
pDoc->GetNumberFormat( pViewData->GetCurX(), pViewData->GetCurY(),
|
|
|
|
pViewData->GetTabNo(), nCurrentNumberFormat );
|
|
|
|
const SvNumberformat* pEntry = pFormatter->GetEntry( nCurrentNumberFormat );
|
|
|
|
LanguageType eLanguage = pEntry ? pEntry->GetLanguage() : ScGlobal::eLnge;
|
|
|
|
|
|
|
|
// Index fuer String bestimmen
|
|
|
|
|
|
|
|
BOOL bOk = TRUE;
|
2005-12-14 14:12:16 +00:00
|
|
|
sal_uInt32 nNumberFormat = pFormatter->GetEntryKey( rCode, eLanguage );
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( nNumberFormat == NUMBERFORMAT_ENTRY_NOT_FOUND )
|
|
|
|
{
|
|
|
|
// neu eintragen
|
|
|
|
|
|
|
|
String aFormat = rCode; // wird veraendert
|
|
|
|
xub_StrLen nErrPos = 0;
|
|
|
|
short nType = 0; //! ???
|
|
|
|
bOk = pFormatter->PutEntry( aFormat, nErrPos, nType, nNumberFormat, eLanguage );
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( bOk ) // gueltiges Format?
|
|
|
|
{
|
|
|
|
ScPatternAttr aNewAttrs( pDoc->GetPool() );
|
|
|
|
SfxItemSet& rSet = aNewAttrs.GetItemSet();
|
|
|
|
rSet.Put( SfxUInt32Item( ATTR_VALUE_FORMAT, nNumberFormat ) );
|
|
|
|
rSet.Put( SvxLanguageItem( eLanguage, ATTR_LANGUAGE_FORMAT ) );
|
|
|
|
ApplySelectionPattern( aNewAttrs, TRUE );
|
|
|
|
}
|
|
|
|
|
|
|
|
//! sonst Fehler zuerueckgeben / Meldung ausgeben ???
|
|
|
|
}
|
|
|
|
|
|
|
|
void ScViewFunc::ChangeNumFmtDecimals( BOOL bIncrement )
|
|
|
|
{
|
|
|
|
// nur wegen Matrix nicht editierbar? Attribute trotzdem ok
|
|
|
|
BOOL bOnlyNotBecauseOfMatrix;
|
|
|
|
if ( !SelectionEditable( &bOnlyNotBecauseOfMatrix ) && !bOnlyNotBecauseOfMatrix )
|
|
|
|
{
|
|
|
|
ErrorMessage(STR_PROTECTIONERR);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
ScDocument* pDoc = GetViewData()->GetDocument();
|
|
|
|
SvNumberFormatter* pFormatter = pDoc->GetFormatTable();
|
|
|
|
|
2004-06-04 11:11:19 +00:00
|
|
|
SCCOL nCol = GetViewData()->GetCurX();
|
|
|
|
SCROW nRow = GetViewData()->GetCurY();
|
|
|
|
SCTAB nTab = GetViewData()->GetTabNo();
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2005-12-14 14:12:16 +00:00
|
|
|
sal_uInt32 nOldFormat;
|
2000-09-18 16:07:07 +00:00
|
|
|
pDoc->GetNumberFormat( nCol, nRow, nTab, nOldFormat );
|
|
|
|
const SvNumberformat* pOldEntry = pFormatter->GetEntry( nOldFormat );
|
|
|
|
if (!pOldEntry)
|
|
|
|
{
|
|
|
|
DBG_ERROR("Zahlformat nicht gefunden !!!");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// was haben wir denn da?
|
|
|
|
|
2005-12-14 14:12:16 +00:00
|
|
|
sal_uInt32 nNewFormat = nOldFormat;
|
2000-09-18 16:07:07 +00:00
|
|
|
BOOL bError = FALSE;
|
|
|
|
|
|
|
|
LanguageType eLanguage = pOldEntry->GetLanguage();
|
|
|
|
BOOL bThousand, bNegRed;
|
|
|
|
USHORT nPrecision, nLeading;
|
2001-01-26 16:50:11 +00:00
|
|
|
pOldEntry->GetFormatSpecialInfo( bThousand, bNegRed, nPrecision, nLeading );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
short nOldType = pOldEntry->GetType();
|
|
|
|
if ( 0 == ( nOldType & (
|
|
|
|
NUMBERFORMAT_NUMBER | NUMBERFORMAT_CURRENCY | NUMBERFORMAT_PERCENT ) ) )
|
|
|
|
{
|
|
|
|
// Datum, Zeit, Bruch, logisch, Text kann nicht angepasst werden
|
|
|
|
//! bei Wisssenschaftlich kann es der Numberformatter auch nicht
|
|
|
|
bError = TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
//! Das SvNumberformat hat einen Member bStandard, verraet ihn aber nicht
|
|
|
|
BOOL bWasStandard = ( nOldFormat == pFormatter->GetStandardIndex( eLanguage ) );
|
|
|
|
if (bWasStandard)
|
|
|
|
{
|
|
|
|
// bei "Standard" die Nachkommastellen abhaengig vom Zellinhalt
|
|
|
|
// 0 bei leer oder Text -> keine Nachkommastellen
|
|
|
|
double nVal = pDoc->GetValue( ScAddress( nCol, nRow, nTab ) );
|
|
|
|
|
|
|
|
// Die Wege des Numberformatters sind unergruendlich, darum ausprobieren:
|
|
|
|
String aOut;
|
|
|
|
Color* pCol;
|
|
|
|
((SvNumberformat*)pOldEntry)->GetOutputString( nVal, aOut, &pCol );
|
|
|
|
|
|
|
|
nPrecision = 0;
|
|
|
|
// 'E' fuer Exponential ist fest im Numberformatter
|
|
|
|
if ( aOut.Search('E') != STRING_NOTFOUND )
|
|
|
|
bError = TRUE; // Exponential nicht veraendern
|
|
|
|
else
|
|
|
|
{
|
2001-01-30 14:20:03 +00:00
|
|
|
String aDecSep( pFormatter->GetFormatDecimalSep( nOldFormat ) );
|
|
|
|
xub_StrLen nPos = aOut.Search( aDecSep );
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( nPos != STRING_NOTFOUND )
|
2001-01-30 14:20:03 +00:00
|
|
|
nPrecision = aOut.Len() - nPos - aDecSep.Len();
|
2000-09-18 16:07:07 +00:00
|
|
|
// sonst 0 behalten
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!bError)
|
|
|
|
{
|
|
|
|
if (bIncrement)
|
|
|
|
{
|
|
|
|
if (nPrecision<20)
|
|
|
|
++nPrecision; // erhoehen
|
|
|
|
else
|
|
|
|
bError = TRUE; // 20 ist Maximum
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (nPrecision)
|
|
|
|
--nPrecision; // vermindern
|
|
|
|
else
|
|
|
|
bError = TRUE; // weniger als 0 geht nicht
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!bError)
|
|
|
|
{
|
|
|
|
String aNewPicture;
|
|
|
|
pFormatter->GenerateFormat( aNewPicture, nOldFormat, eLanguage,
|
|
|
|
bThousand, bNegRed, nPrecision, nLeading );
|
|
|
|
|
|
|
|
nNewFormat = pFormatter->GetEntryKey( aNewPicture, eLanguage );
|
|
|
|
if ( nNewFormat == NUMBERFORMAT_ENTRY_NOT_FOUND )
|
|
|
|
{
|
|
|
|
xub_StrLen nErrPos = 0;
|
|
|
|
short nNewType = 0;
|
|
|
|
BOOL bOk = pFormatter->PutEntry( aNewPicture, nErrPos,
|
|
|
|
nNewType, nNewFormat, eLanguage );
|
|
|
|
DBG_ASSERT( bOk, "falsches Zahlformat generiert" );
|
|
|
|
if (!bOk)
|
|
|
|
bError = TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!bError)
|
|
|
|
{
|
|
|
|
ScPatternAttr aNewAttrs( pDoc->GetPool() );
|
|
|
|
SfxItemSet& rSet = aNewAttrs.GetItemSet();
|
|
|
|
rSet.Put( SfxUInt32Item( ATTR_VALUE_FORMAT, nNewFormat ) );
|
|
|
|
// ATTR_LANGUAGE_FORMAT nicht
|
|
|
|
ApplySelectionPattern( aNewAttrs, TRUE );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
Sound::Beep(); // war nix
|
|
|
|
}
|
|
|
|
|
|
|
|
void ScViewFunc::ChangeIndent( BOOL bIncrement )
|
|
|
|
{
|
|
|
|
ScViewData* pViewData = GetViewData();
|
|
|
|
ScDocShell* pDocSh = pViewData->GetDocShell();
|
|
|
|
ScMarkData& rMark = pViewData->GetMarkData();
|
|
|
|
|
|
|
|
ScMarkData aWorkMark = rMark;
|
2004-09-09 08:31:12 +00:00
|
|
|
ScViewUtil::UnmarkFiltered( aWorkMark, pDocSh->GetDocument() );
|
2000-09-18 16:07:07 +00:00
|
|
|
aWorkMark.MarkToMulti();
|
|
|
|
if (!aWorkMark.IsMultiMarked())
|
|
|
|
{
|
2004-06-04 11:11:19 +00:00
|
|
|
SCCOL nCol = pViewData->GetCurX();
|
|
|
|
SCROW nRow = pViewData->GetCurY();
|
|
|
|
SCTAB nTab = pViewData->GetTabNo();
|
2000-09-18 16:07:07 +00:00
|
|
|
aWorkMark.SetMultiMarkArea( ScRange(nCol,nRow,nTab) );
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL bSuccess = pDocSh->GetDocFunc().ChangeIndent( aWorkMark, bIncrement, FALSE );
|
|
|
|
if (bSuccess)
|
|
|
|
{
|
|
|
|
pDocSh->UpdateOle(pViewData);
|
|
|
|
StartFormatArea();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL ScViewFunc::InsertName( const String& rName, const String& rSymbol,
|
|
|
|
const String& rType )
|
|
|
|
{
|
|
|
|
// Type = P,R,C,F (und Kombinationen)
|
|
|
|
//! Undo...
|
|
|
|
|
|
|
|
BOOL bOk = FALSE;
|
|
|
|
ScDocShell* pDocSh = GetViewData()->GetDocShell();
|
|
|
|
ScDocument* pDoc = pDocSh->GetDocument();
|
2004-06-04 11:11:19 +00:00
|
|
|
SCTAB nTab = GetViewData()->GetTabNo();
|
2000-09-18 16:07:07 +00:00
|
|
|
ScRangeName* pList = pDoc->GetRangeName();
|
|
|
|
|
|
|
|
RangeType nType = RT_NAME;
|
|
|
|
ScRangeData* pNewEntry = new ScRangeData( pDoc, rName, rSymbol,
|
2002-11-28 15:16:44 +00:00
|
|
|
ScAddress( GetViewData()->GetCurX(), GetViewData()->GetCurY(),
|
|
|
|
nTab), nType );
|
2000-09-18 16:07:07 +00:00
|
|
|
String aUpType = rType;
|
|
|
|
aUpType.ToUpperAscii();
|
|
|
|
if ( aUpType.Search( 'P' ) != STRING_NOTFOUND )
|
|
|
|
nType |= RT_PRINTAREA;
|
|
|
|
if ( aUpType.Search( 'R' ) != STRING_NOTFOUND )
|
|
|
|
nType |= RT_ROWHEADER;
|
|
|
|
if ( aUpType.Search( 'C' ) != STRING_NOTFOUND )
|
|
|
|
nType |= RT_COLHEADER;
|
|
|
|
if ( aUpType.Search( 'F' ) != STRING_NOTFOUND )
|
|
|
|
nType |= RT_CRITERIA;
|
|
|
|
pNewEntry->AddType(nType);
|
|
|
|
|
|
|
|
if ( !pNewEntry->GetErrCode() ) // Text gueltig?
|
|
|
|
{
|
|
|
|
ScDocShellModificator aModificator( *pDocSh );
|
|
|
|
|
|
|
|
pDoc->CompileNameFormula( TRUE ); // CreateFormulaString
|
|
|
|
|
|
|
|
// Eintrag bereits vorhanden? Dann vorher entfernen (=Aendern)
|
|
|
|
USHORT nFoundAt;
|
|
|
|
if ( pList->SearchName( rName, nFoundAt ) )
|
|
|
|
{ // alten Index uebernehmen
|
|
|
|
pNewEntry->SetIndex( ((ScRangeData*)pList->At(nFoundAt))->GetIndex() );
|
|
|
|
pList->AtFree( nFoundAt );
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( pList->Insert( pNewEntry ) )
|
|
|
|
{
|
|
|
|
pNewEntry = NULL; // nicht loeschen
|
|
|
|
bOk = TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
pDoc->CompileNameFormula( FALSE ); // CompileFormulaString
|
|
|
|
aModificator.SetDocumentModified();
|
|
|
|
SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREAS_CHANGED ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
delete pNewEntry; // wenn er nicht eingefuegt wurde
|
|
|
|
return bOk;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ScViewFunc::CreateNames( USHORT nFlags )
|
|
|
|
{
|
|
|
|
BOOL bDone = FALSE;
|
|
|
|
ScRange aRange;
|
2008-04-18 10:50:48 +00:00
|
|
|
if ( GetViewData()->GetSimpleArea(aRange) == SC_MARK_SIMPLE )
|
2000-09-18 16:07:07 +00:00
|
|
|
bDone = GetViewData()->GetDocShell()->GetDocFunc().CreateNames( aRange, nFlags, FALSE );
|
|
|
|
|
|
|
|
if (!bDone)
|
|
|
|
ErrorMessage(STR_CREATENAME_MARKERR);
|
|
|
|
}
|
|
|
|
|
|
|
|
USHORT ScViewFunc::GetCreateNameFlags()
|
|
|
|
{
|
|
|
|
USHORT nFlags = 0;
|
|
|
|
|
2004-06-04 11:11:19 +00:00
|
|
|
SCCOL nStartCol, nEndCol;
|
|
|
|
SCROW nStartRow, nEndRow;
|
|
|
|
SCTAB nDummy;
|
2008-04-18 10:50:48 +00:00
|
|
|
if (GetViewData()->GetSimpleArea(nStartCol,nStartRow,nDummy,nEndCol,nEndRow,nDummy) == SC_MARK_SIMPLE)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
ScDocument* pDoc = GetViewData()->GetDocument();
|
2004-06-04 11:11:19 +00:00
|
|
|
SCTAB nTab = GetViewData()->GetTabNo();
|
2000-09-18 16:07:07 +00:00
|
|
|
BOOL bOk;
|
2004-06-04 11:11:19 +00:00
|
|
|
SCCOL i;
|
|
|
|
SCROW j;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
bOk = TRUE;
|
2004-06-04 11:11:19 +00:00
|
|
|
SCCOL nFirstCol = nStartCol;
|
|
|
|
SCCOL nLastCol = nEndCol;
|
2000-09-18 16:07:07 +00:00
|
|
|
if (nStartCol+1 < nEndCol) { ++nFirstCol; --nLastCol; }
|
|
|
|
for (i=nFirstCol; i<=nLastCol && bOk; i++)
|
|
|
|
if (!pDoc->HasStringData( i,nStartRow,nTab ))
|
|
|
|
bOk = FALSE;
|
|
|
|
if (bOk)
|
|
|
|
nFlags |= NAME_TOP;
|
|
|
|
else // Bottom nur wenn nicht Top
|
|
|
|
{
|
|
|
|
bOk = TRUE;
|
|
|
|
for (i=nFirstCol; i<=nLastCol && bOk; i++)
|
|
|
|
if (!pDoc->HasStringData( i,nEndRow,nTab ))
|
|
|
|
bOk = FALSE;
|
|
|
|
if (bOk)
|
|
|
|
nFlags |= NAME_BOTTOM;
|
|
|
|
}
|
|
|
|
|
|
|
|
bOk = TRUE;
|
2004-06-04 11:11:19 +00:00
|
|
|
SCROW nFirstRow = nStartRow;
|
|
|
|
SCROW nLastRow = nEndRow;
|
2000-09-18 16:07:07 +00:00
|
|
|
if (nStartRow+1 < nEndRow) { ++nFirstRow; --nLastRow; }
|
2004-06-04 11:11:19 +00:00
|
|
|
for (j=nFirstRow; j<=nLastRow && bOk; j++)
|
|
|
|
if (!pDoc->HasStringData( nStartCol,j,nTab ))
|
2000-09-18 16:07:07 +00:00
|
|
|
bOk = FALSE;
|
|
|
|
if (bOk)
|
|
|
|
nFlags |= NAME_LEFT;
|
|
|
|
else // Right nur wenn nicht Left
|
|
|
|
{
|
|
|
|
bOk = TRUE;
|
2004-06-04 11:11:19 +00:00
|
|
|
for (j=nFirstRow; j<=nLastRow && bOk; j++)
|
|
|
|
if (!pDoc->HasStringData( nEndCol,j,nTab ))
|
2000-09-18 16:07:07 +00:00
|
|
|
bOk = FALSE;
|
|
|
|
if (bOk)
|
|
|
|
nFlags |= NAME_RIGHT;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (nStartCol == nEndCol)
|
|
|
|
nFlags &= ~( NAME_LEFT | NAME_RIGHT );
|
|
|
|
if (nStartRow == nEndRow)
|
|
|
|
nFlags &= ~( NAME_TOP | NAME_BOTTOM );
|
|
|
|
|
|
|
|
return nFlags;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ScViewFunc::InsertNameList()
|
|
|
|
{
|
|
|
|
ScAddress aPos( GetViewData()->GetCurX(), GetViewData()->GetCurY(), GetViewData()->GetTabNo() );
|
|
|
|
ScDocShell* pDocSh = GetViewData()->GetDocShell();
|
|
|
|
if ( pDocSh->GetDocFunc().InsertNameList( aPos, FALSE ) )
|
|
|
|
pDocSh->UpdateOle(GetViewData());
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|