]> git.saurik.com Git - wxWidgets.git/blobdiff - user/wxLayout/wxlwindow.cpp
* wxCreateDynamicObject() uses an hashtable now
[wxWidgets.git] / user / wxLayout / wxlwindow.cpp
index 9a7312579b16cf9a07e01c2f39f3add48a627b01..57af29d32c5e222c4f6b759fa012445241ac6ef1 100644 (file)
 #define   VAR(x)   cout << #x"=" << x << endl;
 
 BEGIN_EVENT_TABLE(wxLayoutWindow,wxScrolledWindow)
-   EVT_PAINT  (wxLayoutWindow::OnPaint)
-   EVT_CHAR   (wxLayoutWindow::OnChar)
+   EVT_PAINT    (wxLayoutWindow::OnPaint)
+   EVT_CHAR     (wxLayoutWindow::OnChar)
    EVT_LEFT_DOWN(wxLayoutWindow::OnMouse)
 END_EVENT_TABLE()
 
 wxLayoutWindow::wxLayoutWindow(wxWindow *parent)
-   : wxScrolledWindow(parent)
+   : wxScrolledWindow(parent, -1, wxDefaultPosition, wxDefaultSize,
+                      wxHSCROLL | wxVSCROLL | wxBORDER)
+
 {
    m_ScrollbarsSet = false;
-   m_EventId = 0;
+   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)
 {
-   if(m_EventId == 0) // nothing to do
+   SetFocus();
+
+   if(m_EventId == -1) // nothing to do
       return;
    
    m_FindPos.x = event.GetX();
    m_FindPos.y = event.GetY();
-   m_FoundObject = NULL;
+   m_FoundObject = (wxLayoutObjectBase *) NULL;
 
 #ifdef   WXLAYOUT_DEBUG
-   cerr << "OnMouse: " << m_FindPos.x << ',' << m_FindPos.y << endl;
+   //doesn't work, undefined functions
+   //wxLogTrace("OnMouse: (%d, %d)", m_FindPos.x, m_FindPos.y);
 #endif
    Refresh();
    if(m_FoundObject)
    {
-      if(m_EventId)
+      if(m_EventId != -1)
       {
          wxCommandEvent commandEvent(wxEVENT_TYPE_MENU_COMMAND, m_EventId);
          commandEvent.SetEventObject( this );
@@ -60,8 +75,16 @@ wxLayoutWindow::OnMouse(wxMouseEvent& event)
 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:
@@ -82,12 +105,30 @@ wxLayoutWindow::OnChar(wxKeyEvent& event)
    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 :
-      m_llist.Delete(1);
+      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
-      m_llist.MoveCursor(-1);
-      m_llist.Delete(1);
+      if(m_llist.MoveCursor(-1))
+         m_llist.Delete(1);
       break;
    case WXK_RETURN:
       m_llist.LineBreak();
@@ -116,7 +157,7 @@ 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) // look for keyclicks
+   if(m_EventId != -1) // look for keyclicks
       m_FoundObject = m_llist.Draw(dc,true,m_FindPos);
    else
       m_llist.Draw(dc);