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 #ifndef PCH 32 #include "scitems.hxx" // SearchItem 33 #endif 34 35 // INCLUDE --------------------------------------------------------------- 36 37 #include "undoblk.hxx" 38 #include "document.hxx" 39 #include "docsh.hxx" 40 #include "tabvwsh.hxx" 41 #include "olinetab.hxx" 42 #include "globstr.hrc" 43 #include "global.hxx" 44 #include "target.hxx" 45 46 #include "undoolk.hxx" //! GetUndo ins Document verschieben! 47 48 49 // STATIC DATA ----------------------------------------------------------- 50 51 TYPEINIT1(ScUndoWidthOrHeight, SfxUndoAction); 52 53 // ----------------------------------------------------------------------- 54 55 56 57 // 58 // Spaltenbreiten oder Zeilenhoehen aendern 59 // 60 61 ScUndoWidthOrHeight::ScUndoWidthOrHeight( ScDocShell* pNewDocShell, 62 const ScMarkData& rMark, 63 SCCOLROW nNewStart, SCTAB nNewStartTab, SCCOLROW nNewEnd, SCTAB nNewEndTab, 64 ScDocument* pNewUndoDoc, SCCOLROW nNewCnt, SCCOLROW* pNewRanges, 65 ScOutlineTable* pNewUndoTab, 66 ScSizeMode eNewMode, sal_uInt16 nNewSizeTwips, sal_Bool bNewWidth ) : 67 ScSimpleUndo( pNewDocShell ), 68 aMarkData( rMark ), 69 nStart( nNewStart ), 70 nEnd( nNewEnd ), 71 nStartTab( nNewStartTab ), 72 nEndTab( nNewEndTab ), 73 pUndoDoc( pNewUndoDoc ), 74 pUndoTab( pNewUndoTab ), 75 nRangeCnt( nNewCnt ), 76 pRanges( pNewRanges ), 77 nNewSize( nNewSizeTwips ), 78 bWidth( bNewWidth ), 79 eMode( eNewMode ), 80 pDrawUndo( NULL ) 81 { 82 pDrawUndo = GetSdrUndoAction( pDocShell->GetDocument() ); 83 } 84 85 __EXPORT ScUndoWidthOrHeight::~ScUndoWidthOrHeight() 86 { 87 delete[] pRanges; 88 delete pUndoDoc; 89 delete pUndoTab; 90 DeleteSdrUndoAction( pDrawUndo ); 91 } 92 93 String __EXPORT ScUndoWidthOrHeight::GetComment() const 94 { 95 // [ "optimale " ] "Spaltenbreite" | "Zeilenhoehe" 96 return ( bWidth ? 97 ( ( eMode == SC_SIZE_OPTIMAL )? 98 ScGlobal::GetRscString( STR_UNDO_OPTCOLWIDTH ) : 99 ScGlobal::GetRscString( STR_UNDO_COLWIDTH ) 100 ) : 101 ( ( eMode == SC_SIZE_OPTIMAL )? 102 ScGlobal::GetRscString( STR_UNDO_OPTROWHEIGHT ) : 103 ScGlobal::GetRscString( STR_UNDO_ROWHEIGHT ) 104 ) ); 105 } 106 107 void __EXPORT ScUndoWidthOrHeight::Undo() 108 { 109 BeginUndo(); 110 111 ScDocument* pDoc = pDocShell->GetDocument(); 112 113 SCCOLROW nPaintStart = nStart > 0 ? nStart-1 : static_cast<SCCOLROW>(0); 114 115 if (eMode==SC_SIZE_OPTIMAL) 116 { 117 if ( SetViewMarkData( aMarkData ) ) 118 nPaintStart = 0; // paint all, because of changed selection 119 } 120 121 //! outlines from all tables? 122 if (pUndoTab) // Outlines mit gespeichert? 123 pDoc->SetOutlineTable( nStartTab, pUndoTab ); 124 125 SCTAB nTabCount = pDoc->GetTableCount(); 126 SCTAB nTab; 127 for (nTab=0; nTab<nTabCount; nTab++) 128 if (aMarkData.GetTableSelect(nTab)) 129 { 130 if (bWidth) // Width 131 { 132 pUndoDoc->CopyToDocument( static_cast<SCCOL>(nStart), 0, nTab, 133 static_cast<SCCOL>(nEnd), MAXROW, nTab, IDF_NONE, 134 sal_False, pDoc ); 135 pDoc->UpdatePageBreaks( nTab ); 136 pDocShell->PostPaint( static_cast<SCCOL>(nPaintStart), 0, nTab, 137 MAXCOL, MAXROW, nTab, PAINT_GRID | PAINT_TOP ); 138 } 139 else // Height 140 { 141 pUndoDoc->CopyToDocument( 0, nStart, nTab, MAXCOL, nEnd, nTab, IDF_NONE, sal_False, pDoc ); 142 pDoc->UpdatePageBreaks( nTab ); 143 pDocShell->PostPaint( 0, nPaintStart, nTab, MAXCOL, MAXROW, nTab, PAINT_GRID | PAINT_LEFT ); 144 } 145 } 146 147 DoSdrUndoAction( pDrawUndo, pDoc ); 148 149 ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell(); 150 if (pViewShell) 151 { 152 pViewShell->UpdateScrollBars(); 153 154 SCTAB nCurrentTab = pViewShell->GetViewData()->GetTabNo(); 155 if ( nCurrentTab < nStartTab || nCurrentTab > nEndTab ) 156 pViewShell->SetTabNo( nStartTab ); 157 } 158 159 EndUndo(); 160 } 161 162 void __EXPORT ScUndoWidthOrHeight::Redo() 163 { 164 BeginRedo(); 165 166 sal_Bool bPaintAll = sal_False; 167 if (eMode==SC_SIZE_OPTIMAL) 168 { 169 if ( SetViewMarkData( aMarkData ) ) 170 bPaintAll = sal_True; // paint all, because of changed selection 171 } 172 173 ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell(); 174 if (pViewShell) 175 { 176 SCTAB nTab = pViewShell->GetViewData()->GetTabNo(); 177 if ( nTab < nStartTab || nTab > nEndTab ) 178 pViewShell->SetTabNo( nStartTab ); 179 } 180 181 // SetWidthOrHeight aendert aktuelle Tabelle ! 182 if ( pViewShell ) 183 pViewShell->SetWidthOrHeight( bWidth, nRangeCnt, pRanges, eMode, nNewSize, sal_False, sal_True, &aMarkData ); 184 185 // paint grid if selection was changed directly at the MarkData 186 if (bPaintAll) 187 pDocShell->PostPaint( 0, 0, nStartTab, MAXCOL, MAXROW, nEndTab, PAINT_GRID ); 188 189 EndRedo(); 190 } 191 192 void __EXPORT ScUndoWidthOrHeight::Repeat(SfxRepeatTarget& rTarget) 193 { 194 if (rTarget.ISA(ScTabViewTarget)) 195 ((ScTabViewTarget&)rTarget).GetViewShell()->SetMarkedWidthOrHeight( bWidth, eMode, nNewSize, sal_True ); 196 } 197 198 sal_Bool __EXPORT ScUndoWidthOrHeight::CanRepeat(SfxRepeatTarget& rTarget) const 199 { 200 return (rTarget.ISA(ScTabViewTarget)); 201 } 202 203 204