remove whitespace at eol
[goodguy/history.git] / cinelerra-5.1 / guicast / bctextbox.C
index 7a06046cff6c634ee988908d87ac032e8e5736f3..5c79fdc665ed889d6a2989cf206d19aac39bb033 100644 (file)
@@ -475,7 +475,7 @@ void BC_TextBox::set_suggestions(ArrayList<char*> *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<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)
@@ -2111,9 +2113,9 @@ void BC_TextBox::copy_selection(int clipboard_num)
                highlight_letter1 < 0 || highlight_letter2 < 0 ||
                highlight_letter2 - highlight_letter1 <= 0) return;
        int clip_len = highlight_letter2 - highlight_letter1;
-       char ctext[clip_len+1];
 //printf(" BC_TextBox::copy_selection %d %d %d\n",highlight_letter1, highlight_letter2, clip_len);
-       text_update(&wtext[highlight_letter1],clip_len, ctext,clip_len+1);
+       char ctext[4*clip_len+4];
+       clip_len = text_update(&wtext[highlight_letter1],clip_len, ctext,4*clip_len+4);
        get_clipboard()->to_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();
+}
+