summaryrefslogtreecommitdiff
path: root/src/Fl_Table.cxx
diff options
context:
space:
mode:
authorAlbrecht Schlosser <albrechts.fltk@online.de>2023-10-22 19:30:37 +0200
committerAlbrecht Schlosser <albrechts.fltk@online.de>2023-10-22 19:35:17 +0200
commit1209e9dcd7e1e97bedc747d06ba4eea837562158 (patch)
tree7897d3c61368958f191bfe684b96d1d08467a2bb /src/Fl_Table.cxx
parent05ac0247cbd902f910fa89f8d4f4fde9de904b0f (diff)
Make Fl_String and Fl_Int_Vector private (#789)
- add CMake option 'OPTION_USE_STD' - add configure option '--enable-use_std' - move FL/Fl_String.H to src/Fl_String.H - move FL/Fl_Int_Vector.H to src/Fl_Int_Vector.H - remove Fl_String from demo program examples/callbacks.cxx - remove Fl_Int_Vector from public header FL/Fl_Table.H - some methods of Fl_Table are no longer inline - add CMake option OPTION_USE_STD to allow std::string in some selected functions and methods Experimental, may be removed before release: - use either Fl_Int_Vector or std::vector in Fl_Table depending on CMake OPTION_USE_STD or configure --enable-use_std Move all fl_filename* functions that use Fl_String to fluid Main changes in fluid: - add fluid_filename.h and .cxx - include "fluid_filename.h" rather than <FL/filename.H> Update fl_input(), fl_password() and test/ask - add maxchar parameter to fl_input() and fl_password() - fl_input_str() and fl_password_str() are optional and return std::string if enabled (FLTK_USE_STD)
Diffstat (limited to 'src/Fl_Table.cxx')
-rw-r--r--src/Fl_Table.cxx163
1 files changed, 132 insertions, 31 deletions
diff --git a/src/Fl_Table.cxx b/src/Fl_Table.cxx
index 91ebe262e..09b4dbdf8 100644
--- a/src/Fl_Table.cxx
+++ b/src/Fl_Table.cxx
@@ -1,8 +1,9 @@
//
-// Fl_Table -- A table widget
+// Fl_Table -- A table widget for the Fast Light Tool Kit (FLTK).
//
// Copyright 2002 by Greg Ercolano.
// Copyright (c) 2004 O'ksi'D
+// Copyright 2023 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -16,10 +17,22 @@
//
#include <FL/Fl_Table.H>
-
#include <FL/Fl.H>
#include <FL/fl_draw.H>
+// DEBUG - remove this when done, set to 0 to disable debug output
+#define DEBUG_ROW_COL_RESIZE 1
+
+// EXPERIMENTAL
+// We use either std::vector or the private class Fl_Int_Vector
+// depending on the build option OPTION_USE_STD or equivalent.
+// This option allows to use std::string and maybe std::vector
+// already in FLTK 1.4.x
+
+#if (!FLTK_USE_STD)
+#include "Fl_Int_Vector.H" // Note: MUST NOT be included in Fl_Table.H
+#endif
+
#include <sys/types.h>
#include <string.h> // memcpy
#include <stdio.h> // fprintf
@@ -144,6 +157,15 @@ Fl_Table::Fl_Table(int X, int Y, int W, int H, const char *l) : Fl_Group(X,Y,W,H
select_col = -1;
_scrollbar_size = 0;
flags_ = 0; // TABCELLNAV off
+
+#if (FLTK_USE_STDXX)
+ _colwidths = new std::vector<int>; // column widths in pixels
+ _rowheights = new std::vector<int>; // row heights in pixels
+#else
+ _colwidths = new Fl_Int_Vector(); // column widths in pixels
+ _rowheights = new Fl_Int_Vector(); // row heights in pixels
+#endif
+
box(FL_THIN_DOWN_FRAME);
vscrollbar = new Fl_Scrollbar(x()+w()-Fl::scrollbar_size(), y(),
@@ -177,6 +199,31 @@ Fl_Table::Fl_Table(int X, int Y, int W, int H, const char *l) : Fl_Group(X,Y,W,H
*/
Fl_Table::~Fl_Table() {
// The parent Fl_Group takes care of destroying scrollbars
+ delete _colwidths;
+ delete _rowheights;
+}
+
+
+/**
+ Returns the current number of columns.
+
+ This is equivalent to the size of the column widths vector.
+
+ \returns Number of columns.
+*/
+int Fl_Table::col_size() {
+ return int(_colwidths->size());
+}
+
+/**
+ Returns the current number of rows.
+
+ This is equivalent to the size of the row heights vector.
+
+ \returns Number of rows.
+*/
+int Fl_Table::row_size() {
+ return int(_rowheights->size());
}
/**
@@ -187,17 +234,21 @@ Fl_Table::~Fl_Table() {
*/
void Fl_Table::row_height(int row, int height) {
if ( row < 0 ) return;
- if ( row < (int)_rowheights.size() && _rowheights[row] == height ) {
+ if ( row < row_size() && (*_rowheights)[row] == height ) {
return; // OPTIMIZATION: no change? avoid redraw
}
// Add row heights, even if none yet
- int now_size = (int)_rowheights.size();
- if ( row >= now_size ) {
- _rowheights.size(row);
+ int now_size = row_size();
+ if (row >= now_size) {
+#if (FLTK_USE_STD)
+ _rowheights->resize(row, height);
+#else
+ _rowheights->size(row);
while (now_size < row)
- _rowheights[now_size++] = height;
+ (*_rowheights)[now_size++] = height;
+#endif // FLTK_USE_STD
}
- _rowheights[row] = height;
+ (*_rowheights)[row] = height;
table_resized();
if ( row <= botrow ) { // OPTIMIZATION: only redraw if onscreen or above screen
redraw();
@@ -216,18 +267,21 @@ void Fl_Table::row_height(int row, int height) {
void Fl_Table::col_width(int col, int width)
{
if ( col < 0 ) return;
- if ( col < (int)_colwidths.size() && _colwidths[col] == width ) {
+ if ( col < col_size() && (*_colwidths)[col] == width ) {
return; // OPTIMIZATION: no change? avoid redraw
}
// Add column widths, even if none yet
- int now_size = (int)_colwidths.size();
+ int now_size = col_size();
if ( col >= now_size ) {
- _colwidths.size(col+1);
- while (now_size < col) {
- _colwidths[now_size++] = width;
- }
+#if (FLTK_USE_STD)
+ _colwidths->resize(col+1, width);
+#else
+ _colwidths->size(col+1);
+ while (now_size < col)
+ (*_colwidths)[now_size++] = width;
+#endif
}
- _colwidths[col] = width;
+ (*_colwidths)[col] = width;
table_resized();
if ( col <= rightcol ) { // OPTIMIZATION: only redraw if onscreen or to the left
redraw();
@@ -635,14 +689,30 @@ void Fl_Table::scroll_cb(Fl_Widget*w, void *data) {
void Fl_Table::rows(int val) {
int oldrows = _rows;
_rows = val;
- {
- int default_h = ( _rowheights.size() > 0 ) ? _rowheights.back() : 25;
- int now_size = _rowheights.size();
- _rowheights.size(val); // enlarge or shrink as needed
- while ( now_size < val ) {
- _rowheights[now_size++] = default_h; // fill new
- }
- }
+
+ int default_h = row_size() > 0 ? _rowheights->back() : 25;
+ int now_size = row_size();
+
+#if DEBUG_ROW_COL_RESIZE
+ fprintf(stderr, "Fl_Table::rows(%d) from %d, FLTK_USE_STD = %d\n", val, now_size, FLTK_USE_STD);
+ fflush(stderr);
+ Fl_Timestamp start = Fl::now();
+#endif
+
+#if (FLTK_USE_STD)
+ if (now_size != val)
+ _rowheights->resize(val, default_h); // enlarge or shrink as needed
+#else
+ _rowheights->size(val); // enlarge or shrink as needed
+ while (now_size < val)
+ (*_rowheights)[now_size++] = default_h; // fill new
+#endif
+
+#if DEBUG_ROW_COL_RESIZE
+ fprintf(stderr, "Fl_Table::rows(%d) - done in %7.3f ms\n", val, Fl::seconds_since(start)*1000);
+ fflush(stderr);
+#endif
+
table_resized();
// OPTIMIZATION: redraw only if change is visible.
@@ -658,14 +728,31 @@ void Fl_Table::rows(int val) {
*/
void Fl_Table::cols(int val) {
_cols = val;
- {
- int default_w = ( _colwidths.size() > 0 ) ? _colwidths[_colwidths.size()-1] : 80;
- int now_size = _colwidths.size();
- _colwidths.size(val); // enlarge or shrink as needed
- while ( now_size < val ) {
- _colwidths[now_size++] = default_w; // fill new
- }
- }
+
+ int default_w = col_size() > 0 ? (*_colwidths)[col_size()-1] : 80;
+ int now_size = col_size();
+
+#if DEBUG_ROW_COL_RESIZE
+ fprintf(stderr, "Fl_Table::cols(%d) from %d, FLTK_USE_STD = %d\n", val, now_size, FLTK_USE_STD);
+ fflush(stderr);
+ Fl_Timestamp start = Fl::now();
+#endif
+
+#if (FLTK_USE_STD)
+ if (now_size != val)
+ _colwidths->resize(val, default_w); // enlarge or shrink as needed
+#else
+ _colwidths->size(val); // enlarge or shrink as needed
+ while (now_size < val)
+ (*_colwidths)[now_size++] = default_w; // fill new
+#endif
+
+#if DEBUG_ROW_COL_RESIZE
+ double delta = Fl::seconds_since(start) * 1000;
+ fprintf(stderr, "Fl_Table::cols(%d) - done in %7.3f ms\n", val, delta);
+ fflush(stderr);
+#endif
+
table_resized();
redraw();
}
@@ -1368,3 +1455,17 @@ void Fl_Table::draw() {
}
fl_pop_clip();
}
+
+/**
+ Returns the current height of the specified row as a value in pixels.
+*/
+int Fl_Table::row_height(int row) {
+ return((row < 0 || row >= row_size()) ? 0 : (*_rowheights)[row]);
+}
+
+/**
+ Returns the current width of the specified column in pixels.
+*/
+int Fl_Table::col_width(int col) {
+ return((col < 0 || col >= col_size()) ? 0 : (*_colwidths)[col]);
+}