-#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"/*ü*/),
-
- ESCSEQ("yuml", ""),
-
- /* this one should ALWAYS stay the last one!!! */
- ESCSEQ("amp", "&"),
-
- { NULL, NULL, NULL }
- };
-
- for (int i = 0; substitutions[i][0] != NULL; i++)
- {
- m_Word.Replace(substitutions[i][0], substitutions[i][2], TRUE);
- m_Word.Replace(substitutions[i][1], substitutions[i][2], TRUE);
+ 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(const 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, wxDefaultCoord) : selTo - GetAbsPos();
+
+ 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:
+#ifdef __WXMAC__
+ // implementation using PartialExtents to support fractional widths
+ wxArrayInt widths ;
+ dc.GetPartialTextExtents(m_Word,widths) ;
+ while( i < len && pt1.x >= widths[i] )
+ i++ ;
+#else // __WXMAC__
+ wxCoord charW, charH;
+ while ( pt1.x > 0 && i < len )
+ {
+ dc.GetTextExtent(m_Word[i], &charW, &charH);
+ pt1.x -= charW;
+ if ( pt1.x >= 0 )
+ {
+ pos1 += charW;
+ i++;
+ }
+ }
+#endif // __WXMAC__/!__WXMAC__
+
+ // in selection:
+ unsigned j = i;
+#ifdef __WXMAC__
+ while( j < len && pt2.x >= widths[j] )
+ j++ ;
+#else // __WXMAC__
+ 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++;