diff options
Diffstat (limited to 'tests/bullet/Extras/glui/glui_commandline.cpp')
-rw-r--r-- | tests/bullet/Extras/glui/glui_commandline.cpp | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/tests/bullet/Extras/glui/glui_commandline.cpp b/tests/bullet/Extras/glui/glui_commandline.cpp new file mode 100644 index 00000000..75865982 --- /dev/null +++ b/tests/bullet/Extras/glui/glui_commandline.cpp @@ -0,0 +1,197 @@ +/**************************************************************************** + + 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()); +} + + |