-#define ESCSEQ(escape, subst) \
- { _T("&") _T(escape) _T(";"), _T("&") _T(escape) _T(" "), _T(subst) }
- static wxChar* substitutions[][3] =
- {
- ESCSEQ("quot", "\""),
- ESCSEQ("lt", "<"),
- ESCSEQ("gt", ">"),
-
- ESCSEQ("nbsp", " "),
- ESCSEQ("iexcl", "!"),
- ESCSEQ("cent", "\242"/*¢*/),
-
- ESCSEQ("yen", " "),
- ESCSEQ("brkbar", " "),
- ESCSEQ("sect", " "),
- ESCSEQ("uml", " "),
-
- ESCSEQ("copy", "(c)"),
- ESCSEQ("ordf", " "),
- ESCSEQ("laquo", " "),
- ESCSEQ("not", " "),
-
- ESCSEQ("reg", "(r)"),
-
- ESCSEQ("deg", " "),
- ESCSEQ("plusm", " "),
-
- ESCSEQ("acute", " "),
- ESCSEQ("micro", " "),
- ESCSEQ("para", " "),
-
- ESCSEQ("ordm", " "),
- ESCSEQ("raquo", " "),
-
- ESCSEQ("iquest", " "),
- ESCSEQ("Agrave", "\300"/*À*/),
-
- ESCSEQ("Acirc", "\302"/*Â*/),
- ESCSEQ("Atilde", "\303"/*Ã*/),
- ESCSEQ("Auml", "\304"/*Ä*/),
- ESCSEQ("Aring", " "),
- ESCSEQ("AElig", " "),
- ESCSEQ("Ccedil", "\347"/*ç*/),
- ESCSEQ("Egrave", "\310"/*È*/),
- ESCSEQ("Eacute", "\311"/*É*/),
- ESCSEQ("Ecirc", "\312"/*Ê*/),
- ESCSEQ("Euml", "\313"/*Ë*/),
- ESCSEQ("Igrave", "\314"/*Ì*/),
-
- ESCSEQ("Icirc", "\316"/*Î*/),
- ESCSEQ("Iuml", "\317"/*Ï*/),
-
- ESCSEQ("Ntilde", "\321"/*Ñ*/),
- ESCSEQ("Ograve", "\322"/*Ò*/),
-
- ESCSEQ("Ocirc", "\324"/*Ô*/),
- ESCSEQ("Otilde", "\325"/*Õ*/),
- ESCSEQ("Ouml", "\326"/*Ö*/),
-
- ESCSEQ("Oslash", " "),
- ESCSEQ("Ugrave", "\331"/*Ù*/),
-
- ESCSEQ("Ucirc", " "),
- ESCSEQ("Uuml", "\334"/*Ü*/),
-
- ESCSEQ("szlig", "\247"/*§*/),
- ESCSEQ("agrave;","à"),
- ESCSEQ("aacute", "\341"/*á*/),
- ESCSEQ("acirc", "\342"/*â*/),
- ESCSEQ("atilde", "\343"/*ã*/),
- ESCSEQ("auml", "\344"/*ä*/),
- ESCSEQ("aring", "a"),
- ESCSEQ("aelig", "ae"),
- ESCSEQ("ccedil", "\347"/*ç*/),
- ESCSEQ("egrave", "\350"/*è*/),
- ESCSEQ("eacute", "\351"/*é*/),
- ESCSEQ("ecirc", "\352"/*ê*/),
- ESCSEQ("euml", "\353"/*ë*/),
- ESCSEQ("igrave", "\354"/*ì*/),
- ESCSEQ("iacute", "\355"/*í*/),
- ESCSEQ("icirc", " "),
- ESCSEQ("iuml", "\357"/*ï*/),
- ESCSEQ("eth", " "),
- ESCSEQ("ntilde", "\361"/*ñ*/),
- ESCSEQ("ograve", "\362"/*ò*/),
- ESCSEQ("oacute", "\363"/*ó*/),
- ESCSEQ("ocirc", "\364"/*ô*/),
- ESCSEQ("otilde", "\365"/*õ*/),
- ESCSEQ("ouml", "\366"/*ö*/),
- ESCSEQ("divide", " "),
- ESCSEQ("oslash", " "),
- ESCSEQ("ugrave", "\371"/*ù*/),
- ESCSEQ("uacute", "\372"/*ú*/),
- ESCSEQ("ucirc", "\373"/*û*/),
- ESCSEQ("uuml", "\374"/*ü*/),
+ m_allowLinebreak = false;
+ }
+}
+
+// Splits m_Word into up to three parts according to selection, returns
+// substring before, in and after selection and the points (in relative coords)
+// where s2 and s3 start:
+void wxHtmlWordCell::Split(wxDC& dc,
+ const wxPoint& selFrom, const wxPoint& selTo,
+ unsigned& pos1, unsigned& pos2) const
+{
+ wxPoint pt1 = (selFrom == wxDefaultPosition) ?
+ wxDefaultPosition : selFrom - GetAbsPos();
+ wxPoint pt2 = (selTo == wxDefaultPosition) ?
+ wxPoint(m_Width, -1) : selTo - GetAbsPos();
+
+ wxCoord charW, charH;
+ unsigned len = m_Word.length();
+ unsigned i = 0;
+ pos1 = 0;
+
+ // adjust for cases when the start/end position is completely
+ // outside the cell:
+ if ( pt1.y < 0 )
+ pt1.x = 0;
+ if ( pt2.y >= m_Height )
+ pt2.x = m_Width;
+
+ // before selection:
+ while ( pt1.x > 0 && i < len )
+ {
+ dc.GetTextExtent(m_Word[i], &charW, &charH);
+ pt1.x -= charW;
+ if ( pt1.x >= 0 )
+ {
+ pos1 += charW;
+ i++;
+ }
+ }
+
+ // in selection:
+ unsigned j = i;
+ pos2 = pos1;
+ pt2.x -= pos2;
+ while ( pt2.x > 0 && j < len )
+ {
+ dc.GetTextExtent(m_Word[j], &charW, &charH);
+ pt2.x -= charW;
+ if ( pt2.x >= 0 )
+ {
+ pos2 += charW;
+ j++;
+ }
+ }
+
+ pos1 = i;
+ pos2 = j;
+}
+
+void wxHtmlWordCell::SetSelectionPrivPos(wxDC& dc, wxHtmlSelection *s) const
+{
+ unsigned p1, p2;
+
+ Split(dc,
+ this == s->GetFromCell() ? s->GetFromPos() : wxDefaultPosition,
+ this == s->GetToCell() ? s->GetToPos() : wxDefaultPosition,
+ p1, p2);
+
+ wxPoint p(0, m_Word.length());
+
+ if ( this == s->GetFromCell() )
+ p.x = p1; // selection starts here
+ if ( this == s->GetToCell() )
+ p.y = p2; // selection ends here
+
+ if ( this == s->GetFromCell() )
+ s->SetFromPrivPos(p);
+ if ( this == s->GetToCell() )
+ s->SetToPrivPos(p);
+}
+
+
+static void SwitchSelState(wxDC& dc, wxHtmlRenderingInfo& info,
+ bool toSelection)
+{
+ wxColour fg = info.GetState().GetFgColour();
+ wxColour bg = info.GetState().GetBgColour();
+
+ if ( toSelection )
+ {
+ dc.SetBackgroundMode(wxSOLID);
+ dc.SetTextForeground(info.GetStyle().GetSelectedTextColour(fg));
+ dc.SetTextBackground(info.GetStyle().GetSelectedTextBgColour(bg));
+ dc.SetBackground(wxBrush(info.GetStyle().GetSelectedTextBgColour(bg),
+ wxSOLID));
+ }
+ else
+ {
+ dc.SetBackgroundMode(wxTRANSPARENT);
+ dc.SetTextForeground(fg);
+ dc.SetTextBackground(bg);
+ dc.SetBackground(wxBrush(bg, wxSOLID));
+ }
+}
+
+
+void wxHtmlWordCell::Draw(wxDC& dc, int x, int y,
+ int WXUNUSED(view_y1), int WXUNUSED(view_y2),
+ wxHtmlRenderingInfo& info)
+{
+#if 0 // useful for debugging
+ dc.SetPen(*wxBLACK_PEN);
+ dc.DrawRectangle(x+m_PosX,y+m_PosY,m_Width,m_Height);
+#endif
+
+ bool drawSelectionAfterCell = false;