Blame examples/table-with-keynav.cxx

Packit 328d5c
//
Packit 328d5c
// "$Id: table-with-keynav.cxx 9848 2013-03-25 23:20:29Z greg.ercolano $"
Packit 328d5c
//
Packit 328d5c
//    Example of Fl_Table with keyboard selection navigation - Greg Ercolano 04/14/2012
Packit 328d5c
//
Packit 328d5c
//    Display a 10x10 multiplication table, and allow the user to
Packit 328d5c
//    make cell or row selections (with mouse or keyboard navigation)
Packit 328d5c
//    to select areas of the table, and show the sum of the cell's values.
Packit 328d5c
//
Packit 328d5c
//    Started with the "testkeyboardnav.cxx" example from the original
Packit 328d5c
//    Fl_Table project, using Jean-Marc Lienher's additions for keyboard nav.
Packit 328d5c
//
Packit 328d5c
// Copyright 2003, 2012 Greg Ercolano.
Packit 328d5c
// Copyright 2004 Jean-Marc Lienher
Packit 328d5c
// Copyright 1998-2010 by Bill Spitzak and others.
Packit 328d5c
//
Packit 328d5c
// This library is free software. Distribution and use rights are outlined in
Packit 328d5c
// the file "COPYING" which should have been included with this file.  If this
Packit 328d5c
// file is missing or damaged, see the license at:
Packit 328d5c
//
Packit 328d5c
//     http://www.fltk.org/COPYING.php
Packit 328d5c
//
Packit 328d5c
// Please report all bugs and problems on the following page:
Packit 328d5c
//
Packit 328d5c
//     http://www.fltk.org/str.php
Packit 328d5c
//
Packit 328d5c
#include <FL/Fl.H>
Packit 328d5c
#include <FL/fl_draw.H>
Packit 328d5c
#include <FL/Fl_Double_Window.H>
Packit 328d5c
#include <FL/Fl_Toggle_Button.H>
Packit 328d5c
#include <FL/Fl_Output.H>
Packit 328d5c
#include <FL/Fl_Table_Row.H>
Packit 328d5c
#include <FL/names.h>
Packit 328d5c
#include <stdio.h>
Packit 328d5c
#include <stdlib.h>
Packit 328d5c
Packit 328d5c
// GLOBALS
Packit 328d5c
class MyTable;
Packit 328d5c
Fl_Toggle_Button *G_rowselect = 0;		// toggle to enable row selection
Packit 328d5c
MyTable          *G_table = 0;			// table widget
Packit 328d5c
Fl_Output        *G_sum = 0;			// displays sum of user's selection
Packit 328d5c
Packit 328d5c
class MyTable : public Fl_Table_Row {
Packit 328d5c
protected:
Packit 328d5c
    // Handle drawing all cells in table
Packit 328d5c
    void draw_cell(TableContext context, int R=0,int C=0, int X=0,int Y=0,int W=0,int H=0) {
Packit 328d5c
	static char s[30]; 
Packit 328d5c
	switch ( context ) {
Packit 328d5c
	    case CONTEXT_COL_HEADER:
Packit 328d5c
	    case CONTEXT_ROW_HEADER:
Packit 328d5c
		fl_font(FL_HELVETICA | FL_BOLD, 14);
Packit 328d5c
		fl_push_clip(X, Y, W, H);
Packit 328d5c
		{
Packit 328d5c
		    Fl_Color c = (context==CONTEXT_COL_HEADER) ? col_header_color() : row_header_color();
Packit 328d5c
		    fl_draw_box(FL_THIN_UP_BOX, X, Y, W, H, c);
Packit 328d5c
		    fl_color(FL_BLACK);
Packit 328d5c
		    // Draw text for headers
Packit 328d5c
		    sprintf(s, "%d", (context == CONTEXT_COL_HEADER) ? C : R);
Packit 328d5c
		    fl_draw(s, X, Y, W, H, FL_ALIGN_CENTER);
Packit 328d5c
		}
Packit 328d5c
		fl_pop_clip();
Packit 328d5c
		return;
Packit 328d5c
	    case CONTEXT_CELL: {
Packit 328d5c
		// Keyboard nav and mouse selection highlighting
Packit 328d5c
		int selected = G_rowselect->value() ? row_selected(R) : is_selected(R,C);
Packit 328d5c
		fl_draw_box(FL_THIN_UP_BOX, X, Y, W, H, selected ? FL_YELLOW : FL_WHITE);
Packit 328d5c
		// Draw text for the cell
Packit 328d5c
		fl_push_clip(X+3, Y+3, W-6, H-6);
Packit 328d5c
		{
Packit 328d5c
		    fl_font(FL_HELVETICA, 14);
Packit 328d5c
		    fl_color(FL_BLACK); 
Packit 328d5c
		    sprintf(s, "%d", R*C);		// factor row + col for data cells
Packit 328d5c
		    fl_draw(s, X+3, Y+3, W-6, H-6, FL_ALIGN_RIGHT);
Packit 328d5c
		}
Packit 328d5c
		fl_pop_clip();
Packit 328d5c
		return;
Packit 328d5c
	    }
Packit 328d5c
	    default:
Packit 328d5c
		return;
Packit 328d5c
	}
Packit 328d5c
    }
Packit 328d5c
public:
Packit 328d5c
    // CTOR
Packit 328d5c
    MyTable(int x, int y, int w, int h, const char *l=0) : Fl_Table_Row(x,y,w,h,l) {
Packit 328d5c
	// Row init
Packit 328d5c
	row_header(1);
Packit 328d5c
	row_header_width(70);
Packit 328d5c
	row_resize(1);
Packit 328d5c
	rows(11);
Packit 328d5c
	row_height_all(20);
Packit 328d5c
	// Col init
Packit 328d5c
	col_header(1);
Packit 328d5c
	col_header_height(20);
Packit 328d5c
	col_resize(1);
Packit 328d5c
	cols(11);
Packit 328d5c
	col_width_all(70);
Packit 328d5c
	end();			// Fl_Table derives from Fl_Group, so end() it
Packit 328d5c
    }
Packit 328d5c
    ~MyTable() { }
Packit 328d5c
    // Update the displayed sum value
Packit 328d5c
    int GetSelectionSum() {
Packit 328d5c
        int sum = -1;
Packit 328d5c
        for ( int R=0; R
Packit 328d5c
	    for ( int C=0; C
Packit 328d5c
	        if ( G_rowselect->value() ? row_selected(R) : is_selected(R,C) ) {
Packit 328d5c
		    if ( sum == -1 ) sum = 0;
Packit 328d5c
		    sum += R*C;
Packit 328d5c
		}
Packit 328d5c
	    }
Packit 328d5c
	}
Packit 328d5c
	return(sum);
Packit 328d5c
    }
Packit 328d5c
    // Update the "Selection sum:" display
Packit 328d5c
    void UpdateSum() {
Packit 328d5c
	static char s[80];
Packit 328d5c
	int sum = GetSelectionSum();
Packit 328d5c
	if ( sum == -1 ) { sprintf(s, "(nothing selected)"); G_sum->color(48); }
Packit 328d5c
	else             { sprintf(s, "%d", sum); G_sum->color(FL_WHITE); }
Packit 328d5c
	// Update only if different (lets one copy/paste from sum)
Packit 328d5c
	if ( strcmp(s,G_sum->value()))
Packit 328d5c
	    { G_sum->value(s); G_sum->redraw(); }
Packit 328d5c
    }
Packit 328d5c
    // Keyboard and mouse events
Packit 328d5c
    int handle(int e) {
Packit 328d5c
        int ret = Fl_Table_Row::handle(e);
Packit 328d5c
	if ( e == FL_KEYBOARD && Fl::event_key() == FL_Escape ) exit(0);
Packit 328d5c
        switch (e) {
Packit 328d5c
	    case FL_PUSH:
Packit 328d5c
	    case FL_RELEASE:
Packit 328d5c
	    case FL_KEYUP:
Packit 328d5c
	    case FL_KEYDOWN:
Packit 328d5c
	    case FL_DRAG: {
Packit 328d5c
		//ret = 1;		// *don't* indicate we 'handled' these, just update ('handling' prevents e.g. tab nav)
Packit 328d5c
	        UpdateSum();
Packit 328d5c
		redraw();
Packit 328d5c
		break;
Packit 328d5c
	    }
Packit 328d5c
	    case FL_FOCUS:		// tells FLTK we're interested in keyboard events
Packit 328d5c
	    case FL_UNFOCUS:
Packit 328d5c
	        ret = 1;
Packit 328d5c
		break;
Packit 328d5c
	}
Packit 328d5c
	return(ret);
Packit 328d5c
    }
Packit 328d5c
};
Packit 328d5c
Packit 328d5c
// User changed the 'row select' toggle button
Packit 328d5c
void RowSelect_CB(Fl_Widget *w, void*) {
Packit 328d5c
    w->window()->redraw();		// redraw with changes applied
Packit 328d5c
    G_table->UpdateSum();
Packit 328d5c
}
Packit 328d5c
int main() {
Packit 328d5c
    Fl::option(Fl::OPTION_ARROW_FOCUS, 0);		// disable arrow focus nav (we want arrows to control cells)
Packit 328d5c
    Fl_Double_Window win(862, 312, "table-with-keynav");
Packit 328d5c
    win.begin();
Packit 328d5c
	// Create table
Packit 328d5c
	G_table = new MyTable(10, 30, win.w()-20, win.h()-70, "Times Table");
Packit 328d5c
	G_table->tooltip("Use mouse or Shift + Arrow Keys to make selections.\n"
Packit 328d5c
		         "Sum of selected values is shown.");
Packit 328d5c
	// Row select toggle button
Packit 328d5c
	G_rowselect = new Fl_Toggle_Button(140,10,12,12,"Row selection");
Packit 328d5c
	G_rowselect->align(FL_ALIGN_LEFT);
Packit 328d5c
	G_rowselect->value(0);
Packit 328d5c
	G_rowselect->selection_color(FL_YELLOW);
Packit 328d5c
	G_rowselect->callback(RowSelect_CB);
Packit 328d5c
	G_rowselect->tooltip("Click to toggle row vs. row/col selection");
Packit 328d5c
	// Selection sum display
Packit 328d5c
	win.end();
Packit 328d5c
	win.begin();
Packit 328d5c
	G_sum = new Fl_Output(140,G_table->y()+G_table->h()+10,160,25,"Selection Sum:");
Packit 328d5c
	G_sum->value("(nothing selected)");
Packit 328d5c
	G_sum->color(48);
Packit 328d5c
	G_sum->tooltip("This field shows the sum of the selected cells in the table");
Packit 328d5c
    win.end();
Packit 328d5c
    win.resizable(G_table);
Packit 328d5c
    win.show(); 
Packit 328d5c
    return Fl::run();
Packit 328d5c
}
Packit 328d5c
Packit 328d5c
//
Packit 328d5c
// End of "$Id: table-with-keynav.cxx 9848 2013-03-25 23:20:29Z greg.ercolano $".
Packit 328d5c
//