198 строки
5.2 KiB
C++
198 строки
5.2 KiB
C++
/****************************************************************************
|
|
|
|
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 "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());
|
|
}
|
|
|
|
|