int GLUI_TextBox::mouse_down_handler( int local_x, int local_y ) { int tmp_insertion_pt; if ( debug ) dump( stdout, "-> MOUSE DOWN" ); tmp_insertion_pt = find_insertion_pt( local_x, local_y ); if ( tmp_insertion_pt == -1 ) { if ( glui ) glui->deactivate_current_control( ); return false; } insertion_pt = tmp_insertion_pt; sel_start = sel_end = insertion_pt; keygoal_x = insert_x; if ( can_draw()) update_and_draw_text(); if ( debug ) dump( stdout, "<- MOUSE UP" ); return true; }
int GLUI_EditText::mouse_held_down_handler( int local_x, int local_y, bool new_inside) { int tmp_pt; if ( NOT new_inside ) return false; if ( debug ) dump( stdout, "-> HELD DOWN" ); tmp_pt = find_insertion_pt( local_x, local_y ); if ( tmp_pt == -1 AND sel_end != 0 ) { /* moved mouse past left edge */ special_handler( GLUT_KEY_LEFT, GLUT_ACTIVE_SHIFT ); } else if ( tmp_pt == substring_end+1 AND sel_end != (int) text.length()) { /* moved mouse past right edge */ special_handler( GLUT_KEY_RIGHT, GLUT_ACTIVE_SHIFT ); } else if ( tmp_pt != -1 AND tmp_pt != sel_end ) { sel_end = insertion_pt = tmp_pt; update_and_draw_text(); } if ( debug ) dump( stdout, "<- HELD DOWN" ); return false; }
int GLUI_TextBox::special_handler( int key,int modifiers ) { int tmp_insertion_pt; if ( NOT glui ) return false; if ( debug ) printf( "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_DOWN ) { if (insert_x == -1 || insert_y == -1) return false; tmp_insertion_pt = find_insertion_pt( keygoal_x, insert_y+LINE_HEIGHT); if (tmp_insertion_pt < 0) return false; insertion_pt = tmp_insertion_pt; sel_end = insertion_pt; if (!(modifiers & GLUT_ACTIVE_SHIFT)) { sel_start = sel_end; } if ( can_draw()) update_and_draw_text(); } else if ( key == GLUT_KEY_UP ) { if (insert_x == -1 || insert_y == -1) return false; tmp_insertion_pt = find_insertion_pt( keygoal_x, insert_y-LINE_HEIGHT); if (tmp_insertion_pt < 0) return false; insertion_pt = tmp_insertion_pt; sel_end = insertion_pt; if (!(modifiers & GLUT_ACTIVE_SHIFT)) { sel_start = sel_end; } if ( can_draw()) update_and_draw_text(); } else if ( key == GLUT_KEY_LEFT ) { if ( (modifiers & GLUT_ACTIVE_CTRL) != 0 ) { insertion_pt = find_word_break( insertion_pt, -1 ); } else { insertion_pt--; } // update keygoal_x! } else if ( key == GLUT_KEY_RIGHT ) { if ( (modifiers & GLUT_ACTIVE_CTRL) != 0 ) { insertion_pt = find_word_break( insertion_pt, +1 ); } else { insertion_pt++; } // update keygoal_x! } else if ( key == GLUT_KEY_HOME ) { insertion_pt = 0; // update keygoal_x! } else if ( key == GLUT_KEY_END ) { insertion_pt = text.length(); // update keygoal_x! } /*** Update selection if shift key is down ***/ if ( (modifiers & GLUT_ACTIVE_SHIFT ) != 0 ) sel_end = insertion_pt; else sel_start = sel_end = insertion_pt; CLAMP( insertion_pt, 0, (int)text.length()); /* Make sure insertion_pt is in bounds */ CLAMP( sel_start, 0, (int)text.length()); /* Make sure insertion_pt is in bounds */ CLAMP( sel_end, 0, (int)text.length()); /* Make sure insertion_pt is in bounds */ /******** Now redraw text ***********/ if ( can_draw()) update_and_draw_text(); return true; }