summaryrefslogtreecommitdiffstats
path: root/ui/views/examples/example_base.cc
diff options
context:
space:
mode:
Diffstat (limited to 'ui/views/examples/example_base.cc')
-rw-r--r--ui/views/examples/example_base.cc67
1 files changed, 67 insertions, 0 deletions
diff --git a/ui/views/examples/example_base.cc b/ui/views/examples/example_base.cc
new file mode 100644
index 0000000..f4ced56
--- /dev/null
+++ b/ui/views/examples/example_base.cc
@@ -0,0 +1,67 @@
+// 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 "ui/views/examples/example_base.h"
+
+#include <stdarg.h>
+
+#include "base/compiler_specific.h"
+#include "base/stringprintf.h"
+#include "ui/views/examples/examples_main.h"
+
+namespace {
+
+// Some of GTK based view classes require NativeWidgetGtk in the view
+// parent chain. This class is used to defer the creation of such
+// views until a NativeWidgetGtk is added to the view hierarchy.
+class ContainerView : public views::View {
+ public:
+ explicit ContainerView(examples::ExampleBase* base)
+ : example_view_created_(false),
+ example_base_(base) {
+ }
+
+ private:
+ // Overridden from views::View:
+ virtual void ViewHierarchyChanged(bool is_add,
+ views::View* parent,
+ views::View* child) OVERRIDE {
+ views::View::ViewHierarchyChanged(is_add, parent, child);
+ // We're not using child == this because a Widget may not be
+ // availalbe when this is added to the hierarchy.
+ if (is_add && GetWidget() && !example_view_created_) {
+ example_view_created_ = true;
+ example_base_->CreateExampleView(this);
+ }
+ }
+
+ // True if the example view has already been created, or false otherwise.
+ bool example_view_created_;
+
+ examples::ExampleBase* example_base_;
+
+ DISALLOW_COPY_AND_ASSIGN(ContainerView);
+};
+
+} // namespace
+
+namespace examples {
+
+ExampleBase::~ExampleBase() {}
+
+ExampleBase::ExampleBase(ExamplesMain* main, const char* title)
+ : main_(main), example_title_(title) {
+ container_ = new ContainerView(this);
+}
+
+// Prints a message in the status area, at the bottom of the window.
+void ExampleBase::PrintStatus(const char* format, ...) {
+ va_list ap;
+ va_start(ap, format);
+ std::string msg;
+ base::StringAppendV(&msg, format, ap);
+ main_->SetStatus(msg);
+}
+
+} // namespace examples