OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
| 5 #include <cmath> |
| 6 |
5 #import "chrome/browser/cocoa/location_bar/page_action_decoration.h" | 7 #import "chrome/browser/cocoa/location_bar/page_action_decoration.h" |
6 | 8 |
7 #include "base/sys_string_conversions.h" | 9 #include "base/sys_string_conversions.h" |
8 #import "chrome/browser/cocoa/extensions/extension_action_context_menu.h" | 10 #import "chrome/browser/cocoa/extensions/extension_action_context_menu.h" |
9 #import "chrome/browser/cocoa/extensions/extension_popup_controller.h" | 11 #import "chrome/browser/cocoa/extensions/extension_popup_controller.h" |
10 #import "chrome/browser/cocoa/location_bar/location_bar_view_mac.h" | 12 #import "chrome/browser/cocoa/location_bar/location_bar_view_mac.h" |
11 #include "chrome/browser/extensions/extension_browser_event_router.h" | 13 #include "chrome/browser/extensions/extension_browser_event_router.h" |
12 #include "chrome/browser/extensions/extensions_service.h" | 14 #include "chrome/browser/extensions/extensions_service.h" |
13 #include "chrome/browser/profile.h" | 15 #include "chrome/browser/profile.h" |
14 #include "chrome/browser/tab_contents/tab_contents.h" | 16 #include "chrome/browser/tab_contents/tab_contents.h" |
15 #include "chrome/common/extensions/extension_action.h" | 17 #include "chrome/common/extensions/extension_action.h" |
16 #include "chrome/common/extensions/extension_resource.h" | 18 #include "chrome/common/extensions/extension_resource.h" |
17 #include "skia/ext/skia_utils_mac.h" | 19 #include "skia/ext/skia_utils_mac.h" |
18 | 20 |
| 21 namespace { |
| 22 |
| 23 // Distance to offset the bubble pointer from the bottom of the max |
| 24 // icon area of the decoration. This makes the popup's upper border |
| 25 // 2px away from the omnibox's lower border (matches omnibox popup |
| 26 // upper border). |
| 27 const CGFloat kBubblePointYOffset = 2.0; |
| 28 |
| 29 } // namespace |
| 30 |
19 PageActionDecoration::PageActionDecoration( | 31 PageActionDecoration::PageActionDecoration( |
20 LocationBarViewMac* owner, | 32 LocationBarViewMac* owner, |
21 Profile* profile, | 33 Profile* profile, |
22 ExtensionAction* page_action) | 34 ExtensionAction* page_action) |
23 : owner_(owner), | 35 : owner_(owner), |
24 profile_(profile), | 36 profile_(profile), |
25 page_action_(page_action), | 37 page_action_(page_action), |
26 tracker_(this), | 38 tracker_(this), |
27 current_tab_id_(-1), | 39 current_tab_id_(-1), |
28 preview_enabled_(false) { | 40 preview_enabled_(false) { |
(...skipping 15 matching lines...) Expand all Loading... |
44 ImageLoadingTracker::DONT_CACHE); | 56 ImageLoadingTracker::DONT_CACHE); |
45 } | 57 } |
46 | 58 |
47 registrar_.Add(this, NotificationType::EXTENSION_HOST_VIEW_SHOULD_CLOSE, | 59 registrar_.Add(this, NotificationType::EXTENSION_HOST_VIEW_SHOULD_CLOSE, |
48 Source<Profile>(profile_)); | 60 Source<Profile>(profile_)); |
49 } | 61 } |
50 | 62 |
51 PageActionDecoration::~PageActionDecoration() { | 63 PageActionDecoration::~PageActionDecoration() { |
52 } | 64 } |
53 | 65 |
54 // Overridden from LocationBarImageView. Either notify listeners or show a | 66 // Always |kPageActionIconMaxSize| wide. |ImageDecoration| draws the |
55 // popup depending on the Page Action. | 67 // image centered. |
| 68 CGFloat PageActionDecoration::GetWidthForSpace(CGFloat width) { |
| 69 return Extension::kPageActionIconMaxSize; |
| 70 } |
| 71 |
| 72 // Either notify listeners or show a popup depending on the Page |
| 73 // Action. |
56 bool PageActionDecoration::OnMousePressed(NSRect frame) { | 74 bool PageActionDecoration::OnMousePressed(NSRect frame) { |
57 if (current_tab_id_ < 0) { | 75 if (current_tab_id_ < 0) { |
58 NOTREACHED() << "No current tab."; | 76 NOTREACHED() << "No current tab."; |
59 // We don't want other code to try and handle this click. Returning true | 77 // We don't want other code to try and handle this click. Returning true |
60 // prevents this by indicating that we handled it. | 78 // prevents this by indicating that we handled it. |
61 return true; | 79 return true; |
62 } | 80 } |
63 | 81 |
64 if (page_action_->HasPopup(current_tab_id_)) { | 82 if (page_action_->HasPopup(current_tab_id_)) { |
65 // Anchor popup at the bottom center of the page action icon. | 83 // Anchor popup at the bottom center of the page action icon. |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
168 | 186 |
169 void PageActionDecoration::SetToolTip(std::string tooltip) { | 187 void PageActionDecoration::SetToolTip(std::string tooltip) { |
170 SetToolTip(tooltip.empty() ? nil : base::SysUTF8ToNSString(tooltip)); | 188 SetToolTip(tooltip.empty() ? nil : base::SysUTF8ToNSString(tooltip)); |
171 } | 189 } |
172 | 190 |
173 NSString* PageActionDecoration::GetToolTip() { | 191 NSString* PageActionDecoration::GetToolTip() { |
174 return tooltip_.get(); | 192 return tooltip_.get(); |
175 } | 193 } |
176 | 194 |
177 NSPoint PageActionDecoration::GetBubblePointInFrame(NSRect frame) { | 195 NSPoint PageActionDecoration::GetBubblePointInFrame(NSRect frame) { |
178 frame = GetDrawRectInFrame(frame); | 196 // This is similar to |ImageDecoration::GetDrawRectInFrame()|, |
179 return NSMakePoint(NSMidX(frame), NSMaxY(frame)); | 197 // except that code centers the image, which can differ in size |
| 198 // between actions. This centers the maximum image size, so the |
| 199 // point will consistently be at the same y position. x position is |
| 200 // easier (the middle of the centered image is the middle of the |
| 201 // frame). |
| 202 const CGFloat delta_height = |
| 203 NSHeight(frame) - Extension::kPageActionIconMaxSize; |
| 204 const CGFloat bottom_inset = std::ceil(delta_height / 2.0); |
| 205 |
| 206 // Return a point just below the bottom of the maximal drawing area. |
| 207 return NSMakePoint(NSMidX(frame), |
| 208 NSMaxY(frame) - bottom_inset + kBubblePointYOffset); |
180 } | 209 } |
181 | 210 |
182 NSMenu* PageActionDecoration::GetMenu() { | 211 NSMenu* PageActionDecoration::GetMenu() { |
183 if (!profile_) | 212 if (!profile_) |
184 return nil; | 213 return nil; |
185 ExtensionsService* service = profile_->GetExtensionsService(); | 214 ExtensionsService* service = profile_->GetExtensionsService(); |
186 if (!service) | 215 if (!service) |
187 return nil; | 216 return nil; |
188 Extension* extension = service->GetExtensionById( | 217 Extension* extension = service->GetExtensionById( |
189 page_action_->extension_id(), false); | 218 page_action_->extension_id(), false); |
(...skipping 16 matching lines...) Expand all Loading... |
206 if (popup && ![popup isClosing]) | 235 if (popup && ![popup isClosing]) |
207 [popup close]; | 236 [popup close]; |
208 | 237 |
209 break; | 238 break; |
210 } | 239 } |
211 default: | 240 default: |
212 NOTREACHED() << "Unexpected notification"; | 241 NOTREACHED() << "Unexpected notification"; |
213 break; | 242 break; |
214 } | 243 } |
215 } | 244 } |
OLD | NEW |