Max 5 API Reference
00001 /** 00002 @file 00003 uitextfield - demonstrate the textfield with keyboard input 00004 00005 @ingroup examples 00006 */ 00007 00008 #include "ext.h" 00009 #include "ext_obex.h" 00010 #include "jpatcher_api.h" 00011 #include "jpatcher_syms.h" 00012 #include "jgraphics.h" 00013 00014 00015 /**********************************************************************/ 00016 // Data Structures 00017 typedef struct _uitextfield { 00018 t_jbox j_box; 00019 t_jrgba j_textcolor; 00020 t_jrgba j_bgcolor; 00021 } t_uitextfield; 00022 00023 00024 /**********************************************************************/ 00025 // Prototypes 00026 00027 t_uitextfield* uitextfield_new(t_symbol *s, short argc, t_atom *argv); 00028 void uitextfield_free(t_uitextfield *x); 00029 void uitextfield_set(t_uitextfield *x, t_symbol *s, long ac, t_atom *av); 00030 void uitextfield_select(t_uitextfield *x); 00031 void uitextfield_doselect(t_uitextfield *x); 00032 00033 void uitextfield_paint(t_uitextfield *x, t_object *view); 00034 long uitextfield_key(t_uitextfield *x, t_object *patcherview, long keycode, long modifiers, long textcharacter); 00035 long uitextfield_keyfilter(t_uitextfield *x, t_object *patcherview, long *keycode, long *modifiers, long *textcharacter); 00036 void uitextfield_enter(t_uitextfield *x); 00037 00038 00039 /**********************************************************************/ 00040 // Globals and Statics 00041 00042 static t_class *s_uitextfield_class = NULL; 00043 00044 00045 /**********************************************************************/ 00046 // Class Definition and Life Cycle 00047 00048 int main(void) 00049 { 00050 t_class *c; 00051 00052 jpatcher_syms_init(); 00053 00054 c = class_new("uitextfield", 00055 (method)uitextfield_new, 00056 (method)uitextfield_free, 00057 sizeof(t_uitextfield), 00058 (method)NULL, 00059 A_GIMME, 00060 0L); 00061 00062 c->c_flags |= CLASS_FLAG_NEWDICTIONARY; 00063 jbox_initclass(c, JBOX_TEXTFIELD | JBOX_FONTATTR | JBOX_FIXWIDTH); // include textfield and Fonts attributes 00064 00065 class_addmethod(c, (method) uitextfield_paint, "paint", A_CANT, 0); 00066 class_addmethod(c, (method) uitextfield_key, "key", A_CANT, 0); 00067 class_addmethod(c, (method) uitextfield_keyfilter, "keyfilter", A_CANT, 0); 00068 class_addmethod(c, (method) uitextfield_enter, "enter", A_CANT, 0); 00069 class_addmethod(c, (method) jbox_notify, "notify", A_CANT, 0); 00070 00071 class_addmethod(c, (method) uitextfield_set, "anything", A_GIMME, 0); 00072 class_addmethod(c, (method) uitextfield_select, "select", 0); 00073 00074 CLASS_ATTR_RGBA(c, "textcolor", 0, t_uitextfield, j_textcolor); 00075 CLASS_ATTR_DEFAULT_SAVE_PAINT(c, "textcolor", 0, "0. 0. 0. 1."); 00076 CLASS_ATTR_STYLE_LABEL(c, "textcolor", 0, "rgba", "Text Color"); 00077 CLASS_ATTR_CATEGORY(c, "textcolor", 0, "Color"); 00078 00079 CLASS_ATTR_RGBA(c, "bgcolor", 0, t_uitextfield, j_bgcolor); 00080 CLASS_ATTR_DEFAULT_SAVE_PAINT(c, "bgcolor", 0, "0.8 0.8 0.8 1."); 00081 CLASS_ATTR_STYLE_LABEL(c, "bgcolor", 0, "rgba", "Background Color"); 00082 CLASS_ATTR_CATEGORY(c, "bgcolor", 0, "Color"); 00083 00084 CLASS_ATTR_DEFAULT(c, "rect", 0, "0. 0. 100. 20."); 00085 00086 class_register(CLASS_BOX, c); 00087 s_uitextfield_class = c; 00088 return 0; 00089 } 00090 00091 00092 t_uitextfield* uitextfield_new(t_symbol *s, short argc, t_atom *argv) 00093 { 00094 t_uitextfield* x; 00095 t_dictionary *d = NULL; 00096 long boxflags; 00097 00098 if (!(d = object_dictionaryarg(argc,argv))) 00099 return NULL; 00100 00101 x = (t_uitextfield*)object_alloc(s_uitextfield_class); 00102 if (x) { 00103 long flags; 00104 t_object *textfield; 00105 00106 00107 flags = 0 00108 | JBOX_DRAWFIRSTIN 00109 | JBOX_NODRAWBOX 00110 | JBOX_DRAWINLAST 00111 | JBOX_TRANSPARENT 00112 // | JBOX_NOGROW 00113 // | JBOX_GROWY 00114 // | JBOX_GROWBOTH 00115 // | JBOX_IGNORELOCKCLICK 00116 // | JBOX_HILITE 00117 // | JBOX_BACKGROUND 00118 // | JBOX_NOFLOATINSPECTOR 00119 | JBOX_TEXTFIELD 00120 ; 00121 00122 jbox_new(&x->j_box, flags, argc, argv); 00123 x->j_box.b_firstin = (t_object*) x; 00124 00125 textfield = jbox_get_textfield((t_object*) x); 00126 if (textfield) { 00127 textfield_set_editonclick(textfield, 1); // set it to 0 if you don't want user to edit it in lock mode 00128 textfield_set_textmargins(textfield, 3, 3, 3, 3); // margin on each side 00129 textfield_set_textcolor(textfield, &x->j_textcolor);// textcolor 00130 } 00131 attr_dictionary_process(x, d); 00132 jbox_ready(&x->j_box); 00133 } 00134 return x; 00135 } 00136 00137 void uitextfield_free(t_uitextfield *x) 00138 { 00139 jbox_free(&x->j_box); 00140 } 00141 00142 void uitextfield_set(t_uitextfield *x, t_symbol *s, long ac, t_atom *av) 00143 { 00144 char buff[MAX_FILENAME_CHARS]; 00145 00146 if (ac && av) { 00147 if (atom_gettype(av) == A_SYM) 00148 strcpy(buff, atom_getsym(av)->s_name); 00149 else if (atom_gettype(av) == A_LONG) 00150 sprintf(buff, "%ld", atom_getlong(av)); 00151 else if (atom_gettype(av) == A_FLOAT) 00152 sprintf(buff, "%f", atom_getfloat(av)); 00153 else { 00154 object_error((t_object *)x, "bad argument for message set"); 00155 return; 00156 } 00157 object_method(jbox_get_textfield((t_object *)x), gensym("settext"), buff); 00158 jbox_redraw((t_jbox *)x); 00159 } 00160 } 00161 00162 void uitextfield_select(t_uitextfield *x) 00163 { 00164 defer(x, (method)uitextfield_doselect, 0, 0, 0); 00165 } 00166 00167 void uitextfield_doselect(t_uitextfield *x) 00168 { 00169 t_object *p = NULL; 00170 object_obex_lookup(x,gensym("#P"), &p); 00171 if (p) { 00172 t_atom rv; 00173 long ac = 1; 00174 t_atom av[1]; 00175 atom_setobj(av, x); 00176 object_method_typed(p, gensym("selectbox"), ac, av, &rv); 00177 } 00178 } 00179 00180 00181 long uitextfield_key(t_uitextfield *x, t_object *patcherview, long keycode, long modifiers, long textcharacter) 00182 { 00183 char buff[256]; 00184 buff[0] = textcharacter; // we know this is just a simple char 00185 buff[1] = 0; 00186 object_method(patcherview, gensym("insertboxtext"), x, buff); 00187 jbox_redraw((t_jbox *)x); 00188 00189 return 1; 00190 } 00191 00192 long uitextfield_keyfilter(t_uitextfield *x, t_object *patcherview, long *keycode, long *modifiers, long *textcharacter) 00193 { 00194 t_atom arv; 00195 long rv = 1; 00196 long k = *keycode; 00197 00198 if (k == JKEY_TAB || k == JKEY_ENTER || k == JKEY_RETURN || k == JKEY_ESC) { 00199 object_method_typed(patcherview, gensym("endeditbox"), 0, NULL, &arv); 00200 rv = 0; // don't pass those keys to uitextfield 00201 } 00202 return rv; 00203 } 00204 00205 void uitextfield_enter(t_uitextfield *x) // enter is triggerd at "endeditbox time" 00206 { 00207 long size = 0; 00208 char *text = NULL; 00209 t_object *textfield = jbox_get_textfield((t_object *)x); 00210 object_method(textfield, gensym("gettextptr"), &text, &size); 00211 if (size) 00212 post("This is the new text: %s", text); 00213 } 00214 00215 /**********************************************************************/ 00216 // Methods 00217 void uitextfield_bang(t_uitextfield *x) 00218 { 00219 t_object *textfield = NULL; 00220 jbox_get_textfield((t_object *)x); 00221 if (textfield) { 00222 00223 } 00224 } 00225 void uitextfield_paint(t_uitextfield *x, t_object *view) 00226 { 00227 t_rect rect; 00228 t_jgraphics *g; 00229 00230 g = (t_jgraphics*) patcherview_get_jgraphics(view); 00231 00232 // set up matrix 00233 jbox_get_rect_for_view((t_object*) x, view, &rect); 00234 00235 // soft gray background 00236 jgraphics_rectangle(g, 0., 0., rect.width, rect.height); 00237 jgraphics_set_source_jrgba(g, &x->j_bgcolor); 00238 jgraphics_fill(g); 00239 00240 // set line width for the corners 00241 jgraphics_set_line_width(g, 2.); 00242 jgraphics_set_source_rgba(g, x->j_bgcolor.red * 0.7, x->j_bgcolor.green * 0.7, x->j_bgcolor.blue * 0.7, x->j_bgcolor.alpha * 0.7); 00243 00244 // draw top left corner 00245 jgraphics_move_to(g, 1., rect.height - 8.); 00246 jgraphics_line_to(g, 1., rect.height - 1.); 00247 jgraphics_line_to(g, 8., rect.height - 1.); 00248 jgraphics_stroke(g); 00249 00250 // draw bottom right corner 00251 jgraphics_move_to(g, rect.width - 8., 1.); 00252 jgraphics_line_to(g, rect.width - 1., 1.); 00253 jgraphics_line_to(g, rect.width - 1., 8.); 00254 jgraphics_stroke(g); 00255 }
Copyright © 2008, Cycling '74