]> git.saurik.com Git - wxWidgets.git/commitdiff
Selection marking seems fine now.
authorKarsten Ballüder <ballueder@usa.net>
Sun, 9 May 1999 17:28:58 +0000 (17:28 +0000)
committerKarsten Ballüder <ballueder@usa.net>
Sun, 9 May 1999 17:28:58 +0000 (17:28 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@2377 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

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

index c7d98309d9696ff41e7381807cc38654961784c3..9a67134f9c80b00bcd5eee96d5b01ea1b03b9540 100644 (file)
@@ -110,21 +110,6 @@ bool Contains(const wxRect &r, const wxPoint &p)
 }
 
 
-/// Starts highlighting the selection
-static
-inline void StartHighlighting(wxDC &dc)
-{
-   dc.SetBrush(*wxBLACK_BRUSH);
-   dc.SetPen(wxPen(*wxBLACK,1,wxSOLID));
-   dc.SetLogicalFunction(wxINVERT);
-}
-
-/// Ends highlighting the selection
-static
-inline void EndHighlighting(wxDC &dc)
-{
-   dc.SetLogicalFunction(wxCOPY);
-}
 //@}
 
 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
@@ -164,6 +149,7 @@ wxLayoutObjectText::GetSize(CoordType *top, CoordType *bottom) const
 
 void
 wxLayoutObjectText::Draw(wxDC &dc, wxPoint const &coords,
+                         wxLayoutList *wxllist,
                          CoordType begin, CoordType end)
 {
    if(begin == -1)
@@ -181,12 +167,12 @@ wxLayoutObjectText::Draw(wxDC &dc, wxPoint const &coords,
       dc.DrawText(str, xpos, ypos);
       dc.GetTextExtent(str, &width, &height, &descent);
       xpos += width;
-      StartHighlighting(dc);
+      wxllist->StartHighlighting(dc);
       str = m_Text.Mid(begin, end-begin);
       dc.DrawText(str, xpos, ypos);
       dc.GetTextExtent(str, &width, &height, &descent);
       xpos += width;
-      dc.SetLogicalFunction(wxCOPY);
+      wxllist->EndHighlighting(dc);
       str = m_Text.Mid(end, m_Text.Length()-end);
       dc.DrawText(str, xpos, ypos);
    }
@@ -263,11 +249,9 @@ wxLayoutObjectIcon::wxLayoutObjectIcon(wxBitmap *icon)
 
 void
 wxLayoutObjectIcon::Draw(wxDC &dc, wxPoint const &coords,
+                         wxLayoutList *wxllist,
                          CoordType begin, CoordType /* len */)
 {
-   if(begin == 0)
-      StartHighlighting(dc);
-   
    dc.DrawBitmap(*m_Icon, coords.x, coords.y-m_Icon->GetHeight(),
                  (m_Icon->GetMask() == NULL) ? FALSE : TRUE);
 }
@@ -341,6 +325,7 @@ wxLayoutObjectCmd::GetStyle(wxLayoutStyleInfo *si) const
 
 void
 wxLayoutObjectCmd::Draw(wxDC &dc, wxPoint const & /* coords */,
+                        wxLayoutList *wxllist,
                         CoordType begin, CoordType /* len */)
 {
    wxASSERT(m_font);
@@ -353,7 +338,7 @@ void
 wxLayoutObjectCmd::Layout(wxDC &dc)
 {
    // this get called, so that recalculation uses right font sizes
-   Draw(dc, wxPoint(0,0));
+   Draw(dc, wxPoint(0,0), NULL);
 }
 
 
@@ -687,9 +672,9 @@ wxLayoutLine::Draw(wxDC &dc,
    CoordType from, to, tempto;
    int highlight = llist->IsSelected(this, &from, &to);
    if(highlight == 1) // we need to draw the whole line inverted!
-      StartHighlighting(dc);
+      llist->StartHighlighting(dc);
    else
-      EndHighlighting(dc);
+      llist->EndHighlighting(dc);
 
    for(i = m_ObjectList.begin(); i != NULLIT; i++)
    {
@@ -697,18 +682,23 @@ wxLayoutLine::Draw(wxDC &dc,
       {
          // parts of the line need highlighting
          tempto = xpos+(**i).GetLength();
-         if(tempto >= from && tempto <= to)
+         if(tempto >= from && xpos <= to)
          {
             tempto = to-xpos;
             if(tempto > (**i).GetLength())
                tempto = (**i).GetLength();
-            (**i).Draw(dc, pos, from-xpos, to);
+            CoordType tmp = from-xpos;
+            if(tmp < 0) tmp = 0;
+            (**i).Draw(dc, pos, llist, from-xpos, to);
          }
          else
-            EndHighlighting(dc);
+         {
+            llist->EndHighlighting(dc); // FIXME! inefficient
+            (**i).Draw(dc, pos, llist);
+         }
       }
       else
-         (**i).Draw(dc, pos);
+         (**i).Draw(dc, pos, llist);
       pos.x += (**i).GetWidth();
       xpos += (**i).GetLength();
    }
@@ -1418,7 +1408,7 @@ wxLayoutList::Draw(wxDC &dc,
    wxLayoutLine *line = m_FirstLine;
 
    Layout(dc, bottom);
-   m_DefaultSetting->Draw(dc, wxPoint(0,0));
+   m_DefaultSetting->Draw(dc, wxPoint(0,0), this);
    wxBrush brush(m_ColourBG, wxSOLID);
    dc.SetBrush(brush);
    
@@ -1436,6 +1426,11 @@ wxLayoutList::Draw(wxDC &dc,
                                     m_CursorLine->GetNextLine() == NULL &&
                                     m_CursorLine == m_FirstLine));
    InvalidateUpdateRect();
+
+   wxLogDebug("Selection is %s : l%d,%ld/%ld,%ld",
+              m_Selection.m_valid ? "valid" : "invalid",
+              m_Selection.m_CursorA.x, m_Selection.m_CursorA.y,
+              m_Selection.m_CursorB.x, m_Selection.m_CursorB.y);
 }
 
 wxLayoutObject *
@@ -1550,13 +1545,12 @@ wxLayoutList::StartSelection(void)
 }
 
 void
-wxLayoutList::EndSelection(void)
+wxLayoutList::ContinueSelection(void)
 {
-   wxLogDebug("Ending selection at %ld/%ld", m_CursorPos.x, m_CursorPos.y);
+   wxASSERT(m_Selection.m_selecting == true);
+   wxASSERT(m_Selection.m_valid == false);
+   wxLogDebug("Continuing selection at %ld/%ld", m_CursorPos.x, m_CursorPos.y);
    m_Selection.m_CursorB = m_CursorPos;
-   m_Selection.m_selecting = false;
-   m_Selection.m_valid = true;
-
    // We always want m_CursorA <= m_CursorB!
    if(! (m_Selection.m_CursorA <= m_Selection.m_CursorB))
    {
@@ -1566,6 +1560,16 @@ wxLayoutList::EndSelection(void)
    }
 }
 
+void
+wxLayoutList::EndSelection(void)
+{
+   ContinueSelection();
+   wxLogDebug("Ending selection at %ld/%ld", m_CursorPos.x, m_CursorPos.y);
+   m_Selection.m_selecting = false;
+   m_Selection.m_valid = true;
+}
+
+
 bool
 wxLayoutList::IsSelecting(void)
 {
@@ -1575,6 +1579,8 @@ wxLayoutList::IsSelecting(void)
 bool
 wxLayoutList::IsSelected(const wxPoint &cursor)
 {
+   if(! m_Selection.m_valid && ! m_Selection.m_selecting)
+      return false;
    return m_Selection.m_CursorA <= cursor
       && cursor <= m_Selection.m_CursorB;
 }
@@ -1592,6 +1598,9 @@ wxLayoutList::IsSelected(const wxLayoutLine *line, CoordType *from,
 {
    wxASSERT(line); wxASSERT(to); wxASSERT(from);
 
+   if(! m_Selection.m_valid && ! m_Selection.m_selecting)
+      return 0;
+
    CoordType y = line->GetLineNumber();
    if(m_Selection.m_CursorA.y < y && m_Selection.m_CursorB.y > y)
       return 1;
@@ -1617,6 +1626,24 @@ wxLayoutList::IsSelected(const wxLayoutLine *line, CoordType *from,
       return 0;
 }
 
+
+/// Starts highlighting the selection
+void
+wxLayoutList::StartHighlighting(wxDC &dc)
+{
+   dc.SetTextForeground(m_ColourBG);
+   dc.SetTextBackground(m_ColourFG);
+}
+
+/// Ends highlighting the selection
+void
+wxLayoutList::EndHighlighting(wxDC &dc)
+{
+   dc.SetTextForeground(m_ColourFG);
+   dc.SetTextBackground(m_ColourBG);
+}
+
+
 #ifdef WXLAYOUT_DEBUG
 
 void
index 7efc86c6879b242bc0bddce448bd653b7cc28c61..fd2d2807c674bc16b637dd6d0018ce6db72d8c3f 100644 (file)
@@ -111,11 +111,13 @@ public:
    /** Draws an object.
        @param dc the wxDC to draw on
        @param coords where to draw the baseline of the object.
+       @param wxllist pointer to wxLayoutList
        @param begin if !=-1, from which position on to highlight it
        @param end if begin !=-1, how many positions to highlight it
    */
    virtual void Draw(wxDC & /* dc */,
                      wxPoint const & /* coords */,
+                     class wxLayoutList *wxllist,
                      CoordType begin = -1,
                      CoordType end = -1)  { }
 
@@ -193,6 +195,7 @@ public:
    virtual wxLayoutObjectType GetType(void) const { return WXLO_TYPE_TEXT; }
    virtual void Layout(wxDC &dc);
    virtual void Draw(wxDC &dc, wxPoint const &coords,
+                     class wxLayoutList *wxllist,
                      CoordType begin = -1,
                      CoordType end = -1);
    /** Calculates and returns the size of the object. 
@@ -252,6 +255,7 @@ public:
    virtual wxLayoutObjectType GetType(void) const { return WXLO_TYPE_ICON; }
    virtual void Layout(wxDC &dc);
    virtual void Draw(wxDC &dc, wxPoint const &coords,
+                     class wxLayoutList *wxllist,
                      CoordType begin = -1,
                      CoordType end = -1);
 
@@ -298,6 +302,7 @@ public:
    virtual wxLayoutObjectType GetType(void) const { return WXLO_TYPE_CMD; }
    virtual void Layout(wxDC &dc);
    virtual void Draw(wxDC &dc, wxPoint const &coords,
+                     class wxLayoutList *wxllist,
                      CoordType begin = -1,
                      CoordType end = -1);
    wxLayoutObjectCmd(int size, int family, int style, int weight,
@@ -825,12 +830,19 @@ public:
 
    /// Begin selecting text.
    void StartSelection(void);
+   // Continue selecting text
+   void ContinueSelection(void);
    /// End selecting text.
    void EndSelection(void);
    /// Are we still selecting text?
    bool IsSelecting(void);
    bool IsSelected(const wxPoint &cursor);
 
+   /// starts highlighting of text for selections
+   void StartHighlighting(wxDC &dc);
+   /// ends highlighting of text for selections
+   void EndHighlighting(wxDC &dc);
+   
    /** Tests whether this layout line is selected and needs
        highlighting.
        @param line to test for
index 804805cd6002fb2d540f69f65ae7df8ea67ddf77..5b32988c652a73dbaf6084dba0b7addbf610d8a2 100644 (file)
@@ -158,12 +158,13 @@ wxLayoutExportStatus::wxLayoutExportStatus(wxLayoutList *list,
    m_fromPos = fromPos;
    m_toPos = toPos;
 
-   if(m_fromPos != wxLayoutExportNoPosition)
+   if(m_fromPos.x != -1)
    {
-      while(m_line && (*m_line)->GetLineNumber() != m_fromPos.y)
-         m_line->GetNextLine();
+      while(m_line && m_line->GetLineNumber() != m_fromPos.y)
+         m_line = m_line->GetNextLine();
       wxASSERT(m_line);
-      m_iterator = (**i).FindObject(fromPos.x);
+      CoordType dummy;
+      m_iterator = m_line->FindObject(fromPos.x, &dummy);
    }
 }
    
index 1c4564756317a63cd1986ad132747d4e16cc9d47..ac9c213c626ac56dd784a878e65adeb89c9dc2a9 100644 (file)
@@ -207,21 +207,55 @@ wxLayoutWindow::OnChar(wxKeyEvent& event)
    }
 #endif
    
-   if(!IsEditable()) // do nothing
+   long keyCode = event.KeyCode();
+   if(m_Selecting && ! event.ShiftDown())
    {
-      event.Skip();
-      return;
+      m_llist->EndSelection();
+      m_Selecting = false;
    }
-   
-   long keyCode = event.KeyCode();
-   if(event.ShiftDown())
-      m_Selecting = true;
    else
+      if(! m_Selecting && event.ShiftDown())
+      {
+         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:
+            m_Selecting = true;
+            m_llist->StartSelection();
+            break;
+         default:
+            ;
+         }
+      }
+   
+   if(!IsEditable()) // do nothing
    {
-      if(m_Selecting)
-         m_llist->EndSelection();
-      m_Selecting = false;
+      switch(keyCode)
+      {
+      case WXK_UP:
+         m_llist->MoveCursorVertically(-1);
+         break;
+      case WXK_DOWN:
+         m_llist->MoveCursorVertically(1);
+         break;
+      case WXK_PRIOR:
+         m_llist->MoveCursorVertically(-20);
+         break;
+      case WXK_NEXT:
+         m_llist->MoveCursorVertically(20);
+         break;
+      default:
+         ;
+      }
+      return;
    }
+   
    /* First, handle control keys */
    if(event.ControlDown() && ! event.AltDown())
    {
@@ -271,35 +305,27 @@ wxLayoutWindow::OnChar(wxKeyEvent& event)
       switch(keyCode)
       {
       case WXK_RIGHT:
-         if(m_Selecting) m_llist->StartSelection();
          m_llist->MoveCursorHorizontally(1);
          break;
       case WXK_LEFT:
-         if(m_Selecting) m_llist->StartSelection();
          m_llist->MoveCursorHorizontally(-1);
          break;
       case WXK_UP:
-         if(m_Selecting) m_llist->StartSelection();
          m_llist->MoveCursorVertically(-1);
          break;
       case WXK_DOWN:
-         if(m_Selecting) m_llist->StartSelection();
          m_llist->MoveCursorVertically(1);
          break;
       case WXK_PRIOR:
-         if(m_Selecting) m_llist->StartSelection();
          m_llist->MoveCursorVertically(-20);
          break;
       case WXK_NEXT:
-         if(m_Selecting) m_llist->StartSelection();
          m_llist->MoveCursorVertically(20);
          break;
       case WXK_HOME:
-         if(m_Selecting) m_llist->StartSelection();
          m_llist->MoveCursorToBeginOfLine();
          break;
       case WXK_END:
-         if(m_Selecting) m_llist->StartSelection();
          m_llist->MoveCursorToEndOfLine();
          break;
       case WXK_DELETE :
@@ -441,7 +467,6 @@ wxLayoutWindow::InternalPaint(const wxRect *updateRect)
    // Device origins on the memDC are suspect, we translate manually
    // with the translate parameter of Draw().
    m_memDC->SetDeviceOrigin(0,0);
-   m_memDC->SetBackgroundMode(wxTRANSPARENT);
    m_memDC->SetBrush(wxBrush(m_llist->GetDefaults()->GetBGColour(), wxSOLID));                                  
    m_memDC->SetPen(wxPen(m_llist->GetDefaults()->GetBGColour(),0,wxTRANSPARENT));                               
    m_memDC->SetLogicalFunction(wxCOPY);
@@ -454,10 +479,13 @@ wxLayoutWindow::InternalPaint(const wxRect *updateRect)
       for(y = 0; y < y1; y+=h)
          for(x = 0; x < x1; x+=w)
             m_memDC->DrawBitmap(*m_BGbitmap, x, y);
+      m_memDC->SetBackgroundMode(wxTRANSPARENT);
    }
    else
+   {
+      m_memDC->SetBackgroundMode(wxSOLID);
       m_memDC->DrawRectangle(0,0,x1, y1);
-
+   }
 
    
    /* This is the important bit: we tell the list to draw itself: */