/************************************************************************* * * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * Copyright 2008 by Sun Microsystems, Inc. * * OpenOffice.org - a multi-platform office productivity suite * * $RCSfile: postit.cxx,v $ * $Revision: 1.8.42.11 $ * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 3 * only, as published by the Free Software Foundation. * * OpenOffice.org is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License version 3 for more details * (a copy is included in the LICENSE file that accompanied this code). * * You should have received a copy of the GNU Lesser General Public License * version 3 along with OpenOffice.org. If not, see * * for a copy of the LGPLv3 License. * ************************************************************************/ #include "precompiled_sd.hxx" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //EditEngine flags #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // FRound #include #include #include #include #include "annotations.hrc" #include "annotationwindow.hxx" #include "annotationmanagerimpl.hxx" #include "DrawDocShell.hxx" #include "ViewShell.hxx" #include "drawdoc.hxx" #include "View.hxx" #include "textapi.hxx" #include "sdresid.hxx" using rtl::OUString; using namespace ::sd; using namespace ::com::sun::star; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::office; using namespace ::com::sun::star::text; #define METABUTTON_WIDTH 16 #define METABUTTON_HEIGHT 18 #define METABUTTON_AREA_WIDTH 30 #define POSTIT_META_HEIGHT (sal_Int32) 30 #define EMPTYSTRING rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("")) namespace sd { extern OUString getAnnotationDateTimeString( const Reference< XAnnotation >& xAnnotation ); extern SfxItemPool* GetAnnotationPool(); extern com::sun::star::util::DateTime getCurrentDateTime(); Color ColorFromAlphaColor(UINT8 aTransparency, Color &aFront, Color &aBack ) { return Color((UINT8)(aFront.GetRed() * aTransparency/(double)255 + aBack.GetRed() * (1-aTransparency/(double)255)), (UINT8)(aFront.GetGreen() * aTransparency/(double)255 + aBack.GetGreen() * (1-aTransparency/(double)255)), (UINT8)(aFront.GetBlue() * aTransparency/(double)255 + aBack.GetBlue() * (1-aTransparency/(double)255))); } /************ AnnotationTextWindow **********************************/ AnnotationTextWindow::AnnotationTextWindow( AnnotationWindow* pParent, WinBits nBits ) : Control(pParent, nBits) , mpOutlinerView(0) , mpAnnotationWindow( pParent ) { } AnnotationTextWindow::~AnnotationTextWindow() { } void AnnotationTextWindow::Paint( const Rectangle& rRect) { if ( !Application::GetSettings().GetStyleSettings().GetHighContrastMode() ) { DrawGradient(Rectangle(Point(0,0),PixelToLogic(GetSizePixel())), Gradient(GRADIENT_LINEAR,mpAnnotationWindow->maColorLight,mpAnnotationWindow->maColor)); } if( mpOutlinerView ) mpOutlinerView->Paint( rRect ); } void AnnotationTextWindow::KeyInput( const KeyEvent& rKeyEvt ) { const KeyCode& rKeyCode = rKeyEvt.GetKeyCode(); USHORT nKey = rKeyCode.GetCode(); if ((rKeyCode.IsMod1() && rKeyCode.IsMod2()) && ((nKey == KEY_PAGEUP) || (nKey == KEY_PAGEDOWN))) { SfxDispatcher* pDispatcher = mpAnnotationWindow->DocShell()->GetViewShell()->GetViewFrame()->GetDispatcher(); if( pDispatcher ) pDispatcher->Execute( nKey == KEY_PAGEDOWN ? SID_NEXT_POSTIT : SID_PREVIOUS_POSTIT ); } else if (nKey == KEY_INSERT) { if (!rKeyCode.IsMod1() && !rKeyCode.IsMod2()) mpAnnotationWindow->ToggleInsMode(); } else { long aOldHeight = mpAnnotationWindow->GetPostItTextHeight(); bool bDone = false; /// HACK: need to switch off processing of Undo/Redo in Outliner if ( !( (nKey == KEY_Z || nKey == KEY_Y) && rKeyCode.IsMod1()) ) { bool bIsProtected = mpAnnotationWindow->IsProtected(); if (!bIsProtected || (bIsProtected && !mpAnnotationWindow->Engine()->GetEditEngine().DoesKeyChangeText(rKeyEvt)) ) bDone = mpOutlinerView->PostKeyEvent( rKeyEvt ); } if (bDone) { mpAnnotationWindow->ResizeIfNeccessary(aOldHeight,mpAnnotationWindow->GetPostItTextHeight()); } else { Control::KeyInput(rKeyEvt); } } } void AnnotationTextWindow::MouseMove( const MouseEvent& rMEvt ) { if ( mpOutlinerView ) { mpOutlinerView->MouseMove( rMEvt ); SetPointer( mpOutlinerView->GetPointer( rMEvt.GetPosPixel() ) ); } } void AnnotationTextWindow::MouseButtonDown( const MouseEvent& rMEvt ) { GrabFocus(); if ( mpOutlinerView ) mpOutlinerView->MouseButtonDown( rMEvt ); // todo mpOutlinerView->DocView()->GetViewFrame()->GetBindings().InvalidateAll(FALSE); } void AnnotationTextWindow::MouseButtonUp( const MouseEvent& rMEvt ) { if ( mpOutlinerView ) mpOutlinerView->MouseButtonUp( rMEvt ); } void AnnotationTextWindow::Command( const CommandEvent& rCEvt ) { if ( rCEvt.GetCommand() == COMMAND_CONTEXTMENU ) { mpAnnotationWindow->Command(rCEvt); } else { if ( mpOutlinerView ) mpOutlinerView->Command( rCEvt ); else Window::Command(rCEvt); } } void AnnotationTextWindow::GetFocus() { Window::GetFocus(); } void AnnotationTextWindow::LoseFocus() { // if ( mpAnnotationWindow ) // mpAnnotationWindow->UpdateAnnotation(); Window::LoseFocus(); } XubString AnnotationTextWindow::GetSurroundingText() const { if( mpOutlinerView ) { EditEngine *aEditEngine = mpOutlinerView->GetEditView().GetEditEngine(); if( mpOutlinerView->HasSelection() ) return mpOutlinerView->GetSelected(); else { ESelection aSelection = mpOutlinerView->GetEditView().GetSelection(); XubString aStr = aEditEngine->GetText(aSelection.nStartPara); return aStr; } } else return XubString::EmptyString(); } Selection AnnotationTextWindow::GetSurroundingTextSelection() const { if( mpOutlinerView ) { if( mpOutlinerView->HasSelection() ) return Selection( 0, mpOutlinerView->GetSelected().Len() ); else { ESelection aSelection = mpOutlinerView->GetEditView().GetSelection(); return Selection( aSelection.nStartPos, aSelection.nEndPos ); } } else return Selection( 0, 0 ); } /************** AnnotationWindow***********************************++*/ AnnotationWindow::AnnotationWindow( AnnotationManagerImpl& rManager, DrawDocShell* pDocShell, Window* pParent ) : FloatingWindow(pParent, WB_SYSTEMWINDOW|WB_BORDER|WB_NEEDSFOCUS) , mrManager( rManager ) , mpDocShell( pDocShell ) , mpView( pDocShell->GetViewShell()->GetView() ) , mpDoc( pDocShell->GetDoc() ) , mpOutlinerView(0) , mpOutliner(0) , mpVScrollbar(0) , mbReadonly(pDocShell->IsReadOnly()) , mbProtected(false) , mbMouseOverButton(false) , mpTextWindow(0) , mpMeta(0) { } AnnotationWindow::~AnnotationWindow() { delete mpMeta; delete mpOutlinerView; delete mpOutliner; delete mpVScrollbar; delete mpTextWindow; } void AnnotationWindow::InitControls() { // actual window which holds the user text mpTextWindow = new AnnotationTextWindow(this, WB_NODIALOGCONTROL); mpTextWindow->SetPointer(Pointer(POINTER_TEXT)); // window control for author and date mpMeta = new MultiLineEdit(this,0); mpMeta->SetReadOnly(); mpMeta->SetRightToLeft(Application::GetSettings().GetLayoutRTL()); mpMeta->AlwaysDisableInput(true); mpMeta->SetCallHandlersOnInputDisabled(true); // mpMeta->AddEventListener( LINK( mpPostItTxt, PostItTxt, WindowEventListener ) ); // AddEventListener( LINK( mpTextWindow, PostItTxt, WindowEventListener ) ); // we should leave this setting alone, but for this we need a better layout algo // with variable meta size height AllSettings aSettings = mpMeta->GetSettings(); StyleSettings aStyleSettings = aSettings.GetStyleSettings(); Font aFont = aStyleSettings.GetFieldFont(); aFont.SetHeight(8); aStyleSettings.SetFieldFont(aFont); aSettings.SetStyleSettings(aStyleSettings); mpMeta->SetSettings(aSettings); mpOutliner = new ::Outliner(GetAnnotationPool(),OUTLINERMODE_TEXTOBJECT); Doc()->SetCalcFieldValueHdl( mpOutliner ); mpOutliner->SetUpdateMode( TRUE ); Rescale(); OutputDevice* pDev = Doc()->GetRefDevice(); if( pDev ) { mpOutliner->SetRefDevice( pDev ); } mpOutlinerView = new OutlinerView ( mpOutliner, mpTextWindow ); mpOutliner->InsertView(mpOutlinerView ); mpTextWindow->SetOutlinerView(mpOutlinerView); mpOutlinerView->SetOutputArea( PixelToLogic( Rectangle(0,0,1,1) ) ); // SfxItemSet item(DocShell()->GetPool()); // item.Put(SvxFontHeightItem(352,100,EE_CHAR_FONTHEIGHT)); // mpOutlinerView->SetAttribs(item); // TODO: ?? EEHorizontalTextDirection aDefHoriTextDir = Application::GetSettings().GetLayoutRTL() ? EE_HTEXTDIR_R2L : EE_HTEXTDIR_L2R; mpOutliner->SetDefaultHorizontalTextDirection( aDefHoriTextDir ); //create Scrollbars mpVScrollbar = new ScrollBar(this, WB_3DLOOK |WB_VSCROLL|WB_DRAG); mpVScrollbar->EnableNativeWidget(false); mpVScrollbar->EnableRTL( false ); mpVScrollbar->SetScrollHdl(LINK(this, AnnotationWindow, ScrollHdl)); mpVScrollbar->EnableDrag(); // mpVScrollbar->AddEventListener( LINK( this, AnnotationWindow, WindowEventListener ) ); ULONG nCntrl = mpOutliner->GetControlWord(); nCntrl |= EE_CNTRL_PASTESPECIAL | EE_CNTRL_AUTOCORRECT | EV_CNTRL_AUTOSCROLL | EE_CNTRL_NOCOLORS; /* if (pVOpt->IsFieldShadings()) nCntrl |= EE_CNTRL_MARKFIELDS; else nCntrl &= ~EE_CNTRL_MARKFIELDS; if (pVOpt->IsOnlineSpell()) nCntrl |= EE_CNTRL_ONLINESPELLING; else nCntrl &= ~EE_CNTRL_ONLINESPELLING; */ mpOutliner->SetControlWord(nCntrl); // mpOutliner->SetFlatMode( TRUE ); Engine()->SetModifyHdl( Link() ); Engine()->EnableUndo( FALSE ); Engine()->ClearModifyFlag(); Engine()->GetUndoManager().Clear(); Engine()->EnableUndo( TRUE ); Engine()->SetModifyHdl( LINK( this, AnnotationWindow, ModifyHdl ) ); Invalidate(); SetLanguage(GetLanguage()); mpMeta->Show(); mpVScrollbar->Show(); mpTextWindow->Show(); } void AnnotationWindow::StartEdit() { getView()->SetSelection(ESelection(0xFFFF,0xFFFF,0xFFFF,0xFFFF)); getView()->ShowCursor(); } void AnnotationWindow::Rescale() { MapMode aMode(MAP_100TH_MM); aMode.SetOrigin( Point() ); //aMode.SetScaleX( aMode.GetScaleX() * Fraction( 8, 10 ) ); //aMode.SetScaleY( aMode.GetScaleY() * Fraction( 8, 10 ) ); mpOutliner->SetRefMapMode( aMode ); SetMapMode( aMode ); mpTextWindow->SetMapMode( aMode ); if ( mpMeta ) { Font aFont( mpMeta->GetSettings().GetStyleSettings().GetFieldFont() ); sal_Int32 nHeight = aFont.GetHeight(); nHeight = nHeight * aMode.GetScaleY().GetNumerator() / aMode.GetScaleY().GetDenominator(); aFont.SetHeight( nHeight ); mpMeta->SetControlFont( aFont ); } } void AnnotationWindow::DoResize() { unsigned long aWidth = GetSizePixel().Width(); long aHeight = GetSizePixel().Height() - POSTIT_META_HEIGHT; mpOutliner->SetPaperSize( PixelToLogic( Size(aWidth,aHeight) ) ) ; long aTextHeight = LogicToPixel( mpOutliner->CalcTextSize()).Height(); if( aTextHeight > aHeight ) { // we need vertical scrollbars and have to reduce the width aWidth -= GetScrollbarWidth(); mpVScrollbar->Show(); } else { mpVScrollbar->Hide(); } mpTextWindow->SetPosSizePixel(0,0,aWidth, aHeight); if( mbReadonly ) mpMeta->SetPosSizePixel(0,aHeight,GetSizePixel().Width(),POSTIT_META_HEIGHT); else mpMeta->SetPosSizePixel(0,aHeight,GetSizePixel().Width()-METABUTTON_AREA_WIDTH,POSTIT_META_HEIGHT); mpOutliner->SetPaperSize( PixelToLogic( Size(aWidth,aHeight) ) ) ; mpOutlinerView->SetOutputArea( PixelToLogic( Rectangle(0,0,aWidth,aHeight) ) ); if (!mpVScrollbar->IsVisible()) { // if we do not have a scrollbar anymore, we want to see the complete text mpOutlinerView->SetVisArea( PixelToLogic( Rectangle(0,0,aWidth,aHeight) ) ); } mpVScrollbar->SetPosSizePixel( 0 + aWidth, 0, GetScrollbarWidth(), aHeight ); mpVScrollbar->SetVisibleSize( PixelToLogic(Size(0,aHeight)).Height() ); mpVScrollbar->SetPageSize( PixelToLogic(Size(0,aHeight)).Height() * 8 / 10 ); mpVScrollbar->SetLineSize( mpOutliner->GetTextHeight() / 10 ); SetScrollbar(); mpVScrollbar->SetRange( Range(0, mpOutliner->GetTextHeight())); Point aPos( mpMeta->GetPosPixel()); Point aBase( aPos.X() + aPos.X() + GetSizePixel().Width(), aPos.Y() ); Point aLeft = PixelToLogic( Point( aBase.X() - (METABUTTON_WIDTH+5), aBase.Y()+17 ) ); Point aRight = PixelToLogic( Point( aBase.X() - (METABUTTON_WIDTH-1), aBase.Y()+17 ) ); Point aBottom = PixelToLogic( Point( aBase.X() - (METABUTTON_WIDTH+2), aBase.Y()+20 ) ); maPopupTriangle.clear(); maPopupTriangle.append(basegfx::B2DPoint(aLeft.X(),aLeft.Y())); maPopupTriangle.append(basegfx::B2DPoint(aRight.X(),aRight.Y())); maPopupTriangle.append(basegfx::B2DPoint(aBottom.X(),aBottom.Y())); maPopupTriangle.setClosed(true); maRectMetaButton = PixelToLogic( Rectangle( Point( aPos.X()+GetSizePixel().Width()-(METABUTTON_WIDTH+10), aPos.Y()+5 ), Size( METABUTTON_WIDTH, METABUTTON_HEIGHT ) ) ); } void AnnotationWindow::SetSizePixel( const Size& rNewSize ) { Window::SetSizePixel(rNewSize); } void AnnotationWindow::SetScrollbar() { mpVScrollbar->SetThumbPos( mpOutlinerView->GetVisArea().Top()+ mpOutlinerView->GetEditView().GetCursor()->GetOffsetY()); } void AnnotationWindow::ResizeIfNeccessary(long aOldHeight, long aNewHeight) { if (aOldHeight != aNewHeight) { DoResize(); Invalidate(); } else { SetScrollbar(); } } void AnnotationWindow::SetReadonly(bool bSet) { mbReadonly = bSet; getView()->SetReadOnly(bSet); } void AnnotationWindow::SetLanguage(const SvxLanguageItem aNewItem) { Engine()->SetModifyHdl( Link() ); ESelection aOld = getView()->GetSelection(); ESelection aNewSelection( 0, 0, (USHORT)Engine()->GetParagraphCount()-1, USHRT_MAX ); getView()->SetSelection( aNewSelection ); SfxItemSet aEditAttr(getView()->GetAttribs()); aEditAttr.Put(aNewItem); getView()->SetAttribs( aEditAttr ); getView()->SetSelection(aOld); Engine()->SetModifyHdl( LINK( this, AnnotationWindow, ModifyHdl ) ); Invalidate(); } void AnnotationWindow::ToggleInsMode() { if( mpOutlinerView ) { SfxBindings &rBnd = mpDocShell->GetViewShell()->GetViewFrame()->GetBindings(); rBnd.Invalidate(SID_ATTR_INSERT); rBnd.Update(SID_ATTR_INSERT); } } long AnnotationWindow::GetPostItTextHeight() { return mpOutliner ? LogicToPixel(mpOutliner->CalcTextSize()).Height() : 0; } IMPL_LINK(AnnotationWindow, ScrollHdl, ScrollBar*, pScroll) { long nDiff = getView()->GetEditView().GetVisArea().Top() - pScroll->GetThumbPos(); getView()->Scroll( 0, nDiff ); return 0; } IMPL_LINK(AnnotationWindow, ModifyHdl, void*, EMPTYARG) { return 0; } sal_Int32 AnnotationWindow::GetScrollbarWidth() { return 16; // return mpView->GetWrtShell().GetViewOptions()->GetZoom() / 10; } SvxLanguageItem AnnotationWindow::GetLanguage(void) { return SvxLanguageItem( Doc()->GetLanguage( EE_CHAR_LANGUAGE ), SID_ATTR_LANGUAGE ); } // -------------------------------------------------------------------- TextApiObject* getTextApiObject( const Reference< XAnnotation >& xAnnotation ) { if( xAnnotation.is() ) { Reference< XText > xText( xAnnotation->getTextRange() ); return TextApiObject::getImplementation( xText ); } return 0; } // -------------------------------------------------------------------- void AnnotationWindow::setAnnotation( const Reference< XAnnotation >& xAnnotation, bool bGrabFocus ) { if( (xAnnotation != mxAnnotation) && xAnnotation.is() ) { mxAnnotation = xAnnotation; SetColor(); SvtUserOptions aUserOptions; mbProtected = aUserOptions.GetFullName() != xAnnotation->getAuthor(); Engine()->Clear(); TextApiObject* pTextApi = getTextApiObject( mxAnnotation ); if( pTextApi ) { std::auto_ptr< OutlinerParaObject > pOPO( pTextApi->CreateText() ); Engine()->SetText( *pOPO.get() ); } Engine()->SetModifyHdl( LINK( this, AnnotationWindow, ModifyHdl ) ); Engine()->ClearModifyFlag(); Engine()->GetUndoManager().Clear(); Invalidate(); OUString sMeta( xAnnotation->getAuthor() ); OUString sDateTime( getAnnotationDateTimeString(xAnnotation) ); if( sDateTime.getLength() != 0 ) { if( sMeta.getLength() != 0 ) sMeta += OUString( RTL_CONSTASCII_USTRINGPARAM( "\n" ) ); sMeta += sDateTime; } mpMeta->SetText(sMeta); if( bGrabFocus ) GrabFocus(); } } void AnnotationWindow::SetColor() { sal_uInt16 nAuthorIdx = mpDoc->GetAnnotationAuthorIndex( mxAnnotation->getAuthor() ); maColor = mrManager.GetColor( nAuthorIdx ); maColorDark = mrManager.GetColorDark( nAuthorIdx ); maColorLight = mrManager.GetColorLight( nAuthorIdx ); mpOutlinerView->SetBackgroundColor(maColor); mpMeta->SetControlBackground(maColor); AllSettings aSettings = mpMeta->GetSettings(); StyleSettings aStyleSettings = aSettings.GetStyleSettings(); aStyleSettings.SetFieldTextColor(maColorDark); aSettings.SetStyleSettings(aStyleSettings); mpMeta->SetSettings(aSettings); AllSettings aSettings2 = mpVScrollbar->GetSettings(); StyleSettings aStyleSettings2 = aSettings2.GetStyleSettings(); aStyleSettings2.SetButtonTextColor(Color(0,0,0)); aStyleSettings2.SetCheckedColor(maColorLight); //hintergund aStyleSettings2.SetShadowColor(maColorDark); aStyleSettings2.SetFaceColor(maColor); aSettings2.SetStyleSettings(aStyleSettings2); mpVScrollbar->SetSettings(aSettings2); } void AnnotationWindow::Deactivate() { Reference< XAnnotation > xAnnotation( mxAnnotation ); /* // check if text is empty Paragraph* p1stPara=Engine()->GetParagraph( 0 ); ULONG nParaAnz=Engine()->GetParagraphCount(); if(p1stPara==NULL) nParaAnz=0; if(nParaAnz==1) { // if it is only one paragraph, check if that paragraph is empty XubString aStr(Engine()->GetText(p1stPara)); if(!aStr.Len()) nParaAnz = 0; } if( nParaAnz == 0 ) { // text is empty, delete postit DeleteAnnotation( xAnnotation ); } else */ { // write changed text back to annotation if ( Engine()->IsModified() ) { TextApiObject* pTextApi = getTextApiObject( xAnnotation ); if( pTextApi ) { OutlinerParaObject* pOPO = Engine()->CreateParaObject(); if( pOPO ) { if( mpDoc->IsUndoEnabled() ) mpDoc->BegUndo( String( SdResId( STR_ANNOTATION_UNDO_EDIT ) ) ); pTextApi->SetText( *pOPO ); delete pOPO; // set current time to changed annotation xAnnotation->setDateTime( getCurrentDateTime() ); if( mpDoc->IsUndoEnabled() ) mpDoc->EndUndo(); DocView()->GetDocSh()->SetModified(sal_True); } } } Engine()->ClearModifyFlag(); } Engine()->GetUndoManager().Clear(); } void AnnotationWindow::Paint( const Rectangle& rRect) { FloatingWindow::Paint( rRect ); if(mpMeta->IsVisible() && !mbReadonly) { //draw left over space if ( Application::GetSettings().GetStyleSettings().GetHighContrastMode() ) SetFillColor(COL_BLACK); else SetFillColor(maColor); SetLineColor(); DrawRect(PixelToLogic(Rectangle(Point(mpMeta->GetPosPixel().X()+mpMeta->GetSizePixel().Width(),mpMeta->GetPosPixel().Y()),Size(METABUTTON_AREA_WIDTH,mpMeta->GetSizePixel().Height())))); if ( Application::GetSettings().GetStyleSettings().GetHighContrastMode()) { //draw rect around button SetFillColor(COL_BLACK); SetLineColor(COL_WHITE); } else { //draw button Gradient aGradient; if (mbMouseOverButton) aGradient = Gradient(GRADIENT_LINEAR,ColorFromAlphaColor(80,maColorDark,maColor),ColorFromAlphaColor(15,maColorDark,maColor)); else aGradient = Gradient(GRADIENT_LINEAR,ColorFromAlphaColor(15,maColorDark,maColor),ColorFromAlphaColor(80,maColorDark,maColor)); DrawGradient(maRectMetaButton,aGradient); //draw rect around button SetFillColor(); SetLineColor(ColorFromAlphaColor(90,maColorDark,maColor)); } DrawRect(maRectMetaButton); //draw arrow if ( Application::GetSettings().GetStyleSettings().GetHighContrastMode() ) SetFillColor(COL_WHITE); else SetFillColor(COL_BLACK); SetLineColor(); DrawPolygon(Polygon(maPopupTriangle)); } } void AnnotationWindow::MouseMove( const MouseEvent& rMEvt ) { if( !mbReadonly ) { if (maRectMetaButton.IsInside(PixelToLogic(rMEvt.GetPosPixel()))) { if (!mbMouseOverButton) { Invalidate(maRectMetaButton); mbMouseOverButton = true; } } else { if (mbMouseOverButton) { Invalidate(maRectMetaButton); mbMouseOverButton = false; } } } } void AnnotationWindow::MouseButtonDown( const MouseEvent& rMEvt ) { if (!mbReadonly && maRectMetaButton.IsInside(PixelToLogic(rMEvt.GetPosPixel())) && rMEvt.IsLeft()) { // context menu Rectangle aRect(LogicToPixel(maRectMetaButton.BottomLeft()),LogicToPixel(maRectMetaButton.BottomLeft())); mrManager.ExecuteAnnotationContextMenu( mxAnnotation, (::Window*)this, aRect, true ); } } void AnnotationWindow::Command( const CommandEvent& rCEvt ) { if ( rCEvt.GetCommand() == COMMAND_CONTEXTMENU ) { mrManager.ExecuteAnnotationContextMenu( mxAnnotation, this, Rectangle(rCEvt.GetMousePosPixel(),Size(1,1)) ); } else { FloatingWindow::Command(rCEvt); } } void AnnotationWindow::GetFocus() { if( mpTextWindow ) mpTextWindow->GrabFocus(); else FloatingWindow::GetFocus(); } void AnnotationWindow::ExecuteSlot( USHORT nSID ) { if( nSID == SID_COPY ) { getView()->Copy(); } else if( nSID == SID_PASTE ) { getView()->PasteSpecial(); DoResize(); } else { SfxItemSet aEditAttr(getView()->GetAttribs()); SfxItemSet aNewAttr(mpOutliner->GetEmptyItemSet()); switch( nSID ) { case SID_ATTR_CHAR_WEIGHT: { FontWeight eFW = ( (const SvxWeightItem&) aEditAttr.Get( EE_CHAR_WEIGHT ) ).GetWeight(); aNewAttr.Put( SvxWeightItem( eFW == WEIGHT_NORMAL ? WEIGHT_BOLD : WEIGHT_NORMAL, EE_CHAR_WEIGHT ) ); } break; case SID_ATTR_CHAR_POSTURE: { FontItalic eFI = ( (const SvxPostureItem&) aEditAttr.Get( EE_CHAR_ITALIC ) ).GetPosture(); aNewAttr.Put( SvxPostureItem( eFI == ITALIC_NORMAL ? ITALIC_NONE : ITALIC_NORMAL, EE_CHAR_ITALIC ) ); } break; case SID_ATTR_CHAR_UNDERLINE: { FontUnderline eFU = ( (const SvxUnderlineItem&) aEditAttr. Get( EE_CHAR_UNDERLINE ) ).GetLineStyle(); aNewAttr.Put( SvxUnderlineItem( eFU == UNDERLINE_SINGLE ? UNDERLINE_NONE : UNDERLINE_SINGLE, EE_CHAR_UNDERLINE ) ); } break; case SID_ATTR_CHAR_STRIKEOUT: { FontStrikeout eFSO = ( ( (const SvxCrossedOutItem&) aEditAttr.Get( EE_CHAR_STRIKEOUT ) ).GetStrikeout() ); aNewAttr.Put( SvxCrossedOutItem( eFSO == STRIKEOUT_SINGLE ? STRIKEOUT_NONE : STRIKEOUT_SINGLE, EE_CHAR_STRIKEOUT ) ); } break; } getView()->SetAttribs( aNewAttr ); } } }