172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#ifndef CHROME_BROWSER_UI_GTK_GTK_CHROME_SHRINKABLE_HBOX_H_
672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#define CHROME_BROWSER_UI_GTK_GTK_CHROME_SHRINKABLE_HBOX_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <gdk/gdk.h>
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <gtk/gtk.h>
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A specialized container derived from GtkHBox, which can shrink or hide its
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// children one by one to fit into its width.
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Limitations of this container:
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// - All children should have the same pack type, otherwise they may be
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   overlapped with each other.
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// - All children must be packed with expand == false and fill == false,
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   otherwise they may be overlapped with each other.
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// - The visibility of a child is adjusted automatically according to the
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   container's width. The child may not show or hide itself.
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochG_BEGIN_DECLS
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GTK_TYPE_CHROME_SHRINKABLE_HBOX                                 \
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    (gtk_chrome_shrinkable_hbox_get_type())
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GTK_CHROME_SHRINKABLE_HBOX(obj)                                 \
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    (G_TYPE_CHECK_INSTANCE_CAST((obj), GTK_TYPE_CHROME_SHRINKABLE_HBOX, \
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                GtkChromeShrinkableHBox))
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GTK_CHROME_SHRINKABLE_HBOX_CLASS(klass)                         \
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    (G_TYPE_CHECK_CLASS_CAST((klass), GTK_TYPE_CHROME_SHRINKABLE_HBOX,  \
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             GtkChromeShrinkableHBoxClass))
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GTK_IS_CHROME_SHRINKABLE_HBOX(obj)                              \
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    (G_TYPE_CHECK_INSTANCE_TYPE((obj), GTK_TYPE_CHROME_SHRINKABLE_HBOX))
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GTK_IS_CHROME_SHRINKABLE_HBOX_CLASS(klass)                      \
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    (G_TYPE_CHECK_CLASS_TYPE((klass), GTK_TYPE_CHROME_SHRINKABLE_HBOX))
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GTK_CHROME_SHRINKABLE_HBOX_GET_CLASS(obj)                       \
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    (G_TYPE_INSTANCE_GET_CLASS((obj), GTK_TYPE_CHROME_SHRINKABLE_HBOX,  \
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               GtkChromeShrinkableHBoxClass))
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtypedef struct _GtkChromeShrinkableHBox GtkChromeShrinkableHBox;
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtypedef struct _GtkChromeShrinkableHBoxClass GtkChromeShrinkableHBoxClass;
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct _GtkChromeShrinkableHBox {
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Parent class.
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GtkHBox hbox;
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gboolean hide_child_directly;
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Private
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int children_width_requisition;
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct _GtkChromeShrinkableHBoxClass {
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GtkHBoxClass parent_class;
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochGType gtk_chrome_shrinkable_hbox_get_type() G_GNUC_CONST;
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Creates a new shrinkable hbox.
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// If |hide_child_directly| is true then its child widgets will be hid directly
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// if they are too wide to be fit into the hbox's width. Otherwise they will be
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// shrunk first before being hid completely.
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochGtkWidget* gtk_chrome_shrinkable_hbox_new(gboolean hide_child_directly,
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          gboolean homogeneous,
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          gint spacing);
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid gtk_chrome_shrinkable_hbox_set_hide_child_directly(
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GtkChromeShrinkableHBox* box, gboolean hide_child_directly);
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochgboolean gtk_chrome_shrinkable_hbox_get_hide_child_directly(
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GtkChromeShrinkableHBox* box);
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid gtk_chrome_shrinkable_hbox_pack_start(GtkChromeShrinkableHBox* box,
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                           GtkWidget* child,
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                           guint padding);
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid gtk_chrome_shrinkable_hbox_pack_end(GtkChromeShrinkableHBox* box,
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                         GtkWidget* child,
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                         guint padding);
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochgint gtk_chrome_shrinkable_hbox_get_visible_child_count(
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GtkChromeShrinkableHBox* box);
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochG_END_DECLS
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
8772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#endif  // CHROME_BROWSER_UI_GTK_GTK_CHROME_SHRINKABLE_HBOX_H_
88