X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b835e9bf4940cc1027c0ab364816bfd4aa229a72..939fadc8aab8cc85906685ed6cdcb46d28f27903:/src/html/htmlwin.cpp diff --git a/src/html/htmlwin.cpp b/src/html/htmlwin.cpp index 7d79fe5523..08e3966044 100644 --- a/src/html/htmlwin.cpp +++ b/src/html/htmlwin.cpp @@ -18,7 +18,7 @@ #include "wx/defs.h" #if wxUSE_HTML && wxUSE_STREAMS -#ifdef __BORDLANDC__ +#ifdef __BORLANDC__ #pragma hdrstop #endif @@ -41,7 +41,7 @@ //----------------------------------------------------------------------------- // item of history list -class WXDLLEXPORT wxHtmlHistoryItem : public wxObject +class WXDLLEXPORT wxHtmlHistoryItem { public: wxHtmlHistoryItem(const wxString& p, const wxString& a) {m_Page = p, m_Anchor = a, m_Pos = 0;} @@ -72,8 +72,7 @@ WX_DEFINE_LIST(wxHtmlProcessorList); //----------------------------------------------------------------------------- -wxHtmlWindow::wxHtmlWindow(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, - long style, const wxString& name) : wxScrolledWindow(parent, id, pos, size, style | wxVSCROLL | wxHSCROLL, name) +void wxHtmlWindow::Init() { m_tmpMouseMoved = FALSE; m_tmpLastLink = NULL; @@ -87,17 +86,28 @@ wxHtmlWindow::wxHtmlWindow(wxWindow *parent, wxWindowID id, const wxPoint& pos, m_Cell = NULL; m_Parser = new wxHtmlWinParser(this); m_Parser->SetFS(m_FS); - SetBorders(10); m_HistoryPos = -1; m_HistoryOn = TRUE; m_History = new wxHtmlHistoryArray; m_Processors = NULL; + m_Style = 0; + SetBorders(10); +} + +bool wxHtmlWindow::Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos, const wxSize& size, + long style, const wxString& name) +{ + if (!wxScrolledWindow::Create(parent, id, pos, size, + style | wxVSCROLL | wxHSCROLL, name)) + return FALSE; + m_Style = style; SetPage(wxT("")); + return TRUE; } - wxHtmlWindow::~wxHtmlWindow() { HistoryClear(); @@ -204,13 +214,12 @@ bool wxHtmlWindow::AppendToPage(const wxString& source) bool wxHtmlWindow::LoadPage(const wxString& location) { + wxBusyCursor busyCursor; + wxFSFile *f; bool rt_val; bool needs_refresh = FALSE; - SetCursor(*wxHOURGLASS_CURSOR); - wxYield(); Refresh(FALSE); - m_tmpCanDrawLocks++; if (m_HistoryOn && (m_HistoryPos != -1)) { @@ -254,14 +263,20 @@ bool wxHtmlWindow::LoadPage(const wxString& location) Refresh(FALSE); } - f = m_FS->OpenFile(location); + f = m_Parser->OpenURL(wxHTML_URL_PAGE, location); + + // try to interpret 'location' as filename instead of URL: + if (f == NULL) + { + wxFileName fn(location); + wxString location2 = wxFileSystem::FileNameToURL(fn); + f = m_Parser->OpenURL(wxHTML_URL_PAGE, location2); + } if (f == NULL) { wxLogError(_("Unable to open requested HTML document: %s"), location.c_str()); m_tmpCanDrawLocks--; - - SetCursor(*wxSTANDARD_CURSOR); return FALSE; } @@ -299,7 +314,6 @@ bool wxHtmlWindow::LoadPage(const wxString& location) m_OpenedPage = f->GetLocation(); if (f->GetAnchor() != wxEmptyString) { - wxYield(); ScrollToAnchor(f->GetAnchor()); } @@ -326,11 +340,9 @@ bool wxHtmlWindow::LoadPage(const wxString& location) if (m_OpenedPageTitle == wxEmptyString) OnSetTitle(wxFileNameFromPath(m_OpenedPage)); - SetCursor(*wxSTANDARD_CURSOR); if (needs_refresh) { - wxYield(); m_tmpCanDrawLocks--; Refresh(); } @@ -341,6 +353,12 @@ bool wxHtmlWindow::LoadPage(const wxString& location) } +bool wxHtmlWindow::LoadFile(const wxFileName& filename) +{ + wxString url = wxFileSystem::FileNameToURL(filename); + return LoadPage(url); +} + bool wxHtmlWindow::ScrollToAnchor(const wxString& anchor) { @@ -488,7 +506,6 @@ bool wxHtmlWindow::HistoryBack() if (a == wxEmptyString) LoadPage(l); else LoadPage(l + wxT("#") + a); m_HistoryOn = TRUE; - wxYield(); m_tmpCanDrawLocks--; Scroll(0, (*m_History)[m_HistoryPos].GetPos()); Refresh(); @@ -519,7 +536,6 @@ bool wxHtmlWindow::HistoryForward() if (a == wxEmptyString) LoadPage(l); else LoadPage(l + wxT("#") + a); m_HistoryOn = TRUE; - wxYield(); m_tmpCanDrawLocks--; Scroll(0, (*m_History)[m_HistoryPos].GetPos()); Refresh(); @@ -590,14 +606,12 @@ wxHtmlProcessorList *wxHtmlWindow::m_GlobalProcessors = NULL; void wxHtmlWindow::CleanUpStatics() { - delete m_DefaultFilter; - m_DefaultFilter = NULL; + wxDELETE(m_DefaultFilter); m_Filters.DeleteContents(TRUE); m_Filters.Clear(); - delete m_GlobalProcessors; - m_GlobalProcessors = NULL; - delete s_cur_hand; - delete s_cur_arrow; + wxDELETE(m_GlobalProcessors); + wxDELETE(s_cur_hand); + wxDELETE(s_cur_arrow); } @@ -608,11 +622,21 @@ void wxHtmlWindow::AddFilter(wxHtmlFilter *filter) } +bool wxHtmlWindow::IsSelectionEnabled() const +{ +#if wxUSE_CLIPBOARD + return !(m_Style & wxHW_NO_SELECTION); +#else + return false; +#endif +} void wxHtmlWindow::OnLinkClicked(const wxHtmlLinkInfo& link) { - LoadPage(link.GetHref()); + const wxMouseEvent *e = link.GetEvent(); + if (e == NULL || e->LeftUp()) + LoadPage(link.GetHref()); } void wxHtmlWindow::OnCellClicked(wxHtmlCell *cell, @@ -641,9 +665,11 @@ void wxHtmlWindow::OnDraw(wxDC& dc) dc.SetBackgroundMode(wxTRANSPARENT); GetViewStart(&x, &y); - m_Cell->Draw(dc, 0, 0, - y * wxHTML_SCROLL_STEP + rect.GetTop(), - y * wxHTML_SCROLL_STEP + rect.GetBottom()); + wxHtmlRenderingState rstate(NULL); + m_Cell->Draw(dc, 0, 0, + y * wxHTML_SCROLL_STEP + rect.GetTop(), + y * wxHTML_SCROLL_STEP + rect.GetBottom(), + rstate); } @@ -657,31 +683,32 @@ void wxHtmlWindow::OnSize(wxSizeEvent& event) } -void wxHtmlWindow::OnMouseEvent(wxMouseEvent& event) +void wxHtmlWindow::OnMouseMove(wxMouseEvent& event) { - m_tmpMouseMoved = TRUE; + m_tmpMouseMoved = true; +} - if (event.ButtonDown()) +void wxHtmlWindow::OnMouseButton(wxMouseEvent& event) +{ + SetFocus(); + if ( m_Cell ) { - if ( m_Cell ) - { - int sx, sy; - GetViewStart(&sx, &sy); - sx *= wxHTML_SCROLL_STEP; - sy *= wxHTML_SCROLL_STEP; + int sx, sy; + GetViewStart(&sx, &sy); + sx *= wxHTML_SCROLL_STEP; + sy *= wxHTML_SCROLL_STEP; - wxPoint pos = event.GetPosition(); - pos.x += sx; - pos.y += sy; + wxPoint pos = event.GetPosition(); + pos.x += sx; + pos.y += sy; - wxHtmlCell *cell = m_Cell->FindCellByPos(pos.x, pos.y); + wxHtmlCell *cell = m_Cell->FindCellByPos(pos.x, pos.y); - // VZ: is it possible that we don't find anything at all? - // VS: yes. FindCellByPos returns terminal cell and - // containers may have empty borders - if ( cell ) - OnCellClicked(cell, pos.x, pos.y, event); - } + // VZ: is it possible that we don't find anything at all? + // VS: yes. FindCellByPos returns terminal cell and + // containers may have empty borders + if ( cell ) + OnCellClicked(cell, pos.x, pos.y, event); } } @@ -749,9 +776,9 @@ IMPLEMENT_DYNAMIC_CLASS(wxHtmlWindow,wxScrolledWindow) BEGIN_EVENT_TABLE(wxHtmlWindow, wxScrolledWindow) EVT_SIZE(wxHtmlWindow::OnSize) - EVT_LEFT_DOWN(wxHtmlWindow::OnMouseEvent) - EVT_RIGHT_DOWN(wxHtmlWindow::OnMouseEvent) - EVT_MOTION(wxHtmlWindow::OnMouseEvent) + EVT_LEFT_UP(wxHtmlWindow::OnMouseButton) + EVT_RIGHT_UP(wxHtmlWindow::OnMouseButton) + EVT_MOTION(wxHtmlWindow::OnMouseMove) EVT_IDLE(wxHtmlWindow::OnIdle) END_EVENT_TABLE()