1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_sc.hxx" 26 27 // System - Includes ----------------------------------------------------- 28 29 30 31 // INCLUDE --------------------------------------------------------------- 32 33 #include "undoutil.hxx" 34 35 #include "docsh.hxx" 36 #include "tabvwsh.hxx" 37 #include "document.hxx" 38 #include "dbcolect.hxx" 39 #include "globstr.hrc" 40 #include "global.hxx" 41 42 void ScUndoUtil::MarkSimpleBlock( ScDocShell* pDocShell, 43 SCCOL nStartX, SCROW nStartY, SCTAB nStartZ, 44 SCCOL nEndX, SCROW nEndY, SCTAB nEndZ ) 45 { 46 if ( pDocShell->IsPaintLocked() ) 47 return; 48 49 ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell(); 50 if (pViewShell) 51 { 52 SCTAB nViewTab = pViewShell->GetViewData()->GetTabNo(); 53 if ( nViewTab < nStartZ || nViewTab > nEndZ ) 54 pViewShell->SetTabNo( nStartZ ); 55 56 pViewShell->DoneBlockMode(); 57 pViewShell->MoveCursorAbs( nStartX, nStartY, SC_FOLLOW_JUMP, sal_False, sal_False ); 58 pViewShell->InitOwnBlockMode(); 59 pViewShell->GetViewData()->GetMarkData(). 60 SetMarkArea( ScRange( nStartX, nStartY, nStartZ, nEndX, nEndY, nEndZ ) ); 61 pViewShell->MarkDataChanged(); 62 } 63 } 64 65 66 void ScUndoUtil::MarkSimpleBlock( ScDocShell* pDocShell, 67 const ScAddress& rBlockStart, 68 const ScAddress& rBlockEnd ) 69 { 70 MarkSimpleBlock( pDocShell, rBlockStart.Col(), rBlockStart.Row(), rBlockStart.Tab(), 71 rBlockEnd.Col(), rBlockEnd.Row(), rBlockEnd.Tab() ); 72 } 73 74 75 void ScUndoUtil::MarkSimpleBlock( ScDocShell* pDocShell, 76 const ScRange& rRange ) 77 { 78 MarkSimpleBlock( pDocShell, rRange.aStart.Col(), rRange.aStart.Row(), rRange.aStart.Tab(), 79 rRange.aEnd.Col(), rRange.aEnd.Row(), rRange.aEnd.Tab() ); 80 } 81 82 83 84 ScDBData* ScUndoUtil::GetOldDBData( ScDBData* pUndoData, ScDocument* pDoc, SCTAB nTab, 85 SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 ) 86 { 87 ScDBData* pRet = pDoc->GetDBAtArea( nTab, nCol1, nRow1, nCol2, nRow2 ); 88 89 if (!pRet) 90 { 91 bool bWasInternalUnnamed = false; 92 bool bWasInternalForAutoFilter = false; 93 if ( pUndoData ) 94 { 95 String aName; 96 pUndoData->GetName( aName ); 97 if ( pUndoData->IsInternalUnnamed() ) 98 { 99 bWasInternalUnnamed = true; 100 } 101 else if (pUndoData->IsInternalForAutoFilter()) 102 { 103 bWasInternalForAutoFilter = true; 104 } 105 } 106 DBG_ASSERT( bWasInternalUnnamed || bWasInternalForAutoFilter, "Undo: didn't find database range"); 107 108 sal_uInt16 nIndex; 109 ScDBCollection* pColl = pDoc->GetDBCollection(); 110 if ( bWasInternalUnnamed 111 && pColl->SearchName( ScGlobal::GetRscString( STR_DB_NONAME ), nIndex )) 112 { 113 pRet = (*pColl)[nIndex]; 114 } 115 else 116 { 117 String aNewNamed = bWasInternalForAutoFilter 118 ? pColl->GetNewDefaultDBName() 119 : ScGlobal::GetRscString( STR_DB_NONAME ); 120 pRet = new ScDBData( 121 aNewNamed, nTab, nCol1,nRow1, nCol2,nRow2, sal_True, 122 pDoc->HasColHeader( nCol1,nRow1,nCol2,nRow2,nTab ) ); 123 pColl->Insert( pRet ); 124 } 125 } 126 127 return pRet; 128 } 129 130 131 void ScUndoUtil::PaintMore( ScDocShell* pDocShell, 132 const ScRange& rRange ) 133 { 134 SCCOL nCol1 = rRange.aStart.Col(); 135 SCROW nRow1 = rRange.aStart.Row(); 136 SCCOL nCol2 = rRange.aEnd.Col(); 137 SCROW nRow2 = rRange.aEnd.Row(); 138 if (nCol1 > 0) --nCol1; 139 if (nRow1 > 0) --nRow1; 140 if (nCol2<MAXCOL) ++nCol2; 141 if (nRow2<MAXROW) ++nRow2; 142 143 pDocShell->PostPaint( nCol1,nRow1,rRange.aStart.Tab(), 144 nCol2,nRow2,rRange.aEnd.Tab(), PAINT_GRID ); 145 } 146