X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a756f210019dd5b51331b7181c816d3882146a30..010d821b3138ae39c43403da64eb0bcde9af82ae:/src/generic/tipwin.cpp?ds=sidebyside diff --git a/src/generic/tipwin.cpp b/src/generic/tipwin.cpp index 01c0e5151e..7ab7e77ee0 100644 --- a/src/generic/tipwin.cpp +++ b/src/generic/tipwin.cpp @@ -4,9 +4,8 @@ // Author: Vadim Zeitlin // Modified by: // Created: 10.09.00 -// RCS-ID: $Id$ // Copyright: (c) 2000 Vadim Zeitlin -// Licence: wxWindows license +// Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// // ============================================================================ @@ -17,27 +16,22 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ - #pragma implementation "tipwin.h" -#endif - -// For compilers that support precompilatixon, includes "wx/wx.h". +// For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif -#ifndef WX_PRECOMP - #include "wx/dcclient.h" -#endif // WX_PRECOMP +#if wxUSE_TIPWINDOW #include "wx/tipwin.h" -#if wxUSE_TIPWINDOW - -#include "wx/timer.h" -#include "wx/settings.h" +#ifndef WX_PRECOMP + #include "wx/dcclient.h" + #include "wx/timer.h" + #include "wx/settings.h" +#endif // WX_PRECOMP // ---------------------------------------------------------------------------- // constants @@ -46,31 +40,12 @@ static const wxCoord TEXT_MARGIN_X = 3; static const wxCoord TEXT_MARGIN_Y = 3; -// ============================================================================ -// implementation -// ============================================================================ - // ---------------------------------------------------------------------------- -// event tables +// wxTipWindowView // ---------------------------------------------------------------------------- -#if wxUSE_POPUPWIN -BEGIN_EVENT_TABLE(wxTipWindow, wxPopupTransientWindow) -#else -BEGIN_EVENT_TABLE(wxTipWindow, wxFrame) -#endif - EVT_LEFT_DOWN(wxTipWindow::OnMouseClick) - EVT_RIGHT_DOWN(wxTipWindow::OnMouseClick) - EVT_MIDDLE_DOWN(wxTipWindow::OnMouseClick) -#if !wxUSE_POPUPWIN - EVT_KILL_FOCUS(wxTipWindow::OnKillFocus) - EVT_ACTIVATE(wxTipWindow::OnActivate) -#endif -END_EVENT_TABLE() - - // Viewer window to put in the frame -class wxTipWindowView: public wxWindow +class WXDLLEXPORT wxTipWindowView : public wxWindow { public: wxTipWindowView(wxWindow *parent); @@ -78,27 +53,57 @@ public: // event handlers void OnPaint(wxPaintEvent& event); void OnMouseClick(wxMouseEvent& event); + void OnMouseMove(wxMouseEvent& event); + #if !wxUSE_POPUPWIN void OnKillFocus(wxFocusEvent& event); -#endif +#endif // wxUSE_POPUPWIN + // calculate the client rect we need to display the text void Adjust(const wxString& text, wxCoord maxLength); private: - long m_creationTime; wxTipWindow* m_parent; - DECLARE_EVENT_TABLE() +#if !wxUSE_POPUPWIN + long m_creationTime; +#endif // !wxUSE_POPUPWIN + + DECLARE_EVENT_TABLE() + wxDECLARE_NO_COPY_CLASS(wxTipWindowView); }; +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// event tables +// ---------------------------------------------------------------------------- + +BEGIN_EVENT_TABLE(wxTipWindow, wxTipWindowBase) + EVT_LEFT_DOWN(wxTipWindow::OnMouseClick) + EVT_RIGHT_DOWN(wxTipWindow::OnMouseClick) + EVT_MIDDLE_DOWN(wxTipWindow::OnMouseClick) + +#if !wxUSE_POPUPWIN + EVT_KILL_FOCUS(wxTipWindow::OnKillFocus) + EVT_ACTIVATE(wxTipWindow::OnActivate) +#endif // !wxUSE_POPUPWIN +END_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_MOTION(wxTipWindowView::OnMouseMove) + #if !wxUSE_POPUPWIN EVT_KILL_FOCUS(wxTipWindowView::OnKillFocus) -#endif +#endif // !wxUSE_POPUPWIN END_EVENT_TABLE() // ---------------------------------------------------------------------------- @@ -107,48 +112,66 @@ END_EVENT_TABLE() wxTipWindow::wxTipWindow(wxWindow *parent, const wxString& text, - wxCoord maxLength, wxTipWindow** windowPtr) + wxCoord maxLength, + wxTipWindow** windowPtr, + wxRect *rectBounds) #if wxUSE_POPUPWIN : wxPopupTransientWindow(parent) #else - : wxFrame(parent, -1, _T(""), + : wxFrame(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxNO_BORDER | wxFRAME_NO_TASKBAR ) #endif { - m_windowPtr = windowPtr; + SetTipWindowPtr(windowPtr); + if ( rectBounds ) + { + SetBoundingRect(*rectBounds); + } // set colours - SetForegroundColour(*wxBLACK); - -#ifdef __WXMSW__ - wxColour bkCol(wxSystemSettings::GetColour(wxSYS_COLOUR_INFOBK)); -#else - wxColour bkCol(wxColour(255, 255, 225)); -#endif - SetBackgroundColour(bkCol); + SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_INFOTEXT)); + SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_INFOBK)); // set size, position and show it - wxTipWindowView* tipWindowView = new wxTipWindowView(this); - tipWindowView->Adjust(text, maxLength); - tipWindowView->SetFocus(); + m_view = new wxTipWindowView(this); + m_view->Adjust(text, maxLength); + m_view->SetFocus(); + int x, y; wxGetMousePosition(&x, &y); + + // we want to show the tip below the mouse, not over it + // + // NB: the reason we use "/ 2" here is that we don't know where the current + // cursors hot spot is... it would be nice if we could find this out + // though + y += wxSystemSettings::GetMetric(wxSYS_CURSOR_Y) / 2; + #if wxUSE_POPUPWIN - Position(wxPoint(x, y+10), wxSize(0,0)); - Popup(tipWindowView); + Position(wxPoint(x, y), wxSize(0,0)); + Popup(m_view); + #ifdef __WXGTK__ + m_view->CaptureMouse(); + #endif #else - Move(x, y + 10); - Show(TRUE); + Move(x, y); + Show(true); #endif } wxTipWindow::~wxTipWindow() { - if (m_windowPtr) + if ( m_windowPtr ) { *m_windowPtr = NULL; } + #if wxUSE_POPUPWIN + #ifdef __WXGTK__ + if ( m_view->HasCapture() ) + m_view->ReleaseMouse(); + #endif + #endif } void wxTipWindow::OnMouseClick(wxMouseEvent& WXUNUSED(event)) @@ -156,7 +179,15 @@ void wxTipWindow::OnMouseClick(wxMouseEvent& WXUNUSED(event)) Close(); } -#if !wxUSE_POPUPWIN +#if wxUSE_POPUPWIN + +void wxTipWindow::OnDismiss() +{ + Close(); +} + +#else // !wxUSE_POPUPWIN + void wxTipWindow::OnActivate(wxActivateEvent& event) { if (!event.GetActive()) @@ -172,14 +203,33 @@ void wxTipWindow::OnKillFocus(wxFocusEvent& WXUNUSED(event)) Close(); #endif } -#endif +#endif // wxUSE_POPUPWIN // !wxUSE_POPUPWIN + +void wxTipWindow::SetBoundingRect(const wxRect& rectBound) +{ + m_rectBound = rectBound; +} void wxTipWindow::Close() { + if ( m_windowPtr ) + { + *m_windowPtr = NULL; + m_windowPtr = NULL; + } + #if wxUSE_POPUPWIN - Show(FALSE); - Destroy(); + Show(false); + #ifdef __WXGTK__ + if ( m_view->HasCapture() ) + m_view->ReleaseMouse(); + #endif + // Under OS X we get destroyed because of wxEVT_KILL_FOCUS generated by + // Show(false). + #ifndef __WXOSX__ + Destroy(); + #endif #else wxFrame::Close(); #endif @@ -190,19 +240,18 @@ void wxTipWindow::Close() // ---------------------------------------------------------------------------- wxTipWindowView::wxTipWindowView(wxWindow *parent) - : wxWindow(parent, -1, - wxDefaultPosition, wxDefaultSize, - wxNO_BORDER) + : wxWindow(parent, wxID_ANY, + wxDefaultPosition, wxDefaultSize, + wxNO_BORDER) { // set colours - SetForegroundColour(*wxBLACK); -#ifdef __WXMSW__ - wxColour bkCol(wxSystemSettings::GetColour(wxSYS_COLOUR_INFOBK)); -#else - wxColour bkCol(wxColour(255, 255, 225)); -#endif - SetBackgroundColour(bkCol); + SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_INFOTEXT)); + SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_INFOBK)); + +#if !wxUSE_POPUPWIN m_creationTime = wxGetLocalTime(); +#endif // !wxUSE_POPUPWIN + m_parent = (wxTipWindow*)parent; } @@ -218,10 +267,10 @@ void wxTipWindowView::Adjust(const wxString& text, wxCoord maxLength) widthMax = 0; m_parent->m_heightLine = 0; - bool breakLine = FALSE; + bool breakLine = false; for ( const wxChar *p = text.c_str(); ; p++ ) { - if ( *p == _T('\n') || *p == _T('\0') ) + if ( *p == wxT('\n') || *p == wxT('\0') ) { dc.GetTextExtent(current, &width, &height); if ( width > widthMax ) @@ -239,21 +288,21 @@ void wxTipWindowView::Adjust(const wxString& text, wxCoord maxLength) } current.clear(); - breakLine = FALSE; + breakLine = false; } - else if ( breakLine && (*p == _T(' ') || *p == _T('\t')) ) + else if ( breakLine && (*p == wxT(' ') || *p == wxT('\t')) ) { // word boundary - break the line here m_parent->m_textLines.Add(current); current.clear(); - breakLine = FALSE; + breakLine = false; } else // line goes on { current += *p; dc.GetTextExtent(current, &width, &height); if ( width > maxLength ) - breakLine = TRUE; + breakLine = true; if ( width > widthMax ) widthMax = width; @@ -265,7 +314,7 @@ void wxTipWindowView::Adjust(const wxString& text, wxCoord maxLength) // take into account the border size and the margins width = 2*(TEXT_MARGIN_X + 1) + widthMax; - height = 2*(TEXT_MARGIN_Y + 1) + m_parent->m_textLines.GetCount()*m_parent->m_heightLine; + height = 2*(TEXT_MARGIN_Y + 1) + wx_truncate_cast(wxCoord, m_parent->m_textLines.GetCount())*m_parent->m_heightLine; m_parent->SetClientSize(width, height); SetSize(0, 0, width, height); } @@ -280,8 +329,8 @@ void wxTipWindowView::OnPaint(wxPaintEvent& WXUNUSED(event)) rect.height = size.y; // first filll the background - dc.SetBrush(wxBrush(GetBackgroundColour(), wxSOLID)); - dc.SetPen( wxPen(GetForegroundColour(), 1, wxSOLID) ); + dc.SetBrush(wxBrush(GetBackgroundColour(), wxBRUSHSTYLE_SOLID)); + dc.SetPen(wxPen(GetForegroundColour(), 1, wxPENSTYLE_SOLID)); dc.DrawRectangle(rect); // and then draw the text line by line @@ -306,6 +355,22 @@ void wxTipWindowView::OnMouseClick(wxMouseEvent& WXUNUSED(event)) m_parent->Close(); } +void wxTipWindowView::OnMouseMove(wxMouseEvent& event) +{ + const wxRect& rectBound = m_parent->m_rectBound; + + if ( rectBound.width && + !rectBound.Contains(ClientToScreen(event.GetPosition())) ) + { + // mouse left the bounding rect, disappear + m_parent->Close(); + } + else + { + event.Skip(); + } +} + #if !wxUSE_POPUPWIN void wxTipWindowView::OnKillFocus(wxFocusEvent& WXUNUSED(event)) { @@ -313,6 +378,6 @@ void wxTipWindowView::OnKillFocus(wxFocusEvent& WXUNUSED(event)) if (wxGetLocalTime() > m_creationTime + 1) m_parent->Close(); } -#endif +#endif // !wxUSE_POPUPWIN -#endif +#endif // wxUSE_TIPWINDOW