00001
00012 #define GITK_RENDERER_C
00013 #define GITKR_WIDGET_CHARACTERINPUT_C
00014
00015 #include "gitkrincludes.h"
00016
00018 void gitkr_widget_characterinput_new(GitkrTextWidgetPtr widget,GitkDialogPtr dialog,xmlNodePtr node) {
00019 widget->icon='>';
00020 gitkr_widget_new(widget,dialog,node);
00021 widget->type=GITK_WIDGET_TYPE_CHARACTERINPUT;
00022 widget->output=gitkr_widget_characterinput_output;
00023 widget->handle=gitkr_widget_characterinput_handle;
00024 }
00025
00027 void gitkr_widget_characterinput_output(GitkrTextWidgetPtr widget,gint line,gboolean active) {
00028 gint str_len;
00029 gchar *value=gitkr_widget_get_value(widget->dialog,widget->id,"value");
00030
00031 gitkr_widget_output_pre(widget,line,active);
00032
00033
00034 if(widget->label) {
00035 mvaddstr(line,2,widget->label);
00036 str_len=strlen(widget->label);
00037 }
00038 else {
00039 mvaddstr(line,2,"-");
00040 str_len=1;
00041 }
00042 mvaddstr(line,2+str_len," : [");
00043 gitkr_widget_characterinput_value_output(2+str_len+4,line,(value?value:" "),0);
00044 mvaddstr(line,COLS-1,"]");
00045 free(value);
00046
00047 if(active && widget->label) { festival_say_text(ftinfo,widget->label); }
00048 gitkr_widget_output_post(widget,line,active);
00049 }
00050
00054 #define MAX_INPUT_LEN 1024
00055
00057 gboolean gitkr_widget_characterinput_handle(GitkrTextWidgetPtr widget,gint line) {
00058 gint key;
00059 gboolean sub_run=TRUE,result=TRUE;
00060 gint xmin,xmax,xlen,xpos,xoff;
00061 gchar editbuf[MAX_INPUT_LEN],*value,*editpos;
00062
00063
00064 widget->output(widget,line,FALSE);
00065
00066 gitkr_widget_output_pre(widget,line,FALSE);
00067
00068 if(widget->label) {
00069 xmin=2+strlen(widget->label)+4;
00070 }
00071 else {
00072 xmin=2+1+4;
00073 }
00074 xmax=COLS-(xmin+1);
00075 xlen=xmax-xmin;
00076
00077 value=gitkr_widget_get_value(widget->dialog,widget->id,"value");
00078 if(value) {
00079 festival_say_text(ftinfo,value);
00080 strncpy(editbuf,value,MAX_INPUT_LEN);
00081 xpos=strlen(value);
00082 if(xpos>MAX_INPUT_LEN) xpos=MAX_INPUT_LEN;
00083
00084 if(xpos>xlen) {
00085 xoff=xpos-xlen;
00086 xpos-=xoff;
00087 }
00088 else {
00089 xoff=0;
00090 }
00091 free(value);
00092 }
00093 else {
00094 *editbuf='\0';
00095 xpos=0;xoff=0;
00096 }
00097
00098 move(line,xmin+xpos);
00099 refresh();
00100 editpos=&editbuf[xoff+xpos];
00101
00102
00103 while(run && sub_run) {
00104 if((key=gitkr_event_loop_getkey())==ERR) continue;
00105
00106 switch(key) {
00107 case KEY_F10:
00108 sub_run=FALSE;result=FALSE;
00109 break;
00110 case KEY_RETURN:
00111 case KEY_ENTER:
00112 gitkr_widget_set_value(widget->dialog,widget->id,"value",editbuf);
00113 festival_say_text(ftinfo,value);
00114 sub_run=FALSE;
00115 break;
00116 case KEY_LEFT:
00117 if(xpos) {
00118 editpos--;xpos--;
00119 move(line,xmin+xpos);
00120 }
00121 else if(xoff) {
00122 editpos--;xoff--;
00123 gitkr_widget_characterinput_value_output(xmin,line,editbuf,xoff);
00124 move(line,xmin+xpos);
00125 }
00126 else beep();
00127 refresh();
00128 break;
00129 case KEY_RIGHT:
00130 if(xpos<xlen && *editpos) {
00131 editpos++;xpos++;
00132 move(line,xmin+xpos);
00133 }
00134 else if(xpos==xlen && *editpos) {
00135 editpos++;xoff++;
00136 gitkr_widget_characterinput_value_output(xmin,line,editbuf,xoff);
00137 move(line,xmin+xpos);
00138 }
00139 else beep();
00140 refresh();
00141 break;
00142 case KEY_BACKSPACE:
00144
00145 if(xpos || xoff) {
00146 editpos--;xpos--;
00147
00148 if(*editpos) {
00149 memmove(editpos,editpos+1,strlen(editpos)+1);
00150 gitkr_widget_characterinput_value_output(xmin,line,editbuf,xoff);
00151 move(line,xmin+xpos);
00152 }
00153 else beep();
00154 }
00155 else beep();
00156 refresh();
00157 break;
00158 case KEY_DEL:
00159 if(*editpos) {
00160 memmove(editpos,editpos+1,strlen(editpos)+1);
00161 gitkr_widget_characterinput_value_output(xmin,line,editbuf,xoff);
00162 move(line,xmin+xpos);
00163 }
00164 else beep();
00165 refresh();
00166 break;
00167 default:
00168 if(key && key>=' ') {
00169 gitk_log3("? : %4d 0x%03x '%c'",key,key,KEYCODE_TO_ASCII(key));
00170
00171 if(TRUE) {
00172
00173 if(TRUE) {
00174
00175 if(!*editpos) {
00176 *editpos++=key;*editpos='\0';
00177 xpos++;
00178 }
00179 else {
00180 memmove(editpos+1,editpos,strlen(editpos)+1);
00181 *editpos++=key;xpos++;
00182 }
00183 gitkr_widget_characterinput_value_output(xmin,line,editbuf,xoff);
00184 move(line,xmin+xpos);
00185 }
00186 else beep();
00187 }
00188 else beep();
00189 refresh();
00190 }
00191 else {
00192 gitk_log("key-event : CTRL-CHR");
00193 }
00194 }
00195 }
00196
00197 widget->output(widget,line,TRUE);
00198
00199 move(line,0);
00200 refresh();
00201
00202 return(result);
00203 }
00204
00206 void gitkr_widget_characterinput_value_output(gint col,gint line,gchar *value, gint offset) {
00207 gchar *linebuf;
00208 gint val_len;
00209
00210 gitk_log1("value=\"%s\"",value);
00211
00212 val_len=COLS-(col+1);
00213 linebuf=g_malloc(val_len+1);
00214 sprintf(linebuf,"%-*s",val_len,&value[offset]);
00215
00216
00217 mvaddstr(line,col,linebuf);
00218 g_free(linebuf);
00219 }