From 36c4ff4d6501712cbc718a6569599f2725db0d2c Mon Sep 17 00:00:00 2001 From: =?utf8?q?V=C3=A1clav=20Slav=C3=ADk?= Date: Sat, 31 May 2003 21:48:50 +0000 Subject: [PATCH] preparing wxHtmlWindow for text selection (highlighting works, mouse input and clipboard does not) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@20787 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/html/htmlcell.cpp | 147 +++++++++++++++++++++++++++++++----------- src/html/htmlwin.cpp | 17 ++++- src/html/htmprint.cpp | 7 +- src/html/m_hline.cpp | 7 +- src/html/m_image.cpp | 23 +++++-- src/html/m_layout.cpp | 12 +++- src/html/m_links.cpp | 31 ++++++--- src/html/m_list.cpp | 7 +- 8 files changed, 187 insertions(+), 64 deletions(-) diff --git a/src/html/htmlcell.cpp b/src/html/htmlcell.cpp index 7881b478f0..2e2fa772d9 100644 --- a/src/html/htmlcell.cpp +++ b/src/html/htmlcell.cpp @@ -29,6 +29,7 @@ #include "wx/html/htmlcell.h" #include "wx/html/htmlwin.h" +#include "wx/settings.h" #include @@ -115,11 +116,14 @@ const wxHtmlCell* wxHtmlCell::Find(int WXUNUSED(condition), const void* WXUNUSED } -wxHtmlCell *wxHtmlCell::FindCellByPos(wxCoord x, wxCoord y) const +wxHtmlCell *wxHtmlCell::FindCellByPos(wxCoord x, wxCoord y, + unsigned flags) const { - if ( x >= 0 && x < m_Width && y >= 0 && y < m_Height ) + if ( (flags & wxHTML_FIND_TERMINAL) && + x >= 0 && x < m_Width && y >= 0 && y < m_Height ) + { return wxConstCast(this, wxHtmlCell); - + } return NULL; } @@ -137,8 +141,27 @@ wxHtmlWordCell::wxHtmlWordCell(const wxString& word, wxDC& dc) : wxHtmlCell() -void wxHtmlWordCell::Draw(wxDC& dc, int x, int y, int WXUNUSED(view_y1), int WXUNUSED(view_y2)) +void wxHtmlWordCell::Draw(wxDC& dc, int x, int y, + int WXUNUSED(view_y1), int WXUNUSED(view_y2), + wxHtmlRenderingState& state) { + if (state.GetSelectionState() == wxHTML_SEL_IN && + dc.GetBackgroundMode() != wxSOLID) + { + dc.SetBackgroundMode(wxSOLID); + dc.SetTextBackground( + wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT)); + dc.SetTextForeground( + wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT)); + } + else if (state.GetSelectionState() == wxHTML_SEL_OUT && + dc.GetBackgroundMode() == wxSOLID) + { + dc.SetBackgroundMode(wxTRANSPARENT); + dc.SetTextForeground(state.GetFgColour()); + dc.SetTextBackground(state.GetBgColour()); + } + dc.DrawText(m_Word, x + m_PosX, y + m_PosY); } @@ -401,11 +424,33 @@ void wxHtmlContainerCell::Layout(int w) m_LastLayout = w; } +void wxHtmlContainerCell::UpdateRenderingStatePre(wxHtmlRenderingState& state, + wxHtmlCell *cell) const +{ + wxHtmlSelection *s = state.GetSelection(); + if (!s) return; + if (s->GetFromCell() == this || s->GetToCell() == this) + { + state.SetSelectionState(wxHTML_SEL_CHANGING); + } +} + +void wxHtmlContainerCell::UpdateRenderingStatePost(wxHtmlRenderingState& state, + wxHtmlCell *cell) const +{ + wxHtmlSelection *s = state.GetSelection(); + if (!s) return; + if (s->GetFromCell() == this) + state.SetSelectionState(wxHTML_SEL_IN); + else if (s->GetToCell() == this) + state.SetSelectionState(wxHTML_SEL_OUT); +} #define mMin(a, b) (((a) < (b)) ? (a) : (b)) #define mMax(a, b) (((a) < (b)) ? (b) : (a)) -void wxHtmlContainerCell::Draw(wxDC& dc, int x, int y, int view_y1, int view_y2) +void wxHtmlContainerCell::Draw(wxDC& dc, int x, int y, int view_y1, int view_y2, + wxHtmlRenderingState& state) { // container visible, draw it: if ((y + m_PosY <= view_y2) && (y + m_PosY + m_Height > view_y1)) @@ -437,29 +482,37 @@ void wxHtmlContainerCell::Draw(wxDC& dc, int x, int y, int view_y1, int view_y2) if (m_Cells) { + // draw container's contents: for (wxHtmlCell *cell = m_Cells; cell; cell = cell->GetNext()) - cell->Draw(dc, x + m_PosX, y + m_PosY, view_y1, view_y2); + { + UpdateRenderingStatePre(state, cell); + cell->Draw(dc, + x + m_PosX, y + m_PosY, view_y1, view_y2, + state); + UpdateRenderingStatePost(state, cell); + } } } // container invisible, just proceed font+color changing: else { - if (m_Cells) - { - for (wxHtmlCell *cell = m_Cells; cell; cell = cell->GetNext()) - cell->DrawInvisible(dc, x + m_PosX, y + m_PosY); - } + DrawInvisible(dc, x, y, state); } } -void wxHtmlContainerCell::DrawInvisible(wxDC& dc, int x, int y) +void wxHtmlContainerCell::DrawInvisible(wxDC& dc, int x, int y, + wxHtmlRenderingState& state) { if (m_Cells) { for (wxHtmlCell *cell = m_Cells; cell; cell = cell->GetNext()) - cell->DrawInvisible(dc, x + m_PosX, y + m_PosY); + { + UpdateRenderingStatePre(state, cell); + cell->DrawInvisible(dc, x + m_PosX, y + m_PosY, state); + UpdateRenderingStatePost(state, cell); + } } } @@ -560,7 +613,8 @@ const wxHtmlCell* wxHtmlContainerCell::Find(int condition, const void* param) co } -wxHtmlCell *wxHtmlContainerCell::FindCellByPos(wxCoord x, wxCoord y) const +wxHtmlCell *wxHtmlContainerCell::FindCellByPos(wxCoord x, wxCoord y, + unsigned flags) const { for ( const wxHtmlCell *cell = m_Cells; cell; cell = cell->GetNext() ) { @@ -570,11 +624,16 @@ wxHtmlCell *wxHtmlContainerCell::FindCellByPos(wxCoord x, wxCoord y) const if ( (cx <= x) && (cx + cell->GetWidth() > x) && (cy <= y) && (cy + cell->GetHeight() > y) ) { - return cell->FindCellByPos(x - cx, y - cy); + wxHtmlCell *c = cell->FindCellByPos(x - cx, y - cy, flags); + if (c == NULL && (flags & wxHTML_FIND_NONTERMINAL)) + return wxConstCast(this, wxHtmlContainerCell); + else + return c; } } - return NULL; + return (flags & wxHTML_FIND_NONTERMINAL) ? + wxConstCast(this, wxHtmlContainerCell) : NULL; } @@ -614,45 +673,54 @@ void wxHtmlContainerCell::GetHorizontalConstraints(int *left, int *right) const -//-------------------------------------------------------------------------------- +// -------------------------------------------------------------------------- // wxHtmlColourCell -//-------------------------------------------------------------------------------- +// -------------------------------------------------------------------------- -void wxHtmlColourCell::Draw(wxDC& dc, int WXUNUSED(x), int WXUNUSED(y), int WXUNUSED(view_y1), int WXUNUSED(view_y2)) +void wxHtmlColourCell::Draw(wxDC& dc, + int x, int y, + int WXUNUSED(view_y1), int WXUNUSED(view_y2), + wxHtmlRenderingState& state) { - if (m_Flags & wxHTML_CLR_FOREGROUND) - dc.SetTextForeground(m_Colour); - if (m_Flags & wxHTML_CLR_BACKGROUND) - { - dc.SetBackground(wxBrush(m_Colour, wxSOLID)); - dc.SetTextBackground(m_Colour); - } + DrawInvisible(dc, x, y, state); } -void wxHtmlColourCell::DrawInvisible(wxDC& dc, int WXUNUSED(x), int WXUNUSED(y)) +void wxHtmlColourCell::DrawInvisible(wxDC& dc, + int WXUNUSED(x), int WXUNUSED(y), + wxHtmlRenderingState& state) { if (m_Flags & wxHTML_CLR_FOREGROUND) - dc.SetTextForeground(m_Colour); + { + state.SetFgColour(m_Colour); + if (state.GetSelectionState() != wxHTML_SEL_IN) + dc.SetTextForeground(m_Colour); + } if (m_Flags & wxHTML_CLR_BACKGROUND) { + state.SetBgColour(m_Colour); + if (state.GetSelectionState() != wxHTML_SEL_IN) + dc.SetTextBackground(m_Colour); dc.SetBackground(wxBrush(m_Colour, wxSOLID)); - dc.SetTextBackground(m_Colour); } } -//-------------------------------------------------------------------------------- +// --------------------------------------------------------------------------- // wxHtmlFontCell -//-------------------------------------------------------------------------------- +// --------------------------------------------------------------------------- -void wxHtmlFontCell::Draw(wxDC& dc, int WXUNUSED(x), int WXUNUSED(y), int WXUNUSED(view_y1), int WXUNUSED(view_y2)) +void wxHtmlFontCell::Draw(wxDC& dc, + int WXUNUSED(x), int WXUNUSED(y), + int WXUNUSED(view_y1), int WXUNUSED(view_y2), + wxHtmlRenderingState& WXUNUSED(state)) { dc.SetFont(m_Font); } -void wxHtmlFontCell::DrawInvisible(wxDC& dc, int WXUNUSED(x), int WXUNUSED(y)) +void wxHtmlFontCell::DrawInvisible(wxDC& dc, int WXUNUSED(x), int WXUNUSED(y), + wxHtmlRenderingState& WXUNUSED(state)) { dc.SetFont(m_Font); } @@ -664,9 +732,9 @@ void wxHtmlFontCell::DrawInvisible(wxDC& dc, int WXUNUSED(x), int WXUNUSED(y)) -//-------------------------------------------------------------------------------- +// --------------------------------------------------------------------------- // wxHtmlWidgetCell -//-------------------------------------------------------------------------------- +// --------------------------------------------------------------------------- wxHtmlWidgetCell::wxHtmlWidgetCell(wxWindow *wnd, int w) { @@ -678,7 +746,10 @@ wxHtmlWidgetCell::wxHtmlWidgetCell(wxWindow *wnd, int w) } -void wxHtmlWidgetCell::Draw(wxDC& WXUNUSED(dc), int WXUNUSED(x), int WXUNUSED(y), int WXUNUSED(view_y1), int WXUNUSED(view_y2)) +void wxHtmlWidgetCell::Draw(wxDC& WXUNUSED(dc), + int WXUNUSED(x), int WXUNUSED(y), + int WXUNUSED(view_y1), int WXUNUSED(view_y2), + wxHtmlRenderingState& WXUNUSED(state)) { int absx = 0, absy = 0, stx, sty; wxHtmlCell *c = this; @@ -696,7 +767,9 @@ void wxHtmlWidgetCell::Draw(wxDC& WXUNUSED(dc), int WXUNUSED(x), int WXUNUSED(y) -void wxHtmlWidgetCell::DrawInvisible(wxDC& WXUNUSED(dc), int WXUNUSED(x), int WXUNUSED(y)) +void wxHtmlWidgetCell::DrawInvisible(wxDC& WXUNUSED(dc), + int WXUNUSED(x), int WXUNUSED(y), + wxHtmlRenderingState& WXUNUSED(state)) { int absx = 0, absy = 0, stx, sty; wxHtmlCell *c = this; diff --git a/src/html/htmlwin.cpp b/src/html/htmlwin.cpp index 03890efadb..43da986f29 100644 --- a/src/html/htmlwin.cpp +++ b/src/html/htmlwin.cpp @@ -622,6 +622,14 @@ 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) @@ -655,9 +663,16 @@ void wxHtmlWindow::OnDraw(wxDC& dc) dc.SetBackgroundMode(wxTRANSPARENT); GetViewStart(&x, &y); + wxHtmlSelection sel; + sel.Set(wxPoint(20,80), + m_Cell->FindCellByPos(20,80,wxHTML_FIND_TERMINAL|wxHTML_FIND_NONTERMINAL), + wxPoint(200,300), + m_Cell->FindCellByPos(200,300,wxHTML_FIND_TERMINAL|wxHTML_FIND_NONTERMINAL)); + wxHtmlRenderingState rstate(IsSelectionEnabled() ? &sel : NULL); m_Cell->Draw(dc, 0, 0, y * wxHTML_SCROLL_STEP + rect.GetTop(), - y * wxHTML_SCROLL_STEP + rect.GetBottom()); + y * wxHTML_SCROLL_STEP + rect.GetBottom(), + rstate); } diff --git a/src/html/htmprint.cpp b/src/html/htmprint.cpp index 099cf3bbd5..d4547f8da7 100644 --- a/src/html/htmprint.cpp +++ b/src/html/htmprint.cpp @@ -114,12 +114,13 @@ int wxHtmlDCRenderer::Render(int x, int y, int from, int dont_render, int to, in if (!dont_render) { + wxHtmlRenderingState rstate(NULL); m_DC->SetBrush(*wxWHITE_BRUSH); - m_DC->SetClippingRegion(x, y, m_Width, hght); m_Cells->Draw(*m_DC, - x, (y - from), - y, pbreak + (y /*- from*/)); + x, (y - from), + y, pbreak + (y /*- from*/), + rstate); m_DC->DestroyClippingRegion(); } diff --git a/src/html/m_hline.cpp b/src/html/m_hline.cpp index d0a1b033bc..9679129adc 100644 --- a/src/html/m_hline.cpp +++ b/src/html/m_hline.cpp @@ -42,7 +42,8 @@ class wxHtmlLineCell : public wxHtmlCell { public: wxHtmlLineCell(int size, bool shading) : wxHtmlCell() {m_Height = size; m_HasShading = shading;} - void Draw(wxDC& dc, int x, int y, int view_y1, int view_y2); + void Draw(wxDC& dc, int x, int y, int view_y1, int view_y2, + wxHtmlRenderingState& state); void Layout(int w) { m_Width = w; wxHtmlCell::Layout(w); } @@ -52,7 +53,9 @@ class wxHtmlLineCell : public wxHtmlCell }; -void wxHtmlLineCell::Draw(wxDC& dc, int x, int y, int WXUNUSED(view_y1), int WXUNUSED(view_y2)) +void wxHtmlLineCell::Draw(wxDC& dc, int x, int y, + int WXUNUSED(view_y1), int WXUNUSED(view_y2), + wxHtmlRenderingState& WXUNUSED(state)) { wxBrush mybrush(wxT("GREY"), (m_HasShading) ? wxTRANSPARENT : wxSOLID); wxPen mypen(wxT("GREY"), 1, wxSOLID); diff --git a/src/html/m_image.cpp b/src/html/m_image.cpp index 3a5afa6542..c9660bd477 100644 --- a/src/html/m_image.cpp +++ b/src/html/m_image.cpp @@ -50,11 +50,11 @@ WX_DECLARE_OBJARRAY(int, CoordArray); WX_DEFINE_OBJARRAY(CoordArray); -//-------------------------------------------------------------------------------- +// --------------------------------------------------------------------------- // wxHtmlImageMapAreaCell -// 0-width, 0-height cell that represents single area in imagemap -// (it's GetLink is called from wxHtmlImageCell's) -//-------------------------------------------------------------------------------- +// 0-width, 0-height cell that represents single area in +// imagemap (it's GetLink is called from wxHtmlImageCell's) +// --------------------------------------------------------------------------- class wxHtmlImageMapAreaCell : public wxHtmlCell { @@ -67,6 +67,10 @@ class wxHtmlImageMapAreaCell : public wxHtmlCell public: wxHtmlImageMapAreaCell( celltype t, wxString &coords, double pixel_scale = 1.0); virtual wxHtmlLinkInfo *GetLink( int x = 0, int y = 0 ) const; + void Draw(wxDC& WXUNUSED(dc), + int WXUNUSED(x), int WXUNUSED(y), + int WXUNUSED(view_y1), int WXUNUSED(view_y2), + wxHtmlRenderingState& WXUNUSED(state)) {} }; @@ -239,6 +243,10 @@ class wxHtmlImageMapCell : public wxHtmlCell public: virtual wxHtmlLinkInfo *GetLink( int x = 0, int y = 0 ) const; virtual const wxHtmlCell *Find( int cond, const void *param ) const; + void Draw(wxDC& WXUNUSED(dc), + int WXUNUSED(x), int WXUNUSED(y), + int WXUNUSED(view_y1), int WXUNUSED(view_y2), + wxHtmlRenderingState& WXUNUSED(state)) {} }; @@ -282,7 +290,8 @@ public: double scale = 1.0, int align = wxHTML_ALIGN_BOTTOM, const wxString& mapname = wxEmptyString); ~wxHtmlImageCell(); - void Draw(wxDC& dc, int x, int y, int view_y1, int view_y2); + void Draw(wxDC& dc, int x, int y, int view_y1, int view_y2, + wxHtmlRenderingState& state); virtual wxHtmlLinkInfo *GetLink(int x = 0, int y = 0) const; void SetImage(const wxImage& img); @@ -519,7 +528,9 @@ wxHtmlImageCell::~wxHtmlImageCell() } -void wxHtmlImageCell::Draw(wxDC& dc, int x, int y, int WXUNUSED(view_y1), int WXUNUSED(view_y2)) +void wxHtmlImageCell::Draw(wxDC& dc, int x, int y, + int WXUNUSED(view_y1), int WXUNUSED(view_y2), + wxHtmlRenderingState& WXUNUSED(state)) { if ( m_showFrame ) { diff --git a/src/html/m_layout.cpp b/src/html/m_layout.cpp index e501f1f6dc..f99e547ca1 100644 --- a/src/html/m_layout.cpp +++ b/src/html/m_layout.cpp @@ -68,12 +68,18 @@ FORCE_LINK_ME(m_layout) class WXDLLEXPORT wxHtmlPageBreakCell : public wxHtmlCell { - public: +public: wxHtmlPageBreakCell() {} - bool AdjustPagebreak(int* pagebreak, int* known_pagebreaks = NULL, int number_of_pages = 0) const; + bool AdjustPagebreak(int* pagebreak, + int* known_pagebreaks = NULL, + int number_of_pages = 0) const; + void Draw(wxDC& WXUNUSED(dc), + int WXUNUSED(x), int WXUNUSED(y), + int WXUNUSED(view_y1), int WXUNUSED(view_y2), + wxHtmlRenderingState& WXUNUSED(state)) {} - private: +private: DECLARE_NO_COPY_CLASS(wxHtmlPageBreakCell) }; diff --git a/src/html/m_links.cpp b/src/html/m_links.cpp index dd0c0eae07..b1f0d0876f 100644 --- a/src/html/m_links.cpp +++ b/src/html/m_links.cpp @@ -32,18 +32,29 @@ FORCE_LINK_ME(m_links) class wxHtmlAnchorCell : public wxHtmlCell { - private: - wxString m_AnchorName; - - public: - wxHtmlAnchorCell(const wxString& name) : wxHtmlCell() {m_AnchorName = name;} - virtual const wxHtmlCell* Find(int condition, const void* param) const +private: + wxString m_AnchorName; + +public: + wxHtmlAnchorCell(const wxString& name) : wxHtmlCell() + { m_AnchorName = name; } + void Draw(wxDC& WXUNUSED(dc), + int WXUNUSED(x), int WXUNUSED(y), + int WXUNUSED(view_y1), int WXUNUSED(view_y2), + wxHtmlRenderingState& WXUNUSED(state)) {} + + virtual const wxHtmlCell* Find(int condition, const void* param) const + { + if ((condition == wxHTML_COND_ISANCHOR) && + (m_AnchorName == (*((const wxString*)param)))) { - if ((condition == wxHTML_COND_ISANCHOR) && (m_AnchorName == (*((const wxString*)param)))) - return this; - else - return wxHtmlCell::Find(condition, param); + return this; } + else + { + return wxHtmlCell::Find(condition, param); + } + } }; diff --git a/src/html/m_list.cpp b/src/html/m_list.cpp index 0549463eab..144268218a 100644 --- a/src/html/m_list.cpp +++ b/src/html/m_list.cpp @@ -43,7 +43,8 @@ class wxHtmlListmarkCell : public wxHtmlCell wxBrush m_Brush; public: wxHtmlListmarkCell(wxDC *dc, const wxColour& clr); - void Draw(wxDC& dc, int x, int y, int view_y1, int view_y2); + void Draw(wxDC& dc, int x, int y, int view_y1, int view_y2, + wxHtmlRenderingState& state); }; wxHtmlListmarkCell::wxHtmlListmarkCell(wxDC* dc, const wxColour& clr) : wxHtmlCell(), m_Brush(clr, wxSOLID) @@ -55,7 +56,9 @@ wxHtmlListmarkCell::wxHtmlListmarkCell(wxDC* dc, const wxColour& clr) : wxHtmlCe -void wxHtmlListmarkCell::Draw(wxDC& dc, int x, int y, int WXUNUSED(view_y1), int WXUNUSED(view_y2)) +void wxHtmlListmarkCell::Draw(wxDC& dc, int x, int y, + int WXUNUSED(view_y1), int WXUNUSED(view_y2), + wxHtmlRenderingState& WXUNUSED(state)) { dc.SetBrush(m_Brush); dc.DrawEllipse(x + m_PosX + m_Width / 3, y + m_PosY + m_Height / 3, -- 2.47.2