source: trunk/src/HaliteWindow.cpp @ 384

Revision 384, 13.2 KB checked in by Eoin, 12 years ago (diff)

Added 'Open Download Folder'.

Line 
1
2//         Copyright Eóin O'Callaghan 2006 - 2008.
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 "Halite.hpp"
13#include "HaliteWindow.hpp"
14
15#include "CSSFileDialog.hpp"
16#include "HaliteDialog.hpp"
17#include "AdvHaliteDialog.hpp"
18#include "AddTorrentDialog.hpp"
19#include "NewTorrentDialog.hpp"
20
21#include "ConfigOptions.hpp"
22#include "halConfig.hpp"
23
24HaliteWindow::HaliteWindow(unsigned areYouMe = 0) :
25        iniClass("HaliteWindow", "HaliteWindow"),
26        haliteList(*this),
27        WM_AreYouMe_(areYouMe),
28        splitterPos(100),
29        use_tray(true),
30        advancedUI(false),
31        closeToTray(false),
32        confirmClose(true),
33        activeTab(0)
34{
35        rect.top = 10;
36        rect.left = 10;
37        rect.bottom = 430;
38        rect.right = 620;
39       
40        load();
41}
42
43HaliteWindow::~HaliteWindow()
44{
45        save();
46        ATLASSERT(!::IsWindow(m_hWnd));
47}
48
49BOOL HaliteWindow::PreTranslateMessage(MSG* pMsg)
50{
51        if(CFrameWindowImpl<HaliteWindow>::PreTranslateMessage(pMsg))
52                return TRUE;
53
54        return mp_dlg->PreTranslateMessage(pMsg);
55}
56
57LRESULT HaliteWindow::OnCreate(LPCREATESTRUCT lpcs)
58{
59        try
60        {
61        HAL_DEV_MSG(L"HaliteWindow::OnCreate");
62       
63        SetWindowText(L"Halite");
64        MoveWindow(rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, false);     
65
66
67        hal::event().post(shared_ptr<hal::EventDetail>(
68                new hal::EventMsg(L"Loading Halite config...")));
69        hal::config().load();
70       
71        hal::event().post(shared_ptr<hal::EventDetail>(
72                new hal::EventMsg(L"Applying setting...")));
73        if (!hal::config().settingsChanged())
74        {
75                hal::event().post(boost::shared_ptr<hal::EventDetail>(
76                        new hal::EventDebug(hal::Event::critical, hal::app().res_wstr(HAL_WINDOW_SOCKETS_FAILED))));
77                       
78                MessageBox(hal::app().res_wstr(HAL_WINDOW_SOCKETS_FAILED).c_str(), 0, 0);
79               
80                DestroyWindow();
81                return 0;
82        }
83       
84        hal::event().post(shared_ptr<hal::EventDetail>(
85                new hal::EventMsg(L"Starting GUI...")));
86       
87        RECT rc; GetClientRect(&rc);
88        SetMenu(0);
89       
90        //Init ToolBar
91        HWND hWndToolBar = CreateSimpleToolBarCtrl(m_hWnd, IDR_MAINFRAME, FALSE, ATL_SIMPLE_TOOLBAR_PANE_STYLE);
92       
93        // Init ReBar
94        CreateSimpleReBar(ATL_SIMPLE_REBAR_NOBORDER_STYLE);
95        AddSimpleReBarBand(hWndToolBar, NULL, TRUE);
96       
97        // Init the StatusBar   
98        m_hWndStatusBar = m_StatusBar.Create(*this);
99        UIAddStatusBar(m_hWndStatusBar);
100       
101        int panes[] = {ID_DEFAULT_PANE, IDPANE_FILTER, IDPANE_DHT, IDPANE_STATUS};
102        m_StatusBar.SetPanes(panes, 4, false);
103       
104        // Create the Splitter Control
105        m_Split.Create(m_hWnd, rc, NULL, WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN);
106        m_Split.SetSplitterExtendedStyle(!SPLIT_PROPORTIONAL, SPLIT_PROPORTIONAL);
107        m_Split.SetSplitterPos(splitterPos);
108       
109        m_hWndClient = m_Split.m_hWnd;
110
111        hal::event().post(shared_ptr<hal::EventDetail>(
112                new hal::EventMsg(L"Creating main listview...")));     
113        // Create ListView and Dialog
114        haliteList.Create(m_Split.m_hWnd, rc, NULL, 
115                LVS_REPORT|WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|LVS_SHOWSELALWAYS);
116        haliteList.manager().attach(bind(&HaliteWindow::issueUiUpdate, this));
117
118
119        hal::event().post(shared_ptr<hal::EventDetail>(
120                new hal::EventMsg(L"Creating classic dialog...")));             
121        mp_dlg.reset(new HaliteDialog(*this)),
122        mp_dlg->Create(m_Split.m_hWnd);
123//      mp_dlg->ShowWindow(true);
124       
125
126        hal::event().post(shared_ptr<hal::EventDetail>(
127                new hal::EventMsg(L"Creating advanced dialog...")));
128        mp_advDlg.reset(new AdvHaliteDialog(*this));
129        mp_advDlg->Create(m_Split.m_hWnd);
130//      mp_advDlg->ShowWindow(true);
131       
132//      m_Split.SetSplitterPanes(*mp_list, *mp_dlg);
133       
134        hal::event().post(shared_ptr<hal::EventDetail>(
135                new hal::EventMsg(L"Creating tray icon..."))); 
136        // Create the tray icon.
137        trayIcon_.Create(this, IDR_TRAY_MENU, L"Halite", 
138                CTrayNotifyIcon::LoadIconResource(IDR_APP_ICON), WM_TRAYNOTIFY, IDR_TRAY_MENU);
139        trayIcon_.Hide();
140       
141        // Add ToolBar and register it along with StatusBar for UIUpdates
142        UIAddToolBar(hWndToolBar);
143        UISetCheck(ID_VIEW_TOOLBAR, 1);
144        UISetCheck(ID_VIEW_STATUS_BAR, 1);
145        UISetCheck(IDR_TRAY_MENU, 1);
146       
147        // Register UIEvents and the timer for the monitoring interval
148        SetTimer(ID_UPDATE_TIMER, 500);
149        SetTimer(ID_SAVE_TIMER, 5000);
150        connectUiUpdate(bind(&HaliteWindow::updateWindow, this));
151       
152        hal::event().post(shared_ptr<hal::EventDetail>(
153                new hal::EventMsg(L"Registering drop target...")));     
154        RegisterDropTarget();
155       
156        // Register object for message filtering and idle updates
157        CMessageLoop* pLoop = _Module.GetMessageLoop();
158        assert(pLoop != NULL);
159        pLoop->AddMessageFilter(this);
160        pLoop->AddIdleHandler(this);
161       
162//      haliteList.manager().setSelected(0);
163        setCorrectDialog();
164       
165        hal::event().post(shared_ptr<hal::EventDetail>(
166                new hal::EventMsg(L"Starting event reciever...")));
167        hal::bittorrent().startEventReceiver();
168        hal::event().post(shared_ptr<hal::EventDetail>(
169                new hal::EventMsg(L"Initial setup complete!")));
170        issueUiUpdate();
171       
172        }
173        catch(const std::exception& e)
174        {
175                hal::event().post(boost::shared_ptr<hal::EventDetail>(
176                        new hal::EventStdException(hal::Event::critical, e, L"HaliteWindow::OnCreate"))); 
177
178                DestroyWindow();
179        }
180       
181        return 0;
182}
183
184LRESULT HaliteWindow::OnAdvanced(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
185{
186        advancedUI = !advancedUI;
187        setCorrectDialog();
188       
189        return 0;
190}
191
192LRESULT HaliteWindow::OnTrayNotification(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam)
193{
194    trayIcon_.OnTrayNotification(wParam, lParam);
195   
196    return 0;
197}
198
199void HaliteWindow::setCorrectDialog()
200{
201        if (!advancedUI)
202        {               
203                mp_dlg->ShowWindow(SW_SHOW);
204                mp_advDlg->ShowWindow(SW_HIDE);
205                m_Split.SetSplitterPanes(haliteList, *mp_dlg);
206        }
207        else
208        {               
209                mp_dlg->ShowWindow(SW_HIDE);
210                mp_advDlg->ShowWindow(SW_SHOW);
211                m_Split.SetSplitterPanes(haliteList, *mp_advDlg);
212        }
213        ui().update();
214}
215
216void HaliteWindow::updateWindow()
217{
218        try
219        {
220       
221        hal::SessionDetail details = hal::bittorrent().getSessionDetails();
222       
223        if (details.port > -1)
224                UISetText(0, 
225                        (wformat(hal::app().res_wstr(HAL_PORT_OPEN)) % details.port ).str().c_str());   
226        else
227                UISetText(0, hal::app().res_wstr(HAL_NOT_LISTENING).c_str());
228       
229        wstring downloadRates = (wformat(hal::app().res_wstr(HAL_DOWN_RATES)) 
230                        % (details.speed.first/1024) 
231                        % (details.speed.second/1024)).str();
232       
233        UISetText(3, downloadRates.c_str());   
234        trayIcon_.SetTooltipText(downloadRates.c_str());
235       
236        if (details.dht_on)
237        {
238                wstring dht = (wformat(hal::app().res_wstr(HAL_DHT_ON))
239                        % details.dht_nodes).str();
240                       
241                UISetText(2, dht.c_str());
242        }
243        else
244        {
245                UISetText(2, hal::app().res_wstr(HAL_DHT_OFF).c_str());
246        }
247       
248        if (details.ip_filter_on)
249        {
250                wstring filter = (wformat(hal::app().res_wstr(HAL_IPFILTER_ON))
251                        % details.ip_ranges_filtered).str();
252               
253                UISetText(1, filter.c_str());
254        }
255        else
256        {
257                UISetText(1, hal::app().res_wstr(HAL_IPFILTER_OFF).c_str());
258        }
259       
260        }
261        catch (std::exception& e)
262        {
263                hal::event().post(shared_ptr<hal::EventDetail>(\
264                        new hal::EventStdException(hal::Event::info, e, L"updateWindow")));
265        }
266}
267
268void HaliteWindow::OnTimer(UINT uTimerID)
269{               
270        if (uTimerID == ID_UPDATE_TIMER) 
271        {       
272                issueUiUpdate();
273        }
274        else if (uTimerID == ID_SAVE_TIMER) 
275        {
276                try
277                {
278               
279                halite().saveIniData();
280                hal::bittorrent().saveTorrentData();   
281       
282                }
283                catch (std::exception& e)
284                {
285                        hal::event().post(shared_ptr<hal::EventDetail>(\
286                                new hal::EventStdException(hal::Event::info, e, L"saveTimer")));
287                }
288        }
289        else 
290        {               
291                SetMsgHandled(false);
292        }       
293}       
294
295void HaliteWindow::issueUiUpdate()
296{       
297        try
298        {
299       
300        const hal::TorrentDetails& torrents = hal::bittorrent().updateTorrentDetails(
301                haliteList.manager().selected(), haliteList.manager().allSelected());
302
303        ui_update_signal_(torrents);
304
305        }
306        catch (std::exception& e)
307        {
308                hal::event().post(shared_ptr<hal::EventDetail>(
309                        new hal::EventStdException(hal::Event::info, e, L"updateTimer")));
310        }
311}
312
313LRESULT HaliteWindow::OnCopyData(HWND, PCOPYDATASTRUCT pCSD)
314{
315        hal::event().post(shared_ptr<hal::EventDetail>(
316                new hal::EventMsg(L"I recieved data.")));
317               
318        switch (pCSD->dwData)
319        {
320                case HALITE_SENDING_CMD:
321                {       
322                        wstring filename(static_cast<wchar_t*>(pCSD->lpData), pCSD->cbData/sizeof(wchar_t));
323                       
324                        hal::event().post(shared_ptr<hal::EventDetail>(
325                                new hal::EventMsg((wformat(L"Recieved data: %1%.") % filename), hal::Event::info)));
326               
327                        ProcessFile(filename.c_str());
328                        break;
329                }
330                default:
331                        break;
332        }
333        return 0;
334}
335
336void HaliteWindow::ProcessFile(LPCTSTR lpszPath)
337{
338        try
339        {
340       
341        wstring saveDirectory = wpath(hal::config().defaultSaveFolder).native_file_string();
342        bool startPaused = false;
343        bool compactStorage = false;
344       
345        if (!boost::filesystem::exists(saveDirectory))
346                boost::filesystem::create_directory(saveDirectory);
347       
348        if (hal::config().savePrompt)
349        {
350                AddTorrentDialog addTorrent(saveDirectory, startPaused, compactStorage);       
351               
352                if (IDOK != addTorrent.DoModal())
353                        return;
354        }
355       
356        wpath file(lpszPath, boost::filesystem::native);       
357        hal::bittorrent().addTorrent(file, wpath(saveDirectory), startPaused, compactStorage);
358
359        ui().update();
360
361        }
362        catch(const boost::filesystem::filesystem_error&)
363        {
364                hal::event().post(shared_ptr<hal::EventDetail>(
365                        new hal::EventDebug(hal::Event::warning, L"filesystem error")));
366        }
367}
368
369void HaliteWindow::OnClose()
370{
371        if (closeToTray && trayIcon_.IsHidden())
372        {               
373                ShowWindow(SW_MINIMIZE);
374        }
375        else
376        {
377                if (!confirmClose || (confirmClose && 
378                        MessageBox(hal::app().res_wstr(HAL_WINDOW_CLOSECONFRIM).c_str(), 
379                                hal::app().res_wstr(HAL_HALITE).c_str(), MB_YESNO) == IDYES))
380                {
381                        DestroyWindow();
382                }
383        }
384}
385 
386void HaliteWindow::OnDestroy()
387{
388        splitterPos = m_Split.GetSplitterPos();
389
390        hal::config().save();
391        save();
392        PostQuitMessage(0);
393}
394
395void HaliteWindow::OnSize(UINT type, CSize)
396{
397        if (type == SIZE_MINIMIZED)
398        {
399                if (use_tray)
400                {
401                        ShowWindow(SW_HIDE);
402                        trayIcon_.Show();
403                }
404        }
405        else
406        {
407                if (trayIcon_.IsShowing())
408                        trayIcon_.Hide();
409
410                GetWindowRect(rect);
411        }
412       
413        SetMsgHandled(false);
414}       
415
416void HaliteWindow::OnMove(CSize)
417{
418        WINDOWPLACEMENT wnd = { sizeof(WINDOWPLACEMENT ) };
419        GetWindowPlacement(&wnd);
420       
421        if (wnd.showCmd != SW_SHOWMINIMIZED)
422                GetWindowRect(rect);
423
424        SetMsgHandled(false);   
425}
426
427void HaliteWindow::OnShowWindow(BOOL bShow, UINT nStatus)
428{
429        SetMsgHandled(false);
430}
431
432LRESULT HaliteWindow::OnTrayOpenHalite(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
433{
434        trayIcon_.Hide();
435        ShowWindow(SW_RESTORE);
436       
437        return 0;
438}
439
440LRESULT HaliteWindow::OnTrayExit(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
441{
442        PostMessage(WM_CLOSE, 0, 0);
443       
444        return 0;
445}
446
447LRESULT HaliteWindow::OnFileOpen(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
448{
449        CSSFileDialog dlgOpen(TRUE, NULL, NULL, OFN_HIDEREADONLY, L"Torrents (*.torrent)|*.torrent|", m_hWnd);
450
451        if (dlgOpen.DoModal() == IDOK) 
452        {
453                ProcessFile(dlgOpen.m_ofn.lpstrFile);
454        }
455       
456        return 0;       
457}
458
459LRESULT HaliteWindow::OnFileNew(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
460{
461        NewTorrentDialog newTorrent;   
462    newTorrent.DoModal();
463
464        MessageBox(L"This feature is under development and currently disabled", 
465                L"Feature not availible", 0);
466        return 0;
467       
468        CSSFileDialog dlgOpen(TRUE, NULL, NULL, OFN_HIDEREADONLY, L"All Files|*.*|", m_hWnd);
469
470        if (dlgOpen.DoModal() != IDOK) 
471                return 0;
472       
473        wstring files = dlgOpen.m_ofn.lpstrFile;
474       
475        CSSFileDialog dlgSave(FALSE, NULL, NULL, OFN_HIDEREADONLY, L"Torrents (*.torrent)|*.torrent|", m_hWnd);
476       
477        if (dlgSave.DoModal() != IDOK) 
478                return 0;
479       
480        wstring torrent_filename = dlgSave.m_ofn.lpstrFile;
481       
482        hal::bittorrent().newTorrent(wpath(torrent_filename), wpath(files));
483       
484        ui().update();
485       
486        return 0;
487}
488
489LRESULT HaliteWindow::OnSettings(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
490{
491        ConfigOptionsProp sheet(this, L"Settings");     
492    sheet.DoModal();
493       
494        hal::config().settingsChanged();
495        setCorrectDialog();
496       
497        return 0;
498}
499
500LRESULT HaliteWindow::OnPauseAll(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
501{
502        hal::bittorrent().pauseAllTorrents();
503       
504        ui().update();
505        return 0;
506}
507
508LRESULT HaliteWindow::OnResumeAll(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
509{
510        hal::bittorrent().unpauseAllTorrents();
511       
512        ui().update();
513        return 0;
514}
515
516LRESULT HaliteWindow::OnHelp(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
517{
518        ConfigOptionsProp sheet(this, L"Settings", 4); 
519    sheet.DoModal();
520       
521        hal::config().settingsChanged();
522       
523        return 0;
524}
525
526LRESULT HaliteWindow::OnViewStatusBar(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
527{
528        BOOL bVisible = !::IsWindowVisible(m_hWndStatusBar);
529        ::ShowWindow(m_hWndStatusBar, bVisible ? SW_SHOWNOACTIVATE : SW_HIDE);
530        UISetCheck(ID_VIEW_STATUS_BAR, bVisible);
531       
532        UpdateLayout();
533       
534        return 0;
535}       
536
537LRESULT HaliteWindow::OnEraseBkgnd(HDC dc)
538{
539        return 1;
540}
541
542LRESULT HaliteWindow::OnPaint(HDC dc)
543{
544        return 1;
545}
546
547LRESULT HaliteWindow::OnAreYouMe(UINT, WPARAM, LPARAM, BOOL&) 
548{
549        hal::event().post(shared_ptr<hal::EventDetail>(
550                new hal::EventMsg(L"I tried to contact me.")));         
551
552        return WM_AreYouMe_; 
553}
Note: See TracBrowser for help on using the repository browser.