source: trunk/src/HaliteWindowMini.cpp @ 356

Revision 356, 10.1 KB checked in by Eoin, 13 years ago (diff)

Fixed a bug with blocking non-visible uiUpdate connections.

Line 
1
2//         Copyright Eóin O'Callaghan 2006 - 2007.
3// Distributed under the Boost Software License, Version 1.0.
4//    (See accompanying file LICENSE_1_0.txt or copy at
5//          http://www.boost.org/LICENSE_1_0.txt)
6
7#include <string>
8#include <boost/format.hpp>
9#include <boost/bind.hpp>
10
11#include "stdAfx.hpp"
12#include "HaliteMini.hpp"
13#include "HaliteWindowMini.hpp"
14
15#include "halConfig.hpp"
16
17HaliteWindow::HaliteWindow(unsigned areYouMe = 0) :
18        iniClass("HaliteWindow", "HaliteWindow"),
19        WM_AreYouMe_(areYouMe),
20        splitterPos(100),
21        use_tray(true),
22        advancedUI(false),
23        activeTab(0)
24{
25        rect.top = 10;
26        rect.left = 10;
27        rect.bottom = 430;
28        rect.right = 620;
29       
30        load();
31}
32
33HaliteWindow::~HaliteWindow()
34{
35        save();
36        ATLASSERT(!::IsWindow(m_hWnd));
37}
38
39LRESULT HaliteWindow::OnCreate(LPCREATESTRUCT lpcs)
40{
41        SetWindowText(L"Halite");
42        MoveWindow(rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, false);     
43       
44        hal::config().load();
45        hal::config().settingsChanged();
46       
47        RECT rc; GetClientRect(&rc);
48        SetMenu(0);     
49       
50        //Init ToolBar
51        HWND hWndToolBar = CreateSimpleToolBarCtrl(m_hWnd, IDR_MAINFRAME, FALSE, ATL_SIMPLE_TOOLBAR_PANE_STYLE);
52       
53        // Init ReBar
54        CreateSimpleReBar(ATL_SIMPLE_REBAR_NOBORDER_STYLE);
55        AddSimpleReBarBand(hWndToolBar, NULL, TRUE);
56       
57        // Init the StatusBar   
58        m_hWndStatusBar = m_StatusBar.Create(*this);
59        UIAddStatusBar(m_hWndStatusBar);
60       
61        int panes[] = {ID_DEFAULT_PANE, IDPANE_FILTER, IDPANE_DHT, IDPANE_STATUS};
62        m_StatusBar.SetPanes(panes, 4, false);
63       
64        // Create the Splitter Control
65        m_Split.Create(m_hWnd, rc, NULL, WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN);
66        m_Split.SetSplitterExtendedStyle(!SPLIT_PROPORTIONAL, SPLIT_PROPORTIONAL);
67        m_Split.SetSplitterPos(splitterPos);
68       
69        m_hWndClient = m_Split.m_hWnd;
70       
71        // Create the tray icon.
72        m_trayIcon.Create(this, IDR_TRAY_MENU, L"Halite", 
73                CTrayNotifyIcon::LoadIconResource(IDR_APP_ICON), WM_TRAYNOTIFY, IDR_TRAY_MENU);
74        m_trayIcon.Hide();
75       
76        // Add ToolBar and register it along with StatusBar for UIUpdates
77        UIAddToolBar(hWndToolBar);
78        UISetCheck(ID_VIEW_TOOLBAR, 1);
79        UISetCheck(ID_VIEW_STATUS_BAR, 1);
80        UISetCheck(IDR_TRAY_MENU, 1);
81       
82        // Register UIEvents and the timer for the monitoring interval
83        SetTimer(ID_UPDATE_TIMER, 500);
84        SetTimer(ID_SAVE_TIMER, 5000);
85        connectUiUpdate(bind(&HaliteWindow::updateWindow, this));
86       
87        RegisterDropTarget();
88       
89        // Register object for message filtering and idle updates
90        CMessageLoop* pLoop = _Module.GetMessageLoop();
91        assert(pLoop != NULL);
92//      pLoop->AddMessageFilter(this);
93        pLoop->AddIdleHandler(this);
94       
95        hal::bittorrent().startEventReceiver();
96        return 0;
97}
98
99LRESULT HaliteWindow::OnAdvanced(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
100{
101        advancedUI = !advancedUI;
102        setCorrectDialog();
103       
104        return 0;
105}
106
107LRESULT HaliteWindow::OnTrayNotification(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam)
108{
109    m_trayIcon.OnTrayNotification(wParam, lParam);
110   
111    return 0;
112}
113
114void HaliteWindow::setCorrectDialog()
115{
116
117        ui().update();
118}
119
120void HaliteWindow::updateWindow()
121{
122        try
123        {
124       
125        hal::SessionDetail details = hal::bittorrent().getSessionDetails();
126       
127        if (details.port > -1)
128                UISetText(0, 
129                        (wformat(hal::app().res_wstr(HAL_PORT_OPEN)) % details.port ).str().c_str());   
130        else
131                UISetText(0, hal::app().res_wstr(HAL_NOT_LISTENING).c_str());
132       
133        wstring downloadRates = (wformat(hal::app().res_wstr(HAL_DOWN_RATES)) 
134                        % (details.speed.first/1024) 
135                        % (details.speed.second/1024)).str();
136       
137        UISetText(3, downloadRates.c_str());   
138        m_trayIcon.SetTooltipText(downloadRates.c_str());
139       
140        if (details.dht_on)
141        {
142                wstring dht = (wformat(hal::app().res_wstr(HAL_DHT_ON))
143                        % details.dht_nodes).str();
144                       
145                UISetText(2, dht.c_str());
146        }
147        else
148        {
149                UISetText(2, hal::app().res_wstr(HAL_DHT_OFF).c_str());
150        }
151       
152        if (details.ip_filter_on)
153        {
154                wstring filter = (wformat(hal::app().res_wstr(HAL_IPFILTER_ON))
155                        % details.ip_ranges_filtered).str();
156               
157                UISetText(1, filter.c_str());
158        }
159        else
160        {
161                UISetText(1, hal::app().res_wstr(HAL_IPFILTER_OFF).c_str());
162        }
163       
164        }
165        catch (std::exception& e)
166        {
167                hal::event().post(shared_ptr<hal::EventDetail>(\
168                        new hal::EventStdException(hal::Event::info, e, L"updateWindow")));
169        }
170}
171
172void HaliteWindow::OnTimer(UINT uTimerID)
173{               
174        if (uTimerID == ID_UPDATE_TIMER) 
175        {       
176                issueUiUpdate();
177        }
178        else if (uTimerID == ID_SAVE_TIMER) 
179        {
180                try
181                {
182               
183                hal::ini().save_data();
184                hal::bittorrent().saveTorrentData();   
185       
186                }
187                catch (std::exception& e)
188                {
189                        hal::event().post(shared_ptr<hal::EventDetail>(\
190                                new hal::EventStdException(hal::Event::info, e, L"saveTimer")));
191                }
192        }
193        else 
194        {               
195                SetMsgHandled(false);
196        }       
197}       
198
199void HaliteWindow::issueUiUpdate()
200{       
201        try
202        {
203       
204//      const hal::TorrentDetails& torrents = hal::bittorrent().updateTorrentDetails(
205//              haliteList.manager().selected(), haliteList.manager().allSelected());
206
207//      ui_update_signal_(torrents);
208        updateWindow();
209
210        }
211        catch (std::exception& e)
212        {
213                hal::event().post(shared_ptr<hal::EventDetail>(
214                        new hal::EventStdException(hal::Event::info, e, L"updateTimer")));
215        }
216}
217
218LRESULT HaliteWindow::OnCopyData(HWND, PCOPYDATASTRUCT pCSD)
219{
220        hal::event().post(shared_ptr<hal::EventDetail>(
221                new hal::EventMsg(L"I recieved data.", hal::Event::info)));
222               
223        switch (pCSD->dwData)
224        {
225                case HALITE_SENDING_CMD:
226                {       
227                        wstring filename(static_cast<wchar_t*>(pCSD->lpData), pCSD->cbData/sizeof(wchar_t));
228                       
229                        hal::event().post(shared_ptr<hal::EventDetail>(
230                                new hal::EventMsg((wformat(L"Recieved data: %1%.") % filename), hal::Event::info)));
231               
232                        ProcessFile(filename.c_str());
233                        break;
234                }
235                default:
236                        break;
237        }
238        return 0;
239}
240
241void HaliteWindow::ProcessFile(LPCTSTR lpszPath)
242{
243        try
244        {
245
246/*     
247        wstring saveDirectory = wpath(hal::config().defaultSaveFolder).native_file_string();
248        bool startPaused = false;
249        bool compactStorage = false;
250       
251        if (!boost::filesystem::exists(saveDirectory))
252                boost::filesystem::create_directory(saveDirectory);
253       
254        if (hal::config().savePrompt)
255        {
256                AddTorrentDialog addTorrent(saveDirectory, startPaused, compactStorage);       
257               
258                if (IDOK != addTorrent.DoModal())
259                        return;
260        }
261*/     
262/*      wpath file(lpszPath, boost::filesystem::native);       
263        hal::bittorrent().addTorrent(file, wpath(saveDirectory), startPaused, compactStorage);
264
265        ui().update();
266*/     
267/*      int itemPos = haliteList.GetSelectionMark();
268        if (itemPos == -1)
269        {
270                LV_FINDINFO findInfo = { sizeof(LV_FINDINFO) };
271                findInfo.flags = LVFI_STRING;
272               
273                wstring filename = file.leaf();         
274                findInfo.psz = filename.c_str();
275               
276                int itemPos = haliteList.FindItem(&findInfo, -1);       
277                haliteList.manager().setSelected(itemPos);
278        }       
279*/     
280        }
281        catch(const boost::filesystem::filesystem_error&)
282        {
283                hal::event().post(shared_ptr<hal::EventDetail>(
284                        new hal::EventDebug(hal::Event::warning, L"filesystem error")));
285        }
286}
287
288void HaliteWindow::OnClose()
289{
290        splitterPos = m_Split.GetSplitterPos();
291
292        hal::config().save();
293        save();
294       
295        DestroyWindow();
296}
297 
298void HaliteWindow::OnDestroy()
299{
300        PostQuitMessage(0);
301}
302
303void HaliteWindow::OnSize(UINT type, CSize)
304{
305        if (type == SIZE_MINIMIZED)
306        {
307                if (use_tray)
308                {
309                        ShowWindow(SW_HIDE);
310                        m_trayIcon.Show();
311                }
312        }
313        else
314                GetWindowRect(rect);
315       
316        SetMsgHandled(false);
317}       
318
319void HaliteWindow::OnMove(CSize)
320{
321        WINDOWPLACEMENT wnd = { sizeof(WINDOWPLACEMENT ) };
322        GetWindowPlacement(&wnd);
323       
324        if (wnd.showCmd != SW_SHOWMINIMIZED)
325                GetWindowRect(rect);
326
327        SetMsgHandled(false);   
328}
329
330LRESULT HaliteWindow::OnTrayOpenHalite(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
331{
332        ShowWindow(SW_RESTORE);
333        m_trayIcon.Hide();
334       
335        return 0;
336}
337
338LRESULT HaliteWindow::OnTrayExit(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
339{
340        PostMessage(WM_CLOSE, 0, 0);
341       
342        return 0;
343}
344
345LRESULT HaliteWindow::OnFileOpen(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
346{
347/*      CSSFileDialog dlgOpen(TRUE, NULL, NULL, OFN_HIDEREADONLY, L"Torrents (*.torrent)|*.torrent|", m_hWnd);
348
349        if (dlgOpen.DoModal() == IDOK)
350        {
351                ProcessFile(dlgOpen.m_ofn.lpstrFile);
352        }
353        */
354        return 0;       
355}
356
357LRESULT HaliteWindow::OnFileNew(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
358{
359/*      MessageBox(L"This feature is under development and currently disabled",
360                L"Feature not availible", 0);
361        return 0;
362       
363        CSSFileDialog dlgOpen(TRUE, NULL, NULL, OFN_HIDEREADONLY, L"All Files|*.*|", m_hWnd);
364
365        if (dlgOpen.DoModal() != IDOK)
366                return 0;
367       
368        wstring files = dlgOpen.m_ofn.lpstrFile;
369       
370        CSSFileDialog dlgSave(FALSE, NULL, NULL, OFN_HIDEREADONLY, L"Torrents (*.torrent)|*.torrent|", m_hWnd);
371       
372        if (dlgSave.DoModal() != IDOK)
373                return 0;
374       
375        wstring torrent_filename = dlgSave.m_ofn.lpstrFile;
376       
377        hal::bittorrent().newTorrent(wpath(torrent_filename), wpath(files));
378       
379        ui().update();
380        */
381        return 0;
382}
383
384LRESULT HaliteWindow::OnSettings(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
385{
386
387       
388        return 0;
389}
390
391LRESULT HaliteWindow::OnPauseAll(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
392{
393        hal::bittorrent().pauseAllTorrents();
394       
395        ui().update();
396        return 0;
397}
398
399LRESULT HaliteWindow::OnResumeAll(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
400{
401        hal::bittorrent().unpauseAllTorrents();
402       
403        ui().update();
404        return 0;
405}
406
407LRESULT HaliteWindow::OnHelp(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
408{
409//      ConfigOptionsProp sheet(this, L"Settings", 4); 
410//    sheet.DoModal();
411       
412        hal::config().settingsChanged();
413       
414        return 0;
415}
416
417LRESULT HaliteWindow::OnViewStatusBar(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
418{
419        BOOL bVisible = !::IsWindowVisible(m_hWndStatusBar);
420        ::ShowWindow(m_hWndStatusBar, bVisible ? SW_SHOWNOACTIVATE : SW_HIDE);
421        UISetCheck(ID_VIEW_STATUS_BAR, bVisible);
422       
423        UpdateLayout();
424       
425        return 0;
426}       
427
428LRESULT HaliteWindow::OnEraseBkgnd(HDC dc)
429{
430        return 1;
431}
432
433LRESULT HaliteWindow::OnPaint(HDC dc)
434{
435        return 1;
436}
437
438LRESULT HaliteWindow::OnAreYouMe(UINT, WPARAM, LPARAM, BOOL&) 
439{
440        hal::event().post(shared_ptr<hal::EventDetail>(
441                new hal::EventMsg(L"I tried to contact me.", hal::Event::info)));               
442
443        return WM_AreYouMe_; 
444}
Note: See TracBrowser for help on using the repository browser.