00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 #ifndef __CSWSGRID_H__
00021 #define __CSWSGRID_H__
00022 
00023 #include "csws/csscrbar.h"
00024 #include "csutil/csvector.h"
00025 #include "csutil/csstring.h"
00026 
00039 typedef bool (*csRegionTreeFunc) (csSome node, csSome databag);
00040 
00041 class csRegionTree2D;
00042 class csSparseGrid;
00043 class csGridCell;
00044 class csGridView;
00045 class csGrid;
00046 class csSplitter;
00047 
00048 class csRegionTree2D
00049 {
00050 public:
00051   csRect region;
00052   csRegionTree2D *children[5]; 
00053   csSome data;
00054 
00055 public:
00057   csRegionTree2D ();
00059   csRegionTree2D (csRect area, csSome data);
00061   ~csRegionTree2D ();
00062 
00066   void Insert (csRect &area, csSome data);
00067 
00071   void FindRegion (const csRect &area, csVector &vLeafList);
00072 
00076   void Traverse (csRegionTreeFunc userFunc, csSome databag = NULL);
00077 
00078 };
00079 
00084 class csSparseGrid
00085 {
00086   friend class csGrid;
00087   
00088 
00089 
00090   struct csGridRowEntry
00091   {
00092     int col;
00093     csSome data;
00094     
00095     csGridRowEntry (int theCol, csSome theData) : col (theCol), data (theData) {}
00096   };
00097 
00098   
00099 
00100 
00101 
00102 
00103 
00104 
00105 
00106   class csGridRow : public csVector
00107   {
00108     int col;
00109   public:
00110     
00111     csGridRow (int theCol);
00112     
00113     virtual ~csGridRow ();
00114     
00115     void SetAt (int col, csSome data);
00116     
00117     csGridRowEntry *Get (int index);
00118     
00119     virtual int Compare (csSome Item1, csSome Item2, int Mode) const;
00120     
00121     virtual int CompareKey (csSome Item1, csConstSome Key, int Mode) const;
00122     
00123     virtual bool FreeItem (csSome Item);
00124   };
00125   friend class csSparseGrid::csGridRow;
00126 
00127   
00128 
00129 
00130 
00131   class csGridRowSet : public csGridRow
00132   {
00133   public:
00134     
00135     csGridRowSet (int theRow) : csGridRow (theRow) {}
00136     
00137     virtual ~csGridRowSet () {DeleteAll ();}
00138     
00139     virtual bool FreeItem (csSome Item)
00140     {
00141       delete (csGridRow *)((csGridRowEntry *)Item)->data;
00142       delete (csGridRowEntry *)Item;
00143       return true;
00144     }
00145   };
00146 
00147   
00148   csGridRowSet rows;
00149 
00150 public:
00152   csSparseGrid () : rows (8) {}
00153 
00155   csSome GetAt (int row, int col)
00156   {
00157     csSome result = NULL;
00158     int idx1 = rows.FindSortedKey ((csConstSome)row);
00159     if (idx1 != -1)
00160     {
00161       int idx2 = ((csGridRow *)rows.Get (idx1)->data)->FindSortedKey ((csConstSome)col);
00162       if (idx2 != -1)
00163         result = ((csGridRow *)rows.Get (idx1)->data)->Get (idx2)->data;
00164     }
00165     return result;
00166   }
00167 
00168   
00169   void SetAt (int row, int col, csSome data)
00170   {
00171     int idx = rows.FindSortedKey ((csConstSome)row);
00172     if (idx == -1)
00173       idx = rows.InsertSorted (new csGridRowEntry (row, new csGridRow (row)));
00174     ((csGridRow *)rows.Get (idx)->data)->SetAt (col, data);
00175   }
00176 };
00177 
00181 enum csGridCellBorderStyle
00182 {
00184   gcbsNone = 0,
00186   gcbsDash,
00188   gcbsDashPoint,
00190   gcbsDashPointPoint,
00192   gcbsDashDashPoint,
00194   gcbsLine
00195 };
00196 
00198 #define CSS_GRIDCELL_SELECTED        0x00010000
00199 
00205 class csGridCell : public csComponent
00206 {
00208   class csCellBorder
00209   {
00210   public:
00212     csGridCellBorderStyle style;
00214     int thick;
00216     csCellBorder () : style (gcbsLine), thick (1) {}
00217   };
00218 
00220   bool inUse;
00221 
00222 public:
00224   csCellBorder upper, lower, left, right;
00226   int row, col;
00228   csSome data;
00230   csString valuePattern;
00231 
00233   csGridCell ();
00235   virtual void Draw ();
00237   bool IsUsed () { return inUse; }
00239   void SetUsed (bool iState = true) { inUse = iState; }
00240 
00241 protected:
00243   void DrawLine (int x1, int y1, int x2, int y2, csCellBorder &border);
00244 };
00245 
00246 
00251 
00252 #define CSGVS_HSCROLL  0x00000001
00253 
00254 #define CSGVS_VSCROLL  0x00000002
00255 
00256 #define CSGVS_DEFAULTVALUE (CSGVS_HSCROLL | CSGVS_VSCROLL)
00257 
00264 class csGridView : public csComponent
00265 {
00266 protected:
00268   csRect area;
00270   csGrid *pGrid;
00272   int row, col;
00274   bool fPlaceItems;
00276   int Style;
00278   csScrollBar *hscroll, *vscroll;
00279 
00281   void CooAt (int theX, int theY, int &theRow, int &theCol);
00282 
00283 public:
00289   float areafactor;
00290 
00292   csGridView (csGrid *pParent, const csRect ®ion,
00293     int iStyle = CSGVS_DEFAULTVALUE);
00295   csGridView (const csGridView &view, int iStyle = -1);
00296 
00298   virtual void Draw ();
00300   virtual bool HandleEvent (iEvent& Event);
00302   virtual bool SetRect (int xmin, int ymin, int xmax, int ymax);
00304   const csRect& GetArea (){return area;}
00306   virtual void FixSize (int &newW, int &newH);
00308   virtual void SuggestSize (int &w, int &h);
00309 
00314   csGridView *SplitX (int x, int iStyle = -1);
00319   csGridView *SplitY (int y, int iStyle = -1);
00320 
00324   void SetViewArea (const csRect& rc)
00325   {
00326     area.Set (rc.xmin, rc.ymin, rc.xmax, rc.ymax);
00327     col = area.xmin; row = area.ymin;
00328   }
00329 
00330 protected:
00334   virtual csGridView *CreateCopy (int iStyle);
00338   void PlaceItems ();
00339 };
00340 
00348 
00349 #define CSGS_HSPLIT             0x00000004
00350 
00351 #define CSGS_VSPLIT             0x00000008
00352 
00353 #define CSGS_DEFAULTVALUE       (CSGS_HSPLIT | CSGS_VSPLIT)
00354 
00356 #define CSGCS_NONE   1
00357 #define CSGCS_CELL   2
00358 #define CSGCS_ROW    3
00359 #define CSGCS_COLUMN 4
00360 
00361 enum
00362 {
00367   cscmdGridCursorChanged = 0x00000F00
00368 };
00369 
00377 class csGrid : public csComponent
00378 {
00379 protected:
00380   friend class csGridView;
00382   csRegionTree2D *regions, *viewlayout;
00384   csSparseGrid *grid;
00386   csVector vViews;
00388   csGridView *activeView;
00390   csVector vRegionStyles;
00392   csSplitter *splitterX, *splitterY;
00394   int cursorStyle;
00396   int xcur, ycur;
00397 
00399   void CalcMinimalSize (csRegionTree2D *node, int &w, int &h);
00401   void PlaceGadgets ();
00402 
00403 private:
00404   
00405   void init (csComponent *pParent, csRect &rc, int iStyle, csGridCell *gc);
00406 
00407 public:
00409   csGrid (csComponent *pParent, int nRows, int nCols,
00410     int iStyle = CSGS_DEFAULTVALUE | CSGVS_DEFAULTVALUE);
00412   csGrid (csComponent *pParent, int nRows, int nCols, csGridCell *gridpattern,
00413    int iStyle = CSGS_DEFAULTVALUE | CSGVS_DEFAULTVALUE);
00415   virtual ~csGrid ();
00416 
00418   virtual void SetCursorStyle (int iCursorStyle = CSGCS_NONE);
00420   virtual int GetCursorStyle ();
00422   virtual void GetCursorPos (int &row, int &col);
00424   virtual void SetCursorPos (int row, int col);
00425 
00427   virtual void Draw ();
00429   virtual bool SetRect (int xmin, int ymin, int xmax, int ymax);
00431   virtual void FixSize (int &newW, int &newH);
00433   virtual void SuggestSize (int &w, int &h);
00435   virtual bool HandleEvent (iEvent &Event);
00436 
00438   void CreateRegion (csRect& rc, csGridCell *cell);
00440   csGridView* GetRootView ()
00441   { return (csGridView*)vViews.Get (0); }
00443   csGridView *GetActiveView () {return activeView;}
00445   void SetActiveView (csGridView *view);
00446 
00450   virtual void SetStringAt (int row, int col, const char *data);
00451   csString *GetStringAt (int row, int col);
00452 };
00453 
00454 #endif