X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fguicast%2Fbctextbox.C;h=5c79fdc665ed889d6a2989cf206d19aac39bb033;hb=79ab99f7d6cc503f9d8a9a9618129c9e4d3842c1;hp=7a06046cff6c634ee988908d87ac032e8e5736f3;hpb=30bdb85eb33a8ee7ba675038a86c6be59c43d7bd;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/guicast/bctextbox.C b/cinelerra-5.1/guicast/bctextbox.C index 7a06046c..5c79fdc6 100644 --- a/cinelerra-5.1/guicast/bctextbox.C +++ b/cinelerra-5.1/guicast/bctextbox.C @@ -475,7 +475,7 @@ void BC_TextBox::set_suggestions(ArrayList *suggestions, int column) } } -void BC_TextBox::set_selection(int char1, int char2, int ibeam) +void BC_TextBox::wset_selection(int char1, int char2, int ibeam) { highlight_letter1 = char1; highlight_letter2 = char2; @@ -483,6 +483,29 @@ void BC_TextBox::set_selection(int char1, int char2, int ibeam) draw(1); } +// count utf8 chars in text which occur before cp +int BC_TextBox::wcpos(const char *text, const char *cp) +{ + int len = 0; + const unsigned char *bp = (const unsigned char *)text; + const unsigned char *ep = (const unsigned char *)cp; + while( bp < ep && *bp != 0 ) { + ++len; + int ch = *bp++; + if( ch < 0x80 ) continue; + int i = ch - 0x0c0; + int n = i<0? 0 : i<32? 1 : i<48? 2 : i<56? 3 : i<60? 4 : 5; + for( i=n; bp < ep && --i>=0 && (*bp&0xc0) == 0x80; ++bp ); + } + return len; +} + +void BC_TextBox::set_selection(int char1, int char2, int ibeam) +{ + const char *cp = get_text(); + wset_selection(wcpos(cp, cp+char1), wcpos(cp, cp+char2), wcpos(cp, cp+ibeam)); +} + int BC_TextBox::update(const char *text) { //printf("BC_TextBox::update 1 %d %s %s\n", tstrcmp(text), text, this->text); @@ -1952,15 +1975,15 @@ int BC_TextBox::get_cursor_letter(int cursor_x, int cursor_y) 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) || @@ -1973,7 +1996,7 @@ int BC_TextBox::get_cursor_letter(int cursor_x, int cursor_y) 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; @@ -1997,7 +2020,7 @@ int BC_TextBox::get_cursor_letter(int cursor_x, int cursor_y) } -// 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) { @@ -2042,7 +2065,7 @@ int BC_TextBox::get_cursor_letter2(int cursor_x, int cursor_y) } } if(wtext[i] == '\n') i++; - + if(i >= wtext_len && !done) { result = wtext_len; } @@ -2056,50 +2079,29 @@ int BC_TextBox::get_cursor_letter2(int cursor_x, int cursor_y) void BC_TextBox::select_word(int &letter1, int &letter2, int ibeam_letter) { int wtext_len = wtext_update(); - if(!wtext_len) return; - letter1 = letter2 = ibeam_letter; - do { - if(iswalnum(wtext[letter1])) letter1--; - } while(letter1 > 0 && iswalnum(wtext[letter1])); - - if( !iswalnum(wtext[letter1]) ) letter1++; - - do { - if( iswalnum(wtext[letter2]) ) letter2++; - } while( letter2 < wtext_len && isalnum(wtext[letter2]) ); - - if( letter2 < wtext_len && wtext[letter2] == ' ') 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 && iswalnum(wtext[i]); --i ) letter1 = i; + for( int i=letter2; i 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; ito_clipboard(ctext, clip_len, clipboard_num); } @@ -2123,11 +2125,11 @@ void BC_TextBox::paste_selection(int clipboard_num) int len = get_clipboard()->clipboard_len(clipboard_num); if( len > 0 ) { - char cstring[len]; wchar_t wstring[len]; --len; - get_clipboard()->from_clipboard(cstring, len, clipboard_num); + char cstring[len]; wchar_t wstring[len]; + get_clipboard()->from_clipboard(cstring, len, clipboard_num); --len; //printf("BC_TextBox::paste_selection %d '%*.*s'\n",len,len,len,cstring); - BC_Resources::encode(BC_Resources::encoding, BC_Resources::wide_encoding, - cstring,(len+1), (char *)wstring,(len+1)*sizeof(wchar_t)); + len = BC_Resources::encode(BC_Resources::encoding, BC_Resources::wide_encoding, + cstring,len, (char *)wstring,(len+1)*sizeof(wchar_t)) / sizeof(wchar_t); insert_text(wstring, len); } } @@ -2245,8 +2247,8 @@ int BC_TextBoxSuggestions::handle_event() //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); @@ -2256,12 +2258,6 @@ int BC_TextBoxSuggestions::handle_event() } - - - - - - BC_ScrollTextBox::BC_ScrollTextBox(BC_WindowBase *parent_window, int x, int y, int w, int rows, const char *default_text, int default_size) @@ -2412,6 +2408,16 @@ void BC_ScrollTextBox::set_selection(int char1, int char2, int ibeam) this->text->set_selection(char1, char2, ibeam); } +void BC_ScrollTextBox::wset_selection(int char1, int char2, int ibeam) +{ + this->text->wset_selection(char1, char2, ibeam); +} + +int BC_ScrollTextBox::get_ibeam_letter() +{ + return this->text->get_ibeam_letter(); +} +