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 26 #include "precompiled_editeng.hxx" 27 28 #include <com/sun/star/i18n/WordType.hpp> 29 30 #include <svl/intitem.hxx> 31 #include <editeng/editeng.hxx> 32 #include <editeng/editview.hxx> 33 #include <editeng/editdata.hxx> 34 #include <editeng/eerdll.hxx> 35 #include <editeng/lrspitem.hxx> 36 #include <editeng/fhgtitem.hxx> 37 38 #include <svl/style.hxx> 39 #include <i18npool/mslangid.hxx> 40 41 #define _OUTLINER_CXX 42 #include <editeng/outliner.hxx> 43 #include <outleeng.hxx> 44 #include <paralist.hxx> 45 #include <outlundo.hxx> 46 #include <editeng/outlobj.hxx> 47 #include <editeng/flditem.hxx> 48 #include <editeng/flditem.hxx> 49 #include <editeng/eeitem.hxx> 50 #include <editeng/numitem.hxx> 51 #include <vcl/window.hxx> 52 #include <svl/itemset.hxx> 53 #include <svl/eitem.hxx> 54 #include <editeng/editstat.hxx> 55 56 57 // Breite der Randzonen innerhalb derer beim D&D gescrollt wird 58 #define OL_SCROLL_LRBORDERWIDTHPIX 10 59 #define OL_SCROLL_TBBORDERWIDTHPIX 10 60 61 // Wert, um den Fensterinhalt beim D&D gescrollt wird 62 #define OL_SCROLL_HOROFFSET 20 /* in % von VisibleSize.Width */ 63 #define OL_SCROLL_VEROFFSET 20 /* in % von VisibleSize.Height */ 64 65 using namespace ::com::sun::star; 66 67 DBG_NAME(OutlinerView) 68 69 70 OutlinerView::OutlinerView( Outliner* pOut, Window* pWin ) 71 { 72 DBG_CTOR( OutlinerView, 0 ); 73 74 pOwner = pOut; 75 bDDCursorVisible = sal_False; 76 bInDragMode = sal_False; 77 nDDScrollLRBorderWidthWin = 0; 78 nDDScrollTBBorderWidthWin = 0; 79 pHorTabArrDoc = 0; 80 81 pEditView = new EditView( pOut->pEditEngine, pWin ); 82 pEditView->SetSelectionMode( EE_SELMODE_TXTONLY ); 83 } 84 85 OutlinerView::~OutlinerView() 86 { 87 DBG_DTOR(OutlinerView,0); 88 delete pEditView; 89 } 90 91 void OutlinerView::Paint( const Rectangle& rRect, OutputDevice* pTargetDevice ) 92 { 93 DBG_CHKTHIS(OutlinerView,0); 94 95 // beim ersten Paint/KeyInput/Drop wird aus einem leeren Outliner ein 96 // Outliner mit genau einem Absatz 97 if( pOwner->bFirstParaIsEmpty ) 98 pOwner->Insert( String() ); 99 100 pEditView->Paint( rRect, pTargetDevice ); 101 } 102 103 sal_Bool OutlinerView::PostKeyEvent( const KeyEvent& rKEvt ) 104 { 105 DBG_CHKTHIS( OutlinerView, 0 ); 106 107 // beim ersten Paint/KeyInput/Drop wird aus einem leeren Outliner ein 108 // Outliner mit genau einem Absatz 109 if( pOwner->bFirstParaIsEmpty ) 110 pOwner->Insert( String() ); 111 112 113 sal_Bool bKeyProcessed = sal_False; 114 ESelection aSel( pEditView->GetSelection() ); 115 sal_Bool bSelection = aSel.HasRange(); 116 KeyCode aKeyCode = rKEvt.GetKeyCode(); 117 KeyFuncType eFunc = aKeyCode.GetFunction(); 118 sal_uInt16 nCode = aKeyCode.GetCode(); 119 sal_Bool bReadOnly = IsReadOnly(); 120 121 if( bSelection && ( nCode != KEY_TAB ) && EditEngine::DoesKeyChangeText( rKEvt ) ) 122 { 123 if ( ImpCalcSelectedPages( sal_False ) && !pOwner->ImpCanDeleteSelectedPages( this ) ) 124 return sal_True; 125 } 126 127 if ( eFunc != KEYFUNC_DONTKNOW ) 128 { 129 switch ( eFunc ) 130 { 131 case KEYFUNC_CUT: 132 { 133 if ( !bReadOnly ) 134 { 135 Cut(); 136 bKeyProcessed = sal_True; 137 } 138 } 139 break; 140 case KEYFUNC_COPY: 141 { 142 Copy(); 143 bKeyProcessed = sal_True; 144 } 145 break; 146 case KEYFUNC_PASTE: 147 { 148 if ( !bReadOnly ) 149 { 150 PasteSpecial(); 151 bKeyProcessed = sal_True; 152 } 153 } 154 break; 155 case KEYFUNC_DELETE: 156 { 157 if( !bReadOnly && !bSelection && ( pOwner->ImplGetOutlinerMode() != OUTLINERMODE_TEXTOBJECT ) ) 158 { 159 if( aSel.nEndPos == pOwner->pEditEngine->GetTextLen( aSel.nEndPara ) ) 160 { 161 Paragraph* pNext = pOwner->pParaList->GetParagraph( aSel.nEndPara+1 ); 162 if( pNext && pNext->HasFlag(PARAFLAG_ISPAGE) ) 163 { 164 if( !pOwner->ImpCanDeleteSelectedPages( this, aSel.nEndPara, 1 ) ) 165 return sal_False; 166 } 167 } 168 } 169 } 170 break; 171 default: // wird dann evtl. unten bearbeitet. 172 eFunc = KEYFUNC_DONTKNOW; 173 } 174 } 175 if ( eFunc == KEYFUNC_DONTKNOW ) 176 { 177 switch ( nCode ) 178 { 179 case KEY_TAB: 180 { 181 if ( !bReadOnly && !aKeyCode.IsMod1() && !aKeyCode.IsMod2() ) 182 { 183 if ( ( pOwner->ImplGetOutlinerMode() != OUTLINERMODE_TEXTOBJECT ) && 184 ( pOwner->ImplGetOutlinerMode() != OUTLINERMODE_TITLEOBJECT ) && 185 ( bSelection || !aSel.nStartPos ) ) 186 { 187 Indent( aKeyCode.IsShift() ? (-1) : (+1) ); 188 bKeyProcessed = sal_True; 189 } 190 else if ( ( pOwner->ImplGetOutlinerMode() == OUTLINERMODE_TEXTOBJECT ) && 191 !bSelection && !aSel.nEndPos && pOwner->ImplHasNumberFormat( aSel.nEndPara ) ) 192 { 193 Indent( aKeyCode.IsShift() ? (-1) : (+1) ); 194 bKeyProcessed = sal_True; 195 } 196 } 197 } 198 break; 199 case KEY_BACKSPACE: 200 { 201 if( !bReadOnly && !bSelection && aSel.nEndPara && !aSel.nEndPos ) 202 { 203 Paragraph* pPara = pOwner->pParaList->GetParagraph( aSel.nEndPara ); 204 Paragraph* pPrev = pOwner->pParaList->GetParagraph( aSel.nEndPara-1 ); 205 if( !pPrev->IsVisible() ) 206 return sal_True; 207 if( !pPara->GetDepth() ) 208 { 209 if(!pOwner->ImpCanDeleteSelectedPages(this, aSel.nEndPara , 1 ) ) 210 return sal_True; 211 } 212 } 213 } 214 break; 215 case KEY_RETURN: 216 { 217 if ( !bReadOnly ) 218 { 219 // Sonderbehandlung: Hartes Return am Ende eines Absatzes, 220 // der eingeklappte Unterabsaetze besitzt 221 Paragraph* pPara = pOwner->pParaList->GetParagraph( aSel.nEndPara ); 222 223 if( !aKeyCode.IsShift() ) 224 { 225 // Nochmal ImpGetCursor ??? 226 if( !bSelection && 227 aSel.nEndPos == pOwner->pEditEngine->GetTextLen( aSel.nEndPara ) ) 228 { 229 sal_uLong nChilds = pOwner->pParaList->GetChildCount(pPara); 230 if( nChilds && !pOwner->pParaList->HasVisibleChilds(pPara)) 231 { 232 pOwner->UndoActionStart( OLUNDO_INSERT ); 233 sal_uLong nTemp = aSel.nEndPara; 234 nTemp += nChilds; 235 nTemp++; // einfuegen ueber naechstem Non-Child 236 pOwner->Insert( String(),nTemp,pPara->GetDepth()); 237 // Cursor positionieren 238 ESelection aTmpSel((sal_uInt16)nTemp,0,(sal_uInt16)nTemp,0); 239 pEditView->SetSelection( aTmpSel ); 240 pEditView->ShowCursor( sal_True, sal_True ); 241 pOwner->UndoActionEnd( OLUNDO_INSERT ); 242 bKeyProcessed = sal_True; 243 } 244 } 245 } 246 if( !bKeyProcessed && !bSelection && 247 !aKeyCode.IsShift() && aKeyCode.IsMod1() && 248 ( aSel.nEndPos == pOwner->pEditEngine->GetTextLen(aSel.nEndPara) ) ) 249 { 250 pOwner->UndoActionStart( OLUNDO_INSERT ); 251 sal_uLong nTemp = aSel.nEndPara; 252 nTemp++; 253 pOwner->Insert( String(), nTemp, pPara->GetDepth()+1 ); 254 255 // Cursor positionieren 256 ESelection aTmpSel((sal_uInt16)nTemp,0,(sal_uInt16)nTemp,0); 257 pEditView->SetSelection( aTmpSel ); 258 pEditView->ShowCursor( sal_True, sal_True ); 259 pOwner->UndoActionEnd( OLUNDO_INSERT ); 260 bKeyProcessed = sal_True; 261 } 262 } 263 } 264 break; 265 } 266 } 267 268 return bKeyProcessed ? sal_True : pEditView->PostKeyEvent( rKEvt ); 269 } 270 271 272 sal_uLong OutlinerView::ImpCheckMousePos(const Point& rPosPix, MouseTarget& reTarget) 273 { 274 DBG_CHKTHIS(OutlinerView,0); 275 sal_uLong nPara = EE_PARA_NOT_FOUND; 276 277 Point aMousePosWin = pEditView->GetWindow()->PixelToLogic( rPosPix ); 278 if( !pEditView->GetOutputArea().IsInside( aMousePosWin ) ) 279 { 280 reTarget = MouseOutside; 281 } 282 else 283 { 284 reTarget = MouseText; 285 286 Point aPaperPos( aMousePosWin ); 287 Rectangle aOutArea = pEditView->GetOutputArea(); 288 Rectangle aVisArea = pEditView->GetVisArea(); 289 aPaperPos.X() -= aOutArea.Left(); 290 aPaperPos.X() += aVisArea.Left(); 291 aPaperPos.Y() -= aOutArea.Top(); 292 aPaperPos.Y() += aVisArea.Top(); 293 294 sal_Bool bBullet; 295 if ( pOwner->IsTextPos( aPaperPos, 0, &bBullet ) ) 296 { 297 Point aDocPos = pOwner->GetDocPos( aPaperPos ); 298 nPara = pOwner->pEditEngine->FindParagraph( aDocPos.Y() ); 299 300 if ( bBullet ) 301 { 302 reTarget = MouseBullet; 303 } 304 else 305 { 306 // Check for hyperlink 307 const SvxFieldItem* pFieldItem = pEditView->GetField( aMousePosWin ); 308 if ( pFieldItem && pFieldItem->GetField() && pFieldItem->GetField()->ISA( SvxURLField ) ) 309 reTarget = MouseHypertext; 310 } 311 } 312 } 313 return nPara; 314 } 315 316 sal_Bool __EXPORT OutlinerView::MouseMove( const MouseEvent& rMEvt ) 317 { 318 DBG_CHKTHIS(OutlinerView,0); 319 320 if( ( pOwner->ImplGetOutlinerMode() == OUTLINERMODE_TEXTOBJECT ) || pEditView->GetEditEngine()->IsInSelectionMode()) 321 return pEditView->MouseMove( rMEvt ); 322 323 Point aMousePosWin( pEditView->GetWindow()->PixelToLogic( rMEvt.GetPosPixel() ) ); 324 if( !pEditView->GetOutputArea().IsInside( aMousePosWin ) ) 325 return sal_False; 326 327 Pointer aPointer = GetPointer( rMEvt.GetPosPixel() ); 328 pEditView->GetWindow()->SetPointer( aPointer ); 329 return pEditView->MouseMove( rMEvt ); 330 } 331 332 333 sal_Bool __EXPORT OutlinerView::MouseButtonDown( const MouseEvent& rMEvt ) 334 { 335 DBG_CHKTHIS(OutlinerView,0); 336 if ( ( pOwner->ImplGetOutlinerMode() == OUTLINERMODE_TEXTOBJECT ) || pEditView->GetEditEngine()->IsInSelectionMode() ) 337 return pEditView->MouseButtonDown( rMEvt ); 338 339 Point aMousePosWin( pEditView->GetWindow()->PixelToLogic( rMEvt.GetPosPixel() ) ); 340 if( !pEditView->GetOutputArea().IsInside( aMousePosWin ) ) 341 return sal_False; 342 343 Pointer aPointer = GetPointer( rMEvt.GetPosPixel() ); 344 pEditView->GetWindow()->SetPointer( aPointer ); 345 346 MouseTarget eTarget; 347 sal_uLong nPara = ImpCheckMousePos( rMEvt.GetPosPixel(), eTarget ); 348 if ( eTarget == MouseBullet ) 349 { 350 Paragraph* pPara = pOwner->pParaList->GetParagraph( nPara ); 351 sal_Bool bHasChilds = (pPara && pOwner->pParaList->HasChilds(pPara)); 352 if( rMEvt.GetClicks() == 1 ) 353 { 354 sal_uLong nEndPara = nPara; 355 if ( bHasChilds && pOwner->pParaList->HasVisibleChilds(pPara) ) 356 nEndPara += pOwner->pParaList->GetChildCount( pPara ); 357 // umgekehrt rum selektieren, damit EditEngine nicht scrollt 358 ESelection aSel((sal_uInt16)nEndPara, 0xffff,(sal_uInt16)nPara, 0 ); 359 pEditView->SetSelection( aSel ); 360 } 361 else if( rMEvt.GetClicks() == 2 && bHasChilds ) 362 ImpToggleExpand( pPara ); 363 364 aDDStartPosPix = rMEvt.GetPosPixel(); 365 aDDStartPosRef=pEditView->GetWindow()->PixelToLogic( aDDStartPosPix,pOwner->GetRefMapMode()); 366 return sal_True; 367 } 368 369 // special case for outliner view in impress, check if double click hits the page icon for toggle 370 if( (nPara == EE_PARA_NOT_FOUND) && (pOwner->ImplGetOutlinerMode() == OUTLINERMODE_OUTLINEVIEW) && (eTarget == MouseText) && (rMEvt.GetClicks() == 2) ) 371 { 372 ESelection aSel( pEditView->GetSelection() ); 373 nPara = aSel.nStartPara; 374 Paragraph* pPara = pOwner->pParaList->GetParagraph( nPara ); 375 if( (pPara && pOwner->pParaList->HasChilds(pPara)) && pPara->HasFlag(PARAFLAG_ISPAGE) ) 376 { 377 ImpToggleExpand( pPara ); 378 } 379 } 380 return pEditView->MouseButtonDown( rMEvt ); 381 } 382 383 384 sal_Bool __EXPORT OutlinerView::MouseButtonUp( const MouseEvent& rMEvt ) 385 { 386 DBG_CHKTHIS(OutlinerView,0); 387 if ( ( pOwner->ImplGetOutlinerMode() == OUTLINERMODE_TEXTOBJECT ) || pEditView->GetEditEngine()->IsInSelectionMode() ) 388 return pEditView->MouseButtonUp( rMEvt ); 389 390 Point aMousePosWin( pEditView->GetWindow()->PixelToLogic( rMEvt.GetPosPixel() ) ); 391 if( !pEditView->GetOutputArea().IsInside( aMousePosWin ) ) 392 return sal_False; 393 394 Pointer aPointer = GetPointer( rMEvt.GetPosPixel() ); 395 pEditView->GetWindow()->SetPointer( aPointer ); 396 397 return pEditView->MouseButtonUp( rMEvt ); 398 } 399 400 void OutlinerView::ImpHideDDCursor() 401 { 402 DBG_CHKTHIS(OutlinerView,0); 403 if ( bDDCursorVisible ) 404 { 405 bDDCursorVisible = sal_False; 406 ImpPaintDDCursor(); 407 } 408 } 409 410 void OutlinerView::ImpShowDDCursor() 411 { 412 DBG_CHKTHIS(OutlinerView,0); 413 if ( !bDDCursorVisible ) 414 { 415 bDDCursorVisible = sal_True; 416 ImpPaintDDCursor(); 417 } 418 } 419 420 void OutlinerView::ImpPaintDDCursor() 421 { 422 DBG_CHKTHIS(OutlinerView,0); 423 424 Window* pWindow = pEditView->GetWindow(); 425 RasterOp eOldOp = pWindow->GetRasterOp(); 426 pWindow->SetRasterOp( ROP_INVERT ); 427 428 const Color& rOldLineColor = pWindow->GetLineColor(); 429 pWindow->SetLineColor( Color( COL_BLACK ) ); 430 431 Point aStartPointWin, aEndPointWin; 432 Rectangle aOutputArWin = pEditView->GetOutputArea(); 433 Rectangle aVisAreaRef = pEditView->GetVisArea(); 434 435 if( bDDChangingDepth ) 436 { 437 aStartPointWin.X() = pHorTabArrDoc[ nDDCurDepth ]; 438 aStartPointWin.X() += aOutputArWin.Left(); 439 aStartPointWin.Y() = aOutputArWin.Top(); 440 aEndPointWin.X() = aStartPointWin.X(); 441 aEndPointWin.Y() = aOutputArWin.Bottom(); 442 } 443 else 444 { 445 sal_uLong nPara = nDDCurPara; 446 if ( nDDCurPara == LIST_APPEND ) 447 { 448 Paragraph* pTemp = pOwner->pParaList->LastVisible(); 449 nPara = pOwner->pParaList->GetAbsPos( pTemp ); 450 } 451 aStartPointWin = pEditView->GetWindowPosTopLeft((sal_uInt16) nPara ); 452 if ( nDDCurPara == LIST_APPEND ) 453 { 454 long nHeight = pOwner->pEditEngine->GetTextHeight((sal_uInt16)nPara ); 455 aStartPointWin.Y() += nHeight; 456 } 457 aStartPointWin.X() = aOutputArWin.Left(); 458 aEndPointWin.Y() = aStartPointWin.Y(); 459 aEndPointWin.X() = aOutputArWin.Right(); 460 } 461 462 pWindow->DrawLine( aStartPointWin, aEndPointWin ); 463 pWindow->SetLineColor( rOldLineColor ); 464 pWindow->SetRasterOp( eOldOp ); 465 } 466 467 // Berechnet, ueber welchem Absatz eingefuegt werden muss 468 469 sal_uLong OutlinerView::ImpGetInsertionPara( const Point& rPosPixel ) 470 { 471 DBG_CHKTHIS(OutlinerView,0); 472 sal_uLong nCurPara = pEditView->GetParagraph( rPosPixel ); 473 ParagraphList* pParaList = pOwner->pParaList; 474 475 if ( nCurPara == EE_PARA_NOT_FOUND ) 476 nCurPara = LIST_APPEND; 477 else 478 { 479 Point aPosWin = pEditView->GetWindow()->PixelToLogic( rPosPixel ); 480 Point aParaPosWin = pEditView->GetWindowPosTopLeft((sal_uInt16)nCurPara); 481 long nHeightRef = pOwner->pEditEngine->GetTextHeight((sal_uInt16)nCurPara); 482 long nParaYOffs = aPosWin.Y() - aParaPosWin.Y(); 483 484 if ( nParaYOffs > nHeightRef / 2 ) 485 { 486 Paragraph* p = pParaList->GetParagraph( nCurPara ); 487 p = pParaList->NextVisible( p ); 488 nCurPara = p ? pParaList->GetAbsPos( p ) : LIST_APPEND; 489 } 490 } 491 return nCurPara; 492 } 493 494 495 void OutlinerView::ImpToggleExpand( Paragraph* pPara ) 496 { 497 DBG_CHKTHIS(OutlinerView,0); 498 499 sal_uInt16 nPara = (sal_uInt16) pOwner->pParaList->GetAbsPos( pPara ); 500 pEditView->SetSelection( ESelection( nPara, 0, nPara, 0 ) ); 501 ImplExpandOrCollaps( nPara, nPara, !pOwner->pParaList->HasVisibleChilds( pPara ) ); 502 pEditView->ShowCursor(); 503 } 504 505 506 void OutlinerView::SetOutliner( Outliner* pOutliner ) 507 { 508 DBG_CHKTHIS(OutlinerView,0); 509 pOwner = pOutliner; 510 pEditView->SetEditEngine( pOutliner->pEditEngine ); 511 } 512 513 514 515 sal_uLong OutlinerView::Select( Paragraph* pParagraph, sal_Bool bSelect, 516 sal_Bool bWithChilds ) 517 { 518 DBG_CHKTHIS(OutlinerView,0); 519 520 sal_uLong nPara = pOwner->pParaList->GetAbsPos( pParagraph ); 521 sal_uInt16 nEnd = 0; 522 if ( bSelect ) 523 nEnd = 0xffff; 524 525 sal_uLong nChildCount = 0; 526 if ( bWithChilds ) 527 nChildCount = pOwner->pParaList->GetChildCount( pParagraph ); 528 529 ESelection aSel( (sal_uInt16)nPara, 0,(sal_uInt16)(nPara+nChildCount), nEnd ); 530 pEditView->SetSelection( aSel ); 531 return nChildCount+1; 532 } 533 534 535 void OutlinerView::SetAttribs( const SfxItemSet& rAttrs ) 536 { 537 DBG_CHKTHIS(OutlinerView,0); 538 539 sal_Bool bUpdate = pOwner->pEditEngine->GetUpdateMode(); 540 pOwner->pEditEngine->SetUpdateMode( sal_False ); 541 542 if( !pOwner->IsInUndo() && pOwner->IsUndoEnabled() ) 543 pOwner->UndoActionStart( OLUNDO_ATTR ); 544 545 ParaRange aSel = ImpGetSelectedParagraphs( sal_False ); 546 547 pEditView->SetAttribs( rAttrs ); 548 549 // Bullet-Texte aktualisieren 550 for( sal_uInt16 nPara= aSel.nStartPara; nPara <= aSel.nEndPara; nPara++ ) 551 { 552 pOwner->ImplCheckNumBulletItem( nPara ); 553 pOwner->ImplCalcBulletText( nPara, sal_False, sal_False ); 554 555 if( !pOwner->IsInUndo() && pOwner->IsUndoEnabled() ) 556 pOwner->InsertUndo( new OutlinerUndoCheckPara( pOwner, nPara ) ); 557 } 558 559 if( !pOwner->IsInUndo() && pOwner->IsUndoEnabled() ) 560 pOwner->UndoActionEnd( OLUNDO_ATTR ); 561 562 pEditView->SetEditEngineUpdateMode( bUpdate ); 563 } 564 565 ParaRange OutlinerView::ImpGetSelectedParagraphs( sal_Bool bIncludeHiddenChilds ) 566 { 567 DBG_CHKTHIS( OutlinerView, 0 ); 568 569 ESelection aSel = pEditView->GetSelection(); 570 ParaRange aParas( aSel.nStartPara, aSel.nEndPara ); 571 aParas.Adjust(); 572 573 // unsichtbare Childs des letzten Parents in Selektion mit aufnehmen 574 if ( bIncludeHiddenChilds ) 575 { 576 Paragraph* pLast = pOwner->pParaList->GetParagraph( aParas.nEndPara ); 577 if ( pOwner->pParaList->HasHiddenChilds( pLast ) ) 578 aParas.nEndPara = 579 sal::static_int_cast< sal_uInt16 >( 580 aParas.nEndPara + 581 pOwner->pParaList->GetChildCount( pLast ) ); 582 } 583 return aParas; 584 } 585 586 // MT: Name sollte mal geaendert werden! 587 void OutlinerView::AdjustDepth( short nDX ) 588 { 589 Indent( nDX ); 590 } 591 592 void OutlinerView::Indent( short nDiff ) 593 { 594 DBG_CHKTHIS( OutlinerView, 0 ); 595 596 if( !nDiff || ( ( nDiff > 0 ) && ImpCalcSelectedPages( sal_True ) && !pOwner->ImpCanIndentSelectedPages( this ) ) ) 597 return; 598 599 const bool bOutlinerView = pOwner->pEditEngine->GetControlWord() & EE_CNTRL_OUTLINER; 600 sal_Bool bUpdate = pOwner->pEditEngine->GetUpdateMode(); 601 pOwner->pEditEngine->SetUpdateMode( sal_False ); 602 603 sal_Bool bUndo = !pOwner->IsInUndo() && pOwner->IsUndoEnabled(); 604 605 if( bUndo ) 606 pOwner->UndoActionStart( OLUNDO_DEPTH ); 607 608 sal_Int16 nMinDepth = -1; // Optimierung: Nicht unnoetig viele Absatze neu berechnen 609 610 ParaRange aSel = ImpGetSelectedParagraphs( sal_True ); 611 for ( sal_uInt16 nPara = aSel.nStartPara; nPara <= aSel.nEndPara; nPara++ ) 612 { 613 Paragraph* pPara = pOwner->pParaList->GetParagraph( nPara ); 614 615 sal_Int16 nOldDepth = pPara->GetDepth(); 616 sal_Int16 nNewDepth = nOldDepth + nDiff; 617 618 if( bOutlinerView && nPara ) 619 { 620 const bool bPage = pPara->HasFlag(PARAFLAG_ISPAGE); 621 if( (bPage && (nDiff == +1)) || (!bPage && (nDiff == -1) && (nOldDepth <= 0)) ) 622 { 623 // App benachrichtigen 624 pOwner->nDepthChangedHdlPrevDepth = (sal_Int16)nOldDepth; 625 pOwner->mnDepthChangeHdlPrevFlags = pPara->nFlags; 626 pOwner->pHdlParagraph = pPara; 627 628 if( bPage ) 629 pPara->RemoveFlag( PARAFLAG_ISPAGE ); 630 else 631 pPara->SetFlag( PARAFLAG_ISPAGE ); 632 633 pOwner->DepthChangedHdl(); 634 pOwner->pEditEngine->QuickMarkInvalid( ESelection( nPara, 0, nPara, 0 ) ); 635 636 if( bUndo ) 637 pOwner->InsertUndo( new OutlinerUndoChangeParaFlags( pOwner, nPara, pOwner->mnDepthChangeHdlPrevFlags, pPara->nFlags ) ); 638 639 continue; 640 } 641 } 642 643 // do not switch off numeration with tab 644 if( (nOldDepth == 0) && (nNewDepth == -1) ) 645 continue; 646 647 // do not indent if there is no numeration enabled 648 if( nOldDepth == -1 ) 649 continue; 650 651 if ( nNewDepth < pOwner->nMinDepth ) 652 nNewDepth = pOwner->nMinDepth; 653 if ( nNewDepth > pOwner->nMaxDepth ) 654 nNewDepth = pOwner->nMaxDepth; 655 656 if( nOldDepth < nMinDepth ) 657 nMinDepth = nOldDepth; 658 if( nNewDepth < nMinDepth ) 659 nMinDepth = nNewDepth; 660 661 if( nOldDepth != nNewDepth ) 662 { 663 if ( ( nPara == aSel.nStartPara ) && aSel.nStartPara && ( pOwner->ImplGetOutlinerMode() != OUTLINERMODE_TEXTOBJECT )) 664 { 665 // Sonderfall: Der Vorgaenger eines eingerueckten Absatzes ist 666 // unsichtbar und steht jetzt auf der gleichen Ebene wie der 667 // sichtbare Absatz. In diesem Fall wird der naechste sichtbare 668 // Absatz gesucht und aufgeplustert. 669 #ifdef DBG_UTIL 670 Paragraph* _pPara = pOwner->pParaList->GetParagraph( aSel.nStartPara ); 671 DBG_ASSERT(_pPara->IsVisible(),"Selected Paragraph invisible ?!"); 672 #endif 673 Paragraph* pPrev= pOwner->pParaList->GetParagraph( aSel.nStartPara-1 ); 674 675 if( !pPrev->IsVisible() && ( pPrev->GetDepth() == nNewDepth ) ) 676 { 677 // Vorgaenger ist eingeklappt und steht auf gleicher Ebene 678 // => naechsten sichtbaren Absatz suchen und expandieren 679 pPrev = pOwner->pParaList->GetParent( pPrev ); 680 while( !pPrev->IsVisible() ) 681 pPrev = pOwner->pParaList->GetParent( pPrev ); 682 683 pOwner->Expand( pPrev ); 684 pOwner->InvalidateBullet( pPrev, pOwner->pParaList->GetAbsPos( pPrev ) ); 685 } 686 } 687 688 pOwner->nDepthChangedHdlPrevDepth = (sal_Int16)nOldDepth; 689 pOwner->mnDepthChangeHdlPrevFlags = pPara->nFlags; 690 pOwner->pHdlParagraph = pPara; 691 692 pOwner->ImplInitDepth( nPara, nNewDepth, sal_True, sal_False ); 693 pOwner->ImplCalcBulletText( nPara, sal_False, sal_False ); 694 695 if ( pOwner->ImplGetOutlinerMode() == OUTLINERMODE_OUTLINEOBJECT ) 696 pOwner->ImplSetLevelDependendStyleSheet( nPara ); 697 698 // App benachrichtigen 699 pOwner->DepthChangedHdl(); 700 } 701 else 702 { 703 // Needs at least a repaint... 704 pOwner->pEditEngine->QuickMarkInvalid( ESelection( nPara, 0, nPara, 0 ) ); 705 } 706 } 707 708 // MT 19.08.99: War mal fuer Optimierung (outliner.cxx#1.193), 709 // hat aber zu zuviel Wartungsaufwand / doppelten Funktionen gefuehrt 710 // und zu wenig gebracht: 711 // pOwner->ImpSetBulletTextsFrom( aSel.nStartPara+1, nMinDepth ); 712 // Wird jetzt direkt in Schleife mit ImplCalcBulletText() erledigt. 713 // Jetzt fehlen nur noch die folgenden Ansaetze, die davon betroffen sind. 714 sal_uInt16 nParas = (sal_uInt16)pOwner->pParaList->GetParagraphCount(); 715 for ( sal_uInt16 n = aSel.nEndPara+1; n < nParas; n++ ) 716 { 717 Paragraph* pPara = pOwner->pParaList->GetParagraph( n ); 718 if ( pPara->GetDepth() < nMinDepth ) 719 break; 720 pOwner->ImplCalcBulletText( n, sal_False, sal_False ); 721 } 722 723 if ( bUpdate ) 724 { 725 pEditView->SetEditEngineUpdateMode( sal_True ); 726 pEditView->ShowCursor(); 727 } 728 729 if( bUndo ) 730 pOwner->UndoActionEnd( OLUNDO_DEPTH ); 731 } 732 733 sal_Bool OutlinerView::AdjustHeight( long nDY ) 734 { 735 DBG_CHKTHIS(OutlinerView,0); 736 pEditView->MoveParagraphs( nDY ); 737 return sal_True; // remove return value... 738 } 739 740 void OutlinerView::AdjustDepth( Paragraph* pPara, short nDX, sal_Bool bWithChilds) 741 { 742 DBG_CHKTHIS(OutlinerView,0); 743 sal_uLong nStartPara = pOwner->pParaList->GetAbsPos( pPara ); 744 sal_uLong nEndPara = nStartPara; 745 if ( bWithChilds ) 746 nEndPara += pOwner->pParaList->GetChildCount( pPara ); 747 ESelection aSel((sal_uInt16)nStartPara, 0,(sal_uInt16)nEndPara, 0xffff ); 748 pEditView->SetSelection( aSel ); 749 AdjustDepth( nDX ); 750 } 751 752 void OutlinerView::AdjustHeight( Paragraph* pPara, long nDY, sal_Bool bWithChilds ) 753 { 754 DBG_CHKTHIS(OutlinerView,0); 755 sal_uLong nStartPara = pOwner->pParaList->GetAbsPos( pPara ); 756 sal_uLong nEndPara = nStartPara; 757 if ( bWithChilds ) 758 nEndPara += pOwner->pParaList->GetChildCount( pPara ); 759 ESelection aSel( (sal_uInt16)nStartPara, 0, (sal_uInt16)nEndPara, 0xffff ); 760 pEditView->SetSelection( aSel ); 761 AdjustHeight( nDY ); 762 } 763 764 765 Rectangle OutlinerView::GetVisArea() const 766 { 767 DBG_CHKTHIS(OutlinerView,0); 768 return pEditView->GetVisArea(); 769 } 770 771 772 Point OutlinerView::ImpGetDocPos( const Point& rPosPixel ) 773 { 774 DBG_CHKTHIS(OutlinerView,0); 775 Rectangle aOutArWin = GetOutputArea(); 776 // Position in der OutputArea berechnen 777 Point aCurPosDoc( rPosPixel ); 778 aCurPosDoc = pEditView->GetWindow()->PixelToLogic( aCurPosDoc ); 779 aCurPosDoc -= aOutArWin.TopLeft(); 780 aCurPosDoc += pEditView->GetVisArea().TopLeft(); 781 return aCurPosDoc; 782 } 783 784 // MT 05/00: Wofuer dies ImpXXXScroll, sollte das nicht die EditEngine machen??? 785 786 void OutlinerView::ImpDragScroll( const Point& rPosPix ) 787 { 788 DBG_CHKTHIS(OutlinerView,0); 789 Point aPosWin = pEditView->GetWindow()->PixelToLogic( rPosPix ); 790 Rectangle aOutputArWin = pEditView->GetOutputArea(); 791 if ( aPosWin.X() <= aOutputArWin.Left() + nDDScrollLRBorderWidthWin) 792 ImpScrollLeft(); 793 else if( aPosWin.X() >= aOutputArWin.Right()- nDDScrollLRBorderWidthWin) 794 ImpScrollRight(); 795 else if( aPosWin.Y() <= aOutputArWin.Top() + nDDScrollTBBorderWidthWin) 796 ImpScrollUp(); 797 else if(aPosWin.Y() >= aOutputArWin.Bottom() - nDDScrollTBBorderWidthWin) 798 ImpScrollDown(); 799 } 800 801 802 void OutlinerView::ImpScrollLeft() 803 { 804 DBG_CHKTHIS(OutlinerView,0); 805 Rectangle aVisArea( pEditView->GetVisArea() ); 806 long nMaxScrollOffs = aVisArea.Left(); 807 if ( !nMaxScrollOffs ) 808 return; 809 long nScrollOffsRef = (aVisArea.GetWidth() * OL_SCROLL_HOROFFSET) / 100; 810 if ( !nScrollOffsRef ) 811 nScrollOffsRef = 1; 812 if ( nScrollOffsRef > nMaxScrollOffs ) 813 nScrollOffsRef = nMaxScrollOffs; 814 815 ImpHideDDCursor(); 816 Scroll( -nScrollOffsRef, 0 ); 817 818 EditStatus aScrollStat; 819 aScrollStat.GetStatusWord() = EE_STAT_HSCROLL; 820 pOwner->pEditEngine->GetStatusEventHdl().Call( &aScrollStat ); 821 } 822 823 824 void OutlinerView::ImpScrollRight() 825 { 826 DBG_CHKTHIS(OutlinerView,0); 827 Rectangle aVisArea( pEditView->GetVisArea() ); 828 long nMaxScrollOffs = pOwner->pEditEngine->GetPaperSize().Width() - 829 aVisArea.Right(); 830 if ( !nMaxScrollOffs ) 831 return; 832 long nScrollOffsRef = (aVisArea.GetWidth() * OL_SCROLL_HOROFFSET) / 100; 833 if ( !nScrollOffsRef ) 834 nScrollOffsRef = 1; 835 if ( nScrollOffsRef > nMaxScrollOffs ) 836 nScrollOffsRef = nMaxScrollOffs; 837 838 ImpHideDDCursor(); 839 Scroll( nScrollOffsRef, 0 ); 840 841 EditStatus aScrollStat; 842 aScrollStat.GetStatusWord() = EE_STAT_HSCROLL; 843 pOwner->pEditEngine->GetStatusEventHdl().Call( &aScrollStat ); 844 } 845 846 847 void OutlinerView::ImpScrollDown() 848 { 849 DBG_CHKTHIS(OutlinerView,0); 850 Rectangle aVisArea( pEditView->GetVisArea() ); 851 Size aDocSize( 0, (long)pOwner->pEditEngine->GetTextHeight() ); 852 853 long nMaxScrollOffs = aDocSize.Height(); 854 nMaxScrollOffs -= aVisArea.Top(); 855 nMaxScrollOffs -= aVisArea.GetHeight(); 856 if ( !nMaxScrollOffs ) 857 return; 858 859 long nScrollOffsRef = (aVisArea.GetHeight() * OL_SCROLL_VEROFFSET) / 100; 860 861 if ( nScrollOffsRef > nMaxScrollOffs ) 862 nScrollOffsRef = nMaxScrollOffs; 863 if ( !nScrollOffsRef ) 864 nScrollOffsRef = 1; 865 866 ImpHideDDCursor(); 867 Scroll( 0, -nScrollOffsRef ); 868 869 EditStatus aScrollStat; 870 aScrollStat.GetStatusWord() = EE_STAT_VSCROLL; 871 pOwner->pEditEngine->GetStatusEventHdl().Call( &aScrollStat ); 872 } 873 874 875 void OutlinerView::ImpScrollUp() 876 { 877 DBG_CHKTHIS(OutlinerView,0); 878 Rectangle aVisArea( pEditView->GetVisArea() ); 879 long nMaxScrollOffs = aVisArea.Top(); 880 if ( !nMaxScrollOffs ) 881 return; 882 long nScrollOffsRef = (aVisArea.GetHeight() * OL_SCROLL_VEROFFSET) / 100; 883 884 885 if ( nScrollOffsRef > nMaxScrollOffs ) 886 nScrollOffsRef = nMaxScrollOffs; 887 if ( !nScrollOffsRef ) 888 nScrollOffsRef = 1; 889 890 ImpHideDDCursor(); 891 Scroll( 0, nScrollOffsRef ); 892 893 EditStatus aScrollStat; 894 aScrollStat.GetStatusWord() = EE_STAT_VSCROLL; 895 pOwner->pEditEngine->GetStatusEventHdl().Call( &aScrollStat ); 896 } 897 898 899 void OutlinerView::Expand() 900 { 901 DBG_CHKTHIS( OutlinerView, 0 ); 902 ParaRange aParas = ImpGetSelectedParagraphs( sal_False ); 903 ImplExpandOrCollaps( aParas.nStartPara, aParas.nEndPara, sal_True ); 904 } 905 906 907 void OutlinerView::Collapse() 908 { 909 DBG_CHKTHIS( OutlinerView, 0 ); 910 ParaRange aParas = ImpGetSelectedParagraphs( sal_False ); 911 ImplExpandOrCollaps( aParas.nStartPara, aParas.nEndPara, sal_False ); 912 } 913 914 915 void OutlinerView::ExpandAll() 916 { 917 DBG_CHKTHIS( OutlinerView, 0 ); 918 ImplExpandOrCollaps( 0, (sal_uInt16)(pOwner->pParaList->GetParagraphCount()-1), sal_True ); 919 } 920 921 922 void OutlinerView::CollapseAll() 923 { 924 DBG_CHKTHIS(OutlinerView,0); 925 ImplExpandOrCollaps( 0, (sal_uInt16)(pOwner->pParaList->GetParagraphCount()-1), sal_False ); 926 } 927 928 void OutlinerView::ImplExpandOrCollaps( sal_uInt16 nStartPara, sal_uInt16 nEndPara, sal_Bool bExpand ) 929 { 930 DBG_CHKTHIS( OutlinerView, 0 ); 931 932 sal_Bool bUpdate = pOwner->GetUpdateMode(); 933 pOwner->SetUpdateMode( sal_False ); 934 935 sal_Bool bUndo = !pOwner->IsInUndo() && pOwner->IsUndoEnabled(); 936 if( bUndo ) 937 pOwner->UndoActionStart( bExpand ? OLUNDO_EXPAND : OLUNDO_COLLAPSE ); 938 939 for ( sal_uInt16 nPara = nStartPara; nPara <= nEndPara; nPara++ ) 940 { 941 Paragraph* pPara = pOwner->pParaList->GetParagraph( nPara ); 942 sal_Bool bDone = bExpand ? pOwner->Expand( pPara ) : pOwner->Collapse( pPara ); 943 if( bDone ) 944 { 945 // Der Strich unter dem Absatz muss verschwinden... 946 pOwner->pEditEngine->QuickMarkToBeRepainted( nPara ); 947 } 948 } 949 950 if( bUndo ) 951 pOwner->UndoActionEnd( bExpand ? OLUNDO_EXPAND : OLUNDO_COLLAPSE ); 952 953 if ( bUpdate ) 954 { 955 pOwner->SetUpdateMode( sal_True ); 956 pEditView->ShowCursor(); 957 } 958 } 959 960 961 void OutlinerView::Expand( Paragraph* pPara) 962 { 963 DBG_CHKTHIS(OutlinerView,0); 964 pOwner->Expand( pPara ); 965 } 966 967 968 void OutlinerView::Collapse( Paragraph* pPara) 969 { 970 DBG_CHKTHIS(OutlinerView,0); 971 pOwner->Collapse( pPara ); 972 } 973 974 void OutlinerView::InsertText( const OutlinerParaObject& rParaObj ) 975 { 976 // MT: Wie Paste, nur EditView::Insert, statt EditView::Paste. 977 // Eigentlich nicht ganz richtig, das evtl. Einrueckungen 978 // korrigiert werden muessen, aber das kommt spaeter durch ein 979 // allgemeingueltiges Import. 980 // Dann wird im Inserted gleich ermittelt, was f�r eine Einrueckebene 981 // Moegliche Struktur: 982 // pImportInfo mit DestPara, DestPos, nFormat, pParaObj... 983 // Evtl. Problematisch: 984 // EditEngine, RTF => Absplittung des Bereichs, spaeter 985 // zusammenfuehrung 986 987 DBG_CHKTHIS(OutlinerView,0); 988 989 if ( ImpCalcSelectedPages( sal_False ) && !pOwner->ImpCanDeleteSelectedPages( this ) ) 990 return; 991 992 pOwner->UndoActionStart( OLUNDO_INSERT ); 993 994 pOwner->pEditEngine->SetUpdateMode( sal_False ); 995 sal_uLong nStart, nParaCount; 996 nParaCount = pOwner->pEditEngine->GetParagraphCount(); 997 sal_uInt16 nSize = ImpInitPaste( nStart ); 998 pEditView->InsertText( rParaObj.GetTextObject() ); 999 ImpPasted( nStart, nParaCount, nSize); 1000 pEditView->SetEditEngineUpdateMode( sal_True ); 1001 1002 pOwner->UndoActionEnd( OLUNDO_INSERT ); 1003 1004 pEditView->ShowCursor( sal_True, sal_True ); 1005 } 1006 1007 1008 1009 void OutlinerView::Cut() 1010 { 1011 DBG_CHKTHIS(OutlinerView,0); 1012 if ( !ImpCalcSelectedPages( sal_False ) || pOwner->ImpCanDeleteSelectedPages( this ) ) 1013 pEditView->Cut(); 1014 } 1015 1016 void OutlinerView::Paste() 1017 { 1018 DBG_CHKTHIS(OutlinerView,0); 1019 PasteSpecial(); // HACK(SD ruft nicht PasteSpecial auf) 1020 } 1021 1022 void OutlinerView::PasteSpecial() 1023 { 1024 DBG_CHKTHIS(OutlinerView,0); 1025 if ( !ImpCalcSelectedPages( sal_False ) || pOwner->ImpCanDeleteSelectedPages( this ) ) 1026 { 1027 pOwner->UndoActionStart( OLUNDO_INSERT ); 1028 1029 pOwner->pEditEngine->SetUpdateMode( sal_False ); 1030 pOwner->bPasting = sal_True; 1031 pEditView->PasteSpecial(); 1032 1033 if ( pOwner->ImplGetOutlinerMode() == OUTLINERMODE_OUTLINEOBJECT ) 1034 { 1035 const sal_uInt16 nParaCount = pOwner->pEditEngine->GetParagraphCount(); 1036 1037 for( sal_uInt16 nPara = 0; nPara < nParaCount; nPara++ ) 1038 pOwner->ImplSetLevelDependendStyleSheet( nPara ); 1039 } 1040 1041 pEditView->SetEditEngineUpdateMode( sal_True ); 1042 pOwner->UndoActionEnd( OLUNDO_INSERT ); 1043 pEditView->ShowCursor( sal_True, sal_True ); 1044 } 1045 } 1046 1047 List* OutlinerView::CreateSelectionList() 1048 { 1049 DBG_CHKTHIS( OutlinerView, 0 ); 1050 1051 ParaRange aParas = ImpGetSelectedParagraphs( sal_True ); 1052 List* pSelList = new List; 1053 for ( sal_uInt16 nPara = aParas.nStartPara; nPara <= aParas.nEndPara; nPara++ ) 1054 { 1055 Paragraph* pPara = pOwner->pParaList->GetParagraph( nPara ); 1056 pSelList->Insert( pPara, LIST_APPEND ); 1057 } 1058 return pSelList; 1059 } 1060 1061 SfxStyleSheet* OutlinerView::GetStyleSheet() const 1062 { 1063 DBG_CHKTHIS(OutlinerView,0); 1064 return pEditView->GetStyleSheet(); 1065 } 1066 1067 void OutlinerView::SetStyleSheet( SfxStyleSheet* pStyle ) 1068 { 1069 DBG_CHKTHIS(OutlinerView,0); 1070 pEditView->SetStyleSheet( pStyle ); 1071 1072 ParaRange aSel = ImpGetSelectedParagraphs( sal_True ); 1073 for( sal_uInt16 nPara = aSel.nStartPara; nPara <= aSel.nEndPara; nPara++ ) 1074 { 1075 pOwner->ImplCheckNumBulletItem( nPara ); 1076 pOwner->ImplCalcBulletText( nPara, sal_False, sal_False ); 1077 } 1078 } 1079 1080 Pointer OutlinerView::GetPointer( const Point& rPosPixel ) 1081 { 1082 DBG_CHKTHIS(OutlinerView,0); 1083 1084 MouseTarget eTarget; 1085 ImpCheckMousePos( rPosPixel, eTarget ); 1086 1087 PointerStyle ePointerStyle = POINTER_ARROW; 1088 if ( eTarget == MouseText ) 1089 { 1090 ePointerStyle = GetOutliner()->IsVertical() ? POINTER_TEXT_VERTICAL : POINTER_TEXT; 1091 } 1092 else if ( eTarget == MouseHypertext ) 1093 { 1094 ePointerStyle = POINTER_REFHAND; 1095 } 1096 else if ( eTarget == MouseBullet ) 1097 { 1098 ePointerStyle = POINTER_MOVE; 1099 } 1100 1101 return Pointer( ePointerStyle ); 1102 } 1103 1104 1105 sal_uInt16 OutlinerView::ImpInitPaste( sal_uLong& rStart ) 1106 { 1107 DBG_CHKTHIS(OutlinerView,0); 1108 pOwner->bPasting = sal_True; 1109 ESelection aSelection( pEditView->GetSelection() ); 1110 aSelection.Adjust(); 1111 rStart = aSelection.nStartPara; 1112 sal_uInt16 nSize = aSelection.nEndPara - aSelection.nStartPara + 1; 1113 return nSize; 1114 } 1115 1116 1117 void OutlinerView::ImpPasted( sal_uLong nStart, sal_uLong nPrevParaCount, sal_uInt16 nSize) 1118 { 1119 DBG_CHKTHIS(OutlinerView,0); 1120 pOwner->bPasting = sal_False; 1121 sal_uLong nCurParaCount = (sal_uLong)pOwner->pEditEngine->GetParagraphCount(); 1122 if( nCurParaCount < nPrevParaCount ) 1123 nSize = sal::static_int_cast< sal_uInt16 >( 1124 nSize - ( nPrevParaCount - nCurParaCount ) ); 1125 else 1126 nSize = sal::static_int_cast< sal_uInt16 >( 1127 nSize + ( nCurParaCount - nPrevParaCount ) ); 1128 pOwner->ImpTextPasted( nStart, nSize ); 1129 } 1130 1131 1132 void OutlinerView::Command( const CommandEvent& rCEvt ) 1133 { 1134 DBG_CHKTHIS(OutlinerView,0); 1135 pEditView->Command( rCEvt ); 1136 } 1137 1138 1139 void OutlinerView::SelectRange( sal_uLong nFirst, sal_uInt16 nCount ) 1140 { 1141 DBG_CHKTHIS(OutlinerView,0); 1142 sal_uLong nLast = nFirst+nCount; 1143 nCount = (sal_uInt16)pOwner->pParaList->GetParagraphCount(); 1144 if( nLast <= nCount ) 1145 nLast = nCount - 1; 1146 ESelection aSel( (sal_uInt16)nFirst, 0, (sal_uInt16)nLast, 0xffff ); 1147 pEditView->SetSelection( aSel ); 1148 } 1149 1150 1151 sal_uInt16 OutlinerView::ImpCalcSelectedPages( sal_Bool bIncludeFirstSelected ) 1152 { 1153 DBG_CHKTHIS(OutlinerView,0); 1154 1155 ESelection aSel( pEditView->GetSelection() ); 1156 aSel.Adjust(); 1157 1158 sal_uInt16 nPages = 0; 1159 sal_uInt16 nFirstPage = 0xFFFF; 1160 sal_uInt16 nStartPara = aSel.nStartPara; 1161 if ( !bIncludeFirstSelected ) 1162 nStartPara++; // alle nach StartPara kommenden Absaetze werden geloescht 1163 for ( sal_uInt16 nPara = nStartPara; nPara <= aSel.nEndPara; nPara++ ) 1164 { 1165 Paragraph* pPara = pOwner->pParaList->GetParagraph( nPara ); 1166 DBG_ASSERT(pPara, "ImpCalcSelectedPages: ungueltige Selection? "); 1167 if( pPara->HasFlag(PARAFLAG_ISPAGE) ) 1168 { 1169 nPages++; 1170 if( nFirstPage == 0xFFFF ) 1171 nFirstPage = nPara; 1172 } 1173 } 1174 1175 if( nPages ) 1176 { 1177 pOwner->nDepthChangedHdlPrevDepth = nPages; 1178 pOwner->pHdlParagraph = 0; 1179 pOwner->mnFirstSelPage = nFirstPage; 1180 } 1181 1182 return nPages; 1183 } 1184 1185 1186 void OutlinerView::ToggleBullets() 1187 { 1188 pOwner->UndoActionStart( OLUNDO_DEPTH ); 1189 1190 ESelection aSel( pEditView->GetSelection() ); 1191 aSel.Adjust(); 1192 1193 const bool bUpdate = pOwner->pEditEngine->GetUpdateMode(); 1194 pOwner->pEditEngine->SetUpdateMode( sal_False ); 1195 1196 sal_Int16 nNewDepth = -2; 1197 const SvxNumRule* pDefaultBulletNumRule = 0; 1198 1199 for ( sal_uInt16 nPara = aSel.nStartPara; nPara <= aSel.nEndPara; nPara++ ) 1200 { 1201 Paragraph* pPara = pOwner->pParaList->GetParagraph( nPara ); 1202 DBG_ASSERT(pPara, "OutlinerView::ToggleBullets(), illegal selection?"); 1203 1204 if( pPara ) 1205 { 1206 if( nNewDepth == -2 ) 1207 { 1208 nNewDepth = (pOwner->GetDepth(nPara) == -1) ? 0 : -1; 1209 if ( nNewDepth == 0 ) 1210 { 1211 // determine default numbering rule for bullets 1212 const ESelection aSelection(nPara, 0); 1213 const SfxItemSet aTmpSet(pOwner->pEditEngine->GetAttribs(aSelection)); 1214 const SfxPoolItem& rPoolItem = aTmpSet.GetPool()->GetDefaultItem( EE_PARA_NUMBULLET ); 1215 const SvxNumBulletItem* pNumBulletItem = dynamic_cast< const SvxNumBulletItem* >(&rPoolItem); 1216 pDefaultBulletNumRule = pNumBulletItem ? pNumBulletItem->GetNumRule() : 0; 1217 } 1218 } 1219 1220 pOwner->SetDepth( pPara, nNewDepth ); 1221 1222 if( nNewDepth == -1 ) 1223 { 1224 const SfxItemSet& rAttrs = pOwner->GetParaAttribs( nPara ); 1225 if ( rAttrs.GetItemState( EE_PARA_BULLETSTATE ) == SFX_ITEM_SET ) 1226 { 1227 SfxItemSet aAttrs(rAttrs); 1228 aAttrs.ClearItem( EE_PARA_BULLETSTATE ); 1229 pOwner->SetParaAttribs( nPara, aAttrs ); 1230 } 1231 } 1232 else 1233 { 1234 if ( pDefaultBulletNumRule ) 1235 { 1236 const SvxNumberFormat* pFmt = pOwner ->GetNumberFormat( nPara ); 1237 if ( !pFmt 1238 || ( pFmt->GetNumberingType() != SVX_NUM_BITMAP 1239 && pFmt->GetNumberingType() != SVX_NUM_CHAR_SPECIAL ) ) 1240 { 1241 SfxItemSet aAttrs( pOwner->GetParaAttribs( nPara ) ); 1242 SvxNumRule aNewNumRule( *pDefaultBulletNumRule ); 1243 aAttrs.Put( SvxNumBulletItem( aNewNumRule ), EE_PARA_NUMBULLET ); 1244 pOwner->SetParaAttribs( nPara, aAttrs ); 1245 } 1246 } 1247 } 1248 } 1249 } 1250 1251 const sal_uInt16 nParaCount = (sal_uInt16) (pOwner->pParaList->GetParagraphCount()); 1252 pOwner->ImplCheckParagraphs( aSel.nStartPara, nParaCount ); 1253 pOwner->pEditEngine->QuickMarkInvalid( ESelection( aSel.nStartPara, 0, nParaCount, 0 ) ); 1254 1255 pOwner->pEditEngine->SetUpdateMode( bUpdate ); 1256 1257 pOwner->UndoActionEnd( OLUNDO_DEPTH ); 1258 } 1259 1260 1261 void OutlinerView::ToggleBulletsNumbering( 1262 const bool bToggle, 1263 const bool bHandleBullets, 1264 const SvxNumRule* pNumRule ) 1265 { 1266 ESelection aSel( pEditView->GetSelection() ); 1267 aSel.Adjust(); 1268 1269 bool bToggleOn = true; 1270 if ( bToggle ) 1271 { 1272 bToggleOn = false; 1273 const sal_Int16 nBulletNumberingStatus( pOwner->GetBulletsNumberingStatus( aSel.nStartPara, aSel.nEndPara ) ); 1274 if ( nBulletNumberingStatus != 0 && bHandleBullets ) 1275 { 1276 // not all paragraphs have bullets and method called to toggle bullets --> bullets on 1277 bToggleOn = true; 1278 } 1279 else if ( nBulletNumberingStatus != 1 && !bHandleBullets ) 1280 { 1281 // not all paragraphs have numbering and method called to toggle numberings --> numberings on 1282 bToggleOn = true; 1283 } 1284 } 1285 if ( bToggleOn ) 1286 { 1287 // apply bullets/numbering for selected paragraphs 1288 ApplyBulletsNumbering( bHandleBullets, pNumRule, bToggle, true ); 1289 } 1290 else 1291 { 1292 // switch off bullets/numbering for selected paragraphs 1293 SwitchOffBulletsNumbering( true ); 1294 } 1295 1296 return; 1297 } 1298 1299 1300 void OutlinerView::EnableBullets() 1301 { 1302 pOwner->UndoActionStart( OLUNDO_DEPTH ); 1303 1304 ESelection aSel( pEditView->GetSelection() ); 1305 aSel.Adjust(); 1306 1307 const bool bUpdate = pOwner->pEditEngine->GetUpdateMode(); 1308 pOwner->pEditEngine->SetUpdateMode( sal_False ); 1309 1310 for ( sal_uInt16 nPara = aSel.nStartPara; nPara <= aSel.nEndPara; nPara++ ) 1311 { 1312 Paragraph* pPara = pOwner->pParaList->GetParagraph( nPara ); 1313 DBG_ASSERT(pPara, "OutlinerView::EnableBullets(), illegal selection?"); 1314 1315 if( pPara && (pOwner->GetDepth(nPara) == -1) ) 1316 { 1317 pOwner->SetDepth( pPara, 0 ); 1318 } 1319 } 1320 1321 sal_uInt16 nParaCount = (sal_uInt16) (pOwner->pParaList->GetParagraphCount()); 1322 pOwner->ImplCheckParagraphs( aSel.nStartPara, nParaCount ); 1323 pOwner->pEditEngine->QuickMarkInvalid( ESelection( aSel.nStartPara, 0, nParaCount, 0 ) ); 1324 1325 pOwner->pEditEngine->SetUpdateMode( bUpdate ); 1326 1327 pOwner->UndoActionEnd( OLUNDO_DEPTH ); 1328 } 1329 1330 1331 void OutlinerView::ApplyBulletsNumbering( 1332 const bool bHandleBullets, 1333 const SvxNumRule* pNewNumRule, 1334 const bool bCheckCurrentNumRuleBeforeApplyingNewNumRule, 1335 const bool bAtSelection ) 1336 { 1337 if (!pOwner || !pOwner->pEditEngine || !pOwner->pParaList) 1338 { 1339 return; 1340 } 1341 1342 pOwner->UndoActionStart(OLUNDO_DEPTH); 1343 const sal_Bool bUpdate = pOwner->pEditEngine->GetUpdateMode(); 1344 pOwner->pEditEngine->SetUpdateMode(sal_False); 1345 1346 sal_uInt16 nStartPara = 0; 1347 sal_uInt16 nEndPara = 0; 1348 if ( bAtSelection ) 1349 { 1350 ESelection aSel( pEditView->GetSelection() ); 1351 aSel.Adjust(); 1352 nStartPara = aSel.nStartPara; 1353 nEndPara = aSel.nEndPara; 1354 } 1355 else 1356 { 1357 nStartPara = 0; 1358 nEndPara = pOwner->pParaList->GetParagraphCount() - 1; 1359 } 1360 1361 for (sal_uInt16 nPara = nStartPara; nPara <= nEndPara; nPara++) 1362 { 1363 Paragraph* pPara = pOwner->pParaList->GetParagraph(nPara); 1364 DBG_ASSERT(pPara, "OutlinerView::ApplyBulletsNumbering(..), illegal selection?"); 1365 1366 if (pPara) 1367 { 1368 const sal_Int16 nDepth = pOwner->GetDepth(nPara); 1369 if ( nDepth == -1 ) 1370 { 1371 pOwner->SetDepth( pPara, 0 ); 1372 } 1373 1374 const SfxItemSet& rAttrs = pOwner->GetParaAttribs(nPara); 1375 SfxItemSet aAttrs(rAttrs); 1376 aAttrs.Put(SfxBoolItem(EE_PARA_BULLETSTATE, true)); 1377 1378 // apply new numbering rule 1379 if ( pNewNumRule ) 1380 { 1381 bool bApplyNumRule = false; 1382 if ( !bCheckCurrentNumRuleBeforeApplyingNewNumRule ) 1383 { 1384 bApplyNumRule = true; 1385 } 1386 else 1387 { 1388 const SvxNumberFormat* pFmt = pOwner ->GetNumberFormat(nPara); 1389 if (!pFmt) 1390 { 1391 bApplyNumRule = true; 1392 } 1393 else 1394 { 1395 sal_Int16 nNumType = pFmt->GetNumberingType(); 1396 if ( bHandleBullets 1397 && nNumType != SVX_NUM_BITMAP && nNumType != SVX_NUM_CHAR_SPECIAL) 1398 { 1399 // Set to Normal bullet, old bullet type is Numbering bullet. 1400 bApplyNumRule = true; 1401 } 1402 else if ( !bHandleBullets 1403 && (nNumType == SVX_NUM_BITMAP || nNumType == SVX_NUM_CHAR_SPECIAL)) 1404 { 1405 // Set to Numbering bullet, old bullet type is Normal bullet. 1406 bApplyNumRule = true; 1407 } 1408 } 1409 } 1410 1411 if ( bApplyNumRule ) 1412 { 1413 SvxNumRule aNewRule(*pNewNumRule); 1414 1415 // Get old bullet space. 1416 { 1417 const SfxPoolItem* pPoolItem=NULL; 1418 SfxItemState eState = rAttrs.GetItemState(EE_PARA_NUMBULLET, sal_False, &pPoolItem); 1419 if (eState != SFX_ITEM_SET) 1420 { 1421 // Use default value when has not contain bullet item. 1422 ESelection aSelection(nPara, 0); 1423 SfxItemSet aTmpSet(pOwner->pEditEngine->GetAttribs(aSelection)); 1424 pPoolItem = aTmpSet.GetItem(EE_PARA_NUMBULLET); 1425 } 1426 1427 const SvxNumBulletItem* pNumBulletItem = dynamic_cast< const SvxNumBulletItem* >(pPoolItem); 1428 if (pNumBulletItem) 1429 { 1430 const sal_uInt16 nLevelCnt = Min(pNumBulletItem->GetNumRule()->GetLevelCount(), aNewRule.GetLevelCount()); 1431 for ( sal_uInt16 nLevel = 0; nLevel < nLevelCnt; ++nLevel ) 1432 { 1433 const SvxNumberFormat* pOldFmt = pNumBulletItem->GetNumRule()->Get(nLevel); 1434 const SvxNumberFormat* pNewFmt = aNewRule.Get(nLevel); 1435 if (pOldFmt && pNewFmt && (pOldFmt->GetFirstLineOffset() != pNewFmt->GetFirstLineOffset() || pOldFmt->GetAbsLSpace() != pNewFmt->GetAbsLSpace())) 1436 { 1437 SvxNumberFormat* pNewFmtClone = new SvxNumberFormat(*pNewFmt); 1438 pNewFmtClone->SetFirstLineOffset(pOldFmt->GetFirstLineOffset()); 1439 pNewFmtClone->SetAbsLSpace(pOldFmt->GetAbsLSpace()); 1440 aNewRule.SetLevel(nLevel, pNewFmtClone); 1441 delete pNewFmtClone; 1442 } 1443 } 1444 } 1445 } 1446 1447 aAttrs.Put(SvxNumBulletItem(aNewRule), EE_PARA_NUMBULLET); 1448 } 1449 } 1450 pOwner->SetParaAttribs(nPara, aAttrs); 1451 } 1452 } 1453 1454 const sal_uInt16 nParaCount = (sal_uInt16) (pOwner->pParaList->GetParagraphCount()); 1455 pOwner->ImplCheckParagraphs( nStartPara, nParaCount ); 1456 pOwner->pEditEngine->QuickMarkInvalid( ESelection( nStartPara, 0, nParaCount, 0 ) ); 1457 1458 pOwner->pEditEngine->SetUpdateMode( bUpdate ); 1459 1460 pOwner->UndoActionEnd( OLUNDO_DEPTH ); 1461 1462 return; 1463 } 1464 1465 1466 void OutlinerView::SwitchOffBulletsNumbering( 1467 const bool bAtSelection ) 1468 { 1469 sal_uInt16 nStartPara = 0; 1470 sal_uInt16 nEndPara = 0; 1471 if ( bAtSelection ) 1472 { 1473 ESelection aSel( pEditView->GetSelection() ); 1474 aSel.Adjust(); 1475 nStartPara = aSel.nStartPara; 1476 nEndPara = aSel.nEndPara; 1477 } 1478 else 1479 { 1480 nStartPara = 0; 1481 nEndPara = pOwner->pParaList->GetParagraphCount() - 1; 1482 } 1483 1484 pOwner->UndoActionStart( OLUNDO_DEPTH ); 1485 const bool bUpdate = pOwner->pEditEngine->GetUpdateMode(); 1486 pOwner->pEditEngine->SetUpdateMode( sal_False ); 1487 1488 for ( sal_uInt16 nPara = nStartPara; nPara <= nEndPara; ++nPara ) 1489 { 1490 Paragraph* pPara = pOwner->pParaList->GetParagraph( nPara ); 1491 DBG_ASSERT(pPara, "OutlinerView::SwitchOffBulletsNumbering(...), illegal paragraph index?"); 1492 1493 if( pPara ) 1494 { 1495 pOwner->SetDepth( pPara, -1 ); 1496 1497 const SfxItemSet& rAttrs = pOwner->GetParaAttribs( nPara ); 1498 if (rAttrs.GetItemState( EE_PARA_BULLETSTATE ) == SFX_ITEM_SET) 1499 { 1500 SfxItemSet aAttrs(rAttrs); 1501 aAttrs.ClearItem( EE_PARA_BULLETSTATE ); 1502 pOwner->SetParaAttribs( nPara, aAttrs ); 1503 } 1504 } 1505 } 1506 1507 const sal_uInt16 nParaCount = (sal_uInt16) (pOwner->pParaList->GetParagraphCount()); 1508 pOwner->ImplCheckParagraphs( nStartPara, nParaCount ); 1509 pOwner->pEditEngine->QuickMarkInvalid( ESelection( nStartPara, 0, nParaCount, 0 ) ); 1510 1511 pOwner->pEditEngine->SetUpdateMode( bUpdate ); 1512 pOwner->UndoActionEnd( OLUNDO_DEPTH ); 1513 } 1514 1515 1516 void OutlinerView::RemoveAttribsKeepLanguages( sal_Bool bRemoveParaAttribs ) 1517 { 1518 RemoveAttribs( bRemoveParaAttribs, 0, sal_True /*keep language attribs*/ ); 1519 } 1520 1521 void OutlinerView::RemoveAttribs( sal_Bool bRemoveParaAttribs, sal_uInt16 nWhich, sal_Bool bKeepLanguages ) 1522 { 1523 DBG_CHKTHIS(OutlinerView,0); 1524 sal_Bool bUpdate = pOwner->GetUpdateMode(); 1525 pOwner->SetUpdateMode( sal_False ); 1526 pOwner->UndoActionStart( OLUNDO_ATTR ); 1527 if (bKeepLanguages) 1528 pEditView->RemoveAttribsKeepLanguages( bRemoveParaAttribs ); 1529 else 1530 pEditView->RemoveAttribs( bRemoveParaAttribs, nWhich ); 1531 if ( bRemoveParaAttribs ) 1532 { 1533 // Ueber alle Absaetze, und Einrueckung und Level einstellen 1534 ESelection aSel = pEditView->GetSelection(); 1535 aSel.Adjust(); 1536 for ( sal_uInt16 nPara = aSel.nStartPara; nPara <= aSel.nEndPara; nPara++ ) 1537 { 1538 Paragraph* pPara = pOwner->pParaList->GetParagraph( nPara ); 1539 pOwner->ImplInitDepth( nPara, pPara->GetDepth(), sal_False, sal_False ); 1540 } 1541 } 1542 pOwner->UndoActionEnd( OLUNDO_ATTR ); 1543 pOwner->SetUpdateMode( bUpdate ); 1544 } 1545 1546 1547 1548 // ===================================================================== 1549 // ====================== Einfache Durchreicher ======================= 1550 // ====================================================================== 1551 1552 1553 void OutlinerView::InsertText( const XubString& rNew, sal_Bool bSelect ) 1554 { 1555 DBG_CHKTHIS(OutlinerView,0); 1556 if( pOwner->bFirstParaIsEmpty ) 1557 pOwner->Insert( String() ); 1558 pEditView->InsertText( rNew, bSelect ); 1559 } 1560 1561 void OutlinerView::SetVisArea( const Rectangle& rRec ) 1562 { 1563 DBG_CHKTHIS(OutlinerView,0); 1564 pEditView->SetVisArea( rRec ); 1565 } 1566 1567 1568 void OutlinerView::SetSelection( const ESelection& rSel ) 1569 { 1570 DBG_CHKTHIS(OutlinerView,0); 1571 pEditView->SetSelection( rSel ); 1572 } 1573 1574 void OutlinerView::SetReadOnly( sal_Bool bReadOnly ) 1575 { 1576 DBG_CHKTHIS(OutlinerView,0); 1577 pEditView->SetReadOnly( bReadOnly ); 1578 } 1579 1580 sal_Bool OutlinerView::IsReadOnly() const 1581 { 1582 DBG_CHKTHIS(OutlinerView,0); 1583 return pEditView->IsReadOnly(); 1584 } 1585 1586 sal_Bool OutlinerView::HasSelection() const 1587 { 1588 DBG_CHKTHIS(OutlinerView,0); 1589 return pEditView->HasSelection(); 1590 } 1591 1592 1593 void OutlinerView::ShowCursor( sal_Bool bGotoCursor ) 1594 { 1595 DBG_CHKTHIS(OutlinerView,0); 1596 pEditView->ShowCursor( bGotoCursor ); 1597 } 1598 1599 1600 void OutlinerView::HideCursor() 1601 { 1602 DBG_CHKTHIS(OutlinerView,0); 1603 pEditView->HideCursor(); 1604 } 1605 1606 1607 void OutlinerView::SetWindow( Window* pWin ) 1608 { 1609 DBG_CHKTHIS(OutlinerView,0); 1610 pEditView->SetWindow( pWin ); 1611 } 1612 1613 1614 Window* OutlinerView::GetWindow() const 1615 { 1616 DBG_CHKTHIS(OutlinerView,0); 1617 return pEditView->GetWindow(); 1618 } 1619 1620 1621 void OutlinerView::SetOutputArea( const Rectangle& rRect ) 1622 { 1623 DBG_CHKTHIS(OutlinerView,0); 1624 pEditView->SetOutputArea( rRect ); 1625 } 1626 1627 1628 Rectangle OutlinerView::GetOutputArea() const 1629 { 1630 DBG_CHKTHIS(OutlinerView,0); 1631 return pEditView->GetOutputArea(); 1632 } 1633 1634 1635 XubString OutlinerView::GetSelected() const 1636 { 1637 DBG_CHKTHIS(OutlinerView,0); 1638 return pEditView->GetSelected(); 1639 } 1640 1641 1642 void OutlinerView::RemoveCharAttribs( sal_uLong nPara, sal_uInt16 nWhich) 1643 { 1644 DBG_CHKTHIS(OutlinerView,0); 1645 pEditView->RemoveCharAttribs( (sal_uInt16)nPara, nWhich); 1646 } 1647 1648 1649 void OutlinerView::CompleteAutoCorrect() 1650 { 1651 DBG_CHKTHIS(OutlinerView,0); 1652 pEditView->CompleteAutoCorrect(); 1653 } 1654 1655 1656 EESpellState OutlinerView::StartSpeller( sal_Bool bMultiDoc ) 1657 { 1658 DBG_CHKTHIS(OutlinerView,0); 1659 return pEditView->StartSpeller( bMultiDoc ); 1660 } 1661 1662 1663 EESpellState OutlinerView::StartThesaurus() 1664 { 1665 DBG_CHKTHIS(OutlinerView,0); 1666 return pEditView->StartThesaurus(); 1667 } 1668 1669 1670 void OutlinerView::StartTextConversion( 1671 LanguageType nSrcLang, LanguageType nDestLang, const Font *pDestFont, 1672 sal_Int32 nOptions, sal_Bool bIsInteractive, sal_Bool bMultipleDoc ) 1673 { 1674 DBG_CHKTHIS(OutlinerView,0); 1675 if ( 1676 (LANGUAGE_KOREAN == nSrcLang && LANGUAGE_KOREAN == nDestLang) || 1677 (LANGUAGE_CHINESE_SIMPLIFIED == nSrcLang && LANGUAGE_CHINESE_TRADITIONAL == nDestLang) || 1678 (LANGUAGE_CHINESE_TRADITIONAL == nSrcLang && LANGUAGE_CHINESE_SIMPLIFIED == nDestLang) 1679 ) 1680 { 1681 pEditView->StartTextConversion( nSrcLang, nDestLang, pDestFont, nOptions, bIsInteractive, bMultipleDoc ); 1682 } 1683 else 1684 { 1685 DBG_ERROR( "unexpected language" ); 1686 } 1687 } 1688 1689 1690 sal_uInt16 OutlinerView::StartSearchAndReplace( const SvxSearchItem& rSearchItem ) 1691 { 1692 DBG_CHKTHIS(OutlinerView,0); 1693 return pEditView->StartSearchAndReplace( rSearchItem ); 1694 } 1695 1696 void OutlinerView::TransliterateText( sal_Int32 nTransliterationMode ) 1697 { 1698 DBG_CHKTHIS(OutlinerView,0); 1699 pEditView->TransliterateText( nTransliterationMode ); 1700 } 1701 1702 1703 1704 ESelection OutlinerView::GetSelection() 1705 { 1706 DBG_CHKTHIS(OutlinerView,0); 1707 return pEditView->GetSelection(); 1708 } 1709 1710 1711 void OutlinerView::Scroll( long nHorzScroll, long nVertScroll ) 1712 { 1713 DBG_CHKTHIS(OutlinerView,0); 1714 pEditView->Scroll( nHorzScroll, nVertScroll ); 1715 } 1716 1717 1718 void OutlinerView::SetControlWord( sal_uLong nWord ) 1719 { 1720 DBG_CHKTHIS(OutlinerView,0); 1721 pEditView->SetControlWord( nWord ); 1722 } 1723 1724 1725 sal_uLong OutlinerView::GetControlWord() const 1726 { 1727 DBG_CHKTHIS(OutlinerView,0); 1728 return pEditView->GetControlWord(); 1729 } 1730 1731 1732 void OutlinerView::SetAnchorMode( EVAnchorMode eMode ) 1733 { 1734 DBG_CHKTHIS(OutlinerView,0); 1735 pEditView->SetAnchorMode( eMode ); 1736 } 1737 1738 1739 EVAnchorMode OutlinerView::GetAnchorMode() const 1740 { 1741 DBG_CHKTHIS(OutlinerView,0); 1742 return pEditView->GetAnchorMode(); 1743 } 1744 1745 1746 void OutlinerView::Undo() 1747 { 1748 DBG_CHKTHIS(OutlinerView,0); 1749 pEditView->Undo(); 1750 } 1751 1752 1753 void OutlinerView::Redo() 1754 { 1755 DBG_CHKTHIS(OutlinerView,0); 1756 pEditView->Redo(); 1757 } 1758 1759 1760 void OutlinerView::EnablePaste( sal_Bool bEnable ) 1761 { 1762 DBG_CHKTHIS(OutlinerView,0); 1763 pEditView->EnablePaste( bEnable ); 1764 } 1765 1766 1767 void OutlinerView::Copy() 1768 { 1769 DBG_CHKTHIS(OutlinerView,0); 1770 pEditView->Copy(); 1771 } 1772 1773 1774 void OutlinerView::InsertField( const SvxFieldItem& rFld ) 1775 { 1776 DBG_CHKTHIS(OutlinerView,0); 1777 pEditView->InsertField( rFld ); 1778 } 1779 1780 1781 const SvxFieldItem* OutlinerView::GetFieldUnderMousePointer() const 1782 { 1783 DBG_CHKTHIS(OutlinerView,0); 1784 return pEditView->GetFieldUnderMousePointer(); 1785 } 1786 1787 1788 const SvxFieldItem* OutlinerView::GetFieldUnderMousePointer( sal_uInt16& nPara, sal_uInt16& nPos ) const 1789 { 1790 DBG_CHKTHIS(OutlinerView,0); 1791 return pEditView->GetFieldUnderMousePointer( nPara, nPos ); 1792 } 1793 1794 1795 const SvxFieldItem* OutlinerView::GetFieldAtSelection() const 1796 { 1797 DBG_CHKTHIS(OutlinerView,0); 1798 return pEditView->GetFieldAtSelection(); 1799 } 1800 1801 void OutlinerView::SetInvalidateMore( sal_uInt16 nPixel ) 1802 { 1803 DBG_CHKTHIS(OutlinerView,0); 1804 pEditView->SetInvalidateMore( nPixel ); 1805 } 1806 1807 1808 sal_uInt16 OutlinerView::GetInvalidateMore() const 1809 { 1810 DBG_CHKTHIS(OutlinerView,0); 1811 return pEditView->GetInvalidateMore(); 1812 } 1813 1814 1815 sal_Bool OutlinerView::IsCursorAtWrongSpelledWord( sal_Bool bMarkIfWrong ) 1816 { 1817 DBG_CHKTHIS(OutlinerView,0); 1818 return pEditView->IsCursorAtWrongSpelledWord( bMarkIfWrong ); 1819 } 1820 1821 1822 sal_Bool OutlinerView::IsWrongSpelledWordAtPos( const Point& rPosPixel, sal_Bool bMarkIfWrong ) 1823 { 1824 DBG_CHKTHIS(OutlinerView,0); 1825 return pEditView->IsWrongSpelledWordAtPos( rPosPixel, bMarkIfWrong ); 1826 } 1827 1828 1829 void OutlinerView::SpellIgnoreWord() 1830 { 1831 DBG_CHKTHIS(OutlinerView,0); 1832 pEditView->SpellIgnoreWord(); 1833 } 1834 1835 1836 void OutlinerView::ExecuteSpellPopup( const Point& rPosPixel, Link* pStartDlg ) 1837 { 1838 DBG_CHKTHIS(OutlinerView,0); 1839 pEditView->ExecuteSpellPopup( rPosPixel, pStartDlg ); 1840 } 1841 1842 sal_uLong OutlinerView::Read( SvStream& rInput, const String& rBaseURL, EETextFormat eFormat, sal_Bool bSelect, SvKeyValueIterator* pHTTPHeaderAttrs ) 1843 { 1844 DBG_CHKTHIS(OutlinerView,0); 1845 sal_uInt16 nOldParaCount = pEditView->GetEditEngine()->GetParagraphCount(); 1846 ESelection aOldSel = pEditView->GetSelection(); 1847 aOldSel.Adjust(); 1848 1849 sal_uLong nRet = pEditView->Read( rInput, rBaseURL, eFormat, bSelect, pHTTPHeaderAttrs ); 1850 1851 // MT 08/00: Hier sollte eigentlich das gleiche wie in PasteSpecial passieren! 1852 // Mal anpassen, wenn dieses ImplInitPaste und ImpPasted-Geraffel ueberarbeitet ist. 1853 1854 long nParaDiff = pEditView->GetEditEngine()->GetParagraphCount() - nOldParaCount; 1855 sal_uInt16 nChangesStart = aOldSel.nStartPara; 1856 sal_uInt16 nChangesEnd = sal::static_int_cast< sal_uInt16 >(nChangesStart + nParaDiff + (aOldSel.nEndPara-aOldSel.nStartPara)); 1857 1858 for ( sal_uInt16 n = nChangesStart; n <= nChangesEnd; n++ ) 1859 { 1860 if ( eFormat == EE_FORMAT_BIN ) 1861 { 1862 sal_uInt16 nDepth = 0; 1863 const SfxItemSet& rAttrs = pOwner->GetParaAttribs( n ); 1864 const SfxInt16Item& rLevel = (const SfxInt16Item&) rAttrs.Get( EE_PARA_OUTLLEVEL ); 1865 nDepth = rLevel.GetValue(); 1866 pOwner->ImplInitDepth( n, nDepth, sal_False ); 1867 } 1868 1869 if ( pOwner->ImplGetOutlinerMode() == OUTLINERMODE_OUTLINEOBJECT ) 1870 pOwner->ImplSetLevelDependendStyleSheet( n ); 1871 } 1872 1873 if ( eFormat != EE_FORMAT_BIN ) 1874 { 1875 pOwner->ImpFilterIndents( nChangesStart, nChangesEnd ); 1876 } 1877 1878 return nRet; 1879 } 1880 1881 sal_uLong OutlinerView::Write( SvStream& rOutput, EETextFormat eFormat ) 1882 { 1883 DBG_CHKTHIS(OutlinerView,0); 1884 return pEditView->Write( rOutput, eFormat ); 1885 } 1886 1887 void OutlinerView::SetBackgroundColor( const Color& rColor ) 1888 { 1889 DBG_CHKTHIS(OutlinerView,0); 1890 pEditView->SetBackgroundColor( rColor ); 1891 } 1892 1893 1894 Color OutlinerView::GetBackgroundColor() 1895 { 1896 DBG_CHKTHIS(OutlinerView,0); 1897 return pEditView->GetBackgroundColor(); 1898 } 1899 1900 SfxItemSet OutlinerView::GetAttribs() 1901 { 1902 DBG_CHKTHIS(OutlinerView,0); 1903 return pEditView->GetAttribs(); 1904 } 1905 1906 sal_uInt16 OutlinerView::GetSelectedScriptType() const 1907 { 1908 DBG_CHKTHIS(OutlinerView,0); 1909 return pEditView->GetSelectedScriptType(); 1910 } 1911 1912 String OutlinerView::GetSurroundingText() const 1913 { 1914 DBG_CHKTHIS(OutlinerView,0); 1915 return pEditView->GetSurroundingText(); 1916 } 1917 1918 Selection OutlinerView::GetSurroundingTextSelection() const 1919 { 1920 DBG_CHKTHIS(OutlinerView,0); 1921 return pEditView->GetSurroundingTextSelection(); 1922 } 1923 1924 1925 // ====================================================================== 1926 // ===== some code for thesaurus sub menu within context menu 1927 // ====================================================================== 1928 1929 // returns: true if a word for thesaurus look-up was found at the current cursor position. 1930 // The status string will be word + iso language string (e.g. "light#en-US") 1931 bool EDITENG_DLLPUBLIC GetStatusValueForThesaurusFromContext( 1932 String &rStatusVal, 1933 LanguageType &rLang, 1934 const EditView &rEditView ) 1935 { 1936 // get text and locale for thesaurus look up 1937 String aText; 1938 EditEngine *pEditEngine = rEditView.GetEditEngine(); 1939 ESelection aTextSel( rEditView.GetSelection() ); 1940 if (!aTextSel.HasRange()) 1941 aTextSel = pEditEngine->GetWord( aTextSel, i18n::WordType::DICTIONARY_WORD ); 1942 aText = pEditEngine->GetText( aTextSel ); 1943 aTextSel.Adjust(); 1944 LanguageType nLang = pEditEngine->GetLanguage( aTextSel.nStartPara, aTextSel.nStartPos ); 1945 String aLangText( MsLangId::convertLanguageToIsoString( nLang ) ); 1946 1947 // set word and locale to look up as status value 1948 String aStatusVal( aText ); 1949 aStatusVal.AppendAscii( "#" ); 1950 aStatusVal += aLangText; 1951 1952 rStatusVal = aStatusVal; 1953 rLang = nLang; 1954 1955 return aText.Len() > 0; 1956 } 1957 1958 1959 void EDITENG_DLLPUBLIC ReplaceTextWithSynonym( EditView &rEditView, const String &rSynonmText ) 1960 { 1961 // get selection to use 1962 ESelection aCurSel( rEditView.GetSelection() ); 1963 if (!rEditView.HasSelection()) 1964 { 1965 // select the same word that was used in GetStatusValueForThesaurusFromContext by calling GetWord. 1966 // (In the end both functions will call ImpEditEngine::SelectWord) 1967 rEditView.SelectCurrentWord( i18n::WordType::DICTIONARY_WORD ); 1968 aCurSel = rEditView.GetSelection(); 1969 } 1970 1971 // replace word ... 1972 rEditView.InsertText( rSynonmText ); 1973 rEditView.ShowCursor( sal_True, sal_False ); 1974 } 1975 1976 1977