From 173e8bbfb381073b502b74a89e8e666a7b293b9d Mon Sep 17 00:00:00 2001 From: Julian Smart Date: Thu, 22 Feb 2001 17:29:51 +0000 Subject: [PATCH] Attempted to improve tip window behaviour, but kill focus still not working in wxGTK. wxTipWindow now has wxTipWindowView child. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@9415 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/tipwin.h | 13 ++-- src/common/cshelp.cpp | 13 +++- src/generic/tipwin.cpp | 134 ++++++++++++++++++++++++++++++++--------- 3 files changed, 124 insertions(+), 36 deletions(-) diff --git a/include/wx/tipwin.h b/include/wx/tipwin.h index 766f45e7db..37591de446 100644 --- a/include/wx/tipwin.h +++ b/include/wx/tipwin.h @@ -25,24 +25,27 @@ class WXDLLEXPORT wxTipWindow : public wxFrame { + friend class wxTipWindowView; public: + // Supply windowPtr for it to null the given address + // when the window has closed. wxTipWindow(wxWindow *parent, const wxString& text, - wxCoord maxLength = 100); + wxCoord maxLength = 100, wxTipWindow** windowPtr = NULL); + ~wxTipWindow(); + + void SetTipWindowPtr(wxTipWindow** windowPtr) { m_windowPtr = windowPtr; } protected: // event handlers - void OnPaint(wxPaintEvent& event); void OnMouseClick(wxMouseEvent& event); void OnActivate(wxActivateEvent& event); void OnKillFocus(wxFocusEvent& event); - // calculate the client rect we need to display the text - void Adjust(const wxString& text, wxCoord maxLength); - private: wxArrayString m_textLines; wxCoord m_heightLine; + wxTipWindow** m_windowPtr; DECLARE_EVENT_TABLE() }; diff --git a/src/common/cshelp.cpp b/src/common/cshelp.cpp index 60e595f156..3921a21c96 100644 --- a/src/common/cshelp.cpp +++ b/src/common/cshelp.cpp @@ -305,10 +305,21 @@ void wxSimpleHelpProvider::AddHelp(wxWindowID id, const wxString& text) bool wxSimpleHelpProvider::ShowHelp(wxWindowBase *window) { + static wxTipWindow* s_tipWindow = NULL; + + if (s_tipWindow) + { + // Prevent s_tipWindow being nulled in OnIdle, + // thereby removing the chance for the window to be closed by ShowHelp + s_tipWindow->SetTipWindowPtr(NULL); + s_tipWindow->Close(); + } + s_tipWindow = NULL; + wxString text = GetHelp(window); if ( !text.empty() ) { - new wxTipWindow((wxWindow *)window, text); + s_tipWindow = new wxTipWindow((wxWindow *)window, text, 100, & s_tipWindow); return TRUE; } diff --git a/src/generic/tipwin.cpp b/src/generic/tipwin.cpp index 2520a1b2a8..f712aed83f 100644 --- a/src/generic/tipwin.cpp +++ b/src/generic/tipwin.cpp @@ -33,6 +33,7 @@ #endif // WX_PRECOMP #include "wx/tipwin.h" +#include "wx/timer.h" // ---------------------------------------------------------------------------- // constants @@ -50,8 +51,6 @@ static const wxCoord TEXT_MARGIN_Y = 3; // ---------------------------------------------------------------------------- BEGIN_EVENT_TABLE(wxTipWindow, wxFrame) - EVT_PAINT(wxTipWindow::OnPaint) - EVT_LEFT_DOWN(wxTipWindow::OnMouseClick) EVT_RIGHT_DOWN(wxTipWindow::OnMouseClick) EVT_MIDDLE_DOWN(wxTipWindow::OnMouseClick) @@ -59,20 +58,48 @@ BEGIN_EVENT_TABLE(wxTipWindow, wxFrame) EVT_ACTIVATE(wxTipWindow::OnActivate) END_EVENT_TABLE() +// Viewer window to put in the frame +class wxTipWindowView: public wxWindow +{ +public: + wxTipWindowView(wxWindow *parent); + + // event handlers + void OnPaint(wxPaintEvent& event); + void OnMouseClick(wxMouseEvent& event); + void OnKillFocus(wxFocusEvent& event); + + // calculate the client rect we need to display the text + void Adjust(const wxString& text, wxCoord maxLength); + + long m_creationTime; + + DECLARE_EVENT_TABLE() +}; + +BEGIN_EVENT_TABLE(wxTipWindowView, wxWindow) + EVT_PAINT(wxTipWindowView::OnPaint) + EVT_LEFT_DOWN(wxTipWindowView::OnMouseClick) + EVT_RIGHT_DOWN(wxTipWindowView::OnMouseClick) + EVT_MIDDLE_DOWN(wxTipWindowView::OnMouseClick) + EVT_KILL_FOCUS(wxTipWindowView::OnKillFocus) +END_EVENT_TABLE() + + // ---------------------------------------------------------------------------- // wxTipWindow // ---------------------------------------------------------------------------- wxTipWindow::wxTipWindow(wxWindow *parent, const wxString& text, - wxCoord maxLength) + wxCoord maxLength, wxTipWindow** windowPtr) : wxFrame(parent, -1, _T(""), wxDefaultPosition, wxDefaultSize, wxNO_BORDER | wxFRAME_FLOAT_ON_PARENT) { // set colours SetForegroundColour(*wxBLACK); -#if !defined(__WXPM__) && !defined(__WXMAC__) +#if !defined(__WXPM__) SetBackgroundColour(wxColour(0xc3ffff)); #else // What is 0xc3ffff, try some legable documentation for those of us who don't memorize hex codes?? @@ -83,15 +110,62 @@ wxTipWindow::wxTipWindow(wxWindow *parent, wxGetMousePosition(&x, &y); Move(x, y + 20); - Adjust(text, maxLength); + wxTipWindowView* tipWindowView = new wxTipWindowView(this); + tipWindowView->Adjust(text, maxLength); - SetFocus(); + m_windowPtr = windowPtr; Show(TRUE); + tipWindowView->SetFocus(); +} + +wxTipWindow::~wxTipWindow() +{ + if (m_windowPtr) + { + *m_windowPtr = NULL; + } +} + +void wxTipWindow::OnMouseClick(wxMouseEvent& event) +{ + Close(); +} + +void wxTipWindow::OnActivate(wxActivateEvent& event) +{ + if (!event.GetActive()) + Close(); +} + +void wxTipWindow::OnKillFocus(wxFocusEvent& event) +{ + Close(); +} + +// ---------------------------------------------------------------------------- +// wxTipWindowView +// ---------------------------------------------------------------------------- + +wxTipWindowView::wxTipWindowView(wxWindow *parent) + : wxWindow(parent, -1, + wxDefaultPosition, wxDefaultSize, + wxNO_BORDER) +{ + // set colours + SetForegroundColour(*wxBLACK); +#if !defined(__WXPM__) + SetBackgroundColour(wxColour(0xc3ffff)); +#else + // What is 0xc3ffff, try some legable documentation for those of us who don't memorize hex codes?? + SetBackgroundColour(wxColour(*wxWHITE)); +#endif + m_creationTime = wxGetLocalTime(); } -void wxTipWindow::Adjust(const wxString& text, wxCoord maxLength) +void wxTipWindowView::Adjust(const wxString& text, wxCoord maxLength) { + wxTipWindow* parent = (wxTipWindow*) GetParent(); wxClientDC dc(this); dc.SetFont(GetFont()); @@ -100,7 +174,7 @@ void wxTipWindow::Adjust(const wxString& text, wxCoord maxLength) wxString current; wxCoord height, width, widthMax = 0; - m_heightLine = 0; + parent->m_heightLine = 0; bool breakLine = FALSE; for ( const wxChar *p = text.c_str(); ; p++ ) @@ -111,10 +185,10 @@ void wxTipWindow::Adjust(const wxString& text, wxCoord maxLength) if ( width > widthMax ) widthMax = width; - if ( height > m_heightLine ) - m_heightLine = height; + if ( height > parent->m_heightLine ) + parent->m_heightLine = height; - m_textLines.Add(current); + parent->m_textLines.Add(current); if ( !*p ) { @@ -128,7 +202,7 @@ void wxTipWindow::Adjust(const wxString& text, wxCoord maxLength) else if ( breakLine && (*p == _T(' ') || *p == _T('\t')) ) { // word boundary - break the line here - m_textLines.Add(current); + parent->m_textLines.Add(current); current.clear(); breakLine = FALSE; } @@ -142,18 +216,22 @@ void wxTipWindow::Adjust(const wxString& text, wxCoord maxLength) if ( width > widthMax ) widthMax = width; - if ( height > m_heightLine ) - m_heightLine = height; + if ( height > parent->m_heightLine ) + parent->m_heightLine = height; } } // take into account the border size and the margins - SetClientSize(2*(TEXT_MARGIN_X + 1) + widthMax, - 2*(TEXT_MARGIN_Y + 1) + m_textLines.GetCount()*m_heightLine); + GetParent()->SetClientSize(2*(TEXT_MARGIN_X + 1) + widthMax, + 2*(TEXT_MARGIN_Y + 1) + parent->m_textLines.GetCount()*parent->m_heightLine); } -void wxTipWindow::OnPaint(wxPaintEvent& event) +void wxTipWindowView::OnPaint(wxPaintEvent& event) { + wxTipWindow* parent = (wxTipWindow*) GetParent(); + if (!parent) + return; + wxPaintDC dc(this); wxRect rect; @@ -178,27 +256,23 @@ void wxTipWindow::OnPaint(wxPaintEvent& event) wxPoint pt; pt.x = TEXT_MARGIN_X; pt.y = TEXT_MARGIN_Y; - size_t count = m_textLines.GetCount(); + size_t count = parent->m_textLines.GetCount(); for ( size_t n = 0; n < count; n++ ) { - dc.DrawText(m_textLines[n], pt); + dc.DrawText(parent->m_textLines[n], pt); - pt.y += m_heightLine; + pt.y += parent->m_heightLine; } } -void wxTipWindow::OnMouseClick(wxMouseEvent& event) -{ - Close(); -} - -void wxTipWindow::OnActivate(wxActivateEvent& event) +void wxTipWindowView::OnMouseClick(wxMouseEvent& event) { - if (!event.GetActive()) - Close(); + GetParent()->Close(); } -void wxTipWindow::OnKillFocus(wxFocusEvent& event) +void wxTipWindowView::OnKillFocus(wxFocusEvent& event) { - Close(); + // Workaround the kill focus event happening just after creation in wxGTK + if (wxGetLocalTime() > m_creationTime + 1) + GetParent()->Close(); } -- 2.45.2