d50132a3724ac4e9959bb32d8aea2d3493c81e14
[olsrd.git] / gui / win32 / Main / MyDialog1.cpp
1 /*
2  * The olsr.org Optimized Link-State Routing daemon (olsrd)
3  * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de)
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without 
7  * modification, are permitted provided that the following conditions 
8  * are met:
9  *
10  * * Redistributions of source code must retain the above copyright 
11  *   notice, this list of conditions and the following disclaimer.
12  * * Redistributions in binary form must reproduce the above copyright 
13  *   notice, this list of conditions and the following disclaimer in 
14  *   the documentation and/or other materials provided with the 
15  *   distribution.
16  * * Neither the name of olsr.org, olsrd nor the names of its 
17  *   contributors may be used to endorse or promote products derived 
18  *   from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
23  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
24  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
25  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
26  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
27  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
28  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
30  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
31  * POSSIBILITY OF SUCH DAMAGE.
32  *
33  * Visit http://www.olsr.org for more information.
34  *
35  * If you find this software useful feel free to make a donation
36  * to the project. For more information see the website or contact
37  * the copyright holders.
38  *
39  */
40
41 #include "stdafx.h"
42 #include "Frontend.h"
43 #include "MyDialog1.h"
44
45 #ifdef _DEBUG
46 #define new DEBUG_NEW
47 #undef THIS_FILE
48 static char THIS_FILE[] = __FILE__;
49 #endif /* _DEBUG */
50
51 MyDialog1::MyDialog1(CWnd* pParent)
52         : CDialog(MyDialog1::IDD, pParent)
53 {
54         NumLines = 0;
55
56         //{{AFX_DATA_INIT(MyDialog1)
57         //}}AFX_DATA_INIT
58 }
59
60 BOOL MyDialog1::Create(CWnd *Parent)
61 {
62         return CDialog::Create(MyDialog1::IDD, Parent);
63 }
64
65 void MyDialog1::DoDataExchange(CDataExchange* pDX)
66 {
67         CDialog::DoDataExchange(pDX);
68         //{{AFX_DATA_MAP(MyDialog1)
69         DDX_Control(pDX, IDC_BUTTON4, m_SaveButton);
70         DDX_Control(pDX, IDC_BUTTON3, m_FreezeButton);
71         DDX_Control(pDX, IDC_BUTTON2, m_ContinueButton);
72         DDX_Control(pDX, IDC_BUTTON1, m_ClearButton);
73         DDX_Control(pDX, IDC_EDIT1, m_OutputWindow);
74         //}}AFX_DATA_MAP
75 }
76
77
78 BEGIN_MESSAGE_MAP(MyDialog1, CDialog)
79         //{{AFX_MSG_MAP(MyDialog1)
80         ON_BN_CLICKED(IDC_BUTTON1, OnClearButton)
81         ON_BN_CLICKED(IDC_BUTTON2, OnContinueButton)
82         ON_BN_CLICKED(IDC_BUTTON3, OnFreezeButton)
83         ON_WM_CTLCOLOR()
84         ON_BN_CLICKED(IDOK, OnOK)
85         ON_BN_CLICKED(IDCANCEL, OnCancel)
86         ON_BN_CLICKED(IDC_BUTTON4, OnSaveButton)
87         //}}AFX_MSG_MAP
88 END_MESSAGE_MAP()
89
90 void MyDialog1::OnOK()
91 {
92 }
93
94 void MyDialog1::OnCancel()
95 {
96 }
97
98 void MyDialog1::AddOutputLine(CString Line)
99 {
100         int Index;
101
102         CritSect.Lock();
103
104         Output += Line + "\r\n";
105
106         if (NumLines == 1000)
107         {
108                 Index = Output.Find("\r\n");
109                 Output.Delete(0, Index + 2);
110         }
111
112         else
113                 NumLines++;
114
115         CritSect.Unlock();
116
117         if (Frozen == 0)
118         {
119                 m_OutputWindow.SetWindowText(Output);
120                 m_OutputWindow.SetSel(Output.GetLength(), Output.GetLength());
121         }
122 }
123
124 void MyDialog1::SetFrozen(int NewFrozen)
125 {
126         Frozen = NewFrozen;
127 }
128
129 BOOL MyDialog1::OnInitDialog() 
130 {
131         CDialog::OnInitDialog();
132         
133         CClientDC DevCont(&m_OutputWindow);
134
135         EditFont.CreatePointFont(90, "Courier New", NULL);
136         m_OutputWindow.SetFont(&EditFont);
137
138         m_FreezeButton.EnableWindow(FALSE);
139         m_ContinueButton.EnableWindow(FALSE);
140
141         Frozen = 0;
142
143         WhiteBrush.CreateSolidBrush(RGB(255, 255, 255));
144
145         return TRUE;
146 }
147
148 void MyDialog1::OnClearButton() 
149 {
150         CritSect.Lock();
151         Output.Empty();
152         NumLines = 0;
153         CritSect.Unlock();
154
155         m_OutputWindow.SetWindowText(Output);
156         m_OutputWindow.SetSel(0, 0);
157 }
158
159 void MyDialog1::OnContinueButton()
160 {
161         CString Copy;
162         int Len;
163
164         m_FreezeButton.EnableWindow(TRUE);
165         m_ContinueButton.EnableWindow(FALSE);
166
167         Frozen = 0;
168
169         CritSect.Lock();
170         Copy = Output;
171         Len = Output.GetLength();
172         CritSect.Unlock();
173
174         m_OutputWindow.SetWindowText(Copy);
175         m_OutputWindow.SetSel(Len, Len);
176 }
177
178 void MyDialog1::OnFreezeButton() 
179 {
180         m_FreezeButton.EnableWindow(FALSE);
181         m_ContinueButton.EnableWindow(TRUE);
182
183         Frozen = 1;
184 }
185
186 void MyDialog1::HandleStart(void)
187 {
188         CString Copy;
189         int Len;
190
191         m_FreezeButton.EnableWindow(TRUE);
192         m_ContinueButton.EnableWindow(FALSE);
193
194         Frozen = 0;
195
196         CritSect.Lock();
197         Copy = Output;
198         Len = Output.GetLength();
199         CritSect.Unlock();
200
201         m_OutputWindow.SetWindowText(Copy);
202         m_OutputWindow.SetSel(Len, Len);
203 }
204
205 void MyDialog1::HandleStop(void)
206 {
207         CString Copy;
208         int Len;
209
210         m_FreezeButton.EnableWindow(FALSE);
211         m_ContinueButton.EnableWindow(FALSE);
212
213         Frozen = 0;
214
215         CritSect.Lock();
216         Copy = Output;
217         Len = Output.GetLength();
218         CritSect.Unlock();
219
220         m_OutputWindow.SetWindowText(Copy);
221         m_OutputWindow.SetSel(Len, Len);
222 }
223
224 HBRUSH MyDialog1::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
225 {
226         HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
227
228         if (pWnd == &m_OutputWindow)
229         {
230                 pDC->SetBkColor(RGB(255, 255, 255));
231                 hbr = WhiteBrush;
232         }
233         
234         return hbr;
235 }
236
237 void MyDialog1::OnSaveButton()
238 {
239         CString Copy;
240         int Len;
241         CFileDialog FileDialog(FALSE);
242         CString FileName = "OLSR log.txt";
243         CString PathName;
244         CFile File;
245
246         CritSect.Lock();
247         Copy = Output;
248         Len = Output.GetLength();
249         CritSect.Unlock();
250
251         FileDialog.m_ofn.lpstrFilter = "Text file (*.txt)\0*.txt\0";
252         FileDialog.m_ofn.nFilterIndex = 1;
253
254         FileDialog.m_ofn.lpstrFile = FileName.GetBuffer(500);
255         FileDialog.m_ofn.nMaxFile = 500;
256
257         if (FileDialog.DoModal() == IDOK)
258         {
259                 PathName = FileDialog.GetPathName();
260
261                 if (File.Open(PathName, CFile::modeCreate | CFile::modeWrite |
262                         CFile::shareExclusive) == 0)
263                         AfxMessageBox("Cannot open logfile '" + PathName + "'.");
264
265                 else
266                 {
267                         File.Write((const char *)Copy, Len);
268                         File.Close();
269                 }
270         }
271
272         FileName.ReleaseBuffer();
273 }