blob: 61f945301806181261b76978a75e2e150745353e [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_COCOA_CHROME_TO_MOBILE_BUBBLE_CONTROLLER_H_
#define CHROME_BROWSER_UI_COCOA_CHROME_TO_MOBILE_BUBBLE_CONTROLLER_H_
#import <Cocoa/Cocoa.h>
#include <vector>
#include "base/file_path.h"
#include "base/memory/scoped_nsobject.h"
#include "base/memory/scoped_ptr.h"
#include "chrome/browser/chrome_to_mobile_service.h"
#import "chrome/browser/ui/cocoa/base_bubble_controller.h"
#include "content/public/browser/notification_observer.h"
#include "content/public/browser/notification_registrar.h"
class Browser;
@class ChromeToMobileBubbleController;
class ChromeToMobileService;
namespace base {
class DictionaryValue;
}
namespace ui {
class Animation;
class ThrobAnimation;
}
// Simple class to watch for tab creation/destruction and close the bubble.
// Bridge between Chrome-style notifications and ObjC-style notifications.
// This class also observes ChromeToMobileService for the bubble.
class ChromeToMobileBubbleNotificationBridge
: public content::NotificationObserver,
public ChromeToMobileService::Observer,
public base::SupportsWeakPtr<ChromeToMobileBubbleNotificationBridge> {
public:
ChromeToMobileBubbleNotificationBridge(
ChromeToMobileBubbleController* controller,
SEL selector);
virtual ~ChromeToMobileBubbleNotificationBridge() {}
// content::NotificationObserver override:
virtual void Observe(int type,
const content::NotificationSource& source,
const content::NotificationDetails& details) OVERRIDE;
// ChromeToMobileService::Observer overrides:
virtual void SnapshotGenerated(const FilePath& path, int64 bytes) OVERRIDE;
virtual void OnSendComplete(bool success) OVERRIDE;
private:
content::NotificationRegistrar registrar_;
ChromeToMobileBubbleController* controller_; // weak; owns us.
SEL selector_; // SEL sent to controller_ on notification.
};
// Controller for the Chrome To Mobile bubble, which pops up when clicking on
// mobile device icon between the omnibox URL and bookmark star. This bubble
// allows page URLs and MHTML snapshots to be sent to registered mobile devices.
@interface ChromeToMobileBubbleController
: BaseBubbleController<NSAnimationDelegate> {
@private
// The bubble title: "Send this page to[:| <Device Name>.]".
IBOutlet NSTextField* title_;
// The radio group shown for multiple registered devices.
IBOutlet NSMatrix* mobileRadioGroup_;
// The box containing views: |sendCopy_|, |cancel_|, |send_|, and |error_|.
IBOutlet NSBox* lowerBox_;
// The checkbox to send an offline copy.
IBOutlet NSButton* sendCopy_;
// The cancel and send buttons.
IBOutlet NSButton* cancel_;
IBOutlet NSButton* send_;
// The error message shown if sending the page fails.
IBOutlet NSTextField* error_;
// A bridge used to observe Chrome and Service changes.
scoped_ptr<ChromeToMobileBubbleNotificationBridge> bridge_;
// The browser that opened this bubble.
Browser* browser_;
// The Chrome To Mobile service associated with this bubble.
ChromeToMobileService* service_;
// The file path for the MHTML page snapshot.
FilePath snapshotPath_;
// An animation used to cycle through the "Sending..." status messages.
scoped_nsobject<NSAnimation> progressAnimation_;
}
// The owner of this object is responsible for showing the bubble. It is not
// shown by the init routine. The window closes automatically on deallocation.
- (id)initWithParentWindow:(NSWindow*)parentWindow
browser:(Browser*)browser;
// Actions for buttons in the dialog.
- (IBAction)learn:(id)sender;
- (IBAction)send:(id)sender;
- (IBAction)cancel:(id)sender;
// Update the bubble to reflect the generated snapshot.
- (void)snapshotGenerated:(const FilePath&)path
bytes:(int64)bytes;
// Update the bubble to reflect the completed send.
- (void)onSendComplete:(bool)success;
@end
@interface ChromeToMobileBubbleController (JustForTesting)
- (id)initWithParentWindow:(NSWindow*)parentWindow
service:(ChromeToMobileService*)service;
- (void)setSendCopy:(bool)sendCopy;
- (ChromeToMobileBubbleNotificationBridge*)bridge;
@end
#endif // CHROME_BROWSER_UI_COCOA_CHROME_TO_MOBILE_BUBBLE_CONTROLLER_H_