Include a stripped-down version of FLTK in tree and add a USE_INCLUDED_FLTK option to build against it.


git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@4603 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/common/fltk/FL/Fl_Tree_Item.H b/common/fltk/FL/Fl_Tree_Item.H
new file mode 100644
index 0000000..3c579fa
--- /dev/null
+++ b/common/fltk/FL/Fl_Tree_Item.H
@@ -0,0 +1,337 @@
+//
+// "$Id: Fl_Tree_Item.H 8340 2011-01-30 20:22:06Z greg.ercolano $"
+//
+
+#ifndef FL_TREE_ITEM_H
+#define FL_TREE_ITEM_H
+
+#include <FL/Fl.H>
+#include <FL/Fl_Widget.H>
+#include <FL/Fl_Image.H>
+#include <FL/fl_draw.H>
+
+#include <FL/Fl_Tree_Item_Array.H>
+#include <FL/Fl_Tree_Prefs.H>
+
+//////////////////////
+// FL/Fl_Tree_Item.H
+//////////////////////
+//
+// Fl_Tree -- This file is part of the Fl_Tree widget for FLTK
+// Copyright (C) 2009-2010 by Greg Ercolano.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Library General Public
+// License as published by the Free Software Foundation; either
+// version 2 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Library General Public License for more details.
+//
+// You should have received a copy of the GNU Library General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+// USA.
+//
+
+///
+/// \file
+/// \brief This file contains the definitions for Fl_Tree_Item
+///
+
+/// \brief Tree item
+///
+/// This class is a single tree item, and manages all of the item's attributes.
+/// Fl_Tree_Item is used by Fl_Tree, which is comprised of many instances of Fl_Tree_Item.
+///
+/// Fl_Tree_Item is hierarchical; it dynamically manages an Fl_Tree_Item_Array of children
+/// that are themselves instances of Fl_Tree_Item. Each item can have zero or more children.
+/// When an item has children, close() and open() can be used to hide or show them.
+///
+/// Items have their own attributes; font size, face, color.
+/// Items maintain their own hierarchy of children.
+///
+/// When you make changes to items, you'll need to tell the tree to redraw()
+/// for the changes to show up.
+///
+class FL_EXPORT Fl_Tree_Item {
+  const char             *_label;		// label (memory managed)
+  Fl_Font                 _labelfont;		// label's font face
+  Fl_Fontsize             _labelsize;		// label's font size
+  Fl_Color                _labelfgcolor;	// label's fg color
+  Fl_Color                _labelbgcolor;	// label's bg color
+  char                    _open;		// item is open?
+  char                    _visible;		// item is visible?
+  char                    _active;		// item activated?
+  char                    _selected;		// item selected?
+  int                     _xywh[4];		// xywh of this widget (if visible)
+  int                     _collapse_xywh[4];	// xywh of collapse icon (if any)
+  int                     _label_xywh[4];	// xywh of label
+  Fl_Widget              *_widget;		// item's label widget (optional)
+  Fl_Image               *_usericon;		// item's user-specific icon (optional)
+  Fl_Tree_Item_Array      _children;		// array of child items
+  Fl_Tree_Item           *_parent;		// parent item (=0 if root)
+  void                   *_userdata;    	// user data that can be associated with an item
+protected:
+  void show_widgets();
+  void hide_widgets();
+  void draw_vertical_connector(int x, int y1, int y2, const Fl_Tree_Prefs &prefs);
+  void draw_horizontal_connector(int x1, int x2, int y, const Fl_Tree_Prefs &prefs);
+public:
+  Fl_Tree_Item(const Fl_Tree_Prefs &prefs);	// CTOR
+  ~Fl_Tree_Item();				// DTOR
+  Fl_Tree_Item(const Fl_Tree_Item *o);		// COPY CTOR
+  int x() const { return(_xywh[0]); }
+  int y() const { return(_xywh[1]); }
+  int w() const { return(_xywh[2]); }
+  int h() const { return(_xywh[3]); }
+  void draw(int X, int &Y, int W, Fl_Widget *tree, Fl_Tree_Item *itemfocus, const Fl_Tree_Prefs &prefs, int lastchild=1);
+  void show_self(const char *indent = "") const;
+  void label(const char *val);
+  const char *label() const;
+
+  /// Set a user-data value for the item.
+  inline void user_data( void* data ) { _userdata = data; }
+
+  /// Retrieve the user-data value that has been assigned to the item.
+  inline void* user_data() const { return _userdata; }
+  
+  /// Set item's label font face.
+  void labelfont(Fl_Font val) {
+    _labelfont = val; 
+  }
+  /// Get item's label font face.
+  Fl_Font labelfont() const {
+    return(_labelfont);
+  }
+  /// Set item's label font size.
+  void labelsize(Fl_Fontsize val) {
+    _labelsize = val; 
+  }
+  /// Get item's label font size.
+  Fl_Fontsize labelsize() const {
+    return(_labelsize);
+  }
+  /// Set item's label foreground text color.
+  void labelfgcolor(Fl_Color val) {
+    _labelfgcolor = val; 
+  }
+  /// Set item's label text color.
+  void labelcolor(Fl_Color val) {
+    _labelfgcolor = val; 
+  }
+  /// Return item's label text color.
+  Fl_Color labelcolor() const {
+    return(_labelfgcolor); 
+  }
+  /// Return item's label foreground text color.
+  Fl_Color labelfgcolor() const {
+    return(_labelfgcolor); 
+  }
+  /// Set item's label background color.
+  void labelbgcolor(Fl_Color val) {
+    _labelbgcolor = val; 
+  }
+  /// Return item's background text color.
+  Fl_Color labelbgcolor() const {
+    return(_labelbgcolor); 
+  }
+  /// Assign an FLTK widget to this item.
+  void widget(Fl_Widget *val) {
+    _widget = val; 
+  }
+  /// Return FLTK widget assigned to this item.
+  Fl_Widget *widget() const {
+    return(_widget); 
+  }
+  /// Return the number of children this item has.
+  int children() const {
+    return(_children.total()); 
+  }
+  /// Return the child item for the given 'index'.
+  Fl_Tree_Item *child(int index) {
+    return(_children[index]); 
+  }
+  /// Return the const child item for the given 'index'.
+  const Fl_Tree_Item *child(int t) const;
+  /// See if this item has children.
+  int has_children() const {
+    return(children()); 
+  }
+  int find_child(const char *name);
+  int find_child(Fl_Tree_Item *item);
+  int remove_child(Fl_Tree_Item *item);
+  int remove_child(const char *new_label);
+  void clear_children();
+  void swap_children(int ax, int bx);
+  int swap_children(Fl_Tree_Item *a, Fl_Tree_Item *b);
+  const Fl_Tree_Item *find_child_item(char **arr) const;	// const
+        Fl_Tree_Item *find_child_item(char **arr);		// non-const
+  const Fl_Tree_Item *find_item(char **arr) const;		// const
+        Fl_Tree_Item *find_item(char **arr);			// non-const
+  //////////////////
+  // Adding items
+  //////////////////
+  Fl_Tree_Item *add(const Fl_Tree_Prefs &prefs, const char *new_label);
+  Fl_Tree_Item *add(const Fl_Tree_Prefs &prefs, char **arr);
+  Fl_Tree_Item *insert(const Fl_Tree_Prefs &prefs, const char *new_label, int pos=0);
+  Fl_Tree_Item *insert_above(const Fl_Tree_Prefs &prefs, const char *new_label);
+  int depth() const;
+  Fl_Tree_Item *prev();
+  Fl_Tree_Item *next();
+  Fl_Tree_Item *next_sibling();
+  Fl_Tree_Item *prev_sibling();
+  Fl_Tree_Item *next_displayed(Fl_Tree_Prefs &prefs);
+  Fl_Tree_Item *prev_displayed(Fl_Tree_Prefs &prefs);
+  
+  /// Return the parent for this item. Returns NULL if we are the root.
+  Fl_Tree_Item *parent() {
+    return(_parent);
+  }
+  /// Return the const parent for this item. Returns NULL if we are the root.
+  const Fl_Tree_Item *parent() const {
+    return(_parent);
+  }
+  /// Set the parent for this item.
+  /// Should only be used by Fl_Tree's internals.
+  ///
+  void parent(Fl_Tree_Item *val) {
+    _parent = val;
+  }
+  //////////////////
+  // State
+  //////////////////
+  void open();
+  void close();
+  /// See if the item is 'open'.
+  int is_open() const {
+    return(_open?1:0);
+  }
+  /// See if the item is 'closed'.
+  int is_close() const {
+    return(_open?0:1);
+  }
+  /// Toggle the item's open/closed state.
+  void open_toggle() {
+    _open?close():open();
+  }
+  /// Change the item's selection state to the optionally specified 'val'.
+  /// If 'val' is not specified, the item will be selected.
+  ///
+  void select(int val=1) {
+    _selected = val;
+  }
+  /// Toggle the item's selection state.
+  void select_toggle() {
+    if ( is_selected() ) {
+      deselect();		// deselect if selected
+    } else {
+      select();		// select if deselected
+    }
+  }
+  /// Select self and all children
+  ///     Returns count of how many items were in the 'deselected' state,
+  ///     ie. how many items were "changed".
+  ///
+  int select_all() {
+    int count = 0;
+    if ( ! is_selected() ) {
+      select();
+      ++count;
+    }
+    for ( int t=0; t<children(); t++ ) {
+      count += child(t)->select_all();
+    }
+    return(count);
+  }
+  /// Disable the item's selection state.
+  void deselect() {
+    _selected = 0;
+  }
+  /// Deselect self and all children
+  ///     Returns count of how many items were in the 'selected' state,
+  ///     ie. how many items were "changed".
+  ///
+  int deselect_all() {
+    int count = 0;
+    if ( is_selected() ) {
+      deselect();
+      ++count;
+    }
+    for ( int t=0; t<children(); t++ ) {
+      count += child(t)->deselect_all();
+    }
+    return(count);
+  }
+  /// See if the item is selected.
+  char is_selected() const {
+    return(_selected);
+  }
+  /// Change the item's activation state to the optionally specified 'val'.
+  ///
+  /// When deactivated, the item will be 'grayed out'; the callback() 
+  /// won't be invoked if the user clicks on the label. If the item
+  /// has a widget() associated with the item, its activation state
+  /// will be changed as well.
+  ///
+  /// If 'val' is not specified, the item will be activated.
+  ///
+  void activate(int val=1) {
+    _active = val;
+    if ( _widget && val != (int)_widget->active() ) {
+      if ( val ) {
+	_widget->activate();
+      } else {
+	_widget->deactivate();
+      }
+      _widget->redraw();
+    }
+  }
+  /// Deactivate the item; the callback() won't be invoked when clicked.
+  /// Same as activate(0)
+  ///
+  void deactivate() {
+    activate(0);
+  }
+  /// See if the item is activated.
+  char is_activated() const {
+    return(_active);
+  }
+  /// See if the item is activated.
+  char is_active() const {
+    return(_active);
+  }
+  /// See if the item is visible.
+  int visible() const {
+    return(_visible ? 1 : 0);
+  }
+  int visible_r() const;
+
+  /// Set the user icon's image. '0' will disable.
+  void usericon(Fl_Image *val) {
+    _usericon = val;
+  }
+  /// Get the user icon. Returns '0' if disabled.
+  Fl_Image *usericon() const {
+    return(_usericon);
+  }
+  //////////////////
+  // Events
+  //////////////////
+  const Fl_Tree_Item *find_clicked(const Fl_Tree_Prefs &prefs) const;
+  Fl_Tree_Item *find_clicked(const Fl_Tree_Prefs &prefs);
+  int event_on_collapse_icon(const Fl_Tree_Prefs &prefs) const;
+  int event_on_label(const Fl_Tree_Prefs &prefs) const;
+  /// Is this item the root of the tree?
+  int is_root() const {
+    return(_parent==0?1:0);
+  }
+};
+
+#endif /*FL_TREE_ITEM_H*/
+
+//
+// End of "$Id: Fl_Tree_Item.H 8340 2011-01-30 20:22:06Z greg.ercolano $".
+//