]> git.saurik.com Git - wxWidgets.git/commitdiff
some small fixes to make it work a bit again under MSW:
authorVadim Zeitlin <vadim@wxwidgets.org>
Sun, 6 Jun 1999 22:10:54 +0000 (22:10 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sun, 6 Jun 1999 22:10:54 +0000 (22:10 +0000)
1. bg bitmap reenabled
2. wxCaret positioning reenabled

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@2681 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

user/wxLayout/wxLayout.cpp
user/wxLayout/wxllist.cpp
user/wxLayout/wxllist.h
user/wxLayout/wxlwindow.cpp
user/wxLayout/wxlwindow.h

index b020e28f69c03d635652717abfc7dc392ce35d46..b4cd05060cd1ddc487ff046642c510cb8e67bcfb 100644 (file)
@@ -206,7 +206,7 @@ MyFrame::AddSampleText(wxLayoutList *llist)
    llist->Insert("And here the source for the test program:");
    llist->LineBreak();
    llist->Insert("And here the source for the test program:");
-#if 0
+
    char buffer[1024];
    FILE *in = fopen("wxLayout.cpp","r");
    if(in)
@@ -219,7 +219,7 @@ MyFrame::AddSampleText(wxLayoutList *llist)
          wxLayoutImportText(llist, buffer);
       }
    }
-#endif
+
    llist->MoveCursorTo(wxPoint(0,0));
    m_lwin->SetDirty();
    m_lwin->Refresh();
@@ -331,6 +331,8 @@ void MyFrame::OnCommand( wxCommandEvent &event )
                          "This is a text\n"
                          "with embedded line\n"
                          "breaks.\n");
+      m_lwin->SetDirty();
+      m_lwin->Refresh();
       break;
 
    case ID_URL_TEST:
index 5bc76fe34734188adcf66c662ae066927ad1eb63..a52aa0b89ddaf468f29f0dcd9460075f221c434a 100644 (file)
   Draw()   just draws them with the current settings, without
            re-layout()ing them again
 
-  Each line has its own wxLayoutStyleInfo structure which gets updated 
-  from within Layout(). Thanks to this, we don't need to re-layout all 
+  Each line has its own wxLayoutStyleInfo structure which gets updated
+  from within Layout(). Thanks to this, we don't need to re-layout all
   lines if we want to draw one, but can just use its styleinfo to set
   the right font.
-  
+
  */
 
 #ifdef __GNUG__
 #define WXLO_CURSORCHAR   "E"
 /** @name Helper functions */
 //@{
+/// allows me to compare to wxPoints
+bool operator <=(wxPoint const &p1, wxPoint const &p2)
+{
+   return p1.y < p2.y || (p1.y == p2.y && p1.x <= p2.x);
+}
+
 /*
   The following STAY HERE until we have a working wxGTK again!!!
 */
+#ifdef __WXGTK__
 /// allows me to compare to wxPoints
 bool operator ==(wxPoint const &p1, wxPoint const &p2)
 {
@@ -119,11 +126,12 @@ wxPoint & operator += (wxPoint &p1, wxPoint const &p2)
    p1.y += p2.y;
    return p1;
 }
+#endif // wxGTK
 
 /// allows me to compare to wxPoints
-bool operator <=(wxPoint const &p1, wxPoint const &p2)
+bool operator>(wxPoint const &p1, wxPoint const &p2)
 {
-   return p1.y < p2.y || (p1.y == p2.y && p1.x <= p2.x);
+   return !(p1 <= p2);
 }
 
 /// grows a wxRect so that it includes the given point
