X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9806a0e71eb2190827e93cd463e9682a3b939eee..673ad11240bf326b7f74e2835ddaf7dc41a0813c:/src/generic/tipwin.cpp diff --git a/src/generic/tipwin.cpp b/src/generic/tipwin.cpp index 1469b554c7..824df91743 100644 --- a/src/generic/tipwin.cpp +++ b/src/generic/tipwin.cpp @@ -33,7 +33,11 @@ #endif // WX_PRECOMP #include "wx/tipwin.h" + +#if wxUSE_TIPWINDOW + #include "wx/timer.h" +#include "wx/settings.h" // ---------------------------------------------------------------------------- // constants @@ -50,39 +54,11 @@ static const wxCoord TEXT_MARGIN_Y = 3; // event tables // ---------------------------------------------------------------------------- -BEGIN_EVENT_TABLE(wxTipWindow, wxFrame) +BEGIN_EVENT_TABLE(wxTipWindow, wxPopupTransientWindow) EVT_LEFT_DOWN(wxTipWindow::OnMouseClick) EVT_RIGHT_DOWN(wxTipWindow::OnMouseClick) EVT_MIDDLE_DOWN(wxTipWindow::OnMouseClick) - EVT_KILL_FOCUS(wxTipWindow::OnKillFocus) - 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) + EVT_PAINT(wxTipWindow::OnPaint) END_EVENT_TABLE() @@ -93,25 +69,29 @@ END_EVENT_TABLE() wxTipWindow::wxTipWindow(wxWindow *parent, const wxString& text, wxCoord maxLength, wxTipWindow** windowPtr) - : wxFrame(parent, -1, _T(""), - wxDefaultPosition, wxDefaultSize, - wxNO_BORDER | wxFRAME_FLOAT_ON_PARENT) + : wxPopupTransientWindow(parent) { + m_windowPtr = windowPtr; + // set colours SetForegroundColour(*wxBLACK); - SetBackgroundColour(wxColour(255, 255, 231)); - // set position and size - int x, y; - wxGetMousePosition(&x, &y); - Move(x, y + 20); - wxTipWindowView* tipWindowView = new wxTipWindowView(this); - tipWindowView->Adjust(text, maxLength); +#ifdef __WXMSW__ + wxColour bkCol(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_INFOBK)); +#else + wxColour bkCol(wxColour(255, 255, 225)); +#endif + SetBackgroundColour(bkCol); - m_windowPtr = windowPtr; + // set size and position + Adjust(text, maxLength); + int x, y; + wxGetMousePosition(&x, &y); + Position(wxPoint(x, y+10), wxSize(0,0)); - Show(TRUE); - tipWindowView->SetFocus(); + //Show(TRUE); + Popup(); + SetFocus(); } wxTipWindow::~wxTipWindow() @@ -127,40 +107,40 @@ void wxTipWindow::OnMouseClick(wxMouseEvent& WXUNUSED(event)) Close(); } -void wxTipWindow::OnActivate(wxActivateEvent& event) -{ - if (!event.GetActive()) - Close(); -} -void wxTipWindow::OnKillFocus(wxFocusEvent& WXUNUSED(event)) +void wxTipWindow::OnPaint(wxPaintEvent& WXUNUSED(event)) { - // Under Windows at least, we will get this immediately - // because when the view window is focussed, the - // tip window goes out of focus. -#ifdef __WXGTK__ - Close(); -#endif -} + wxPaintDC dc(this); -// ---------------------------------------------------------------------------- -// wxTipWindowView -// ---------------------------------------------------------------------------- + wxRect rect; + wxSize size = GetClientSize(); + rect.width = size.x; + rect.height = size.y; -wxTipWindowView::wxTipWindowView(wxWindow *parent) - : wxWindow(parent, -1, - wxDefaultPosition, wxDefaultSize, - wxNO_BORDER) -{ - // set colours - SetForegroundColour(*wxBLACK); - SetBackgroundColour(wxColour(255, 255, 231)); - m_creationTime = wxGetLocalTime(); + // first filll the background + dc.SetBrush(wxBrush(GetBackgroundColour(), wxSOLID)); + + dc.SetPen( * wxBLACK_PEN ); + dc.DrawRectangle(rect); + + // and then draw the text line by line + dc.SetFont(GetFont()); + + wxPoint pt; + pt.x = TEXT_MARGIN_X; + pt.y = TEXT_MARGIN_Y; + size_t count = m_textLines.GetCount(); + for ( size_t n = 0; n < count; n++ ) + { + dc.DrawText(m_textLines[n], pt); + + pt.y += m_heightLine; + } } -void wxTipWindowView::Adjust(const wxString& text, wxCoord maxLength) + +void wxTipWindow::Adjust(const wxString& text, wxCoord maxLength) { - wxTipWindow* parent = (wxTipWindow*) GetParent(); wxClientDC dc(this); dc.SetFont(GetFont()); @@ -169,7 +149,7 @@ void wxTipWindowView::Adjust(const wxString& text, wxCoord maxLength) wxString current; wxCoord height, width, widthMax = 0; - parent->m_heightLine = 0; + m_heightLine = 0; bool breakLine = FALSE; for ( const wxChar *p = text.c_str(); ; p++ ) @@ -180,10 +160,10 @@ void wxTipWindowView::Adjust(const wxString& text, wxCoord maxLength) if ( width > widthMax ) widthMax = width; - if ( height > parent->m_heightLine ) - parent->m_heightLine = height; + if ( height > m_heightLine ) + m_heightLine = height; - parent->m_textLines.Add(current); + m_textLines.Add(current); if ( !*p ) { @@ -197,7 +177,7 @@ void wxTipWindowView::Adjust(const wxString& text, wxCoord maxLength) else if ( breakLine && (*p == _T(' ') || *p == _T('\t')) ) { // word boundary - break the line here - parent->m_textLines.Add(current); + m_textLines.Add(current); current.clear(); breakLine = FALSE; } @@ -211,64 +191,22 @@ void wxTipWindowView::Adjust(const wxString& text, wxCoord maxLength) if ( width > widthMax ) widthMax = width; - if ( height > parent->m_heightLine ) - parent->m_heightLine = height; + if ( height > m_heightLine ) + m_heightLine = height; } } // take into account the border size and the margins - GetParent()->SetClientSize(2*(TEXT_MARGIN_X + 1) + widthMax, - 2*(TEXT_MARGIN_Y + 1) + parent->m_textLines.GetCount()*parent->m_heightLine); + SetClientSize(2*(TEXT_MARGIN_X + 1) + widthMax, + 2*(TEXT_MARGIN_Y + 1) + m_textLines.GetCount() * m_heightLine); } -void wxTipWindowView::OnPaint(wxPaintEvent& WXUNUSED(event)) -{ - wxTipWindow* parent = (wxTipWindow*) GetParent(); - if (!parent) - return; - - wxPaintDC dc(this); - - wxRect rect; - wxSize size = GetClientSize(); - rect.width = size.x; - rect.height = size.y; - - // first filll the background - dc.SetBrush(wxBrush(GetBackgroundColour(), wxSOLID)); - // Under Windows, you apparently get a thin black border whether you like it or not :-( -#ifdef __WXMSW__ - dc.SetPen( * wxTRANSPARENT_PEN ); -#else - dc.SetPen( * wxBLACK_PEN ); -#endif - dc.DrawRectangle(rect); - - // and then draw the text line by line - dc.SetFont(GetFont()); - - wxPoint pt; - pt.x = TEXT_MARGIN_X; - pt.y = TEXT_MARGIN_Y; - size_t count = parent->m_textLines.GetCount(); - for ( size_t n = 0; n < count; n++ ) - { - dc.DrawText(parent->m_textLines[n], pt); - - pt.y += parent->m_heightLine; - } -} - -void wxTipWindowView::OnMouseClick(wxMouseEvent& WXUNUSED(event)) +void wxTipWindow::Close() { - GetParent()->Close(); + Show(FALSE); + Destroy(); } -void wxTipWindowView::OnKillFocus(wxFocusEvent& WXUNUSED(event)) -{ - // Workaround the kill focus event happening just after creation in wxGTK - if (wxGetLocalTime() > m_creationTime + 1) - GetParent()->Close(); -} +#endif // wxUSE_TIPWINDOW