1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
/*
* This file is part of the Code::Blocks IDE and licensed under the GNU Lesser General Public License, version 3
* http://www.gnu.org/licenses/lgpl-3.0.html
*/
/*
* Objects of type InfoWindow are autonomous and must therefore always be instantiated using operator new.
* In addition to this, InfoWindow does not have any non-static public class members.
*
* Since a (technically 100% correct) statement like
* new InfoWindow("foo", "bar");
* is unintuitive, confusing or even objective to some people, this class uses a variation of the "Named Constructor Idiom".
*
* InfoWindow::Display("foo", "bar");
* does the exact same thing as the above statement but looks a lot nicer.
*/
#ifndef INFOWINDOW_H
#define INFOWINDOW_H
#include <wx/event.h>
#include <wx/timer.h>
#include <wx/string.h>
#if wxUSE_POPUPWIN
#include <wx/popupwin.h>
typedef wxPopupWindow wxInfoWindowBase;
#else
#include "scrollingdialog.h"
typedef wxScrollingDialog wxInfoWindowBase;
#endif
#undef new
#include <list>
#include <algorithm>
class Stacker
{
std::list<int> widths;
public:
int StackMe(int mySize)
{
mySize += 3;
int pos = 0;
if(!widths.empty())
pos = *(std::max_element(widths.begin(), widths.end()));
widths.push_back(pos + mySize);
return pos + mySize;
};
void ReleaseMe(int myPos)
{
std::list<int>::iterator it = std::find(widths.begin(), widths.end(), myPos);
if(it != widths.end())
widths.erase(it);
};
};
class InfoWindow : public wxInfoWindowBase
{
wxTimer *m_timer;
int left;
int top;
int hMin;
int pos;
unsigned int status;
unsigned int m_delay;
unsigned int ks;
std::list<wxString>::iterator my_message_iterator;
static Stacker stacker;
static int screenWidth;
static int screenHeight;
static std::list<wxString> active_messages; // if a new message is in this, don't display it (already is displayed). Check Display()
InfoWindow(const wxString& title, const wxString& message, unsigned int delay, unsigned int hysteresis);
virtual ~InfoWindow();
void OnTimer(wxTimerEvent& e);
void OnMove(wxMouseEvent& e);
void OnClick(wxMouseEvent& e);
DECLARE_EVENT_TABLE()
public:
static void Display(const wxString& title, const wxString& message, unsigned int delay = 5000, unsigned int hysteresis = 1);
};
#endif
|