glui_commandline.cpp
上传用户:gb3593
上传日期:2022-01-07
资源大小:3028k
文件大小:5k
- /****************************************************************************
-
- 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/%dn",
- 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]==' ') 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:%dn",
- name, this,
- insertion_pt, substring_start, substring_end, sel_start, sel_end,
- (int)text.length());
- }