+ // This method used to adjust pagebreak position. The parameter is variable
+ // that contains y-coordinate of page break (= horizontal line that should
+ // not be crossed by words, images etc.). If this cell cannot be divided
+ // into two pieces (each one on another page) then it moves the pagebreak
+ // few pixels up.
+ //
+ // Returned value : true if pagebreak was modified, false otherwise
+ // Usage : while (container->AdjustPagebreak(&p)) {}
+ virtual bool AdjustPagebreak(int *pagebreak,
+ const wxArrayInt& known_pagebreaks,
+ int pageHeight) const;
+
+ // Sets cell's behaviour on pagebreaks (see AdjustPagebreak). Default
+ // is true - the cell can be split on two pages
+ // If there is no way to fit a cell in the current page size, the cell
+ // is always split, ignoring this setting.
+ void SetCanLiveOnPagebreak(bool can) { m_CanLiveOnPagebreak = can; }
+
+ // Can the line be broken before this cell?
+ virtual bool IsLinebreakAllowed() const
+ { return !IsFormattingCell(); }
+
+ // Returns true for simple == terminal cells, i.e. not composite ones.
+ // This if for internal usage only and may disappear in future versions!
+ virtual bool IsTerminalCell() const { return true; }
+
+ // Find a cell inside this cell positioned at the given coordinates
+ // (relative to this's positions). Returns NULL if no such cell exists.
+ // The flag can be used to specify whether to look for terminal or
+ // nonterminal cells or both. In either case, returned cell is deepest
+ // cell in cells tree that contains [x,y].
+ virtual wxHtmlCell *FindCellByPos(wxCoord x, wxCoord y,
+ unsigned flags = wxHTML_FIND_EXACT) const;
+
+ // Returns absolute position of the cell on HTML canvas.
+ // If rootCell is provided, then it's considered to be the root of the
+ // hierarchy and the returned value is relative to it.
+ wxPoint GetAbsPos(wxHtmlCell *rootCell = NULL) const;
+
+ // Returns root cell of the hierarchy (i.e. grand-grand-...-parent that
+ // doesn't have a parent itself)
+ wxHtmlCell *GetRootCell() const;
+
+ // Returns first (last) terminal cell inside this cell. It may return NULL,
+ // but it is rare -- only if there are no terminals in the tree.
+ virtual wxHtmlCell *GetFirstTerminal() const
+ { return wxConstCast(this, wxHtmlCell); }
+ virtual wxHtmlCell *GetLastTerminal() const
+ { return wxConstCast(this, wxHtmlCell); }
+
+ // Returns cell's depth, i.e. how far under the root cell it is
+ // (if it is the root, depth is 0)
+ unsigned GetDepth() const;
+
+ // Returns true if the cell appears before 'cell' in natural order of
+ // cells (= as they are read). If cell A is (grand)parent of cell B,
+ // then both A.IsBefore(B) and B.IsBefore(A) always return true.
+ bool IsBefore(wxHtmlCell *cell) const;
+
+ // Converts the cell into text representation. If sel != NULL then
+ // only part of the cell inside the selection is converted.
+ virtual wxString ConvertToText(wxHtmlSelection *WXUNUSED(sel)) const
+ { return wxEmptyString; }
+
+protected:
+ // pointer to the next cell
+ wxHtmlCell *m_Next;
+ // pointer to parent cell
+ wxHtmlContainerCell *m_Parent;
+
+ // dimensions of fragment (m_Descent is used to position text & images)
+ int m_Width, m_Height, m_Descent;
+ // position where the fragment is drawn:
+ int m_PosX, m_PosY;
+
+ // superscript/subscript/normal:
+ wxHtmlScriptMode m_ScriptMode;
+ long m_ScriptBaseline;
+
+ // destination address if this fragment is hypertext link, NULL otherwise
+ wxHtmlLinkInfo *m_Link;
+ // true if this cell can be placed on pagebreak, false otherwise
+ bool m_CanLiveOnPagebreak;
+ // unique identifier of the cell, generated from "id" property of tags
+ wxString m_id;
+
+ DECLARE_ABSTRACT_CLASS(wxHtmlCell)
+ wxDECLARE_NO_COPY_CLASS(wxHtmlCell);
+};
+
+
+
+
+// ----------------------------------------------------------------------------
+// Inherited cells:
+// ----------------------------------------------------------------------------
+
+
+// ----------------------------------------------------------------------------
+// wxHtmlWordCell
+// Single word in input stream.
+// ----------------------------------------------------------------------------
+
+class WXDLLIMPEXP_HTML wxHtmlWordCell : public wxHtmlCell
+{
+public:
+ wxHtmlWordCell(const wxString& word, const wxDC& dc);
+ void Draw(wxDC& dc, int x, int y, int view_y1, int view_y2,
+ wxHtmlRenderingInfo& info);
+ virtual wxCursor GetMouseCursor(wxHtmlWindowInterface *window) const;
+ virtual wxString ConvertToText(wxHtmlSelection *sel) const;
+ bool IsLinebreakAllowed() const { return m_allowLinebreak; }
+
+ void SetPreviousWord(wxHtmlWordCell *cell);
+
+protected:
+ virtual wxString GetAllAsText() const
+ { return m_Word; }
+ virtual wxString GetPartAsText(int begin, int end) const
+ { return m_Word.Mid(begin, end - begin); }
+
+ void SetSelectionPrivPos(const wxDC& dc, wxHtmlSelection *s) const;
+ void Split(const wxDC& dc,
+ const wxPoint& selFrom, const wxPoint& selTo,
+ unsigned& pos1, unsigned& pos2) const;
+
+ wxString m_Word;
+ bool m_allowLinebreak;
+
+ DECLARE_ABSTRACT_CLASS(wxHtmlWordCell)
+ wxDECLARE_NO_COPY_CLASS(wxHtmlWordCell);
+};
+
+
+// wxHtmlWordCell specialization for storing text fragments with embedded
+// '\t's; these differ from normal words in that the displayed text is
+// different from the text copied to clipboard
+class WXDLLIMPEXP_HTML wxHtmlWordWithTabsCell : public wxHtmlWordCell