Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(166)

Side by Side Diff: chrome/browser/cocoa/download_item_mac.mm

Issue 149276: Mac version of the download shelf views (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 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 "chrome/browser/cocoa/download_item_mac.h" 5 #include "chrome/browser/cocoa/download_item_mac.h"
6 6
7 #include "base/basictypes.h" 7 #import "chrome/browser/cocoa/download_item_controller.h"
8 #include "base/string_util.h"
9 #include "base/sys_string_conversions.h"
10 #import "chrome/browser/cocoa/download_shelf_controller.h"
11 #import "chrome/browser/cocoa/download_shelf_mac.h"
12 #import "chrome/browser/cocoa/download_shelf_view.h"
13 #include "chrome/browser/download/download_item_model.h" 8 #include "chrome/browser/download/download_item_model.h"
14 #include "chrome/browser/download/download_manager.h"
15 #include "chrome/browser/download/download_shelf.h"
16
17 // A class for the chromium-side part of the download shelf context menu.
18
19 class DownloadShelfContextMenuMac : public DownloadShelfContextMenu {
20 public:
21 DownloadShelfContextMenuMac(BaseDownloadItemModel* model,
22 DownloadShelfContextMenuBridge* bridge)
23 : DownloadShelfContextMenu(model), bridge_(bridge) {
24 }
25
26 NSMenu* GetCocoaMenu();
27
28 using DownloadShelfContextMenu::ExecuteItemCommand;
29
30 private:
31 DownloadShelfContextMenuBridge* bridge_; // weak, owns us
32 };
33
34 NSMenu* DownloadShelfContextMenuMac::GetCocoaMenu() {
35 // TODO(thakis): win/gtk show slightly different menus when the download is
36 // in progress/done (mainly the first item)
37 // TODO(thakis): this probably wants to be in a xib file or at least use
38 // localized strings
39
40 NSMenuItem* item;
41 NSMenu* menu =
42 [[[NSMenu alloc] initWithTitle:@"DownloadItemPopup"] autorelease];
43 SEL action = @selector(performAction:);
44
45 item = [menu addItemWithTitle:@"Open" action:action keyEquivalent:@""];
46 // [item addItemWithTitle:@"Open when complete" ...]; // In-progress text.
47 [item setTag:OPEN_WHEN_COMPLETE];
48 [item setTarget:bridge_];
49
50 // TODO(thakis): Set correct checkbox state, make this a checkbox item
51 item = [menu addItemWithTitle:@"Always open type"
52 action:action
53 keyEquivalent:@""];
54 [item setTag:ALWAYS_OPEN_TYPE];
55 [item setTarget:bridge_];
56
57 [menu addItem:[NSMenuItem separatorItem]];
58
59 item = [menu addItemWithTitle:@"Reveal in Finder"
60 action:action
61 keyEquivalent:@""];
62 [item setTag:SHOW_IN_FOLDER];
63 [item setTarget:bridge_];
64
65 [menu addItem:[NSMenuItem separatorItem]];
66
67 item = [menu addItemWithTitle:@"Cancel" action:action keyEquivalent:@""];
68 [item setTag:CANCEL];
69 [item setTarget:bridge_];
70
71 return menu;
72 }
73
74
75 // A class for the cocoa side of the download shelf context menu.
76
77 @interface DownloadShelfContextMenuBridge : NSObject {
78 @private
79 scoped_ptr<DownloadShelfContextMenuMac> contextMenu_;
80 }
81
82 - (DownloadShelfContextMenuBridge*)initWithModel:(BaseDownloadItemModel*)model;
83 @end
84
85 @interface DownloadShelfContextMenuBridge(Private)
86 - (void)performAction:(id)sender;
87 - (NSMenu*)menu;
88 @end
89
90 @implementation DownloadShelfContextMenuBridge
91
92 - (DownloadShelfContextMenuBridge*)initWithModel:(BaseDownloadItemModel*)model {
93 if ((self = [super init]) == nil) {
94 return nil;
95 }
96 contextMenu_.reset(new DownloadShelfContextMenuMac(model, self));
97 return self;
98 }
99
100 @end
101
102 @implementation DownloadShelfContextMenuBridge(Private)
103
104 - (void)performAction:(id)sender {
105 contextMenu_->ExecuteItemCommand([sender tag]);
106 }
107
108 - (NSMenu*)menu {
109 return contextMenu_->GetCocoaMenu();
110 }
111
112 @end
113
114 9
115 // DownloadItemMac ------------------------------------------------------------- 10 // DownloadItemMac -------------------------------------------------------------
116 11
117 DownloadItemMac::DownloadItemMac(BaseDownloadItemModel* download_model, 12 DownloadItemMac::DownloadItemMac(BaseDownloadItemModel* download_model,
118 NSRect frame, 13 DownloadItemController* controller)
119 DownloadShelfController* parent) 14 : download_model_(download_model), item_controller_(controller) {
120 : download_model_(download_model), parent_(parent) {
121 download_model_->download()->AddObserver(this); 15 download_model_->download()->AddObserver(this);
122
123 // TODO(thakis): The windows version of this does all kinds of things
124 // (gratituous use of animation, special handling of dangerous downloads)
125 // that we don't currently do.
126
127 scoped_nsobject<NSPopUpButton> view(
128 [[NSPopUpButton alloc] initWithFrame:frame pullsDown:YES]);
129 [parent_ addDownloadItem:view.get()];
130
131 FilePath download_path = download_model->download()->GetFileName();
132
133 // TODO(thakis): use filename eliding like gtk/windows versions
134 NSString* titleString = base::SysWideToNSString(
135 download_path.ToWStringHack());
136
137 menu_.reset([[DownloadShelfContextMenuBridge alloc]
138 initWithModel:download_model_.get()]);
139 [view.get() setMenu:[menu_.get() menu]];
140
141 [view.get() insertItemWithTitle:titleString atIndex:0];
142
143 NSString* extension = base::SysUTF8ToNSString(download_path.Extension());
144 [[view.get() itemAtIndex:0] setImage:
145 [[NSWorkspace sharedWorkspace] iconForFileType:extension]];
146 } 16 }
147 17
148 DownloadItemMac::~DownloadItemMac() { 18 DownloadItemMac::~DownloadItemMac() {
149 download_model_->download()->RemoveObserver(this); 19 download_model_->download()->RemoveObserver(this);
150 } 20 }
151 21
152 void DownloadItemMac::OnDownloadUpdated(DownloadItem* download) { 22 void DownloadItemMac::OnDownloadUpdated(DownloadItem* download) {
153 DCHECK_EQ(download, download_model_->download()); 23 DCHECK_EQ(download, download_model_->download());
154 24
155 std::wstring status_text = download_model_->GetStatusText(); 25 [item_controller_ setStateFromDownload:download_model_.get()];
156 // Remove the status text label.
157 if (status_text.empty()) {
158 // TODO(thakis): Once there is a status label, hide it here
159 return;
160 }
161
162 // TODO(thakis): Set status_text as status label
163 } 26 }
OLDNEW
« no previous file with comments | « chrome/browser/cocoa/download_item_mac.h ('k') | chrome/browser/cocoa/download_shelf_controller.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698