vdk 2.4.0
vdktreeview.h
00001 /*
00002  * ===========================
00003  * VDK Visual Development Kit
00004  * Version 2.0
00005  * November 2001
00006  * ===========================
00007  *
00008  * Copyright (C) 1998, Mario Motta
00009  * Developed by Mario Motta <mmotta@guest.net>
00010  *
00011  * This library is free software; you can redistribute it and/or
00012  * modify it under the terms of the GNU Library General Public
00013  * License as published by the Free Software Foundation; either
00014  * version 2 of the License, or (at your option) any later version.
00015  *
00016  * This library is distributed in the hope that it will be useful,
00017  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00018  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00019  * Library General Public License for more details.
00020  *
00021  * You should have received a copy of the GNU Library General Public
00022  * License along with this library; if not, write to the Free Software
00023  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
00024  * 02111-1307, USA.
00025  */
00026 
00027 #ifndef TREEVIEW_H
00028 #define TREEVIEW_H
00029 #include <vdk/vdkobj.h>
00030 #include <vdk/dlist.h>
00031 #include <vdk/vdkprops.h>
00032 #include <vdk/vdkarray.h>
00033 #include <vdk/value_sem_list.h>
00034 class VDKTreeView;
00035 
00041 typedef VDKArray<VDKString> StringRow;
00042 typedef bool (*VDKStringCompareFunction)(VDKString&, VDKString&);
00043 
00044 class VDKTreeViewModelTuple: public StringRow
00045 {
00046   /*
00047   int key_index;
00048   bool (*equal)(VDKString&, VDKString&);
00049   bool (*less)(VDKString&, VDKString&);
00050   */
00051  public:
00055   VDKReadWriteValueProp<VDKTreeViewModelTuple,int> KeyIndex;  
00059   VDKReadWriteValueProp<VDKTreeViewModelTuple,VDKStringCompareFunction> Less;  
00063   VDKReadWriteValueProp<VDKTreeViewModelTuple,VDKStringCompareFunction> Equal;  
00074   VDKTreeViewModelTuple(int n = 0, int key = 0, VDKStringCompareFunction less = NULL,
00075                         VDKStringCompareFunction equal= NULL): 
00076     StringRow(n),
00077     KeyIndex("KeyIndex",this,key),
00078     Less("Less",this,less),
00079     Equal("Equal",this,equal)
00080     {
00081       
00082     }
00083 
00084   virtual ~VDKTreeViewModelTuple() {}
00085   /*
00086   VDKTreeViewModelTuple(const VDKTreeViewModelTuple& tuple) 
00087     {
00088       *this = tuple;
00089     }
00090   
00091   VDKTreeViewModelTuple& operator=(const VDKTreeViewModelTuple& tuple)
00092   {
00093     resize(tuple.size());
00094     for(int t = 0; t < size(); t++)
00095       (*this)[t] = tuple[t];
00096     int key_index = tuple.KeyIndex;
00097     VDKStringCompareFunction less = tuple.Less;
00098     VDKStringCompareFunction equal = tuple.Equal;
00099     KeyIndex = key_index;
00100     Less = less;
00101     Equal = equal;
00102   }
00103   */
00104   int operator <(VDKTreeViewModelTuple& t) 
00105     { 
00106       int key_index = KeyIndex;
00107       VDKStringCompareFunction less = Less;
00108       if(less)
00109         return less((*this)[key_index],t[key_index]);
00110       else
00111         return (*this)[key_index] < t[key_index]; 
00112     }
00113   int operator==(VDKTreeViewModelTuple& t)
00114     { 
00115       int key_index = KeyIndex;
00116       VDKStringCompareFunction equal = Equal;
00117       if(equal)
00118         return equal((*this)[key_index],t[key_index]);
00119       else
00120         return (*this)[key_index] == t[key_index]; 
00121     }
00122 };
00123 
00124 typedef VDKValueList<VDKTreeViewModelTuple>         VDKTreeViewModelTupleList;  
00125 typedef VDKValueListIterator<VDKTreeViewModelTuple> VDKTreeViewModelTupleListIterator;
00126 typedef VDKArray<VDKTreeViewModelTuple>             VDKTreeViewModelTupleArray;  
00133 class VDKTreeViewModel: public VDKNotCopyAble
00134 {
00135  protected:
00136   GtkTreeStore *model;
00137   // GtkTreeIter iter;
00138  public:
00142   GtkTreeStore* GtkModel() { return model; }
00148   VDKTreeViewModel(GType* types, int ncol);
00152   ~VDKTreeViewModel();
00166   void AppendBlank(GtkTreeIter* iter,GtkTreeIter* parent = NULL);
00181   void PrependBlank(GtkTreeIter* iter,GtkTreeIter* parent = NULL);
00191   void InsertTuple(GtkTreeIter* iter,VDKTreeViewModelTuple &tuple,GtkTreeIter* parent = NULL, bool recurse = false);
00195   void Clear();
00200   void Remove(GtkTreeIter* i);
00213   void SetData(GtkTreeIter* node,...);
00238   void SetCell(GtkTreeIter* node, int column, const char* value);
00287   char *GetCell(GtkTreeIter* node, int column);
00295   void GetTuple(GtkTreeIter* node,VDKTreeViewModelTuple& tuple);
00312   bool Root(GtkTreeIter* iter);
00317   bool Next(GtkTreeIter* iter);
00322   bool HasChild(GtkTreeIter* iter)
00323     { return gtk_tree_model_iter_has_child (GTK_TREE_MODEL(model), iter); }
00331   bool Child(GtkTreeIter* iter,GtkTreeIter* parent);
00351   bool  Find(GtkTreeIter* iter,int column, char* value);
00352 
00353 };
00354 
00355 
00359 class VDKTreeViewModelIterator
00360 {
00361   VDKTreeViewModel* model;
00362   GtkTreeIter iter, *internal_iter;
00363  public:
00364   VDKTreeViewModelIterator(): model(NULL),internal_iter(NULL) {}
00371   VDKTreeViewModelIterator(VDKTreeViewModel* model,GtkTreeIter* parent = NULL);
00375   GtkTreeIter* current() { return internal_iter; }
00379   operator int() { return internal_iter != NULL; }
00407   bool HasChild();
00411   void operator++();
00415   void operator++(int);
00416 };
00417 
00422 class VDKTreeViewColumn: public VDKNotCopyAble
00423 {
00424  protected:
00425   static void edited_callback (GtkCellRendererText *cell,
00426                gchar             *path_string,
00427                gchar             *new_text,
00428                gpointer          data);
00429   static void toggled_callback (GtkCellRendererToggle *cell,
00430                                 gchar                 *path_string,
00431                                 gpointer               data);
00432  private:
00433   GtkCellRenderer *cell;
00434   GtkTreeViewColumn *column;
00435   VDKTreeView* owner;
00436   gulong handler_seq_no;
00437   int id;
00438  public:
00442   VDKReadWriteValueProp<VDKTreeViewColumn,VDKRgb> NormalBackground;
00446   VDKReadWriteValueProp<VDKTreeViewColumn,VDKRgb> Foreground;
00450   VDKReadWriteValueProp<VDKTreeViewColumn,VDKFont*> Font;
00454   VDKReadWriteValueProp<VDKTreeViewColumn,const char*> Title;
00460   VDKReadWriteValueProp<VDKTreeViewColumn,int> Width;
00464   VDKReadWriteValueProp<VDKTreeViewColumn,bool> Sortable;
00465 
00531   VDKTreeViewColumn(VDKTreeView *owner,
00532                     int column, 
00533                     char* title = NULL, 
00534                     bool editable = false, 
00535                     int editcol = -1);
00539   ~VDKTreeViewColumn();
00543   GtkTreeViewColumn *GtkColumn() { return column; }
00547   GtkCellRenderer* Renderer() { return cell; }
00551   VDKTreeView* Owner() { return owner; }
00555   void ActiveTitle(bool flag = true);
00556 
00557  protected:
00558   void SetNormalBackground(VDKRgb rgb);
00559   void SetForeground(VDKRgb rgb);
00560   void SetFont(VDKFont* font);
00561   void SetTitle(const char* title);
00562   const char* GetTitle();
00563   void SetWidth(int w);
00564   int GetWidth();
00565   void SetSortable(bool flag);
00566   bool GetSortable();
00567 };
00568 
00569 typedef VDKList<VDKTreeViewColumn> VDKTreeViewColumnList;
00570 typedef VDKListIterator<VDKTreeViewColumn> VDKTreeViewColumnListIterator;
00575 class VDKTreeViewIter: public GtkTreeIter
00576 {
00577   GtkTreeModel *model;
00578  public:
00583   VDKTreeViewIter(GtkTreeModel *model= NULL): model(model) {}
00587   GtkTreeModel* Model(GtkTreeModel* m = NULL) { if(m) model = m; return model; }
00588   // meaningless
00592   bool operator==(VDKTreeViewIter& i) { return false; }
00596   bool operator<(VDKTreeViewIter& i) { return false; }
00602   bool Child(VDKTreeViewIter* child_iter);
00608   bool Parent(VDKTreeViewIter* parent_iter);
00609 };
00610 
00611 typedef VDKArray<VDKTreeViewIter> VDKTreeViewIterArray;
00612 typedef VDKValueList<VDKTreeViewIter> VDKTreeViewIterList;
00613 typedef VDKValueListIterator<VDKTreeViewIter> VDKTreeViewIterListIterator;
00614 
00620 class VDKTreeView: public VDKObject
00621 {
00622  private:
00623   GtkTreeSelection *selection;
00624   VDKTreeViewColumnList *columns;
00625   VDKTreeViewIterList selections;
00626 
00627  protected:
00628 
00629  public:
00633   VDKReadWriteValueProp<VDKTreeView,VDKTreeViewModel*> Model;
00637   VDKReadOnlyValueProp<VDKTreeView,int> SelectedColumn;
00649   VDKTreeView(VDKForm* owner ,
00650               VDKTreeViewModel* model = NULL, 
00651               GtkSelectionMode mode = GTK_SELECTION_SINGLE);
00655   ~VDKTreeView();
00656 
00660   void SetModel(VDKTreeViewModel* model);
00661 
00665   VDKTreeViewColumnList * Columns() { return columns; }  
00669   void GetSelections();
00675   VDKTreeViewIterList &Selections() { return selections; }
00680   void SelectNode(GtkTreeIter* iter);
00685   void UnselectNode(GtkTreeIter* iter);
00691   void Expand(GtkTreeIter* iter = NULL, bool expand_all = false);
00695   void RemoveSelected(void);
00696 #ifdef USE_SIGCPLUSPLUS
00697 
00710   VDKSignal3< void, GtkTreeIter*, int , char* > OnCellEdited;
00724   VDKSignal3< void, GtkTreeIter*, int, bool>    OnCellToggled;
00725 #endif  
00726 };
00727 
00728 #endif
00729 
00730 
00731 
00732