// *** TODO ***
// Implement row styles, global styles
// ======================================================================
// File: Flv_List.h - Flv_List implementation
// Program: Flv_List - FLTK Widget
// Version: 0.1.0
// Started: 11/21/99
//
// Copyright (C) 1999 Laurence Charlton
//
// Description:
// Flv_List implements a scrollable list. No data is stored
// in the widget. Supports headers/footers, natively supports a single
// row height per list. Row grids can be turned on and off. Supports
// no scroll bars as well as horizontal/vertical automatic or always
// on scroll bars.
// Uses absolute row references.
//
// row -1 is defined as the row header
// row -2 is defined as the row footer
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Library General Public License for more details.
//
// You should have received a copy of the GNU Library General Public
// License along with this library. If not, see .
// USA.
// ======================================================================
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#ifndef IN_GIAC
#include
#else
#include "first.h"
#endif
#ifdef HAVE_LIBFLTK
#ifndef FLV_LIST_H
#define FLV_LIST_H
#include
#include
#include
#include
#include "Flv_Style.H"
#ifndef FLTK_2
#define text_color() FL_BLACK
#define text_font() FL_HELVETICA
#define text_size() 12
#define fl_contrast(x,y) FL_BLACK
#define selection_text_color() FL_WHITE
#define FL_DAMAGE_HIGHLIGHT FL_DAMAGE_CHILD
#define label_font labelfont
#define label_size labelsize
#define label_color labelcolor
#define label_type labeltype
#endif
#define FLV_ROW_HEADER -1
#define FLV_ROW_FOOTER -2
#define FLV_TITLE -3
#define SLIDER_WIDTH 17
typedef unsigned char Flv_ShowScrollbar;
typedef unsigned short Flv_Feature;
// Call back events
#define FLVE_ROW_CHANGED 1
#define FLVE_ROWS_CHANGED 2
#define FLVE_SELECTION_CHANGED 3
#define FLVE_COL_CHANGED 4
#define FLVE_COLS_CHANGED 5
#define FLVE_FEATURE_CHANGED 6
#define FLVE_CLICKED 7
#define FLVE_ENTER_PRESSED 8
#define FLVE_ROW_HEADER_CLICKED 9
#define FLVE_ROW_FOOTER_CLICKED 10
#define FLVE_COL_HEADER_CLICKED 11
#define FLVE_COL_FOOTER_CLICKED 12
#define FLVE_LABEL_CLICKED 13
#define FLVE_TITLE_CLICKED 14
#define FLVE_ALL_CLICKED 15
// Call back when flags
#define FLVEcb_ROW_CHANGED 0x0001
#define FLVEcb_ROWS_CHANGED 0x0002
#define FLVEcb_SELECTION_CHANGED 0x0004
#define FLVEcb_COL_CHANGED 0x0008
#define FLVEcb_COLS_CHANGED 0x0010
#define FLVEcb_FEATURE_CHANGED 0x0020
#define FLVEcb_CLICKED 0x0040
#define FLVEcb_ENTER_PRESSED 0x0080
#define FLVEcb_ROW_HEADER_CLICKED 0x0100
#define FLVEcb_ROW_FOOTER_CLICKED 0x0200
#define FLVEcb_COL_HEADER_CLICKED 0x0400
#define FLVEcb_COL_FOOTER_CLICKED 0x0800
#define FLVEcb_LABEL_CLICKED 0x1000
#define FLVEcb_TITLE_CLICKED 0x2000
#define FLVEcb_ALL_CLICKED 0x4000
// Feature list
#define FLVF_NONE 0
#define FLVF_ROW_HEADER 1
#define FLVF_ROW_FOOTER 2
#define FLVF_ROW_DIVIDER 4
#define FLVF_COL_HEADER 8
#define FLVF_COL_FOOTER 16
#define FLVF_COL_DIVIDER 32
#define FLVF_MULTI_SELECT 64
#define FLVF_ROW_SELECT 128
#define FLVF_PERSIST_SELECT 256
#define FLVF_FULL_RESIZE 512
#define FLVF_DIVIDERS (FLVF_COL_DIVIDER|FLVF_ROW_DIVIDER)
#define FLVF_HEADERS (FLVF_ROW_HEADER|FLVF_COL_HEADER)
#define FLVF_FOOTERS (FLVF_ROW_FOOTER|FLVF_COL_FOOTER)
#define FLVF_ROW_ENDS (FLVF_ROW_HEADER|FLVF_ROW_FOOTER)
#define FLVF_COL_ENDS (FLVF_COL_HEADER|FLVF_COL_FOOTER)
#define FLVF_ALL_ROW (FLVF_ROW_HEADER|FLVF_ROW_FOOTER|FLVF_ROW_DIVIDER)
#define FLVF_ALL_COL (FLVF_COL_HEADER|FLVF_COL_FOOTER|FLVF_COL_DIVIDER)
// Scroll bar visibility
#define FLVS_NONE 0
#define FLVS_HORIZONTAL 1
#define FLVS_VERTICAL 2
#define FLVS_BOTH (FLVS_HORIZONTAL|FLVS_VERTICAL)
#define FLVS_AUTOMATIC 0
#define FLVS_ALWAYS 4
#define FLVS_HORIZONTAL_ALWAYS (FLVS_HORIZONTAL|FLVS_ALWAYS)
#define FLVS_VERTICAL_ALWAYS (FLVS_VERTICAL|FLVS_ALWAYS)
#define FLVS_BOTH_ALWAYS (FLVS_BOTH|FLVS|FLVS_ALWAYS)
// Edit when constants
#define FLV_EDIT_ALWAYS 1
#define FLV_EDIT_AUTOMATIC 2
#define FLV_EDIT_MANUAL 3
class Flv_List : public Fl_Group{
public:
Fl_Scrollbar scrollbar; // Vertical scrollbar
Fl_Scrollbar hscrollbar; // Horizontal scrollbar
Flv_List( int X, int Y, int W, int H, const char *l=0 );
~Flv_List();
virtual int row_height( int n );
virtual int row_height( int n, int R );
virtual void get_style(Flv_Style &s, int R, int C=0); // get trickle down style
void add_selection_style( Flv_Style &s, int R, int C=0 ); // Add selection style
virtual void save_editor( Fl_Widget *e, int R, int C=0 );// Save editor contents
virtual void load_editor( Fl_Widget *e, int R, int C=0 );// Load editor contents
virtual void position_editor( Fl_Widget *e, int x, int y, int w, int h, Flv_Style &s );
int callback_when(void) // Get callback when
{ return vcallback_when; }
int callback_when(int v) // Set callback when
{ return vcallback_when = v; }
int add_callback_when(int v) // Add callback conditions
{ return vcallback_when |= v; }
int clear_callback_when(int v) // Clear callback conditions
{ return vcallback_when &= ~v; }
bool callback_on(int v) // See if callback should be done
{ return (vcallback_when & v)==v; }
int edit_when(void) // Get when to edit
{ return vedit_when; }
int edit_when( int v ); // Set when to edit
void start_edit(void); // Start editing
void end_edit(void); // End editing (w/save)
void cancel_edit(void); // Cancel editing (wo/save)
Fl_Widget *editor(void) // Return current editor
{ return veditor; }
int bottom_row(void); // Return last partially visible row
unsigned char clicks() // # of clicks 1, 2, 3...
{ return vclicks; }
void clear_clicks(void) // Reset # of clicks
{ vclicks = 0; }
unsigned char max_clicks(void) // Get Max # of clicks
{ return vmax_clicks; }
unsigned char max_clicks(unsigned char n) // Return max # of clicks
{ return vmax_clicks=n; }
Fl_Color dead_space_color(void) const // Get dead space color
{ return vdead_space_color; }
Fl_Color dead_space_color(Fl_Color &n) // Set dead space color
{ return (vdead_space_color = n); }
Flv_Feature feature(void) // Get features
{ return vfeature; }
Flv_Feature feature(Flv_Feature v); // Set features
Flv_Feature feature_add(Flv_Feature v); // Add (set of) feature(s)
Flv_Feature feature_remove(Flv_Feature v); // Remove (set of) feature(s)
bool feature_test(Flv_Feature v) // Test if (set of) feature(s) on
{ return ((vfeature&v)==v); }
// Convenience funtions to test if a feature is ON.
bool row_footer(void) // Row footer convenience function
{ return feature_test(FLVF_ROW_FOOTER); }
bool row_header(void) // Row header convenience function
{ return feature_test(FLVF_ROW_HEADER); }
bool row_divider(void) // Row divider convenience function
{ return feature_test(FLVF_ROW_DIVIDER); }
bool multi_select(void) // Multi-select convenience function
{ return feature_test(FLVF_MULTI_SELECT); }
bool persist_select(void) // Persistant selection test
{ return feature_test(FLVF_PERSIST_SELECT); }
bool full_resize(void) // Full widget resize test
{ return feature_test(FLVF_FULL_RESIZE); }
void get_default_style( Flv_Style &s ); // Fill in s with default style
int get_row( int x, int y ); // Get row from X value
bool get_cell_bounds( int &X, int &Y, int &W, int &H, int R, int C=0 );
Flv_ShowScrollbar has_scrollbar(void) // Get/set scrollbar visibility
{ return vhas_scrollbars; }
Flv_ShowScrollbar has_scrollbar( Flv_ShowScrollbar v );
bool move_row(int amount); // Change row # by amount
int row(void) // Get/set current row
{ return vrow; };
int row(int n);
bool row_resizable( int r );// Get/Set row locked status
bool row_resizable( bool n, int r );
int row_offset(void)// Get/Set current row offset
{ return vrow_offset; }
int row_offset( int n );
int rows(void) // Get/Set total # of rows
{ return vrows; };
int rows(int n);
int rows_per_page(void) // Get/set # of rows / page
{ return vrows_per_page; }
int rows_per_page( int n ); // Use 0 to allow calculating
bool row_selected(int n); // Is row selected?
int row_width(void) // Get/set total row width
{ return vrow_width; };
int row_width( int n );
int scrollbar_width(void) // Get/set scrollbar thickness
{ return vscrollbar_width; }
int scrollbar_width(int n);
bool select_locked(void) // Allow selecting locked rows/cols?
{ return vselect_locked; }
bool select_locked(bool n) // Set whether allowing selection of
{ return (vselect_locked=n); } // locked rows/cols
int select_start_row(void) // Get first selected row
{ return vselect_row; }
int select_start_row(int n); // Set first selected row
int top_row(void) // Get the current top row
{ return vtop_row; }
int top_row(int v)
{ return (vtop_row=v); };// Set the top row (Hint only)
int why_event() // Why was the event called?
{ return vwhy_event; }
int why_event( int n ) // Set why the event was called
{ return (vwhy_event=n); }
// Style routines
Flv_Style global_style; // Global style
Flv_Style_List row_style; // Row styles
protected:
unsigned char vmax_clicks; // Max clicks allowed
unsigned char vclicks;
int vedit_when; // When does editing start
int edit_row;
void switch_editor( int nr );
Fl_Widget *veditor; // Current editor
bool vediting; // Are we editing now?
int vwhy_event; // Why was event called
int vlast_row; // Last row highlighted
bool at_end_row; // Set by get_row() to true if event_y is near the end of row
void update_top_row(int H);
int handle(int event);
void start_draw(int &X, int &Y, int &W, int &H, int &rw);
virtual void draw_row( int Offset, int &X, int &Y, int &W, int &H, int R );
void draw_border(Flv_Style &s, int &X, int &Y, int &W, int &H );
void client_area( int &X, int &Y, int &W, int &H );
void draw_scrollbars( int &X, int &Y, int &W, int &H );
void draw();
int page_size(void); // Calculate useable page size
int vrow; // Current selected row
private:
#ifdef FLTK_2
static Fl_Style* default_style;
#endif
void check_cursor(void); // Check if resizing allowed here
bool check_resize(void); // true if resizing
int vcallback_when; // When to call back
Fl_Color vdead_space_color; // Dead space color
Flv_ShowScrollbar vhas_scrollbars; // determine scroll bar visibility
Flv_Feature vfeature; // Features (Headers, footers, dividers)
int vrow_offset; // Current left offset for display
int vrow_width; // Total pixel width
int vrows; // Total # of rows to display
int vrows_per_page; // # of rows to advance/page
bool vselect_locked; // Selected locked entries or skip?
int vselect_row; // First selected row
int vscrollbar_width; // "thickness" of scrollbar
int vtop_row; // Current top row
};
#endif
#endif