X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/04ef50df3a0fa3c343800c554e609f98fc7575cc..e7ca6139d062c37cc7c056b6647097e999b714cd:/src/generic/tipwin.cpp diff --git a/src/generic/tipwin.cpp b/src/generic/tipwin.cpp index f9c3b5538c..f90be60652 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,14 +54,21 @@ static const wxCoord TEXT_MARGIN_Y = 3; // event tables // ---------------------------------------------------------------------------- +#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 { @@ -67,12 +78,15 @@ public: // event handlers void OnPaint(wxPaintEvent& event); void OnMouseClick(wxMouseEvent& event); +#if !wxUSE_POPUPWIN void OnKillFocus(wxFocusEvent& event); - +#endif // 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() }; @@ -82,10 +96,11 @@ BEGIN_EVENT_TABLE(wxTipWindowView, wxWindow) EVT_LEFT_DOWN(wxTipWindowView::OnMouseClick) EVT_RIGHT_DOWN(wxTipWindowView::OnMouseClick) EVT_MIDDLE_DOWN(wxTipWindowView::OnMouseClick) +#if !wxUSE_POPUPWIN EVT_KILL_FOCUS(wxTipWindowView::OnKillFocus) +#endif END_EVENT_TABLE() - // ---------------------------------------------------------------------------- // wxTipWindow // ---------------------------------------------------------------------------- @@ -93,10 +108,16 @@ END_EVENT_TABLE() wxTipWindow::wxTipWindow(wxWindow *parent, const wxString& text, wxCoord maxLength, wxTipWindow** windowPtr) +#if wxUSE_POPUPWIN + : wxPopupTransientWindow(parent) +#else : wxFrame(parent, -1, _T(""), wxDefaultPosition, wxDefaultSize, - wxNO_BORDER | wxFRAME_FLOAT_ON_PARENT) + wxNO_BORDER | wxFRAME_NO_TASKBAR ) +#endif { + m_windowPtr = windowPtr; + // set colours SetForegroundColour(*wxBLACK); @@ -107,18 +128,19 @@ wxTipWindow::wxTipWindow(wxWindow *parent, #endif SetBackgroundColour(bkCol); - // set position and size - int x, y; - wxGetMousePosition(&x, &y); - Move(x, y + 20); - + // set size, position and show it wxTipWindowView* tipWindowView = new wxTipWindowView(this); tipWindowView->Adjust(text, maxLength); - - m_windowPtr = windowPtr; - - Show(TRUE); tipWindowView->SetFocus(); + int x, y; + wxGetMousePosition(&x, &y); +#if wxUSE_POPUPWIN + Position(wxPoint(x, y+10), wxSize(0,0)); + Popup(tipWindowView); +#else + Move(x, y + 10); + Show(TRUE); +#endif } wxTipWindow::~wxTipWindow() @@ -134,6 +156,7 @@ void wxTipWindow::OnMouseClick(wxMouseEvent& WXUNUSED(event)) Close(); } +#if !wxUSE_POPUPWIN void wxTipWindow::OnActivate(wxActivateEvent& event) { if (!event.GetActive()) @@ -149,6 +172,18 @@ void wxTipWindow::OnKillFocus(wxFocusEvent& WXUNUSED(event)) Close(); #endif } +#endif + + +void wxTipWindow::Close() +{ +#if wxUSE_POPUPWIN + Show(FALSE); + Destroy(); +#else + wxFrame::Close(); +#endif +} // ---------------------------------------------------------------------------- // wxTipWindowView @@ -168,11 +203,11 @@ wxTipWindowView::wxTipWindowView(wxWindow *parent) #endif SetBackgroundColour(bkCol); m_creationTime = wxGetLocalTime(); + m_parent = (wxTipWindow*)parent; } void wxTipWindowView::Adjust(const wxString& text, wxCoord maxLength) { - wxTipWindow* parent = (wxTipWindow*) GetParent(); wxClientDC dc(this); dc.SetFont(GetFont()); @@ -181,7 +216,7 @@ void wxTipWindowView::Adjust(const wxString& text, wxCoord maxLength) wxString current; wxCoord height, width, widthMax = 0; - parent->m_heightLine = 0; + m_parent->m_heightLine = 0; bool breakLine = FALSE; for ( const wxChar *p = text.c_str(); ; p++ ) @@ -192,10 +227,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_parent->m_heightLine ) + m_parent->m_heightLine = height; - parent->m_textLines.Add(current); + m_parent->m_textLines.Add(current); if ( !*p ) { @@ -209,7 +244,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_parent->m_textLines.Add(current); current.clear(); breakLine = FALSE; } @@ -223,22 +258,20 @@ 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_parent->m_heightLine ) + m_parent->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); + width = 2*(TEXT_MARGIN_X + 1) + widthMax; + height = 2*(TEXT_MARGIN_Y + 1) + m_parent->m_textLines.GetCount()*m_parent->m_heightLine; + m_parent->SetClientSize(width, height); + SetSize(0, 0, width, height); } void wxTipWindowView::OnPaint(wxPaintEvent& WXUNUSED(event)) { - wxTipWindow* parent = (wxTipWindow*) GetParent(); - if (!parent) - return; - wxPaintDC dc(this); wxRect rect; @@ -248,39 +281,38 @@ void wxTipWindowView::OnPaint(wxPaintEvent& WXUNUSED(event)) // 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.SetPen( wxPen(GetForegroundColour(), 1, wxSOLID) ); dc.DrawRectangle(rect); // and then draw the text line by line + dc.SetTextBackground(GetBackgroundColour()); + dc.SetTextForeground(GetForegroundColour()); dc.SetFont(GetFont()); wxPoint pt; pt.x = TEXT_MARGIN_X; pt.y = TEXT_MARGIN_Y; - size_t count = parent->m_textLines.GetCount(); + size_t count = m_parent->m_textLines.GetCount(); for ( size_t n = 0; n < count; n++ ) { - dc.DrawText(parent->m_textLines[n], pt); + dc.DrawText(m_parent->m_textLines[n], pt); - pt.y += parent->m_heightLine; + pt.y += m_parent->m_heightLine; } } void wxTipWindowView::OnMouseClick(wxMouseEvent& WXUNUSED(event)) { - GetParent()->Close(); + m_parent->Close(); } +#if !wxUSE_POPUPWIN void wxTipWindowView::OnKillFocus(wxFocusEvent& WXUNUSED(event)) { // Workaround the kill focus event happening just after creation in wxGTK if (wxGetLocalTime() > m_creationTime + 1) - GetParent()->Close(); + m_parent->Close(); } +#endif +#endif