diff options
Diffstat (limited to 'src/tools')
-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 |