source: src/HaliteWindow.cpp @ 267

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