📄 publichubsfrm.cpp
字号:
/*
* Copyright (C) 2001-2006 Jacek Sieka, arnetheduck on gmail point com
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "stdafx.h"
#include "../client/DCPlusPlus.h"
#include "Resource.h"
#include "PublicHubsFrm.h"
#include "HubFrame.h"
#include "WinUtil.h"
#include "PublicHubsListDlg.h"
#include "../client/Client.h"
#include "../client/StringTokenizer.h"
#include "../client/version.h"
int PublicHubsFrame::columnIndexes[] = {
COLUMN_NAME,
COLUMN_DESCRIPTION,
COLUMN_USERS,
COLUMN_SERVER,
COLUMN_COUNTRY,
COLUMN_SHARED,
COLUMN_MINSHARE,
COLUMN_MINSLOTS,
COLUMN_MAXHUBS,
COLUMN_MAXUSERS,
COLUMN_RELIABILITY,
COLUMN_RATING
};
int PublicHubsFrame::columnSizes[] = { 200, 290, 50, 100, 100, 100, 100, 100, 100, 100, 100, 100 };
static ResourceManager::Strings columnNames[] = {
ResourceManager::HUB_NAME,
ResourceManager::DESCRIPTION,
ResourceManager::USERS,
ResourceManager::HUB_ADDRESS,
ResourceManager::COUNTRY,
ResourceManager::SHARED,
ResourceManager::MIN_SHARE,
ResourceManager::MIN_SLOTS,
ResourceManager::MAX_HUBS,
ResourceManager::MAX_USERS,
ResourceManager::RELIABILITY,
ResourceManager::RATING,
};
LRESULT PublicHubsFrame::onCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
CreateSimpleStatusBar(ATL_IDS_IDLEMESSAGE, WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | SBARS_SIZEGRIP);
ctrlStatus.Attach(m_hWndStatusBar);
int w[3] = { 0, 0, 0};
ctrlStatus.SetParts(3, w);
ctrlHubs.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
WS_HSCROLL | WS_VSCROLL | LVS_REPORT | LVS_SHOWSELALWAYS | LVS_SINGLESEL, WS_EX_CLIENTEDGE, IDC_HUBLIST);
ctrlHubs.SetExtendedListViewStyle(LVS_EX_LABELTIP | LVS_EX_HEADERDRAGDROP | LVS_EX_FULLROWSELECT);
// Create listview columns
WinUtil::splitTokens(columnIndexes, SETTING(PUBLICHUBSFRAME_ORDER), COLUMN_LAST);
WinUtil::splitTokens(columnSizes, SETTING(PUBLICHUBSFRAME_WIDTHS), COLUMN_LAST);
for(int j=0; j<COLUMN_LAST; j++) {
int fmt = (j == COLUMN_USERS) ? LVCFMT_RIGHT : LVCFMT_LEFT;
ctrlHubs.InsertColumn(j, CTSTRING_I(columnNames[j]), fmt, columnSizes[j], j);
}
ctrlHubs.SetColumnOrderArray(COLUMN_LAST, columnIndexes);
ctrlHubs.SetBkColor(WinUtil::bgColor);
ctrlHubs.SetTextBkColor(WinUtil::bgColor);
ctrlHubs.SetTextColor(WinUtil::textColor);
ctrlHubs.setSort(COLUMN_USERS, ExListViewCtrl::SORT_INT, false);
ctrlHubs.SetFocus();
ctrlConfigure.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
BS_PUSHBUTTON , 0, IDC_PUB_LIST_CONFIG);
ctrlConfigure.SetWindowText(CTSTRING(CONFIGURE));
ctrlConfigure.SetFont(WinUtil::systemFont);
ctrlRefresh.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
BS_PUSHBUTTON , 0, IDC_REFRESH);
ctrlRefresh.SetWindowText(CTSTRING(REFRESH));
ctrlRefresh.SetFont(WinUtil::systemFont);
ctrlLists.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
BS_GROUPBOX, WS_EX_TRANSPARENT);
ctrlLists.SetFont(WinUtil::systemFont);
ctrlLists.SetWindowText(CTSTRING(CONFIGURED_HUB_LISTS));
ctrlPubLists.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
WS_HSCROLL | WS_VSCROLL | CBS_DROPDOWNLIST, WS_EX_CLIENTEDGE, IDC_PUB_LIST_DROPDOWN);
ctrlPubLists.SetFont(WinUtil::systemFont, FALSE);
// populate with values from the settings
updateDropDown();
ctrlFilter.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
ES_AUTOHSCROLL, WS_EX_CLIENTEDGE);
filterContainer.SubclassWindow(ctrlFilter.m_hWnd);
ctrlFilter.SetFont(WinUtil::systemFont);
ctrlFilterSel.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
WS_HSCROLL | WS_VSCROLL | CBS_DROPDOWNLIST, WS_EX_CLIENTEDGE);
ctrlFilterSel.SetFont(WinUtil::systemFont, FALSE);
//populate the filter list with the column names
for(int j=0; j<COLUMN_LAST; j++) {
ctrlFilterSel.AddString(CTSTRING_I(columnNames[j]));
}
ctrlFilterSel.AddString(CTSTRING(ANY));
ctrlFilterSel.SetCurSel(COLUMN_LAST);
ctrlFilterDesc.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
BS_GROUPBOX, WS_EX_TRANSPARENT);
ctrlFilterDesc.SetWindowText(CTSTRING(FILTER));
ctrlFilterDesc.SetFont(WinUtil::systemFont);
FavoriteManager::getInstance()->addListener(this);
hubs = FavoriteManager::getInstance()->getPublicHubs();
if(FavoriteManager::getInstance()->isDownloading())
ctrlStatus.SetText(0, CTSTRING(DOWNLOADING_HUB_LIST));
else {
if(hubs.empty())
FavoriteManager::getInstance()->refresh();
}
updateList();
hubsMenu.CreatePopupMenu();
hubsMenu.AppendMenu(MF_STRING, IDC_CONNECT, CTSTRING(CONNECT));
hubsMenu.AppendMenu(MF_STRING, IDC_ADD, CTSTRING(ADD_TO_FAVORITES));
hubsMenu.AppendMenu(MF_STRING, IDC_COPY_HUB, CTSTRING(COPY_HUB));
hubsMenu.SetMenuDefaultItem(IDC_CONNECT);
bHandled = FALSE;
return TRUE;
}
LRESULT PublicHubsFrame::onColumnClickHublist(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/) {
NMLISTVIEW* l = (NMLISTVIEW*)pnmh;
if(l->iSubItem == ctrlHubs.getSortColumn()) {
if (!ctrlHubs.isAscending())
ctrlHubs.setSort(-1, ctrlHubs.getSortType());
else
ctrlHubs.setSortDirection(false);
} else {
// BAH, sorting on bytes will break of course...oh well...later...
if(l->iSubItem == COLUMN_USERS || l->iSubItem == COLUMN_MINSLOTS ||l->iSubItem == COLUMN_MAXHUBS || l->iSubItem == COLUMN_MAXUSERS) {
ctrlHubs.setSort(l->iSubItem, ExListViewCtrl::SORT_INT);
} else if(l->iSubItem == COLUMN_RELIABILITY) {
ctrlHubs.setSort(l->iSubItem, ExListViewCtrl::SORT_FLOAT);
} else if (l->iSubItem == COLUMN_SHARED || l->iSubItem == COLUMN_MINSHARE){
ctrlHubs.setSort(l->iSubItem, ExListViewCtrl::SORT_BYTES);
} else {
ctrlHubs.setSort(l->iSubItem, ExListViewCtrl::SORT_STRING_NOCASE);
}
}
return 0;
}
LRESULT PublicHubsFrame::onDoubleClickHublist(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/) {
if(!checkNick())
return 0;
NMITEMACTIVATE* item = (NMITEMACTIVATE*) pnmh;
if(item->iItem != -1) {
TCHAR buf[256];
ctrlHubs.GetItemText(item->iItem, COLUMN_SERVER, buf, 256);
HubFrame::openWindow(buf);
}
return 0;
}
LRESULT PublicHubsFrame::onEnter(int /*idCtrl*/, LPNMHDR /* pnmh */, BOOL& /*bHandled*/) {
if(!checkNick())
return 0;
int item = ctrlHubs.GetNextItem(-1, LVNI_FOCUSED);
if(item != -1) {
TCHAR buf[256];
ctrlHubs.GetItemText(item, COLUMN_SERVER, buf, 256);
HubFrame::openWindow(buf);
}
return 0;
}
LRESULT PublicHubsFrame::onClickedRefresh(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
ctrlHubs.DeleteAllItems();
users = 0;
visibleHubs = 0;
ctrlStatus.SetText(0, CTSTRING(DOWNLOADING_HUB_LIST));
FavoriteManager::getInstance()->refresh();
return 0;
}
LRESULT PublicHubsFrame::onClickedConfigure(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
PublicHubListDlg dlg;
if(dlg.DoModal(m_hWnd) == IDOK) {
updateDropDown();
}
return 0;
}
LRESULT PublicHubsFrame::onClickedConnect(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
if(!checkNick())
return 0;
if(ctrlHubs.GetSelectedCount() == 1) {
TCHAR buf[256];
int i = ctrlHubs.GetNextItem(-1, LVNI_SELECTED);
ctrlHubs.GetItemText(i, COLUMN_SERVER, buf, 256);
HubFrame::openWindow(buf);
}
return 0;
}
LRESULT PublicHubsFrame::onFilterFocus(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& bHandled) {
bHandled = true;
ctrlFilter.SetFocus();
return 0;
}
LRESULT PublicHubsFrame::onAdd(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
if(!checkNick())
return 0;
TCHAR buf[256];
if(ctrlHubs.GetSelectedCount() == 1) {
int i = ctrlHubs.GetNextItem(-1, LVNI_SELECTED);
FavoriteHubEntry e;
ctrlHubs.GetItemText(i, COLUMN_NAME, buf, 256);
e.setName(Text::fromT(buf));
ctrlHubs.GetItemText(i, COLUMN_DESCRIPTION, buf, 256);
e.setDescription(Text::fromT(buf));
ctrlHubs.GetItemText(i, COLUMN_SERVER, buf, 256);
e.setServer(Text::fromT(buf));
FavoriteManager::getInstance()->addFavorite(e);
}
return 0;
}
LRESULT PublicHubsFrame::onClose(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) {
if(!closed) {
FavoriteManager::getInstance()->removeListener(this);
closed = true;
PostMessage(WM_CLOSE);
return 0;
} else {
WinUtil::saveHeaderOrder(ctrlHubs, SettingsManager::PUBLICHUBSFRAME_ORDER,
SettingsManager::PUBLICHUBSFRAME_WIDTHS, COLUMN_LAST, columnIndexes, columnSizes);
bHandled = FALSE;
return 0;
}
}
LRESULT PublicHubsFrame::onListSelChanged(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& bHandled) {
FavoriteManager::getInstance()->setHubList(ctrlPubLists.GetCurSel());
hubs = FavoriteManager::getInstance()->getPublicHubs();
updateList();
bHandled = FALSE;
return 0;
}
void PublicHubsFrame::UpdateLayout(BOOL bResizeBars /* = TRUE */) {
RECT rect;
GetClientRect(&rect);
// position bars and offset their dimensions
UpdateBarsPosition(rect, bResizeBars);
if(ctrlStatus.IsWindow()) {
CRect sr;
int w[3];
ctrlStatus.GetClientRect(sr);
int tmp = (sr.Width()) > 316 ? 216 : ((sr.Width() > 116) ? sr.Width()-100 : 16);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -