| Index: chrome/browser/ui/gtk/gtk_tree.h
|
| diff --git a/chrome/browser/ui/gtk/gtk_tree.h b/chrome/browser/ui/gtk/gtk_tree.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..4a1c0690551b75a5eda77313ca2feef1de8de171
|
| --- /dev/null
|
| +++ b/chrome/browser/ui/gtk/gtk_tree.h
|
| @@ -0,0 +1,207 @@
|
| +// Copyright (c) 2010 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_GTK_GTK_TREE_H_
|
| +#define CHROME_BROWSER_UI_GTK_GTK_TREE_H_
|
| +#pragma once
|
| +
|
| +#include <gtk/gtk.h>
|
| +#include <set>
|
| +#include <vector>
|
| +
|
| +#include "app/table_model_observer.h"
|
| +#include "app/tree_model.h"
|
| +#include "base/basictypes.h"
|
| +#include "chrome/browser/remove_rows_table_model.h"
|
| +
|
| +class TableModel;
|
| +
|
| +namespace gtk_tree {
|
| +
|
| +// Get the row number corresponding to |path|.
|
| +gint GetRowNumForPath(GtkTreePath* path);
|
| +
|
| +// Get the row number corresponding to |iter|.
|
| +gint GetRowNumForIter(GtkTreeModel* model, GtkTreeIter* iter);
|
| +
|
| +// Get the row number in the child tree model corresponding to |sort_path| in
|
| +// the parent tree model.
|
| +gint GetTreeSortChildRowNumForPath(GtkTreeModel* sort_model,
|
| + GtkTreePath* sort_path);
|
| +
|
| +// Select the given row by number.
|
| +void SelectAndFocusRowNum(int row, GtkTreeView* tree_view);
|
| +
|
| +// Remove the row and all its children from the |tree_store|. If there is a
|
| +// following row, |iter| will be updated to point to the it and the return value
|
| +// will be true, otherwise the return will be false and |iter| is no longer
|
| +// valid.
|
| +bool RemoveRecursively(GtkTreeStore* tree_store, GtkTreeIter* iter);
|
| +
|
| +// Writes all the indexes of selected rows into |out|.
|
| +void GetSelectedIndices(GtkTreeSelection* selection, std::set<int>* out);
|
| +
|
| +// A helper class for populating a GtkListStore from a TableModel.
|
| +class TableAdapter : public TableModelObserver {
|
| + public:
|
| +
|
| + enum ColumnID {
|
| + COL_TITLE = 0,
|
| + COL_IS_HEADER,
|
| + COL_IS_SEPARATOR,
|
| + COL_GROUP_ID,
|
| + COL_WEIGHT,
|
| + COL_WEIGHT_SET,
|
| + COL_LAST_ID
|
| + };
|
| +
|
| + class Delegate {
|
| + public:
|
| + // Should fill in the column and row.
|
| + virtual void SetColumnValues(int row, GtkTreeIter* iter) = 0;
|
| +
|
| + // Called after any change to the TableModel but before the corresponding
|
| + // change to the GtkListStore.
|
| + virtual void OnAnyModelUpdateStart() {}
|
| +
|
| + // Called after any change to the TableModel.
|
| + virtual void OnAnyModelUpdate() {}
|
| +
|
| + // When the TableModel has been completely changed, called by OnModelChanged
|
| + // after clearing the list store. Can be overriden by the delegate if it
|
| + // needs to do extra initialization before the list store is populated.
|
| + virtual void OnModelChanged() {}
|
| +
|
| + protected:
|
| + virtual ~Delegate() {}
|
| + };
|
| +
|
| + // |table_model| may be NULL.
|
| + TableAdapter(Delegate* delegate,
|
| + GtkListStore* list_store,
|
| + TableModel* table_model);
|
| + virtual ~TableAdapter() {}
|
| +
|
| + // Replace the TableModel with a different one. If the list store currenty
|
| + // has items this would cause weirdness, so this should generally only be
|
| + // called during the Delegate's OnModelChanged call, or if the adapter was
|
| + // created with a NULL |table_model|.
|
| + void SetModel(TableModel* table_model);
|
| +
|
| + // Add all model rows corresponding to the given list store indices to |rows|.
|
| + void MapListStoreIndicesToModelRows(const std::set<int>& list_store_indices,
|
| + RemoveRowsTableModel::Rows* model_rows);
|
| +
|
| + // GtkTreeModel callbacks:
|
| + // Callback checking whether a row should be drawn as a separator.
|
| + static gboolean OnCheckRowIsSeparator(GtkTreeModel* model,
|
| + GtkTreeIter* iter,
|
| + gpointer user_data);
|
| +
|
| + // Callback checking whether a row may be selected. We use some rows in the
|
| + // table as headers/separators for the groups, which should not be selectable.
|
| + static gboolean OnSelectionFilter(GtkTreeSelection* selection,
|
| + GtkTreeModel* model,
|
| + GtkTreePath* path,
|
| + gboolean path_currently_selected,
|
| + gpointer user_data);
|
| +
|
| + // TableModelObserver implementation.
|
| + virtual void OnModelChanged();
|
| + virtual void OnItemsChanged(int start, int length);
|
| + virtual void OnItemsAdded(int start, int length);
|
| + virtual void OnItemsRemoved(int start, int length);
|
| +
|
| + private:
|
| + // Return whether the row pointed to by |iter| is a group row, i.e. a group
|
| + // header, or a separator.
|
| + bool IsGroupRow(GtkTreeIter* iter) const;
|
| +
|
| + // Return the index into the list store for the given model row.
|
| + int GetListStoreIndexForModelRow(int model_row) const;
|
| +
|
| + // Add the values from |row| of the TableModel.
|
| + void AddNodeToList(int row);
|
| +
|
| + Delegate* delegate_;
|
| + GtkListStore* list_store_;
|
| + TableModel* table_model_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(TableAdapter);
|
| +};
|
| +
|
| +// A helper class for populating a GtkTreeStore from a TreeModel.
|
| +// TODO(mattm): support SetRootShown(true)
|
| +class TreeAdapter : public TreeModelObserver {
|
| + public:
|
| + // Column ids for |tree_store_|.
|
| + enum {
|
| + COL_ICON,
|
| + COL_TITLE,
|
| + COL_NODE_PTR,
|
| + COL_COUNT,
|
| + };
|
| +
|
| + class Delegate {
|
| + public:
|
| + // Called after any change to the TreeModel but before the corresponding
|
| + // change to the GtkTreeStore.
|
| + virtual void OnAnyModelUpdateStart() {}
|
| +
|
| + // Called after any change to the GtkTreeStore.
|
| + virtual void OnAnyModelUpdate() {}
|
| +
|
| + protected:
|
| + virtual ~Delegate() {}
|
| + };
|
| +
|
| + TreeAdapter(Delegate* delegate, TreeModel* tree_model);
|
| + virtual ~TreeAdapter();
|
| +
|
| + // Populate the tree store from the |tree_model_|.
|
| + void Init();
|
| +
|
| + // Return the tree store.
|
| + GtkTreeStore* tree_store() { return tree_store_; }
|
| +
|
| + // Get the TreeModelNode corresponding to iter in the tree store.
|
| + TreeModelNode* GetNode(GtkTreeIter* iter);
|
| +
|
| + // Begin TreeModelObserver implementation.
|
| + virtual void TreeNodesAdded(TreeModel* model,
|
| + TreeModelNode* parent,
|
| + int start,
|
| + int count);
|
| + virtual void TreeNodesRemoved(TreeModel* model,
|
| + TreeModelNode* parent,
|
| + int start,
|
| + int count);
|
| + virtual void TreeNodeChanged(TreeModel* model, TreeModelNode* node);
|
| + // End TreeModelObserver implementation.
|
| +
|
| + private:
|
| + // Fill the tree store values for a given node.
|
| + void FillRow(GtkTreeIter* iter, TreeModelNode* node);
|
| +
|
| + // Fill the tree store for a row and all its descendants.
|
| + void Fill(GtkTreeIter* parent_iter, TreeModelNode* parent_node);
|
| +
|
| + // Get the GtkTreePath in the tree store for the given node.
|
| + // The returned path should be freed with gtk_tree_path_free.
|
| + GtkTreePath* GetTreePath(TreeModelNode* node);
|
| +
|
| + // Get the GtkTreeIter in the tree store for the given node.
|
| + bool GetTreeIter(TreeModelNode* node, GtkTreeIter* iter);
|
| +
|
| + Delegate* delegate_;
|
| + GtkTreeStore* tree_store_;
|
| + TreeModel* tree_model_;
|
| + std::vector<GdkPixbuf*> pixbufs_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(TreeAdapter);
|
| +};
|
| +
|
| +} // namespace gtk_tree
|
| +
|
| +#endif // CHROME_BROWSER_UI_GTK_GTK_TREE_H_
|
|
|