X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b581c7e649a5366ee1953efe82c7d8c7f14637b4..d06800f14a0fdf7814403b3a5295189511274d67:/samples/richedit/wxlwindow.cpp diff --git a/samples/richedit/wxlwindow.cpp b/samples/richedit/wxlwindow.cpp index cc968b10d1..0993e2ca99 100644 --- a/samples/richedit/wxlwindow.cpp +++ b/samples/richedit/wxlwindow.cpp @@ -88,8 +88,6 @@ static const int Y_SCROLL_PAGE = 20; -#define wxUSE_PRIVATE_CLIPBOARD_FORMAT 0 - // ---------------------------------------------------------------------------- // event tables // ---------------------------------------------------------------------------- @@ -496,21 +494,18 @@ wxLayoutWindow::OnChar(wxKeyEvent& event) if ( IsDirectionKey(keyCode) ) { // just continue the old selection - if ( m_Selecting ) + if ( m_Selecting && event.ShiftDown() ) + m_llist->ContinueSelection(); + else { + m_llist->DiscardSelection(); + m_Selecting = false; if( event.ShiftDown() ) - m_llist->ContinueSelection(); - else { - m_llist->DiscardSelection(); - m_Selecting = false; + m_Selecting = true; + m_llist->StartSelection(); } } - else if( event.ShiftDown() ) - { - m_Selecting = true; - m_llist->StartSelection(); - } } // If needed, make cursor visible: @@ -567,7 +562,7 @@ wxLayoutWindow::OnChar(wxKeyEvent& event) { case 'c': // this should work even in read-only mode - Copy(); + Copy(TRUE, TRUE); break; case 's': // search Find(""); @@ -631,8 +626,11 @@ wxLayoutWindow::OnChar(wxKeyEvent& event) m_llist->DeleteToEndOfLine(); SetDirty(); break; + case 'c': + Copy(TRUE, TRUE); + break; case 'v': - Paste(); + Paste( TRUE ); break; case 'x': Cut(); @@ -711,17 +709,20 @@ wxLayoutWindow::OnChar(wxKeyEvent& event) default: if((!(event.ControlDown() || event.AltDown() -//#if 0 - ///FIXME: wxGTK reports MetaDown always - || event.MetaDown() -//#endif )) && (keyCode < 256 && keyCode >= 32) ) { if(m_WrapMargin > 0 && isspace(keyCode)) - m_llist->WrapLine(m_WrapMargin); - m_llist->Insert((char)keyCode); + { + bool wrapped = m_llist->WrapLine(m_WrapMargin); + // donĀ“t insert space as first thing in line + // after wrapping: + if(! wrapped || m_llist->GetCursorPos().x != 0) + m_llist->Insert((char)keyCode); + } + else + m_llist->Insert((char)keyCode); SetDirty(); } else @@ -862,19 +863,9 @@ wxLayoutWindow::InternalPaint(const wxRect *updateRect) updateRect->x+updateRect->width, updateRect->y+updateRect->height)); } - if(IsDirty()) - { - WXLO_DEBUG(("InternalPaint, isdirty, list size: %ld,%ld", - (unsigned long) m_llist->GetSize().x, - (unsigned long) m_llist->GetSize().y)); -// m_llist->ForceTotalLayout(); - m_llist->Layout(dc); - WXLO_DEBUG(("InternalPaint, isdirty, list size after layout: %ld,%ld", - (unsigned long) m_llist->GetSize().x, - (unsigned long) m_llist->GetSize().y)); - ResizeScrollbars(); - ResetDirty(); - } + + ResizeScrollbars(); + /* Check whether the window has grown, if so, we need to reallocate the bitmap to be larger. */ @@ -999,20 +990,24 @@ wxLayoutWindow::OnSize(wxSizeEvent &event) event.Skip(); } -// change the range and position of scrollbars +/* +Change the range and position of scrollbars. Has evolved into a +generic Update function which will at some time later cause a repaint +as needed. +*/ + void wxLayoutWindow::ResizeScrollbars(bool exact) { - if(IsDirty()) - { - wxClientDC dc( this ); - PrepareDC( dc ); + if(! IsDirty()) + return; + + wxClientDC dc( this ); + PrepareDC( dc ); // m_llist->ForceTotalLayout(); - m_llist->Layout(dc); - ResetDirty(); - RequestUpdate(); - } + m_llist->Layout(dc); + ResetDirty(); wxPoint max = m_llist->GetSize(); wxSize size = GetClientSize(); @@ -1028,7 +1023,11 @@ wxLayoutWindow::ResizeScrollbars(bool exact) // check if the text hasn't become too big // TODO why do we set both at once? they're independent... - if( max.x > m_maxx - WXLO_ROFFSET || max.y > m_maxy - WXLO_BOFFSET || exact ) + if( max.x > m_maxx - WXLO_ROFFSET + || max.y > m_maxy - WXLO_BOFFSET + || max.x < m_maxx - X_SCROLL_PAGE + || max.y < m_maxy - Y_SCROLL_PAGE + || exact ) { // text became too large if ( !exact ) @@ -1038,47 +1037,35 @@ wxLayoutWindow::ResizeScrollbars(bool exact) max.y += WXLO_BOFFSET; } - ViewStart(&m_ViewStartX, &m_ViewStartY); - SetScrollbars(X_SCROLL_PAGE, Y_SCROLL_PAGE, - max.x / X_SCROLL_PAGE + 1, max.y / Y_SCROLL_PAGE + 1, - m_ViewStartX, m_ViewStartY, - true); - - m_hasHScrollbar = - m_hasVScrollbar = true; - - m_maxx = max.x + X_SCROLL_PAGE; - m_maxy = max.y + Y_SCROLL_PAGE; - } -#if 0 - //FIXME: this code is pretty broken, producing "arithmetic - //exception" crashes (div by 0??) - else - { - // check if the window hasn't become too big, thus making the scrollbars - // unnecessary - if ( !exact ) + bool done = FALSE; + if(max.x < X_SCROLL_PAGE) { - // add an extra bit to the sizes to avoid future updates - max.x -= WXLO_ROFFSET; - max.y -= WXLO_BOFFSET; + SetScrollbars(0,-1,0,-1,0,-1,true); + m_hasHScrollbar = FALSE; + done = TRUE; } - - if ( m_hasHScrollbar && (max.x < m_maxx) ) + if(max.y < Y_SCROLL_PAGE) { - // remove the horizontal scrollbar - SetScrollbars(0, -1, 0, -1, 0, -1, true); - m_hasHScrollbar = false; + SetScrollbars(-1,0,-1,0,-1,0,true); + m_hasVScrollbar = FALSE; + done = TRUE; } - - if ( m_hasVScrollbar && (max.y < m_maxy) ) + if(! done) { - // remove the vertical scrollbar - SetScrollbars(-1, 0, -1, 0, -1, 0, true); - m_hasVScrollbar = false; + ViewStart(&m_ViewStartX, &m_ViewStartY); + SetScrollbars(X_SCROLL_PAGE, + Y_SCROLL_PAGE, + max.x / X_SCROLL_PAGE + 1, + max.y / Y_SCROLL_PAGE + 1, + m_ViewStartX, m_ViewStartY, + true); + m_hasHScrollbar = + m_hasVScrollbar = true; } + + m_maxx = max.x + X_SCROLL_PAGE; + m_maxy = max.y + Y_SCROLL_PAGE; } -#endif } // ---------------------------------------------------------------------------- @@ -1088,26 +1075,47 @@ wxLayoutWindow::ResizeScrollbars(bool exact) // ---------------------------------------------------------------------------- void -wxLayoutWindow::Paste(bool primary) +wxLayoutWindow::Paste(bool usePrivate, bool primary) { + // this only has an effect under X11: + wxTheClipboard->UsePrimarySelection(primary); // Read some text if (wxTheClipboard->Open()) { -#if __WXGTK__ - if(primary) - wxTheClipboard->UsePrimarySelection(); -#endif -#if wxUSE_PRIVATE_CLIPBOARD_FORMAT - wxLayoutDataObject wxldo; - if (wxTheClipboard->IsSupported( wxldo.GetFormat() )) + if(usePrivate) { - wxTheClipboard->GetData(wxldo); + wxLayoutDataObject wxldo; + if (wxTheClipboard->IsSupported( wxldo.GetFormat() )) { + if(wxTheClipboard->GetData(wxldo)) + { + wxTheClipboard->Close(); + wxString str = wxldo.GetLayoutData(); + m_llist->Read(str); + SetDirty(); + RequestUpdate(); + return; + } } - //FIXME: missing functionality m_llist->Insert(wxldo.GetList()); } - else -#endif + wxTextDataObject data; + if (wxTheClipboard->IsSupported( data.GetFormat() ) + && wxTheClipboard->GetData(data) ) + { + wxTheClipboard->Close(); + wxString text = data.GetText(); + wxLayoutImportText( m_llist, text); + SetDirty(); + RequestUpdate(); + return; + } + } + // if everything failed we can still try the primary: + wxTheClipboard->Close(); + if(! primary) // not tried before + { + wxTheClipboard->UsePrimarySelection(); + if (wxTheClipboard->Open()) { wxTextDataObject data; if (wxTheClipboard->IsSupported( data.GetFormat() ) @@ -1116,14 +1124,15 @@ wxLayoutWindow::Paste(bool primary) wxString text = data.GetText(); wxLayoutImportText( m_llist, text); SetDirty(); + RequestUpdate(); } + wxTheClipboard->Close(); } - wxTheClipboard->Close(); } } bool -wxLayoutWindow::Copy(bool invalidate) +wxLayoutWindow::Copy(bool invalidate, bool privateFormat, bool primary) { // Calling GetSelection() will automatically do an EndSelection() // on the list, but we need to take a note of it, too: @@ -1133,8 +1142,8 @@ wxLayoutWindow::Copy(bool invalidate) m_llist->EndSelection(); } - wxLayoutDataObject wldo; - wxLayoutList *llist = m_llist->GetSelection(&wldo, invalidate); + wxLayoutDataObject *wldo = new wxLayoutDataObject; + wxLayoutList *llist = m_llist->GetSelection(wldo, invalidate); if(! llist) return FALSE; // Export selection as text: @@ -1159,24 +1168,41 @@ wxLayoutWindow::Copy(bool invalidate) text = text.Mid(0,len-1); } +#if 0 +if(! primary) // always copy as text-only to primary selection + { + wxTheClipboard->UsePrimarySelection(); + if (wxTheClipboard->Open()) + { + wxTextDataObject *data = new wxTextDataObject( text ); + wxTheClipboard->SetData( data ); + wxTheClipboard->Close(); + } + } +#endif + + wxTheClipboard->UsePrimarySelection(primary); if (wxTheClipboard->Open()) { wxTextDataObject *data = new wxTextDataObject( text ); - bool rc = wxTheClipboard->SetData( data ); -#if wxUSE_PRIVATE_CLIPBOARD_FORMAT - rc |= wxTheClipboard->AddData( &wldo ); -#endif + bool rc; + + rc = wxTheClipboard->SetData( data ); + if(privateFormat) + rc |= wxTheClipboard->SetData( wldo ); wxTheClipboard->Close(); return rc; } + else + delete wldo; return FALSE; } bool -wxLayoutWindow::Cut(void) +wxLayoutWindow::Cut(bool privateFormat, bool usePrimary) { - if(Copy(false)) // do not invalidate selection after copy + if(Copy(false, privateFormat, usePrimary)) // do not invalidate selection after copy { m_llist->DeleteSelection(); SetDirty();