wxHtmlWindow::OnLinkClicked and wxHtmlCell::Get/SetLink and wxHtmlWinParser::GetSetLink now work with wxHtmlLinkInfo instead of wxString (making it ready for frames)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5092 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Václav Slavík 1999-12-23 21:12:23 +00:00
parent f2c2fa4d62
commit 846914d18d
12 changed files with 156 additions and 47 deletions

View File

@ -103,6 +103,7 @@
\input hthelpct.tex
\input hthlpdat.tex
\input hthlpfrm.tex
\input htlnkinf.tex
\input htparser.tex
\input htprint.tex
\input httag.tex

View File

@ -129,9 +129,10 @@ Returns height of the cell (m_Height member).
\membersection{wxHtmlCell::GetLink}\label{wxhtmlcellgetlink}
\constfunc{virtual wxString}{GetLink}{\param{int }{x = 0}, \param{int }{y = 0}}
\constfunc{virtual wxHtmlLinkInfo*}{GetLink}{\param{int }{x = 0}, \param{int }{y = 0}}
Returns hypertext link if associated with this cell or empty string otherwise.
Returns hypertext link if associated with this cell or NULL otherwise.
See \helpref{wxHtmlLinkInfo}{wxhtmllinkinfo}.
(Note: this makes sense only for visible tags).
\wxheading{Parameters}
@ -216,10 +217,10 @@ button is pressed, FALSE otherwise}
\membersection{wxHtmlCell::SetLink}\label{wxhtmlcellsetlink}
\func{void}{SetLink}{\param{const wxString\& }{link}}
\func{void}{SetLink}{\param{const wxHtmlLinkInfo\& }{link}}
Sets the hypertext link asocciated with this cell. (Default value
is wxEmptyString (no link))
is \helpref{wxHtmlLinkInfo}{wxhtmllinkinfo}("", "") (no link))
\membersection{wxHtmlCell::SetNext}\label{wxhtmlcellsetnext}

View File

