/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ #include "precompiled_sw.hxx" #include #include #include #include #include #include #include #include #include #include #include namespace sw { namespace annotation { Color ColorFromAlphaColor( const sal_uInt8 aTransparency, const Color &aFront, const Color &aBack ) { return Color((sal_uInt8)(aFront.GetRed() * aTransparency/(double)255 + aBack.GetRed() * (1-aTransparency/(double)255)), (sal_uInt8)(aFront.GetGreen() * aTransparency/(double)255 + aBack.GetGreen() * (1-aTransparency/(double)255)), (sal_uInt8)(aFront.GetBlue() * aTransparency/(double)255 + aBack.GetBlue() * (1-aTransparency/(double)255))); } AnnotationMenuButton::AnnotationMenuButton( sw::sidebarwindows::SwSidebarWin& rSidebarWin ) : MenuButton( &rSidebarWin ) , mrSidebarWin( rSidebarWin ) { AddEventListener( LINK( &mrSidebarWin, sw::sidebarwindows::SwSidebarWin, WindowEventListener ) ); SetAccessibleName( SW_RES( STR_ACCESS_ANNOTATION_BUTTON_NAME ) ); SetAccessibleDescription( SW_RES( STR_ACCESS_ANNOTATION_BUTTON_DESC ) ); SetQuickHelpText( GetAccessibleDescription() ); } AnnotationMenuButton::~AnnotationMenuButton() { RemoveEventListener( LINK( &mrSidebarWin, sw::sidebarwindows::SwSidebarWin, WindowEventListener ) ); } void AnnotationMenuButton::Select() { mrSidebarWin.ExecuteCommand( GetCurItemId() ); } void AnnotationMenuButton::MouseButtonDown( const MouseEvent& rMEvt ) { PopupMenu* pButtonPopup( GetPopupMenu() ); if ( mrSidebarWin.IsReadOnly() ) { pButtonPopup->EnableItem( FN_REPLY, false ); pButtonPopup->EnableItem( FN_DELETE_COMMENT, false ); pButtonPopup->EnableItem( FN_DELETE_NOTE_AUTHOR, false ); pButtonPopup->EnableItem( FN_DELETE_ALL_NOTES, false ); } else { pButtonPopup->EnableItem( FN_DELETE_COMMENT, !mrSidebarWin.IsProtected() ); pButtonPopup->EnableItem( FN_DELETE_NOTE_AUTHOR, true ); pButtonPopup->EnableItem( FN_DELETE_ALL_NOTES, true ); } if ( mrSidebarWin.IsProtected() ) { pButtonPopup->EnableItem( FN_REPLY, false ); } else { SvtUserOptions aUserOpt; String sAuthor; if ( !(sAuthor = aUserOpt.GetFullName()).Len() ) { if ( !(sAuthor = aUserOpt.GetID()).Len() ) { sAuthor = String( SW_RES( STR_REDLINE_UNKNOWN_AUTHOR )); } } // do not allow to reply to ourself and no answer possible if this note is in a protected section if ( sAuthor == mrSidebarWin.GetAuthor() ) { pButtonPopup->EnableItem( FN_REPLY, false ); } else { pButtonPopup->EnableItem( FN_REPLY, true ); } } MenuButton::MouseButtonDown( rMEvt ); } void AnnotationMenuButton::Paint( const Rectangle& /*rRect*/ ) { if ( Application::GetSettings().GetStyleSettings().GetHighContrastMode() ) SetFillColor(COL_BLACK); else SetFillColor( mrSidebarWin.ColorDark() ); SetLineColor(); const Rectangle aRect( Rectangle( Point( 0, 0 ), PixelToLogic( GetSizePixel() ) ) ); DrawRect( aRect ); if ( Application::GetSettings().GetStyleSettings().GetHighContrastMode()) { //draw rect around button SetFillColor(COL_BLACK); SetLineColor(COL_WHITE); } else { //draw button Gradient aGradient; if ( IsMouseOver() ) aGradient = Gradient( GRADIENT_LINEAR, ColorFromAlphaColor( 80, mrSidebarWin.ColorAnchor(), mrSidebarWin.ColorDark() ), ColorFromAlphaColor( 15, mrSidebarWin.ColorAnchor(), mrSidebarWin.ColorDark() )); else aGradient = Gradient( GRADIENT_LINEAR, ColorFromAlphaColor( 15, mrSidebarWin.ColorAnchor(), mrSidebarWin.ColorDark() ), ColorFromAlphaColor( 80, mrSidebarWin.ColorAnchor(), mrSidebarWin.ColorDark() )); DrawGradient( aRect, aGradient ); //draw rect around button SetFillColor(); SetLineColor( ColorFromAlphaColor( 90, mrSidebarWin.ColorAnchor(), mrSidebarWin.ColorDark() )); } DrawRect( aRect ); if ( mrSidebarWin.IsPreview() ) { Font aOldFont( mrSidebarWin.GetFont() ); Font aFont(aOldFont); Color aCol( COL_BLACK); aFont.SetColor( aCol ); aFont.SetHeight(200); aFont.SetWeight(WEIGHT_MEDIUM); SetFont( aFont ); DrawText( aRect , rtl::OUString::createFromAscii("Edit Note"), TEXT_DRAW_CENTER ); SetFont( aOldFont ); } else { Rectangle aSymbolRect( aRect ); // 25% distance to the left and right button border const long nBorderDistanceLeftAndRight = ((aSymbolRect.GetWidth()*250)+500)/1000; aSymbolRect.Left()+=nBorderDistanceLeftAndRight; aSymbolRect.Right()-=nBorderDistanceLeftAndRight; // 40% distance to the top button border const long nBorderDistanceTop = ((aSymbolRect.GetHeight()*400)+500)/1000; aSymbolRect.Top()+=nBorderDistanceTop; // 15% distance to the bottom button border const long nBorderDistanceBottom = ((aSymbolRect.GetHeight()*150)+500)/1000; aSymbolRect.Bottom()-=nBorderDistanceBottom; DecorationView aDecoView( this ); aDecoView.DrawSymbol( aSymbolRect, SYMBOL_SPIN_DOWN, ( Application::GetSettings().GetStyleSettings().GetHighContrastMode() ? Color( COL_WHITE ) : Color( COL_BLACK ) ) ); } } void AnnotationMenuButton::KeyInput( const KeyEvent& rKeyEvt ) { const KeyCode& rKeyCode = rKeyEvt.GetKeyCode(); const sal_uInt16 nKey = rKeyCode.GetCode(); if ( nKey == KEY_TAB ) { mrSidebarWin.ActivatePostIt(); mrSidebarWin.GrabFocus(); } else { MenuButton::KeyInput( rKeyEvt ); } } } } // end of namespace sw::annotation