00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef NCTableItem_h
00020 #define NCTableItem_h
00021
00022 #include <iosfwd>
00023
00024 #include <vector>
00025 using namespace std;
00026
00027 #include "position.h"
00028 #include "NCWidget.h"
00029
00030 class NCTableStyle;
00031 class NCTableCol;
00032
00034
00035
00036
00037
00038
00039 class NCTableLine {
00040
00041 friend std::ostream & operator<<( std::ostream & STREAM, const NCTableLine & OBJ );
00042
00043 NCTableLine & operator=( const NCTableLine & );
00044 NCTableLine ( const NCTableLine & );
00045
00046 public:
00047
00048 enum STATE {
00049 S_NORMAL = 0x00,
00050 S_ACTIVE = 0x01,
00051 S_DISABELED = 0x10,
00052 S_HIDDEN = 0x20,
00053 S_HEADLINE = 0x40
00054 };
00055
00056 private:
00057
00058 vector<NCTableCol*> Items;
00059 void assertCol( unsigned idx );
00060
00061 unsigned state;
00062
00063 protected:
00064
00065 mutable STATE vstate;
00066 virtual void DrawItems( NCursesWindow & w, const wrect at,
00067 NCTableStyle & tableStyle,
00068 bool active ) const;
00069
00070 public:
00071
00072 NCTableLine( unsigned cols, const unsigned s = S_NORMAL );
00073 NCTableLine( vector<NCTableCol*> & nItems, const unsigned s = S_NORMAL );
00074 virtual ~NCTableLine();
00075
00076 unsigned Cols() const { return Items.size(); }
00077 void SetCols( unsigned idx );
00078 void SetCols( vector<NCTableCol*> & nItems );
00079 void ClearLine() { SetCols( 0 ); }
00080 vector<NCTableCol*> GetItems() const { return Items; }
00081
00082 void Append( NCTableCol * item ) { AddCol( Cols(), item ); }
00083 void AddCol( unsigned idx, NCTableCol * item );
00084 void DelCol( unsigned idx );
00085
00086 NCTableCol * GetCol( unsigned idx );
00087 const NCTableCol * GetCol( unsigned idx ) const {
00088 return const_cast<NCTableLine*>(this)->GetCol( idx );
00089 }
00090
00091 void SetState ( const STATE s ) { state |= s; }
00092 void ClearState( const STATE s ) { state &= ~s; }
00093
00094 bool isHidden() const { return (state & S_HIDDEN); }
00095 bool isDisabeled() const { return (state & S_DISABELED); }
00096 bool isSpecial() const { return (state & (S_HIDDEN | S_DISABELED)); }
00097 bool isActive() const { return (state & S_ACTIVE); }
00098
00099 virtual bool isVisible() const { return !isHidden(); }
00100 virtual bool isEnabeled() const { return isVisible() && !isDisabeled(); }
00101
00102 public:
00103
00104 virtual int handleInput( wint_t key ) { return 0; }
00105 virtual int ChangeToVisible() { return 0; }
00106
00107 virtual unsigned Hotspot( unsigned & at ) const { at = 0; return 0; }
00108
00109 virtual void UpdateFormat( NCTableStyle & TableStyle );
00110
00111 virtual void DrawAt( NCursesWindow & w, const wrect at,
00112 NCTableStyle & tableStyle,
00113 bool active ) const;
00114
00115 void stripHotkeys();
00116 };
00117
00119
00121
00122
00123
00124
00125
00126 class NCTableCol {
00127
00128 friend std::ostream & operator<<( std::ostream & STREAM, const NCTableCol & OBJ );
00129
00130 public:
00131
00132 enum STYLE {
00133 NONE = 0,
00134 PLAIN,
00135 DATA,
00136 ACTIVEDATA,
00137 HINT,
00138 SEPARATOR
00139 };
00140
00141 private:
00142
00143 NClabel label;
00144 STYLE style;
00145
00146 public:
00147
00148 NCTableCol( const NCstring & l = "", const STYLE & st = ACTIVEDATA );
00149 virtual ~NCTableCol();
00150
00151 const NClabel & Label() const { return label; }
00152 virtual void SetLabel( const NClabel & l ) { label = l; }
00153
00154 void stripHotkey(){ label.stripHotkey(); }
00155
00156 protected:
00157
00158 chtype setBkgd( NCursesWindow & w,
00159 NCTableStyle & tableStyle,
00160 NCTableLine::STATE linestate,
00161 STYLE colstyle ) const ;
00162
00163 public:
00164
00165 virtual wsze Size() const { return wsze( 1, label.width() ); }
00166
00167 virtual void DrawAt( NCursesWindow & w, const wrect at,
00168 NCTableStyle & tableStyle,
00169 NCTableLine::STATE linestate,
00170 unsigned colidx ) const;
00171
00172 bool hasHotkey() const { return label.hasHotkey(); }
00173 unsigned char hotkey() const { return label.hotkey(); }
00174 };
00175
00177
00179
00180
00181
00182
00183
00184 class NCTableHead : public NCTableLine {
00185
00186 public:
00187
00188 NCTableHead( unsigned cols ) : NCTableLine( cols ) {}
00189 NCTableHead( vector<NCTableCol*> & nItems ) : NCTableLine( nItems ) {}
00190 virtual ~NCTableHead() {}
00191
00192 public:
00193
00194 virtual void DrawAt( NCursesWindow & w, const wrect at,
00195 NCTableStyle & tableStyle,
00196 bool active ) const;
00197 };
00198
00200
00202
00203
00204
00205
00206
00207 class NCTableStyle {
00208
00209 friend std::ostream & operator<<( std::ostream & STREAM, const NCTableStyle & OBJ );
00210
00211 private:
00212
00213 NCTableHead headline;
00214 vector<unsigned> colWidht;
00215 vector<NC::ADJUST> colAdjust;
00216
00217 const NCWidget & parw;
00218
00219 unsigned colSepwidht;
00220 chtype colSepchar;
00221 unsigned hotCol;
00222
00223 public:
00224
00225 static const chtype currentBG = (chtype)-1;
00226
00227 NCTableStyle( const NCWidget & p );
00228 ~NCTableStyle() {}
00229
00230 bool SetStyleFrom( const vector<NCstring> & head );
00231 void SetSepChar( const chtype sepchar ) { colSepchar = sepchar; }
00232 void SetSepWidht( const unsigned sepwidth ) { colSepwidht = sepwidth; }
00233 void SetHotCol( const int hcol ) {
00234 hotCol = (hcol < 0 || Cols() <= (unsigned)hcol) ? -1 : hcol;
00235 }
00236
00237 void ResetToMinCols() {
00238 colWidht.clear();
00239 AssertMinCols( headline.Cols() );
00240 headline.UpdateFormat( *this );
00241 }
00242
00243 void AssertMinCols( unsigned num ) {
00244 if ( colWidht.size() < num ) {
00245 colWidht.resize( num, 0 );
00246 colAdjust.resize( colWidht.size(), NC::LEFT );
00247 }
00248 }
00249
00250 void MinColWidht( unsigned num, unsigned val ) {
00251 AssertMinCols( num );
00252 if ( val > colWidht[num] )
00253 colWidht[num] = val;
00254 }
00255
00256 NC::ADJUST ColAdjust( unsigned num ) const { return colAdjust[num]; }
00257
00258 unsigned Cols() const { return colWidht.size(); }
00259 unsigned ColWidht( unsigned num ) const { return colWidht[num]; }
00260 unsigned ColSepwidht() const { return colSepwidht; }
00261 chtype ColSepchar() const { return colSepchar; }
00262 unsigned HotCol() const { return hotCol; }
00263
00264 const NCstyle::StList & listStyle() const { return parw.listStyle(); }
00265
00266 chtype getBG() const { return listStyle().item.plain; }
00267
00268 chtype getBG( const NCTableLine::STATE lstate,
00269 const NCTableCol::STYLE cstyle = NCTableCol::PLAIN ) const;
00270
00271 chtype highlightBG( const NCTableLine::STATE lstate,
00272 const NCTableCol::STYLE cstyle,
00273 const NCTableCol::STYLE dstyle = NCTableCol::PLAIN ) const ;
00274
00275 chtype hotBG( const NCTableLine::STATE lstate, unsigned colidx ) const {
00276 return (colidx == hotCol) ? getBG( lstate, NCTableCol::HINT ) : currentBG;
00277 }
00278
00279 const NCTableLine & Headline() const { return headline; }
00280
00281 unsigned TableWidth() const {
00282 unsigned twidth = 0;
00283 for( unsigned i = 0; i < Cols(); ++i )
00284 twidth += colWidht[i];
00285 if ( Cols() > 1 )
00286 twidth += colSepwidht * (Cols()-1);
00287 return twidth;
00288 }
00289 };
00290
00292
00293 #endif // NCTableItem_h