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