]> git.saurik.com Git - wxWidgets.git/blobdiff - src/html/htmlcell.cpp
implement button support for pre-XP systems (or with themes disabled); using only...
[wxWidgets.git] / src / html / htmlcell.cpp
index 8dbdc9e830f23f5063beca3f3ab6e08480b7dcdd..ac6f92f93fec918db05eb470f00077c9bcf1370c 100644 (file)
@@ -464,6 +464,8 @@ void wxHtmlWordCell::Split(const wxDC& dc,
 
     pos1 = i;
     pos2 = j;
 
     pos1 = i;
     pos2 = j;
+
+    wxASSERT( pos2 >= pos1 );
 }
 
 void wxHtmlWordCell::SetSelectionPrivPos(const wxDC& dc, wxHtmlSelection *s) const
 }
 
 void wxHtmlWordCell::SetSelectionPrivPos(const wxDC& dc, wxHtmlSelection *s) const
@@ -617,6 +619,17 @@ void wxHtmlWordCell::Draw(wxDC& dc, int x, int y,
     }
 }
 
     }
 }
 
+wxCursor wxHtmlWordCell::GetMouseCursor(wxHtmlWindowInterface *window) const
+{
+    if ( !GetLink() )
+    {
+        return window->GetHTMLCursor(wxHtmlWindowInterface::HTMLCursor_Text);
+    }
+    else
+    {
+        return wxHtmlCell::GetMouseCursor(window);
+    }
+}
 
 wxString wxHtmlWordCell::ConvertToText(wxHtmlSelection *s) const
 {
 
 wxString wxHtmlWordCell::ConvertToText(wxHtmlSelection *s) const
 {
@@ -634,29 +647,77 @@ wxString wxHtmlWordCell::ConvertToText(wxHtmlSelection *s) const
         // TODO: but this really needs to be fixed in some better way later...
         if ( priv != wxDefaultPosition )
         {
         // TODO: but this really needs to be fixed in some better way later...
         if ( priv != wxDefaultPosition )
         {
-            int part1 = priv.x;
-            int part2 = priv.y;
-            return m_Word.Mid(part1, part2-part1);
+            const int part1 = priv.x;
+            const int part2 = priv.y;
+            if ( part1 == part2 )
+                return wxEmptyString;
+            return GetPartAsText(part1, part2);
         }
         //else: return the whole word below
     }
 
         }
         //else: return the whole word below
     }
 
-    return m_Word;
+    return GetAllAsText();
 }
 
 }
 
-wxCursor wxHtmlWordCell::GetMouseCursor(wxHtmlWindowInterface *window) const
+wxString wxHtmlWordWithTabsCell::GetAllAsText() const
 {
 {
-    if ( !GetLink() )
+    return m_wordOrig;
+}
+
+wxString wxHtmlWordWithTabsCell::GetPartAsText(int begin, int end) const
+{
+    // NB: The 'begin' and 'end' positions are in the _displayed_ text
+    //     (stored in m_Word) and not in the text with tabs that should
+    //     be copied to clipboard (m_wordOrig).
+    //
+    // NB: Because selection is performed on displayed text, it's possible
+    //     to select e.g. "half of TAB character" -- IOW, 'begin' and 'end'
+    //     may be in the middle of TAB character expansion into ' 's. In this
+    //     case, we copy the TAB character to clipboard once.
+
+    wxASSERT( begin < end );
+
+    const unsigned SPACES_PER_TAB = 8;
+
+    wxString sel;
+
+    int pos = 0;
+    wxString::const_iterator i = m_wordOrig.begin();
+
+    // find the beginning of text to copy:
+    for ( ; pos < begin; ++i )
     {
     {
-        return window->GetHTMLCursor(wxHtmlWindowInterface::HTMLCursor_Text);
+        if ( *i == '\t' )
+        {
+            pos += 8 - (m_linepos + pos) % SPACES_PER_TAB;
+            if ( pos >= begin )
+            {
+                sel += '\t';
+            }
+        }
+        else
+        {
+            ++pos;
+        }
     }
     }
-    else
+
+    // copy the content until we reach 'end':
+    for ( ; pos < end; ++i )
     {
     {
-        return wxHtmlCell::GetMouseCursor(window);
+        const wxChar c = *i;
+        sel += c;
+
+        if ( c == '\t' )
+            pos += 8 - (m_linepos + pos) % SPACES_PER_TAB;
+        else
+            ++pos;
     }
     }
+
+    return sel;
 }
 
 
 }
 
 
+
 //-----------------------------------------------------------------------------
 // wxHtmlContainerCell
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 // wxHtmlContainerCell
 //-----------------------------------------------------------------------------
@@ -674,7 +735,7 @@ wxHtmlContainerCell::wxHtmlContainerCell(wxHtmlContainerCell *parent) : wxHtmlCe
     m_IndentLeft = m_IndentRight = m_IndentTop = m_IndentBottom = 0;
     m_WidthFloat = 100; m_WidthFloatUnits = wxHTML_UNITS_PERCENT;
     m_UseBkColour = false;
     m_IndentLeft = m_IndentRight = m_IndentTop = m_IndentBottom = 0;
     m_WidthFloat = 100; m_WidthFloatUnits = wxHTML_UNITS_PERCENT;
     m_UseBkColour = false;
-    m_UseBorder = false;
+    m_Border = 0;
     m_MinHeight = 0;
     m_MinHeightAlign = wxHTML_ALIGN_TOP;
     m_LastLayout = -1;
     m_MinHeight = 0;
     m_MinHeightAlign = wxHTML_ALIGN_TOP;
     m_LastLayout = -1;
