diff -uPr old/sc/source/core/data/document.cxx new/sc/source/core/data/document.cxx --- old/sc/source/core/data/document.cxx 2009-04-16 12:56:26.000000000 +0800 +++ new/sc/source/core/data/document.cxx 2009-05-15 13:30:04.000000000 +0800 @@ -4022,16 +4022,21 @@ 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; jApplyBlockFrame( pLineOuter, pLineInner, + aRange.aStart.Col(), aRange.aStart.Row(), + aRange.aEnd.Col(), aRange.aEnd.Row() ); + } + } } } diff -uPr old/sc/source/ui/view/viewfunc.cxx new/sc/source/ui/view/viewfunc.cxx --- old/sc/source/ui/view/viewfunc.cxx 2009-04-16 13:06:50.000000000 +0800 +++ new/sc/source/ui/view/viewfunc.cxx 2009-05-15 13:34:48.000000000 +0800 @@ -1180,102 +1180,68 @@ { ScDocument* pDoc = GetViewData()->GetDocument(); ScMarkData& rMark = GetViewData()->GetMarkData(); + ScViewUtil::UnmarkFiltered( rMark, 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) - { - 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 + ScRange aMarkRange; + rMark.MarkToSimple(); + BOOL bMulti = rMark.IsMultiMarked(); + if (bMulti) + rMark.GetMultiMarkArea( aMarkRange ); + else if (rMark.IsMarked()) + rMark.GetMarkArea( aMarkRange ); + else + { + aMarkRange = ScRange( GetViewData()->GetCurX(), + GetViewData()->GetCurY(), GetViewData()->GetTabNo() ); + DoneBlockMode(); + InitOwnBlockMode(); + rMark.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; iAddUndoTab( i, i ); - if (bRecord) - { - SCTAB nTabCount = pDoc->GetTableCount(); - ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO ); - pUndoDoc->InitUndo( pDoc, nStartTab, nStartTab ); - for (SCTAB i=0; iAddUndoTab( 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, &rMark ); - pDocSh->GetUndoManager()->AddUndoAction( - new ScUndoSelectionAttr( pDocSh, rMark, - nStartCol, nStartRow, nStartTab, - nEndCol, nEndRow, nEndTab, - pUndoDoc, FALSE, &rAttr, pNewOuter, pNewInner ) ); - } + pDocSh->GetUndoManager()->AddUndoAction( + new ScUndoSelectionAttr( + pDocSh, rMark, + 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( rMark, 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 ); + 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); - } + pDocSh->PostPaint( aMarkRange, PAINT_GRID, nExt ); + pDocSh->UpdateOle(GetViewData()); + aModificator.SetDocumentModified(); + CellContentChanged(); StartFormatArea(); }