diff options
Diffstat (limited to 'ui/views/examples/example_base.cc')
-rw-r--r-- | ui/views/examples/example_base.cc | 67 |
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 |