/*-*- c++ -*-******************************************************** * wxLwindow.h : a scrolled Window for displaying/entering rich text* * * * (C) 1998 by Karsten Ballüder (Ballueder@usa.net) * * * * $Id$ *******************************************************************/ #ifdef __GNUG__ # pragma implementation "wxlwindow.h" #endif #include "wxlwindow.h" #define VAR(x) cout << #x"=" << x << endl; BEGIN_EVENT_TABLE(wxLayoutWindow,wxScrolledWindow) EVT_PAINT (wxLayoutWindow::OnPaint) EVT_CHAR (wxLayoutWindow::OnChar) EVT_LEFT_DOWN(wxLayoutWindow::OnMouse) END_EVENT_TABLE() wxLayoutWindow::wxLayoutWindow(wxWindow *parent) : wxScrolledWindow(parent, -1, wxDefaultPosition, wxDefaultSize, wxHSCROLL | wxVSCROLL | wxBORDER) { m_ScrollbarsSet = false; m_EventId = -1; } #ifdef __WXMSW__ long wxLayoutWindow::MSWGetDlgCode() { // if we don't return this, we won't get OnChar() events return DLGC_WANTCHARS | DLGC_WANTARROWS | DLGC_WANTMESSAGE; } #endif //MSW void wxLayoutWindow::OnMouse(wxMouseEvent& event) { SetFocus(); if(m_EventId == -1) // nothing to do return; m_FindPos.x = event.GetX(); m_FindPos.y = event.GetY(); m_FoundObject = (wxLayoutObjectBase *) NULL; #ifdef WXLAYOUT_DEBUG //doesn't work, undefined functions //wxLogTrace("OnMouse: (%d, %d)", m_FindPos.x, m_FindPos.y); #endif Refresh(); if(m_FoundObject) { 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); } } } /* * some simple keyboard handling */ void wxLayoutWindow::OnChar(wxKeyEvent& event) { if(! m_llist.IsEditable()) // do nothing { event.Skip(); return; } long keyCode = event.KeyCode(); wxPoint p; CoordType help; switch(event.KeyCode()) { case WXK_RIGHT: m_llist.MoveCursor(1); break; case WXK_LEFT: m_llist.MoveCursor(-1); break; case WXK_UP: m_llist.MoveCursor(0,-1); break; case WXK_DOWN: m_llist.MoveCursor(0,1); break; case WXK_PRIOR: m_llist.MoveCursor(0,-20); break; case WXK_NEXT: m_llist.MoveCursor(0,20); break; case WXK_HOME: p = m_llist.GetCursor(); p.x = 0; m_llist.SetCursor(p); break; case WXK_END: p = m_llist.GetCursor(); p.x = m_llist.GetLineLength(m_llist.FindCurrentObject((CoordType *) NULL)); m_llist.SetCursor(p); break; case WXK_DELETE : if(event.ControlDown()) // delete to end of line { help = m_llist.GetLineLength( m_llist.FindCurrentObject((CoordType *) NULL)) - m_llist.GetCursor().x; m_llist.Delete(help ? help : 1); } else m_llist.Delete(1); break; case WXK_BACK: // backspace if(m_llist.MoveCursor(-1)) m_llist.Delete(1); break; case WXK_RETURN: m_llist.LineBreak(); break; #ifdef WXLAYOUT_DEBUG case WXK_F1: m_llist.Debug(); break; #endif default: if(keyCode < 256 && keyCode >= 32) { String tmp; tmp += keyCode; m_llist.Insert(tmp); } break; } Refresh(); UpdateScrollbars(); } void wxLayoutWindow::OnPaint( wxPaintEvent &WXUNUSED(event)w) // or: OnDraw(wxDC& dc) { wxPaintDC dc( this ); // only when used as OnPaint for OnDraw we PrepareDC( dc ); // can skip the first two lines 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 UpdateScrollbars(); } } void wxLayoutWindow::UpdateScrollbars(void) { 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); } void wxLayoutWindow::Print(void) { VAR(wxThePrintSetupData); wxPostScriptDC dc("layout.ps",true,this); if (dc.Ok() && dc.StartDoc((char *)_("Printing message..."))) { //dc.SetUserScale(1.0, 1.0); m_llist.Draw(dc); dc.EndDoc(); } }