X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/907f2fabf76f2eb4097c0ca4409f6d8b3d35638e..340e9651e1ee6938ee797ea15f4c1fbdab8a6f44:/src/html/htmlwin.cpp diff --git a/src/html/htmlwin.cpp b/src/html/htmlwin.cpp index 8ac31d319f..3ef8f9a1f9 100644 --- a/src/html/htmlwin.cpp +++ b/src/html/htmlwin.cpp @@ -25,6 +25,7 @@ #include "wx/timer.h" #include "wx/settings.h" #include "wx/dataobj.h" + #include "wx/statusbr.h" #endif #include "wx/html/htmlwin.h" @@ -291,7 +292,8 @@ void wxHtmlWindow::Init() m_tmpCanDrawLocks = 0; m_FS = new wxFileSystem(); #if wxUSE_STATUSBAR - m_RelatedStatusBar = -1; + m_RelatedStatusBar = NULL; + m_RelatedStatusBarIndex = -1; #endif // wxUSE_STATUSBAR m_RelatedFrame = NULL; m_TitleFormat = wxT("%s"); @@ -363,10 +365,17 @@ void wxHtmlWindow::SetRelatedFrame(wxFrame* frame, const wxString& format) #if wxUSE_STATUSBAR -void wxHtmlWindow::SetRelatedStatusBar(int bar) +void wxHtmlWindow::SetRelatedStatusBar(int index) { - m_RelatedStatusBar = bar; + m_RelatedStatusBarIndex = index; } + +void wxHtmlWindow::SetRelatedStatusBar(wxStatusBar* statusbar, int index) +{ + m_RelatedStatusBar = statusbar; + m_RelatedStatusBarIndex = index; +} + #endif // wxUSE_STATUSBAR @@ -468,9 +477,10 @@ bool wxHtmlWindow::AppendToPage(const wxString& source) bool wxHtmlWindow::LoadPage(const wxString& location) { + wxCHECK_MSG( !location.empty(), false, "location must be non-empty" ); + wxBusyCursor busyCursor; - wxFSFile *f; bool rt_val; bool needs_refresh = false; @@ -483,43 +493,40 @@ bool wxHtmlWindow::LoadPage(const wxString& location) (*m_History)[m_HistoryPos].SetPos(y); } - if (location[0] == wxT('#')) - { - // local anchor: - wxString anch = location.Mid(1) /*1 to end*/; - m_tmpCanDrawLocks--; - rt_val = ScrollToAnchor(anch); - m_tmpCanDrawLocks++; - } - else if (location.Find(wxT('#')) != wxNOT_FOUND && location.BeforeFirst(wxT('#')) == m_OpenedPage) + // first check if we're moving to an anchor in the same page + size_t posLocalAnchor = location.Find('#'); + if ( posLocalAnchor != wxString::npos && posLocalAnchor != 0 ) { - wxString anch = location.AfterFirst(wxT('#')); - m_tmpCanDrawLocks--; - rt_val = ScrollToAnchor(anch); - m_tmpCanDrawLocks++; + // check if the part before the anchor is the same as the (either + // relative or absolute) URI of the current page + const wxString beforeAnchor = location.substr(0, posLocalAnchor); + if ( beforeAnchor != m_OpenedPage && + m_FS->GetPath() + beforeAnchor != m_OpenedPage ) + { + // indicate that we're not moving to a local anchor + posLocalAnchor = wxString::npos; + } } - else if (location.Find(wxT('#')) != wxNOT_FOUND && - (m_FS->GetPath() + location.BeforeFirst(wxT('#'))) == m_OpenedPage) + + if ( posLocalAnchor != wxString::npos ) { - wxString anch = location.AfterFirst(wxT('#')); m_tmpCanDrawLocks--; - rt_val = ScrollToAnchor(anch); + rt_val = ScrollToAnchor(location.substr(posLocalAnchor + 1)); m_tmpCanDrawLocks++; } - - else + else // moving to another page { needs_refresh = true; #if wxUSE_STATUSBAR // load&display it: - if (m_RelatedStatusBar != -1) + if (m_RelatedStatusBarIndex != -1) { - m_RelatedFrame->SetStatusText(_("Connecting..."), m_RelatedStatusBar); + SetHTMLStatusText(_("Connecting...")); Refresh(false); } #endif // wxUSE_STATUSBAR - f = m_Parser->OpenURL(wxHTML_URL_PAGE, location); + wxFSFile *f = m_Parser->OpenURL(wxHTML_URL_PAGE, location); // try to interpret 'location' as filename instead of URL: if (f == NULL) @@ -533,6 +540,7 @@ bool wxHtmlWindow::LoadPage(const wxString& location) { wxLogError(_("Unable to open requested HTML document: %s"), location.c_str()); m_tmpCanDrawLocks--; + SetHTMLStatusText(wxEmptyString); return false; } @@ -542,10 +550,10 @@ bool wxHtmlWindow::LoadPage(const wxString& location) wxString src = wxEmptyString; #if wxUSE_STATUSBAR - if (m_RelatedStatusBar != -1) + if (m_RelatedStatusBarIndex != -1) { wxString msg = _("Loading : ") + location; - m_RelatedFrame->SetStatusText(msg, m_RelatedStatusBar); + SetHTMLStatusText(msg); Refresh(false); } #endif // wxUSE_STATUSBAR @@ -578,8 +586,10 @@ bool wxHtmlWindow::LoadPage(const wxString& location) delete f; #if wxUSE_STATUSBAR - if (m_RelatedStatusBar != -1) - m_RelatedFrame->SetStatusText(_("Done"), m_RelatedStatusBar); + if (m_RelatedStatusBarIndex != -1) + { + SetHTMLStatusText(_("Done")); + } #endif // wxUSE_STATUSBAR } } @@ -983,7 +993,7 @@ void wxHtmlWindow::OnEraseBackground(wxEraseEvent& event) // completely covered anyhow if ( m_bmpBg.GetMask() ) { - dc.SetBackground(wxBrush(GetBackgroundColour(), wxSOLID)); + dc.SetBackground(wxBrush(GetBackgroundColour(), wxBRUSHSTYLE_SOLID)); dc.Clear(); } @@ -1017,7 +1027,7 @@ void wxHtmlWindow::OnPaint(wxPaintEvent& WXUNUSED(event)) if ( m_eraseBgInOnPaint ) { - dcm.SetBackground(wxBrush(GetBackgroundColour(), wxSOLID)); + dcm.SetBackground(wxBrush(GetBackgroundColour(), wxBRUSHSTYLE_SOLID)); dcm.Clear(); m_eraseBgInOnPaint = false; @@ -1035,7 +1045,7 @@ void wxHtmlWindow::OnPaint(wxPaintEvent& WXUNUSED(event)) PrepareDC(dcm); dcm.SetMapMode(wxMM_TEXT); - dcm.SetBackgroundMode(wxTRANSPARENT); + dcm.SetBackgroundMode(wxBRUSHSTYLE_TRANSPARENT); wxHtmlRenderingInfo rinfo; wxDefaultHtmlRenderingStyle rstyle; @@ -1136,9 +1146,10 @@ void wxHtmlWindow::OnMouseDown(wxMouseEvent& event) CaptureMouse(); } } -#else - wxUnusedVar(event); #endif // wxUSE_CLIPBOARD + + // in any case, let the default handler set focus to this window + event.Skip(); } void wxHtmlWindow::OnMouseUp(wxMouseEvent& event) @@ -1163,8 +1174,6 @@ void wxHtmlWindow::OnMouseUp(wxMouseEvent& event) } #endif // wxUSE_CLIPBOARD - SetFocus(); - wxPoint pos = CalcUnscrolledPosition(event.GetPosition()); wxHtmlWindowMouseHelper::HandleMouseClick(m_Cell, pos, event); } @@ -1614,8 +1623,17 @@ void wxHtmlWindow::SetHTMLBackgroundImage(const wxBitmap& bmpBg) void wxHtmlWindow::SetHTMLStatusText(const wxString& text) { #if wxUSE_STATUSBAR - if (m_RelatedStatusBar != -1) - m_RelatedFrame->SetStatusText(text, m_RelatedStatusBar); + if (m_RelatedStatusBarIndex != -1) + { + if (m_RelatedStatusBar) + { + m_RelatedStatusBar->SetStatusText(text, m_RelatedStatusBarIndex); + } + else if (m_RelatedFrame) + { + m_RelatedFrame->SetStatusText(text, m_RelatedStatusBarIndex); + } + } #else wxUnusedVar(text); #endif // wxUSE_STATUSBAR