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 28 29 // INCLUDE --------------------------------------------------------------- 30 31 #include <svx/svdtrans.hxx> 32 #include <unotools/localedatawrapper.hxx> 33 34 #include "colrowba.hxx" 35 #include "document.hxx" 36 #include "scmod.hxx" 37 #include "tabvwsh.hxx" 38 #include "docsh.hxx" 39 #include "appoptio.hxx" 40 #include "globstr.hrc" 41 42 // STATIC DATA ----------------------------------------------------------- 43 44 //================================================================== 45 46 String lcl_MetricString( long nTwips, const String& rText ) 47 { 48 if ( nTwips <= 0 ) 49 return ScGlobal::GetRscString(STR_TIP_HIDE); 50 else 51 { 52 FieldUnit eUserMet = SC_MOD()->GetAppOptions().GetAppMetric(); 53 54 sal_Int64 nUserVal = MetricField::ConvertValue( nTwips*100, 1, 2, FUNIT_TWIP, eUserMet ); 55 56 String aStr = rText; 57 aStr += ' '; 58 aStr += ScGlobal::pLocaleData->getNum( nUserVal, 2 ); 59 aStr += ' '; 60 aStr += SdrFormatter::GetUnitStr(eUserMet); 61 62 return aStr; 63 } 64 } 65 66 //================================================================== 67 68 ScColBar::ScColBar( Window* pParent, ScViewData* pData, ScHSplitPos eWhichPos, 69 ScHeaderFunctionSet* pFunc, ScHeaderSelectionEngine* pEng ) : 70 ScHeaderControl( pParent, pEng, MAXCOL+1, HDR_HORIZONTAL ), 71 pViewData( pData ), 72 eWhich( eWhichPos ), 73 pFuncSet( pFunc ), 74 pSelEngine( pEng ) 75 { 76 Show(); 77 } 78 79 ScColBar::~ScColBar() 80 { 81 } 82 83 inline sal_Bool ScColBar::UseNumericHeader() const 84 { 85 return pViewData->GetDocument()->GetAddressConvention() == formula::FormulaGrammar::CONV_XL_R1C1; 86 } 87 88 SCCOLROW ScColBar::GetPos() 89 { 90 return pViewData->GetPosX(eWhich); 91 } 92 93 sal_uInt16 ScColBar::GetEntrySize( SCCOLROW nEntryNo ) 94 { 95 ScDocument* pDoc = pViewData->GetDocument(); 96 SCTAB nTab = pViewData->GetTabNo(); 97 SCCOL nLastCol = -1; 98 if (pDoc->ColHidden(static_cast<SCCOL>(nEntryNo), nTab, nLastCol)) 99 return 0; 100 else 101 return (sal_uInt16) ScViewData::ToPixel( pDoc->GetColWidth( static_cast<SCCOL>(nEntryNo), nTab ), pViewData->GetPPTX() ); 102 } 103 104 String ScColBar::GetEntryText( SCCOLROW nEntryNo ) 105 { 106 return UseNumericHeader() 107 ? String::CreateFromInt32( nEntryNo + 1 ) 108 : ScColToAlpha( static_cast<SCCOL>(nEntryNo) ); 109 } 110 111 void ScColBar::SetEntrySize( SCCOLROW nPos, sal_uInt16 nNewSize ) 112 { 113 sal_uInt16 nSizeTwips; 114 ScSizeMode eMode = SC_SIZE_DIRECT; 115 if (nNewSize>0 && nNewSize<10) nNewSize=10; // (Pixel) 116 117 if ( nNewSize == HDR_SIZE_OPTIMUM ) 118 { 119 nSizeTwips = STD_EXTRA_WIDTH; 120 eMode = SC_SIZE_OPTIMAL; 121 } 122 else 123 nSizeTwips = (sal_uInt16) ( nNewSize / pViewData->GetPPTX() ); 124 125 ScMarkData& rMark = pViewData->GetMarkData(); 126 // SCTAB nTab = pViewData->GetTabNo(); 127 128 SCCOLROW* pRanges = new SCCOLROW[MAXCOL+1]; 129 SCCOL nRangeCnt = 0; 130 if ( rMark.IsColumnMarked( static_cast<SCCOL>(nPos) ) ) 131 { 132 SCCOL nStart = 0; 133 while (nStart<=MAXCOL) 134 { 135 while (nStart<MAXCOL && !rMark.IsColumnMarked(nStart)) 136 ++nStart; 137 if (rMark.IsColumnMarked(nStart)) 138 { 139 SCCOL nEnd = nStart; 140 while (nEnd<MAXCOL && rMark.IsColumnMarked(nEnd)) 141 ++nEnd; 142 if (!rMark.IsColumnMarked(nEnd)) 143 --nEnd; 144 pRanges[static_cast<size_t>(2*nRangeCnt) ] = nStart; 145 pRanges[static_cast<size_t>(2*nRangeCnt+1)] = nEnd; 146 ++nRangeCnt; 147 nStart = nEnd+1; 148 } 149 else 150 nStart = MAXCOL+1; 151 } 152 } 153 else 154 { 155 pRanges[0] = nPos; 156 pRanges[1] = nPos; 157 nRangeCnt = 1; 158 } 159 160 pViewData->GetView()->SetWidthOrHeight( sal_True, nRangeCnt, pRanges, eMode, nSizeTwips ); 161 delete[] pRanges; 162 } 163 164 void ScColBar::HideEntries( SCCOLROW nStart, SCCOLROW nEnd ) 165 { 166 SCCOLROW nRange[2]; 167 nRange[0] = nStart; 168 nRange[1] = nEnd; 169 pViewData->GetView()->SetWidthOrHeight( sal_True, 1, nRange, SC_SIZE_DIRECT, 0 ); 170 } 171 172 void ScColBar::SetMarking( sal_Bool bSet ) 173 { 174 pViewData->GetMarkData().SetMarking( bSet ); 175 if (!bSet) 176 { 177 pViewData->GetView()->UpdateAutoFillMark(); 178 } 179 } 180 181 void ScColBar::SelectWindow() 182 { 183 ScTabViewShell* pViewSh = pViewData->GetViewShell(); 184 185 pViewSh->SetActive(); // Appear und SetViewFrame 186 pViewSh->DrawDeselectAll(); 187 188 ScSplitPos eActive = pViewData->GetActivePart(); 189 if (eWhich==SC_SPLIT_LEFT) 190 { 191 if (eActive==SC_SPLIT_TOPRIGHT) eActive=SC_SPLIT_TOPLEFT; 192 if (eActive==SC_SPLIT_BOTTOMRIGHT) eActive=SC_SPLIT_BOTTOMLEFT; 193 } 194 else 195 { 196 if (eActive==SC_SPLIT_TOPLEFT) eActive=SC_SPLIT_TOPRIGHT; 197 if (eActive==SC_SPLIT_BOTTOMLEFT) eActive=SC_SPLIT_BOTTOMRIGHT; 198 } 199 pViewSh->ActivatePart( eActive ); 200 201 pFuncSet->SetColumn( sal_True ); 202 pFuncSet->SetWhich( eActive ); 203 204 pViewSh->ActiveGrabFocus(); 205 } 206 207 sal_Bool ScColBar::IsDisabled() 208 { 209 ScModule* pScMod = SC_MOD(); 210 return pScMod->IsFormulaMode() || pScMod->IsModalMode(); 211 } 212 213 sal_Bool ScColBar::ResizeAllowed() 214 { 215 return !pViewData->HasEditView( pViewData->GetActivePart() ) && 216 !pViewData->GetDocShell()->IsReadOnly(); 217 } 218 219 void ScColBar::DrawInvert( long nDragPosP ) 220 { 221 Rectangle aRect( nDragPosP,0, nDragPosP+HDR_SLIDERSIZE-1,GetOutputSizePixel().Width()-1 ); 222 Update(); 223 Invert(aRect); 224 225 pViewData->GetView()->InvertVertical(eWhich,nDragPosP); 226 } 227 228 String ScColBar::GetDragHelp( long nVal ) 229 { 230 long nTwips = (long) ( nVal / pViewData->GetPPTX() ); 231 return lcl_MetricString( nTwips, ScGlobal::GetRscString(STR_TIP_WIDTH) ); 232 } 233 234 sal_Bool ScColBar::IsLayoutRTL() // overloaded only for columns 235 { 236 return pViewData->GetDocument()->IsLayoutRTL( pViewData->GetTabNo() ); 237 } 238 239 //================================================================== 240 241 ScRowBar::ScRowBar( Window* pParent, ScViewData* pData, ScVSplitPos eWhichPos, 242 ScHeaderFunctionSet* pFunc, ScHeaderSelectionEngine* pEng ) : 243 ScHeaderControl( pParent, pEng, MAXROW+1, HDR_VERTICAL ), 244 pViewData( pData ), 245 eWhich( eWhichPos ), 246 pFuncSet( pFunc ), 247 pSelEngine( pEng ) 248 { 249 Show(); 250 } 251 252 ScRowBar::~ScRowBar() 253 { 254 } 255 256 SCCOLROW ScRowBar::GetPos() 257 { 258 return pViewData->GetPosY(eWhich); 259 } 260 261 sal_uInt16 ScRowBar::GetEntrySize( SCCOLROW nEntryNo ) 262 { 263 ScDocument* pDoc = pViewData->GetDocument(); 264 SCTAB nTab = pViewData->GetTabNo(); 265 SCROW nLastRow = -1; 266 if (pDoc->RowHidden(nEntryNo, nTab, nLastRow)) 267 return 0; 268 else 269 return (sal_uInt16) ScViewData::ToPixel( pDoc->GetOriginalHeight( nEntryNo, 270 nTab ), pViewData->GetPPTY() ); 271 } 272 273 String ScRowBar::GetEntryText( SCCOLROW nEntryNo ) 274 { 275 return String::CreateFromInt32( nEntryNo + 1 ); 276 } 277 278 void ScRowBar::SetEntrySize( SCCOLROW nPos, sal_uInt16 nNewSize ) 279 { 280 sal_uInt16 nSizeTwips; 281 ScSizeMode eMode = SC_SIZE_DIRECT; 282 if (nNewSize>0 && nNewSize<10) nNewSize=10; // (Pixel) 283 284 if ( nNewSize == HDR_SIZE_OPTIMUM ) 285 { 286 nSizeTwips = 0; 287 eMode = SC_SIZE_OPTIMAL; 288 } 289 else 290 nSizeTwips = (sal_uInt16) ( nNewSize / pViewData->GetPPTY() ); 291 292 ScMarkData& rMark = pViewData->GetMarkData(); 293 // SCTAB nTab = pViewData->GetTabNo(); 294 295 SCCOLROW* pRanges = new SCCOLROW[MAXROW+1]; 296 SCROW nRangeCnt = 0; 297 if ( rMark.IsRowMarked( nPos ) ) 298 { 299 SCROW nStart = 0; 300 while (nStart<=MAXROW) 301 { 302 while (nStart<MAXROW && !rMark.IsRowMarked(nStart)) 303 ++nStart; 304 if (rMark.IsRowMarked(nStart)) 305 { 306 SCROW nEnd = nStart; 307 while (nEnd<MAXROW && rMark.IsRowMarked(nEnd)) 308 ++nEnd; 309 if (!rMark.IsRowMarked(nEnd)) 310 --nEnd; 311 pRanges[static_cast<size_t>(2*nRangeCnt) ] = nStart; 312 pRanges[static_cast<size_t>(2*nRangeCnt+1)] = nEnd; 313 ++nRangeCnt; 314 nStart = nEnd+1; 315 } 316 else 317 nStart = MAXROW+1; 318 } 319 } 320 else 321 { 322 pRanges[0] = nPos; 323 pRanges[1] = nPos; 324 nRangeCnt = 1; 325 } 326 327 pViewData->GetView()->SetWidthOrHeight( sal_False, nRangeCnt, pRanges, eMode, nSizeTwips ); 328 delete[] pRanges; 329 } 330 331 void ScRowBar::HideEntries( SCCOLROW nStart, SCCOLROW nEnd ) 332 { 333 SCCOLROW nRange[2]; 334 nRange[0] = nStart; 335 nRange[1] = nEnd; 336 pViewData->GetView()->SetWidthOrHeight( sal_False, 1, nRange, SC_SIZE_DIRECT, 0 ); 337 } 338 339 void ScRowBar::SetMarking( sal_Bool bSet ) 340 { 341 pViewData->GetMarkData().SetMarking( bSet ); 342 if (!bSet) 343 { 344 pViewData->GetView()->UpdateAutoFillMark(); 345 } 346 } 347 348 void ScRowBar::SelectWindow() 349 { 350 ScTabViewShell* pViewSh = pViewData->GetViewShell(); 351 352 pViewSh->SetActive(); // Appear und SetViewFrame 353 pViewSh->DrawDeselectAll(); 354 355 ScSplitPos eActive = pViewData->GetActivePart(); 356 if (eWhich==SC_SPLIT_TOP) 357 { 358 if (eActive==SC_SPLIT_BOTTOMLEFT) eActive=SC_SPLIT_TOPLEFT; 359 if (eActive==SC_SPLIT_BOTTOMRIGHT) eActive=SC_SPLIT_TOPRIGHT; 360 } 361 else 362 { 363 if (eActive==SC_SPLIT_TOPLEFT) eActive=SC_SPLIT_BOTTOMLEFT; 364 if (eActive==SC_SPLIT_TOPRIGHT) eActive=SC_SPLIT_BOTTOMRIGHT; 365 } 366 pViewSh->ActivatePart( eActive ); 367 368 pFuncSet->SetColumn( sal_False ); 369 pFuncSet->SetWhich( eActive ); 370 371 pViewSh->ActiveGrabFocus(); 372 } 373 374 sal_Bool ScRowBar::IsDisabled() 375 { 376 ScModule* pScMod = SC_MOD(); 377 return pScMod->IsFormulaMode() || pScMod->IsModalMode(); 378 } 379 380 sal_Bool ScRowBar::ResizeAllowed() 381 { 382 return !pViewData->HasEditView( pViewData->GetActivePart() ) && 383 !pViewData->GetDocShell()->IsReadOnly(); 384 } 385 386 void ScRowBar::DrawInvert( long nDragPosP ) 387 { 388 Rectangle aRect( 0,nDragPosP, GetOutputSizePixel().Width()-1,nDragPosP+HDR_SLIDERSIZE-1 ); 389 Update(); 390 Invert(aRect); 391 392 pViewData->GetView()->InvertHorizontal(eWhich,nDragPosP); 393 } 394 395 String ScRowBar::GetDragHelp( long nVal ) 396 { 397 long nTwips = (long) ( nVal / pViewData->GetPPTY() ); 398 return lcl_MetricString( nTwips, ScGlobal::GetRscString(STR_TIP_HEIGHT) ); 399 } 400 401 // GetHiddenCount ist nur fuer Zeilen ueberladen 402 403 SCROW ScRowBar::GetHiddenCount( SCROW nEntryNo ) 404 { 405 ScDocument* pDoc = pViewData->GetDocument(); 406 SCTAB nTab = pViewData->GetTabNo(); 407 return pDoc->GetHiddenRowCount( nEntryNo, nTab ); 408 } 409 410 sal_Bool ScRowBar::IsMirrored() // overloaded only for rows 411 { 412 return pViewData->GetDocument()->IsLayoutRTL( pViewData->GetTabNo() ); 413 } 414 415 416