gitkrwcharacterinput.c

Go to the documentation of this file.
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   //-- display label
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   //-- un-highlight widget
00064   widget->output(widget,line,FALSE);
00065   //-- activate style
00066   gitkr_widget_output_pre(widget,line,FALSE);
00067   //-- calculate widget size
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   //-- init edit buffer with old value, calculate initial cursor pos
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     //-- is value longer that widget ?
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   //-- position cursor
00098   move(line,xmin+xpos);
00099   refresh();
00100   editpos=&editbuf[xoff+xpos];
00101 
00102   //-- now run the sub-event-loop
00103   while(run && sub_run) {
00104     if((key=gitkr_event_loop_getkey())==ERR) continue;
00105     //-- process the key-code
00106     switch(key) {
00107       case KEY_F10:    // cancel edit
00108         sub_run=FALSE;result=FALSE;
00109         break;
00110       case KEY_RETURN: // submit edit
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         //gitk_log2("BACKSPACE.1 : xpos=%d  xoff=%d",xpos,xoff);
00145         if(xpos || xoff) {
00146           editpos--;xpos--;
00147           //gitk_log3("BACKSPACE.2 : xpos=%d  xoff=%d  *editpos='%c'",xpos,xoff,*editpos);
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           //-- apply filter
00171           if(TRUE) { 
00172             //-- check that there is enough space to include one more character
00173             if(TRUE) { 
00174               //-- insert char
00175               if(!*editpos) { // we're at the end of the line
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   //-- highlight widget
00197   widget->output(widget,line,TRUE);
00198   //-- re-position cursor
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   //strncpy(linebuf,&value[offset],val_len);
00216   //linebuf[val_len]='\0';
00217   mvaddstr(line,col,linebuf);
00218   g_free(linebuf);
00219 }

Generated on Thu Oct 28 10:59:13 2004 for gitk by doxygen 1.3.6