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 #include "precompiled_sw.hxx" 25 26 #include <SidebarWin.hxx> 27 #include <SidebarWinAcc.hxx> 28 #include <PostItMgr.hxx> 29 30 #include <SidebarTxtControl.hxx> 31 #include <AnchorOverlayObject.hxx> 32 #include <ShadowOverlayObject.hxx> 33 #include <OverlayRanges.hxx> 34 35 #include <annotation.hrc> 36 #include <popup.hrc> 37 #include <docvw.hrc> 38 #include <app.hrc> 39 #include <access.hrc> 40 41 #include <viewopt.hxx> 42 #include <cmdid.h> 43 44 #include <editeng/fontitem.hxx> 45 #include <editeng/fhgtitem.hxx> 46 #include <editeng/langitem.hxx> 47 #include <editeng/editview.hxx> 48 #include <editeng/outliner.hxx> 49 #include <editeng/editeng.hxx> 50 #include <editeng/eeitem.hxx> 51 52 #include <svl/zforlist.hxx> 53 #include <svl/undo.hxx> 54 #include <svl/stritem.hxx> 55 56 #include <sfx2/viewfrm.hxx> 57 #include <sfx2/bindings.hxx> 58 #include <sfx2/dispatch.hxx> 59 60 #include <vcl/scrbar.hxx> 61 #include <vcl/svapp.hxx> 62 #include <vcl/menubtn.hxx> 63 64 #include <edtwin.hxx> 65 #include <view.hxx> 66 #include <docsh.hxx> 67 #include <wrtsh.hxx> 68 #include <doc.hxx> 69 #include <swmodule.hxx> 70 #include <langhelper.hxx> 71 72 #include <txtannotationfld.hxx> 73 #include <ndtxt.hxx> 74 75 #include <sw_primitivetypes2d.hxx> 76 #include <drawinglayer/primitive2d/primitivetools2d.hxx> 77 #include <drawinglayer/primitive2d/fillgradientprimitive2d.hxx> 78 #include <drawinglayer/primitive2d/polypolygonprimitive2d.hxx> 79 #include <drawinglayer/primitive2d/polygonprimitive2d.hxx> 80 #include <drawinglayer/primitive2d/shadowprimitive2d.hxx> 81 82 namespace css = ::com::sun::star; 83 84 namespace sw { namespace sidebarwindows { 85 86 #define METABUTTON_WIDTH 16 87 #define METABUTTON_HEIGHT 18 88 #define METABUTTON_AREA_WIDTH 30 89 #define POSTIT_META_HEIGHT (sal_Int32) 30 90 #define POSTIT_MINIMUMSIZE_WITHOUT_META 50 91 92 #define POSTIT_SHADOW_BRIGHT Color(180,180,180) 93 #define POSTIT_SHADOW_DARK Color(83,83,83) 94 95 #define EMPTYSTRING rtl::OUString::createFromAscii("") 96 97 /************** SwSidebarWin************************************/ 98 SwSidebarWin::SwSidebarWin( SwEditWin& rEditWin, 99 WinBits nBits, 100 SwPostItMgr& aMgr, 101 SwPostItBits aBits, 102 SwSidebarItem& rSidebarItem ) 103 : Window(&rEditWin, nBits) 104 , mrMgr(aMgr) 105 , mrView( rEditWin.GetView() ) 106 , nFlags(aBits) 107 , mnEventId(0) 108 , mpOutlinerView(0) 109 , mpOutliner(0) 110 , mpSidebarTxtControl(0) 111 , mpVScrollbar(0) 112 , mpMetadataAuthor(0) 113 , mpMetadataDate(0) 114 , mpMenuButton(0) 115 , mpAnchor( NULL ) 116 , mpShadow( NULL ) 117 , mpTextRangeOverlay( NULL ) 118 , mColorAnchor() 119 , mColorDark() 120 , mColorLight() 121 , mChangeColor() 122 , meSidebarPosition( sw::sidebarwindows::SIDEBAR_NONE ) 123 , mPosSize() 124 , mAnchorRect() 125 , mPageBorder( 0 ) 126 , mbMouseOver( false ) 127 , mLayoutStatus( SwPostItHelper::INVISIBLE ) 128 , mbReadonly( false ) 129 , mbIsFollow( false ) 130 , mrSidebarItem( rSidebarItem ) 131 , mpAnchorFrm( rSidebarItem.maLayoutInfo.mpAnchorFrm ) 132 { 133 mpShadow = ShadowOverlayObject::CreateShadowOverlayObject( mrView ); 134 if ( mpShadow ) 135 { 136 mpShadow->setVisible(false); 137 } 138 139 mrMgr.ConnectSidebarWinToFrm( *(mrSidebarItem.maLayoutInfo.mpAnchorFrm), 140 mrSidebarItem.GetFmtFld(), 141 *this ); 142 } 143 144 SwSidebarWin::~SwSidebarWin() 145 { 146 mrMgr.DisconnectSidebarWinFromFrm( *(mrSidebarItem.maLayoutInfo.mpAnchorFrm), 147 *this ); 148 149 Disable(); 150 151 if ( mpSidebarTxtControl ) 152 { 153 if ( mpOutlinerView ) 154 { 155 mpOutlinerView->SetWindow( 0 ); 156 } 157 delete mpSidebarTxtControl; 158 mpSidebarTxtControl = 0; 159 } 160 161 if ( mpOutlinerView ) 162 { 163 delete mpOutlinerView; 164 mpOutlinerView = 0; 165 } 166 167 if (mpOutliner) 168 { 169 delete mpOutliner; 170 mpOutliner = 0; 171 } 172 173 if (mpMetadataAuthor) 174 { 175 mpMetadataAuthor->RemoveEventListener( LINK( this, SwSidebarWin, WindowEventListener ) ); 176 delete mpMetadataAuthor; 177 mpMetadataAuthor = 0; 178 } 179 180 if (mpMetadataDate) 181 { 182 mpMetadataDate->RemoveEventListener( LINK( this, SwSidebarWin, WindowEventListener ) ); 183 delete mpMetadataDate; 184 mpMetadataDate = 0; 185 } 186 187 if (mpVScrollbar) 188 { 189 mpVScrollbar->RemoveEventListener( LINK( this, SwSidebarWin, WindowEventListener ) ); 190 delete mpVScrollbar; 191 mpVScrollbar = 0; 192 } 193 194 AnchorOverlayObject::DestroyAnchorOverlayObject( mpAnchor ); 195 mpAnchor = NULL; 196 197 ShadowOverlayObject::DestroyShadowOverlayObject( mpShadow ); 198 mpShadow = NULL; 199 200 delete mpTextRangeOverlay; 201 mpTextRangeOverlay = NULL; 202 203 delete mpMenuButton; 204 mpMenuButton = 0; 205 206 if (mnEventId) 207 Application::RemoveUserEvent( mnEventId ); 208 } 209 210 void SwSidebarWin::Paint( const Rectangle& rRect) 211 { 212 Window::Paint(rRect); 213 214 if (mpMetadataAuthor->IsVisible() ) 215 { 216 //draw left over space 217 if ( Application::GetSettings().GetStyleSettings().GetHighContrastMode() ) 218 { 219 SetFillColor(COL_BLACK); 220 } 221 else 222 { 223 SetFillColor(mColorDark); 224 } 225 SetLineColor(); 226 DrawRect( PixelToLogic( 227 Rectangle( Point( mpMetadataAuthor->GetPosPixel().X() + 228 mpMetadataAuthor->GetSizePixel().Width(), 229 mpMetadataAuthor->GetPosPixel().Y() ), 230 Size( GetMetaButtonAreaWidth(), 231 mpMetadataAuthor->GetSizePixel().Height() + 232 mpMetadataDate->GetSizePixel().Height() ) ) ) ); 233 } 234 } 235 236 void SwSidebarWin::SetPosSizePixelRect( long nX, 237 long nY, 238 long nWidth, 239 long nHeight, 240 const SwRect& aAnchorRect, 241 const long aPageBorder) 242 { 243 mPosSize = Rectangle(Point(nX,nY),Size(nWidth,nHeight)); 244 mAnchorRect = aAnchorRect; 245 mPageBorder = aPageBorder; 246 } 247 248 void SwSidebarWin::SetSize( const Size& rNewSize ) 249 { 250 mPosSize.SetSize(rNewSize); 251 } 252 253 void SwSidebarWin::SetVirtualPosSize( const Point& aPoint, const Size& aSize) 254 { 255 mPosSize = Rectangle(aPoint,aSize); 256 } 257 258 void SwSidebarWin::TranslateTopPosition(const long aAmount) 259 { 260 mPosSize.Move(0,aAmount); 261 } 262 263 void SwSidebarWin::ShowAnchorOnly(const Point &aPoint) 264 { 265 HideNote(); 266 SetPosAndSize(); 267 if (mpAnchor) 268 { 269 mpAnchor->SetSixthPosition(basegfx::B2DPoint(aPoint.X(),aPoint.Y())); 270 mpAnchor->SetSeventhPosition(basegfx::B2DPoint(aPoint.X(),aPoint.Y())); 271 mpAnchor->SetAnchorState(AS_ALL); 272 mpAnchor->setVisible(true); 273 } 274 if (mpShadow) 275 mpShadow->setVisible(false); 276 } 277 278 SfxItemSet SwSidebarWin::DefaultItem() 279 { 280 SfxItemSet aItem( mrView.GetDocShell()->GetPool() ); 281 aItem.Put(SvxFontHeightItem(200,100,EE_CHAR_FONTHEIGHT)); 282 aItem.Put(SvxFontItem(FAMILY_SWISS,GetSettings().GetStyleSettings().GetFieldFont().GetName(), 283 EMPTYSTRING,PITCH_DONTKNOW,RTL_TEXTENCODING_DONTKNOW,EE_CHAR_FONTINFO)); 284 return aItem; 285 } 286 287 void SwSidebarWin::InitControls() 288 { 289 AddEventListener( LINK( this, SwSidebarWin, WindowEventListener ) ); 290 291 // actual window which holds the user text 292 mpSidebarTxtControl = new SidebarTxtControl( *this, 293 WB_NODIALOGCONTROL, 294 mrView, mrMgr ); 295 mpSidebarTxtControl->SetPointer(Pointer(POINTER_TEXT)); 296 297 // window controls for author and date 298 mpMetadataAuthor = new Edit( this, 0 ); 299 mpMetadataAuthor->SetAccessibleName( SW_RES( STR_ACCESS_ANNOTATION_AUTHOR_NAME ) ); 300 mpMetadataAuthor->SetReadOnly(); 301 mpMetadataAuthor->AlwaysDisableInput(true); 302 mpMetadataAuthor->SetCallHandlersOnInputDisabled(true); 303 mpMetadataAuthor->AddEventListener( LINK( this, SwSidebarWin, WindowEventListener ) ); 304 // we should leave this setting alone, but for this we need a better layout algo 305 // with variable meta size height 306 { 307 AllSettings aSettings = mpMetadataAuthor->GetSettings(); 308 StyleSettings aStyleSettings = aSettings.GetStyleSettings(); 309 Font aFont = aStyleSettings.GetFieldFont(); 310 aFont.SetHeight(8); 311 aStyleSettings.SetFieldFont(aFont); 312 aSettings.SetStyleSettings(aStyleSettings); 313 mpMetadataAuthor->SetSettings(aSettings); 314 } 315 316 mpMetadataDate = new Edit( this, 0 ); 317 mpMetadataDate->SetAccessibleName( SW_RES( STR_ACCESS_ANNOTATION_DATE_NAME ) ); 318 mpMetadataDate->SetReadOnly(); 319 mpMetadataDate->AlwaysDisableInput(true); 320 mpMetadataDate->SetCallHandlersOnInputDisabled(true); 321 mpMetadataDate->AddEventListener( LINK( this, SwSidebarWin, WindowEventListener ) ); 322 // we should leave this setting alone, but for this we need a better layout algo 323 // with variable meta size height 324 { 325 AllSettings aSettings = mpMetadataDate->GetSettings(); 326 StyleSettings aStyleSettings = aSettings.GetStyleSettings(); 327 Font aFont = aStyleSettings.GetFieldFont(); 328 aFont.SetHeight(8); 329 aStyleSettings.SetFieldFont(aFont); 330 aSettings.SetStyleSettings(aStyleSettings); 331 mpMetadataDate->SetSettings(aSettings); 332 } 333 334 335 SwDocShell* aShell = mrView.GetDocShell(); 336 mpOutliner = new Outliner(&aShell->GetPool(),OUTLINERMODE_TEXTOBJECT); 337 aShell->GetDoc()->SetCalcFieldValueHdl( mpOutliner ); 338 mpOutliner->SetUpdateMode( sal_True ); 339 Rescale(); 340 341 mpOutlinerView = new OutlinerView ( mpOutliner, mpSidebarTxtControl ); 342 mpOutlinerView->SetBackgroundColor(COL_TRANSPARENT); 343 mpOutliner->InsertView(mpOutlinerView ); 344 mpOutlinerView->SetOutputArea( PixelToLogic( Rectangle(0,0,1,1) ) ); 345 346 mpOutlinerView->SetAttribs(DefaultItem()); 347 348 // TODO: ?? 349 EEHorizontalTextDirection aDefHoriTextDir = Application::GetSettings().GetLayoutRTL() ? EE_HTEXTDIR_R2L : EE_HTEXTDIR_L2R; 350 mpOutliner->SetDefaultHorizontalTextDirection( aDefHoriTextDir ); 351 352 //create Scrollbars 353 mpVScrollbar = new ScrollBar(this, WB_3DLOOK |WB_VSCROLL|WB_DRAG); 354 mpVScrollbar->EnableNativeWidget(false); 355 mpVScrollbar->EnableRTL( false ); 356 mpVScrollbar->SetScrollHdl(LINK(this, SwSidebarWin, ScrollHdl)); 357 mpVScrollbar->EnableDrag(); 358 mpVScrollbar->AddEventListener( LINK( this, SwSidebarWin, WindowEventListener ) ); 359 360 const SwViewOption* pVOpt = mrView.GetWrtShellPtr()->GetViewOptions(); 361 sal_uLong nCntrl = mpOutliner->GetControlWord(); 362 // TODO: crash when AUTOCOMPLETE enabled 363 nCntrl |= EE_CNTRL_MARKFIELDS | EE_CNTRL_PASTESPECIAL | EE_CNTRL_AUTOCORRECT | EV_CNTRL_AUTOSCROLL | EE_CNTRL_URLSFXEXECUTE; // | EE_CNTRL_AUTOCOMPLETE; 364 if (pVOpt->IsFieldShadings()) 365 nCntrl |= EE_CNTRL_MARKFIELDS; 366 else 367 nCntrl &= ~EE_CNTRL_MARKFIELDS; 368 if (pVOpt->IsOnlineSpell()) 369 nCntrl |= EE_CNTRL_ONLINESPELLING; 370 else 371 nCntrl &= ~EE_CNTRL_ONLINESPELLING; 372 mpOutliner->SetControlWord(nCntrl); 373 374 sal_uInt16 aIndex = SW_MOD()->InsertRedlineAuthor(GetAuthor()); 375 SetColor( mrMgr.GetColorDark(aIndex), 376 mrMgr.GetColorLight(aIndex), 377 mrMgr.GetColorAnchor(aIndex)); 378 379 CheckMetaText(); 380 381 mpMenuButton = CreateMenuButton(); 382 383 SetLanguage(GetLanguage()); 384 GetOutlinerView()->StartSpeller(); 385 SetPostItText(); 386 Engine()->CompleteOnlineSpelling(); 387 388 mpSidebarTxtControl->Show(); 389 mpMetadataAuthor->Show(); 390 mpMetadataDate->Show(); 391 mpVScrollbar->Show(); 392 } 393 394 void SwSidebarWin::CheckMetaText() 395 { 396 const SvtSysLocale aSysLocale; 397 const LocaleDataWrapper& rLocalData = aSysLocale.GetLocaleData(); 398 String sMeta = GetAuthor(); 399 if (sMeta.Len() == 0) 400 { 401 sMeta = String(SW_RES(STR_NOAUTHOR)); 402 } 403 else if (sMeta.Len() > 22) 404 { 405 sMeta.Erase(20); 406 sMeta = sMeta + rtl::OUString::createFromAscii("..."); 407 } 408 if ( mpMetadataAuthor->GetText() != sMeta ) 409 { 410 mpMetadataAuthor->SetText(sMeta); 411 } 412 413 Date aDate = GetDate(); 414 if (aDate==Date()) 415 { 416 sMeta = String(SW_RES(STR_POSTIT_TODAY)); 417 } 418 else if (aDate == Date(Date()-1)) 419 { 420 sMeta = String(SW_RES(STR_POSTIT_YESTERDAY)); 421 } 422 else if (aDate.IsValid() ) 423 { 424 sMeta = rLocalData.getDate(aDate); 425 } 426 else 427 { 428 sMeta = String(SW_RES(STR_NODATE)); 429 } 430 if (GetTime()!=0) 431 { 432 sMeta = sMeta + rtl::OUString::createFromAscii(" ") + rLocalData.getTime( GetTime(),false ); 433 } 434 if ( mpMetadataDate->GetText() != sMeta ) 435 { 436 mpMetadataDate->SetText(sMeta); 437 } 438 439 } 440 441 void SwSidebarWin::Rescale() 442 { 443 MapMode aMode = GetParent()->GetMapMode(); 444 aMode.SetOrigin( Point() ); 445 mpOutliner->SetRefMapMode( aMode ); 446 SetMapMode( aMode ); 447 mpSidebarTxtControl->SetMapMode( aMode ); 448 if ( mpMetadataAuthor ) 449 { 450 Font aFont( mpMetadataAuthor->GetSettings().GetStyleSettings().GetFieldFont() ); 451 sal_Int32 nHeight = aFont.GetHeight(); 452 nHeight = nHeight * aMode.GetScaleY().GetNumerator() / aMode.GetScaleY().GetDenominator(); 453 aFont.SetHeight( nHeight ); 454 mpMetadataAuthor->SetControlFont( aFont ); 455 } 456 if ( mpMetadataDate ) 457 { 458 Font aFont( mpMetadataDate->GetSettings().GetStyleSettings().GetFieldFont() ); 459 sal_Int32 nHeight = aFont.GetHeight(); 460 nHeight = nHeight * aMode.GetScaleY().GetNumerator() / aMode.GetScaleY().GetDenominator(); 461 aFont.SetHeight( nHeight ); 462 mpMetadataDate->SetControlFont( aFont ); 463 } 464 } 465 466 void SwSidebarWin::SetPosAndSize() 467 { 468 bool bChange = false; 469 470 if (GetSizePixel() != mPosSize.GetSize()) 471 { 472 bChange = true; 473 SetSizePixel(mPosSize.GetSize()); 474 DoResize(); 475 } 476 477 if (GetPosPixel().X() != mPosSize.TopLeft().X() || (abs(GetPosPixel().Y() - mPosSize.TopLeft().Y()) > 5) ) 478 { 479 bChange = true; 480 SetPosPixel(mPosSize.TopLeft()); 481 482 Point aLineStart; 483 Point aLineEnd ; 484 switch ( meSidebarPosition ) 485 { 486 case sw::sidebarwindows::SIDEBAR_LEFT: 487 { 488 aLineStart = EditWin()->PixelToLogic( Point(GetPosPixel().X()+GetSizePixel().Width(),GetPosPixel().Y()-1) ); 489 aLineEnd = EditWin()->PixelToLogic( Point(GetPosPixel().X(),GetPosPixel().Y()-1) ); 490 } 491 break; 492 case sw::sidebarwindows::SIDEBAR_RIGHT: 493 { 494 aLineStart = EditWin()->PixelToLogic( Point(GetPosPixel().X(),GetPosPixel().Y()-1) ); 495 aLineEnd = EditWin()->PixelToLogic( Point(GetPosPixel().X()+GetSizePixel().Width(),GetPosPixel().Y()-1) ); 496 } 497 break; 498 default: 499 ASSERT( false, 500 "<SwSidebarWin::SetPosAndSize()> - unexpected position of sidebar" ); 501 break; 502 } 503 504 if (!IsPreview()) 505 { 506 if (mpAnchor) 507 { 508 mpAnchor->SetAllPosition( basegfx::B2DPoint( mAnchorRect.Left() , mAnchorRect.Bottom() - 5* 15), 509 basegfx::B2DPoint( mAnchorRect.Left()-5*15 , mAnchorRect.Bottom()+5*15), 510 basegfx::B2DPoint( mAnchorRect.Left()+5*15 , mAnchorRect.Bottom()+5*15), 511 basegfx::B2DPoint( mAnchorRect.Left(), mAnchorRect.Bottom()+2*15), 512 basegfx::B2DPoint( mPageBorder ,mAnchorRect.Bottom()+2*15), 513 basegfx::B2DPoint( aLineStart.X(),aLineStart.Y()), 514 basegfx::B2DPoint( aLineEnd.X(),aLineEnd.Y())); 515 mpAnchor->SetHeight(mAnchorRect.Height()); 516 } 517 else 518 { 519 mpAnchor = AnchorOverlayObject::CreateAnchorOverlayObject( mrView, 520 mAnchorRect, 521 mPageBorder, 522 aLineStart, 523 aLineEnd, 524 mColorAnchor ); 525 if ( mpAnchor ) 526 { 527 mpAnchor->SetHeight(mAnchorRect.Height()); 528 mpAnchor->setVisible(true); 529 mpAnchor->SetAnchorState(AS_TRI); 530 if (HasChildPathFocus()) 531 { 532 mpAnchor->setLineSolid(true); 533 } 534 } 535 } 536 } 537 } 538 else 539 { 540 if ( mpAnchor && 541 ( mpAnchor->getBasePosition() != basegfx::B2DPoint( mAnchorRect.Left() , mAnchorRect.Bottom()-5*15) ) ) 542 { 543 mpAnchor->SetTriPosition( basegfx::B2DPoint( mAnchorRect.Left() , mAnchorRect.Bottom() - 5* 15), 544 basegfx::B2DPoint( mAnchorRect.Left()-5*15 , mAnchorRect.Bottom()+5*15), 545 basegfx::B2DPoint( mAnchorRect.Left()+5*15 , mAnchorRect.Bottom()+5*15), 546 basegfx::B2DPoint( mAnchorRect.Left(), mAnchorRect.Bottom()+2*15), 547 basegfx::B2DPoint( mPageBorder , mAnchorRect.Bottom()+2*15)); 548 } 549 } 550 551 if (bChange) 552 { 553 Point aStart = EditWin()->PixelToLogic(GetPosPixel()+Point(0,GetSizePixel().Height())); 554 Point aEnd = EditWin()->PixelToLogic(GetPosPixel()+Point(GetSizePixel().Width()-1,GetSizePixel().Height())); 555 mpShadow->SetPosition(basegfx::B2DPoint(aStart.X(),aStart.Y()), basegfx::B2DPoint(aEnd.X(),aEnd.Y())); 556 } 557 558 if (mrMgr.ShowNotes()) 559 { 560 if (IsFollow() && !HasChildPathFocus()) 561 { 562 if ( mpAnchor ) 563 { 564 mpAnchor->SetAnchorState(AS_END); 565 } 566 } 567 else 568 { 569 if ( mpAnchor ) 570 { 571 mpAnchor->SetAnchorState(AS_ALL); 572 } 573 SwSidebarWin* pWin = GetTopReplyNote(); 574 if ( pWin && pWin->Anchor() ) 575 { 576 pWin->Anchor()->SetAnchorState(AS_END); 577 } 578 } 579 } 580 581 // text range overlay 582 if ( mrMgr.ShowNotes() 583 && mrSidebarItem.maLayoutInfo.mnStartNodeIdx != 0 584 && mrSidebarItem.maLayoutInfo.mnStartContent != STRING_NOTFOUND ) 585 { 586 std::vector< basegfx::B2DRange > aAnnotationTextRanges; 587 { 588 const SwTxtAnnotationFld* pTxtAnnotationFld = 589 dynamic_cast< const SwTxtAnnotationFld* >( mrSidebarItem.GetFmtFld().GetTxtFld() ); 590 if ( pTxtAnnotationFld != NULL 591 && pTxtAnnotationFld->GetpTxtNode() != NULL ) 592 { 593 SwTxtNode* pTxtNode = pTxtAnnotationFld->GetpTxtNode(); 594 SwNodes& rNds = pTxtNode->GetDoc()->GetNodes(); 595 SwCntntNode* const pCntntNd = rNds[mrSidebarItem.maLayoutInfo.mnStartNodeIdx]->GetCntntNode(); 596 SwPosition aStartPos( *pCntntNd, mrSidebarItem.maLayoutInfo.mnStartContent ); 597 SwShellCrsr* pTmpCrsr = NULL; 598 const bool bTableCrsrNeeded = pTxtNode->FindTableBoxStartNode() != pCntntNd->FindTableBoxStartNode(); 599 if ( bTableCrsrNeeded ) 600 { 601 SwShellTableCrsr* pTableCrsr = new SwShellTableCrsr( DocView().GetWrtShell(), aStartPos ); 602 pTableCrsr->SetMark(); 603 pTableCrsr->GetMark()->nNode = *pTxtNode; 604 pTableCrsr->GetMark()->nContent.Assign( pTxtNode, *(pTxtAnnotationFld->GetStart())+1 ); 605 pTableCrsr->NewTableSelection(); 606 pTmpCrsr = pTableCrsr; 607 } 608 else 609 { 610 SwShellCrsr* pCrsr = new SwShellCrsr( DocView().GetWrtShell(), aStartPos ); 611 pCrsr->SetMark(); 612 pCrsr->GetMark()->nNode = *pTxtNode; 613 pCrsr->GetMark()->nContent.Assign( pTxtNode, *(pTxtAnnotationFld->GetStart())+1 ); 614 pTmpCrsr = pCrsr; 615 } 616 ::boost::scoped_ptr<SwShellCrsr> pTmpCrsrForAnnotationTextRange( pTmpCrsr ); 617 618 pTmpCrsrForAnnotationTextRange->FillRects(); 619 620 for( sal_uInt16 a(0); a < pTmpCrsrForAnnotationTextRange->Count(); ++a ) 621 { 622 const SwRect aNextRect((*pTmpCrsrForAnnotationTextRange)[a]); 623 const Rectangle aPntRect(aNextRect.SVRect()); 624 625 aAnnotationTextRanges.push_back(basegfx::B2DRange( 626 aPntRect.Left(), aPntRect.Top(), 627 aPntRect.Right() + 1, aPntRect.Bottom() + 1)); 628 } 629 } 630 } 631 632 if ( mpTextRangeOverlay != NULL ) 633 { 634 mpTextRangeOverlay->setRanges( aAnnotationTextRanges ); 635 if ( mpAnchor != NULL && mpAnchor->getLineSolid() ) 636 { 637 mpTextRangeOverlay->ShowSolidBorder(); 638 } 639 else 640 { 641 mpTextRangeOverlay->HideSolidBorder(); 642 } 643 } 644 else 645 { 646 mpTextRangeOverlay = 647 sw::overlay::OverlayRanges::CreateOverlayRange( 648 DocView(), 649 mColorAnchor, 650 aAnnotationTextRanges, 651 mpAnchor != NULL ? mpAnchor->getLineSolid() : false ); 652 } 653 } 654 else 655 { 656 delete mpTextRangeOverlay; 657 mpTextRangeOverlay = NULL; 658 } 659 } 660 661 void SwSidebarWin::DoResize() 662 { 663 long aTextHeight = LogicToPixel( mpOutliner->CalcTextSize()).Height(); 664 long aHeight = GetSizePixel().Height(); 665 unsigned long aWidth = GetSizePixel().Width(); 666 667 aHeight -= GetMetaHeight(); 668 mpMetadataAuthor->Show(); 669 mpMetadataDate->Show(); 670 mpSidebarTxtControl->SetQuickHelpText(EMPTYSTRING); 671 672 if ((aTextHeight > aHeight) && !IsPreview()) 673 { // we need vertical scrollbars and have to reduce the width 674 aWidth -= GetScrollbarWidth(); 675 mpVScrollbar->Show(); 676 } 677 else 678 { 679 mpVScrollbar->Hide(); 680 } 681 682 { 683 const Size aSizeOfMetadataControls( GetSizePixel().Width() - GetMetaButtonAreaWidth(), 684 GetMetaHeight()/2 ); 685 mpMetadataAuthor->SetPosSizePixel( 0, 686 aHeight, 687 aSizeOfMetadataControls.Width(), 688 aSizeOfMetadataControls.Height() ); 689 mpMetadataDate->SetPosSizePixel( 0, 690 aHeight + aSizeOfMetadataControls.Height(), 691 aSizeOfMetadataControls.Width(), 692 aSizeOfMetadataControls.Height() ); 693 } 694 695 mpOutliner->SetPaperSize( PixelToLogic( Size(aWidth,aHeight) ) ) ; 696 mpOutlinerView->SetOutputArea( PixelToLogic( Rectangle(0,0,aWidth,aHeight) ) ); 697 if (!mpVScrollbar->IsVisible()) 698 { // if we do not have a scrollbar anymore, we want to see the complete text 699 mpOutlinerView->SetVisArea( PixelToLogic( Rectangle(0,0,aWidth,aHeight) ) ); 700 } 701 702 if (!Application::GetSettings().GetLayoutRTL()) 703 { 704 mpSidebarTxtControl->SetPosSizePixel(0, 0, aWidth, aHeight); 705 mpVScrollbar->SetPosSizePixel( aWidth, 0, GetScrollbarWidth(), aHeight); 706 } 707 else 708 { 709 mpSidebarTxtControl->SetPosSizePixel( ( (aTextHeight > aHeight) && !IsPreview() 710 ? GetScrollbarWidth() : 0 ) , 0, 711 aWidth, aHeight); 712 mpVScrollbar->SetPosSizePixel( 0, 0, GetScrollbarWidth(), aHeight); 713 } 714 715 mpVScrollbar->SetVisibleSize( PixelToLogic(Size(0,aHeight)).Height() ); 716 mpVScrollbar->SetPageSize( PixelToLogic(Size(0,aHeight)).Height() * 8 / 10 ); 717 mpVScrollbar->SetLineSize( mpOutliner->GetTextHeight() / 10 ); 718 SetScrollbar(); 719 mpVScrollbar->SetRange( Range(0, mpOutliner->GetTextHeight())); 720 721 //calculate rects for meta- button 722 const Fraction& fx( GetMapMode().GetScaleX() ); 723 const Fraction& fy( GetMapMode().GetScaleY() ); 724 725 const Point aPos( mpMetadataAuthor->GetPosPixel()); 726 Rectangle aRectMetaButton; 727 if (IsPreview()) 728 { 729 aRectMetaButton = PixelToLogic( 730 Rectangle( Point( aPos.X()+GetSizePixel().Width()-(METABUTTON_WIDTH*4+10)*fx.GetNumerator()/fx.GetDenominator(), 731 aPos.Y()+5*fy.GetNumerator()/fy.GetDenominator() ), 732 Size( METABUTTON_WIDTH*4*fx.GetNumerator()/fx.GetDenominator(), 733 METABUTTON_HEIGHT*fy.GetNumerator()/fy.GetDenominator() ) ) ); 734 } 735 else 736 { 737 aRectMetaButton = PixelToLogic( 738 Rectangle( Point( aPos.X()+GetSizePixel().Width()-(METABUTTON_WIDTH+10)*fx.GetNumerator()/fx.GetDenominator(), 739 aPos.Y()+5*fy.GetNumerator()/fy.GetDenominator() ), 740 Size( METABUTTON_WIDTH*fx.GetNumerator()/fx.GetDenominator(), 741 METABUTTON_HEIGHT*fy.GetNumerator()/fy.GetDenominator() ) ) ); 742 } 743 744 { 745 const Rectangle aRectMetaButtonPixel( LogicToPixel( aRectMetaButton ) ); 746 mpMenuButton->SetPosSizePixel( aRectMetaButtonPixel.Left(), 747 aRectMetaButtonPixel.Top(), 748 aRectMetaButtonPixel.GetWidth(), 749 aRectMetaButtonPixel.GetHeight() ); 750 } 751 } 752 753 void SwSidebarWin::SetSizePixel( const Size& rNewSize ) 754 { 755 Window::SetSizePixel(rNewSize); 756 757 if (mpShadow) 758 { 759 Point aStart = EditWin()->PixelToLogic(GetPosPixel()+Point(0,GetSizePixel().Height())); 760 Point aEnd = EditWin()->PixelToLogic(GetPosPixel()+Point(GetSizePixel().Width()-1,GetSizePixel().Height())); 761 mpShadow->SetPosition(basegfx::B2DPoint(aStart.X(),aStart.Y()), basegfx::B2DPoint(aEnd.X(),aEnd.Y())); 762 } 763 } 764 765 void SwSidebarWin::SetScrollbar() 766 { 767 mpVScrollbar->SetThumbPos( mpOutlinerView->GetVisArea().Top()+ mpOutlinerView->GetEditView().GetCursor()->GetOffsetY()); 768 } 769 770 void SwSidebarWin::ResizeIfNeccessary(long aOldHeight, long aNewHeight) 771 { 772 if (aOldHeight != aNewHeight) 773 { 774 //check for lower border or next note 775 long aBorder = mrMgr.GetNextBorder(); 776 if (aBorder != -1) 777 { 778 if (aNewHeight > GetMinimumSizeWithoutMeta()) 779 { 780 long aNewLowerValue = GetPosPixel().Y() + aNewHeight + GetMetaHeight(); 781 if (aNewLowerValue < aBorder) 782 SetSizePixel(Size(GetSizePixel().Width(),aNewHeight+GetMetaHeight())); 783 else 784 SetSizePixel(Size(GetSizePixel().Width(),aBorder - GetPosPixel().Y())); 785 DoResize(); 786 Invalidate(); 787 } 788 else 789 { 790 if (GetSizePixel().Height() != GetMinimumSizeWithoutMeta() + GetMetaHeight()) 791 SetSizePixel(Size(GetSizePixel().Width(),GetMinimumSizeWithoutMeta() + GetMetaHeight())); 792 DoResize(); 793 Invalidate(); 794 } 795 } 796 else 797 { 798 DoResize(); 799 Invalidate(); 800 } 801 } 802 else 803 { 804 SetScrollbar(); 805 } 806 } 807 808 void SwSidebarWin::SetColor(Color aColorDark,Color aColorLight, Color aColorAnchor) 809 { 810 mColorDark = aColorDark; 811 mColorLight = aColorLight; 812 mColorAnchor = aColorAnchor; 813 814 if ( !Application::GetSettings().GetStyleSettings().GetHighContrastMode() ) 815 { 816 { 817 mpMetadataAuthor->SetControlBackground(mColorDark); 818 AllSettings aSettings = mpMetadataAuthor->GetSettings(); 819 StyleSettings aStyleSettings = aSettings.GetStyleSettings(); 820 aStyleSettings.SetFieldTextColor(aColorAnchor); 821 aSettings.SetStyleSettings(aStyleSettings); 822 mpMetadataAuthor->SetSettings(aSettings); 823 } 824 825 { 826 mpMetadataDate->SetControlBackground(mColorDark); 827 AllSettings aSettings = mpMetadataDate->GetSettings(); 828 StyleSettings aStyleSettings = aSettings.GetStyleSettings(); 829 aStyleSettings.SetFieldTextColor(aColorAnchor); 830 aSettings.SetStyleSettings(aStyleSettings); 831 mpMetadataDate->SetSettings(aSettings); 832 } 833 834 AllSettings aSettings2 = mpVScrollbar->GetSettings(); 835 StyleSettings aStyleSettings2 = aSettings2.GetStyleSettings(); 836 aStyleSettings2.SetButtonTextColor(Color(0,0,0)); 837 aStyleSettings2.SetCheckedColor(mColorLight); //hintergund 838 aStyleSettings2.SetShadowColor(mColorAnchor); 839 aStyleSettings2.SetFaceColor(mColorDark); 840 aSettings2.SetStyleSettings(aStyleSettings2); 841 mpVScrollbar->SetSettings(aSettings2); 842 } 843 } 844 845 void SwSidebarWin::SetSidebarPosition(sw::sidebarwindows::SidebarPosition eSidebarPosition) 846 { 847 meSidebarPosition = eSidebarPosition; 848 } 849 850 void SwSidebarWin::SetReadonly(sal_Bool bSet) 851 { 852 mbReadonly = bSet; 853 GetOutlinerView()->SetReadOnly(bSet); 854 } 855 856 void SwSidebarWin::SetLanguage(const SvxLanguageItem aNewItem) 857 { 858 Link pLink = Engine()->GetModifyHdl(); 859 Engine()->SetModifyHdl( Link() ); 860 ESelection aOld = GetOutlinerView()->GetSelection(); 861 862 ESelection aNewSelection( 0, 0, (sal_uInt16)Engine()->GetParagraphCount()-1, USHRT_MAX ); 863 GetOutlinerView()->SetSelection( aNewSelection ); 864 SfxItemSet aEditAttr(GetOutlinerView()->GetAttribs()); 865 aEditAttr.Put(aNewItem); 866 GetOutlinerView()->SetAttribs( aEditAttr ); 867 868 GetOutlinerView()->SetSelection(aOld); 869 Engine()->SetModifyHdl( pLink ); 870 871 const SwViewOption* pVOpt = mrView.GetWrtShellPtr()->GetViewOptions(); 872 sal_uLong nCntrl = Engine()->GetControlWord(); 873 // turn off 874 if (!pVOpt->IsOnlineSpell()) 875 nCntrl &= ~EE_CNTRL_ONLINESPELLING; 876 else 877 nCntrl &= ~EE_CNTRL_ONLINESPELLING; 878 Engine()->SetControlWord(nCntrl); 879 880 //turn back on 881 if (pVOpt->IsOnlineSpell()) 882 nCntrl |= EE_CNTRL_ONLINESPELLING; 883 else 884 nCntrl &= ~EE_CNTRL_ONLINESPELLING; 885 Engine()->SetControlWord(nCntrl); 886 887 Engine()->CompleteOnlineSpelling(); 888 Invalidate(); 889 } 890 891 void SwSidebarWin::DataChanged( const DataChangedEvent& aEvent) 892 { 893 Window::DataChanged( aEvent ); 894 } 895 896 void SwSidebarWin::GetFocus() 897 { 898 if (mpSidebarTxtControl) 899 mpSidebarTxtControl->GrabFocus(); 900 } 901 902 void SwSidebarWin::LoseFocus() 903 { 904 } 905 906 void SwSidebarWin::ShowNote() 907 { 908 SetPosAndSize(); 909 if (!IsVisible()) 910 Window::Show(); 911 if (mpShadow && !mpShadow->isVisible()) 912 mpShadow->setVisible(true); 913 if (mpAnchor && !mpAnchor->isVisible()) 914 mpAnchor->setVisible(true); 915 } 916 917 void SwSidebarWin::HideNote() 918 { 919 if (IsVisible()) 920 Window::Hide(); 921 if (mpAnchor) 922 { 923 if (mrMgr.IsShowAnchor()) 924 mpAnchor->SetAnchorState(AS_TRI); 925 else 926 mpAnchor->setVisible(false); 927 } 928 if (mpShadow && mpShadow->isVisible()) 929 mpShadow->setVisible(false); 930 } 931 932 void SwSidebarWin::ActivatePostIt() 933 { 934 mrMgr.AssureStdModeAtShell(); 935 936 mpOutliner->ClearModifyFlag(); 937 mpOutliner->GetUndoManager().Clear(); 938 939 CheckMetaText(); 940 SetViewState(VS_EDIT); 941 GetOutlinerView()->ShowCursor(); 942 943 mpOutlinerView->GetEditView().SetInsertMode(mrView.GetWrtShellPtr()->IsInsMode()); 944 945 if ( !Application::GetSettings().GetStyleSettings().GetHighContrastMode() ) 946 GetOutlinerView()->SetBackgroundColor(mColorDark); 947 } 948 949 void SwSidebarWin::DeactivatePostIt() 950 { 951 // remove selection, #i87073# 952 if (GetOutlinerView()->GetEditView().HasSelection()) 953 { 954 ESelection aSelection = GetOutlinerView()->GetEditView().GetSelection(); 955 aSelection.nEndPara = aSelection.nStartPara; 956 aSelection.nEndPos = aSelection.nStartPos; 957 GetOutlinerView()->GetEditView().SetSelection(aSelection); 958 } 959 960 mpOutliner->CompleteOnlineSpelling(); 961 962 SetViewState(VS_NORMAL); 963 // write the visible text back into the SwField 964 UpdateData(); 965 966 if ( !Application::GetSettings().GetStyleSettings().GetHighContrastMode() ) 967 GetOutlinerView()->SetBackgroundColor(COL_TRANSPARENT); 968 969 970 if ( !IsProtected() && 971 Engine()->GetEditEngine().GetText()==String(EMPTYSTRING) ) 972 { 973 mnEventId = Application::PostUserEvent( LINK( this, SwSidebarWin, DeleteHdl), 0 ); 974 } 975 } 976 977 void SwSidebarWin::ToggleInsMode() 978 { 979 if (!mrView.GetWrtShell().IsRedlineOn()) 980 { 981 //change outliner 982 mpOutlinerView->GetEditView().SetInsertMode(!mpOutlinerView->GetEditView().IsInsertMode()); 983 //change documnet 984 mrView.GetWrtShell().ToggleInsMode(); 985 //update statusbar 986 SfxBindings &rBnd = mrView.GetViewFrame()->GetBindings(); 987 rBnd.Invalidate(SID_ATTR_INSERT); 988 rBnd.Update(SID_ATTR_INSERT); 989 } 990 } 991 992 void SwSidebarWin::ExecuteCommand(sal_uInt16 nSlot) 993 { 994 mrMgr.AssureStdModeAtShell(); 995 996 switch (nSlot) 997 { 998 case FN_POSTIT: 999 case FN_REPLY: 1000 { 1001 // if this note is empty, it will be deleted once losing the focus, so no reply, but only a new note 1002 // will be created 1003 if (Engine()->GetEditEngine().GetText() != String(EMPTYSTRING)) 1004 { 1005 OutlinerParaObject* pPara = new OutlinerParaObject(*GetOutlinerView()->GetEditView().CreateTextObject()); 1006 mrMgr.RegisterAnswer(pPara); 1007 } 1008 if (mrMgr.HasActiveSidebarWin()) 1009 mrMgr.SetActiveSidebarWin(0); 1010 SwitchToFieldPos(); 1011 mrView.GetViewFrame()->GetDispatcher()->Execute(FN_POSTIT); 1012 break; 1013 } 1014 case FN_DELETE_COMMENT: 1015 1016 //Delete(); // do not kill the parent of our open popup menu 1017 mnEventId = Application::PostUserEvent( LINK( this, SwSidebarWin, DeleteHdl), 0 ); 1018 break; 1019 case FN_DELETE_ALL_NOTES: 1020 case FN_HIDE_ALL_NOTES: 1021 // not possible as slot as this would require that "this" is the active postit 1022 mrView.GetViewFrame()->GetBindings().Execute( nSlot, 0, 0, SFX_CALLMODE_ASYNCHRON ); 1023 break; 1024 case FN_DELETE_NOTE_AUTHOR: 1025 case FN_HIDE_NOTE_AUTHOR: 1026 { 1027 // not possible as slot as this would require that "this" is the active postit 1028 SfxStringItem aItem( nSlot, GetAuthor() ); 1029 const SfxPoolItem* aItems[2]; 1030 aItems[0] = &aItem; 1031 aItems[1] = 0; 1032 mrView.GetViewFrame()->GetBindings().Execute( nSlot, aItems, 0, SFX_CALLMODE_ASYNCHRON ); 1033 } 1034 default: 1035 mrView.GetViewFrame()->GetBindings().Execute( nSlot ); 1036 break; 1037 } 1038 } 1039 1040 SwEditWin* SwSidebarWin::EditWin() 1041 { 1042 return &mrView.GetEditWin(); 1043 } 1044 1045 long SwSidebarWin::GetPostItTextHeight() 1046 { 1047 return mpOutliner ? LogicToPixel(mpOutliner->CalcTextSize()).Height() : 0; 1048 } 1049 1050 void SwSidebarWin::SwitchToPostIt(sal_uInt16 aDirection) 1051 { 1052 SwSidebarWin* pPostIt = mrMgr.GetNextPostIt(aDirection, this); 1053 if (pPostIt) 1054 pPostIt->GrabFocus(); 1055 } 1056 1057 IMPL_LINK( SwSidebarWin, WindowEventListener, VclSimpleEvent*, pEvent ) 1058 { 1059 VclWindowEvent* pWinEvent = dynamic_cast<VclWindowEvent*>(pEvent); 1060 if ( pWinEvent ) 1061 { 1062 if ( pWinEvent->GetId() == VCLEVENT_WINDOW_MOUSEMOVE ) 1063 { 1064 MouseEvent* pMouseEvt = (MouseEvent*)pWinEvent->GetData(); 1065 if ( pMouseEvt->IsEnterWindow() ) 1066 { 1067 mbMouseOver = true; 1068 if ( !HasFocus() ) 1069 { 1070 SetViewState(VS_VIEW); 1071 Invalidate(); 1072 } 1073 } 1074 else if ( pMouseEvt->IsLeaveWindow()) 1075 { 1076 if (IsPreview()) 1077 { 1078 //doLazyDelete(); 1079 } 1080 else 1081 { 1082 mbMouseOver = false; 1083 if ( !HasFocus() ) 1084 { 1085 SetViewState(VS_NORMAL); 1086 Invalidate(); 1087 } 1088 } 1089 } 1090 } 1091 else if ( pWinEvent->GetId() == VCLEVENT_WINDOW_ACTIVATE && 1092 pWinEvent->GetWindow() == mpSidebarTxtControl ) 1093 { 1094 const sal_Bool bLockView = mrView.GetWrtShell().IsViewLocked(); 1095 mrView.GetWrtShell().LockView( sal_True ); 1096 1097 if ( !IsPreview() ) 1098 { 1099 mrMgr.SetActiveSidebarWin( this ); 1100 } 1101 1102 mrView.GetWrtShell().LockView( bLockView ); 1103 mrMgr.MakeVisible( this ); 1104 } 1105 else if ( pWinEvent->GetWindow() == mpSidebarTxtControl ) 1106 { 1107 int i = 5; 1108 ++i; 1109 } 1110 } 1111 return sal_True; 1112 } 1113 1114 void SwSidebarWin::Delete() 1115 { 1116 if ( mrMgr.GetActiveSidebarWin() == this) 1117 { 1118 mrMgr.SetActiveSidebarWin(0); 1119 // if the note is empty, the previous line will send a delete event, but we are already there 1120 if (mnEventId) 1121 { 1122 Application::RemoveUserEvent( mnEventId ); 1123 mnEventId = 0; 1124 } 1125 } 1126 } 1127 1128 IMPL_LINK(SwSidebarWin, ScrollHdl, ScrollBar*, pScroll) 1129 { 1130 long nDiff = GetOutlinerView()->GetEditView().GetVisArea().Top() - pScroll->GetThumbPos(); 1131 GetOutlinerView()->Scroll( 0, nDiff ); 1132 return 0; 1133 } 1134 1135 IMPL_LINK(SwSidebarWin, ModifyHdl, void*, pVoid) 1136 { 1137 // no warnings, please 1138 pVoid=0; 1139 mrView.GetDocShell()->SetModified(sal_True); 1140 return 0; 1141 } 1142 1143 IMPL_LINK(SwSidebarWin, DeleteHdl, void*, pVoid) 1144 { 1145 // no warnings, please 1146 pVoid=0; 1147 mnEventId = 0; 1148 Delete(); 1149 return 0; 1150 } 1151 1152 1153 void SwSidebarWin::ResetAttributes() 1154 { 1155 mpOutlinerView->RemoveAttribsKeepLanguages(sal_True); 1156 mpOutliner->RemoveFields(sal_True); 1157 mpOutlinerView->SetAttribs(DefaultItem()); 1158 } 1159 1160 sal_Int32 SwSidebarWin::GetScrollbarWidth() 1161 { 1162 return mrView.GetWrtShell().GetViewOptions()->GetZoom() / 10; 1163 } 1164 1165 sal_Int32 SwSidebarWin::GetMetaButtonAreaWidth() 1166 { 1167 const Fraction& f( GetMapMode().GetScaleX() ); 1168 if (IsPreview()) 1169 return 3 * METABUTTON_AREA_WIDTH * f.GetNumerator() / f.GetDenominator(); 1170 else 1171 return METABUTTON_AREA_WIDTH * f.GetNumerator() / f.GetDenominator(); 1172 } 1173 1174 sal_Int32 SwSidebarWin::GetMetaHeight() 1175 { 1176 const Fraction& f( GetMapMode().GetScaleY() ); 1177 return POSTIT_META_HEIGHT * f.GetNumerator() / f.GetDenominator(); 1178 } 1179 1180 sal_Int32 SwSidebarWin::GetMinimumSizeWithMeta() 1181 { 1182 return mrMgr.GetMinimumSizeWithMeta(); 1183 } 1184 1185 sal_Int32 SwSidebarWin::GetMinimumSizeWithoutMeta() 1186 { 1187 const Fraction& f( GetMapMode().GetScaleY() ); 1188 return POSTIT_MINIMUMSIZE_WITHOUT_META * f.GetNumerator() / f.GetDenominator(); 1189 } 1190 1191 void SwSidebarWin::SetSpellChecking() 1192 { 1193 const SwViewOption* pVOpt = mrView.GetWrtShellPtr()->GetViewOptions(); 1194 sal_uLong nCntrl = mpOutliner->GetControlWord(); 1195 if (pVOpt->IsOnlineSpell()) 1196 nCntrl |= EE_CNTRL_ONLINESPELLING; 1197 else 1198 nCntrl &= ~EE_CNTRL_ONLINESPELLING; 1199 mpOutliner->SetControlWord(nCntrl); 1200 1201 mpOutliner->CompleteOnlineSpelling(); 1202 Invalidate(); 1203 } 1204 1205 void SwSidebarWin::SetViewState(ViewState bViewState) 1206 { 1207 switch (bViewState) 1208 { 1209 case VS_EDIT: 1210 { 1211 if (mpAnchor) 1212 { 1213 mpAnchor->SetAnchorState(AS_ALL); 1214 SwSidebarWin* pWin = GetTopReplyNote(); 1215 // --> OD 2010-06-03 #i111964# 1216 if ( pWin && pWin->Anchor() ) 1217 // <-- 1218 { 1219 pWin->Anchor()->SetAnchorState(AS_END); 1220 } 1221 mpAnchor->setLineSolid(true); 1222 if ( mpTextRangeOverlay != NULL ) 1223 { 1224 mpTextRangeOverlay->ShowSolidBorder(); 1225 } 1226 } 1227 if (mpShadow) 1228 mpShadow->SetShadowState(SS_EDIT); 1229 break; 1230 } 1231 case VS_VIEW: 1232 { 1233 if (mpAnchor) 1234 { 1235 mpAnchor->setLineSolid(true); 1236 if ( mpTextRangeOverlay != NULL ) 1237 { 1238 mpTextRangeOverlay->ShowSolidBorder(); 1239 } 1240 } 1241 if (mpShadow) 1242 mpShadow->SetShadowState(SS_VIEW); 1243 break; 1244 } 1245 case VS_NORMAL: 1246 { 1247 if (mpAnchor) 1248 { 1249 if (IsFollow()) 1250 { 1251 // if there is no visible parent note, we want to see the complete anchor ?? 1252 //if (IsAnyStackParentVisible()) 1253 mpAnchor->SetAnchorState(AS_END); 1254 SwSidebarWin* pTopWinSelf = GetTopReplyNote(); 1255 SwSidebarWin* pTopWinActive = mrMgr.HasActiveSidebarWin() 1256 ? mrMgr.GetActiveSidebarWin()->GetTopReplyNote() 1257 : 0; 1258 if ( pTopWinSelf && ( pTopWinSelf != pTopWinActive ) && 1259 pTopWinSelf->Anchor() ) 1260 { 1261 if ( pTopWinSelf != mrMgr.GetActiveSidebarWin() ) 1262 { 1263 pTopWinSelf->Anchor()->setLineSolid(false); 1264 if ( pTopWinSelf->TextRange() != NULL ) 1265 { 1266 pTopWinSelf->TextRange()->HideSolidBorder(); 1267 } 1268 } 1269 pTopWinSelf->Anchor()->SetAnchorState(AS_ALL); 1270 } 1271 } 1272 mpAnchor->setLineSolid(false); 1273 if ( mpTextRangeOverlay != NULL ) 1274 { 1275 mpTextRangeOverlay->HideSolidBorder(); 1276 } 1277 } 1278 if ( mpShadow ) 1279 { 1280 mpShadow->SetShadowState(SS_NORMAL); 1281 } 1282 break; 1283 } 1284 } 1285 } 1286 1287 SwSidebarWin* SwSidebarWin::GetTopReplyNote() 1288 { 1289 SwSidebarWin* pTopNote = 0; 1290 SwSidebarWin* pSidebarWin = IsFollow() ? mrMgr.GetNextPostIt(KEY_PAGEUP, this) : 0; 1291 while (pSidebarWin) 1292 { 1293 pTopNote = pSidebarWin; 1294 pSidebarWin = pSidebarWin->IsFollow() ? mrMgr.GetNextPostIt(KEY_PAGEUP, pSidebarWin) : 0; 1295 } 1296 return pTopNote; 1297 } 1298 1299 void SwSidebarWin::SwitchToFieldPos() 1300 { 1301 if ( mrMgr.GetActiveSidebarWin() == this ) 1302 mrMgr.SetActiveSidebarWin(0); 1303 GotoPos(); 1304 sal_uInt32 aCount = MoveCaret(); 1305 if (aCount) 1306 mrView.GetDocShell()->GetWrtShell()->SwCrsrShell::Right(aCount, 0, sal_False); 1307 GrabFocusToDocument(); 1308 } 1309 1310 SvxLanguageItem SwSidebarWin::GetLanguage(void) 1311 { 1312 return SvxLanguageItem(SwLangHelper::GetLanguage(mrView.GetWrtShell(),RES_CHRATR_LANGUAGE),RES_CHRATR_LANGUAGE); 1313 } 1314 1315 void SwSidebarWin::SetChangeTracking( const SwPostItHelper::SwLayoutStatus aLayoutStatus, 1316 const Color& aChangeColor ) 1317 { 1318 if ( (mLayoutStatus != aLayoutStatus) || 1319 (mChangeColor != aChangeColor) ) 1320 { 1321 mLayoutStatus = aLayoutStatus; 1322 mChangeColor = aChangeColor; 1323 Invalidate(); 1324 } 1325 } 1326 1327 bool SwSidebarWin::HasScrollbar() const 1328 { 1329 return mpVScrollbar != 0; 1330 } 1331 1332 bool SwSidebarWin::IsScrollbarVisible() const 1333 { 1334 return HasScrollbar() && mpVScrollbar->IsVisible(); 1335 } 1336 1337 void SwSidebarWin::ChangeSidebarItem( SwSidebarItem& rSidebarItem ) 1338 { 1339 const bool bAnchorChanged = mpAnchorFrm != rSidebarItem.maLayoutInfo.mpAnchorFrm; 1340 if ( bAnchorChanged ) 1341 { 1342 mrMgr.DisconnectSidebarWinFromFrm( *(mpAnchorFrm), *this ); 1343 } 1344 1345 mrSidebarItem = rSidebarItem; 1346 mpAnchorFrm = mrSidebarItem.maLayoutInfo.mpAnchorFrm; 1347 1348 if ( GetWindowPeer() ) 1349 { 1350 SidebarWinAccessible* pAcc = 1351 static_cast<SidebarWinAccessible*>( GetWindowPeer() ); 1352 ASSERT( dynamic_cast<SidebarWinAccessible*>( GetWindowPeer() ), 1353 "<SwSidebarWin::ChangeSidebarItem(..)> - unexpected type of window peer -> crash possible!" ); 1354 pAcc->ChangeSidebarItem( mrSidebarItem ); 1355 } 1356 1357 if ( bAnchorChanged ) 1358 { 1359 mrMgr.ConnectSidebarWinToFrm( *(mrSidebarItem.maLayoutInfo.mpAnchorFrm), 1360 mrSidebarItem.GetFmtFld(), 1361 *this ); 1362 } 1363 } 1364 1365 css::uno::Reference< css::accessibility::XAccessible > SwSidebarWin::CreateAccessible() 1366 { 1367 SidebarWinAccessible* pAcc( new SidebarWinAccessible( *this, 1368 mrView.GetWrtShell(), 1369 mrSidebarItem ) ); 1370 css::uno::Reference< css::awt::XWindowPeer > xWinPeer( pAcc ); 1371 SetWindowPeer( xWinPeer, pAcc ); 1372 1373 css::uno::Reference< css::accessibility::XAccessible > xAcc( xWinPeer, css::uno::UNO_QUERY ); 1374 return xAcc; 1375 } 1376 1377 } } // eof of namespace sw::sidebarwindows 1378 1379 /********** SwRedComment**************/ 1380 /* 1381 SwRedComment::SwRedComment( Window* pParent, WinBits nBits,SwPostItMgr* aMgr,SwPostItBits aBits,SwRedline* pRed) 1382 : SwSidebarWin(pParent,nBits,aMgr,aBits), 1383 pRedline(pRed) 1384 { 1385 } 1386 1387 void SwRedComment::SetPopup() 1388 { 1389 mpButtonPopup = new PopupMenu(SW_RES(MN_REDCOMMENT_BUTTON)); 1390 //mpButtonPopup->SetMenuFlags(MENU_FLAG_ALWAYSSHOWDISABLEDENTRIES); 1391 } 1392 1393 void SwRedComment::UpdateData() 1394 { 1395 if ( Engine()->IsModified() ) 1396 { 1397 // so we get a new layout of notes (Anchor position is still the same and we would otherwise not get one) 1398 Mgr()->SetLayout(); 1399 // SetRedline is calling SetModified already 1400 DocView()->GetWrtShell().SetRedlineComment(Engine()->GetEditEngine().GetText()); 1401 } 1402 Engine()->ClearModifyFlag(); 1403 Engine()->GetUndoManager().Clear(); 1404 } 1405 1406 void SwRedComment::SetPostItText() 1407 { 1408 Engine()->SetModifyHdl( Link() ); 1409 Engine()->EnableUndo( sal_False ); 1410 1411 Engine()->Clear(); 1412 View()->SetAttribs(DefaultItem()); 1413 View()->InsertText(pRedline->GetComment(),false); 1414 1415 Engine()->ClearModifyFlag(); 1416 Engine()->GetUndoManager().Clear(); 1417 Engine()->EnableUndo( sal_True ); 1418 Engine()->SetModifyHdl( LINK( this, SwSidebarWin, ModifyHdl ) ); 1419 Invalidate(); 1420 } 1421 1422 void SwRedComment::DeactivatePostIt() 1423 { 1424 SwSidebarWin::DeactivatePostIt(); 1425 // current Redline is still selected 1426 DocView()->GetWrtShellPtr()->ClearMark(); 1427 } 1428 1429 void SwRedComment::ActivatePostIt() 1430 { 1431 SwSidebarWin::ActivatePostIt(); 1432 1433 // do we want the redline selected? 1434 // otherwise, SwRedComment::ActivatePostIt() as well as SwRedComment::DeactivatePostIt() 1435 // can be thrown out completly 1436 DocView()->GetDocShell()->GetWrtShell()->GotoRedline( 1437 DocView()->GetDocShell()->GetWrtShell()->FindRedlineOfData(pRedline->GetRedlineData()),true); 1438 } 1439 1440 void SwRedComment::MouseButtonDown( const MouseEvent& rMEvt ) 1441 { 1442 if (mRectMetaButton.IsInside(PixelToLogic(rMEvt.GetPosPixel())) && rMEvt.IsLeft()) 1443 { 1444 ExecuteCommand( mpButtonPopup->Execute( this,Rectangle(LogicToPixel(mRectMetaButton.BottomLeft()),LogicToPixel(mRectMetaButton.BottomLeft())),POPUPMENU_EXECUTE_DOWN | POPUPMENU_NOMOUSEUPCLOSE) ); 1445 } 1446 } 1447 1448 void SwRedComment::Delete() 1449 { 1450 SwSidebarWin::Delete(); 1451 // we are not necessarily on our redline, so let's move there 1452 GotoPos(); 1453 DocView()->GetWrtShell().SetRedlineComment(EMPTYSTRING); 1454 DocView()->GetWrtShell().ClearMark(); 1455 // so we get a new layout of notes (Anchor position is still the same and we would otherwise not get one) 1456 Mgr()->SetLayout(); 1457 Mgr()->RemoveItem(pRedline); 1458 } 1459 1460 void SwRedComment::GotoPos() 1461 { 1462 DocView()->GetDocShell()->GetWrtShell()->GotoRedline( 1463 DocView()->GetDocShell()->GetWrtShell()->FindRedlineOfData(pRedline->GetRedlineData())); 1464 } 1465 1466 String SwRedComment::GetAuthor() 1467 { 1468 return pRedline->GetAuthorString(); 1469 } 1470 1471 Date SwRedComment::GetDate() 1472 { 1473 return pRedline->GetTimeStamp().GetDate(); 1474 } 1475 1476 Time SwRedComment::GetTime() 1477 { 1478 return pRedline->GetTimeStamp().GetTime(); 1479 } 1480 1481 bool SwRedComment::IsProtected() 1482 { 1483 return SwSidebarWin::IsProtected() || pRedline->Start()->nNode.GetNode().GetTxtNode()->IsInProtectSect(); 1484 } 1485 */ 1486