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_sd.hxx" 26 27 #include "EditWindow.hxx" 28 29 #include "sdmod.hxx" 30 #include <i18npool/mslangid.hxx> 31 #include <com/sun/star/i18n/ScriptType.hpp> 32 #include <editeng/editeng.hxx> 33 #include <editeng/editview.hxx> 34 #include <vcl/scrbar.hxx> 35 #include <editeng/eeitem.hxx> 36 #include "sdresid.hxx" 37 #include <svl/itempool.hxx> 38 #include <editeng/fhgtitem.hxx> 39 #include <vos/mutex.hxx> 40 #include <vcl/svapp.hxx> 41 #include <unotools/linguprops.hxx> 42 #include <unotools/lingucfg.hxx> 43 #include <editeng/fontitem.hxx> 44 #include <editeng/editstat.hxx> 45 46 #define SCROLL_LINE 24 47 48 using namespace com::sun::star::accessibility; 49 using namespace com::sun::star; 50 using namespace com::sun::star::uno; 51 52 namespace sd { namespace notes { 53 54 EditWindow::EditWindow (Window* pParentWindow, SfxItemPool* pItemPool) 55 : Window (pParentWindow, WinBits()), 56 DropTargetHelper(this), 57 mpEditView(NULL), 58 mpEditEngine(NULL), 59 mpHorizontalScrollBar(NULL), 60 mpVerticalScrollBar(NULL), 61 mpScrollBox(NULL) 62 { 63 SetMapMode(MAP_PIXEL); 64 65 // compare DataChanged 66 SetBackground (GetSettings().GetStyleSettings().GetWindowColor()); 67 68 maModifyTimer.SetTimeout(2000); 69 maModifyTimer.Start(); 70 71 maCursorMoveTimer.SetTimeout(500); 72 73 CreateEditView(); 74 75 SvxFontHeightItem aItem (GetFont().GetSize().Height(), 100, 76 EE_CHAR_FONTHEIGHT); 77 pItemPool->SetPoolDefaultItem (aItem); 78 aItem.SetWhich(EE_CHAR_FONTHEIGHT_CJK); 79 pItemPool->SetPoolDefaultItem (aItem); 80 aItem.SetWhich(EE_CHAR_FONTHEIGHT_CTL); 81 pItemPool->SetPoolDefaultItem (aItem); 82 83 InsertText (UniString::CreateFromAscii("EditWindow created and ready.\n")); 84 } 85 86 87 EditWindow::~EditWindow (void) 88 { 89 maCursorMoveTimer.Stop(); 90 maModifyTimer.Stop(); 91 92 if (mpEditView != NULL) 93 { 94 EditEngine *pEditEngine = mpEditView->GetEditEngine(); 95 if (pEditEngine) 96 { 97 pEditEngine->SetStatusEventHdl(Link()); 98 pEditEngine->RemoveView (mpEditView); 99 } 100 } 101 delete mpEditView; 102 delete mpHorizontalScrollBar; 103 delete mpVerticalScrollBar; 104 delete mpScrollBox; 105 106 } 107 108 //////////////////////////////////////// 109 110 111 void SmGetLeftSelectionPart(const ESelection aSel, 112 sal_uInt16 &nPara, sal_uInt16 &nPos) 113 // returns paragraph number and position of the selections left part 114 { 115 // compare start and end of selection and use the one that comes first 116 if ( 117 (aSel.nStartPara < aSel.nEndPara) || 118 (aSel.nStartPara == aSel.nEndPara && aSel.nStartPos < aSel.nEndPos) 119 ) 120 { nPara = aSel.nStartPara; 121 nPos = aSel.nStartPos; 122 } 123 else 124 { nPara = aSel.nEndPara; 125 nPos = aSel.nEndPos; 126 } 127 } 128 129 130 131 132 EditEngine * EditWindow::GetEditEngine (void) 133 { 134 if (mpEditEngine == NULL) 135 mpEditEngine = CreateEditEngine (); 136 return mpEditEngine; 137 } 138 139 140 141 142 EditEngine* EditWindow::CreateEditEngine (void) 143 { 144 EditEngine* pEditEngine = mpEditEngine; 145 if (pEditEngine == NULL) 146 { 147 mpEditEngineItemPool = EditEngine::CreatePool(); 148 149 // 150 // set fonts to be used 151 // 152 SvtLinguOptions aOpt; 153 SvtLinguConfig().GetOptions( aOpt ); 154 // 155 struct FontDta { 156 sal_Int16 nFallbackLang; 157 sal_Int16 nLang; 158 sal_uInt16 nFontType; 159 sal_uInt16 nFontInfoId; 160 } aTable[3] = 161 { 162 // info to get western font to be used 163 { LANGUAGE_ENGLISH_US, LANGUAGE_NONE, 164 DEFAULTFONT_SERIF, EE_CHAR_FONTINFO }, 165 // info to get CJK font to be used 166 { LANGUAGE_JAPANESE, LANGUAGE_NONE, 167 DEFAULTFONT_CJK_TEXT, EE_CHAR_FONTINFO_CJK }, 168 // info to get CTL font to be used 169 { LANGUAGE_ARABIC_SAUDI_ARABIA, LANGUAGE_NONE, 170 DEFAULTFONT_CTL_TEXT, EE_CHAR_FONTINFO_CTL } 171 }; 172 aTable[0].nLang = MsLangId::resolveSystemLanguageByScriptType(aOpt.nDefaultLanguage, ::com::sun::star::i18n::ScriptType::LATIN); 173 aTable[1].nLang = MsLangId::resolveSystemLanguageByScriptType(aOpt.nDefaultLanguage_CJK, ::com::sun::star::i18n::ScriptType::ASIAN); 174 aTable[2].nLang = MsLangId::resolveSystemLanguageByScriptType(aOpt.nDefaultLanguage_CTL, ::com::sun::star::i18n::ScriptType::COMPLEX); 175 // 176 for (int i = 0; i < 3; ++i) 177 { 178 const FontDta &rFntDta = aTable[i]; 179 LanguageType nLang = (LANGUAGE_NONE == rFntDta.nLang) ? 180 rFntDta.nFallbackLang : rFntDta.nLang; 181 Font aFont = Application::GetDefaultDevice()->GetDefaultFont( 182 rFntDta.nFontType, nLang, DEFAULTFONT_FLAGS_ONLYONE); 183 mpEditEngineItemPool->SetPoolDefaultItem( 184 SvxFontItem( 185 aFont.GetFamily(), 186 aFont.GetName(), 187 aFont.GetStyleName(), 188 aFont.GetPitch(), 189 aFont.GetCharSet(), 190 rFntDta.nFontInfoId)); 191 } 192 193 // set font heights 194 SvxFontHeightItem aFontHeigt( 195 Application::GetDefaultDevice()->LogicToPixel( 196 Size (0, 10), MapMode (MAP_POINT)).Height(), 100, 197 EE_CHAR_FONTHEIGHT ); 198 mpEditEngineItemPool->SetPoolDefaultItem( aFontHeigt); 199 aFontHeigt.SetWhich (EE_CHAR_FONTHEIGHT_CJK); 200 mpEditEngineItemPool->SetPoolDefaultItem( aFontHeigt); 201 aFontHeigt.SetWhich (EE_CHAR_FONTHEIGHT_CTL); 202 mpEditEngineItemPool->SetPoolDefaultItem( aFontHeigt); 203 204 pEditEngine = new EditEngine (mpEditEngineItemPool); 205 206 pEditEngine->EnableUndo (sal_True); 207 pEditEngine->SetDefTab (sal_uInt16( 208 Application::GetDefaultDevice()->GetTextWidth( 209 UniString::CreateFromAscii("XXXX")))); 210 211 pEditEngine->SetControlWord( 212 (pEditEngine->GetControlWord() 213 | EE_CNTRL_AUTOINDENTING) & 214 (~EE_CNTRL_UNDOATTRIBS) & 215 (~EE_CNTRL_PASTESPECIAL)); 216 217 pEditEngine->SetWordDelimiters ( 218 UniString::CreateFromAscii(" .=+-*/(){}[];\"")); 219 pEditEngine->SetRefMapMode (MAP_PIXEL); 220 pEditEngine->SetPaperSize (Size(800, 0)); 221 pEditEngine->EraseVirtualDevice(); 222 pEditEngine->ClearModifyFlag(); 223 } 224 225 return pEditEngine; 226 } 227 228 229 230 231 void EditWindow::DataChanged (const DataChangedEvent&) 232 { 233 const StyleSettings aSettings (GetSettings().GetStyleSettings()); 234 235 SetBackground( aSettings.GetWindowColor() ); 236 237 // edit fields in other Applications use this font instead of 238 // the application font thus we use this one too 239 SetPointFont( aSettings.GetFieldFont() ); 240 EditEngine* pEditEngine = GetEditEngine(); 241 242 if (pEditEngine!=NULL && mpEditEngineItemPool!=NULL) 243 { 244 //! 245 //! see also SmDocShell::GetEditEngine() ! 246 //! 247 248 // pEditEngine->SetDefTab( sal_uInt16( GetTextWidth( C2S("XXXX") ) ) ); 249 250 sal_uInt16 aFntInfoId[3] = { 251 EE_CHAR_FONTINFO, EE_CHAR_FONTINFO_CJK, EE_CHAR_FONTINFO_CTL }; 252 for (int i = 0; i < 3; ++i) 253 { 254 const SfxPoolItem *pItem = mpEditEngineItemPool->GetPoolDefaultItem( aFntInfoId[i] ); 255 if( pItem ) 256 { 257 const SvxFontItem *pFntItem = ((const SvxFontItem *) pItem); 258 const Font &rFnt = aSettings.GetFieldFont(); 259 SvxFontItem aFntItem( rFnt.GetFamily(), rFnt.GetName(), 260 rFnt.GetStyleName(), rFnt.GetPitch(), 261 pFntItem->GetCharSet(), 262 aFntInfoId[i] ); 263 mpEditEngineItemPool->SetPoolDefaultItem( aFntItem ); 264 } 265 } 266 267 SvxFontHeightItem aItem( GetFont().GetSize().Height(), 100, 268 EE_CHAR_FONTHEIGHT ); 269 mpEditEngineItemPool->SetPoolDefaultItem( aItem ); 270 aItem.SetWhich( EE_CHAR_FONTHEIGHT_CJK ); 271 mpEditEngineItemPool->SetPoolDefaultItem( aItem ); 272 aItem.SetWhich( EE_CHAR_FONTHEIGHT_CTL ); 273 mpEditEngineItemPool->SetPoolDefaultItem( aItem ); 274 275 // forces new settings to be used 276 // unfortunately this resets the whole edit engine 277 // thus we need to save at least the text 278 String aTxt( pEditEngine->GetText( LINEEND_LF ) ); 279 pEditEngine->Clear(); //#77957 incorrect font size 280 pEditEngine->SetText( aTxt ); 281 } 282 283 String aText (mpEditEngine->GetText (LINEEND_LF)); 284 mpEditEngine->Clear(); 285 mpEditEngine->SetText (aText); 286 287 AdjustScrollBars(); 288 Resize(); 289 } 290 291 292 293 294 void EditWindow::Resize (void) 295 { 296 if (!mpEditView) 297 CreateEditView(); 298 299 if (mpEditView != NULL) 300 { 301 mpEditView->SetOutputArea(AdjustScrollBars()); 302 mpEditView->ShowCursor(); 303 304 DBG_ASSERT( mpEditView->GetEditEngine(), "EditEngine missing" ); 305 const long nMaxVisAreaStart = mpEditView->GetEditEngine()->GetTextHeight() - 306 mpEditView->GetOutputArea().GetHeight(); 307 if (mpEditView->GetVisArea().Top() > nMaxVisAreaStart) 308 { 309 Rectangle aVisArea(mpEditView->GetVisArea() ); 310 aVisArea.Top() = (nMaxVisAreaStart > 0 ) ? nMaxVisAreaStart : 0; 311 aVisArea.SetSize(mpEditView->GetOutputArea().GetSize()); 312 mpEditView->SetVisArea(aVisArea); 313 mpEditView->ShowCursor(); 314 } 315 InitScrollBars(); 316 } 317 Invalidate(); 318 } 319 320 321 322 323 void EditWindow::MouseButtonUp(const MouseEvent &rEvt) 324 { 325 if (mpEditView != NULL) 326 mpEditView->MouseButtonUp(rEvt); 327 else 328 Window::MouseButtonUp (rEvt); 329 330 // ggf FormulaCursor neu positionieren 331 // CursorMoveTimerHdl(&aCursorMoveTimer); 332 } 333 334 335 336 337 void EditWindow::MouseButtonDown(const MouseEvent &rEvt) 338 { 339 if (mpEditView != NULL) 340 mpEditView->MouseButtonDown(rEvt); 341 else 342 Window::MouseButtonDown (rEvt); 343 344 GrabFocus(); 345 } 346 347 348 349 350 void EditWindow::Command(const CommandEvent& rCEvt) 351 { 352 /* if (rCEvt.GetCommand() == COMMAND_CONTEXTMENU) 353 { 354 GetParent()->ToTop(); 355 356 Point aPoint = rCEvt.GetMousePosPixel(); 357 PopupMenu* pPopupMenu = new PopupMenu(SmResId(RID_COMMANDMENU)); 358 359 // added for replaceability of context menus #96085, #93782 360 Menu* pMenu = NULL; 361 ::com::sun::star::ui::ContextMenuExecuteEvent aEvent; 362 aEvent.SourceWindow = VCLUnoHelper::GetInterface( this ); 363 aEvent.ExecutePosition.X = aPoint.X(); 364 aEvent.ExecutePosition.Y = aPoint.Y(); 365 if ( GetView()->TryContextMenuInterception( *pPopupMenu, pMenu, aEvent ) ) 366 { 367 if ( pMenu ) 368 { 369 delete pPopupMenu; 370 pPopupMenu = (PopupMenu*) pMenu; 371 } 372 } 373 374 pPopupMenu->SetSelectHdl(LINK(this, EditWindow, MenuSelectHdl)); 375 376 pPopupMenu->Execute( this, aPoint ); 377 delete pPopupMenu; 378 } 379 else*/ if (mpEditView) 380 mpEditView->Command( rCEvt ); 381 else 382 Window::Command (rCEvt); 383 384 } 385 IMPL_LINK_INLINE_START( EditWindow, MenuSelectHdl, Menu *, EMPTYARG ) 386 { 387 /* SmViewShell *pViewSh = rCmdBox.GetView(); 388 if (pViewSh) 389 pViewSh->GetViewFrame()->GetDispatcher()->Execute( 390 SID_INSERTCOMMAND, SFX_CALLMODE_STANDARD, 391 new SfxInt16Item(SID_INSERTCOMMAND, pMenu->GetCurItemId()), 0L); 392 */ 393 return 0; 394 } 395 IMPL_LINK_INLINE_END( EditWindow, MenuSelectHdl, Menu *, EMPTYARG ) 396 397 void EditWindow::KeyInput(const KeyEvent& ) 398 { 399 /* if (rKEvt.GetKeyCode().GetCode() == KEY_ESCAPE) 400 { 401 sal_Bool bCallBase = sal_True; 402 SfxViewShell* pViewShell = SfxViewShell::Current(); 403 if ( pViewShell && pViewShell->ISA(SmViewShell) ) 404 { 405 SmDocShell* pDocSh = (SmDocShell*) pViewShell->GetViewFrame()->GetObjectShell(); 406 if (pDocSh) 407 { 408 // fuert zum (sofortigen) Zerstoeren von this! 409 pDocSh->DoInPlaceActivate( sal_False ); 410 bCallBase = sal_False; 411 } 412 } 413 if ( bCallBase ) 414 Window::KeyInput( rKEvt ); 415 } 416 else 417 { 418 // Timer neu starten, um den Handler (auch bei l�ngeren Eingaben) 419 // m�glichst nur einmal am Ende aufzurufen. 420 aCursorMoveTimer.Start(); 421 422 DBG_ASSERT( mpEditView, "EditView missing (NULL pointer)" ); 423 if (!mpEditView) 424 CreateEditView(); 425 if ( !mpEditView->PostKeyEvent(rKEvt) ) 426 { 427 if ( !SfxViewShell::Current()->KeyInput(rKEvt) ) 428 { 429 // fuert bei F1 (Hilfe) zum Zerstoeren von this! 430 Flush(); 431 if ( aModifyTimer.IsActive() ) 432 aModifyTimer.Stop(); 433 Window::KeyInput(rKEvt); 434 } 435 else 436 { 437 //SFX hat evtl. Slot an der View gecallt und dabei (wg. Hack 438 //im SFX) den Focus auf die View gesetzt 439 SfxViewShell* pVShell = SfxViewShell::Current(); 440 if ( pVShell && pVShell->ISA(SmViewShell) && 441 ((SmViewShell*)pVShell)->GetGraphicWindow().HasFocus() ) 442 { 443 GrabFocus(); 444 } 445 } 446 } 447 else 448 { 449 // have doc-shell modified only for formula input/change and not 450 // cursor travelling and such things... 451 SmDocShell *pDocShell = GetDoc(); 452 if (pDocShell) 453 pDocShell->SetModified( GetEditEngine()->IsModified() ); 454 455 aModifyTimer.Start(); 456 } 457 } 458 */ 459 } 460 461 462 463 464 void EditWindow::Paint(const Rectangle& rRect) 465 { 466 if (!mpEditView) 467 CreateEditView(); 468 mpEditView->Paint(rRect); 469 } 470 471 472 473 474 void EditWindow::CreateEditView (void) 475 { 476 EditEngine* pEditEngine = GetEditEngine(); 477 478 //! pEditEngine and mpEditView may be 0. 479 //! For example when the program is used by the document-converter 480 if (mpEditView==NULL && pEditEngine!=NULL) 481 { 482 mpEditView = new EditView (pEditEngine, this); 483 pEditEngine->InsertView (mpEditView); 484 485 if (mpVerticalScrollBar == NULL) 486 mpVerticalScrollBar = new ScrollBar ( 487 this, WinBits(WB_VSCROLL | WB_DRAG)); 488 if (mpHorizontalScrollBar == NULL) 489 mpHorizontalScrollBar = new ScrollBar ( 490 this, WinBits(WB_HSCROLL | WB_DRAG)); 491 if (mpScrollBox == NULL) 492 mpScrollBox = new ScrollBarBox (this); 493 mpVerticalScrollBar->SetScrollHdl(LINK(this, EditWindow, ScrollHdl)); 494 mpHorizontalScrollBar->SetScrollHdl(LINK(this, EditWindow, ScrollHdl)); 495 496 mpEditView->SetOutputArea(AdjustScrollBars()); 497 498 ESelection eSelection; 499 500 mpEditView->SetSelection(eSelection); 501 Update(); 502 mpEditView->ShowCursor(sal_True, sal_True); 503 504 pEditEngine->SetStatusEventHdl( 505 LINK(this, EditWindow, EditStatusHdl)); 506 SetPointer(mpEditView->GetPointer()); 507 508 SetScrollBarRanges(); 509 } 510 } 511 512 513 514 515 IMPL_LINK( EditWindow, EditStatusHdl, EditStatus *, EMPTYARG ) 516 { 517 if (!mpEditView) 518 return 1; 519 else 520 { 521 SetScrollBarRanges(); 522 return 0; 523 } 524 } 525 526 IMPL_LINK_INLINE_START( EditWindow, ScrollHdl, ScrollBar *, EMPTYARG ) 527 { 528 DBG_ASSERT(mpEditView, "EditView missing"); 529 if (mpEditView) 530 { 531 mpEditView->SetVisArea(Rectangle(Point(mpHorizontalScrollBar->GetThumbPos(), 532 mpVerticalScrollBar->GetThumbPos()), 533 mpEditView->GetVisArea().GetSize())); 534 mpEditView->Invalidate(); 535 } 536 return 0; 537 } 538 IMPL_LINK_INLINE_END( EditWindow, ScrollHdl, ScrollBar *, EMPTYARG ) 539 540 Rectangle EditWindow::AdjustScrollBars() 541 { 542 const Size aOut( GetOutputSizePixel() ); 543 Point aPoint; 544 Rectangle aRect( aPoint, aOut ); 545 546 if (mpVerticalScrollBar && mpHorizontalScrollBar && mpScrollBox) 547 { 548 const long nTmp = GetSettings().GetStyleSettings().GetScrollBarSize(); 549 Point aPt( aRect.TopRight() ); aPt.X() -= nTmp -1L; 550 mpVerticalScrollBar->SetPosSizePixel( aPt, Size(nTmp, aOut.Height() - nTmp)); 551 552 aPt = aRect.BottomLeft(); aPt.Y() -= nTmp - 1L; 553 mpHorizontalScrollBar->SetPosSizePixel( aPt, Size(aOut.Width() - nTmp, nTmp)); 554 555 aPt.X() = mpHorizontalScrollBar->GetSizePixel().Width(); 556 aPt.Y() = mpVerticalScrollBar->GetSizePixel().Height(); 557 mpScrollBox->SetPosSizePixel(aPt, Size(nTmp, nTmp )); 558 559 aRect.Right() = aPt.X() - 2; 560 aRect.Bottom() = aPt.Y() - 2; 561 } 562 return aRect; 563 } 564 565 void EditWindow::SetScrollBarRanges() 566 { 567 EditEngine* pEditEngine = GetEditEngine(); 568 if (mpEditView != NULL && pEditEngine != NULL) 569 { 570 if (mpVerticalScrollBar != NULL) 571 { 572 long nTmp = pEditEngine->GetTextHeight(); 573 mpVerticalScrollBar->SetRange(Range(0, nTmp)); 574 mpVerticalScrollBar->SetThumbPos(mpEditView->GetVisArea().Top()); 575 } 576 if (mpHorizontalScrollBar != NULL) 577 { 578 long nTmp = pEditEngine->GetPaperSize().Width(); 579 mpHorizontalScrollBar->SetRange(Range(0,nTmp)); 580 mpHorizontalScrollBar->SetThumbPos(mpEditView->GetVisArea().Left()); 581 } 582 } 583 } 584 585 void EditWindow::InitScrollBars() 586 { 587 if (mpEditView != NULL) 588 { 589 const Size aOut( mpEditView->GetOutputArea().GetSize() ); 590 if (mpVerticalScrollBar != NULL) 591 { 592 mpVerticalScrollBar->SetVisibleSize(aOut.Height()); 593 mpVerticalScrollBar->SetPageSize(aOut.Height() * 8 / 10); 594 mpVerticalScrollBar->SetLineSize(aOut.Height() * 2 / 10); 595 } 596 597 if (mpHorizontalScrollBar != NULL) 598 { 599 mpHorizontalScrollBar->SetVisibleSize(aOut.Width()); 600 mpHorizontalScrollBar->SetPageSize(aOut.Width() * 8 / 10); 601 mpHorizontalScrollBar->SetLineSize(SCROLL_LINE ); 602 } 603 604 SetScrollBarRanges(); 605 606 if (mpVerticalScrollBar != NULL) 607 mpVerticalScrollBar->Show(); 608 if (mpHorizontalScrollBar != NULL) 609 mpHorizontalScrollBar->Show(); 610 if (mpScrollBox != NULL) 611 mpScrollBox->Show(); 612 } 613 } 614 615 616 XubString EditWindow::GetText() 617 { 618 String aText; 619 EditEngine *pEditEngine = GetEditEngine(); 620 DBG_ASSERT( pEditEngine, "EditEngine missing" ); 621 if (pEditEngine) 622 aText = pEditEngine->GetText( LINEEND_LF ); 623 return aText; 624 } 625 626 627 void EditWindow::SetText(const XubString& rText) 628 { 629 EditEngine *pEditEngine = GetEditEngine(); 630 DBG_ASSERT( pEditEngine, "EditEngine missing" ); 631 if (pEditEngine && !pEditEngine->IsModified()) 632 { 633 if (!mpEditView) 634 CreateEditView(); 635 636 ESelection eSelection = mpEditView->GetSelection(); 637 638 pEditEngine->SetText(rText); 639 pEditEngine->ClearModifyFlag(); 640 641 //! Hier die Timer neu zu starten verhindert, dass die Handler f�r andere 642 //! (im Augenblick nicht mehr aktive) Math Tasks aufgerufen werden. 643 maModifyTimer.Start(); 644 maCursorMoveTimer.Start(); 645 646 mpEditView->SetSelection(eSelection); 647 } 648 } 649 650 651 void EditWindow::GetFocus() 652 { 653 Window::GetFocus(); 654 655 if (!mpEditView) 656 CreateEditView(); 657 if (mpEditEngine != NULL) 658 mpEditEngine->SetStatusEventHdl( 659 LINK(this, EditWindow, EditStatusHdl)); 660 } 661 662 663 void EditWindow::LoseFocus() 664 { 665 if (mpEditEngine != NULL) 666 mpEditEngine->SetStatusEventHdl (Link()); 667 668 Window::LoseFocus(); 669 } 670 671 672 sal_Bool EditWindow::IsAllSelected() const 673 { 674 sal_Bool bRes = sal_False; 675 EditEngine *pEditEngine = ((EditWindow *) this)->GetEditEngine(); 676 DBG_ASSERT( mpEditView, "NULL pointer" ); 677 DBG_ASSERT( pEditEngine, "NULL pointer" ); 678 if (pEditEngine && mpEditView) 679 { 680 ESelection eSelection( mpEditView->GetSelection() ); 681 sal_Int32 nParaCnt = pEditEngine->GetParagraphCount(); 682 if (!(nParaCnt - 1)) 683 { 684 String Text( pEditEngine->GetText( LINEEND_LF ) ); 685 bRes = !eSelection.nStartPos && (eSelection.nEndPos == Text.Len () - 1); 686 } 687 else 688 { 689 bRes = !eSelection.nStartPara && (eSelection.nEndPara == nParaCnt - 1); 690 } 691 } 692 return bRes; 693 } 694 695 void EditWindow::SelectAll() 696 { 697 DBG_ASSERT( mpEditView, "NULL pointer" ); 698 if (mpEditView) 699 { 700 // 0xFFFF as last two parameters refers to the end of the text 701 mpEditView->SetSelection( ESelection( 0, 0, 0xFFFF, 0xFFFF ) ); 702 } 703 } 704 705 706 void EditWindow::MarkError(const Point &rPos) 707 { 708 DBG_ASSERT( mpEditView, "EditView missing" ); 709 if (mpEditView) 710 { 711 const int Col = rPos.X(); 712 const int Row = rPos.Y() - 1; 713 714 mpEditView->SetSelection(ESelection ( (sal_uInt16)Row, (sal_uInt16)(Col - 1), (sal_uInt16)Row, (sal_uInt16)Col)); 715 GrabFocus(); 716 } 717 } 718 719 void EditWindow::SelNextMark() 720 { 721 EditEngine *pEditEngine = GetEditEngine(); 722 DBG_ASSERT( mpEditView, "NULL pointer" ); 723 DBG_ASSERT( pEditEngine, "NULL pointer" ); 724 if (pEditEngine && mpEditView) 725 { 726 ESelection eSelection = mpEditView->GetSelection(); 727 sal_uInt16 Pos = eSelection.nEndPos; 728 String aMark (UniString::CreateFromAscii("<?>")); 729 String aText; 730 sal_uInt16 nCounts = pEditEngine->GetParagraphCount(); 731 732 while (eSelection.nEndPara < nCounts) 733 { 734 aText = pEditEngine->GetText( eSelection.nEndPara ); 735 Pos = aText.Search(aMark, Pos); 736 737 if (Pos != STRING_NOTFOUND) 738 { 739 mpEditView->SetSelection(ESelection (eSelection.nEndPara, Pos, eSelection.nEndPara, Pos + 3)); 740 break; 741 } 742 743 Pos = 0; 744 eSelection.nEndPara++; 745 } 746 } 747 } 748 749 void EditWindow::SelPrevMark() 750 { 751 EditEngine *pEditEngine = GetEditEngine(); 752 DBG_ASSERT( pEditEngine, "NULL pointer" ); 753 DBG_ASSERT( mpEditView, "NULL pointer" ); 754 if (pEditEngine && mpEditView) 755 { 756 ESelection eSelection = mpEditView->GetSelection(); 757 sal_uInt16 Pos = STRING_NOTFOUND; 758 xub_StrLen Max = eSelection.nStartPos; 759 String Text( pEditEngine->GetText( eSelection.nStartPara ) ); 760 String aMark (UniString::CreateFromAscii("<?>")); 761 sal_uInt16 nCounts = pEditEngine->GetParagraphCount(); 762 763 do 764 { 765 sal_uInt16 Fnd = Text.Search(aMark, 0); 766 767 while ((Fnd < Max) && (Fnd != STRING_NOTFOUND)) 768 { 769 Pos = Fnd; 770 Fnd = Text.Search(aMark, Fnd + 1); 771 } 772 773 if (Pos == STRING_NOTFOUND) 774 { 775 eSelection.nStartPara--; 776 Text = pEditEngine->GetText( eSelection.nStartPara ); 777 Max = Text.Len(); 778 } 779 } 780 while ((eSelection.nStartPara < nCounts) && 781 (Pos == STRING_NOTFOUND)); 782 783 if (Pos != STRING_NOTFOUND) 784 { 785 mpEditView->SetSelection(ESelection (eSelection.nStartPara, Pos, eSelection.nStartPara, Pos + 3)); 786 } 787 } 788 } 789 790 sal_Bool EditWindow::HasMark(const String& rText) const 791 // returns true iff 'rText' contains a mark 792 { 793 return rText.SearchAscii("<?>", 0) != STRING_NOTFOUND; 794 } 795 796 void EditWindow::MouseMove(const MouseEvent &rEvt) 797 { 798 if (mpEditView) 799 mpEditView->MouseMove(rEvt); 800 } 801 802 sal_Int8 EditWindow::AcceptDrop( const AcceptDropEvent& ) 803 { 804 return mpEditView ? /*mpEditView->QueryDrop( rEvt )*/DND_ACTION_NONE: DND_ACTION_NONE; 805 } 806 807 sal_Int8 EditWindow::ExecuteDrop( const ExecuteDropEvent& ) 808 { 809 return mpEditView ? /*mpEditView->Drop( rEvt )*/DND_ACTION_NONE : DND_ACTION_NONE; 810 } 811 812 ESelection EditWindow::GetSelection() const 813 { 814 // pointer may be 0 when reloading a document and the old view 815 // was already destroyed 816 //(DBG_ASSERT( mpEditView, "NULL pointer" ); 817 ESelection eSel; 818 if (mpEditView) 819 eSel = mpEditView->GetSelection(); 820 return eSel; 821 } 822 823 void EditWindow::SetSelection(const ESelection &rSel) 824 { 825 DBG_ASSERT( mpEditView, "NULL pointer" ); 826 if (mpEditView) 827 mpEditView->SetSelection(rSel); 828 } 829 830 sal_Bool EditWindow::IsEmpty() const 831 { 832 EditEngine *pEditEngine = ((EditWindow *) this)->GetEditEngine(); 833 return (pEditEngine && (pEditEngine->GetTextLen() == 0)) ? sal_True : sal_False; 834 } 835 836 sal_Bool EditWindow::IsSelected() const 837 { 838 return mpEditView ? mpEditView->HasSelection() : sal_False; 839 } 840 841 void EditWindow::Cut() 842 { 843 DBG_ASSERT( mpEditView, "EditView missing" ); 844 if (mpEditView) 845 mpEditView->Cut(); 846 } 847 848 void EditWindow::Copy() 849 { 850 DBG_ASSERT( mpEditView, "EditView missing" ); 851 if (mpEditView) 852 mpEditView->Copy(); 853 } 854 855 void EditWindow::Paste() 856 { 857 DBG_ASSERT( mpEditView, "EditView missing" ); 858 if (mpEditView) 859 mpEditView->Paste(); 860 } 861 862 void EditWindow::Delete() 863 { 864 DBG_ASSERT( mpEditView, "EditView missing" ); 865 if (mpEditView) 866 mpEditView->DeleteSelected(); 867 } 868 869 void EditWindow::InsertText(const String& Text) 870 { 871 DBG_ASSERT( mpEditView, "EditView missing" ); 872 ::vos::OGuard aGuard (::Application::GetSolarMutex()); 873 if (mpEditView) 874 mpEditView->InsertText(Text); 875 } 876 877 878 879 } } // end of namespace ::sd::notes 880