text_selected = 0;
word_selected = 0;
line_selected = 0;
+ unicode_active = -1;
text_x = 0;
enabled = 1;
highlighted = 0;
if(k > top_margin-text_height && k < get_h()-bottom_margin) {
// Draw highlighted region of row
- if(highlight_letter2 > highlight_letter1 &&
- highlight_letter2 > row_begin &&
- highlight_letter1 <= row_end) {
- if(active && enabled && get_has_focus())
- set_color(resources->text_highlight);
- else
- set_color(resources->text_inactive_highlight);
-
+ if( highlight_letter2 > highlight_letter1 &&
+ highlight_letter2 > row_begin &&
+ highlight_letter1 <= row_end ) {
+ int color = active && enabled && get_has_focus() ?
+ resources->text_highlight :
+ resources->text_inactive_highlight;
+ if( unicode_active >= 0 )
+ color ^= LTBLUE;
+ set_color(color);
if(highlight_letter1 >= row_begin &&
highlight_letter1 <= row_end)
highlight_x1 = positions[highlight_letter1];
void BC_TextBox::default_keypress(int &dispatch_event, int &result)
{
- if((top_level->get_keypress() == RETURN) ||
- (top_level->get_keypress() > 30 && top_level->get_keypress() <= 255))
- {
+ if( (top_level->get_keypress() == RETURN) ||
+ (top_level->get_keypress() > 30 && top_level->get_keypress() <= 255)) {
int len;
wchar_t *temp_string = top_level->get_wkeystring(&len);
if(top_level->get_keypress() == RETURN) {
int wtext_len = wtext_update();
last_keypress = get_keypress();
+
+ if( unicode_active >= 0 ) {
+ wchar_t wch = 0;
+ int wlen = -1;
+ switch( last_keypress ) {
+//unicode active acitons
+ case RETURN: {
+ for( int i=highlight_letter1+1; i<highlight_letter2; ++i ) {
+ int ch = nib(wtext[i]);
+ if( ch < 0 ) return 1;
+ wch = (wch<<4) + ch;
+ }
+ if( wch ) {
+ dispatch_event = 1;
+ unicode_active = -1;
+ result = 1;
+ wlen = 1;
+ break;
+ } } // fall through
+ case ESC: {
+ unicode_active = -1;
+ result = 1;
+ wlen = 0;
+ break; }
+ case BACKSPACE: {
+ if(ibeam_letter > 0) {
+ delete_selection(ibeam_letter - 1, ibeam_letter, wtext_len);
+ highlight_letter2 = --ibeam_letter;
+ if( highlight_letter1 >= highlight_letter2 )
+ unicode_active = -1;
+ }
+ result = 1;
+ wlen = 0;
+ break; }
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
+ case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': {
+ int n = nib(last_keypress);
+ wch = n < 10 ? '0'+n : 'A'+n-10;
+ result = 1;
+ wlen = 1;
+ break; }
+//normal actions
+ case TAB:
+ case LEFTTAB:
+ break;
+//ignored actions
+ default:
+ result = 1;
+ break;
+ }
+ if( wlen >= 0 ) {
+ insert_text(&wch, wlen);
+ find_ibeam(1);
+ if( unicode_active >= 0 )
+ highlight_letter2 = ibeam_letter;
+ else
+ highlight_letter1 = highlight_letter2 = 0;
+ draw(1);
+ }
+ }
+
+ if( !result ) {
//printf("BC_TextBox::keypress_event %d %x\n", __LINE__, last_keypress)
- switch(last_keypress)
- {
- case ESC:
+ switch(last_keypress) {
+ case ESC: {
// Deactivate the suggestions
- if(suggestions && suggestions_popup)
- {
+ if(suggestions && suggestions_popup) {
delete suggestions_popup;
suggestions_popup = 0;
result = 1;
}
- else
- {
+ else {
top_level->deactivate();
result = 0;
}
- break;
+ break; }
-
-
-
-
- case RETURN:
- if(rows == 1)
- {
+ case RETURN: {
+ if( rows == 1 ) {
top_level->deactivate();
dispatch_event = 1;
result = 0;
}
- else
- {
+ else {
default_keypress(dispatch_event, result);
}
- break;
-
-
+ break; }
// Handle like a default keypress
- case TAB:
+ case TAB: {
top_level->cycle_textboxes(1);
result = 1;
- break;
-
-
+ break; }
- case LEFTTAB:
+ case LEFTTAB: {
top_level->cycle_textboxes(-1);
result = 1;
- break;
+ break; }
- case LEFT:
- if(ibeam_letter > 0)
- {
+ case LEFT: {
+ if(ibeam_letter > 0) {
int old_ibeam_letter = ibeam_letter;
// Single character
- if(!ctrl_down())
- {
+ if(!ctrl_down()) {
ibeam_letter--;
}
- else
+ else {
// Word
- {
ibeam_letter--;
while(ibeam_letter > 0 && isalnum(wtext[ibeam_letter - 1]))
ibeam_letter--;
}
-
// Extend selection
- if(top_level->shift_down())
- {
+ if(top_level->shift_down()) {
// Initialize highlighting
- if(highlight_letter1 == highlight_letter2)
- {
+ if(highlight_letter1 == highlight_letter2) {
highlight_letter1 = ibeam_letter;
highlight_letter2 = old_ibeam_letter;
}
- else
+ else if(highlight_letter1 == old_ibeam_letter) {
// Extend left highlight
- if(highlight_letter1 == old_ibeam_letter)
- {
highlight_letter1 = ibeam_letter;
}
- else
+ else if(highlight_letter2 == old_ibeam_letter) {
// Shrink right highlight
- if(highlight_letter2 == old_ibeam_letter)
- {
highlight_letter2 = ibeam_letter;
}
}
- else
- {
+ else {
highlight_letter1 = highlight_letter2 = ibeam_letter;
}
if(keypress_draw) draw(1);
}
result = 1;
- break;
+ break; }
- case RIGHT:
- if(ibeam_letter < wtext_len)
- {
+ case RIGHT: {
+ if(ibeam_letter < wtext_len) {
int old_ibeam_letter = ibeam_letter;
// Single character
- if(!ctrl_down())
- {
+ if(!ctrl_down()) {
ibeam_letter++;
}
- else
+ else {
// Word
- {
- while(ibeam_letter < wtext_len && isalnum(wtext[ibeam_letter++]))
- ;
+ while(ibeam_letter < wtext_len && isalnum(wtext[ibeam_letter++]));
}
// Extend selection
- if(top_level->shift_down())
- {
+ if(top_level->shift_down()) {
// Initialize highlighting
- if(highlight_letter1 == highlight_letter2)
- {
+ if(highlight_letter1 == highlight_letter2) {
highlight_letter1 = old_ibeam_letter;
highlight_letter2 = ibeam_letter;
}
- else
+ else if(highlight_letter1 == old_ibeam_letter) {
// Shrink left highlight
- if(highlight_letter1 == old_ibeam_letter)
- {
highlight_letter1 = ibeam_letter;
}
- else
+ else if(highlight_letter2 == old_ibeam_letter) {
// Expand right highlight
- if(highlight_letter2 == old_ibeam_letter)
- {
highlight_letter2 = ibeam_letter;
}
}
- else
- {
+ else {
highlight_letter1 = highlight_letter2 = ibeam_letter;
}
if(keypress_draw) draw(1);
}
result = 1;
- break;
+ break; }
- case UP:
- if(suggestions && suggestions_popup)
- {
+ case UP: {
+ if(suggestions && suggestions_popup) {
// Pass to suggestions popup
//printf("BC_TextBox::keypress_event %d\n", __LINE__);
suggestions_popup->activate(1);
suggestions_popup->keypress_event();
result = 1;
}
- else
- if(ibeam_letter > 0)
- {
+ else if(ibeam_letter > 0) {
//printf("BC_TextBox::keypress_event 1 %d %d %d\n", ibeam_x, ibeam_y, ibeam_letter);
int new_letter = get_cursor_letter2(ibeam_x + text_x,
ibeam_y + text_y - text_height);
//printf("BC_TextBox::keypress_event 2 %d %d %d\n", ibeam_x, ibeam_y, new_letter);
// Extend selection
- if(top_level->shift_down())
- {
+ if(top_level->shift_down()) {
// Initialize highlighting
- if(highlight_letter1 == highlight_letter2)
- {
+ if(highlight_letter1 == highlight_letter2) {
highlight_letter1 = new_letter;
highlight_letter2 = ibeam_letter;
}
- else
+ else if(highlight_letter1 == ibeam_letter) {
// Expand left highlight
- if(highlight_letter1 == ibeam_letter)
- {
highlight_letter1 = new_letter;
}
- else
+ else if(highlight_letter2 == ibeam_letter) {
// Shrink right highlight
- if(highlight_letter2 == ibeam_letter)
- {
highlight_letter2 = new_letter;
}
}
else
highlight_letter1 = highlight_letter2 = new_letter;
- if(highlight_letter1 > highlight_letter2)
- {
+ if(highlight_letter1 > highlight_letter2) {
int temp = highlight_letter1;
highlight_letter1 = highlight_letter2;
highlight_letter2 = temp;
if(keypress_draw) draw(1);
}
result = 1;
- break;
+ break; }
- case PGUP:
- if(ibeam_letter > 0)
- {
+ case PGUP: {
+ if(ibeam_letter > 0) {
int new_letter = get_cursor_letter2(ibeam_x + text_x,
ibeam_y + text_y - get_h());
// Extend selection
- if(top_level->shift_down())
- {
+ if(top_level->shift_down()) {
// Initialize highlighting
- if(highlight_letter1 == highlight_letter2)
- {
+ if(highlight_letter1 == highlight_letter2) {
highlight_letter1 = new_letter;
highlight_letter2 = ibeam_letter;
}
- else
+ else if(highlight_letter1 == ibeam_letter) {
// Expand left highlight
- if(highlight_letter1 == ibeam_letter)
- {
highlight_letter1 = new_letter;
}
- else
+ else if(highlight_letter2 == ibeam_letter) {
// Shrink right highlight
- if(highlight_letter2 == ibeam_letter)
- {
highlight_letter2 = new_letter;
}
}
else
highlight_letter1 = highlight_letter2 = new_letter;
- if(highlight_letter1 > highlight_letter2)
- {
+ if(highlight_letter1 > highlight_letter2) {
int temp = highlight_letter1;
highlight_letter1 = highlight_letter2;
highlight_letter2 = temp;
if(keypress_draw) draw(1);
}
result = 1;
- break;
+ break; }
- case DOWN:
+ case DOWN: {
// printf("BC_TextBox::keypress_event %d %p %p\n",
// __LINE__,
// suggestions,
// suggestions_popup);
- if(suggestions && suggestions_popup)
- {
+ if(suggestions && suggestions_popup) {
// Pass to suggestions popup
suggestions_popup->activate(1);
suggestions_popup->keypress_event();
ibeam_y + text_y + text_height);
//printf("BC_TextBox::keypress_event 10 %d\n", new_letter);
- if(top_level->shift_down())
- {
+ if(top_level->shift_down()) {
// Initialize highlighting
- if(highlight_letter1 == highlight_letter2)
- {
+ if(highlight_letter1 == highlight_letter2) {
highlight_letter1 = new_letter;
highlight_letter2 = ibeam_letter;
}
- else
+ else if(highlight_letter1 == ibeam_letter) {
// Shrink left highlight
- if(highlight_letter1 == ibeam_letter)
- {
highlight_letter1 = new_letter;
}
- else
+ else if(highlight_letter2 == ibeam_letter) {
// Expand right highlight
- if(highlight_letter2 == ibeam_letter)
- {
highlight_letter2 = new_letter;
}
}
else
highlight_letter1 = highlight_letter2 = new_letter;
- if(highlight_letter1 > highlight_letter2)
- {
+ if(highlight_letter1 > highlight_letter2) {
int temp = highlight_letter1;
highlight_letter1 = highlight_letter2;
highlight_letter2 = temp;
//printf("BC_TextBox::keypress_event 20 %d\n", ibeam_letter);
}
result = 1;
- break;
+ break; }
- case PGDN:
- {
+ case PGDN: {
// Extend selection
- int new_letter = get_cursor_letter2(ibeam_x + text_x,
- ibeam_y + text_y + get_h());
+ int new_letter = get_cursor_letter2(ibeam_x + text_x,
+ ibeam_y + text_y + get_h());
//printf("BC_TextBox::keypress_event 10 %d\n", new_letter);
- if(top_level->shift_down())
- {
+ if(top_level->shift_down()) {
// Initialize highlighting
- if(highlight_letter1 == highlight_letter2)
- {
- highlight_letter1 = new_letter;
- highlight_letter2 = ibeam_letter;
- }
- else
+ if(highlight_letter1 == highlight_letter2) {
+ highlight_letter1 = new_letter;
+ highlight_letter2 = ibeam_letter;
+ }
+ else if(highlight_letter1 == ibeam_letter) {
// Shrink left highlight
- if(highlight_letter1 == ibeam_letter)
- {
- highlight_letter1 = new_letter;
- }
- else
+ highlight_letter1 = new_letter;
+ }
+ else if(highlight_letter2 == ibeam_letter) {
// Expand right highlight
- if(highlight_letter2 == ibeam_letter)
- {
- highlight_letter2 = new_letter;
- }
+ highlight_letter2 = new_letter;
}
- else
- highlight_letter1 = highlight_letter2 = new_letter;
+ }
+ else
+ highlight_letter1 = highlight_letter2 = new_letter;
- if(highlight_letter1 > highlight_letter2)
- {
- int temp = highlight_letter1;
- highlight_letter1 = highlight_letter2;
- highlight_letter2 = temp;
- }
- ibeam_letter = new_letter;
+ if(highlight_letter1 > highlight_letter2) {
+ int temp = highlight_letter1;
+ highlight_letter1 = highlight_letter2;
+ highlight_letter2 = temp;
+ }
+ ibeam_letter = new_letter;
- find_ibeam(1);
- if(keypress_draw) draw(1);
+ find_ibeam(1);
+ if(keypress_draw) draw(1);
//printf("BC_TextBox::keypress_event 20 %d\n", ibeam_letter);
- }
result = 1;
- break;
+ break; }
- case END:
- {
+ case END: {
delete suggestions_popup;
suggestions_popup = 0;
while(ibeam_letter < wtext_len && wtext[ibeam_letter] != '\n')
ibeam_letter++;
- if(top_level->shift_down())
- {
+ if(top_level->shift_down()) {
// Begin selection
- if(highlight_letter1 == highlight_letter2)
- {
+ if(highlight_letter1 == highlight_letter2) {
highlight_letter2 = ibeam_letter;
highlight_letter1 = old_ibeam_letter;
}
- else
+ else if(highlight_letter1 == old_ibeam_letter) {
// Shrink selection
- if(highlight_letter1 == old_ibeam_letter)
- {
highlight_letter1 = highlight_letter2;
highlight_letter2 = ibeam_letter;
}
- else
+ else if(highlight_letter2 == old_ibeam_letter) {
// Extend selection
- if(highlight_letter2 == old_ibeam_letter)
- {
highlight_letter2 = ibeam_letter;
}
}
find_ibeam(1);
if(keypress_draw) draw(1);
result = 1;
- break;
- }
+ break; }
- case HOME:
- {
+ case HOME: {
delete suggestions_popup;
suggestions_popup = 0;
find_ibeam(1);
if(keypress_draw) draw(1);
result = 1;
- break;
- }
+ break; }
- case BACKSPACE:
- if(suggestions_popup)
- {
+ case BACKSPACE: {
+ if(suggestions_popup) {
delete suggestions_popup;
suggestions_popup = 0;
}
- if(highlight_letter1 == highlight_letter2)
- {
- if(ibeam_letter > 0)
- {
+ if(highlight_letter1 == highlight_letter2) {
+ if(ibeam_letter > 0) {
delete_selection(ibeam_letter - 1, ibeam_letter, wtext_len);
ibeam_letter--;
}
}
- else
- {
+ else {
delete_selection(highlight_letter1, highlight_letter2, wtext_len);
highlight_letter2 = ibeam_letter = highlight_letter1;
}
if(keypress_draw) draw(1);
dispatch_event = 1;
result = 1;
- break;
+ break; }
- case DELETE:
+ case DELETE: {
//printf("BC_TextBox::keypress_event %d\n", __LINE__);
- if(highlight_letter1 == highlight_letter2)
- {
- if(ibeam_letter < wtext_len)
- {
+ if(highlight_letter1 == highlight_letter2) {
+ if(ibeam_letter < wtext_len) {
delete_selection(ibeam_letter, ibeam_letter + 1, wtext_len);
}
}
- else
- {
+ else {
delete_selection(highlight_letter1, highlight_letter2, wtext_len);
highlight_letter2 = ibeam_letter = highlight_letter1;
}
if(keypress_draw) draw(1);
dispatch_event = 1;
result = 1;
- break;
-
+ break; }
-
- default:
- if(ctrl_down())
- {
- if(get_keypress() == 'c' || get_keypress() == 'C')
- {
- if(highlight_letter1 != highlight_letter2)
- {
+ default: {
+ if( ctrl_down() ) {
+ switch( get_keypress() ) {
+ case 'c': case 'C': {
+ if(highlight_letter1 != highlight_letter2) {
copy_selection(SECONDARY_SELECTION);
result = 1;
}
- }
- else
- if(get_keypress() == 'v' || get_keypress() == 'V')
- {
+ break; }
+ case 'v': case 'V': {
paste_selection(SECONDARY_SELECTION);
find_ibeam(1);
if(keypress_draw) draw(1);
dispatch_event = 1;
result = 1;
- }
- else
- if(get_keypress() == 'x' || get_keypress() == 'X')
- {
- if(highlight_letter1 != highlight_letter2)
- {
+ break; }
+ case 'x': case 'X': {
+ if(highlight_letter1 != highlight_letter2) {
copy_selection(SECONDARY_SELECTION);
delete_selection(highlight_letter1, highlight_letter2, wtext_len);
highlight_letter2 = ibeam_letter = highlight_letter1;
if(keypress_draw) draw(1);
dispatch_event = 1;
result = 1;
+ break; }
+ case 'u': case 'U': {
+ if( shift_down() ) {
+ unicode_active = ibeam_letter;
+ wchar_t wkey = 'U';
+ insert_text(&wkey, 1);
+ find_ibeam(1);
+ highlight_letter1 = unicode_active;
+ highlight_letter2 = ibeam_letter;
+ draw(1);
+ result = 1;
+ }
+ break; }
}
-
break;
}
default_keypress(dispatch_event, result);
- break;
+ break; }
+ }
}
if(result) skip_cursor->update();
if(dispatch_event && handle_event())
result = 1;
+
return result;
}
-
int BC_TextBox::uses_text()
{
return 1;
{
if( len < 0 ) len = wcslen(wcp);
int wtext_len = wtext_update();
- if(highlight_letter1 < highlight_letter2)
- {
+ if( unicode_active < 0 && highlight_letter1 < highlight_letter2 ) {
delete_selection(highlight_letter1, highlight_letter2, wtext_len);
highlight_letter2 = ibeam_letter = highlight_letter1;
wtext_len = wtext_update();
}
-
int i, j;
for(i=wtext_len-1, j=wtext_len+len-1; i>=ibeam_letter; i--, j--) {
if( j >= wsize ) continue;
first_visible_row = 1;
got_visible_row = 1;
}
-
- if( (k+text_height >= get_h() - bottom_margin ||
- (row_end >= wtext_len && k < get_h() - bottom_margin &&
+
+ if( (k+text_height >= get_h() - bottom_margin ||
+ (row_end >= wtext_len && k < get_h() - bottom_margin &&
k + text_height > 0)) )
last_visible_row = 1;
// Cursor is inside vertical range of row
- if((cursor_y >= top_margin &&
- cursor_y < get_h() - bottom_margin &&
+ if((cursor_y >= top_margin &&
+ cursor_y < get_h() - bottom_margin &&
cursor_y >= k && cursor_y < k + text_height) ||
// Cursor is above 1st row
(cursor_y < k + text_height && first_visible_row) ||
if((column2 + column1) / 2 >= cursor_x) {
result = j - 1;
done = 1;
-// printf("BC_TextBox::get_cursor_letter %d %d %d %d\n",
+// printf("BC_TextBox::get_cursor_letter %d %d %d %d\n",
// __LINE__, result, first_visible_row, last_visible_row);
}
column1 = column2;
}
-// printf("BC_TextBox::get_cursor_letter %d cursor_y=%d k=%d h=%d %d %d\n",
+// printf("BC_TextBox::get_cursor_letter %d cursor_y=%d k=%d h=%d %d %d\n",
// __LINE__, cursor_y, k, get_h(), first_visible_row, last_visible_row);
if(result < 0) result = 0;
if(result > wtext_len) {
}
}
if(wtext[i] == '\n') i++;
-
+
if(i >= wtext_len && !done) {
result = wtext_len;
}
if( letter1 > wtext_len ) letter1 = wtext_len;
if( letter2 > wtext_len ) letter2 = wtext_len;
if( !wtext_len ) return;
-
- while( letter1 > 0 && iswalnum(wtext[letter1]) ) --letter1;
- if( letter1 < wtext_len && iswspace(wtext[letter1]) ) ++letter1;
-
- while( letter2 < wtext_len && iswalnum(wtext[letter2]) ) ++letter2;
+ for( int i=letter1; i>=0 && iswalnum(wtext[i]); --i ) letter1 = i;
+ for( int i=letter2; i<wtext_len && iswalnum(wtext[i]); ) letter2 = ++i;
if( letter2 < wtext_len && wtext[letter2] == ' ' ) ++letter2;
}
void BC_TextBox::select_line(int &letter1, int &letter2, int ibeam_letter)
{
int wtext_len = wtext_update();
- if(!wtext_len) return;
-
letter1 = letter2 = ibeam_letter;
-
-// Rewind to previous linefeed
- do {
- if( wtext[letter1] != '\n' ) letter1--;
- } while( letter1 > 0 && wtext[letter1] != '\n' );
- if( wtext[letter1] == '\n' ) letter1++;
-
-// Advance to next linefeed
- do {
- if( wtext[letter2] != '\n' ) letter2++;
- } while( letter2 < wtext_len && wtext[letter2] != '\n' );
- if( letter2 < wtext_len && wtext[letter2] == '\n') letter2++;
-
- if(letter1 < 0) letter1 = 0;
- if(letter2 < 0) letter2 = 0;
- if(letter1 > wtext_len) letter1 = wtext_len;
- if(letter2 > wtext_len) letter2 = wtext_len;
+ if( letter1 < 0 ) letter1 = 0;
+ if( letter2 < 0 ) letter2 = 0;
+ if( letter1 > wtext_len ) letter1 = wtext_len;
+ if( letter2 > wtext_len ) letter2 = wtext_len;
+ if( !wtext_len ) return;
+ for( int i=letter1; i>=0 && wtext[i]!='\n'; --i ) letter1 = i;
+ for( int i=letter2; i<wtext_len && wtext[i]!='\n'; ) letter2 = ++i;
}
void BC_TextBox::copy_selection(int clipboard_num)
//printf("BC_TextBoxSuggestions::handle_event %d\n", __LINE__);
- text_box->highlight_letter1 =
- text_box->highlight_letter2 =
+ text_box->highlight_letter1 =
+ text_box->highlight_letter2 =
text_box->ibeam_letter = text_box->tstrlen();
text_box->wtext_update();
text_box->draw(1);
this->text->wset_selection(char1, char2, ibeam);
}
+int BC_ScrollTextBox::get_ibeam_letter()
+{
+ return this->text->get_ibeam_letter();
+}
+