Wires keeping the launcher up to date with the browser. I also needed GetBrowserViewForNativeWindow, so I had to wire up ViewProps for it to work correctly.
BUG=97262 TEST=none R=ben@chromium.org Review URL: http://codereview.chromium.org/8289022 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@105677 0039d316-1c4b-4281-b951-d872f2087c98
This commit is contained in:
build
chrome
ui
views/widget
@ -1272,7 +1272,9 @@
|
||||
'sources/': [ ['exclude', '_views\\.(h|cc)$'] ]
|
||||
}],
|
||||
['use_aura==0', {
|
||||
'sources/': [ ['exclude', '_aura\\.(h|cc)$'] ]
|
||||
'sources/': [ ['exclude', '_aura\\.(h|cc)$'],
|
||||
['exclude', '(^|/)aura/'],
|
||||
]
|
||||
}],
|
||||
['use_aura==0 or use_x11==0', {
|
||||
'sources/': [ ['exclude', '_aurax11\\.(h|cc)$'] ]
|
||||
|
@ -201,6 +201,7 @@
|
||||
#endif
|
||||
|
||||
#if defined(USE_AURA)
|
||||
#include "chrome/browser/ui/views/aura/chrome_shell_delegate.h"
|
||||
#include "ui/aura/desktop.h"
|
||||
#include "ui/aura_shell/shell.h"
|
||||
#endif
|
||||
@ -1366,7 +1367,8 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunInternal() {
|
||||
child_process_logging::SetCommandLine(CommandLine::ForCurrentProcess());
|
||||
|
||||
#if defined(USE_AURA)
|
||||
aura_shell::Shell::GetInstance();
|
||||
// Shell takes ownership of ChromeShellDelegate.
|
||||
aura_shell::Shell::GetInstance()->SetDelegate(new ChromeShellDelegate);
|
||||
#elif defined(TOOLKIT_VIEWS)
|
||||
views::Widget::SetPureViews(
|
||||
CommandLine::ForCurrentProcess()->HasSwitch(switches::kUsePureViews));
|
||||
|
35
chrome/browser/ui/views/aura/chrome_shell_delegate.cc
Normal file
35
chrome/browser/ui/views/aura/chrome_shell_delegate.cc
Normal file
@ -0,0 +1,35 @@
|
||||
// Copyright (c) 2011 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.
|
||||
|
||||
#include "chrome/browser/ui/views/aura/chrome_shell_delegate.h"
|
||||
|
||||
#include "chrome/browser/ui/browser.h"
|
||||
#include "chrome/browser/ui/views/frame/browser_view.h"
|
||||
#include "ui/aura_shell/launcher/launcher_types.h"
|
||||
|
||||
ChromeShellDelegate::ChromeShellDelegate() {
|
||||
}
|
||||
|
||||
ChromeShellDelegate::~ChromeShellDelegate() {
|
||||
}
|
||||
|
||||
void ChromeShellDelegate::CreateNewWindow() {
|
||||
}
|
||||
|
||||
void ChromeShellDelegate::ShowApps() {
|
||||
}
|
||||
|
||||
void ChromeShellDelegate::LauncherItemClicked(
|
||||
const aura_shell::LauncherItem& item) {
|
||||
}
|
||||
|
||||
bool ChromeShellDelegate::ConfigureLauncherItem(
|
||||
aura_shell::LauncherItem* item) {
|
||||
BrowserView* view = BrowserView::GetBrowserViewForNativeWindow(item->window);
|
||||
if (!view)
|
||||
return false;
|
||||
item->type = (view->browser()->type() == Browser::TYPE_TABBED) ?
|
||||
aura_shell::TYPE_TABBED : aura_shell::TYPE_APP;
|
||||
return true;
|
||||
}
|
29
chrome/browser/ui/views/aura/chrome_shell_delegate.h
Normal file
29
chrome/browser/ui/views/aura/chrome_shell_delegate.h
Normal file
@ -0,0 +1,29 @@
|
||||
// Copyright (c) 2011 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_VIEWS_AURA_CHROME_SHELL_DELEGATE_H_
|
||||
#define CHROME_BROWSER_UI_VIEWS_AURA_CHROME_SHELL_DELEGATE_H_
|
||||
#pragma once
|
||||
|
||||
#include "base/basictypes.h"
|
||||
#include "base/compiler_specific.h"
|
||||
#include "ui/aura_shell/shell_delegate.h"
|
||||
|
||||
class ChromeShellDelegate : public aura_shell::ShellDelegate {
|
||||
public:
|
||||
ChromeShellDelegate();
|
||||
virtual ~ChromeShellDelegate();
|
||||
|
||||
// aura_shell::ShellDelegate overrides;
|
||||
virtual void CreateNewWindow() OVERRIDE;
|
||||
virtual void ShowApps() OVERRIDE;
|
||||
virtual void LauncherItemClicked(
|
||||
const aura_shell::LauncherItem& item) OVERRIDE;
|
||||
virtual bool ConfigureLauncherItem(aura_shell::LauncherItem* item) OVERRIDE;
|
||||
|
||||
private:
|
||||
DISALLOW_COPY_AND_ASSIGN(ChromeShellDelegate);
|
||||
};
|
||||
|
||||
#endif // CHROME_BROWSER_UI_VIEWS_AURA_CHROME_SHELL_DELEGATE_H_
|
109
chrome/browser/ui/views/aura/launcher_icon_updater.cc
Normal file
109
chrome/browser/ui/views/aura/launcher_icon_updater.cc
Normal file
@ -0,0 +1,109 @@
|
||||
// Copyright (c) 2011 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.
|
||||
|
||||
#include "chrome/browser/ui/views/aura/launcher_icon_updater.h"
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
#include "chrome/browser/favicon/favicon_tab_helper.h"
|
||||
#include "chrome/browser/tabs/tab_strip_model.h"
|
||||
#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
|
||||
#include "grit/ui_resources.h"
|
||||
#include "ui/aura_shell/launcher/launcher_model.h"
|
||||
#include "ui/aura/window.h"
|
||||
#include "ui/base/resource/resource_bundle.h"
|
||||
|
||||
// Max number of tabs we'll send icons over for.
|
||||
const int kMaxCount = 3;
|
||||
|
||||
LauncherIconUpdater::LauncherIconUpdater(
|
||||
TabStripModel* tab_model,
|
||||
aura_shell::LauncherModel* launcher_model,
|
||||
aura::Window* window)
|
||||
: tab_model_(tab_model),
|
||||
launcher_model_(launcher_model),
|
||||
window_(window) {
|
||||
tab_model->AddObserver(this);
|
||||
if (tab_model->GetActiveTabContents())
|
||||
tabs_.push_front(tab_model->GetActiveTabContents());
|
||||
for (int i = 0; i < tab_model->count(); ++i) {
|
||||
if (i != tab_model->active_index())
|
||||
tabs_.push_back(tab_model->GetTabContentsAt(i));
|
||||
}
|
||||
UpdateLauncher();
|
||||
}
|
||||
|
||||
LauncherIconUpdater::~LauncherIconUpdater() {
|
||||
tab_model_->RemoveObserver(this);
|
||||
}
|
||||
|
||||
void LauncherIconUpdater::TabInsertedAt(TabContentsWrapper* contents,
|
||||
int index,
|
||||
bool foreground) {
|
||||
if (std::find(tabs_.begin(), tabs_.end(), contents) == tabs_.end())
|
||||
tabs_.push_back(contents);
|
||||
}
|
||||
|
||||
void LauncherIconUpdater::TabDetachedAt(TabContentsWrapper* contents,
|
||||
int index) {
|
||||
Tabs::iterator i = std::find(tabs_.begin(), tabs_.end(), contents);
|
||||
bool update = i != tabs_.end() ? (i - tabs_.begin()) < kMaxCount : false;
|
||||
if (i != tabs_.end())
|
||||
tabs_.erase(i);
|
||||
if (update)
|
||||
UpdateLauncher();
|
||||
}
|
||||
|
||||
void LauncherIconUpdater::TabSelectionChanged(
|
||||
TabStripModel* tab_strip_model,
|
||||
const TabStripSelectionModel& old_model) {
|
||||
TabContentsWrapper* tab = tab_strip_model->GetActiveTabContents();
|
||||
if (!tab)
|
||||
return;
|
||||
|
||||
Tabs::iterator i = std::find(tabs_.begin(), tabs_.end(), tab);
|
||||
if (i == tabs_.begin())
|
||||
return; // The active tab didn't change, ignore it.
|
||||
|
||||
// Move the active tab to the front.
|
||||
if (i != tabs_.end())
|
||||
tabs_.erase(i);
|
||||
tabs_.push_front(tab);
|
||||
UpdateLauncher();
|
||||
}
|
||||
|
||||
void LauncherIconUpdater::TabChangedAt(
|
||||
TabContentsWrapper* tab,
|
||||
int index,
|
||||
TabStripModelObserver::TabChangeType change_type) {
|
||||
if (change_type != TabStripModelObserver::LOADING_ONLY &&
|
||||
change_type != TabStripModelObserver::TITLE_NOT_LOADING) {
|
||||
Tabs::iterator i = std::find(tabs_.begin(), tabs_.end(), tab);
|
||||
if (i != tabs_.end() && (i - tabs_.begin()) < kMaxCount)
|
||||
UpdateLauncher();
|
||||
}
|
||||
}
|
||||
|
||||
void LauncherIconUpdater::UpdateLauncher() {
|
||||
if (tabs_.empty())
|
||||
return; // Assume the window is going to be closed if there are no tabs.
|
||||
|
||||
int item_index = launcher_model_->ItemIndexByWindow(window_);
|
||||
if (item_index == -1)
|
||||
return;
|
||||
|
||||
aura_shell::LauncherTabbedImages images;
|
||||
size_t count = std::min(static_cast<size_t>(kMaxCount), tabs_.size());
|
||||
images.resize(count);
|
||||
for (size_t i = 0; i < count; ++i) {
|
||||
// TODO: needs to be updated for apps.
|
||||
images[i].image = tabs_[i]->favicon_tab_helper()->GetFavicon();
|
||||
if (images[i].image.empty()) {
|
||||
images[i].image = *ResourceBundle::GetSharedInstance().GetBitmapNamed(
|
||||
IDR_DEFAULT_FAVICON);
|
||||
}
|
||||
images[i].user_data = tabs_[i];
|
||||
}
|
||||
launcher_model_->SetTabbedImages(item_index, images);
|
||||
}
|
62
chrome/browser/ui/views/aura/launcher_icon_updater.h
Normal file
62
chrome/browser/ui/views/aura/launcher_icon_updater.h
Normal file
@ -0,0 +1,62 @@
|
||||
// Copyright (c) 2011 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_VIEWS_AURA_LAUNCHER_ICON_UPDATER_H_
|
||||
#define CHROME_BROWSER_UI_VIEWS_AURA_LAUNCHER_ICON_UPDATER_H_
|
||||
#pragma once
|
||||
|
||||
#include <deque>
|
||||
|
||||
#include "base/basictypes.h"
|
||||
#include "base/compiler_specific.h"
|
||||
#include "chrome/browser/tabs/tab_strip_model_observer.h"
|
||||
|
||||
namespace aura {
|
||||
class Window;
|
||||
}
|
||||
namespace aura_shell {
|
||||
class LauncherModel;
|
||||
}
|
||||
|
||||
// LauncherIconUpdater is responsible for keeping the launcher representation
|
||||
// of a window up to date with the tabs.
|
||||
class LauncherIconUpdater : public TabStripModelObserver {
|
||||
public:
|
||||
LauncherIconUpdater(TabStripModel* tab_model,
|
||||
aura_shell::LauncherModel* launcher_model,
|
||||
aura::Window* window);
|
||||
virtual ~LauncherIconUpdater();
|
||||
|
||||
// TabStripModel overrides:
|
||||
virtual void TabInsertedAt(TabContentsWrapper* contents,
|
||||
int index,
|
||||
bool foreground) OVERRIDE;
|
||||
virtual void TabDetachedAt(TabContentsWrapper* contents, int index) OVERRIDE;
|
||||
virtual void TabSelectionChanged(
|
||||
TabStripModel* tab_strip_model,
|
||||
const TabStripSelectionModel& old_model) OVERRIDE;
|
||||
virtual void TabChangedAt(
|
||||
TabContentsWrapper* tab,
|
||||
int index,
|
||||
TabStripModelObserver::TabChangeType change_type) OVERRIDE;
|
||||
|
||||
private:
|
||||
typedef std::deque<TabContentsWrapper*> Tabs;
|
||||
|
||||
// Updates the launcher from the current set of tabs.
|
||||
void UpdateLauncher();
|
||||
|
||||
TabStripModel* tab_model_;
|
||||
|
||||
aura_shell::LauncherModel* launcher_model_;
|
||||
|
||||
aura::Window* window_;
|
||||
|
||||
// The tabs. This is an MRU cache of the tabs in the tabstrip model.
|
||||
Tabs tabs_;
|
||||
|
||||
DISALLOW_COPY_AND_ASSIGN(LauncherIconUpdater);
|
||||
};
|
||||
|
||||
#endif // CHROME_BROWSER_UI_VIEWS_AURA_LAUNCHER_ICON_UPDATER_H_
|
@ -105,11 +105,15 @@
|
||||
#include "views/window/dialog_delegate.h"
|
||||
|
||||
#if defined(USE_AURA)
|
||||
#include "chrome/browser/ui/views/aura/launcher_icon_updater.h"
|
||||
#include "ui/aura_shell/launcher/launcher.h"
|
||||
#include "ui/aura_shell/launcher/launcher_model.h"
|
||||
#include "ui/aura_shell/shell.h"
|
||||
#include "ui/base/view_prop.h"
|
||||
#elif defined(OS_WIN)
|
||||
#include "chrome/browser/aeropeek_manager.h"
|
||||
#include "chrome/browser/jumplist_win.h"
|
||||
#include "ui/base/message_box_win.h"
|
||||
#include "ui/base/view_prop.h"
|
||||
#include "views/widget/native_widget_win.h"
|
||||
#elif defined(TOOLKIT_USES_GTK)
|
||||
#include "chrome/browser/ui/views/accelerator_table_linux.h"
|
||||
@ -125,6 +129,10 @@
|
||||
#include "chrome/browser/ui/views/download/download_shelf_view.h"
|
||||
#endif
|
||||
|
||||
#if defined(OS_WIN) && !defined(USE_AURA)
|
||||
#include "ui/base/view_prop.h"
|
||||
#endif
|
||||
|
||||
#if defined(TOUCH_UI)
|
||||
#include "chrome/browser/ui/touch/status_bubble_touch.h"
|
||||
#endif
|
||||
@ -366,13 +374,12 @@ BrowserView::~BrowserView() {
|
||||
browser_.reset();
|
||||
}
|
||||
|
||||
// Tab dragging code on windows needs this.
|
||||
#if defined(OS_WIN) && !defined(USE_AURA)
|
||||
#if defined(OS_WIN) || defined(USE_AURA)
|
||||
// static
|
||||
BrowserView* BrowserView::GetBrowserViewForNativeWindow(
|
||||
gfx::NativeWindow window) {
|
||||
return IsWindow(window) ? reinterpret_cast<BrowserView*>(
|
||||
ui::ViewProp::GetValue(window, kBrowserViewKey)) : NULL;
|
||||
return reinterpret_cast<BrowserView*>(
|
||||
ui::ViewProp::GetValue(window, kBrowserViewKey));
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -1920,6 +1927,13 @@ void BrowserView::Init() {
|
||||
|
||||
// We're now initialized and ready to process Layout requests.
|
||||
ignore_layout_ = false;
|
||||
|
||||
#if defined(USE_AURA)
|
||||
icon_updater_.reset(new LauncherIconUpdater(
|
||||
browser_->tabstrip_model(),
|
||||
aura_shell::Shell::GetInstance()->launcher()->model(),
|
||||
frame_->GetNativeWindow()));
|
||||
#endif
|
||||
}
|
||||
|
||||
void BrowserView::LoadingAnimationCallback() {
|
||||
|
@ -46,6 +46,7 @@ class BrowserViewLayout;
|
||||
class ContentsContainer;
|
||||
class DownloadShelfView;
|
||||
class EncodingMenuModel;
|
||||
class Extension;
|
||||
class FullscreenExitBubbleViews;
|
||||
class HtmlDialogUIDelegate;
|
||||
class InfoBarContainerView;
|
||||
@ -56,13 +57,16 @@ class TabContentsContainer;
|
||||
class TabStripModel;
|
||||
class ToolbarView;
|
||||
class ZoomMenuModel;
|
||||
class Extension;
|
||||
|
||||
#if defined(OS_WIN)
|
||||
class AeroPeekManager;
|
||||
class JumpList;
|
||||
#endif
|
||||
|
||||
#if defined(USE_AURA)
|
||||
class LauncherIconUpdater;
|
||||
#endif
|
||||
|
||||
namespace views {
|
||||
class ExternalFocusTracker;
|
||||
class Menu;
|
||||
@ -95,7 +99,7 @@ class BrowserView : public BrowserBubbleHost,
|
||||
void set_frame(BrowserFrame* frame) { frame_ = frame; }
|
||||
BrowserFrame* frame() const { return frame_; }
|
||||
|
||||
#if defined(OS_WIN) && !defined(USE_AURA)
|
||||
#if defined(OS_WIN) || defined(USE_AURA)
|
||||
// Returns a pointer to the BrowserView* interface implementation (an
|
||||
// instance of this object, typically) for a given native window, or NULL if
|
||||
// there is no such association.
|
||||
@ -684,6 +688,10 @@ class BrowserView : public BrowserBubbleHost,
|
||||
scoped_ptr<AeroPeekManager> aeropeek_manager_;
|
||||
#endif
|
||||
|
||||
#if defined(USE_AURA)
|
||||
scoped_ptr<LauncherIconUpdater> icon_updater_;
|
||||
#endif
|
||||
|
||||
// The timer used to update frames for the Loading Animation.
|
||||
base::RepeatingTimer<BrowserView> loading_animation_timer_;
|
||||
|
||||
|
@ -3225,6 +3225,10 @@
|
||||
'browser/ui/views/app_menu_button_win.h',
|
||||
'browser/ui/views/appcache_info_view.cc',
|
||||
'browser/ui/views/appcache_info_view.h',
|
||||
'browser/ui/views/aura/chrome_shell_delegate.cc',
|
||||
'browser/ui/views/aura/chrome_shell_delegate.h',
|
||||
'browser/ui/views/aura/launcher_icon_updater.cc',
|
||||
'browser/ui/views/aura/launcher_icon_updater.h',
|
||||
'browser/ui/views/autocomplete/autocomplete_popup_contents_view.cc',
|
||||
'browser/ui/views/autocomplete/autocomplete_popup_contents_view.h',
|
||||
'browser/ui/views/autocomplete/autocomplete_result_view.cc',
|
||||
@ -5057,6 +5061,7 @@
|
||||
['exclude', '^browser/process_singleton_linux.cc'],
|
||||
['exclude', '^browser/ui/input_window_dialog.h'],
|
||||
['exclude', '^browser/ui/input_window_dialog_win.cc'],
|
||||
['include', '^browser/ui/views/aura/'],
|
||||
['include', '^browser/ui/views/browser_bubble_aura.cc'],
|
||||
['include', '^browser/ui/views/constrained_html_delegate_views.cc'],
|
||||
['include', '^browser/ui/views/constrained_window_views.cc'],
|
||||
|
@ -389,6 +389,9 @@ internal::RootWindow* Window::GetRoot() {
|
||||
}
|
||||
|
||||
void Window::SetVisible(bool visible) {
|
||||
if (visible == layer_->visible())
|
||||
return; // No change.
|
||||
|
||||
bool was_visible = IsVisible();
|
||||
layer_->SetVisible(visible);
|
||||
bool is_visible = IsVisible();
|
||||
@ -397,6 +400,8 @@ void Window::SetVisible(bool visible) {
|
||||
if (delegate_)
|
||||
delegate_->OnWindowVisibilityChanged(is_visible);
|
||||
}
|
||||
FOR_EACH_OBSERVER(WindowObserver, observers_,
|
||||
OnWindowVisibilityChanged(this, is_visible));
|
||||
}
|
||||
|
||||
void Window::SchedulePaint() {
|
||||
|
@ -20,6 +20,11 @@ class AURA_EXPORT WindowObserver {
|
||||
// Invoked prior to removing |window|.
|
||||
virtual void OnWillRemoveWindow(Window* window) {}
|
||||
|
||||
// Invoked when the SetVisible() is invoked on a window. |visible| is the
|
||||
// value supplied to SetVisible(). If |visible| is true, window->IsVisible()
|
||||
// may still return false. See description in Window::IsVisible() for details.
|
||||
virtual void OnWindowVisibilityChanged(Window* window, bool visibile) {}
|
||||
|
||||
protected:
|
||||
virtual ~WindowObserver() {}
|
||||
};
|
||||
|
@ -43,25 +43,44 @@ Launcher::~Launcher() {
|
||||
window_container_->RemoveObserver(this);
|
||||
}
|
||||
|
||||
void Launcher::OnWindowAdded(aura::Window* new_window) {
|
||||
void Launcher::MaybeAdd(aura::Window* window) {
|
||||
if (known_windows_[window] == true)
|
||||
return; // We already tried to add this window.
|
||||
|
||||
known_windows_[window] = true;
|
||||
ShellDelegate* delegate = Shell::GetInstance()->delegate();
|
||||
if (!delegate)
|
||||
return;
|
||||
LauncherItem item;
|
||||
item.window = new_window;
|
||||
item.window = window;
|
||||
if (!delegate->ConfigureLauncherItem(&item))
|
||||
return; // The delegate doesn't want to show this item in the launcher.
|
||||
model_->Add(model_->items().size(), item);
|
||||
}
|
||||
|
||||
void Launcher::OnWindowAdded(aura::Window* new_window) {
|
||||
DCHECK(known_windows_.find(new_window) == known_windows_.end());
|
||||
known_windows_[new_window] = false;
|
||||
new_window->AddObserver(this);
|
||||
// Windows are created initially invisible. Wait until the window is made
|
||||
// visible before asking, as othewise the delegate likely doesn't know about
|
||||
// window (it's still creating it).
|
||||
if (new_window->IsVisible())
|
||||
MaybeAdd(new_window);
|
||||
}
|
||||
|
||||
void Launcher::OnWillRemoveWindow(aura::Window* window) {
|
||||
const LauncherItems& items(model_->items());
|
||||
for (LauncherItems::const_iterator i = items.begin(); i != items.end(); ++i) {
|
||||
if (i->window == window) {
|
||||
model_->RemoveItemAt(i - items.begin());
|
||||
break;
|
||||
}
|
||||
}
|
||||
window->RemoveObserver(this);
|
||||
known_windows_.erase(window);
|
||||
LauncherItems::const_iterator i = model_->ItemByWindow(window);
|
||||
if (i != model_->items().end())
|
||||
model_->RemoveItemAt(i - model_->items().begin());
|
||||
}
|
||||
|
||||
void Launcher::OnWindowVisibilityChanged(aura::Window* window,
|
||||
bool visibile) {
|
||||
if (visibile && !known_windows_[window])
|
||||
MaybeAdd(window);
|
||||
}
|
||||
|
||||
} // namespace aura_shell
|
||||
|
@ -6,6 +6,8 @@
|
||||
#define UI_AURA_SHELL_LAUNCHER_LAUNCHER_H_
|
||||
#pragma once
|
||||
|
||||
#include <map>
|
||||
|
||||
#include "base/basictypes.h"
|
||||
#include "base/memory/scoped_ptr.h"
|
||||
#include "ui/aura/window_observer.h"
|
||||
@ -32,9 +34,17 @@ class AURA_SHELL_EXPORT Launcher : public aura::WindowObserver {
|
||||
views::Widget* widget() { return widget_; }
|
||||
|
||||
private:
|
||||
typedef std::map<aura::Window*, bool> WindowMap;
|
||||
|
||||
// If necessary asks the delegate if an entry should be created in the
|
||||
// launcher for |window|. This only asks the delegate once for a window.
|
||||
void MaybeAdd(aura::Window* window);
|
||||
|
||||
// WindowObserver overrides:
|
||||
virtual void OnWindowAdded(aura::Window* new_window) OVERRIDE;
|
||||
virtual void OnWillRemoveWindow(aura::Window* window) OVERRIDE;
|
||||
virtual void OnWindowVisibilityChanged(aura::Window* window,
|
||||
bool visibile) OVERRIDE;
|
||||
|
||||
scoped_ptr<LauncherModel> model_;
|
||||
|
||||
@ -43,6 +53,10 @@ class AURA_SHELL_EXPORT Launcher : public aura::WindowObserver {
|
||||
|
||||
aura::ToplevelWindowContainer* window_container_;
|
||||
|
||||
// The set of windows we know about. The boolean indicates whether we've asked
|
||||
// the delegate if the window should added to the launcher.
|
||||
WindowMap known_windows_;
|
||||
|
||||
DISALLOW_COPY_AND_ASSIGN(Launcher);
|
||||
};
|
||||
|
||||
|
@ -4,6 +4,7 @@
|
||||
|
||||
#include "ui/aura_shell/launcher/launcher_model.h"
|
||||
|
||||
#include "ui/aura/window.h"
|
||||
#include "ui/aura_shell/launcher/launcher_model_observer.h"
|
||||
|
||||
namespace aura_shell {
|
||||
@ -45,6 +46,21 @@ void LauncherModel::SetAppImage(int index, const SkBitmap& image) {
|
||||
LauncherItemImagesChanged(index));
|
||||
}
|
||||
|
||||
int LauncherModel::ItemIndexByWindow(aura::Window* window) {
|
||||
LauncherItems::const_iterator i = ItemByWindow(window);
|
||||
return i == items_.end() ? -1 : static_cast<int>((i - items_.begin()));
|
||||
}
|
||||
|
||||
LauncherItems::const_iterator LauncherModel::ItemByWindow(
|
||||
aura::Window* window) const {
|
||||
for (LauncherItems::const_iterator i = items_.begin();
|
||||
i != items_.end(); ++i) {
|
||||
if (i->window == window)
|
||||
return i;
|
||||
}
|
||||
return items_.end();
|
||||
}
|
||||
|
||||
void LauncherModel::AddObserver(LauncherModelObserver* observer) {
|
||||
observers_.AddObserver(observer);
|
||||
}
|
||||
|
@ -12,8 +12,8 @@
|
||||
#include "ui/aura_shell/aura_shell_export.h"
|
||||
#include "ui/aura_shell/launcher/launcher_types.h"
|
||||
|
||||
namespace views {
|
||||
class View;
|
||||
namespace aura {
|
||||
class Window;
|
||||
}
|
||||
|
||||
namespace aura_shell {
|
||||
@ -36,6 +36,11 @@ class AURA_SHELL_EXPORT LauncherModel {
|
||||
void SetTabbedImages(int index, const LauncherTabbedImages& images);
|
||||
void SetAppImage(int index, const SkBitmap& image);
|
||||
|
||||
// Returns the index of the item with the specified window.
|
||||
int ItemIndexByWindow(aura::Window* window);
|
||||
|
||||
LauncherItems::const_iterator ItemByWindow(aura::Window* window) const;
|
||||
|
||||
const LauncherItems& items() const { return items_; }
|
||||
int item_count() const { return static_cast<int>(items_.size()); }
|
||||
|
||||
|
@ -123,7 +123,18 @@ void LauncherView::LauncherItemRemoved(int index) {
|
||||
}
|
||||
|
||||
void LauncherView::LauncherItemImagesChanged(int index) {
|
||||
// TODO: implement me.
|
||||
// TODO: implement better coordinate conversion.
|
||||
const LauncherItem& item(model_->items()[index]);
|
||||
if (item.type == TYPE_TABBED) {
|
||||
TabbedLauncherButton* button =
|
||||
static_cast<TabbedLauncherButton*>(child_at(index + 1));
|
||||
gfx::Size pref = button->GetPreferredSize();
|
||||
button->SetImages(item.tab_images);
|
||||
if (pref != button->GetPreferredSize())
|
||||
Resize();
|
||||
else
|
||||
button->SchedulePaint();
|
||||
}
|
||||
}
|
||||
|
||||
void LauncherView::ButtonPressed(views::Button* sender,
|
||||
|
@ -105,6 +105,7 @@ class COMPOSITOR_EXPORT Layer : public LayerAnimatorDelegate {
|
||||
// Sets the visibility of the Layer. A Layer may be visible but not
|
||||
// drawn. This happens if any ancestor of a Layer is not visible.
|
||||
void SetVisible(bool visible);
|
||||
bool visible() const { return visible_; }
|
||||
|
||||
// Returns true if this Layer is drawn. A Layer is drawn only if all ancestors
|
||||
// are visible.
|
||||
|
@ -478,8 +478,6 @@
|
||||
'base/dragdrop/drop_target.cc',
|
||||
'base/dragdrop/drop_target.h',
|
||||
'base/dragdrop/os_exchange_data.cc',
|
||||
'base/view_prop.cc',
|
||||
'base/view_prop.h',
|
||||
'gfx/native_theme_win.cc',
|
||||
'gfx/native_theme_win.h',
|
||||
],
|
||||
@ -541,6 +539,8 @@
|
||||
}],
|
||||
['toolkit_views==0', {
|
||||
'sources!': [
|
||||
'base/view_prop.cc',
|
||||
'base/view_prop.h',
|
||||
'gfx/render_text.cc',
|
||||
'gfx/render_text.h',
|
||||
'gfx/render_text_linux.cc',
|
||||
|
@ -9,6 +9,7 @@
|
||||
#include "ui/aura/event.h"
|
||||
#include "ui/aura/window.h"
|
||||
#include "ui/aura/window_types.h"
|
||||
#include "ui/base/view_prop.h"
|
||||
#include "ui/base/ui_base_types.h"
|
||||
#include "ui/gfx/canvas.h"
|
||||
#include "ui/gfx/compositor/layer.h"
|
||||
@ -28,6 +29,8 @@
|
||||
#include "views/ime/mock_input_method.h"
|
||||
#endif
|
||||
|
||||
using ui::ViewProp;
|
||||
|
||||
namespace views {
|
||||
|
||||
namespace {
|
||||
@ -173,15 +176,24 @@ void NativeWidgetAura::ViewRemoved(View* view) {
|
||||
}
|
||||
|
||||
void NativeWidgetAura::SetNativeWindowProperty(const char* name, void* value) {
|
||||
if (!value)
|
||||
props_map_.erase(name);
|
||||
else
|
||||
props_map_[name] = value;
|
||||
// TODO(sky): push this to Widget when we get rid of NativeWidgetGtk.
|
||||
if (!window_)
|
||||
return;
|
||||
|
||||
// Remove the existing property (if any).
|
||||
for (ViewProps::iterator i = props_.begin(); i != props_.end(); ++i) {
|
||||
if ((*i)->Key() == name) {
|
||||
props_.erase(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (value)
|
||||
props_.push_back(new ViewProp(window_, name, value));
|
||||
}
|
||||
|
||||
void* NativeWidgetAura::GetNativeWindowProperty(const char* name) const {
|
||||
PropsMap::const_iterator i = props_map_.find(name);
|
||||
return i == props_map_.end() ? NULL : i->second;
|
||||
return window_ ? ViewProp::GetValue(window_, name) : NULL;
|
||||
}
|
||||
|
||||
TooltipManager* NativeWidgetAura::GetTooltipManager() const {
|
||||
@ -538,6 +550,7 @@ void NativeWidgetAura::OnWindowDestroying() {
|
||||
}
|
||||
|
||||
void NativeWidgetAura::OnWindowDestroyed() {
|
||||
props_.reset();
|
||||
window_ = NULL;
|
||||
delegate_->OnNativeWidgetDestroyed();
|
||||
if (ownership_ == Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET)
|
||||
|
@ -6,8 +6,7 @@
|
||||
#define VIEWS_WIDGET_NATIVE_WIDGET_AURA_H_
|
||||
#pragma once
|
||||
|
||||
#include <map>
|
||||
|
||||
#include "base/memory/scoped_vector.h"
|
||||
#include "base/memory/weak_ptr.h"
|
||||
#include "ui/aura/window_delegate.h"
|
||||
#include "views/views_export.h"
|
||||
@ -20,6 +19,10 @@ namespace gfx {
|
||||
class Font;
|
||||
}
|
||||
|
||||
namespace ui {
|
||||
class ViewProp;
|
||||
}
|
||||
|
||||
namespace views {
|
||||
|
||||
class VIEWS_EXPORT NativeWidgetAura : public internal::NativeWidgetPrivate,
|
||||
@ -138,7 +141,7 @@ class VIEWS_EXPORT NativeWidgetAura : public internal::NativeWidgetPrivate,
|
||||
virtual void OnWindowVisibilityChanged(bool visible) OVERRIDE;
|
||||
|
||||
private:
|
||||
typedef std::map<const char*, void*> PropsMap;
|
||||
typedef ScopedVector<ui::ViewProp> ViewProps;
|
||||
|
||||
internal::NativeWidgetDelegate* delegate_;
|
||||
|
||||
@ -153,11 +156,10 @@ class VIEWS_EXPORT NativeWidgetAura : public internal::NativeWidgetPrivate,
|
||||
|
||||
bool can_activate_;
|
||||
|
||||
// Map used by Set/GetNativeWindowProperty.
|
||||
PropsMap props_map_;
|
||||
|
||||
gfx::NativeCursor cursor_;
|
||||
|
||||
ViewProps props_;
|
||||
|
||||
DISALLOW_COPY_AND_ASSIGN(NativeWidgetAura);
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user