@ -0,0 +1,48 @@
%
% automatically generated by HelpGen from
% x.h at 23/Dec/99 21:30:20
%
\section{\class{wxHtmlLinkInfo}}\label{wxhtmllinkinfo}
This class stores all neccessary information about hypertext
links (as represented by {\tt <A>} tag in HTML documents). In
current implementation it stores URL and target frame name.
{\it Note that frames are not currently supported by wxHTML!}
\wxheading{Derived from}
\helpref{wxObject}{wxobject}
\latexignore{\rtfignore{\wxheading{Members}}}
\membersection{wxHtmlLinkInfo::wxHtmlLinkInfo}\label{wxhtmllinkinfowxhtmllinkinfo}
\func{}{wxHtmlLinkInfo}{\void}
Default ctor.
\membersection{wxHtmlLinkInfo::wxHtmlLinkInfo}\label{wxhtmllinkinfowxhtmllinkinfo}
\func{}{wxHtmlLinkInfo}{\param{const wxString\& }{href}, \param{const wxString\& }{target = wxEmptyString}}
Construct hypertext link from HREF (aka URL) and TARGET (name of target
frame).
\membersection{wxHtmlLinkInfo::GetHref}\label{wxhtmllinkinfogethref}
\func{wxString}{GetHref}{\void}
Returns {\it HREF} value of the {\tt <A>} tag.
\membersection{wxHtmlLinkInfo::GetTarget}\label{wxhtmllinkinfogettarget}
\func{wxString}{GetTarget}{\void}
Returns {\it TARGET} value of the {\tt <A>} tag (this value
is used to specify in which frame should be the page pointed
by {\helpref{Href}{wxhtmllinkinfogethref} opened).

View File

@ -121,11 +121,13 @@ FALSE if an error occured, TRUE otherwise
\membersection{wxHtmlWindow::OnLinkClicked}\label{wxhtmlwindowonlinkclicked}
\func{virtual void}{OnLinkClicked}{\param{const wxString\& }{link}}
\func{virtual void}{OnLinkClicked}{\param{wxHtmlLinkInfo* }{link}}
Called when user clicks on hypertext link. Default behaviour is to call
\helpref{LoadPage}{wxhtmlwindowloadpage} and do nothing else.
Also see \helpref{wxHtmlLinkInfo}{wxhtmllinkinfo}.
\membersection{wxHtmlWindow::OnSetTitle}\label{wxhtmlwindowonsettitle}

View File

@ -147,9 +147,10 @@ Returns TRUE if actual font is underlined, FALSE otherwise.
\membersection{wxHtmlWinParser::GetLink}\label{wxhtmlwinparsergetlink}
\constfunc{const wxString\&}{GetLink}{\void}
\constfunc{const wxHtmlLinkInfo\&}{GetLink}{\void}
Returns actual hypertext link. (This value is non-empty string
Returns actual hypertext link. (This value has non-empty
\helpref{Href}{wxhtmllinkinfogethref}} string
if the parser is between {\tt <A>} and {\tt </A>} tags,
wxEmptyString otherwise.
@ -229,7 +230,7 @@ Sets italic flag of actualfont. {\it x} is either TRUE of FALSE.
\func{void}{SetFontSize}{\param{int }{s}}
Sets actual font size (HTML size varies from -2 to +4)
Sets actual font size (HTML size varies from 1 to 7)
\membersection{wxHtmlWinParser::SetFontUnderlined}\label{wxhtmlwinparsersetfontunderlined}
@ -245,9 +246,11 @@ Sets fonts. This method is identical to \helpref{wxHtmlWindow::SetFonts}{wxhtmlw
\membersection{wxHtmlWinParser::SetLink}\label{wxhtmlwinparsersetlink}
\func{void}{SetLink}{\param{const wxString\& }{link}}
\func{void}{SetLink}{\param{const wxHtmlLinkInfo\& }{link}}
Sets actual hypertext link. wxEmptyString means no link.
Sets actual hypertext link. Empty link is represented
by \helpref{wxHtmlLinkInfo}{wxhtmllinkinfo} with {\it Href} equal
to wxEmptyString.
\membersection{wxHtmlWinParser::SetLinkColor}\label{wxhtmlwinparsersetlinkcolor}

View File

@ -24,6 +24,8 @@
#include "wx/html/htmldefs.h"
#include "wx/window.h"
class wxHtmlLinkInfo;
class wxHtmlCell;
class wxHtmlContainerCell;
@ -38,8 +40,8 @@ class wxHtmlContainerCell;
class WXDLLEXPORT wxHtmlCell : public wxObject
{
public:
wxHtmlCell() : wxObject() {m_Next = NULL; m_Parent = NULL; m_Width = m_Height = m_Descent = 0; m_CanLiveOnPagebreak = TRUE;}
virtual ~wxHtmlCell() {if (m_Next) delete m_Next;};
wxHtmlCell();
virtual ~wxHtmlCell();
void SetParent(wxHtmlContainerCell *p) {m_Parent = p;}
wxHtmlContainerCell *GetParent() const {return m_Parent;}
@ -49,7 +51,7 @@ class WXDLLEXPORT wxHtmlCell : public wxObject
int GetWidth() const {return m_Width;}
int GetHeight() const {return m_Height;}
int GetDescent() const {return m_Descent;}
virtual wxString GetLink(int WXUNUSED(x) = 0,
virtual wxHtmlLinkInfo* GetLink(int WXUNUSED(x) = 0,
int WXUNUSED(y) = 0) const
{ return m_Link; }
// returns the link associated with this cell. The position is position within
@ -58,7 +60,7 @@ class WXDLLEXPORT wxHtmlCell : public wxObject
// members access methods
virtual void SetPos(int x, int y) {m_PosX = x, m_PosY = y;}
void SetLink(const wxString& link) {m_Link = link;}
void SetLink(const wxHtmlLinkInfo& link);
void SetNext(wxHtmlCell *cell) {m_Next = cell;}
// members writin methods
@ -120,7 +122,7 @@ class WXDLLEXPORT wxHtmlCell : public wxObject
// m_Descent is used to position text&images..
long m_PosX, m_PosY;
// position where the fragment is drawn
wxString m_Link;
wxHtmlLinkInfo *m_Link;
// destination address if this fragment is hypertext link, "" otherwise
bool m_CanLiveOnPagebreak;
// true if this cell can be placed on pagebreak, false otherwise
@ -222,7 +224,7 @@ class WXDLLEXPORT wxHtmlContainerCell : public wxHtmlCell
// 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 wxHtmlLinkInfo* 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);
@ -301,7 +303,34 @@ class WXDLLEXPORT wxHtmlWidgetCell : public wxHtmlCell
#endif
//--------------------------------------------------------------------------------
// wxHtmlLinkInfo
// Internal data structure. It represents hypertext link
//--------------------------------------------------------------------------------
class wxHtmlLinkInfo : public wxObject
{
public:
wxHtmlLinkInfo() : wxObject()
{ m_Href = m_Target = wxEmptyString; }
wxHtmlLinkInfo(const wxString& href, const wxString& target = wxEmptyString) : wxObject()
{ m_Href = href; m_Target = target; }
wxHtmlLinkInfo(const wxHtmlLinkInfo& l)
{ m_Href = l.m_Href, m_Target = l.m_Target; }
wxHtmlLinkInfo& operator=(const wxHtmlLinkInfo& l)
{ m_Href = l.m_Href, m_Target = l.m_Target; return *this; }
wxString GetHref() const { return m_Href; }
wxString GetTarget() const { return m_Target; }
private:
wxString m_Href, m_Target;
};
#endif // wxUSE_HTML
#endif // _WX_HTMLCELL_H_

View File

@ -136,7 +136,7 @@ class WXDLLEXPORT wxHtmlWindow : public wxScrolledWindow
static void AddFilter(wxHtmlFilter *filter);
// Adds input filter
virtual void OnLinkClicked(const wxString& link);
virtual void OnLinkClicked(wxHtmlLinkInfo *link);
// called when users clicked on hypertext link. Default behavior is to
// call LoadPage(loc)
@ -200,7 +200,7 @@ class WXDLLEXPORT wxHtmlWindow : public wxScrolledWindow
bool m_tmpMouseMoved;
// a flag indicated if mouse moved
// (if TRUE we will try to change cursor in last call to OnIdle)
wxString m_tmpLastLink;
wxHtmlLinkInfo *m_tmpLastLink;
// contains last link name
int m_tmpCanDrawLocks;
// if >0 contents of the window is not redrawn

View File

@ -51,7 +51,7 @@ class WXDLLEXPORT wxHtmlWinParser : public wxHtmlParser
double GetPixelScale() {return m_PixelScale;}
int GetCharHeight() const {return m_CharHeight;}
int GetCharWidth() const {return m_CharWidth;}
// NOTE : these functions do _not_ return _actual_
// NOTE : these functions do _not_ return _actual_
// height/width. They return h/w of default font
// for this DC. If you want actual values, call
// GetDC() -> GetChar...()
@ -82,7 +82,7 @@ class WXDLLEXPORT wxHtmlWinParser : public wxHtmlParser
// container
int GetFontSize() const {return m_FontSize;}
void SetFontSize(int s) {m_FontSize = s;}
void SetFontSize(int s);
int GetFontBold() const {return m_FontBold;}
void SetFontBold(int x) {m_FontBold = x;}
int GetFontItalic() const {return m_FontItalic;}
@ -98,12 +98,11 @@ class WXDLLEXPORT wxHtmlWinParser : public wxHtmlParser
void SetLinkColor(const wxColour& clr) {m_LinkColor = clr;}
const wxColour& GetActualColor() const {return m_ActualColor;}
void SetActualColor(const wxColour& clr) {m_ActualColor = clr;}
const wxString& GetLink() const {return m_Link;}
void SetLink(const wxString& link) {m_Link = link; m_UseLink = link.Length() > 0;}
const wxHtmlLinkInfo& GetLink() const {return m_Link;}
void SetLink(const wxHtmlLinkInfo& link);
virtual wxFont* CreateCurrentFont();
// creates font depending on m_Font* members.
// (note : it calls wxHtmlWindow's CreateCurrentFont...)
protected:
virtual void AddText(const char *txt);
@ -128,7 +127,7 @@ class WXDLLEXPORT wxHtmlWinParser : public wxHtmlParser
wxColour m_LinkColor;
wxColour m_ActualColor;
// basic font parameters.
wxString m_Link;
wxHtmlLinkInfo m_Link;
// actual hypertext link or empty string
bool m_UseLink;
// TRUE if m_Link is not empty
@ -141,7 +140,7 @@ class WXDLLEXPORT wxHtmlWinParser : public wxHtmlParser
// table of loaded fonts. 1st four indexes are 0 or 1, depending on on/off
// state of these flags (from left to right):
// [bold][italic][underlined][fixed_size]
// last index is font size : from 0 to 7 (remapped from html sizes -2 to +4)
// last index is font size : from 0 to 6 (remapped from html sizes 1 to 7)
// Note : this table covers all possible combinations of fonts, but not
// all of them are used, so many items in table are usually NULL.
int m_FontsSizes[7];

View File

@ -33,14 +33,29 @@
// wxHtmlCell
//-----------------------------------------------------------------------------
wxHtmlCell::wxHtmlCell() : wxObject()
{
m_Next = NULL;
m_Parent = NULL;
m_Width = m_Height = m_Descent = 0;
m_CanLiveOnPagebreak = TRUE;
m_Link = NULL;
}
wxHtmlCell::~wxHtmlCell()
{
if (m_Link) delete m_Link;
if (m_Next) delete m_Next;
}
void wxHtmlCell::OnMouseClick(wxWindow *parent, int x, int y,
bool WXUNUSED(left),
bool WXUNUSED(middle),
bool WXUNUSED(right))
{
wxString lnk = GetLink(x, y);
if (lnk != wxEmptyString)
wxHtmlLinkInfo *lnk = GetLink(x, y);
if (lnk != NULL)
((wxHtmlWindow*)parent) -> OnLinkClicked(lnk);
// note : this overcasting is legal because parent is *always* wxHtmlWindow
}
@ -49,7 +64,6 @@ void wxHtmlCell::OnMouseClick(wxWindow *parent, int x, int y,
bool wxHtmlCell::AdjustPagebreak(int *pagebreak)
{
if ((!m_CanLiveOnPagebreak) &&
m_PosY < *pagebreak && m_PosY + m_Height > *pagebreak) {
*pagebreak = m_PosY;
@ -65,6 +79,13 @@ bool wxHtmlCell::AdjustPagebreak(int *pagebreak)
void wxHtmlCell::SetLink(const wxHtmlLinkInfo& link)
{
if (m_Link) delete m_Link;
m_Link = new wxHtmlLinkInfo(link);
}
//-----------------------------------------------------------------------------
// wxHtmlWordCell
@ -344,7 +365,7 @@ void wxHtmlContainerCell::DrawInvisible(wxDC& dc, int x, int y)
wxString wxHtmlContainerCell::GetLink(int x, int y) const
wxHtmlLinkInfo *wxHtmlContainerCell::GetLink(int x, int y) const
{
wxHtmlCell *c = m_Cells;
int cx, cy, cw, ch;
@ -356,7 +377,7 @@ wxString wxHtmlContainerCell::GetLink(int x, int y) const
return c -> GetLink(x - cx, y - cy);
c = c -> GetNext();
}
return wxEmptyString;
return NULL;
}

View File

@ -44,7 +44,7 @@ wxHtmlWindow::wxHtmlWindow(wxWindow *parent, wxWindowID id, const wxPoint& pos,
long style, const wxString& name) : wxScrolledWindow(parent, id, pos, size, wxVSCROLL, name)
{
m_tmpMouseMoved = FALSE;
m_tmpLastLink = wxEmptyString;
m_tmpLastLink = NULL;
m_tmpCanDrawLocks = 0;
m_FS = new wxFileSystem();
m_RelatedStatusBar = -1;
@ -421,9 +421,9 @@ void wxHtmlWindow::AddFilter(wxHtmlFilter *filter)
void wxHtmlWindow::OnLinkClicked(const wxString& link)
void wxHtmlWindow::OnLinkClicked(wxHtmlLinkInfo *link)
{
LoadPage(link);
LoadPage(link -> GetHref());
}
@ -522,7 +522,7 @@ void wxHtmlWindow::OnIdle(wxIdleEvent& event)
if (m_tmpMouseMoved && (m_Cell != NULL)) {
int sx, sy;
int x, y;
wxString lnk;
wxHtmlLinkInfo *lnk;
ViewStart(&sx, &sy); sx *= wxHTML_SCROLL_STEP; sy *= wxHTML_SCROLL_STEP;
wxGetMousePosition(&x, &y);
@ -530,13 +530,14 @@ void wxHtmlWindow::OnIdle(wxIdleEvent& event)
lnk = m_Cell -> GetLink(sx + x, sy + y);
if (lnk != m_tmpLastLink) {
if (lnk == wxEmptyString) {
if (lnk == NULL) {
SetCursor(cur_arrow);
if (m_RelatedStatusBar != -1) m_RelatedFrame -> SetStatusText(wxEmptyString, m_RelatedStatusBar);
}
else {
SetCursor(cur_hand);
if (m_RelatedStatusBar != -1) m_RelatedFrame -> SetStatusText(lnk, m_RelatedStatusBar);
if (m_RelatedStatusBar != -1)
m_RelatedFrame -> SetStatusText(lnk -> GetHref(), m_RelatedStatusBar);
}
m_tmpLastLink = lnk;
}

View File

@ -60,7 +60,7 @@ class wxHtmlImageMapAreaCell : public wxHtmlCell
int radius;
public:
wxHtmlImageMapAreaCell( celltype t, wxString &coords, double pixel_scale = 1.0);
virtual wxString GetLink( int x = 0, int y = 0 ) const;
virtual wxHtmlLinkInfo *GetLink( int x = 0, int y = 0 ) const;
};
@ -80,7 +80,7 @@ wxHtmlImageMapAreaCell::wxHtmlImageMapAreaCell( wxHtmlImageMapAreaCell::celltype
coords.Add( (int)(pixel_scale * (double)wxAtoi( x.c_str())) );
}
wxString wxHtmlImageMapAreaCell::GetLink( int x, int y ) const
wxHtmlLinkInfo *wxHtmlImageMapAreaCell::GetLink( int x, int y ) const
{
switch (type) {
case RECT:
@ -181,7 +181,7 @@ wxString wxHtmlImageMapAreaCell::GetLink( int x, int y ) const
wxHtmlImageMapAreaCell *a = (wxHtmlImageMapAreaCell*)m_Next;
return a->GetLink( x, y );
}
return wxEmptyString;
return NULL;
}
@ -206,7 +206,7 @@ class wxHtmlImageMapCell : public wxHtmlCell
protected:
wxString m_Name;
public:
virtual wxString GetLink( int x = 0, int y = 0 ) const;
virtual wxHtmlLinkInfo *GetLink( int x = 0, int y = 0 ) const;
virtual const wxHtmlCell *Find( int cond, const void *param ) const;
};
@ -216,7 +216,7 @@ wxHtmlImageMapCell::wxHtmlImageMapCell( wxString &name )
m_Name = name ;
}
wxString wxHtmlImageMapCell::GetLink( int x, int y ) const
wxHtmlLinkInfo *wxHtmlImageMapCell::GetLink( int x, int y ) const
{
wxHtmlImageMapAreaCell *a = (wxHtmlImageMapAreaCell*)m_Next;
if (a)
@ -252,7 +252,7 @@ class wxHtmlImageCell : public wxHtmlCell
wxHtmlImageCell(wxFSFile *input, int w = -1, int h = -1, int align = wxHTML_ALIGN_BOTTOM, wxString mapname = wxEmptyString);
~wxHtmlImageCell() {if (m_Image) delete m_Image; }
void Draw(wxDC& dc, int x, int y, int view_y1, int view_y2);
virtual wxString GetLink( int x = 0, int y = 0 ) const;
virtual wxHtmlLinkInfo *GetLink( int x = 0, int y = 0 ) const;
};
@ -310,7 +310,7 @@ void wxHtmlImageCell::Draw(wxDC& dc, int x, int y, int view_y1, int view_y2)
wxHtmlCell::Draw(dc, x, y, view_y1, view_y2);
}
wxString wxHtmlImageCell::GetLink( int x, int y ) const
wxHtmlLinkInfo *wxHtmlImageCell::GetLink( int x, int y ) const
{
if (m_MapName.IsEmpty())
return wxHtmlCell::GetLink( x, y );
@ -412,7 +412,9 @@ TAG_HANDLER_BEGIN(IMG, "IMG,MAP,AREA")
}
if (cel != NULL && tag.HasParam("HREF")) {
wxString tmp = tag.GetParam("HREF");
cel->SetLink( tmp );
wxString target = wxEmptyString;
if (tag.HasParam("TARGET")) target = tag.GetParam("TARGET");
cel->SetLink( wxHtmlLinkInfo(tmp, target));
}
if (cel != NULL) m_WParser->GetContainer()->InsertCell( cel );
}

View File

@ -59,15 +59,17 @@ TAG_HANDLER_BEGIN(A, "A")
}
if (tag.HasParam("HREF")) {
wxString oldlnk = m_WParser -> GetLink();
wxHtmlLinkInfo oldlnk = m_WParser -> GetLink();
wxColour oldclr = m_WParser -> GetActualColor();
int oldund = m_WParser -> GetFontUnderlined();
wxString name(tag.GetParam("HREF")), target;
if (tag.HasParam("TARGET")) target = tag.GetParam("TARGET");
m_WParser -> SetActualColor(m_WParser -> GetLinkColor());
m_WParser -> GetContainer() -> InsertCell(new wxHtmlColourCell(m_WParser -> GetLinkColor()));
m_WParser -> SetFontUnderlined(TRUE);
m_WParser -> GetContainer() -> InsertCell(new wxHtmlFontCell(m_WParser -> CreateCurrentFont()));
m_WParser -> SetLink(tag.GetParam("HREF"));
m_WParser -> SetLink(wxHtmlLinkInfo(name, target));
ParseInner(tag);