/**************************************************************************** GLUI User Interface Toolkit --------------------------- glui_commandline.cpp - GLUI_CommandLine control class -------------------------------------------------- Copyright (c) 1998 Paul Rademacher, 2005 William Baxter This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA This program is -not- in the public domain. *****************************************************************************/ #include "GL/glui.h" #include "glui_internal.h" /****************************** GLUI_CommandLine::GLUI_CommandLine() **********/ GLUI_CommandLine::GLUI_CommandLine( GLUI_Node *parent, const char *name, void *data, int id, GLUI_CB cb ) { common_init(); set_name( name ); data_type = GLUI_EDITTEXT_TEXT; ptr_val = data; user_id = id; callback = cb; live_type = GLUI_LIVE_TEXT; parent->add_control( this ); init_live(); } /****************************** GLUI_CommandLine::key_handler() **********/ int GLUI_CommandLine::key_handler( unsigned char key,int modifiers ) { int ret; if ( NOT glui ) return false; if ( debug ) dump( stdout, "-> CMD_TEXT KEY HANDLER" ); if ( key == 13 ) { /* RETURN */ commit_flag = true; } ret = Super::key_handler( key, modifiers ); if ( debug ) dump( stdout, "<- CMD_TEXT KEY HANDLER" ); return ret; } /****************************** GLUI_CommandLine::deactivate() **********/ void GLUI_CommandLine::deactivate( void ) { // if the commit_flag is set, add the current command to // history and call deactivate as normal // Trick deactivate into calling callback if and only if commit_flag set. // A bit subtle, but deactivate checks that orig_text and text // are the same to decide whether or not to call the callback. // Force them to be different for commit, and the same for no commit. if (commit_flag) { add_to_history(text.c_str()); orig_text = ""; Super::deactivate( ); set_text( "" ); commit_flag = false; } else { orig_text = text; } } /**************************** GLUI_CommandLine::special_handler() **********/ int GLUI_CommandLine::special_handler( int key,int modifiers ) { if ( NOT glui ) return false; if ( debug ) printf( "CMD_TEXT SPECIAL:%d - mod:%d subs:%d/%d ins:%d sel:%d/%d\n", key, modifiers, substring_start, substring_end,insertion_pt, sel_start, sel_end ); if ( key == GLUT_KEY_UP ) // PREVIOUS HISTORY { scroll_history(-1); } else if ( key == GLUT_KEY_DOWN ) // NEXT HISTORY { scroll_history(+1); } else { return Super::special_handler( key, modifiers ); } return false; } /**************************** GLUI_CommandLine::scroll_history() ********/ void GLUI_CommandLine::scroll_history( int direction ) { recall_history(curr_hist + direction); } /**************************** GLUI_CommandLine::recall_history() ********/ void GLUI_CommandLine::recall_history( int hist_num ) { if (hist_num < oldest_hist OR hist_num > newest_hist OR hist_num == curr_hist) return; // Commit the current text first before we blow it away! if (curr_hist == newest_hist) { get_history_str(newest_hist) = text; } curr_hist = hist_num; set_text(get_history_str(curr_hist)); sel_end = sel_start = insertion_pt = (int)text.length(); update_and_draw_text(); } /**************************** GLUI_CommandLine::add_to_history() ********/ void GLUI_CommandLine::add_to_history( const char *cmd ) { if (cmd[0]=='\0') return; // don't add if it's empty curr_hist = newest_hist; get_history_str(newest_hist) = text; newest_hist = ++curr_hist; if ( newest_hist >= HIST_SIZE ) { // bump oldest off the list hist_list.erase(hist_list.begin()); hist_list.push_back(""); oldest_hist++; } } /**************************** GLUI_CommandLine::reset_history() ********/ void GLUI_CommandLine::reset_history( void ) { oldest_hist = newest_hist = curr_hist = 0; } /*************************************** GLUI_CommandLine::dump() **************/ void GLUI_CommandLine::dump( FILE *out, const char *name ) { fprintf( out, "%s (commandline@%p): ins_pt:%d subs:%d/%d sel:%d/%d len:%d\n", name, this, insertion_pt, substring_start, substring_end, sel_start, sel_end, (int)text.length()); }