///////////////////////////////////////////////////////////////////////////////
// Name:        wx/msw/tooltip.h
// Purpose:     wxToolTip class - tooltip control
// Author:      Vadim Zeitlin
// Created:     31.01.99
// Copyright:   (c) 1999 Robert Roebling, Vadim Zeitlin
// Licence:     wxWindows licence
///////////////////////////////////////////////////////////////////////////////

#ifndef _WX_MSW_TOOLTIP_H_
#define _WX_MSW_TOOLTIP_H_

#include "wx/object.h"
#include "wx/gdicmn.h"

class WXDLLIMPEXP_FWD_CORE wxWindow;
class wxToolTipOtherWindows;

class WXDLLIMPEXP_CORE wxToolTip : public wxObject
{
public:
    // ctor & dtor
    wxToolTip(const wxString &tip);
    virtual ~wxToolTip();

    // ctor used by wxStatusBar to associate a tooltip to a portion of
    // the status bar window:
    wxToolTip(wxWindow* win, unsigned int id,
              const wxString &tip, const wxRect& rc);

    // accessors
        // tip text
    void SetTip(const wxString& tip);
    const wxString& GetTip() const { return m_text; }

        // the window we're associated with
    void SetWindow(wxWindow *win);
    wxWindow *GetWindow() const { return m_window; }

    // controlling tooltip behaviour: globally change tooltip parameters
        // enable or disable the tooltips globally
    static void Enable(bool flag);
        // set the delay after which the tooltip appears
    static void SetDelay(long milliseconds);
        // set the delay after which the tooltip disappears or how long the
        // tooltip remains visible
    static void SetAutoPop(long milliseconds);
        // set the delay between subsequent tooltips to appear
    static void SetReshow(long milliseconds);
        // set maximum width for the new tooltips: -1 disables wrapping
        // entirely, 0 restores the default behaviour
    static void SetMaxWidth(int width);

    // implementation only from now on
    // -------------------------------

    // add a window to the tooltip control
    void AddOtherWindow(WXHWND hwnd);

    // remove any tooltip from the window
    static void Remove(WXHWND hwnd, unsigned int id, const wxRect& rc);

    // Set the rectangle we're associated with. This rectangle is only used for
    // the main window, not any sub-windows added with Add() so in general it
    // makes sense to use it for tooltips associated with a single window only.
    void SetRect(const wxRect& rc);

    // Called when TLW shown state is changed and hides the tooltip itself if
    // the window it's associated with is hidden.
    static void UpdateVisibility();

private:
    // This module calls our DeleteToolTipCtrl().
    friend class wxToolTipModule;

    // Adds a window other than our main m_window to this tooltip.
    void DoAddHWND(WXHWND hWnd);

    // Perform the specified operation for the given window only.
    void DoSetTip(WXHWND hWnd);
    void DoRemove(WXHWND hWnd);

    // Call the given function for all windows we're associated with.
    void DoForAllWindows(void (wxToolTip::*func)(WXHWND));


    // the one and only one tooltip control we use - never access it directly
    // but use GetToolTipCtrl() which will create it when needed
    static WXHWND ms_hwndTT;

    // create the tooltip ctrl if it doesn't exist yet and return its HWND
    static WXHWND GetToolTipCtrl();

    // to be used in wxModule for deleting tooltip ctrl window when exiting mainloop
    static void DeleteToolTipCtrl();

    // new tooltip maximum width, defaults to min(display width, 400)
    static int ms_maxWidth;

    // remove this tooltip from the tooltip control
    void Remove();

    // adjust tooltip max width based on current tooltip text
    bool AdjustMaxWidth();

    wxString  m_text;           // tooltip text
    wxWindow* m_window;         // main window we're associated with
    wxToolTipOtherWindows *m_others; // other windows associated with it or nullptr
    wxRect    m_rect;           // the rect of the window for which this tooltip is shown
                                // (or a rect with width/height == 0 to show it for the entire window)
    unsigned int m_id;          // the id of this tooltip (ignored when m_rect width/height is 0)

    wxDECLARE_ABSTRACT_CLASS(wxToolTip);
    wxDECLARE_NO_COPY_CLASS(wxToolTip);
};

#endif // _WX_MSW_TOOLTIP_H_
