Index: mojo/examples/embedded_app/embedded_app.cc |
diff --git a/mojo/examples/embedded_app/embedded_app.cc b/mojo/examples/embedded_app/embedded_app.cc |
index 6ca0ad3ece27d73c1792f433fb7c52ce582c4a81..ea1460b219dfbaccf5409473b81c7201cbe40544 100644 |
--- a/mojo/examples/embedded_app/embedded_app.cc |
+++ b/mojo/examples/embedded_app/embedded_app.cc |
@@ -4,15 +4,35 @@ |
#include "base/basictypes.h" |
#include "base/bind.h" |
+#include "mojo/examples/window_manager/window_manager.mojom.h" |
#include "mojo/public/cpp/application/application.h" |
#include "mojo/services/public/cpp/view_manager/view.h" |
#include "mojo/services/public/cpp/view_manager/view_manager.h" |
+#include "mojo/services/public/cpp/view_manager/view_observer.h" |
#include "mojo/services/public/cpp/view_manager/view_tree_node.h" |
+#include "mojo/services/public/cpp/view_manager/view_tree_node_observer.h" |
+#include "ui/events/event_constants.h" |
+ |
+using mojo::view_manager::View; |
+using mojo::view_manager::ViewManager; |
+using mojo::view_manager::ViewObserver; |
+using mojo::view_manager::ViewTreeNode; |
+using mojo::view_manager::ViewTreeNodeObserver; |
namespace mojo { |
namespace examples { |
+namespace { |
+ |
+const SkColor kColors[] = { SK_ColorYELLOW, |
+ SK_ColorRED, |
+ SK_ColorGREEN, |
+ SK_ColorMAGENTA }; |
+ |
+} // namespace |
-class EmbeddedApp : public Application { |
+class EmbeddedApp : public Application, |
+ public ViewObserver, |
+ public ViewTreeNodeObserver { |
public: |
EmbeddedApp() : view_manager_(NULL) {} |
virtual ~EmbeddedApp() {} |
@@ -20,27 +40,52 @@ class EmbeddedApp : public Application { |
private: |
// Overridden from Application: |
virtual void Initialize() MOJO_OVERRIDE { |
- view_manager::ViewManager::Create(this, |
- base::Bind(&EmbeddedApp::OnRootAdded, base::Unretained(this))); |
+ ViewManager::Create(this, |
+ base::Bind(&EmbeddedApp::OnRootAdded, base::Unretained(this)), |
+ base::Bind(&EmbeddedApp::OnRootRemoved, base::Unretained(this))); |
+ ConnectTo<IWindowManager>("mojo:mojo_window_manager", &window_manager_); |
+ } |
+ |
+ // Overridden from ViewObserver: |
+ virtual void OnViewInputEvent(View* view, EventPtr event) OVERRIDE { |
+ if (event->action == ui::ET_MOUSE_RELEASED) |
+ window_manager_->CloseWindow(view->node()->id()); |
} |
- void OnRootAdded(view_manager::ViewManager* view_manager) { |
+ // Overridden from ViewTreeNodeObserver: |
+ virtual void OnNodeActiveViewChange( |
+ ViewTreeNode* node, |
+ View* old_view, |
+ View* new_view, |
+ ViewTreeNodeObserver::DispositionChangePhase phase) OVERRIDE { |
+ if (new_view == 0) |
+ views_to_reap_[node] = old_view; |
+ } |
+ |
+ void OnRootAdded(ViewManager* view_manager, ViewTreeNode* root) { |
if (!view_manager_) |
view_manager_ = view_manager; |
DCHECK_EQ(view_manager_, view_manager); |
- if (view_manager_->roots().size() == 1) { |
- view_manager::View* view = view_manager::View::Create(view_manager_); |
- view_manager_->roots().front()->SetActiveView(view); |
- view->SetColor(SK_ColorYELLOW); |
- } else { |
- view_manager::View* view = view_manager::View::Create(view_manager_); |
- view_manager_->roots().back()->SetActiveView(view); |
- view->SetColor(SK_ColorRED); |
- } |
+ View* view = View::Create(view_manager_); |
+ view->AddObserver(this); |
+ root->SetActiveView(view); |
+ root->AddObserver(this); |
+ size_t index = view_manager_->roots().size() - 1; |
+ view->SetColor(kColors[index % arraysize(kColors)]); |
+ } |
+ |
+ void OnRootRemoved(ViewManager* view_manager, |
+ ViewTreeNode* root) { |
+ std::map<ViewTreeNode*, View*>::const_iterator it = |
+ views_to_reap_.find(root); |
+ if (it != views_to_reap_.end()) |
+ it->second->Destroy(); |
} |
- view_manager::ViewManager* view_manager_; |
+ IWindowManagerPtr window_manager_; |
+ ViewManager* view_manager_; |
+ std::map<ViewTreeNode*, View*> views_to_reap_; |
DISALLOW_COPY_AND_ASSIGN(EmbeddedApp); |
}; |