@@ -251,12 +259,14 @@ wxLayoutObjectText::Draw(wxDC &dc, wxPoint const &coords,
                          wxLayoutList *wxllist,
                          CoordType begin, CoordType end)
 {
-   if( end <= 0)
+   if( end <= 0 )
+   {
+      // draw the whole object normally
       dc.DrawText(m_Text, coords.x, coords.y-m_Top);
+   }
    else
    {
       // highlight the bit between begin and len
-      wxString str;
       CoordType
          xpos = coords.x,
          ypos = coords.y-m_Top;
@@ -266,7 +276,7 @@ wxLayoutObjectText::Draw(wxDC &dc, wxPoint const &coords,
       if( end > (signed)m_Text.Length() )
          end = m_Text.Length();
 
-      str = m_Text.Mid(0, begin);
+      wxString str = m_Text.Mid(0, begin);
       dc.DrawText(str, xpos, ypos);
       dc.GetTextExtent(str, &width, &height, &descent);
       xpos += width;
@@ -799,7 +809,7 @@ wxLayoutLine::Insert(CoordType xpos, wxLayoutObject *obj)
    // to update their styleinfo structure.
    if(obj->GetType() == WXLO_TYPE_CMD)
       MarkNextDirty(-1);
-   
+
    CoordType offset;
    wxLOiterator i = FindObject(xpos, &offset);
    if(i == NULLIT)
@@ -1056,7 +1066,7 @@ wxLayoutLine::Draw(wxDC &dc,
 }
 
 /*
-  This function does all the recalculation, that is, it should only be 
+  This function does all the recalculation, that is, it should only be
   called from within wxLayoutList::Layout(), as it uses the current
   list's styleinfo and updates it.
 */
@@ -2079,7 +2089,6 @@ wxLayoutList::UpdateCursorScreenPos(wxDC &dc,
                                     bool resetCursorMovedFlag,
                                     const wxPoint& translate)
 {
-   return;
    wxCHECK_RET( m_CursorLine, "no cursor line" );
 
    if ( m_movedCursor )
@@ -2092,7 +2101,7 @@ wxLayoutList::UpdateCursorScreenPos(wxDC &dc,
                            m_CursorPos.x,
                            /* suppress update */ true);
       ApplyStyle(SiBackup, dc); // restore it
-      
+
       if ( resetCursorMovedFlag )
       {
 #ifdef WXLAYOUT_USE_CARET
@@ -2135,8 +2144,6 @@ wxLayoutList::Layout(wxDC &dc, CoordType bottom, bool forceAll)
    // This one we always Layout() to get the current cursor
    // coordinates on the screen:
    m_CursorLine->MarkDirty();
-   // FIXME this is completely wrong - we should start by first *visible* line
-   //       (and stop on the last one) instead of looping over all lines!!
    bool wasDirty = false;
    wxLayoutLine *line = m_FirstLine;
    while(line)
@@ -2352,41 +2359,60 @@ wxLayoutList::SetUpdateRect(CoordType x, CoordType y)
 }
 
 void
-wxLayoutList::StartSelection(wxPoint cpos)
+wxLayoutList::StartSelection(const wxPoint& cposOrig, const wxPoint& spos)
 {
-   if(cpos.x == -1)
+   wxPoint cpos(cposOrig);
+   if ( cpos.x == -1 )
       cpos = m_CursorPos;
    WXLO_DEBUG(("Starting selection at %ld/%ld", cpos.x, cpos.y));
    m_Selection.m_CursorA = cpos;
    m_Selection.m_CursorB = cpos;
+   m_Selection.m_ScreenA = spos;
+   m_Selection.m_ScreenB = spos;
    m_Selection.m_selecting = true;
    m_Selection.m_valid = false;
 }
 
 void
-wxLayoutList::ContinueSelection(wxPoint cpos)
+wxLayoutList::ContinueSelection(const wxPoint& cposOrig, const wxPoint& spos)
 {
+   wxPoint cpos(cposOrig);
    if(cpos.x == -1)
       cpos = m_CursorPos;
+
    wxASSERT(m_Selection.m_selecting == true);
    wxASSERT(m_Selection.m_valid == false);
    WXLO_DEBUG(("Continuing selection at %ld/%ld", cpos.x, cpos.y));
-   if(m_Selection.m_CursorB <= cpos)
+
+   if ( m_Selection.m_CursorB <= cpos )
+   {
+      m_Selection.m_ScreenB = spos;
       m_Selection.m_CursorB = cpos;
+   }
    else
+   {
+      m_Selection.m_ScreenA = spos;
       m_Selection.m_CursorA = cpos;
-   // We always want m_CursorA <= m_CursorB!
-   if(! (m_Selection.m_CursorA <= m_Selection.m_CursorB))
+   }
+
+   // we always want m_CursorA <= m_CursorB!
+   if( m_Selection.m_CursorA > m_Selection.m_CursorB )
    {
+      // exchange the start/end points
       wxPoint help = m_Selection.m_CursorB;
       m_Selection.m_CursorB = m_Selection.m_CursorA;
       m_Selection.m_CursorA = help;
+
+      help = m_Selection.m_ScreenB;
+      m_Selection.m_ScreenB = m_Selection.m_ScreenA;
+      m_Selection.m_ScreenA = help;
    }
 }
 
 void
-wxLayoutList::EndSelection(wxPoint cpos)
+wxLayoutList::EndSelection(const wxPoint& cposOrig, const wxPoint& spos)
 {
+   wxPoint cpos(cposOrig);
    if(cpos.x == -1)
       cpos = m_CursorPos;
    ContinueSelection(cpos);
@@ -2395,6 +2421,27 @@ wxLayoutList::EndSelection(wxPoint cpos)
    m_Selection.m_valid = true;
 }
 
+void
+wxLayoutList::DiscardSelection()
+{
+   if ( !HasSelection() )
+      return;
+
+   m_Selection.m_valid =
+   m_Selection.m_selecting = false;
+
+   // invalidate the area which was previousle selected - and which is not
+   // selected any more
+   if ( m_Selection.HasValidScreenCoords() )
+   {
+      SetUpdateRect(m_Selection.m_ScreenA);
+      SetUpdateRect(m_Selection.m_ScreenB);
+   }
+   else
+   {
+       // TODO
+   }
+}
 
 bool
 wxLayoutList::IsSelecting(void)
@@ -2405,10 +2452,10 @@ wxLayoutList::IsSelecting(void)
 bool
 wxLayoutList::IsSelected(const wxPoint &cursor)
 {
-   if(! m_Selection.m_valid && ! m_Selection.m_selecting)
+   if ( !HasSelection() )
       return false;
-   return m_Selection.m_CursorA <= cursor
-      && cursor <= m_Selection.m_CursorB;
+
+   return m_Selection.m_CursorA <= cursor && cursor <= m_Selection.m_CursorB;
 }
 
 
index 668360ad26282f34e85b4594100654061458ad46..5bc7fbae19ba4a3ca72de5bdb195bf8761fcc7dd 100644 (file)
@@ -1025,15 +1025,24 @@ public:
       }
    //@}
 
-   /// Begin selecting text.
-   void StartSelection(wxPoint cpos = wxPoint(-1,-1));
+   /// Begin selecting text
+   void StartSelection(const wxPoint& cpos = wxPoint(-1,-1),
+                       const wxPoint& spos = wxPoint(-1,-1));
    // Continue selecting text
-   void ContinueSelection(wxPoint cpos = wxPoint(-1,-1));
+   void ContinueSelection(const wxPoint& cpos = wxPoint(-1,-1),
+                          const wxPoint& spos = wxPoint(-1,-1));
    /// End selecting text.
-   void EndSelection(wxPoint cpos = wxPoint(-1,-1));
+   void EndSelection(const wxPoint& cpos = wxPoint(-1,-1),
+                     const wxPoint& spos = wxPoint(-1,-1));
+   /// Discard the current selection
+   void DiscardSelection();
    /// Are we still selecting text?
    bool IsSelecting(void);
+   /// Is the given point (text coords) selected?
    bool IsSelected(const wxPoint &cursor);
+   /// Do we have a non null selection?
+   bool HasSelection() const
+      { return m_Selection.m_valid || m_Selection.m_selecting; }
 
    /** Return the selection as a wxLayoutList.
        @param invalidate if true, the selection will be invalidated after this and can no longer be used.
@@ -1066,6 +1075,7 @@ public:
 #ifdef WXLAYOUT_DEBUG
    void Debug(void);
 #endif
+
 private:
    /// Clear the list.
    void InternalClear(void);
@@ -1094,12 +1104,22 @@ private:
 #endif // WXLAYOUT_USE_CARET
    //@}
 
-   /// A structure for the selection.
+   /// selection.state and begin/end coordinates
    struct Selection
    {
       Selection() { m_valid = false; m_selecting = false; }
       bool m_valid;
       bool m_selecting;
+
+      // returns true if we already have the screen coordinates of the
+      // selection start and end
+      bool HasValidScreenCoords() const
+          { return m_ScreenA.x != -1 && m_ScreenB.x != -1; }
+
+      // the start and end of the selection coordinates in pixels
+      wxPoint m_ScreenA, m_ScreenB;
+
+      // these coordinates are in text positions, not in pixels
       wxPoint m_CursorA, m_CursorB;
    } m_Selection;
    /** @name Font parameters. */
index 6d9bef9c8f77f7cabfebaca6b27d077d657007bc..5df8db37c5f5e1e9af0a2032300fbf910b339d08 100644 (file)
@@ -101,11 +101,17 @@ END_EVENT_TABLE()
 // ===========================================================================
 
 /* 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__
+
+#ifndef wxWANTS_CHARS
+   #define wxWANTS_CHARS 0
+#endif
 
 // ----------------------------------------------------------------------------
 // wxLayoutWindow
@@ -115,9 +121,8 @@ wxLayoutWindow::wxLayoutWindow(wxWindow *parent)
               : wxScrolledWindow(parent, -1,
                                  wxDefaultPosition, wxDefaultSize,
                                  wxHSCROLL | wxVSCROLL |
-                                 wxBORDER
-                                 //FIXME |wxWANTS_CHARS
-                 )
+                                 wxBORDER |
+                                 wxWANTS_CHARS)
 {
    SetStatusBar(NULL); // don't use statusbar
    m_Editable = false;
@@ -240,31 +245,41 @@ wxLayoutWindow::OnMouse(int eventId, wxMouseEvent& event)
       {
          if(! m_Selecting)
          {
-            m_llist->StartSelection();
+            m_llist->StartSelection(wxPoint(-1, -1), m_ClickPosition);
             m_Selecting = true;
-            DoPaint(FALSE);
+            DoPaint();  // TODO: we don't have to redraw everything!
          }
          else
          {
-            m_llist->ContinueSelection(cursorPos);
-            DoPaint(FALSE);
+            m_llist->ContinueSelection(cursorPos, m_ClickPosition);
+            DoPaint();  // TODO: we don't have to redraw everything!
          }
       }
       if(m_Selecting && ! event.LeftIsDown())
       {
-         m_llist->EndSelection(cursorPos);
+         m_llist->EndSelection(cursorPos, m_ClickPosition);
          m_Selecting = false;
-         DoPaint(FALSE);
+         DoPaint();     // TODO: we don't have to redraw everything!
       }
-      if(u) u->DecRef();
-      return;
-   }
 
-   // always move cursor to mouse click:
-   if(eventId == WXLOWIN_MENU_LCLICK)
+      if ( u )
+      {
+         u->DecRef();
+         u = NULL;
+      }
+   }
+   else if(eventId == WXLOWIN_MENU_LCLICK)
    {
+      // always move cursor to mouse click:
       m_llist->MoveCursorTo(cursorPos);
 
+      // clicking a mouse removes the selection
+      if ( m_llist->HasSelection() )
+      {
+         m_llist->DiscardSelection();
+         DoPaint();     // TODO: we don't have to redraw everything!
+      }
+
       // Calculate where the top of the visible area is:
       int x0, y0;
       ViewStart(&x0,&y0);
@@ -285,35 +300,35 @@ wxLayoutWindow::OnMouse(int eventId, wxMouseEvent& event)
 #endif // 0
 
 #ifdef __WXGTK__
-      DoPaint(FALSE); // DoPaint suppresses flicker under GTK
+      DoPaint(); // DoPaint suppresses flicker under GTK
 #endif // wxGTK
    }
 
-   if(!m_doSendEvents) // nothing to do
+   // notify about mouse events?
+   if( m_doSendEvents )
    {
-      if(u) u->DecRef();
-      return;
-   }
+      // only do the menu if activated, editable and not on a clickable object
+      if(eventId == WXLOWIN_MENU_RCLICK
+         && IsEditable()
+         && (! obj || u == NULL))
+      {
+         PopupMenu(m_PopupMenu, m_ClickPosition.x, m_ClickPosition.y);
+         if(u) u->DecRef();
+         return;
+      }
 
-   // only do the menu if activated, editable and not on a clickable object
-   if(eventId == WXLOWIN_MENU_RCLICK
-      && IsEditable()
-      && (! obj || u == NULL))
-   {
-      PopupMenu(m_PopupMenu, m_ClickPosition.x, m_ClickPosition.y);
-      if(u) u->DecRef();
-      return;
+      // find the object at this position
+      if(obj)
+      {
+         wxCommandEvent commandEvent(wxEVT_COMMAND_MENU_SELECTED, eventId);
+         commandEvent.SetEventObject( this );
+         commandEvent.SetClientData((char *)obj);
+         GetEventHandler()->ProcessEvent(commandEvent);
+      }
    }
 
-   if(u) u->DecRef();
-   // find the object at this position
-   if(obj)
-   {
-      wxCommandEvent commandEvent(wxEVT_COMMAND_MENU_SELECTED, eventId);
-      commandEvent.SetEventObject( this );
-      commandEvent.SetClientData((char *)obj);
-      GetEventHandler()->ProcessEvent(commandEvent);
-   }
+   if( u )
+      u->DecRef();
 }
 
 /*
@@ -669,9 +684,9 @@ wxLayoutWindow::InternalPaint(const wxRect *updateRect)
    m_memDC->SetPen(wxPen(m_llist->GetDefaultStyleInfo().GetBGColour(),
                          0,wxTRANSPARENT));
    m_memDC->SetLogicalFunction(wxCOPY);
+   m_memDC->Clear();
 
-   /* Either fill the background with the background bitmap, or clear
-      it. */
+   // fill the background with the background bitmap
    if(m_BGbitmap)
    {
       CoordType
@@ -683,15 +698,8 @@ wxLayoutWindow::InternalPaint(const wxRect *updateRect)
             m_memDC->DrawBitmap(*m_BGbitmap, x, y);
       m_memDC->SetBackgroundMode(wxTRANSPARENT);
    }
-   else
-   {
-      // clear the background: (must not be done if we use the update rectangle!)
-      m_memDC->SetBackgroundMode(wxSOLID);
-      m_memDC->DrawRectangle(0,0,x1, y1);
-   }
 
-   m_memDC->Clear();
-   /* This is the important bit: we tell the list to draw itself: */
+   // This is the important bit: we tell the list to draw itself
 #if WXLO_DEBUG_URECT
    if(updateRect)
    {
index f943c107736509766065f1e52b944aa95b4c8dff..7e4d0ce70fa1e2be36947ea95956f8714a817435 100644 (file)
@@ -89,7 +89,7 @@ public:
    inline int SetCursorVisibility(int visibility = -1)
       { int v =m_CursorVisibility;
       m_CursorVisibility = visibility; return v;}
-   
+
    /// Pastes text from clipboard.
    void Paste(void);
    /** Copies selection to clipboard.
@@ -102,14 +102,14 @@ public:
 
    bool Find(const wxString &needle,
              wxPoint * fromWhere = NULL);
-   
+
    void EnablePopup(bool enable = true) { m_DoPopupMenu = enable; }
 
    /** Sets the wrap margin.
        @param margin set this to 0 to disable it
    */
    void SetWrapMargin(CoordType margin) { m_WrapMargin = margin; }
-   
+
    /** Redraws the window.
        Internally, this stores the parameter and calls a refresh on
        wxMSW, draws directly on wxGTK.
@@ -172,7 +172,8 @@ public:
          m_StatusBar = bar; m_StatusFieldLabel = labelfield;
          m_StatusFieldCursor = cursorfield;
       }
-protected:   
+
+protected:
    /// generic function for mouse events processing
    void OnMouse(int eventId, wxMouseEvent& event);
    /// as the name says