[ooo-build-commit] Branch 'ooo/master' - 2 commits - sc/inc sc/source
Jan Holesovsky
kendy at kemper.freedesktop.org
Mon Jun 15 17:09:34 PDT 2009
sc/inc/cell.hxx | 3
sc/inc/compiler.hxx | 3
sc/inc/document.hxx | 12 +
sc/inc/dpobject.hxx | 3
sc/inc/global.hxx | 19 +-
sc/inc/globstr.hrc | 1
sc/source/core/data/cell2.cxx | 17 +-
sc/source/core/data/column.cxx | 5
sc/source/core/data/column3.cxx | 47 ++++++
sc/source/core/data/documen8.cxx | 13 +
sc/source/core/data/document.cxx | 253 +++++++++++++++++++++++++++----------
sc/source/core/data/dpobject.cxx | 9 -
sc/source/core/data/validat.cxx | 44 ++++++
sc/source/core/tool/token.cxx | 3
sc/source/ui/docshell/dbdocfun.cxx | 21 ++-
sc/source/ui/docshell/docfunc.cxx | 133 ++++---------------
sc/source/ui/src/globstr.src | 4
sc/source/ui/unoobj/cellsuno.cxx | 4
sc/source/ui/unoobj/tokenuno.cxx | 2
sc/source/ui/view/dbfunc3.cxx | 6
sc/source/ui/view/gridwin.cxx | 7 +
sc/source/ui/view/output2.cxx | 6
sc/source/ui/view/viewfunc.cxx | 132 +++++++------------
23 files changed, 455 insertions(+), 292 deletions(-)
New commits:
commit a07990f65724f1eacc7f1c1c2c6cc3d2e2b7e6e9
Author: Ivo Hinkelmann <ihi at openoffice.org>
Date: Mon Jun 15 11:12:30 2009 +0000
CWS-TOOLING: integrate CWS fhawfixes1
2009-06-03 17:24:54 +0200 fredrikh r272595 : i102444
2009-06-03 16:58:38 +0200 fredrikh r272594 : i102477
2009-06-03 16:33:41 +0200 fredrikh r272585 : i102476
2009-06-03 15:39:59 +0200 fredrikh r272582 : i102444
2009-06-03 11:03:38 +0200 fredrikh r272547 : i102451
2009-06-02 18:26:24 +0200 fredrikh r272526 : i102444
2009-06-02 18:21:43 +0200 fredrikh r272525 : i95309
2009-06-02 18:21:10 +0200 fredrikh r272524 : i95309
2009-06-02 18:20:26 +0200 fredrikh r272523 : i102287
2009-06-02 18:19:59 +0200 fredrikh r272522 : i102287
2009-06-02 18:19:37 +0200 fredrikh r272521 : i102287
2009-06-02 18:19:23 +0200 fredrikh r272520 : i102287
2009-06-02 18:19:05 +0200 fredrikh r272519 : i102287
2009-06-02 18:18:44 +0200 fredrikh r272518 : i102287
2009-06-02 18:16:51 +0200 fredrikh r272517 : i102287
2009-06-02 18:16:13 +0200 fredrikh r272516 : i102287
2009-06-02 18:15:49 +0200 fredrikh r272515 : i102287
2009-06-02 18:14:24 +0200 fredrikh r272514 : i102452
2009-06-02 17:57:04 +0200 fredrikh r272513 : i102451
2009-06-02 13:57:46 +0200 fredrikh r272502 : i102444
2009-06-02 13:24:29 +0200 fredrikh r272497 : i102287
2009-06-02 12:44:01 +0200 fredrikh r272495 : i102287
2009-06-01 13:25:03 +0200 fredrikh r272477 : CWS-TOOLING: rebase CWS fhawfixes1 to trunk at 272291 (milestone: DEV300:m49)
2009-05-27 17:50:23 +0200 fredrikh r272363 : i102310
2009-05-27 16:23:37 +0200 fredrikh r272359 : i102093
2009-05-27 16:18:50 +0200 fredrikh r272358 : i102218
2009-05-27 15:58:58 +0200 fredrikh r272357 : i102306
2009-05-27 11:14:59 +0200 fredrikh r272336 : i102287
2009-05-27 10:18:48 +0200 fredrikh r272334 : i102286
2009-05-25 15:33:07 +0200 fredrikh r272253 : i102221
2009-05-25 13:08:52 +0200 fredrikh r272235 : i102218
2009-05-19 14:06:59 +0200 fredrikh r272077 : i102058
diff --git a/sc/source/ui/view/output2.cxx b/sc/source/ui/view/output2.cxx
index d1f1ee3..dec757a 100644
--- a/sc/source/ui/view/output2.cxx
+++ b/sc/source/ui/view/output2.cxx
@@ -1358,13 +1358,11 @@ void ScOutputData::DrawStrings( BOOL bPixelToLogic )
}
if (bDoCell && !bNeedEdit)
{
- BOOL bFormulaCell = (pCell->GetCellType() == CELLTYPE_FORMULA );
- if ( bFormulaCell )
+ if ( pCell->GetCellType() == CELLTYPE_FORMULA )
lcl_CreateInterpretProgress( bProgress, pDoc, (ScFormulaCell*)pCell );
if ( aVars.SetText(pCell) )
pOldPattern = NULL;
- bNeedEdit = aVars.HasEditCharacters() ||
- (bFormulaCell && ((ScFormulaCell*)pCell)->IsMultilineResult());
+ bNeedEdit = aVars.HasEditCharacters();
}
if (bDoCell && !bNeedEdit)
{
commit 77e9b14d2f991a5388affdabe871514379e8bd72
Author: Ivo Hinkelmann <ihi at openoffice.org>
Date: Mon Jun 15 10:46:14 2009 +0000
CWS-TOOLING: integrate CWS calc50
2009-05-28 12:32:46 +0200 nn r272399 : gcc warning
2009-05-28 10:56:48 +0200 nn r272382 : CWS-TOOLING: rebase CWS calc50 to trunk at 272291 (milestone: DEV300:m49)
2009-05-27 14:24:52 +0200 nn r272343 : #i50825# DataPilotUpdate: prevent overwriting source data above the table
2009-05-26 18:29:21 +0200 nn r272316 : #i50019# allow borders for multiple cell ranges
2009-05-26 13:43:36 +0200 nn r272300 : #i101960# UpdateExternalRefLinks: set document modified
2009-05-25 18:01:23 +0200 nn r272267 : #i102056# copied from CWS calc311fixes
2009-05-20 12:24:22 +0200 nn r272114 : #i59672# ExecFilter/SC_AUTOFILTER_CUSTOM: select database range (patch from gaozm)
2009-05-15 18:24:44 +0200 nn r271961 : #i100544# correct ScTokenConversion::ConvertToTokenArray
2009-05-13 17:45:02 +0200 nn r271866 : #i101869# DeleteRange: before broadcasting, check if EndListening removed the note cells
2009-05-13 12:43:31 +0200 nn r271856 : #i101806# correct reference undo for inserting/deleting columns/rows across sheets
2009-05-11 18:44:46 +0200 nn r271783 : #i101725# don't copy hash_set with pointers from the other collection
2009-05-11 17:54:21 +0200 nn r271780 : #i101690# correct merge error in frmdlg integration
2009-05-07 15:28:55 +0200 nn r271674 : #i96940# check for negative count in fillAuto
2009-05-07 13:47:58 +0200 nn r271661 : #i101512# SetCompileForFAP is in formula::FormulaCompiler
2009-05-07 13:47:27 +0200 nn r271660 : #i101512# use SetCompileForFAP for CompileTokenArray
2009-05-05 18:47:03 +0200 nn r271551 : #i73074# RepeatDB: re-evaluate advanced filter source range
2009-05-05 18:23:21 +0200 nn r271546 : #i97857# use GetInputString for direct reference as validity range source
2009-05-05 17:38:23 +0200 nn r271538 : #i95834# better enable/disable handling of next/previous buttons (patch by cmc)
diff --git a/sc/inc/cell.hxx b/sc/inc/cell.hxx
index f389a01..1bdbc1a 100644
--- a/sc/inc/cell.hxx
+++ b/sc/inc/cell.hxx
@@ -393,7 +393,8 @@ public:
void UpdateReference(UpdateRefMode eUpdateRefMode,
const ScRange& r,
SCsCOL nDx, SCsROW nDy, SCsTAB nDz,
- ScDocument* pUndoDoc = NULL );
+ ScDocument* pUndoDoc = NULL,
+ const ScAddress* pUndoCellPos = NULL );
void TransposeReference();
void UpdateTranspose( const ScRange& rSource, const ScAddress& rDest,
diff --git a/sc/inc/compiler.hxx b/sc/inc/compiler.hxx
index f960498..2140998 100644
--- a/sc/inc/compiler.hxx
+++ b/sc/inc/compiler.hxx
@@ -358,8 +358,7 @@ public:
bool IsEnglishSymbol( const String& rName );
//! _either_ CompileForFAP _or_ AutoCorrection, _not_ both
- void SetCompileForFAP( BOOL bVal )
- { bCompileForFAP = bVal; bIgnoreErrors = bVal; }
+ // #i101512# SetCompileForFAP is in formula::FormulaCompiler
void SetAutoCorrection( BOOL bVal )
{ bAutoCorrect = bVal; bIgnoreErrors = bVal; }
void SetCloseBrackets( bool bVal ) { mbCloseBrackets = bVal; }
diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index dd7860a..b4aa59b 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -889,22 +889,26 @@ public:
BOOL InsertRow( SCCOL nStartCol, SCTAB nStartTab,
SCCOL nEndCol, SCTAB nEndTab,
- SCROW nStartRow, SCSIZE nSize, ScDocument* pRefUndoDoc = NULL );
+ SCROW nStartRow, SCSIZE nSize, ScDocument* pRefUndoDoc = NULL,
+ const ScMarkData* pTabMark = NULL );
SC_DLLPUBLIC BOOL InsertRow( const ScRange& rRange, ScDocument* pRefUndoDoc = NULL );
void DeleteRow( SCCOL nStartCol, SCTAB nStartTab,
SCCOL nEndCol, SCTAB nEndTab,
SCROW nStartRow, SCSIZE nSize,
- ScDocument* pRefUndoDoc = NULL, BOOL* pUndoOutline = NULL );
+ ScDocument* pRefUndoDoc = NULL, BOOL* pUndoOutline = NULL,
+ const ScMarkData* pTabMark = NULL );
void DeleteRow( const ScRange& rRange,
ScDocument* pRefUndoDoc = NULL, BOOL* pUndoOutline = NULL );
BOOL InsertCol( SCROW nStartRow, SCTAB nStartTab,
SCROW nEndRow, SCTAB nEndTab,
- SCCOL nStartCol, SCSIZE nSize, ScDocument* pRefUndoDoc = NULL );
+ SCCOL nStartCol, SCSIZE nSize, ScDocument* pRefUndoDoc = NULL,
+ const ScMarkData* pTabMark = NULL );
SC_DLLPUBLIC BOOL InsertCol( const ScRange& rRange, ScDocument* pRefUndoDoc = NULL );
void DeleteCol( SCROW nStartRow, SCTAB nStartTab,
SCROW nEndRow, SCTAB nEndTab,
SCCOL nStartCol, SCSIZE nSize,
- ScDocument* pRefUndoDoc = NULL, BOOL* pUndoOutline = NULL );
+ ScDocument* pRefUndoDoc = NULL, BOOL* pUndoOutline = NULL,
+ const ScMarkData* pTabMark = NULL );
void DeleteCol( const ScRange& rRange,
ScDocument* pRefUndoDoc = NULL, BOOL* pUndoOutline = NULL );
diff --git a/sc/inc/dpobject.hxx b/sc/inc/dpobject.hxx
index 525f978..39b160a 100644
--- a/sc/inc/dpobject.hxx
+++ b/sc/inc/dpobject.hxx
@@ -126,7 +126,8 @@ public:
void InvalidateData();
void InvalidateSource();
- void Output();
+
+ void Output( const ScAddress& rPos );
ScRange GetNewOutputRange( BOOL& rOverflow );
const ScRange GetOutputRangeByType( sal_Int32 nType );
diff --git a/sc/inc/global.hxx b/sc/inc/global.hxx
index 9f90023..7d3d54f 100644
--- a/sc/inc/global.hxx
+++ b/sc/inc/global.hxx
@@ -238,6 +238,7 @@ const USHORT IDF_ATTRIB = IDF_HARDATTR | IDF_STYLES;
const USHORT IDF_CONTENTS = IDF_VALUE | IDF_DATETIME | IDF_STRING | IDF_NOTE | IDF_FORMULA;
const USHORT IDF_ALL = IDF_CONTENTS | IDF_ATTRIB | IDF_OBJECTS;
const USHORT IDF_NOCAPTIONS = 0x0200; /// Internal use only (undo etc.): do not copy/delete caption objects of cell notes.
+const USHORT IDF_ADDNOTES = 0x0400; /// Internal use only (copy from clip): do not delete existing cell contents when pasting notes.
/// Copy flags for auto/series fill functions: do not touch notes and drawing objects.
const USHORT IDF_AUTOFILL = IDF_ALL & ~(IDF_NOTE | IDF_OBJECTS);
@@ -661,29 +662,29 @@ public:
SC_DLLPUBLIC static bool IsQuoted( const String& rString, sal_Unicode cQuote = '\'' );
/** Inserts the character cQuote at beginning and end of rString.
- @param bEscapeEmbedded If <TRUE/>, embedded quote characters are
+ @param bEscapeEmbedded If <TRUE/>, embedded quote characters are
escaped by doubling them.
*/
SC_DLLPUBLIC static void AddQuotes( String& rString, sal_Unicode cQuote = '\'', bool bEscapeEmbedded = true );
/** Erases the character cQuote from rString, if it exists at beginning AND end.
- @param bUnescapeEmbedded If <TRUE/>, embedded doubled quote characters
- are unescaped by replacing them with a
+ @param bUnescapeEmbedded If <TRUE/>, embedded doubled quote characters
+ are unescaped by replacing them with a
single instance.
*/
SC_DLLPUBLIC static void EraseQuotes( String& rString, sal_Unicode cQuote = '\'', bool bUnescapeEmbedded = true );
- /** Finds an unquoted instance of cChar in rString, starting at
- offset nStart. Unquoted instances may occur when concatenating two
- quoted strings with a separator, for example, 's1':'s2'. Embedded
- quotes have to be escaped by being doubled. Caller must ensure that
- nStart points into an unquoted range or the opening quote. Specialty:
+ /** Finds an unquoted instance of cChar in rString, starting at
+ offset nStart. Unquoted instances may occur when concatenating two
+ quoted strings with a separator, for example, 's1':'s2'. Embedded
+ quotes have to be escaped by being doubled. Caller must ensure that
+ nStart points into an unquoted range or the opening quote. Specialty:
if cChar==cQuote the first cQuote character from nStart on is found.
@returns offset if found, else STRING_NOTFOUND
*/
SC_DLLPUBLIC static xub_StrLen FindUnquoted( const String& rString, sal_Unicode cChar, xub_StrLen nStart = 0, sal_Unicode cQuote = '\'' );
- /** Finds an unquoted instance of cChar in null-terminated pString. Same
+ /** Finds an unquoted instance of cChar in null-terminated pString. Same
semantics as FindUnquoted( const String&, ...)
@returns: pointer to cChar if found, else NULL
*/
diff --git a/sc/inc/globstr.hrc b/sc/inc/globstr.hrc
index c190f81..1db4648 100644
--- a/sc/inc/globstr.hrc
+++ b/sc/inc/globstr.hrc
@@ -84,7 +84,6 @@
#define STR_MSSG_PASTEFROMCLIP_0 48
#define STR_MSSG_PASTEFROMCLIP_1 49
#define STR_MSSG_MOVEBLOCKTO_0 50
-#define STR_MSSG_APPLYPATTLINES_0 51
#define STR_MSSG_INSERTCELLS_0 52
#define STR_MSSG_DELETECELLS_0 53
#define STR_MSSG_MERGECELLS_0 54
diff --git a/sc/source/core/data/cell2.cxx b/sc/source/core/data/cell2.cxx
index 86c87c0..7ef1826 100644
--- a/sc/source/core/data/cell2.cxx
+++ b/sc/source/core/data/cell2.cxx
@@ -472,7 +472,7 @@ BOOL ScFormulaCell::HasColRowName() const
void ScFormulaCell::UpdateReference(UpdateRefMode eUpdateRefMode,
const ScRange& r,
SCsCOL nDx, SCsROW nDy, SCsTAB nDz,
- ScDocument* pUndoDoc )
+ ScDocument* pUndoDoc, const ScAddress* pUndoCellPos )
{
SCCOL nCol1 = r.aStart.Col();
SCROW nRow1 = r.aStart.Row();
@@ -484,6 +484,8 @@ void ScFormulaCell::UpdateReference(UpdateRefMode eUpdateRefMode,
SCROW nRow = aPos.Row();
SCTAB nTab = aPos.Tab();
ScAddress aUndoPos( aPos ); // position for undo cell in pUndoDoc
+ if ( pUndoCellPos )
+ aUndoPos = *pUndoCellPos;
ScAddress aOldPos( aPos );
// BOOL bPosChanged = FALSE; // ob diese Zelle bewegt wurde
BOOL bIsInsert = FALSE;
@@ -706,10 +708,15 @@ void ScFormulaCell::UpdateReference(UpdateRefMode eUpdateRefMode,
// (InsertCells/DeleteCells - aPos is changed above) as well as when UpdateReference
// is called after moving the cells (MoveBlock/PasteFromClip - aOldPos is changed).
- ScFormulaCell* pFCell = new ScFormulaCell( pUndoDoc, aUndoPos,
- pOld, eTempGrammar, cMatrixFlag );
- pFCell->aResult.SetToken( NULL); // to recognize it as changed later (Cut/Paste!)
- pUndoDoc->PutCell( aUndoPos, pFCell );
+ // If there is already a formula cell in the undo document, don't overwrite it,
+ // the first (oldest) is the important cell.
+ if ( pUndoDoc->GetCellType( aUndoPos ) != CELLTYPE_FORMULA )
+ {
+ ScFormulaCell* pFCell = new ScFormulaCell( pUndoDoc, aUndoPos,
+ pOld, eTempGrammar, cMatrixFlag );
+ pFCell->aResult.SetToken( NULL); // to recognize it as changed later (Cut/Paste!)
+ pUndoDoc->PutCell( aUndoPos, pFCell );
+ }
}
bValChanged = FALSE;
if ( pRangeData )
diff --git a/sc/source/core/data/column.cxx b/sc/source/core/data/column.cxx
index 6329e86..433c810 100644
--- a/sc/source/core/data/column.cxx
+++ b/sc/source/core/data/column.cxx
@@ -1673,7 +1673,10 @@ void ScColumn::UpdateReference( UpdateRefMode eUpdateRefMode, SCCOL nCol1, SCROW
if( pCell->GetCellType() == CELLTYPE_FORMULA)
{
SCROW nRow = pItems[i].nRow;
- ((ScFormulaCell*)pCell)->UpdateReference( eUpdateRefMode, aRange, nDx, nDy, nDz, pUndoDoc );
+ // When deleting rows on several sheets, the formula's position may be updated with the first call,
+ // so the undo position must be passed from here.
+ ScAddress aUndoPos( nCol, nRow, nTab );
+ ((ScFormulaCell*)pCell)->UpdateReference( eUpdateRefMode, aRange, nDx, nDy, nDz, pUndoDoc, &aUndoPos );
if ( nRow != pItems[i].nRow )
Search( nRow, i ); // Listener removed/inserted?
}
diff --git a/sc/source/core/data/column3.cxx b/sc/source/core/data/column3.cxx
index 250dde1..476da6d 100644
--- a/sc/source/core/data/column3.cxx
+++ b/sc/source/core/data/column3.cxx
@@ -521,6 +521,15 @@ void ScColumn::DeleteRange( SCSIZE nStartIndex, SCSIZE nEndIndex, USHORT nDelFla
for ( FormulaCellVector::iterator aIt = aDelCells.begin(), aEnd = aDelCells.end(); aIt != aEnd; ++aIt )
(*aIt)->EndListeningTo( pDocument );
+ // #i101869# if the note cell with the broadcaster was deleted in EndListening,
+ // forget the pointer to the broadcaster
+ for ( FormulaCellVector::iterator aIt = aDelCells.begin(), aEnd = aDelCells.end(); aIt != aEnd; ++aIt )
+ {
+ SCSIZE nIndex;
+ if ( !Search( (*aIt)->aPos.Row(), nIndex ) )
+ (*aIt)->ReleaseBroadcaster();
+ }
+
// broadcast SC_HINT_DYING for all cells and delete them
for ( FormulaCellVector::iterator aIt = aDelCells.begin(), aEnd = aDelCells.end(); aIt != aEnd; ++aIt )
{
@@ -739,6 +748,9 @@ void ScColumn::CopyFromClip(SCROW nRow1, SCROW nRow2, long nDy,
Resize( nNew );
}
+ // IDF_ADDNOTES must be passed without other content flags than IDF_NOTE
+ bool bAddNotes = (nInsFlag & (IDF_CONTENTS | IDF_ADDNOTES)) == (IDF_NOTE | IDF_ADDNOTES);
+
BOOL bAtEnd = FALSE;
for (SCSIZE i = 0; i < nColCount && !bAtEnd; i++)
{
@@ -751,12 +763,37 @@ void ScColumn::CopyFromClip(SCROW nRow1, SCROW nRow2, long nDy,
// nDestRow may be negative then
ScAddress aDestPos( nCol, (SCROW)nDestRow, nTab );
- ScBaseCell* pNew = bAsLink ?
- rColumn.CreateRefCell( pDocument, aDestPos, i, nInsFlag ) :
- rColumn.CloneCell( i, nInsFlag, *pDocument, aDestPos );
- if (pNew)
- Insert((SCROW)nDestRow, pNew);
+ /* #i102056# Paste from clipboard needs to paste the cell notes in
+ a second pass. This must not overwrite the existing cells
+ already copied to the destination position in the first pass.
+ To indicate this special case, the modifier IDF_ADDNOTES is
+ passed together with IDF_NOTE in nInsFlag. Of course, there is
+ still the need to create a new cell, if there is no cell at the
+ destination position at all. */
+ ScBaseCell* pAddNoteCell = bAddNotes ? GetCell( aDestPos.Row() ) : 0;
+ if (pAddNoteCell)
+ {
+ // do nothing if source cell does not contain a note
+ const ScBaseCell* pSourceCell = rColumn.pItems[i].pCell;
+ const ScPostIt* pSourceNote = pSourceCell ? pSourceCell->GetNote() : 0;
+ if (pSourceNote)
+ {
+ DBG_ASSERT( !pAddNoteCell->HasNote(), "ScColumn::CopyFromClip - unexpected note at destination cell" );
+ bool bCloneCaption = (nInsFlag & IDF_NOCAPTIONS) == 0;
+ // #i52342# if caption is cloned, the note must be constructed with the destination document
+ ScPostIt* pNewNote = ScNoteUtil::CloneNote( *pDocument, aDestPos, *pSourceNote, bCloneCaption );
+ pAddNoteCell->TakeNote( pNewNote );
+ }
+ }
+ else
+ {
+ ScBaseCell* pNewCell = bAsLink ?
+ rColumn.CreateRefCell( pDocument, aDestPos, i, nInsFlag ) :
+ rColumn.CloneCell( i, nInsFlag, *pDocument, aDestPos );
+ if (pNewCell)
+ Insert( aDestPos.Row(), pNewCell );
+ }
}
}
}
diff --git a/sc/source/core/data/documen8.cxx b/sc/source/core/data/documen8.cxx
index 2e617d7..19d6d94 100644
--- a/sc/source/core/data/documen8.cxx
+++ b/sc/source/core/data/documen8.cxx
@@ -44,6 +44,7 @@
#include <svx/linkmgr.hxx>
#include <svx/scripttypeitem.hxx>
#include <svx/unolingu.hxx>
+#include <sfx2/bindings.hxx>
#include <sfx2/objsh.hxx>
#include <sfx2/printer.hxx>
#include <sfx2/viewfrm.hxx>
@@ -1046,6 +1047,18 @@ void ScDocument::UpdateExternalRefLinks()
TrackFormulas();
pShell->Broadcast( SfxSimpleHint(FID_DATACHANGED) );
ResetChanged( ScRange(0, 0, 0, MAXCOL, MAXROW, MAXTAB) );
+
+ // #i101960# set document modified, as in TrackTimeHdl for DDE links
+ if (!pShell->IsModified())
+ {
+ pShell->SetModified( TRUE );
+ SfxBindings* pBindings = GetViewBindings();
+ if (pBindings)
+ {
+ pBindings->Invalidate( SID_SAVEDOC );
+ pBindings->Invalidate( SID_DOC_MODIFIED );
+ }
+ }
}
}
diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx
index 1b1ad58..8efa79d 100644
--- a/sc/source/core/data/document.cxx
+++ b/sc/source/core/data/document.cxx
@@ -657,6 +657,43 @@ void ScDocument::LimitChartIfAll( ScRangeListRef& rRangeList )
}
+void lcl_GetFirstTabRange( SCTAB& rTabRangeStart, SCTAB& rTabRangeEnd, const ScMarkData* pTabMark )
+{
+ // without ScMarkData, leave start/end unchanged
+ if ( pTabMark )
+ {
+ for (SCTAB nTab=0; nTab<=MAXTAB; ++nTab)
+ if (pTabMark->GetTableSelect(nTab))
+ {
+ // find first range of consecutive selected sheets
+ rTabRangeStart = nTab;
+ while ( nTab+1 <= MAXTAB && pTabMark->GetTableSelect(nTab+1) )
+ ++nTab;
+ rTabRangeEnd = nTab;
+ return;
+ }
+ }
+}
+
+bool lcl_GetNextTabRange( SCTAB& rTabRangeStart, SCTAB& rTabRangeEnd, const ScMarkData* pTabMark )
+{
+ if ( pTabMark )
+ {
+ // find next range of consecutive selected sheets after rTabRangeEnd
+ for (SCTAB nTab=rTabRangeEnd+1; nTab<=MAXTAB; ++nTab)
+ if (pTabMark->GetTableSelect(nTab))
+ {
+ rTabRangeStart = nTab;
+ while ( nTab+1 <= MAXTAB && pTabMark->GetTableSelect(nTab+1) )
+ ++nTab;
+ rTabRangeEnd = nTab;
+ return true;
+ }
+ }
+ return false;
+}
+
+
BOOL ScDocument::CanInsertRow( const ScRange& rRange ) const
{
SCCOL nStartCol = rRange.aStart.Col();
@@ -681,39 +718,60 @@ BOOL ScDocument::CanInsertRow( const ScRange& rRange ) const
BOOL ScDocument::InsertRow( SCCOL nStartCol, SCTAB nStartTab,
SCCOL nEndCol, SCTAB nEndTab,
- SCROW nStartRow, SCSIZE nSize, ScDocument* pRefUndoDoc )
+ SCROW nStartRow, SCSIZE nSize, ScDocument* pRefUndoDoc,
+ const ScMarkData* pTabMark )
{
SCTAB i;
PutInOrder( nStartCol, nEndCol );
PutInOrder( nStartTab, nEndTab );
+ if ( pTabMark )
+ {
+ nStartTab = 0;
+ nEndTab = MAXTAB;
+ }
BOOL bTest = TRUE;
BOOL bRet = FALSE;
BOOL bOldAutoCalc = GetAutoCalc();
SetAutoCalc( FALSE ); // Mehrfachberechnungen vermeiden
for ( i = nStartTab; i <= nEndTab && bTest; i++)
- if (pTab[i])
+ if (pTab[i] && (!pTabMark || pTabMark->GetTableSelect(i)))
bTest &= pTab[i]->TestInsertRow( nStartCol, nEndCol, nSize );
if (bTest)
{
// UpdateBroadcastAreas muss vor UpdateReference gerufen werden, damit nicht
// Eintraege verschoben werden, die erst bei UpdateReference neu erzeugt werden
- UpdateBroadcastAreas( URM_INSDEL, ScRange(
- ScAddress( nStartCol, nStartRow, nStartTab ),
- ScAddress( nEndCol, MAXROW, nEndTab )), 0, static_cast<SCsROW>(nSize), 0 );
- UpdateReference( URM_INSDEL, nStartCol, nStartRow, nStartTab,
- nEndCol, MAXROW, nEndTab,
- 0, static_cast<SCsROW>(nSize), 0, pRefUndoDoc, FALSE ); // without drawing objects
+ // handle chunks of consecutive selected sheets together
+ SCTAB nTabRangeStart = nStartTab;
+ SCTAB nTabRangeEnd = nEndTab;
+ lcl_GetFirstTabRange( nTabRangeStart, nTabRangeEnd, pTabMark );
+ do
+ {
+ UpdateBroadcastAreas( URM_INSDEL, ScRange(
+ ScAddress( nStartCol, nStartRow, nTabRangeStart ),
+ ScAddress( nEndCol, MAXROW, nTabRangeEnd )), 0, static_cast<SCsROW>(nSize), 0 );
+ }
+ while ( lcl_GetNextTabRange( nTabRangeStart, nTabRangeEnd, pTabMark ) );
+
+ lcl_GetFirstTabRange( nTabRangeStart, nTabRangeEnd, pTabMark );
+ do
+ {
+ UpdateReference( URM_INSDEL, nStartCol, nStartRow, nTabRangeStart,
+ nEndCol, MAXROW, nTabRangeEnd,
+ 0, static_cast<SCsROW>(nSize), 0, pRefUndoDoc, FALSE ); // without drawing objects
+ }
+ while ( lcl_GetNextTabRange( nTabRangeStart, nTabRangeEnd, pTabMark ) );
+
for (i=nStartTab; i<=nEndTab; i++)
- if (pTab[i])
+ if (pTab[i] && (!pTabMark || pTabMark->GetTableSelect(i)))
pTab[i]->InsertRow( nStartCol, nEndCol, nStartRow, nSize );
// #82991# UpdateRef for drawing layer must be after inserting,
// when the new row heights are known.
for (i=nStartTab; i<=nEndTab; i++)
- if (pTab[i])
+ if (pTab[i] && (!pTabMark || pTabMark->GetTableSelect(i)))
pTab[i]->UpdateDrawRef( URM_INSDEL,
nStartCol, nStartRow, nStartTab, nEndCol, MAXROW, nEndTab,
0, static_cast<SCsROW>(nSize), 0 );
@@ -756,42 +814,61 @@ BOOL ScDocument::InsertRow( const ScRange& rRange, ScDocument* pRefUndoDoc )
void ScDocument::DeleteRow( SCCOL nStartCol, SCTAB nStartTab,
SCCOL nEndCol, SCTAB nEndTab,
SCROW nStartRow, SCSIZE nSize,
- ScDocument* pRefUndoDoc, BOOL* pUndoOutline )
+ ScDocument* pRefUndoDoc, BOOL* pUndoOutline,
+ const ScMarkData* pTabMark )
{
SCTAB i;
PutInOrder( nStartCol, nEndCol );
PutInOrder( nStartTab, nEndTab );
+ if ( pTabMark )
+ {
+ nStartTab = 0;
+ nEndTab = MAXTAB;
+ }
BOOL bOldAutoCalc = GetAutoCalc();
SetAutoCalc( FALSE ); // Mehrfachberechnungen vermeiden
- if ( ValidRow(nStartRow+nSize) )
+ // handle chunks of consecutive selected sheets together
+ SCTAB nTabRangeStart = nStartTab;
+ SCTAB nTabRangeEnd = nEndTab;
+ lcl_GetFirstTabRange( nTabRangeStart, nTabRangeEnd, pTabMark );
+ do
{
- DelBroadcastAreasInRange( ScRange(
- ScAddress( nStartCol, nStartRow, nStartTab ),
- ScAddress( nEndCol, nStartRow+nSize-1, nEndTab ) ) );
- UpdateBroadcastAreas( URM_INSDEL, ScRange(
- ScAddress( nStartCol, nStartRow+nSize, nStartTab ),
- ScAddress( nEndCol, MAXROW, nEndTab )), 0, -(static_cast<SCsROW>(nSize)), 0 );
+ if ( ValidRow(nStartRow+nSize) )
+ {
+ DelBroadcastAreasInRange( ScRange(
+ ScAddress( nStartCol, nStartRow, nTabRangeStart ),
+ ScAddress( nEndCol, nStartRow+nSize-1, nTabRangeEnd ) ) );
+ UpdateBroadcastAreas( URM_INSDEL, ScRange(
+ ScAddress( nStartCol, nStartRow+nSize, nTabRangeStart ),
+ ScAddress( nEndCol, MAXROW, nTabRangeEnd )), 0, -(static_cast<SCsROW>(nSize)), 0 );
+ }
+ else
+ DelBroadcastAreasInRange( ScRange(
+ ScAddress( nStartCol, nStartRow, nTabRangeStart ),
+ ScAddress( nEndCol, MAXROW, nTabRangeEnd ) ) );
}
- else
- DelBroadcastAreasInRange( ScRange(
- ScAddress( nStartCol, nStartRow, nStartTab ),
- ScAddress( nEndCol, MAXROW, nEndTab ) ) );
+ while ( lcl_GetNextTabRange( nTabRangeStart, nTabRangeEnd, pTabMark ) );
if ( ValidRow(nStartRow+nSize) )
{
- UpdateReference( URM_INSDEL, nStartCol, nStartRow+nSize, nStartTab,
- nEndCol, MAXROW, nEndTab,
- 0, -(static_cast<SCsROW>(nSize)), 0, pRefUndoDoc );
+ lcl_GetFirstTabRange( nTabRangeStart, nTabRangeEnd, pTabMark );
+ do
+ {
+ UpdateReference( URM_INSDEL, nStartCol, nStartRow+nSize, nTabRangeStart,
+ nEndCol, MAXROW, nTabRangeEnd,
+ 0, -(static_cast<SCsROW>(nSize)), 0, pRefUndoDoc );
+ }
+ while ( lcl_GetNextTabRange( nTabRangeStart, nTabRangeEnd, pTabMark ) );
}
if (pUndoOutline)
*pUndoOutline = FALSE;
for ( i = nStartTab; i <= nEndTab; i++)
- if (pTab[i])
+ if (pTab[i] && (!pTabMark || pTabMark->GetTableSelect(i)))
pTab[i]->DeleteRow( nStartCol, nEndCol, nStartRow, nSize, pUndoOutline );
if ( ValidRow(nStartRow+nSize) )
@@ -844,30 +921,51 @@ BOOL ScDocument::CanInsertCol( const ScRange& rRange ) const
BOOL ScDocument::InsertCol( SCROW nStartRow, SCTAB nStartTab,
SCROW nEndRow, SCTAB nEndTab,
- SCCOL nStartCol, SCSIZE nSize, ScDocument* pRefUndoDoc )
+ SCCOL nStartCol, SCSIZE nSize, ScDocument* pRefUndoDoc,
+ const ScMarkData* pTabMark )
{
SCTAB i;
PutInOrder( nStartRow, nEndRow );
PutInOrder( nStartTab, nEndTab );
+ if ( pTabMark )
+ {
+ nStartTab = 0;
+ nEndTab = MAXTAB;
+ }
BOOL bTest = TRUE;
BOOL bRet = FALSE;
BOOL bOldAutoCalc = GetAutoCalc();
SetAutoCalc( FALSE ); // Mehrfachberechnungen vermeiden
for ( i = nStartTab; i <= nEndTab && bTest; i++)
- if (pTab[i])
+ if (pTab[i] && (!pTabMark || pTabMark->GetTableSelect(i)))
bTest &= pTab[i]->TestInsertCol( nStartRow, nEndRow, nSize );
if (bTest)
{
- UpdateBroadcastAreas( URM_INSDEL, ScRange(
- ScAddress( nStartCol, nStartRow, nStartTab ),
- ScAddress( MAXCOL, nEndRow, nEndTab )), static_cast<SCsCOL>(nSize), 0, 0 );
- UpdateReference( URM_INSDEL, nStartCol, nStartRow, nStartTab,
- MAXCOL, nEndRow, nEndTab,
- static_cast<SCsCOL>(nSize), 0, 0, pRefUndoDoc );
+ // handle chunks of consecutive selected sheets together
+ SCTAB nTabRangeStart = nStartTab;
+ SCTAB nTabRangeEnd = nEndTab;
+ lcl_GetFirstTabRange( nTabRangeStart, nTabRangeEnd, pTabMark );
+ do
+ {
+ UpdateBroadcastAreas( URM_INSDEL, ScRange(
+ ScAddress( nStartCol, nStartRow, nTabRangeStart ),
+ ScAddress( MAXCOL, nEndRow, nTabRangeEnd )), static_cast<SCsCOL>(nSize), 0, 0 );
+ }
+ while ( lcl_GetNextTabRange( nTabRangeStart, nTabRangeEnd, pTabMark ) );
+
+ lcl_GetFirstTabRange( nTabRangeStart, nTabRangeEnd, pTabMark );
+ do
+ {
+ UpdateReference( URM_INSDEL, nStartCol, nStartRow, nTabRangeStart,
+ MAXCOL, nEndRow, nTabRangeEnd,
+ static_cast<SCsCOL>(nSize), 0, 0, pRefUndoDoc );
+ }
+ while ( lcl_GetNextTabRange( nTabRangeStart, nTabRangeEnd, pTabMark ) );
+
for (i=nStartTab; i<=nEndTab; i++)
- if (pTab[i])
+ if (pTab[i] && (!pTabMark || pTabMark->GetTableSelect(i)))
pTab[i]->InsertCol( nStartCol, nStartRow, nEndRow, nSize );
if ( pChangeTrack && pChangeTrack->IsInDeleteUndo() )
@@ -907,42 +1005,60 @@ BOOL ScDocument::InsertCol( const ScRange& rRange, ScDocument* pRefUndoDoc )
void ScDocument::DeleteCol(SCROW nStartRow, SCTAB nStartTab, SCROW nEndRow, SCTAB nEndTab,
SCCOL nStartCol, SCSIZE nSize, ScDocument* pRefUndoDoc,
- BOOL* pUndoOutline )
+ BOOL* pUndoOutline, const ScMarkData* pTabMark )
{
SCTAB i;
PutInOrder( nStartRow, nEndRow );
PutInOrder( nStartTab, nEndTab );
+ if ( pTabMark )
+ {
+ nStartTab = 0;
+ nEndTab = MAXTAB;
+ }
BOOL bOldAutoCalc = GetAutoCalc();
SetAutoCalc( FALSE ); // Mehrfachberechnungen vermeiden
- if ( ValidCol(sal::static_int_cast<SCCOL>(nStartCol+nSize)) )
+ // handle chunks of consecutive selected sheets together
+ SCTAB nTabRangeStart = nStartTab;
+ SCTAB nTabRangeEnd = nEndTab;
+ lcl_GetFirstTabRange( nTabRangeStart, nTabRangeEnd, pTabMark );
+ do
{
- DelBroadcastAreasInRange( ScRange(
- ScAddress( nStartCol, nStartRow, nStartTab ),
- ScAddress( sal::static_int_cast<SCCOL>(nStartCol+nSize-1), nEndRow, nEndTab ) ) );
- UpdateBroadcastAreas( URM_INSDEL, ScRange(
- ScAddress( sal::static_int_cast<SCCOL>(nStartCol+nSize), nStartRow, nStartTab ),
- ScAddress( MAXCOL, nEndRow, nEndTab )), -static_cast<SCsCOL>(nSize), 0, 0 );
+ if ( ValidCol(sal::static_int_cast<SCCOL>(nStartCol+nSize)) )
+ {
+ DelBroadcastAreasInRange( ScRange(
+ ScAddress( nStartCol, nStartRow, nTabRangeStart ),
+ ScAddress( sal::static_int_cast<SCCOL>(nStartCol+nSize-1), nEndRow, nTabRangeEnd ) ) );
+ UpdateBroadcastAreas( URM_INSDEL, ScRange(
+ ScAddress( sal::static_int_cast<SCCOL>(nStartCol+nSize), nStartRow, nTabRangeStart ),
+ ScAddress( MAXCOL, nEndRow, nTabRangeEnd )), -static_cast<SCsCOL>(nSize), 0, 0 );
+ }
+ else
+ DelBroadcastAreasInRange( ScRange(
+ ScAddress( nStartCol, nStartRow, nTabRangeStart ),
+ ScAddress( MAXCOL, nEndRow, nTabRangeEnd ) ) );
}
- else
- DelBroadcastAreasInRange( ScRange(
- ScAddress( nStartCol, nStartRow, nStartTab ),
- ScAddress( MAXCOL, nEndRow, nEndTab ) ) );
+ while ( lcl_GetNextTabRange( nTabRangeStart, nTabRangeEnd, pTabMark ) );
if ( ValidCol(sal::static_int_cast<SCCOL>(nStartCol+nSize)) )
{
- UpdateReference( URM_INSDEL, sal::static_int_cast<SCCOL>(nStartCol+nSize), nStartRow, nStartTab,
- MAXCOL, nEndRow, nEndTab,
- -static_cast<SCsCOL>(nSize), 0, 0, pRefUndoDoc );
+ lcl_GetFirstTabRange( nTabRangeStart, nTabRangeEnd, pTabMark );
+ do
+ {
+ UpdateReference( URM_INSDEL, sal::static_int_cast<SCCOL>(nStartCol+nSize), nStartRow, nTabRangeStart,
+ MAXCOL, nEndRow, nTabRangeEnd,
+ -static_cast<SCsCOL>(nSize), 0, 0, pRefUndoDoc );
+ }
+ while ( lcl_GetNextTabRange( nTabRangeStart, nTabRangeEnd, pTabMark ) );
}
if (pUndoOutline)
*pUndoOutline = FALSE;
for ( i = nStartTab; i <= nEndTab; i++)
- if (pTab[i])
+ if (pTab[i] && (!pTabMark || pTabMark->GetTableSelect(i)))
pTab[i]->DeleteCol( nStartCol, nStartRow, nEndRow, nSize, pUndoOutline );
if ( ValidCol(sal::static_int_cast<SCCOL>(nStartCol+nSize)) )
@@ -1781,9 +1897,17 @@ void ScDocument::CopyFromClip( const ScRange& rDestRange, const ScMarkData& rMar
nXw = sal::static_int_cast<SCCOL>( nXw + nDestAddX );
nYw = sal::static_int_cast<SCROW>( nYw + nDestAddY ); // ClipArea, plus ExtendMerge value
- // Inhalte entweder komplett oder gar nicht loeschen:
+ /* Decide which contents to delete before copying. Delete all
+ contents if nInsFlag contains any real content flag.
+ #i102056# Notes are pasted from clipboard in a second pass,
+ together with the special flag IDF_ADDNOTES that states to not
+ overwrite/delete existing cells but to insert the notes into
+ these cells. In this case, just delete old notes from the
+ destination area. */
USHORT nDelFlag = IDF_NONE;
- if ( nInsFlag & IDF_CONTENTS )
+ if ( (nInsFlag & (IDF_CONTENTS | IDF_ADDNOTES)) == (IDF_NOTE | IDF_ADDNOTES) )
+ nDelFlag |= IDF_NOTE;
+ else if ( nInsFlag & IDF_CONTENTS )
nDelFlag |= IDF_CONTENTS;
// With bSkipAttrForEmpty, don't remove attributes, copy
// on top of existing attributes instead.
@@ -4030,16 +4154,21 @@ void ScDocument::ApplySelectionFrame( const ScMarkData& rMark,
const SvxBoxItem* pLineOuter,
const SvxBoxInfoItem* pLineInner )
{
- if (rMark.IsMarked())
+ ScRangeList aRangeList;
+ rMark.FillRangeListWithMarks( &aRangeList, FALSE );
+ ULONG nRangeCount = aRangeList.Count();
+ for (SCTAB i=0; i<=MAXTAB; i++)
{
- ScRange aRange;
- rMark.GetMarkArea(aRange);
- for (SCTAB i=0; i<=MAXTAB; i++)
- if (pTab[i])
- if (rMark.GetTableSelect(i))
- pTab[i]->ApplyBlockFrame( pLineOuter, pLineInner,
- aRange.aStart.Col(), aRange.aStart.Row(),
- aRange.aEnd.Col(), aRange.aEnd.Row() );
+ if (pTab[i] && rMark.GetTableSelect(i))
+ {
+ for (ULONG j=0; j<nRangeCount; j++)
+ {
+ ScRange aRange = *aRangeList.GetObject(j);
+ pTab[i]->ApplyBlockFrame( pLineOuter, pLineInner,
+ aRange.aStart.Col(), aRange.aStart.Row(),
+ aRange.aEnd.Col(), aRange.aEnd.Row() );
+ }
+ }
}
}
diff --git a/sc/source/core/data/dpobject.cxx b/sc/source/core/data/dpobject.cxx
index 64f3a2f..20eb1ca 100644
--- a/sc/source/core/data/dpobject.cxx
+++ b/sc/source/core/data/dpobject.cxx
@@ -466,7 +466,7 @@ ScRange ScDPObject::GetNewOutputRange( BOOL& rOverflow )
}
}
-void ScDPObject::Output()
+void ScDPObject::Output( const ScAddress& rPos )
{
// clear old output area
pDoc->DeleteAreaTab( aOutRange.aStart.Col(), aOutRange.aStart.Row(),
@@ -478,6 +478,8 @@ void ScDPObject::Output()
CreateOutput(); // create xSource and pOutput if not already done
+ pOutput->SetPosition( rPos );
+
pOutput->Output();
// aOutRange is always the range that was last output to the document
@@ -2337,7 +2339,7 @@ ScDPCollection::ScDPCollection(const ScDPCollection& r) :
ScCollection(r),
pDoc(r.pDoc),
maSharedString(r.maSharedString),
- maCacheCellPool(r.maCacheCellPool)
+ maCacheCellPool() // #i101725# don't copy hash_set with pointers from the other collection
{
}
@@ -2499,8 +2501,9 @@ void ScDPCollection::clearCacheCellPool()
vector<ScDPCacheCell*> ps;
ps.reserve(maCacheCellPool.size());
copy(maCacheCellPool.begin(), maCacheCellPool.end(), back_inserter(ps));
- for_each(ps.begin(), ps.end(), DeleteCacheCells());
maCacheCellPool.clear();
+ // for correctness' sake, delete the elements after clearing the hash_set
+ for_each(ps.begin(), ps.end(), DeleteCacheCells());
}
//------------------------------------------------------------------------
diff --git a/sc/source/core/data/validat.cxx b/sc/source/core/data/validat.cxx
index d08d84a..c136b80 100644
--- a/sc/source/core/data/validat.cxx
+++ b/sc/source/core/data/validat.cxx
@@ -695,6 +695,40 @@ bool ScValidationData::GetSelectionFromFormula( TypedScStrCollection* pStrings,
SCSIZE nCol, nRow, nCols, nRows, n = 0;
pValues->GetDimensions( nCols, nRows );
+ BOOL bRef = FALSE;
+ ScRange aRange;
+
+ ScTokenArray* pArr = (ScTokenArray*) &rTokArr;
+ pArr->Reset();
+ ScToken* t = NULL;
+ if (pArr->GetLen() == 1 && (t = static_cast<ScToken*>(pArr->GetNextReferenceOrName())) != NULL)
+ {
+ if (t->GetOpCode() == ocDBArea)
+ {
+ if( ScDBData* pDBData = pDocument->GetDBCollection()->FindIndex( t->GetIndex() ) )
+ {
+ pDBData->GetArea(aRange);
+ bRef = TRUE;
+ }
+ }
+ else if (t->GetOpCode() == ocName)
+ {
+ ScRangeData* pName = pDocument->GetRangeName()->FindIndex( t->GetIndex() );
+ if (pName && pName->IsReference(aRange))
+ {
+ bRef = TRUE;
+ }
+ }
+ else if (t->GetType() != svIndex)
+ {
+ t->CalcAbsIfRel(rPos);
+ if (pArr->IsValidReference(aRange))
+ {
+ bRef = TRUE;
+ }
+ }
+ }
+
/* XL artificially limits things to a single col or row in the UI but does
* not list the constraint in MOOXml. If a defined name or INDIRECT
* resulting in 1D is entered in the UI and the definition later modified
@@ -735,7 +769,15 @@ bool ScValidationData::GetSelectionFromFormula( TypedScStrCollection* pStrings,
{
// FIXME FIXME FIXME
// Feature regression. Date formats are lost passing through the matrix
- pFormatter->GetInputLineString( pMatVal->fVal, 0, aValStr );
+ //pFormatter->GetInputLineString( pMatVal->fVal, 0, aValStr );
+ //For external reference and a formula that results in an area or array, date formats are still lost.
+ if ( bRef )
+ {
+ pDocument->GetInputString((SCCOL)(nCol+aRange.aStart.Col()),
+ (SCROW)(nRow+aRange.aStart.Row()), aRange.aStart.Tab() , aValStr);
+ }
+ else
+ pFormatter->GetInputLineString( pMatVal->fVal, 0, aValStr );
}
if( pCell && rMatch < 0 )
diff --git a/sc/source/core/tool/token.cxx b/sc/source/core/tool/token.cxx
index e13d855..6571a07 100644
--- a/sc/source/core/tool/token.cxx
+++ b/sc/source/core/tool/token.cxx
@@ -1821,8 +1821,11 @@ void ScTokenArray::ReadjustRelative3DReferences( const ScAddress& rOldPos,
case svSingleRef :
{
ScSingleRefData& rRef1 = static_cast<ScToken*>(pCode[j])->GetSingleRef();
+ if ( rRef1.IsFlag3D() )
+ {
rRef1.CalcAbsIfRel( rOldPos );
rRef1.CalcRelFromAbs( rNewPos );
+ }
}
break;
default:
diff --git a/sc/source/ui/docshell/dbdocfun.cxx b/sc/source/ui/docshell/dbdocfun.cxx
index 80f5b68..0fc36d7 100644
--- a/sc/source/ui/docshell/dbdocfun.cxx
+++ b/sc/source/ui/docshell/dbdocfun.cxx
@@ -58,6 +58,7 @@
#include "editable.hxx"
#include "attrib.hxx"
#include "drwlayer.hxx"
+#include "dpshttab.hxx"
// -----------------------------------------------------------------
@@ -1299,6 +1300,22 @@ BOOL ScDBDocFunc::DataPilotUpdate( ScDPObject* pOldObj, const ScDPObject* pNewOb
BOOL bOverflow = FALSE;
ScRange aNewOut = pDestObj->GetNewOutputRange( bOverflow );
+
+ //! test for overlap with other data pilot tables
+ if( pOldObj )
+ {
+ const ScSheetSourceDesc* pSheetDesc = pOldObj->GetSheetDesc();
+ if( pSheetDesc && pSheetDesc->aSourceRange.Intersects( aNewOut ) )
+ {
+ ScRange aOldRange = pOldObj->GetOutRange();
+ SCsROW nDiff = aOldRange.aStart.Row()-aNewOut.aStart.Row();
+ aNewOut.aStart.SetRow( aOldRange.aStart.Row() );
+ aNewOut.aEnd.SetRow( aNewOut.aEnd.Row()+nDiff );
+ if( !ValidRow( aNewOut.aStart.Row() ) || !ValidRow( aNewOut.aEnd.Row() ) )
+ bOverflow = TRUE;
+ }
+ }
+
if ( bOverflow )
{
// like with STR_PROTECTIONERR, use undo to reverse everything
@@ -1354,9 +1371,7 @@ BOOL ScDBDocFunc::DataPilotUpdate( ScDPObject* pOldObj, const ScDPObject* pNewOb
pDoc->CopyToDocument( aNewOut, IDF_ALL, FALSE, pNewUndoDoc );
}
- //! test for overlap with other data pilot tables
-
- pDestObj->Output();
+ pDestObj->Output( aNewOut.aStart );
rDocShell.PostPaintGridAll(); //! only necessary parts
bDone = TRUE;
diff --git a/sc/source/ui/docshell/docfunc.cxx b/sc/source/ui/docshell/docfunc.cxx
index dc50dae..1a56661 100644
--- a/sc/source/ui/docshell/docfunc.cxx
+++ b/sc/source/ui/docshell/docfunc.cxx
@@ -1340,6 +1340,14 @@ BOOL ScDocFunc::InsertCells( const ScRange& rRange, const ScMarkData* pTabMark,
}
}
+ ScMarkData aFullMark( aMark ); // including scenario sheets
+ for( i=0; i<nTabCount; i++ )
+ if( aMark.GetTableSelect( i ) )
+ {
+ for( SCTAB j = i+1; j<nTabCount && pDoc->IsScenario(j); j++ )
+ aFullMark.SelectTable( j, TRUE );
+ }
+
SCTAB nSelCount = aMark.GetSelectCount();
// zugehoerige Szenarien auch anpassen
@@ -1543,66 +1551,22 @@ BOOL ScDocFunc::InsertCells( const ScRange& rRange, const ScMarkData* pTabMark,
switch (eCmd)
{
case INS_CELLSDOWN:
- bSuccess = TRUE;
- for( i=0; i<nTabCount; i++ )
- {
- if( aMark.GetTableSelect( i ) )
- {
- SCTAB nScenarioCount = 0;
- for( SCTAB j = i+1; j<nTabCount && pDoc->IsScenario(j); j++ )
- nScenarioCount ++;
-
- bSuccess &= pDoc->InsertRow( nStartCol, i, nEndCol, i+nScenarioCount, nStartRow, static_cast<SCSIZE>(nEndRow-nStartRow+1), pRefUndoDoc );
- }
- }
+ bSuccess = pDoc->InsertRow( nStartCol, 0, nEndCol, MAXTAB, nStartRow, static_cast<SCSIZE>(nEndRow-nStartRow+1), pRefUndoDoc, &aFullMark );
nPaintEndY = MAXROW;
break;
case INS_INSROWS:
- bSuccess = TRUE;
- for( i=0; i<nTabCount; i++ )
- {
- if( aMark.GetTableSelect( i ) )
- {
- SCTAB nScenarioCount = 0;
- for( SCTAB j = i+1; j<nTabCount && pDoc->IsScenario(j); j++ )
- nScenarioCount ++;
-
- bSuccess &= pDoc->InsertRow( 0, i, MAXCOL, i+nScenarioCount, nStartRow, static_cast<SCSIZE>(nEndRow-nStartRow+1), pRefUndoDoc );
- }
- }
+ bSuccess = pDoc->InsertRow( 0, 0, MAXCOL, MAXTAB, nStartRow, static_cast<SCSIZE>(nEndRow-nStartRow+1), pRefUndoDoc, &aFullMark );
nPaintStartX = 0;
nPaintEndX = MAXCOL;
nPaintEndY = MAXROW;
nPaintFlags |= PAINT_LEFT;
break;
case INS_CELLSRIGHT:
- bSuccess = TRUE;
- for( i=0; i<nTabCount; i++ )
- {
- if( aMark.GetTableSelect( i ) )
- {
- SCTAB nScenarioCount = 0;
- for( SCTAB j = i+1; j<nTabCount && pDoc->IsScenario(j); j++ )
- nScenarioCount ++;
-
- bSuccess &= pDoc->InsertCol( nStartRow, i, nEndRow, i+nScenarioCount, nStartCol, static_cast<SCSIZE>(nEndCol-nStartCol+1), pRefUndoDoc );
- }
- }
+ bSuccess = pDoc->InsertCol( nStartRow, 0, nEndRow, MAXTAB, nStartCol, static_cast<SCSIZE>(nEndCol-nStartCol+1), pRefUndoDoc, &aFullMark );
nPaintEndX = MAXCOL;
break;
case INS_INSCOLS:
- bSuccess = TRUE;
- for( i=0; i<nTabCount; i++ )
- {
- if( aMark.GetTableSelect( i ) )
- {
- SCTAB nScenarioCount = 0;
- for( SCTAB j = i+1; j<nTabCount && pDoc->IsScenario(j); j++ )
- nScenarioCount ++;
-
- bSuccess &= pDoc->InsertCol( 0, i, MAXROW, i+nScenarioCount, nStartCol, static_cast<SCSIZE>(nEndCol-nStartCol+1), pRefUndoDoc );
- }
- }
+ bSuccess = pDoc->InsertCol( 0, 0, MAXROW, MAXTAB, nStartCol, static_cast<SCSIZE>(nEndCol-nStartCol+1), pRefUndoDoc, &aFullMark );
nPaintStartY = 0;
nPaintEndY = MAXROW;
nPaintEndX = MAXCOL;
@@ -1795,6 +1759,14 @@ BOOL ScDocFunc::DeleteCells( const ScRange& rRange, const ScMarkData* pTabMark,
}
}
+ ScMarkData aFullMark( aMark ); // including scenario sheets
+ for( i=0; i<nTabCount; i++ )
+ if( aMark.GetTableSelect( i ) )
+ {
+ for( SCTAB j = i+1; j<nTabCount && pDoc->IsScenario(j); j++ )
+ aFullMark.SelectTable( j, TRUE );
+ }
+
SCTAB nSelCount = aMark.GetSelectCount();
SCCOL nUndoStartX = nStartCol;
@@ -2035,66 +2007,22 @@ BOOL ScDocFunc::DeleteCells( const ScRange& rRange, const ScMarkData* pTabMark,
switch (eCmd)
{
case DEL_CELLSUP:
- for( i=0; i<nTabCount; i++ )
- {
- if( aMark.GetTableSelect( i ) )
- {
- SCTAB nScenarioCount = 0;
-
- for( SCTAB j = i+1; j<nTabCount && pDoc->IsScenario(j); j++ )
- nScenarioCount ++;
-
- pDoc->DeleteRow( nStartCol, i, nEndCol, i+nScenarioCount, nStartRow, static_cast<SCSIZE>(nEndRow-nStartRow+1), pRefUndoDoc );
- }
- }
+ pDoc->DeleteRow( nStartCol, 0, nEndCol, MAXTAB, nStartRow, static_cast<SCSIZE>(nEndRow-nStartRow+1), pRefUndoDoc, NULL, &aFullMark );
nPaintEndY = MAXROW;
break;
case DEL_DELROWS:
- for( i=0; i<nTabCount; i++ )
- {
- if( aMark.GetTableSelect( i ) )
- {
- SCTAB nScenarioCount = 0;
-
- for( SCTAB j = i+1; j<nTabCount && pDoc->IsScenario(j); j++ )
- nScenarioCount ++;
-
- pDoc->DeleteRow( 0, i, MAXCOL, i+nScenarioCount, nStartRow, static_cast<SCSIZE>(nEndRow-nStartRow+1), pRefUndoDoc, &bUndoOutline );
- }
- }
+ pDoc->DeleteRow( 0, 0, MAXCOL, MAXTAB, nStartRow, static_cast<SCSIZE>(nEndRow-nStartRow+1), pRefUndoDoc, &bUndoOutline, &aFullMark );
nPaintStartX = 0;
nPaintEndX = MAXCOL;
nPaintEndY = MAXROW;
nPaintFlags |= PAINT_LEFT;
break;
case DEL_CELLSLEFT:
- for( i=0; i<nTabCount; i++ )
- {
- if( aMark.GetTableSelect( i ) )
- {
- SCTAB nScenarioCount = 0;
-
- for( SCTAB j = i+1; j<nTabCount && pDoc->IsScenario(j); j++ )
- nScenarioCount ++;
-
- pDoc->DeleteCol( nStartRow, i, nEndRow, i+nScenarioCount, nStartCol, static_cast<SCSIZE>(nEndCol-nStartCol+1), pRefUndoDoc );
- }
- }
+ pDoc->DeleteCol( nStartRow, 0, nEndRow, MAXTAB, nStartCol, static_cast<SCSIZE>(nEndCol-nStartCol+1), pRefUndoDoc, NULL, &aFullMark );
nPaintEndX = MAXCOL;
break;
case DEL_DELCOLS:
- for( i=0; i<nTabCount; i++ )
- {
- if( aMark.GetTableSelect( i ) )
- {
- SCTAB nScenarioCount = 0;
-
- for( SCTAB j = i+1; j<nTabCount && pDoc->IsScenario(j); j++ )
- nScenarioCount ++;
-
- pDoc->DeleteCol( 0, i, MAXROW, i+nScenarioCount, nStartCol, static_cast<SCSIZE>(nEndCol-nStartCol+1), pRefUndoDoc, &bUndoOutline );
- }
- }
+ pDoc->DeleteCol( 0, 0, MAXROW, MAXTAB, nStartCol, static_cast<SCSIZE>(nEndCol-nStartCol+1), pRefUndoDoc, &bUndoOutline, &aFullMark );
nPaintStartY = 0;
nPaintEndY = MAXROW;
nPaintEndX = MAXCOL;
@@ -2109,8 +2037,9 @@ BOOL ScDocFunc::DeleteCells( const ScRange& rRange, const ScMarkData* pTabMark,
if ( bRecord )
{
- for ( i=nStartTab; i<=nTabCount; i++)
- pRefUndoDoc->DeleteAreaTab(nUndoStartX,nUndoStartY,nUndoEndX,nUndoEndY, i, IDF_ALL);
+ for( i=0; i<nTabCount; i++ )
+ if( aFullMark.GetTableSelect( i ) )
+ pRefUndoDoc->DeleteAreaTab(nUndoStartX,nUndoStartY,nUndoEndX,nUndoEndY, i, IDF_ALL);
// alle Tabellen anlegen, damit Formeln kopiert werden koennen:
pUndoDoc->AddUndoTab( 0, nTabCount-1, FALSE, FALSE );
@@ -2492,9 +2421,13 @@ BOOL ScDocFunc::MoveBlock( const ScRange& rSource, const ScAddress& rDestPos,
/* Paste cell notes and drawing objects after adjusting formula references
and row heights. There are no cell notes or drawing objects, if the
- clipdoc does not contain a drawing layer. */
+ clipdoc does not contain a drawing layer.
+ #i102056# Passing IDF_NOTE only would overwrite cell contents with
+ empty note cells, therefore the special modifier IDF_ADDNOTES is passed
+ here too which changes the behaviour of ScColumn::CopyFromClip() to not
+ touch existing cells. */
if ( pClipDoc->GetDrawLayer() )
- pDoc->CopyFromClip( aPasteDest, aDestMark, IDF_NOTE | IDF_OBJECTS,
+ pDoc->CopyFromClip( aPasteDest, aDestMark, IDF_NOTE | IDF_ADDNOTES | IDF_OBJECTS,
pRefUndoDoc, pClipDoc, TRUE, FALSE, bIncludeFiltered );
if (bRecord)
diff --git a/sc/source/ui/src/globstr.src b/sc/source/ui/src/globstr.src
index 5166340..c5b8cfd 100644
--- a/sc/source/ui/src/globstr.src
+++ b/sc/source/ui/src/globstr.src
@@ -438,10 +438,6 @@ Resource RID_GLOBSTR
{
Text [ en-US ] = "Cell merge not possible if cells already merged!" ;
};
- String STR_MSSG_APPLYPATTLINES_0
- {
- Text [ en-US ] = "Cannot apply borders to multiple selection" ;
- };
String STR_MSSG_INSERTCELLS_0
{
Text [ en-US ] = "Inserting into merged ranges not possible" ;
diff --git a/sc/source/ui/unoobj/cellsuno.cxx b/sc/source/ui/unoobj/cellsuno.cxx
index 156308b..b62ed23 100644
--- a/sc/source/ui/unoobj/cellsuno.cxx
+++ b/sc/source/ui/unoobj/cellsuno.cxx
@@ -5439,7 +5439,7 @@ void SAL_CALL ScCellRangeObj::fillAuto( sheet::FillDirection nFillDirection,
if ( pDocSh && nSourceCount )
{
ScRange aSourceRange(aRange);
- SCCOLROW nCount = 0; // "Dest-Count"
+ SCsCOLROW nCount = 0; // "Dest-Count"
FillDir eDir = FILL_TO_BOTTOM;
BOOL bError = FALSE;
switch (nFillDirection)
@@ -5467,7 +5467,7 @@ void SAL_CALL ScCellRangeObj::fillAuto( sheet::FillDirection nFillDirection,
default:
bError = TRUE;
}
- if (nCount > MAXROW) // Ueberlauf
+ if (nCount < 0 || nCount > MAXROW) // overflow
bError = TRUE;
if (!bError)
diff --git a/sc/source/ui/unoobj/tokenuno.cxx b/sc/source/ui/unoobj/tokenuno.cxx
index dfb0f42..c543b58 100644
--- a/sc/source/ui/unoobj/tokenuno.cxx
+++ b/sc/source/ui/unoobj/tokenuno.cxx
@@ -345,7 +345,7 @@ void lcl_SingleRefToApi( sheet::SingleReference& rAPI, const ScSingleRefData& rR
bool ScTokenConversion::ConvertToTokenArray( ScDocument& rDoc,
ScTokenArray& rTokenArray, const uno::Sequence<sheet::FormulaToken>& rSequence )
{
- return rTokenArray.Fill(rSequence,rDoc.GetExternalRefManager());
+ return !rTokenArray.Fill(rSequence,rDoc.GetExternalRefManager());
}
// static
diff --git a/sc/source/ui/view/dbfunc3.cxx b/sc/source/ui/view/dbfunc3.cxx
index 782c322..4b50b5b 100644
--- a/sc/source/ui/view/dbfunc3.cxx
+++ b/sc/source/ui/view/dbfunc3.cxx
@@ -1898,7 +1898,13 @@ void ScDBFunc::RepeatDB( BOOL bRecord )
pDBData->GetQueryParam( aQueryParam ); // Bereich kann sich geaendert haben
ScRange aAdvSource;
if (pDBData->GetAdvancedQuerySource(aAdvSource))
+ {
+ pDoc->CreateQueryParam(
+ aAdvSource.aStart.Col(), aAdvSource.aStart.Row(),
+ aAdvSource.aEnd.Col(), aAdvSource.aEnd.Row(),
+ aAdvSource.aStart.Tab(), aQueryParam );
Query( aQueryParam, &aAdvSource, FALSE );
+ }
else
Query( aQueryParam, NULL, FALSE );
diff --git a/sc/source/ui/view/gridwin.cxx b/sc/source/ui/view/gridwin.cxx
index e215c34..b08b068 100644
--- a/sc/source/ui/view/gridwin.cxx
+++ b/sc/source/ui/view/gridwin.cxx
@@ -1139,6 +1139,13 @@ void ScGridWindow::ExecFilter( ULONG nSel,
if (SC_AUTOFILTER_CUSTOM == nSel)
{
+ SCTAB nAreaTab;
+ SCCOL nStartCol;
+ SCROW nStartRow;
+ SCCOL nEndCol;
+ SCROW nEndRow;
+ pDBData->GetArea( nAreaTab, nStartCol,nStartRow,nEndCol,nEndRow );
+ pViewData->GetView()->MarkRange( ScRange( nStartCol,nStartRow,nAreaTab,nEndCol,nEndRow,nAreaTab));
pViewData->GetView()->SetCursor(nCol,nRow); //! auch ueber Slot ??
pViewData->GetDispatcher().Execute( SID_FILTER, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD );
}
diff --git a/sc/source/ui/view/viewfunc.cxx b/sc/source/ui/view/viewfunc.cxx
index 3af5fe6..f8a83cf 100644
--- a/sc/source/ui/view/viewfunc.cxx
+++ b/sc/source/ui/view/viewfunc.cxx
@@ -1179,103 +1179,69 @@ void ScViewFunc::ApplyPatternLines( const ScPatternAttr& rAttr, const SvxBoxItem
const SvxBoxInfoItem* pNewInner, BOOL bRecord )
{
ScDocument* pDoc = GetViewData()->GetDocument();
- ScMarkData& rMark = GetViewData()->GetMarkData();
+ ScMarkData aFuncMark( GetViewData()->GetMarkData() ); // local copy for UnmarkFiltered
+ ScViewUtil::UnmarkFiltered( aFuncMark, pDoc );
if (bRecord && !pDoc->IsUndoEnabled())
bRecord = FALSE;
- SCCOL nStartCol;
- SCROW nStartRow;
- SCTAB nStartTab;
- SCCOL nEndCol;
- SCROW nEndRow;
- SCTAB nEndTab;
-
- ScMarkType eMarkType = GetViewData()->GetSimpleArea( nStartCol, nStartRow,
- nStartTab, nEndCol, nEndRow, nEndTab);
- if (eMarkType == SC_MARK_SIMPLE || eMarkType == SC_MARK_SIMPLE_FILTERED)
+ ScRange aMarkRange;
+ aFuncMark.MarkToSimple();
+ BOOL bMulti = aFuncMark.IsMultiMarked();
+ if (bMulti)
+ aFuncMark.GetMultiMarkArea( aMarkRange );
+ else if (aFuncMark.IsMarked())
+ aFuncMark.GetMarkArea( aMarkRange );
+ else
{
- bool bChangeSelection = false;
- ScRange aMarkRange( nStartCol, nStartRow, nStartTab, nEndCol, nEndRow, nEndTab );
- if ( eMarkType == SC_MARK_SIMPLE_FILTERED )
- {
- 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
- }
-
- rMark.MarkToSimple(); // not done by GetSimpleArea anymore
+ aMarkRange = ScRange( GetViewData()->GetCurX(),
+ GetViewData()->GetCurY(), GetViewData()->GetTabNo() );
+ DoneBlockMode();
+ InitOwnBlockMode();
+ aFuncMark.SetMarkArea(aMarkRange);
+ MarkDataChanged();
+ }
- ScDocShell* pDocSh = GetViewData()->GetDocShell();
+ ScDocShell* pDocSh = GetViewData()->GetDocShell();
- ScDocShellModificator aModificator( *pDocSh );
+ ScDocShellModificator aModificator( *pDocSh );
- if (!rMark.IsMarked() || bChangeSelection)
- {
- DoneBlockMode();
- InitOwnBlockMode();
- rMark.SetMarkArea( ScRange( nStartCol, nStartRow, nStartTab, nEndCol, nEndRow, nEndTab ) );
- MarkDataChanged();
- }
+ if (bRecord)
+ {
+ ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
+ SCTAB nStartTab = aMarkRange.aStart.Tab();
+ SCTAB nTabCount = pDoc->GetTableCount();
+ pUndoDoc->InitUndo( pDoc, nStartTab, nStartTab );
+ for (SCTAB i=0; i<nTabCount; i++)
+ if (i != nStartTab && aFuncMark.GetTableSelect(i))
+ pUndoDoc->AddUndoTab( i, i );
- if (bRecord)
- {
- SCTAB nTabCount = pDoc->GetTableCount();
- ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
- pUndoDoc->InitUndo( pDoc, nStartTab, nStartTab );
- for (SCTAB i=0; i<nTabCount; i++)
- if (i != nStartTab && rMark.GetTableSelect(i))
- pUndoDoc->AddUndoTab( i, i );
- pDoc->CopyToDocument( nStartCol, nStartRow, 0, nEndCol, nEndRow, nTabCount-1,
- IDF_ATTRIB, FALSE, pUndoDoc );
+ ScRange aCopyRange = aMarkRange;
+ aCopyRange.aStart.SetTab(0);
+ aCopyRange.aEnd.SetTab(nTabCount-1);
+ pDoc->CopyToDocument( aCopyRange, IDF_ATTRIB, bMulti, pUndoDoc, &aFuncMark );
- pDocSh->GetUndoManager()->AddUndoAction(
- new ScUndoSelectionAttr( pDocSh, rMark,
- nStartCol, nStartRow, nStartTab,
- nEndCol, nEndRow, nEndTab,
- pUndoDoc, FALSE, &rAttr, pNewOuter, pNewInner ) );
- }
+ pDocSh->GetUndoManager()->AddUndoAction(
+ new ScUndoSelectionAttr(
+ pDocSh, aFuncMark,
+ aMarkRange.aStart.Col(), aMarkRange.aStart.Row(), aMarkRange.aStart.Tab(),
+ aMarkRange.aEnd.Col(), aMarkRange.aEnd.Row(), aMarkRange.aEnd.Tab(),
+ pUndoDoc, bMulti, &rAttr, pNewOuter, pNewInner ) );
+ }
- USHORT nExt = SC_PF_TESTMERGE;
- pDocSh->UpdatePaintExt( nExt, nStartCol, nStartRow, nStartTab,
- nEndCol, nEndRow, nEndTab ); // content before the change
+ USHORT nExt = SC_PF_TESTMERGE;
+ pDocSh->UpdatePaintExt( nExt, aMarkRange ); // content before the change
- pDoc->ApplySelectionFrame( rMark, pNewOuter, pNewInner );
+ pDoc->ApplySelectionFrame( aFuncMark, pNewOuter, pNewInner );
- pDocSh->UpdatePaintExt( nExt, nStartCol, nStartRow, nStartTab,
- nEndCol, nEndRow, nEndTab ); // content after the change
+ pDocSh->UpdatePaintExt( nExt, aMarkRange ); // content after the change
- rMark.MarkToMulti();
- pDoc->ApplySelectionPattern( rAttr, rMark );
+ aFuncMark.MarkToMulti();
+ pDoc->ApplySelectionPattern( rAttr, aFuncMark );
- 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);
- }
+ pDocSh->PostPaint( aMarkRange, PAINT_GRID, nExt );
+ pDocSh->UpdateOle(GetViewData());
+ aModificator.SetDocumentModified();
+ CellContentChanged();
StartFormatArea();
}
More information about the ooo-build-commit
mailing list