+// ---------------------------------------------------------------------------
+// wxHtmlCell
+// Internal data structure. It represents fragments of parsed
+// HTML page - a word, picture, table, horizontal line and so
+// on. It is used by wxHtmlWindow to represent HTML page in
+// memory.
+// ---------------------------------------------------------------------------
+
+
+class WXDLLIMPEXP_HTML wxHtmlCell : public wxObject
+{
+public:
+ wxHtmlCell();
+ virtual ~wxHtmlCell();
+
+ void SetParent(wxHtmlContainerCell *p) {m_Parent = p;}
+ wxHtmlContainerCell *GetParent() const {return m_Parent;}
+
+ int GetPosX() const {return m_PosX;}
+ int GetPosY() const {return m_PosY;}
+ int GetWidth() const {return m_Width;}
+
+ // Returns the maximum possible length of the cell.
+ // Call Layout at least once before using GetMaxTotalWidth()
+ virtual int GetMaxTotalWidth() const { return m_Width; }
+
+ int GetHeight() const {return m_Height;}
+ int GetDescent() const {return m_Descent;}
+
+ void SetScriptMode(wxHtmlScriptMode mode, long previousBase);
+ wxHtmlScriptMode GetScriptMode() const { return m_ScriptMode; }
+ long GetScriptBaseline() { return m_ScriptBaseline; }
+
+ // Formatting cells are not visible on the screen, they only alter
+ // renderer's state.
+ bool IsFormattingCell() const { return m_Width == 0 && m_Height == 0; }
+
+ const wxString& GetId() const { return m_id; }
+ void SetId(const wxString& id) { m_id = id; }
+
+ // returns the link associated with this cell. The position is position
+ // within the cell so it varies from 0 to m_Width, from 0 to m_Height
+ virtual wxHtmlLinkInfo* GetLink(int WXUNUSED(x) = 0,
+ int WXUNUSED(y) = 0) const
+ { return m_Link; }
+
+ // Returns cursor to be used when mouse is over the cell, can be
+ // overridden by the derived classes to use a different cursor whenever the
+ // mouse is over this cell.
+ virtual wxCursor GetMouseCursor(wxHtmlWindowInterface *window) const;
+
+ // Returns cursor to be used when mouse is over the given point, can be
+ // overridden if the cursor should change depending on where exactly inside
+ // the cell the mouse is.
+ virtual wxCursor GetMouseCursorAt(wxHtmlWindowInterface *window,
+ const wxPoint& relPos) const;
+
+#if WXWIN_COMPATIBILITY_2_6
+ // this was replaced by GetMouseCursor, don't use in new code!
+ virtual wxCursor GetCursor() const;
+#endif
+
+ // return next cell among parent's cells
+ wxHtmlCell *GetNext() const {return m_Next;}
+ // returns first child cell (if there are any, i.e. if this is container):
+ virtual wxHtmlCell* GetFirstChild() const { return NULL; }
+
+ // members writing methods
+ virtual void SetPos(int x, int y) {m_PosX = x, m_PosY = y;}
+ void SetLink(const wxHtmlLinkInfo& link);
+ void SetNext(wxHtmlCell *cell) {m_Next = cell;}
+
+ // 1. adjust cell's width according to the fact that maximal possible width
+ // is w. (this has sense when working with horizontal lines, tables
+ // etc.)
+ // 2. prepare layout (=fill-in m_PosX, m_PosY (and sometime m_Height)
+ // members) = place items to fit window, according to the width w
+ virtual void Layout(int w);
+
+ // renders the cell
+ virtual void Draw(wxDC& WXUNUSED(dc),
+ int WXUNUSED(x), int WXUNUSED(y),
+ int WXUNUSED(view_y1), int WXUNUSED(view_y2),
+ wxHtmlRenderingInfo& WXUNUSED(info)) {}
+
+ // proceed drawing actions in case the cell is not visible (scrolled out of
+ // screen). This is needed to change fonts, colors and so on.
+ virtual void DrawInvisible(wxDC& WXUNUSED(dc),
+ int WXUNUSED(x), int WXUNUSED(y),
+ wxHtmlRenderingInfo& WXUNUSED(info)) {}
+
+ // This method returns pointer to the FIRST cell for that
+ // the condition
+ // is true. It first checks if the condition is true for this
+ // cell and then calls m_Next->Find(). (Note: it checks
+ // all subcells if the cell is container)
+ // Condition is unique condition identifier (see htmldefs.h)
+ // (user-defined condition IDs should start from 10000)
+ // and param is optional parameter
+ // Example : m_Cell->Find(wxHTML_COND_ISANCHOR, "news");
+ // returns pointer to anchor news
+ virtual const wxHtmlCell* Find(int condition, const void* param) const;
+
+
+ // This function is called when mouse button is clicked over the cell.
+ // Returns true if a link is clicked, false otherwise.
+ //
+ // 'window' is pointer to wxHtmlWindowInterface of the window which
+ // generated the event.
+ // HINT: if this handling is not enough for you you should use
+ // wxHtmlWidgetCell
+ virtual bool ProcessMouseClick(wxHtmlWindowInterface *window,
+ const wxPoint& pos,
+ const wxMouseEvent& event);
+
+#if WXWIN_COMPATIBILITY_2_6
+ // this was replaced by ProcessMouseClick, don't use in new code!
+ virtual void OnMouseClick(wxWindow *window,
+ int x, int y, const wxMouseEvent& event);
+#endif
+
+ // 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);
+};