From 846914d18d70a51a43f1ebfe0c850a64708cb772 Mon Sep 17 00:00:00 2001
From: =?utf8?q?V=C3=A1clav=20Slav=C3=ADk?= <vslavik@fastmail.fm>
Date: Thu, 23 Dec 1999 21:12:23 +0000
Subject: [PATCH] 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
---
 docs/latex/wx/classes.tex  |  1 +
 docs/latex/wx/htcell.tex   |  9 +++----
 docs/latex/wx/htlnkinf.tex | 48 ++++++++++++++++++++++++++++++++++++++
 docs/latex/wx/htwindow.tex |  4 +++-
 docs/latex/wx/htwinprs.tex | 13 +++++++----
 include/wx/html/htmlcell.h | 43 ++++++++++++++++++++++++++++------
 include/wx/html/htmlwin.h  |  4 ++--
 include/wx/html/winpars.h  | 13 +++++------
 src/html/htmlcell.cpp      | 31 ++++++++++++++++++++----
 src/html/htmlwin.cpp       | 13 ++++++-----
 src/html/m_image.cpp       | 18 +++++++-------
 src/html/m_links.cpp       |  6 +++--
 12 files changed, 156 insertions(+), 47 deletions(-)
 create mode 100644 docs/latex/wx/htlnkinf.tex

diff --git a/docs/latex/wx/classes.tex b/docs/latex/wx/classes.tex
index 2ff1de9f8a..0d4e36165f 100644
--- a/docs/latex/wx/classes.tex
+++ b/docs/latex/wx/classes.tex
@@ -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
diff --git a/docs/latex/wx/htcell.tex b/docs/latex/wx/htcell.tex
index bc8494274d..b59bb47f29 100644
--- a/docs/latex/wx/htcell.tex
+++ b/docs/latex/wx/htcell.tex
@@ -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}
 
diff --git a/docs/latex/wx/htlnkinf.tex b/docs/latex/wx/htlnkinf.tex
new file mode 100644
index 0000000000..a6aca8d507
--- /dev/null
+++ b/docs/latex/wx/htlnkinf.tex
@@ -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).
diff --git a/docs/latex/wx/htwindow.tex b/docs/latex/wx/htwindow.tex
index bbca02309e..cee42f33d7 100644
--- a/docs/latex/wx/htwindow.tex
+++ b/docs/latex/wx/htwindow.tex
@@ -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}
 
diff --git a/docs/latex/wx/htwinprs.tex b/docs/latex/wx/htwinprs.tex
index 1ea0e4e5d0..dabac42bb2 100644
--- a/docs/latex/wx/htwinprs.tex
+++ b/docs/latex/wx/htwinprs.tex
@@ -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}
 
diff --git a/include/wx/html/htmlcell.h b/include/wx/html/htmlcell.h
index 272bba684b..72f78c844b 100644
--- a/include/wx/html/htmlcell.h
+++ b/include/wx/html/htmlcell.h
@@ -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_
 
diff --git a/include/wx/html/htmlwin.h b/include/wx/html/htmlwin.h
index 6b155c693b..f394d69680 100644
--- a/include/wx/html/htmlwin.h
+++ b/include/wx/html/htmlwin.h
@@ -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
diff --git a/include/wx/html/winpars.h b/include/wx/html/winpars.h
index 66161eb56b..bbfb4a8198 100644
--- a/include/wx/html/winpars.h
+++ b/include/wx/html/winpars.h
@@ -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];
diff --git a/src/html/htmlcell.cpp b/src/html/htmlcell.cpp
index a3d20ab2c0..38988b6cb2 100644
--- a/src/html/htmlcell.cpp
+++ b/src/html/htmlcell.cpp
@@ -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;
 }
 
 
diff --git a/src/html/htmlwin.cpp b/src/html/htmlwin.cpp
index 0f0b5d67a8..380ed40818 100644
--- a/src/html/htmlwin.cpp
+++ b/src/html/htmlwin.cpp
@@ -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;
         }
diff --git a/src/html/m_image.cpp b/src/html/m_image.cpp
index 96e6b112dd..4c32fbe5e9 100644
--- a/src/html/m_image.cpp
+++ b/src/html/m_image.cpp
@@ -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 );
             }
diff --git a/src/html/m_links.cpp b/src/html/m_links.cpp
index c3220d063b..a20252dfd1 100644
--- a/src/html/m_links.cpp
+++ b/src/html/m_links.cpp
@@ -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);
 
-- 
2.50.0

