- protected:
- int m_IndentLeft, m_IndentRight, m_IndentTop, m_IndentBottom;
- // indentation of subcells. There is always m_Indent pixels
- // big space between given border of the container and the subcells
- // it m_Indent < 0 it is in PERCENTS, otherwise it is in pixels
- int m_MinHeight, m_MinHeightAlign;
- // minimal height.
- int m_MaxLineWidth;
- // maximal widht of line. Filled during Layout()
- wxHtmlCell *m_Cells, *m_LastCell;
- // internal cells, m_Cells points to the first of them, m_LastCell to the last one.
- // (LastCell is needed only to speed-up InsertCell)
- int m_AlignHor, m_AlignVer;
- // alignment horizontal and vertical (left, center, right)
- int m_WidthFloat, m_WidthFloatUnits;
- // width float is used in adjustWidth
- bool m_UseBkColour;
- wxColour m_BkColour;
- // background color of this container
- bool m_UseBorder;
- wxColour m_BorderColour1, m_BorderColour2;
- // borders color of this container
-
- public:
- wxHtmlContainerCell(wxHtmlContainerCell *parent);
- ~wxHtmlContainerCell() {if (m_Cells) delete m_Cells;}
-
- virtual void Layout(int w);
- virtual void Draw(wxDC& dc, int x, int y, int view_y1, int view_y2);
- virtual void DrawInvisible(wxDC& dc, int x, int y);
- virtual bool AdjustPagebreak(int *pagebreak);
-
- void InsertCell(wxHtmlCell *cell);
- // insert cell at the end of m_Cells list
- void SetAlignHor(int al) {m_AlignHor = al;}
- int GetAlignHor() const {return m_AlignHor;}
- void SetAlignVer(int al) {m_AlignVer = al;}
- // sets horizontal/vertical alignment
- int GetAlignVer() const {return m_AlignVer;}
- void SetIndent(int i, int what, int units = HTML_UNITS_PIXELS);
- // sets left-border indentation. units is one of HTML_UNITS_* constants
- // what is combination of HTML_INDENT_*
- int GetIndent(int ind) const;
- // returns the indentation. ind is one of HTML_INDENT_* constants
- int GetIndentUnits(int ind) const;
- // returns type of value returned by GetIndent(ind)
- void SetAlign(const wxHtmlTag& tag);
- // sets alignment info based on given tag's params
- void SetWidthFloat(int w, int units) {m_WidthFloat = w; m_WidthFloatUnits = units;}
- void SetWidthFloat(const wxHtmlTag& tag);
- // sets floating width adjustment
- // (examples : 32 percent of parent container,
- // -15 pixels percent (this means 100 % - 15 pixels)
- void SetMinHeight(int h, int align = HTML_ALIGN_TOP) {m_MinHeight = h; m_MinHeightAlign = align;}
- // sets minimal height of this container.
- int GetMaxLineWidth() const {return m_MaxLineWidth;}
- // returns maximal line width in this container.
- // Call to this method is valid only after calling
- // Layout()
- void SetBackgroundColour(const wxColour& clr) {m_UseBkColour = TRUE; m_BkColour = clr;}
- void SetBorder(const wxColour& clr1, const wxColour& clr2) {m_UseBorder = TRUE; m_BorderColour1 = clr1, m_BorderColour2 = clr2;}
- virtual wxString GetLink(int x = 0, int y = 0) const;
- virtual const wxHtmlCell* Find(int condition, const void* param) const;
- virtual void OnMouseClick(wxWindow *parent, int x, int y, bool left, bool middle, bool right);
-
- wxHtmlCell* GetFirstCell() {return m_Cells;}
- // returns pointer to the first cell in container or NULL
+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:
+ virtual wxCursor GetMouseCursor(wxHtmlWindowInterface *window) 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,
+ wxArrayInt& known_pagebreaks) const;
+
+ // Sets cell's behaviour on pagebreaks (see AdjustPagebreak). Default
+ // is true - the cell can be split on two pages
+ 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)
+ long m_Width, m_Height, m_Descent;
+ // position where the fragment is drawn:
+ long 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)
+ DECLARE_NO_COPY_CLASS(wxHtmlCell)