X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/96eb3b1a82b0b80b285e3fd19cb161c31a6b1d3f..8dbf458911c24bae120bed07d5627a65f362b8d1:/samples/richedit/wxlwindow.cpp?ds=sidebyside diff --git a/samples/richedit/wxlwindow.cpp b/samples/richedit/wxlwindow.cpp index e893d1adac..63ce2369cf 100644 --- a/samples/richedit/wxlwindow.cpp +++ b/samples/richedit/wxlwindow.cpp @@ -6,9 +6,9 @@ * $Id$ *******************************************************************/ -// =========================================================================== +// ============================================================================ // declarations -// =========================================================================== +// ============================================================================ // ---------------------------------------------------------------------------- // headers @@ -18,7 +18,7 @@ # pragma implementation "wxlwindow.h" #endif -#include "wx/wxprec.h" +#include #ifdef __BORLANDC__ # pragma hdrstop @@ -84,30 +84,39 @@ static const int Y_SCROLL_PAGE = 20; // ---------------------------------------------------------------------------- BEGIN_EVENT_TABLE(wxLayoutWindow,wxScrolledWindow) + EVT_SIZE (wxLayoutWindow::OnSize) + EVT_PAINT (wxLayoutWindow::OnPaint) + EVT_CHAR (wxLayoutWindow::OnChar) EVT_KEY_UP (wxLayoutWindow::OnKeyUp) - EVT_LEFT_DOWN(wxLayoutWindow::OnLeftMouseClick) + + EVT_LEFT_DOWN(wxLayoutWindow::OnLeftMouseDown) + EVT_LEFT_UP(wxLayoutWindow::OnLeftMouseUp) EVT_RIGHT_DOWN(wxLayoutWindow::OnRightMouseClick) EVT_LEFT_DCLICK(wxLayoutWindow::OnMouseDblClick) + EVT_MIDDLE_DOWN(wxLayoutWindow::OnMiddleMouseDown) EVT_MOTION (wxLayoutWindow::OnMouseMove) + + EVT_UPDATE_UI(WXLOWIN_MENU_UNDERLINE, wxLayoutWindow::OnUpdateMenuUnderline) + EVT_UPDATE_UI(WXLOWIN_MENU_BOLD, wxLayoutWindow::OnUpdateMenuBold) + EVT_UPDATE_UI(WXLOWIN_MENU_ITALICS, wxLayoutWindow::OnUpdateMenuItalic) EVT_MENU_RANGE(WXLOWIN_MENU_FIRST, WXLOWIN_MENU_LAST, wxLayoutWindow::OnMenu) + EVT_SET_FOCUS(wxLayoutWindow::OnSetFocus) EVT_KILL_FOCUS(wxLayoutWindow::OnKillFocus) END_EVENT_TABLE() -// =========================================================================== -// implementation -// =========================================================================== +// ---------------------------------------------------------------------------- +// function prototypes +// ---------------------------------------------------------------------------- -/* LEAVE IT HERE UNTIL WXGTK WORKS AGAIN!!! */ -#ifdef __WXGTK__ -/// allows me to compare to wxPoints -static bool operator != (wxPoint const &p1, wxPoint const &p2) -{ - return p1.x != p2.x || p1.y != p2.y; -} -#endif // __WXGTK__ +/// returns TRUE if keyCode is one of arrows/home/end/page{up|down} keys +static bool IsDirectionKey(long keyCode); + +// ============================================================================ +// implementation +// ============================================================================ #ifndef wxWANTS_CHARS #define wxWANTS_CHARS 0 @@ -122,7 +131,8 @@ wxLayoutWindow::wxLayoutWindow(wxWindow *parent) wxDefaultPosition, wxDefaultSize, wxHSCROLL | wxVSCROLL | wxBORDER | - wxWANTS_CHARS) + wxWANTS_CHARS), + m_llist(NULL) { SetStatusBar(NULL); // don't use statusbar m_Editable = false; @@ -134,16 +144,14 @@ wxLayoutWindow::wxLayoutWindow(wxWindow *parent) m_bitmap = new wxBitmap(4,4); m_bitmapSize = wxPoint(4,4); m_llist = new wxLayoutList(); - m_BGbitmap = NULL; m_ScrollToCursor = false; SetWrapMargin(0); - wxPoint max = m_llist->GetSize(); - SetScrollbars(X_SCROLL_PAGE, Y_SCROLL_PAGE, - max.x / X_SCROLL_PAGE + 1, max.y / Y_SCROLL_PAGE + 1); - EnableScrolling(true, true); - m_maxx = max.x + X_SCROLL_PAGE; - m_maxy = max.y + Y_SCROLL_PAGE; + + // no scrollbars initially + m_hasHScrollbar = + m_hasVScrollbar = false; + m_Selecting = false; #ifdef WXLAYOUT_USE_CARET @@ -151,12 +159,16 @@ wxLayoutWindow::wxLayoutWindow(wxWindow *parent) wxCaret *caret = new wxCaret(this, 2, 20); SetCaret(caret); m_llist->SetCaret(caret); - caret->Show(); #endif // WXLAYOUT_USE_CARET - SetCursorVisibility(-1); + m_HaveFocus = FALSE; + m_HandCursor = FALSE; + m_CursorVisibility = -1; SetCursor(wxCURSOR_IBEAM); SetDirty(); + + // at least under Windows, this should be the default behaviour + m_AutoDeleteSelection = TRUE; } wxLayoutWindow::~wxLayoutWindow() @@ -179,21 +191,42 @@ wxLayoutWindow::Clear(int family, { GetLayoutList()->Clear(family,size,style,weight,underline,fg,bg); SetBackgroundColour(GetLayoutList()->GetDefaultStyleInfo().GetBGColour()); + wxScrolledWindow::Clear(); ResizeScrollbars(true); SetDirty(); SetModified(false); - wxScrolledWindow::Clear(); + + if ( m_Editable ) + m_CursorVisibility = 1; + +#ifdef WXLAYOUT_USE_CARET + if ( m_CursorVisibility == 1 ) + GetCaret()->Show(); +#endif // WXLAYOUT_USE_CARET + DoPaint((wxRect *)NULL); } +void wxLayoutWindow::Refresh(bool eraseBackground, const wxRect *rect) +{ + wxScrolledWindow::Refresh(eraseBackground, rect); + + ResizeScrollbars(); +//FIXME is this needed? It causes problems... ScrollToCursor(); +} + void wxLayoutWindow::OnMouse(int eventId, wxMouseEvent& event) { wxClientDC dc( this ); PrepareDC( dc ); +#ifdef __WXMSW__ if ( eventId != WXLOWIN_MENU_MOUSEMOVE ) +#endif { - // moving the mouse in a window shouldn't give it the focus! + // moving the mouse in a window shouldn't give it the focus! + // Oh yes! wxGTK's focus handling is so broken, that this is the + // only sensible way to go. SetFocus(); } @@ -204,8 +237,10 @@ wxLayoutWindow::OnMouse(int eventId, wxMouseEvent& event) findPos.x -= WXLO_XOFFSET; findPos.y -= WXLO_YOFFSET; - if(findPos.x < 0) findPos.x = 0; - if(findPos.y < 0) findPos.y = 0; + if(findPos.x < 0) + findPos.x = 0; + if(findPos.y < 0) + findPos.y = 0; m_ClickPosition = wxPoint(event.GetX(), event.GetY()); @@ -215,98 +250,144 @@ wxLayoutWindow::OnMouse(int eventId, wxMouseEvent& event) &cursorPos, &found); wxLayoutObject::UserData *u = obj ? obj->GetUserData() : NULL; - //has the mouse only been moved? - if(eventId == WXLOWIN_MENU_MOUSEMOVE) + // has the mouse only been moved? + switch ( eventId ) { - // found is only true if we are really over an object, not just - // behind it - if(found && u && ! m_Selecting) - { - if(!m_HandCursor) - SetCursor(wxCURSOR_HAND); - m_HandCursor = TRUE; - if(m_StatusBar && m_StatusFieldLabel != -1) + case WXLOWIN_MENU_MOUSEMOVE: { - const wxString &label = u->GetLabel(); - if(label.Length()) - m_StatusBar->SetStatusText(label, - m_StatusFieldLabel); + // this variables is used to only erase the message in the status + // bar if we had put it there previously - otherwise empting status + // bar might be undesirable + static bool s_hasPutMessageInStatusBar = false; + + // found is only true if we are really over an object, not just + // behind it + if(found && u && ! m_Selecting) + { + if(!m_HandCursor) + SetCursor(wxCURSOR_HAND); + m_HandCursor = TRUE; + if(m_StatusBar && m_StatusFieldLabel != -1) + { + const wxString &label = u->GetLabel(); + if(label.Length()) + { + m_StatusBar->SetStatusText(label, + m_StatusFieldLabel); + s_hasPutMessageInStatusBar = true; + } + } + } + else + { + if(m_HandCursor) + SetCursor(wxCURSOR_IBEAM); + m_HandCursor = FALSE; + if( m_StatusBar && m_StatusFieldLabel != -1 && + s_hasPutMessageInStatusBar ) + { + m_StatusBar->SetStatusText("", m_StatusFieldLabel); + } + } } - } - else - { - if(m_HandCursor) - SetCursor(wxCURSOR_IBEAM); - m_HandCursor = FALSE; - if(m_StatusBar && m_StatusFieldLabel != -1) - m_StatusBar->SetStatusText("", m_StatusFieldLabel); - } - if(event.LeftIsDown()) - { - if(! m_Selecting) + + // selecting? + if ( event.LeftIsDown() ) { - m_llist->StartSelection(wxPoint(-1, -1), m_ClickPosition); - m_Selecting = true; - DoPaint(); // TODO: we don't have to redraw everything! + // m_Selecting might not be set if the button got pressed + // outside this window, so check for it: + if( m_Selecting ) + { + m_llist->ContinueSelection(cursorPos, m_ClickPosition); + DoPaint(); // TODO: we don't have to redraw everything! + } } - else + + if ( u ) { - m_llist->ContinueSelection(cursorPos, m_ClickPosition); - DoPaint(); // TODO: we don't have to redraw everything! + u->DecRef(); + u = NULL; } - } - if(m_Selecting && ! event.LeftIsDown()) - { - m_llist->EndSelection(cursorPos, m_ClickPosition); - m_Selecting = false; - DoPaint(); // TODO: we don't have to redraw everything! - } + break; - if ( u ) - { - u->DecRef(); - u = NULL; - } - } - else if(eventId == WXLOWIN_MENU_LCLICK) - { - // always move cursor to mouse click: - m_llist->MoveCursorTo(cursorPos); + case WXLOWIN_MENU_LDOWN: + { + // always move cursor to mouse click: +// if ( obj ) + { + // we have found the real position + m_llist->MoveCursorTo(cursorPos); + } +// else +// { +// // click beyond the end of the text +// m_llist->MoveCursorToEnd(); +// } + + // clicking a mouse removes the selection + if ( m_llist->HasSelection() ) + { + m_llist->DiscardSelection(); + m_Selecting = false; + DoPaint(); // TODO: we don't have to redraw everything! + } + + // Calculate where the top of the visible area is: + int x0, y0; + ViewStart(&x0,&y0); + int dx, dy; + GetScrollPixelsPerUnit(&dx, &dy); + x0 *= dx; y0 *= dy; + + wxPoint offset(-x0+WXLO_XOFFSET, -y0+WXLO_YOFFSET); + + if(m_CursorVisibility == -1) + m_CursorVisibility = 1; +#ifdef WXLAYOUT_USE_CARET + if ( m_CursorVisibility == 1 ) + GetCaret()->Show(); +#endif // WXLAYOUT_USE_CARET - // clicking a mouse removes the selection - if ( m_llist->HasSelection() ) - { - m_llist->DiscardSelection(); - DoPaint(); // TODO: we don't have to redraw everything! - } + if(m_CursorVisibility) + { + // draw a thick cursor for editable windows with focus + m_llist->DrawCursor(dc, m_HaveFocus && IsEditable(), offset); + } - // Calculate where the top of the visible area is: - int x0, y0; - ViewStart(&x0,&y0); - int dx, dy; - GetScrollPixelsPerUnit(&dx, &dy); - x0 *= dx; y0 *= dy; +#ifdef __WXGTK__ + DoPaint(); // DoPaint suppresses flicker under GTK +#endif // wxGTK - wxPoint offset(-x0+WXLO_XOFFSET, -y0+WXLO_YOFFSET); + // start selection + m_llist->StartSelection(wxPoint(-1, -1), m_ClickPosition); + m_Selecting = true; + } + break; - if(m_CursorVisibility == -1) - m_CursorVisibility = 1; + case WXLOWIN_MENU_LUP: + if ( m_Selecting ) + { + m_llist->EndSelection(); + m_Selecting = false; - if(m_CursorVisibility != 0) - { - // draw a thick cursor for editable windows with focus - m_llist->DrawCursor(dc, m_HaveFocus && IsEditable(), offset); - } + DoPaint(); // TODO: we don't have to redraw everything! + } + break; - // VZ: this should be unnecessary because mouse can only click on a - // visible part of the canvas -#if 0 - ScrollToCursor(); -#endif // 0 + case WXLOWIN_MENU_MDOWN: + Paste(TRUE); + break; -#ifdef __WXGTK__ - DoPaint(); // DoPaint suppresses flicker under GTK -#endif // wxGTK + case WXLOWIN_MENU_DBLCLICK: + // select a word under cursor + m_llist->MoveCursorTo(cursorPos); + m_llist->MoveCursorWord(-1); + m_llist->StartSelection(); + m_llist->MoveCursorWord(1, false); + m_llist->EndSelection(); + m_Selecting = false; + DoPaint(); // TODO: we don't have to redraw everything! + break; } // notify about mouse events? @@ -332,17 +413,18 @@ wxLayoutWindow::OnMouse(int eventId, wxMouseEvent& event) } } - if( u ) - u->DecRef(); + if( u ) u->DecRef(); } -/* - * Some simple keyboard handling. - */ +// ---------------------------------------------------------------------------- +// keyboard handling. +// ---------------------------------------------------------------------------- + void wxLayoutWindow::OnChar(wxKeyEvent& event) { int keyCode = event.KeyCode(); + bool ctrlDown = event.ControlDown(); #ifdef WXLAYOUT_DEBUG if(keyCode == WXK_F1) @@ -352,26 +434,51 @@ wxLayoutWindow::OnChar(wxKeyEvent& event) } #endif - if(! m_Selecting && event.ShiftDown()) + // Force m_Selecting to be false if shift is no longer + // pressed. OnKeyUp() cannot catch all Shift-Up events. + if(m_Selecting && !event.ShiftDown()) + { + m_Selecting = false; + m_llist->EndSelection(); + } + + // If we deleted the selection here, we must not execute the + // deletion in Delete/Backspace handling. + bool deletedSelection = false; + // pressing any non-arrow key optionally replaces the selection: + if(m_AutoDeleteSelection + && !m_Selecting + && m_llist->HasSelection() + && ! IsDirectionKey(keyCode) + && ! (event.AltDown() || ctrlDown) + ) { - switch(keyCode) + m_llist->DeleteSelection(); + deletedSelection = true; + } + + // + starts selection + if ( IsDirectionKey(keyCode) ) + { + if ( m_Selecting ) + { + // just continue the old selection + if( event.ShiftDown() ) + m_llist->ContinueSelection(); + else + { + m_llist->DiscardSelection(); + m_Selecting = false; + } + } + else if( event.ShiftDown() ) { - case WXK_UP: - case WXK_DOWN: - case WXK_RIGHT: - case WXK_LEFT: - case WXK_PRIOR: - case WXK_NEXT: - case WXK_HOME: - case WXK_END: m_Selecting = true; m_llist->StartSelection(); - break; - default: - ; } + } - + // If needed, make cursor visible: if(m_CursorVisibility == -1) m_CursorVisibility = 1; @@ -381,7 +488,6 @@ wxLayoutWindow::OnChar(wxKeyEvent& event) cursor, etc. It's default will process all keycodes causing modifications to the buffer, but only if editing is allowed. */ - bool ctrlDown = event.ControlDown(); switch(keyCode) { case WXK_RIGHT: @@ -416,7 +522,7 @@ wxLayoutWindow::OnChar(wxKeyEvent& event) break; case WXK_END: if ( ctrlDown ) - m_llist->MoveCursorTo(m_llist->GetSize()); + m_llist->MoveCursorToEnd(); else m_llist->MoveCursorToEndOfLine(); break; @@ -430,7 +536,7 @@ wxLayoutWindow::OnChar(wxKeyEvent& event) else if( IsEditable() ) { /* First, handle control keys */ - if(event.ControlDown() && ! event.AltDown()) + if(ctrlDown && ! event.AltDown()) { switch(keyCode) { @@ -438,8 +544,12 @@ wxLayoutWindow::OnChar(wxKeyEvent& event) Copy(); break; case WXK_DELETE : + if(! deletedSelection) + m_llist->DeleteWord(); + break; case 'd': - m_llist->Delete(1); + if(! deletedSelection) // already done + m_llist->Delete(1); break; case 'y': m_llist->DeleteLines(1); @@ -494,16 +604,32 @@ wxLayoutWindow::OnChar(wxKeyEvent& event) if(event.ShiftDown()) Cut(); else - m_llist->Delete(1); + if(! deletedSelection) + m_llist->Delete(1); break; case WXK_BACK: // backspace - if(m_llist->MoveCursorHorizontally(-1)) m_llist->Delete(1); + if(! deletedSelection) + if(m_llist->MoveCursorHorizontally(-1)) + m_llist->Delete(1); break; case WXK_RETURN: if(m_WrapMargin > 0) m_llist->WrapLine(m_WrapMargin); m_llist->LineBreak(); break; + + case WXK_TAB: + if ( !event.ShiftDown() ) + { + // TODO should be configurable + static const int tabSize = 8; + + CoordType x = m_llist->GetCursorPos().x; + size_t numSpaces = tabSize - x % tabSize; + m_llist->Insert(wxString(' ', numSpaces)); + } + break; + default: if((!(event.ControlDown() || event.AltDown() || event.MetaDown())) && (keyCode < 256 && keyCode >= 32) @@ -520,15 +646,11 @@ wxLayoutWindow::OnChar(wxKeyEvent& event) SetModified(); }// if(IsEditable()) }// first switch() - if(m_Selecting) + + if ( m_Selecting ) { - if(event.ShiftDown()) - m_llist->ContinueSelection(); - else - { - m_llist->EndSelection(); - m_Selecting = false; - } + // continue selection to the current (new) cursor position + m_llist->ContinueSelection(); } // we must call ResizeScrollbars() before ScrollToCursor(), otherwise the @@ -543,11 +665,12 @@ wxLayoutWindow::OnChar(wxKeyEvent& event) void wxLayoutWindow::OnKeyUp(wxKeyEvent& event) { - if(event.KeyCode() == WXK_SHIFT && m_llist->IsSelecting()) + if ( event.KeyCode() == WXK_SHIFT && m_Selecting ) { m_llist->EndSelection(); m_Selecting = false; } + event.Skip(); } @@ -568,19 +691,10 @@ wxLayoutWindow::ScrollToCursor(void) WXLO_DEBUG(("ScrollToCursor: ViewStart is %d/%d", x0, y0)); // Get the size of the visible window: - GetClientSize(&x1,&y1); - - // notice that the client size may be (0, 0)... - wxASSERT(x1 >= 0 && y1 >= 0); + GetClientSize(&x1, &y1); - // VZ: I think this is false - if you do it here, ResizeScrollbars() won't - // call SetScrollbars() later -#if 0 - // As we have the values anyway, use them to avoid unnecessary scrollbar - // updates. - if(x1 > m_maxx) m_maxx = x1; - if(y1 > m_maxy) m_maxy = y1; -#endif // 0 + // update the cursor screen position + m_llist->Layout(dc); // Make sure that the scrollbars are at a position so that the cursor is // visible if we are editing @@ -625,14 +739,14 @@ wxLayoutWindow::OnPaint( wxPaintEvent &WXUNUSED(event)) void wxLayoutWindow::DoPaint(const wxRect *updateRect) { - // Causes bad flicker under wxGTK!!! #ifdef __WXGTK__ + // Calling Refresh() causes bad flicker under wxGTK!!! InternalPaint(updateRect); #else + // shouldn't specify the update rectangle if it doesn't include all the + // changed locations - otherwise, they won't be repainted at all because + // the system clips the display to the update rect Refresh(FALSE); //, updateRect); - - if ( !::UpdateWindow(GetHwnd()) ) - wxLogLastError("UpdateWindow"); #endif } @@ -671,6 +785,7 @@ wxLayoutWindow::InternalPaint(const wxRect *updateRect) m_llist->Layout(dc); ResizeScrollbars(); } + /* Check whether the window has grown, if so, we need to reallocate the bitmap to be larger. */ if(x1 > m_bitmapSize.x || y1 > m_bitmapSize.y) @@ -686,7 +801,7 @@ wxLayoutWindow::InternalPaint(const wxRect *updateRect) } m_memDC->SetDeviceOrigin(0,0); - m_memDC->SetBrush(wxBrush(m_llist->GetDefaultStyleInfo().GetBGColour(),wxSOLID)); + m_memDC->SetBackground(wxBrush(m_llist->GetDefaultStyleInfo().GetBGColour(),wxSOLID)); m_memDC->SetPen(wxPen(m_llist->GetDefaultStyleInfo().GetBGColour(), 0,wxTRANSPARENT)); m_memDC->SetLogicalFunction(wxCOPY); @@ -762,7 +877,7 @@ wxLayoutWindow::InternalPaint(const wxRect *updateRect) #ifdef WXLAYOUT_USE_CARET // show the caret back after everything is redrawn - m_caret->Show(); + GetCaret()->Show(); #endif // WXLAYOUT_USE_CARET ResetDirty(); @@ -786,17 +901,38 @@ wxLayoutWindow::InternalPaint(const wxRect *updateRect) } } +void +wxLayoutWindow::OnSize(wxSizeEvent &event) +{ + if ( m_llist ) + { + ResizeScrollbars(); + } + + event.Skip(); +} + // change the range and position of scrollbars void wxLayoutWindow::ResizeScrollbars(bool exact) { wxPoint max = m_llist->GetSize(); + wxSize size = GetClientSize(); WXLO_DEBUG(("ResizeScrollbars: max size = (%ld, %ld)", (long int)max.x, (long int) max.y)); + // in the absence of scrollbars we should compare with the client size + if ( !m_hasHScrollbar ) + m_maxx = size.x;// - WXLO_ROFFSET; + if ( !m_hasVScrollbar ) + m_maxy = size.y;// - WXLO_BOFFSET; + + // 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 ) { + // text became too large if ( !exact ) { // add an extra bit to the sizes to avoid future updates @@ -810,17 +946,58 @@ wxLayoutWindow::ResizeScrollbars(bool exact) 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 ) + { + // add an extra bit to the sizes to avoid future updates + max.x -= WXLO_ROFFSET; + max.y -= WXLO_BOFFSET; + } + + if ( m_hasHScrollbar && (max.x < m_maxx) ) + { + // remove the horizontal scrollbar + SetScrollbars(0, -1, 0, -1, 0, -1, true); + m_hasHScrollbar = false; + } + + if ( m_hasVScrollbar && (max.y < m_maxy) ) + { + // remove the vertical scrollbar + SetScrollbars(-1, 0, -1, 0, -1, 0, true); + m_hasVScrollbar = false; + } + } +#endif } +// ---------------------------------------------------------------------------- +// clipboard operations +// +// ---------------------------------------------------------------------------- + void -wxLayoutWindow::Paste(void) +wxLayoutWindow::Paste(bool 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() )) @@ -828,7 +1005,7 @@ wxLayoutWindow::Paste(void) wxTheClipboard->GetData(&wxldo); { } - //FIXME: missing functionality m_llist->Insert(wxldo.GetList()); + //FIXME: missing functionality m_llist->Insert(wxldo.GetList()); } else #endif @@ -843,17 +1020,6 @@ wxLayoutWindow::Paste(void) } wxTheClipboard->Close(); } - -#if 0 - /* My attempt to get the primary selection, but it does not - work. :-( */ - if(text.Length() == 0) - { - wxTextCtrl tmp_tctrl(this,-1); - tmp_tctrl.Paste(); - text += tmp_tctrl.GetValue(); - } -#endif } bool @@ -919,6 +1085,11 @@ wxLayoutWindow::Cut(void) else return FALSE; } + +// ---------------------------------------------------------------------------- +// searching +// ---------------------------------------------------------------------------- + bool wxLayoutWindow::Find(const wxString &needle, wxPoint * fromWhere) @@ -943,6 +1114,10 @@ wxLayoutWindow::Find(const wxString &needle, return false; } +// ---------------------------------------------------------------------------- +// popup menu stuff +// ---------------------------------------------------------------------------- + wxMenu * wxLayoutWindow::MakeFormatMenu() { @@ -951,53 +1126,65 @@ wxLayoutWindow::MakeFormatMenu() m->Append(WXLOWIN_MENU_LARGER ,_("&Larger"),_("Switch to larger font."), false); m->Append(WXLOWIN_MENU_SMALLER ,_("&Smaller"),_("Switch to smaller font."), false); m->AppendSeparator(); - m->Append(WXLOWIN_MENU_UNDERLINE_ON, _("&Underline on"),_("Activate underline mode."), false); - m->Append(WXLOWIN_MENU_UNDERLINE_OFF,_("&Underline off"),_("Deactivate underline mode."), false); - m->Append(WXLOWIN_MENU_BOLD_ON ,_("&Bold on"),_("Activate bold mode."), false); - m->Append(WXLOWIN_MENU_BOLD_OFF ,_("&Bold off"),_("Deactivate bold mode."), false); - m->Append(WXLOWIN_MENU_ITALICS_ON ,_("&Italics on"),_("Activate italics mode."), false); - m->Append(WXLOWIN_MENU_ITALICS_OFF ,_("&Italics off"),_("Deactivate italics mode."), false); + m->Append(WXLOWIN_MENU_UNDERLINE, _("&Underline"),_("Underline mode."), true); + m->Append(WXLOWIN_MENU_BOLD, _("&Bold"),_("Bold mode."), true); + m->Append(WXLOWIN_MENU_ITALICS, _("&Italics"),_("Italics mode."), true); m->AppendSeparator(); m->Append(WXLOWIN_MENU_ROMAN ,_("&Roman"),_("Switch to roman font."), false); m->Append(WXLOWIN_MENU_TYPEWRITER,_("&Typewriter"),_("Switch to typewriter font."), false); m->Append(WXLOWIN_MENU_SANSSERIF ,_("&Sans Serif"),_("Switch to sans serif font."), false); + return m; } +void wxLayoutWindow::OnUpdateMenuUnderline(wxUpdateUIEvent& event) +{ + event.Check(m_llist->IsFontUnderlined()); +} + +void wxLayoutWindow::OnUpdateMenuBold(wxUpdateUIEvent& event) +{ + event.Check(m_llist->IsFontBold()); +} + +void wxLayoutWindow::OnUpdateMenuItalic(wxUpdateUIEvent& event) +{ + event.Check(m_llist->IsFontItalic()); +} + void wxLayoutWindow::OnMenu(wxCommandEvent& event) { switch (event.GetId()) { case WXLOWIN_MENU_LARGER: - m_llist->SetFontLarger(); break; + m_llist->SetFontLarger(); DoPaint(); break; case WXLOWIN_MENU_SMALLER: - m_llist->SetFontSmaller(); break; - case WXLOWIN_MENU_UNDERLINE_ON: - m_llist->SetFontUnderline(true); break; - case WXLOWIN_MENU_UNDERLINE_OFF: - m_llist->SetFontUnderline(false); break; - case WXLOWIN_MENU_BOLD_ON: - m_llist->SetFontWeight(wxBOLD); break; - case WXLOWIN_MENU_BOLD_OFF: - m_llist->SetFontWeight(wxNORMAL); break; - case WXLOWIN_MENU_ITALICS_ON: - m_llist->SetFontStyle(wxITALIC); break; - case WXLOWIN_MENU_ITALICS_OFF: - m_llist->SetFontStyle(wxNORMAL); break; + m_llist->SetFontSmaller(); DoPaint(); break; + case WXLOWIN_MENU_UNDERLINE: + m_llist->ToggleFontUnderline(); DoPaint(); break; + case WXLOWIN_MENU_BOLD: + m_llist->ToggleFontWeight(); DoPaint(); break; + case WXLOWIN_MENU_ITALICS: + m_llist->ToggleFontItalics(); DoPaint(); break; case WXLOWIN_MENU_ROMAN: - m_llist->SetFontFamily(wxROMAN); break; + m_llist->SetFontFamily(wxROMAN); DoPaint(); break; case WXLOWIN_MENU_TYPEWRITER: - m_llist->SetFontFamily(wxFIXED); break; + m_llist->SetFontFamily(wxFIXED); DoPaint(); break; case WXLOWIN_MENU_SANSSERIF: - m_llist->SetFontFamily(wxSWISS); break; + m_llist->SetFontFamily(wxSWISS); DoPaint(); break; } } +// ---------------------------------------------------------------------------- +// focus +// ---------------------------------------------------------------------------- + void wxLayoutWindow::OnSetFocus(wxFocusEvent &ev) { m_HaveFocus = true; ev.Skip(); + DoPaint(); // cursor must change } void @@ -1005,4 +1192,28 @@ wxLayoutWindow::OnKillFocus(wxFocusEvent &ev) { m_HaveFocus = false; ev.Skip(); + DoPaint();// cursor must change +} + +// ---------------------------------------------------------------------------- +// private functions +// ---------------------------------------------------------------------------- + +static bool IsDirectionKey(long keyCode) +{ + switch(keyCode) + { + case WXK_UP: + case WXK_DOWN: + case WXK_RIGHT: + case WXK_LEFT: + case WXK_PRIOR: + case WXK_NEXT: + case WXK_HOME: + case WXK_END: + return true; + + default: + return false; + } }