better prevention of inventory relaying during initial download,
[novacoin.git] / ui.h
1 // Copyright (c) 2009-2010 Satoshi Nakamoto\r
2 // Distributed under the MIT/X11 software license, see the accompanying\r
3 // file license.txt or http://www.opensource.org/licenses/mit-license.php.\r
4 \r
5 DECLARE_EVENT_TYPE(wxEVT_UITHREADCALL, -1)\r
6 \r
7 #if wxUSE_GUI\r
8 static const bool fGUI=true;\r
9 #else\r
10 static const bool fGUI=false;\r
11 #endif\r
12 \r
13 inline int MyMessageBox(const wxString& message, const wxString& caption="Message", int style=wxOK, wxWindow* parent=NULL, int x=-1, int y=-1)\r
14 {\r
15 #if wxUSE_GUI\r
16     if (!fDaemon)\r
17         return wxMessageBox(message, caption, style, parent, x, y);\r
18 #endif\r
19     printf("wxMessageBox %s: %s\n", string(caption).c_str(), string(message).c_str());\r
20     fprintf(stderr, "%s: %s\n", string(caption).c_str(), string(message).c_str());\r
21     return wxOK;\r
22 }\r
23 #define wxMessageBox  MyMessageBox\r
24 \r
25 \r
26 \r
27 \r
28 void HandleCtrlA(wxKeyEvent& event);\r
29 string FormatTxStatus(const CWalletTx& wtx);\r
30 void UIThreadCall(boost::function0<void>);\r
31 int ThreadSafeMessageBox(const string& message, const string& caption="Message", int style=wxOK, wxWindow* parent=NULL, int x=-1, int y=-1);\r
32 bool ThreadSafeAskFee(int64 nFeeRequired, const string& strCaption, wxWindow* parent);\r
33 void CalledSetStatusBar(const string& strText, int nField);\r
34 void MainFrameRepaint();\r
35 void CreateMainWindow();\r
36 \r
37 \r
38 \r
39 \r
40 \r
41 #if !wxUSE_GUI\r
42 inline int ThreadSafeMessageBox(const string& message, const string& caption, int style, wxWindow* parent, int x, int y)\r
43 {\r
44     return MyMessageBox(message, caption, style, parent, x, y);\r
45 }\r
46 \r
47 inline bool ThreadSafeAskFee(int64 nFeeRequired, const string& strCaption, wxWindow* parent)\r
48 {\r
49     return true;\r
50 }\r
51 \r
52 inline void CalledSetStatusBar(const string& strText, int nField)\r
53 {\r
54 }\r
55 \r
56 inline void UIThreadCall(boost::function0<void> fn)\r
57 {\r
58 }\r
59 \r
60 inline void MainFrameRepaint()\r
61 {\r
62 }\r
63 \r
64 inline void CreateMainWindow()\r
65 {\r
66 }\r
67 #else // wxUSE_GUI\r
68 \r
69 \r
70 \r
71 \r
72 \r
73 class CMainFrame : public CMainFrameBase\r
74 {\r
75 protected:\r
76     // Event handlers\r
77     void OnNotebookPageChanged(wxNotebookEvent& event);\r
78     void OnClose(wxCloseEvent& event);\r
79     void OnIconize(wxIconizeEvent& event);\r
80     void OnMouseEvents(wxMouseEvent& event);\r
81     void OnKeyDown(wxKeyEvent& event) { HandleCtrlA(event); }\r
82     void OnIdle(wxIdleEvent& event);\r
83     void OnPaint(wxPaintEvent& event);\r
84     void OnPaintListCtrl(wxPaintEvent& event);\r
85     void OnMenuFileExit(wxCommandEvent& event);\r
86     void OnMenuOptionsGenerate(wxCommandEvent& event);\r
87     void OnUpdateUIOptionsGenerate(wxUpdateUIEvent& event);\r
88     void OnMenuOptionsChangeYourAddress(wxCommandEvent& event);\r
89     void OnMenuOptionsOptions(wxCommandEvent& event);\r
90     void OnMenuHelpAbout(wxCommandEvent& event);\r
91     void OnButtonSend(wxCommandEvent& event);\r
92     void OnButtonAddressBook(wxCommandEvent& event);\r
93     void OnSetFocusAddress(wxFocusEvent& event);\r
94     void OnMouseEventsAddress(wxMouseEvent& event);\r
95     void OnButtonNew(wxCommandEvent& event);\r
96     void OnButtonCopy(wxCommandEvent& event);\r
97     void OnListColBeginDrag(wxListEvent& event);\r
98     void OnListItemActivated(wxListEvent& event);\r
99     void OnListItemActivatedProductsSent(wxListEvent& event);\r
100     void OnListItemActivatedOrdersSent(wxListEvent& event);\r
101     void OnListItemActivatedOrdersReceived(wxListEvent& event);\r
102         \r
103 public:\r
104     /** Constructor */\r
105     CMainFrame(wxWindow* parent);\r
106     ~CMainFrame();\r
107 \r
108     // Custom\r
109     enum\r
110     {\r
111         ALL = 0,\r
112         SENTRECEIVED = 1,\r
113         SENT = 2,\r
114         RECEIVED = 3,\r
115     };\r
116     int nPage;\r
117     wxListCtrl* m_listCtrl;\r
118     bool fShowGenerated;\r
119     bool fShowSent;\r
120     bool fShowReceived;\r
121     bool fRefreshListCtrl;\r
122     bool fRefreshListCtrlRunning;\r
123     bool fOnSetFocusAddress;\r
124     unsigned int nListViewUpdated;\r
125     bool fRefresh;\r
126 \r
127     void OnUIThreadCall(wxCommandEvent& event);\r
128     int GetSortIndex(const string& strSort);\r
129     void InsertLine(bool fNew, int nIndex, uint256 hashKey, string strSort, const wxString& str1, const wxString& str2, const wxString& str3, const wxString& str4, const wxString& str5);\r
130     bool DeleteLine(uint256 hashKey);\r
131     bool InsertTransaction(const CWalletTx& wtx, bool fNew, int nIndex=-1);\r
132     void RefreshListCtrl();\r
133     void RefreshStatusColumn();\r
134 };\r
135 \r
136 \r
137 \r
138 \r
139 class CTxDetailsDialog : public CTxDetailsDialogBase\r
140 {\r
141 protected:\r
142     // Event handlers\r
143     void OnButtonOK(wxCommandEvent& event);\r
144 \r
145 public:\r
146     /** Constructor */\r
147     CTxDetailsDialog(wxWindow* parent, CWalletTx wtx);\r
148 \r
149     // State\r
150     CWalletTx wtx;\r
151 };\r
152 \r
153 \r
154 \r
155 class COptionsDialog : public COptionsDialogBase\r
156 {\r
157 protected:\r
158     // Event handlers\r
159     void OnListBox(wxCommandEvent& event);\r
160     void OnKillFocusTransactionFee(wxFocusEvent& event);\r
161     void OnCheckBoxLimitProcessors(wxCommandEvent& event);\r
162     void OnCheckBoxUseProxy(wxCommandEvent& event);\r
163     void OnKillFocusProxy(wxFocusEvent& event);\r
164 \r
165     void OnButtonOK(wxCommandEvent& event);\r
166     void OnButtonCancel(wxCommandEvent& event);\r
167     void OnButtonApply(wxCommandEvent& event);\r
168 \r
169 public:\r
170     /** Constructor */\r
171     COptionsDialog(wxWindow* parent);\r
172 \r
173     // Custom\r
174     bool fTmpStartOnSystemStartup;\r
175     bool fTmpMinimizeOnClose;\r
176     void SelectPage(int nPage);\r
177     CAddress GetProxyAddr();\r
178 };\r
179 \r
180 \r
181 \r
182 class CAboutDialog : public CAboutDialogBase\r
183 {\r
184 protected:\r
185     // Event handlers\r
186     void OnButtonOK(wxCommandEvent& event);\r
187 \r
188 public:\r
189     /** Constructor */\r
190     CAboutDialog(wxWindow* parent);\r
191 };\r
192 \r
193 \r
194 \r
195 class CSendDialog : public CSendDialogBase\r
196 {\r
197 protected:\r
198     // Event handlers\r
199     void OnKeyDown(wxKeyEvent& event) { HandleCtrlA(event); }\r
200     void OnTextAddress(wxCommandEvent& event);\r
201     void OnKillFocusAmount(wxFocusEvent& event);\r
202     void OnButtonAddressBook(wxCommandEvent& event);\r
203     void OnButtonPaste(wxCommandEvent& event);\r
204     void OnButtonSend(wxCommandEvent& event);\r
205     void OnButtonCancel(wxCommandEvent& event);\r
206         \r
207 public:\r
208     /** Constructor */\r
209     CSendDialog(wxWindow* parent, const wxString& strAddress="");\r
210 \r
211     // Custom\r
212     bool fEnabledPrev;\r
213     string strFromSave;\r
214     string strMessageSave;\r
215 };\r
216 \r
217 \r
218 \r
219 class CSendingDialog : public CSendingDialogBase\r
220 {\r
221 public:\r
222     // Event handlers\r
223     void OnClose(wxCloseEvent& event);\r
224     void OnButtonOK(wxCommandEvent& event);\r
225     void OnButtonCancel(wxCommandEvent& event);\r
226     void OnPaint(wxPaintEvent& event);\r
227         \r
228 public:\r
229     /** Constructor */\r
230     CSendingDialog(wxWindow* parent, const CAddress& addrIn, int64 nPriceIn, const CWalletTx& wtxIn);\r
231     ~CSendingDialog();\r
232 \r
233     // State\r
234     CAddress addr;\r
235     int64 nPrice;\r
236     CWalletTx wtx;\r
237     wxDateTime start;\r
238     char pszStatus[10000];\r
239     bool fCanCancel;\r
240     bool fAbort;\r
241     bool fSuccess;\r
242     bool fUIDone;\r
243     bool fWorkDone;\r
244 \r
245     void Close();\r
246     void Repaint();\r
247     bool Status();\r
248     bool Status(const string& str);\r
249     bool Error(const string& str);\r
250     void StartTransfer();\r
251     void OnReply2(CDataStream& vRecv);\r
252     void OnReply3(CDataStream& vRecv);\r
253 };\r
254 \r
255 void SendingDialogStartTransfer(void* parg);\r
256 void SendingDialogOnReply2(void* parg, CDataStream& vRecv);\r
257 void SendingDialogOnReply3(void* parg, CDataStream& vRecv);\r
258 \r
259 \r
260 \r
261 class CAddressBookDialog : public CAddressBookDialogBase\r
262 {\r
263 protected:\r
264     // Event handlers\r
265     void OnNotebookPageChanged(wxNotebookEvent& event);\r
266     void OnListEndLabelEdit(wxListEvent& event);\r
267     void OnListItemSelected(wxListEvent& event);\r
268     void OnListItemActivated(wxListEvent& event);\r
269     void OnButtonDelete(wxCommandEvent& event);\r
270     void OnButtonCopy(wxCommandEvent& event);\r
271     void OnButtonEdit(wxCommandEvent& event);\r
272     void OnButtonNew(wxCommandEvent& event);\r
273     void OnButtonOK(wxCommandEvent& event);\r
274     void OnButtonCancel(wxCommandEvent& event);\r
275     void OnClose(wxCloseEvent& event);\r
276 \r
277 public:\r
278     /** Constructor */\r
279     CAddressBookDialog(wxWindow* parent, const wxString& strInitSelected, int nPageIn, bool fDuringSendIn);\r
280 \r
281     // Custom\r
282     enum\r
283     {\r
284         SENDING = 0,\r
285         RECEIVING = 1,\r
286     };\r
287     int nPage;\r
288     wxListCtrl* m_listCtrl;\r
289     bool fDuringSend;\r
290     wxString GetAddress();\r
291     wxString GetSelectedAddress();\r
292     wxString GetSelectedSendingAddress();\r
293     wxString GetSelectedReceivingAddress();\r
294     bool CheckIfMine(const string& strAddress, const string& strTitle);\r
295 };\r
296 \r
297 \r
298 \r
299 class CGetTextFromUserDialog : public CGetTextFromUserDialogBase\r
300 {\r
301 protected:\r
302     // Event handlers\r
303     void OnButtonOK(wxCommandEvent& event)     { EndModal(true); }\r
304     void OnButtonCancel(wxCommandEvent& event) { EndModal(false); }\r
305     void OnClose(wxCloseEvent& event)          { EndModal(false); }\r
306 \r
307     void OnKeyDown(wxKeyEvent& event)\r
308     {\r
309         if (event.GetKeyCode() == '\r' || event.GetKeyCode() == WXK_NUMPAD_ENTER)\r
310             EndModal(true);\r
311         else\r
312             HandleCtrlA(event);\r
313     }\r
314 \r
315 public:\r
316     /** Constructor */\r
317     CGetTextFromUserDialog(wxWindow* parent,\r
318                            const string& strCaption,\r
319                            const string& strMessage1,\r
320                            const string& strValue1="",\r
321                            const string& strMessage2="",\r
322                            const string& strValue2="") : CGetTextFromUserDialogBase(parent, wxID_ANY, strCaption)\r
323     {\r
324         int x = GetSize().GetWidth();\r
325         int y = GetSize().GetHeight();\r
326         m_staticTextMessage1->SetLabel(strMessage1);\r
327         m_textCtrl1->SetValue(strValue1);\r
328         y += wxString(strMessage1).Freq('\n') * 14;\r
329         if (!strMessage2.empty())\r
330         {\r
331             m_staticTextMessage2->Show(true);\r
332             m_staticTextMessage2->SetLabel(strMessage2);\r
333             m_textCtrl2->Show(true);\r
334             m_textCtrl2->SetValue(strValue2);\r
335             y += 46 + wxString(strMessage2).Freq('\n') * 14;\r
336         }\r
337         if (!fWindows)\r
338         {\r
339             x *= 1.14;\r
340             y *= 1.14;\r
341         }\r
342         SetSize(x, y);\r
343     }\r
344 \r
345     // Custom\r
346     string GetValue()  { return (string)m_textCtrl1->GetValue(); }\r
347     string GetValue1() { return (string)m_textCtrl1->GetValue(); }\r
348     string GetValue2() { return (string)m_textCtrl2->GetValue(); }\r
349 };\r
350 \r
351 \r
352 \r
353 class CMyTaskBarIcon : public wxTaskBarIcon\r
354 {\r
355 protected:\r
356     // Event handlers\r
357     void OnLeftButtonDClick(wxTaskBarIconEvent& event);\r
358     void OnMenuRestore(wxCommandEvent& event);\r
359     void OnMenuOptions(wxCommandEvent& event);\r
360     void OnUpdateUIGenerate(wxUpdateUIEvent& event);\r
361     void OnMenuGenerate(wxCommandEvent& event);\r
362     void OnMenuExit(wxCommandEvent& event);\r
363 \r
364 public:\r
365     CMyTaskBarIcon() : wxTaskBarIcon()\r
366     {\r
367         Show(true);\r
368     }\r
369 \r
370     void Show(bool fShow=true);\r
371     void Hide();\r
372     void Restore();\r
373     void UpdateTooltip();\r
374     virtual wxMenu* CreatePopupMenu();\r
375 \r
376 DECLARE_EVENT_TABLE()\r
377 };\r
378 \r
379 #endif // wxUSE_GUI\r