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
25 #include "precompiled_sw.hxx"
26
27 #include <AnnotationMenuButton.hxx>
28
29 #include <annotation.hrc>
30 #include <app.hrc>
31 #include <access.hrc>
32
33 #include <unotools/useroptions.hxx>
34
35 #include <vcl/svapp.hxx>
36 #include <vcl/menu.hxx>
37 #include <vcl/decoview.hxx>
38 #include <vcl/gradient.hxx>
39
40 #include <cmdid.h>
41 #include <SidebarWin.hxx>
42
43 namespace sw { namespace annotation {
44
ColorFromAlphaColor(const sal_uInt8 aTransparency,const Color & aFront,const Color & aBack)45 Color ColorFromAlphaColor( const sal_uInt8 aTransparency,
46 const Color &aFront,
47 const Color &aBack )
48 {
49 return Color((sal_uInt8)(aFront.GetRed() * aTransparency/(double)255 + aBack.GetRed() * (1-aTransparency/(double)255)),
50 (sal_uInt8)(aFront.GetGreen() * aTransparency/(double)255 + aBack.GetGreen() * (1-aTransparency/(double)255)),
51 (sal_uInt8)(aFront.GetBlue() * aTransparency/(double)255 + aBack.GetBlue() * (1-aTransparency/(double)255)));
52 }
53
AnnotationMenuButton(sw::sidebarwindows::SwSidebarWin & rSidebarWin)54 AnnotationMenuButton::AnnotationMenuButton( sw::sidebarwindows::SwSidebarWin& rSidebarWin )
55 : MenuButton( &rSidebarWin )
56 , mrSidebarWin( rSidebarWin )
57 {
58 AddEventListener( LINK( &mrSidebarWin, sw::sidebarwindows::SwSidebarWin, WindowEventListener ) );
59
60 SetAccessibleName( SW_RES( STR_ACCESS_ANNOTATION_BUTTON_NAME ) );
61 SetAccessibleDescription( SW_RES( STR_ACCESS_ANNOTATION_BUTTON_DESC ) );
62 SetQuickHelpText( GetAccessibleDescription() );
63 }
64
~AnnotationMenuButton()65 AnnotationMenuButton::~AnnotationMenuButton()
66 {
67 RemoveEventListener( LINK( &mrSidebarWin, sw::sidebarwindows::SwSidebarWin, WindowEventListener ) );
68 }
69
Select()70 void AnnotationMenuButton::Select()
71 {
72 mrSidebarWin.ExecuteCommand( GetCurItemId() );
73 }
74
MouseButtonDown(const MouseEvent & rMEvt)75 void AnnotationMenuButton::MouseButtonDown( const MouseEvent& rMEvt )
76 {
77 PopupMenu* pButtonPopup( GetPopupMenu() );
78 if ( mrSidebarWin.IsReadOnly() )
79 {
80 pButtonPopup->EnableItem( FN_REPLY, false );
81 pButtonPopup->EnableItem( FN_DELETE_COMMENT, false );
82 pButtonPopup->EnableItem( FN_DELETE_NOTE_AUTHOR, false );
83 pButtonPopup->EnableItem( FN_DELETE_ALL_NOTES, false );
84 }
85 else
86 {
87 pButtonPopup->EnableItem( FN_DELETE_COMMENT, !mrSidebarWin.IsProtected() );
88 pButtonPopup->EnableItem( FN_DELETE_NOTE_AUTHOR, true );
89 pButtonPopup->EnableItem( FN_DELETE_ALL_NOTES, true );
90 }
91
92 if ( mrSidebarWin.IsProtected() )
93 {
94 pButtonPopup->EnableItem( FN_REPLY, false );
95 }
96 else
97 {
98 SvtUserOptions aUserOpt;
99 String sAuthor;
100 if ( !(sAuthor = aUserOpt.GetFullName()).Len() )
101 {
102 if ( !(sAuthor = aUserOpt.GetID()).Len() )
103 {
104 sAuthor = String( SW_RES( STR_REDLINE_UNKNOWN_AUTHOR ));
105 }
106 }
107 // do not allow to reply to ourself and no answer possible if this note is in a protected section
108 if ( sAuthor == mrSidebarWin.GetAuthor() )
109 {
110 pButtonPopup->EnableItem( FN_REPLY, false );
111 }
112 else
113 {
114 pButtonPopup->EnableItem( FN_REPLY, true );
115 }
116 }
117
118 MenuButton::MouseButtonDown( rMEvt );
119 }
120
Paint(const Rectangle &)121 void AnnotationMenuButton::Paint( const Rectangle& /*rRect*/ )
122 {
123 if ( Application::GetSettings().GetStyleSettings().GetHighContrastMode() )
124 SetFillColor(COL_BLACK);
125 else
126 SetFillColor( mrSidebarWin.ColorDark() );
127 SetLineColor();
128 const Rectangle aRect( Rectangle( Point( 0, 0 ), PixelToLogic( GetSizePixel() ) ) );
129 DrawRect( aRect );
130
131 if ( Application::GetSettings().GetStyleSettings().GetHighContrastMode())
132 {
133 //draw rect around button
134 SetFillColor(COL_BLACK);
135 SetLineColor(COL_WHITE);
136 }
137 else
138 {
139 //draw button
140 Gradient aGradient;
141 if ( IsMouseOver() )
142 aGradient = Gradient( GRADIENT_LINEAR,
143 ColorFromAlphaColor( 80, mrSidebarWin.ColorAnchor(), mrSidebarWin.ColorDark() ),
144 ColorFromAlphaColor( 15, mrSidebarWin.ColorAnchor(), mrSidebarWin.ColorDark() ));
145 else
146 aGradient = Gradient( GRADIENT_LINEAR,
147 ColorFromAlphaColor( 15, mrSidebarWin.ColorAnchor(), mrSidebarWin.ColorDark() ),
148 ColorFromAlphaColor( 80, mrSidebarWin.ColorAnchor(), mrSidebarWin.ColorDark() ));
149 DrawGradient( aRect, aGradient );
150
151 //draw rect around button
152 SetFillColor();
153 SetLineColor( ColorFromAlphaColor( 90, mrSidebarWin.ColorAnchor(), mrSidebarWin.ColorDark() ));
154 }
155 DrawRect( aRect );
156
157 if ( mrSidebarWin.IsPreview() )
158 {
159 Font aOldFont( mrSidebarWin.GetFont() );
160 Font aFont(aOldFont);
161 Color aCol( COL_BLACK);
162 aFont.SetColor( aCol );
163 aFont.SetHeight(200);
164 aFont.SetWeight(WEIGHT_MEDIUM);
165 SetFont( aFont );
166 DrawText( aRect ,
167 rtl::OUString::createFromAscii("Edit Note"),
168 TEXT_DRAW_CENTER );
169 SetFont( aOldFont );
170 }
171 else
172 {
173 Rectangle aSymbolRect( aRect );
174 // 25% distance to the left and right button border
175 const long nBorderDistanceLeftAndRight = ((aSymbolRect.GetWidth()*250)+500)/1000;
176 aSymbolRect.Left()+=nBorderDistanceLeftAndRight;
177 aSymbolRect.Right()-=nBorderDistanceLeftAndRight;
178 // 40% distance to the top button border
179 const long nBorderDistanceTop = ((aSymbolRect.GetHeight()*400)+500)/1000;
180 aSymbolRect.Top()+=nBorderDistanceTop;
181 // 15% distance to the bottom button border
182 const long nBorderDistanceBottom = ((aSymbolRect.GetHeight()*150)+500)/1000;
183 aSymbolRect.Bottom()-=nBorderDistanceBottom;
184 DecorationView aDecoView( this );
185 aDecoView.DrawSymbol( aSymbolRect, SYMBOL_SPIN_DOWN,
186 ( Application::GetSettings().GetStyleSettings().GetHighContrastMode()
187 ? Color( COL_WHITE )
188 : Color( COL_BLACK ) ) );
189 }
190 }
191
KeyInput(const KeyEvent & rKeyEvt)192 void AnnotationMenuButton::KeyInput( const KeyEvent& rKeyEvt )
193 {
194 const KeyCode& rKeyCode = rKeyEvt.GetKeyCode();
195 const sal_uInt16 nKey = rKeyCode.GetCode();
196 if ( nKey == KEY_TAB )
197 {
198 mrSidebarWin.ActivatePostIt();
199 mrSidebarWin.GrabFocus();
200 }
201 else
202 {
203 MenuButton::KeyInput( rKeyEvt );
204 }
205 }
206
207 } } // end of namespace sw::annotation
208
209