source: branch/src/HaliteWindow.cpp @ 360

Revision 360, 11.4 KB checked in by Eoin, 13 years ago (diff)

Added a branch folder.

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