@@ -755,7 +816,9 @@ void wxHtmlContainerCell::Layout(int w)
 {
     wxHtmlCell::Layout(w);
 
 {
     wxHtmlCell::Layout(w);
 
-    if (m_LastLayout == w) return;
+    if (m_LastLayout == w)
+        return;
+    m_LastLayout = w;
 
     // VS: Any attempt to layout with negative or zero width leads to hell,
     // but we can't ignore such attempts completely, since it sometimes
 
     // VS: Any attempt to layout with negative or zero width leads to hell,
     // but we can't ignore such attempts completely, since it sometimes
@@ -1011,8 +1074,6 @@ void wxHtmlContainerCell::Layout(int w)
     m_MaxTotalWidth += s_indent + ((m_IndentRight < 0) ? (-m_IndentRight * m_Width / 100) : m_IndentRight);
     MaxLineWidth += s_indent + ((m_IndentRight < 0) ? (-m_IndentRight * m_Width / 100) : m_IndentRight);
     if (m_Width < MaxLineWidth) m_Width = MaxLineWidth;
     m_MaxTotalWidth += s_indent + ((m_IndentRight < 0) ? (-m_IndentRight * m_Width / 100) : m_IndentRight);
     MaxLineWidth += s_indent + ((m_IndentRight < 0) ? (-m_IndentRight * m_Width / 100) : m_IndentRight);
     if (m_Width < MaxLineWidth) m_Width = MaxLineWidth;
-
-    m_LastLayout = w;
 }
 
 void wxHtmlContainerCell::UpdateRenderingStatePre(wxHtmlRenderingInfo& info,
 }
 
 void wxHtmlContainerCell::UpdateRenderingStatePre(wxHtmlRenderingInfo& info,
@@ -1063,8 +1124,9 @@ void wxHtmlContainerCell::Draw(wxDC& dc, int x, int y, int view_y1, int view_y2,
         dc.DrawRectangle(xlocal, real_y1, m_Width, real_y2 - real_y1 + 1);
     }
 
         dc.DrawRectangle(xlocal, real_y1, m_Width, real_y2 - real_y1 + 1);
     }
 
-    if (m_UseBorder)
+    if (m_Border == 1)
     {
     {
+        // draw thin border using lines 
         wxPen mypen1(m_BorderColour1, 1, wxPENSTYLE_SOLID);
         wxPen mypen2(m_BorderColour2, 1, wxPENSTYLE_SOLID);
 
         wxPen mypen1(m_BorderColour1, 1, wxPENSTYLE_SOLID);
         wxPen mypen2(m_BorderColour2, 1, wxPENSTYLE_SOLID);
 
@@ -1075,7 +1137,56 @@ void wxHtmlContainerCell::Draw(wxDC& dc, int x, int y, int view_y1, int view_y2,
         dc.DrawLine(xlocal + m_Width - 1, ylocal, xlocal +  m_Width - 1, ylocal + m_Height - 1);
         dc.DrawLine(xlocal, ylocal + m_Height - 1, xlocal + m_Width, ylocal + m_Height - 1);
     }
         dc.DrawLine(xlocal + m_Width - 1, ylocal, xlocal +  m_Width - 1, ylocal + m_Height - 1);
         dc.DrawLine(xlocal, ylocal + m_Height - 1, xlocal + m_Width, ylocal + m_Height - 1);
     }
-
+    else if (m_Border> 0)
+    {     
+        wxBrush mybrush1(m_BorderColour1, wxBRUSHSTYLE_SOLID);
+        wxBrush mybrush2(m_BorderColour2, wxBRUSHSTYLE_SOLID);
+        
+        // draw upper left corner
+        // 0---------------5
+        // |              /
+        // | 3-----------4
+        // | |
+        // | 2
+        // |/
+        // 1 
+
+        wxPoint poly[6];
+        poly[0].x =m_PosX; poly[0].y = m_PosY ;
+        poly[1].x =m_PosX; poly[1].y = m_PosY + m_Height;
+        poly[2].x =m_PosX + m_Border; poly[2].y = poly[1].y - m_Border;
+        poly[3].x =poly[2].x ; poly[3].y = m_PosY + m_Border;
+        poly[4].x =m_PosX + m_Width - m_Border; poly[4].y = poly[3].y;
+        poly[5].x =m_PosX + m_Width; poly[5].y = m_PosY;
+
+        dc.SetBrush(mybrush1);
+        dc.SetPen(*wxTRANSPARENT_PEN);
+        dc.DrawPolygon(6, poly, x, y);
+        
+        // draw lower right corner reusing point 1,2,4 and 5
+        //                 5
+        //                /|
+        //               4 |
+        //               | |
+        //   2-----------3 |
+        //  /              |
+        // 1---------------0
+        dc.SetBrush(mybrush2);
+        poly[0].x = poly[5].x; poly[0].y = poly[1].y;
+        poly[3].x = poly[4].x; poly[3].y = poly[2].y;
+        dc.DrawPolygon(6, poly, x, y);
+
+        // smooth color transition like firefox 
+        wxColour borderMediumColour(
+            (m_BorderColour1.Red() + m_BorderColour2.Red()) /2 ,
+            (m_BorderColour1.Green() + m_BorderColour2.Green()) /2 ,
+            (m_BorderColour1.Blue() + m_BorderColour2.Blue()) /2 
+            );
+        wxPen mypen3(borderMediumColour, 1, wxPENSTYLE_SOLID);
+        dc.SetPen(mypen3);
+        dc.DrawLines(2, &poly[1], x, y - 1); // between 1 and 2
+        dc.DrawLines(2, &poly[4], x, y - 1); // between 4 and 5
+    }
     if (m_Cells)
     {
         // draw container's contents:
     if (m_Cells)
     {
         // draw container's contents: