X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5e0394ae9b7f3bd5be7014f81a91b3d0385fb4f5..6ef3d3d80ace13f2ef372b8f8bdf0d987b2c026f:/user/wxLayout/wxlwindow.cpp diff --git a/user/wxLayout/wxlwindow.cpp b/user/wxLayout/wxlwindow.cpp index 0b1c7a69ca..60a8c8b789 100644 --- a/user/wxLayout/wxlwindow.cpp +++ b/user/wxLayout/wxlwindow.cpp @@ -10,14 +10,43 @@ # pragma implementation "wxlwindow.h" #endif -#include "wxlwindow.h" +//#include "Mpch.h" -#define VAR(x) cout << #x"=" << x << endl; +#ifdef M_BASEDIR +# ifndef USE_PCH +# include "Mcommon.h" +# include "gui/wxMenuDefs.h" +# endif // USE_PCH +# include "gui/wxlwindow.h" +#else +# ifdef __WXMSW__ +# include + +# undef FindWindow +# undef GetCharWidth +# undef StartDoc +# endif + +# include "wxlwindow.h" +# define TRACEMESSAGE(x) +#endif +# define WXL_VAR(x) cerr << #x " = " << x ; BEGIN_EVENT_TABLE(wxLayoutWindow,wxScrolledWindow) EVT_PAINT (wxLayoutWindow::OnPaint) EVT_CHAR (wxLayoutWindow::OnChar) - EVT_LEFT_DOWN(wxLayoutWindow::OnMouse) + + EVT_LEFT_DOWN(wxLayoutWindow::OnLeftMouseClick) + EVT_RIGHT_DOWN(wxLayoutWindow::OnRightMouseClick) + EVT_LEFT_DCLICK(wxLayoutWindow::OnMouseDblClick) + EVT_MENU(WXLOWIN_MENU_LARGER, wxLayoutWindow::OnMenu) + EVT_MENU(WXLOWIN_MENU_SMALLER, wxLayoutWindow::OnMenu) + EVT_MENU(WXLOWIN_MENU_UNDERLINE, wxLayoutWindow::OnMenu) + EVT_MENU(WXLOWIN_MENU_BOLD, wxLayoutWindow::OnMenu) + EVT_MENU(WXLOWIN_MENU_ITALICS, wxLayoutWindow::OnMenu) + EVT_MENU(WXLOWIN_MENU_ROMAN, wxLayoutWindow::OnMenu) + EVT_MENU(WXLOWIN_MENU_TYPEWRITER, wxLayoutWindow::OnMenu) + EVT_MENU(WXLOWIN_MENU_SANSSERIF, wxLayoutWindow::OnMenu) END_EVENT_TABLE() wxLayoutWindow::wxLayoutWindow(wxWindow *parent) @@ -26,7 +55,16 @@ wxLayoutWindow::wxLayoutWindow(wxWindow *parent) { m_ScrollbarsSet = false; - m_EventId = -1; + m_doSendEvents = false; + m_ViewStartX = 0; m_ViewStartY = 0; + m_DoPopupMenu = true; + m_PopupMenu = NULL; + + CoordType + max_x, max_y, lineHeight; + m_llist.GetSize(&max_x, &max_y, &lineHeight); + SetScrollbars(10, lineHeight, max_x/10+1, max_y/lineHeight+1); + EnableScrolling(true,true); } #ifdef __WXMSW__ @@ -38,34 +76,52 @@ wxLayoutWindow::MSWGetDlgCode() } #endif //MSW - void -wxLayoutWindow::OnMouse(wxMouseEvent& event) +wxLayoutWindow::Update(void) { - SetFocus(); + wxClientDC dc(this); + PrepareDC(dc); + if(IsDirty()) + { + DoPaint(dc); + UpdateScrollbars(); + ResetDirty(); + } + m_llist.DrawCursor(dc); +} - if(m_EventId == -1) // nothing to do +void +wxLayoutWindow::OnMouse(int eventId, wxMouseEvent& event) +{ + if(!m_doSendEvents) // nothing to do return; + + wxPaintDC dc( this ); + PrepareDC( dc ); + SetFocus(); - m_FindPos.x = event.GetX(); - m_FindPos.y = event.GetY(); - m_FoundObject = NULL; + wxPoint findPos; + findPos.x = dc.DeviceToLogicalX(event.GetX()); + findPos.y = dc.DeviceToLogicalY(event.GetY()); -#ifdef WXLAYOUT_DEBUG - //doesn't work, undefined functions - //wxLogTrace("OnMouse: (%d, %d)", m_FindPos.x, m_FindPos.y); -#endif - Refresh(); - if(m_FoundObject) + TRACEMESSAGE(("wxLayoutWindow::OnMouse: (%d, %d) -> (%d, %d)", + event.GetX(), event.GetY(), findPos.x, findPos.y)); + + if(eventId == WXLOWIN_MENU_RCLICK && m_DoPopupMenu && m_llist.IsEditable()) { - if(m_EventId != -1) - { - wxCommandEvent commandEvent(wxEVENT_TYPE_MENU_COMMAND, m_EventId); - commandEvent.SetEventObject( this ); - commandEvent.SetClientData((char *)m_FoundObject); - m_ClickPosition = wxPoint(event.GetX(), event.GetY()); - GetEventHandler()->ProcessEvent(commandEvent); - } + // when does this menu get freed? + // how do we handle toggling? FIXME + PopupMenu(MakeFormatMenu(), event.GetX(), event.GetY()); + return; + } + // find the object at this position + wxLayoutObjectBase *obj = m_llist.Find(findPos); + if(obj) + { + wxCommandEvent commandEvent(wxEVENT_TYPE_MENU_COMMAND, eventId); + commandEvent.SetEventObject( this ); + commandEvent.SetClientData((char *)obj); + GetEventHandler()->ProcessEvent(commandEvent); } } @@ -112,14 +168,14 @@ wxLayoutWindow::OnChar(wxKeyEvent& event) break; case WXK_END: p = m_llist.GetCursor(); - p.x = m_llist.GetLineLength(m_llist.FindCurrentObject(NULL)); + p.x = m_llist.GetLineLength(m_llist.GetCurrentObject()); m_llist.SetCursor(p); break; case WXK_DELETE : if(event.ControlDown()) // delete to end of line { help = m_llist.GetLineLength( - m_llist.FindCurrentObject(NULL)) + m_llist.GetCurrentObject()) - m_llist.GetCursor().x; m_llist.Delete(help ? help : 1); } @@ -127,40 +183,102 @@ wxLayoutWindow::OnChar(wxKeyEvent& event) m_llist.Delete(1); break; case WXK_BACK: // backspace - if(m_llist.MoveCursor(-1)) + if(m_llist.MoveCursor(-1)) { m_llist.Delete(1); + } break; case WXK_RETURN: m_llist.LineBreak(); break; -#ifdef WXLAYOUT_DEBUG + +#ifdef WXLAYOUT_DEBUG case WXK_F1: m_llist.Debug(); break; -#endif + case WXK_F2: + m_llist.WrapLine(); + break; +#endif + default: if(keyCode < 256 && keyCode >= 32) { String tmp; tmp += keyCode; m_llist.Insert(tmp); + m_llist.WrapLine(); } break; } - Refresh(); - UpdateScrollbars(); + + /** Scroll so that cursor is visible! */ + int x0,y0,x1,y1,ux,uy; + ViewStart(&x0,&y0); + GetScrollPixelsPerUnit(&ux,&uy); + x0*=ux; y0*=uy; + GetClientSize(&x1,&y1); + + wxPoint cc = m_llist.GetCursorCoords(); + int nx = x0, ny = y0; + // when within 10% of borders, scroll to center + if(cc.y > y0+(9*y1)/10) + ny = cc.y - y1/5; + else if (cc.y < y0+y1/10) + { + ny = cc.y-y1/2; + if(ny < 0) ny = 0; + } + if(cc.x > x0+(9*x1)/10) + nx = cc.x - x1/5; + else if (cc.x < x0+x1/10) + { + nx = cc.x-x1/2; + if(nx < 0) nx = 0; + } + Scroll(nx,ny); + + Update(); } void -wxLayoutWindow::OnPaint( wxPaintEvent &WXUNUSED(event)w) // or: OnDraw(wxDC& dc) +wxLayoutWindow::OnPaint( wxPaintEvent &WXUNUSED(event)) // or: OnDraw(wxDC& dc) { - wxPaintDC dc( this ); // only when used as OnPaint for OnDraw we - PrepareDC( dc ); // can skip the first two lines + wxPaintDC dc( this ); + PrepareDC( dc ); + + DoPaint(dc); + +// wxGTK: wxMemoryDC broken? +#if 0 + int x0,y0,x1,y1; + ViewStart(&x0,&y0); + GetSize(&x1,&y1); + WXL_VAR(x0); WXL_VAR(y0); + WXL_VAR(x1); WXL_VAR(y1); + + wxMemoryDC(memdc); + wxBitmap bm(x1,y1); + memdc.SelectObject(bm); + + // make temporary copy and edit this + memdc.SetDeviceOrigin(x0,y0); + memdc.Blit(x0,y0,x1,y1,&dc,x0,y0,wxCOPY,FALSE); + DoPaint(memdc); + // blit it back + dc.Blit(x0,y0,x1,y1,&memdc,x0,y0,wxCOPY,FALSE); +#endif + +} + +// does the actual painting +void +wxLayoutWindow::DoPaint(wxDC &dc) +{ + m_llist.EraseAndDraw(dc); + m_llist.DrawCursor(dc); + // FIXME: not strictly correct, this does only work for changes behind + // the cursor position, not complete redraws - if(m_EventId != -1) // look for keyclicks - m_FoundObject = m_llist.Draw(dc,true,m_FindPos); - else - m_llist.Draw(dc); if(! m_ScrollbarsSet) { m_ScrollbarsSet = true; // avoid recursion @@ -173,17 +291,17 @@ wxLayoutWindow::UpdateScrollbars(void) { CoordType max_x, max_y, lineHeight; - + + ViewStart(&m_ViewStartX, &m_ViewStartY); m_llist.GetSize(&max_x, &max_y, &lineHeight); - SetScrollbars(10, lineHeight, max_x/10+1, max_y/lineHeight+1); - EnableScrolling(true,true); + SetScrollbars(10, lineHeight, max_x/10+1, max_y/lineHeight+1,m_ViewStartX,m_ViewStartY,true); + //EnableScrolling(true,true); + //Scroll(m_ViewStartX, m_ViewStartY); } void wxLayoutWindow::Print(void) { - VAR(wxThePrintSetupData); - wxPostScriptDC dc("layout.ps",true,this); if (dc.Ok() && dc.StartDoc((char *)_("Printing message..."))) { @@ -192,3 +310,61 @@ wxLayoutWindow::Print(void) dc.EndDoc(); } } + +wxMenu * +wxLayoutWindow::MakeFormatMenu() +{ + if(m_PopupMenu) + return m_PopupMenu; + + wxMenu *m = new wxMenu(); + + 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,_("&Underline"),_("Toggle underline mode."), true); + m->Append(WXLOWIN_MENU_BOLD ,_("&Bold"),_("Toggle bold mode."), true); + m->Append(WXLOWIN_MENU_ITALICS ,_("&Italics"),_("Toggle italics mode."), true); + m->AppendSeparator(); + m->Append(WXLOWIN_MENU_ROMAN ,_("&Roman"),_("Toggle underline mode."), false); + m->Append(WXLOWIN_MENU_TYPEWRITER,_("&Typewriter"),_("Toggle bold mode."), false); + m->Append(WXLOWIN_MENU_SANSSERIF ,_("&Sans Serif"),_("Toggle italics mode."), false); + + return m_PopupMenu = m; +} + +void wxLayoutWindow::OnMenu(wxCommandEvent& event) +{ + if(! m_llist.IsEditable()) + return; + + switch (event.GetId()) + { + case WXLOWIN_MENU_LARGER: + m_llist.SetFontLarger(); + break; + case WXLOWIN_MENU_SMALLER: + m_llist.SetFontSmaller(); + break; + case WXLOWIN_MENU_UNDERLINE: + m_llist.SetFontUnderline( + m_PopupMenu->IsChecked(WXLOWIN_MENU_UNDERLINE) ? false : true + ); + break; + case WXLOWIN_MENU_BOLD: + m_llist.SetFontWeight( + m_PopupMenu->IsChecked(WXLOWIN_MENU_BOLD) ? wxNORMAL : wxBOLD + ); + case WXLOWIN_MENU_ITALICS: + m_llist.SetFontStyle( + m_PopupMenu->IsChecked(WXLOWIN_MENU_ITALICS) ? wxNORMAL : wxITALIC + ); + break; + case WXLOWIN_MENU_ROMAN: + m_llist.SetFontFamily(wxROMAN); break; + case WXLOWIN_MENU_TYPEWRITER: + m_llist.SetFontFamily(wxFIXED); break; + case WXLOWIN_MENU_SANSSERIF: + m_llist.SetFontFamily(wxSWISS); break; + } +}