diff options
Diffstat (limited to '')
| -rw-r--r-- | src/tools/viewcsv.cpp | 63 | 
1 files changed, 51 insertions, 12 deletions
diff --git a/src/tools/viewcsv.cpp b/src/tools/viewcsv.cpp index 429c099..d6c09c9 100644 --- a/src/tools/viewcsv.cpp +++ b/src/tools/viewcsv.cpp  | |||
| @@ -10,10 +10,16 @@ using namespace Bu; | |||
| 10 | class Options : public Bu::OptParser | 10 | class Options : public Bu::OptParser | 
| 11 | { | 11 | { | 
| 12 | public: | 12 | public: | 
| 13 | Options( int argc, char *argv[] ) | 13 | Options( int argc, char *argv[] ) : | 
| 14 | bHeader( true ) | ||
| 14 | { | 15 | { | 
| 16 | addOption( bHeader, "no-header", | ||
| 17 | "Don't use the first line as a header row. This behaviour can " | ||
| 18 | "also be toggled while running with 'h'." ); | ||
| 15 | setNonOption( slot( this, &Options::onNonOption ) ); | 19 | setNonOption( slot( this, &Options::onNonOption ) ); | 
| 16 | addHelpOption(); | 20 | addHelpOption(); | 
| 21 | |||
| 22 | setOverride( "no-header", "true" ); | ||
| 17 | parse( argc, argv ); | 23 | parse( argc, argv ); | 
| 18 | } | 24 | } | 
| 19 | 25 | ||
| @@ -30,6 +36,7 @@ public: | |||
| 30 | } | 36 | } | 
| 31 | 37 | ||
| 32 | Bu::FString sFileIn; | 38 | Bu::FString sFileIn; | 
| 39 | bool bHeader; | ||
| 33 | }; | 40 | }; | 
| 34 | 41 | ||
| 35 | typedef Bu::Array<StrArray> StrGrid; | 42 | typedef Bu::Array<StrArray> StrGrid; | 
| @@ -88,7 +95,7 @@ public: | |||
| 88 | int maxx, maxy; | 95 | int maxx, maxy; | 
| 89 | getmaxyx( stdscr, maxy, maxx ); | 96 | getmaxyx( stdscr, maxy, maxx ); | 
| 90 | 97 | ||
| 91 | int iRows = min( (int)doc.sgData.getSize(), maxy-1 ); | 98 | int iRows = min( (int)doc.sgData.getSize(), maxy-((bHeaderRow)?(4):(3)) ); | 
| 92 | int iCols = min( doc.iMaxCols, (int)maxx-1 ); | 99 | int iCols = min( doc.iMaxCols, (int)maxx-1 ); | 
| 93 | 100 | ||
| 94 | int iHdrHeight = 1; | 101 | int iHdrHeight = 1; | 
| @@ -98,6 +105,8 @@ public: | |||
| 98 | // Draw the headers | 105 | // Draw the headers | 
| 99 | for( int iRow = 0; iRow < iRows; iRow++ ) | 106 | for( int iRow = 0; iRow < iRows; iRow++ ) | 
| 100 | { | 107 | { | 
| 108 | if( iRow+iYOff >= doc.sgData.getSize() ) | ||
| 109 | break; | ||
| 101 | char buf[6]; | 110 | char buf[6]; | 
| 102 | snprintf( buf, 6, "%5d", iRow+iYOff ); | 111 | snprintf( buf, 6, "%5d", iRow+iYOff ); | 
| 103 | mvaddnstr( iRow+iHdrHeight+1, 0, buf, 5 ); | 112 | mvaddnstr( iRow+iHdrHeight+1, 0, buf, 5 ); | 
| @@ -108,8 +117,9 @@ public: | |||
| 108 | { | 117 | { | 
| 109 | for( int iCol = 0; iCol < iCols; iCol++ ) | 118 | for( int iCol = 0; iCol < iCols; iCol++ ) | 
| 110 | { | 119 | { | 
| 111 | if( iXPos + doc.aWidths[iCol+iXOff]+2 >= maxx ) | 120 | if( iXPos >= maxx ) | 
| 112 | break; | 121 | break; | 
| 122 | int iWidth = min( doc.aWidths[iCol+iXOff], maxx-iXPos-1 ); | ||
| 113 | char buf[6]; | 123 | char buf[6]; | 
| 114 | snprintf( buf, 6, "%d", iCol+iXOff ); | 124 | snprintf( buf, 6, "%d", iCol+iXOff ); | 
| 115 | mvaddch( 0, iXPos, ACS_VLINE ); | 125 | mvaddch( 0, iXPos, ACS_VLINE ); | 
| @@ -117,17 +127,23 @@ public: | |||
| 117 | mvaddnstr( 0, iXPos+1, buf, 5 ); | 127 | mvaddnstr( 0, iXPos+1, buf, 5 ); | 
| 118 | if( bHeaderRow ) | 128 | if( bHeaderRow ) | 
| 119 | { | 129 | { | 
| 120 | mvaddstr( 1, iXPos+1, doc.sgData[0][iCol+iXOff].getStr() ); | 130 | mvaddnstr( | 
| 131 | 1, iXPos+1, doc.sgData[0][iCol+iXOff].getStr(), iWidth | ||
| 132 | ); | ||
| 121 | mvaddch( 1, iXPos, ACS_VLINE ); | 133 | mvaddch( 1, iXPos, ACS_VLINE ); | 
| 122 | } | 134 | } | 
| 123 | for( int j = 0; j <= doc.aWidths[iCol+iXOff]; j++ ) | 135 | for( int j = 0; j < iWidth; j++ ) | 
| 124 | { | 136 | { | 
| 125 | mvaddch( iHdrHeight, iXPos+j+1, ACS_HLINE ); | 137 | mvaddch( iHdrHeight, iXPos+j+1, ACS_HLINE ); | 
| 126 | } | 138 | } | 
| 127 | iXPos += doc.aWidths[iCol+iXOff]+2; | 139 | iXPos += iWidth+1; | 
| 128 | } | 140 | } | 
| 129 | } | 141 | } | 
| 130 | catch(...) { } | 142 | catch(...) { } | 
| 143 | for( int j = 0; j < 6; j++ ) | ||
| 144 | { | ||
| 145 | mvaddch( iHdrHeight, j, ACS_HLINE ); | ||
| 146 | } | ||
| 131 | 147 | ||
| 132 | // Draw some data | 148 | // Draw some data | 
| 133 | for( int iRow = 0; iRow < iRows; iRow++ ) | 149 | for( int iRow = 0; iRow < iRows; iRow++ ) | 
| @@ -137,15 +153,29 @@ public: | |||
| 137 | int iXPos = 6; | 153 | int iXPos = 6; | 
| 138 | for( int iCol = 0; iCol < iCols; iCol++ ) | 154 | for( int iCol = 0; iCol < iCols; iCol++ ) | 
| 139 | { | 155 | { | 
| 140 | if( iXPos + doc.aWidths[iCol+iXOff]+2 >= maxx ) | 156 | if( iXPos >= maxx ) | 
| 141 | break; | 157 | break; | 
| 158 | int iWidth = min( doc.aWidths[iCol+iXOff], maxx-iXPos-1 ); | ||
| 142 | mvaddch( iRow+iHdrHeight+1, iXPos, ACS_VLINE ); | 159 | mvaddch( iRow+iHdrHeight+1, iXPos, ACS_VLINE ); | 
| 143 | mvaddstr( iRow+iHdrHeight+1, iXPos+1, | 160 | mvaddnstr( iRow+iHdrHeight+1, iXPos+1, | 
| 144 | doc.sgData[iRow+iYOff][iCol+iXOff].getStr() ); | 161 | doc.sgData[iRow+iYOff][iCol+iXOff].getStr(), iWidth ); | 
| 145 | iXPos += doc.aWidths[iCol+iXOff]+2; | 162 | iXPos += iWidth+1; | 
| 146 | } | 163 | } | 
| 147 | } catch(...) { } | 164 | } catch(...) { } | 
| 148 | } | 165 | } | 
| 166 | |||
| 167 | attron( A_REVERSE ); | ||
| 168 | for( int j = 0; j < maxx; j++ ) | ||
| 169 | { | ||
| 170 | mvaddch( maxy-1, j, ' ' ); | ||
| 171 | } | ||
| 172 | mvaddstr( maxy-1, 1, "q) quit h) toggle header row" ); | ||
| 173 | char buf[30]; | ||
| 174 | int iWidth = sprintf( buf, "[%dx%ld]", | ||
| 175 | doc.iMaxCols, doc.sgData.getSize() | ||
| 176 | ); | ||
| 177 | mvaddstr( maxy-1, maxx-iWidth-1, buf ); | ||
| 178 | attroff( A_REVERSE ); | ||
| 149 | } | 179 | } | 
| 150 | 180 | ||
| 151 | void move( int iX, int iY ) | 181 | void move( int iX, int iY ) | 
| @@ -165,6 +195,12 @@ public: | |||
| 165 | if( iYOff < 0 ) | 195 | if( iYOff < 0 ) | 
| 166 | iYOff = 0; | 196 | iYOff = 0; | 
| 167 | } | 197 | } | 
| 198 | |||
| 199 | if( iYOff >= doc.sgData.getSize() ) | ||
| 200 | iYOff = doc.sgData.getSize()-1; | ||
| 201 | |||
| 202 | if( iXOff >= doc.iMaxCols ) | ||
| 203 | iXOff = doc.iMaxCols-1; | ||
| 168 | } | 204 | } | 
| 169 | 205 | ||
| 170 | void pageDown() | 206 | void pageDown() | 
| @@ -183,8 +219,11 @@ public: | |||
| 183 | 219 | ||
| 184 | void setHeaderRow( bool bOn ) | 220 | void setHeaderRow( bool bOn ) | 
| 185 | { | 221 | { | 
| 222 | if( bHeaderRow == bOn ) | ||
| 223 | return; | ||
| 224 | |||
| 186 | bHeaderRow = bOn; | 225 | bHeaderRow = bOn; | 
| 187 | move( 0, 0 ); | 226 | move( 0, ((bOn)?(1):(-1)) ); | 
| 188 | } | 227 | } | 
| 189 | 228 | ||
| 190 | void toggleHeaderRow() | 229 | void toggleHeaderRow() | 
| @@ -229,7 +268,7 @@ int main( int argc, char *argv[] ) | |||
| 229 | curs_set( 0 ); | 268 | curs_set( 0 ); | 
| 230 | 269 | ||
| 231 | CsvView view( doc ); | 270 | CsvView view( doc ); | 
| 232 | view.toggleHeaderRow(); | 271 | view.setHeaderRow( opt.bHeader ); | 
| 233 | 272 | ||
| 234 | bool bRun = true; | 273 | bool bRun = true; | 
| 235 | do | 274 | do | 
