📄 adlsearchframe.cpp
字号:
/*
* Copyright (C) 2001-2003 Jacek Sieka, j_s@telia.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.
*/
/*
* Automatic Directory Listing Search
* Henrik Engstr鰉, henrikengstrom@home.se
*/
#include "stdafx.h"
#include "Resource.h"
#include "../client/DCPlusPlus.h"
#include "../client/Client.h"
#include "ADLSearchFrame.h"
#include "AdlsProperties.h"
ADLSearchFrame* ADLSearchFrame::frame = NULL;
int ADLSearchFrame::columnIndexes[] = {
COLUMN_ACTIVE_SEARCH_STRING,
COLUMN_SOURCE_TYPE,
COLUMN_DEST_DIR,
COLUMN_MIN_FILE_SIZE,
COLUMN_MAX_FILE_SIZE
};
int ADLSearchFrame::columnSizes[] = {
120,
90,
90,
90,
90
};
static ResourceManager::Strings columnNames[] = {
ResourceManager::ACTIVE_SEARCH_STRING,
ResourceManager::SOURCE_TYPE,
ResourceManager::DESTINATION,
ResourceManager::SIZE_MIN,
ResourceManager::SIZE_MAX,
};
// Frame creation
LRESULT ADLSearchFrame::onCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
// Only one of this window please...
dcassert(frame == NULL);
frame = this;
// Set frame title
SetWindowText(CSTRING(ADL_SEARCH));
// Create status bar
CreateSimpleStatusBar(ATL_IDS_IDLEMESSAGE, WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | SBARS_SIZEGRIP);
ctrlStatus.Attach(m_hWndStatusBar);
int w[1] = { 0 };
ctrlStatus.SetParts(1, w);
// Create list control
ctrlList.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
WS_HSCROLL | WS_VSCROLL | LVS_REPORT | LVS_SHOWSELALWAYS, WS_EX_CLIENTEDGE, IDC_ADLLIST);
listContainer.SubclassWindow(ctrlList.m_hWnd);
// Ev. set full row select
if(BOOLSETTING(FULL_ROW_SELECT))
{
ctrlList.SetExtendedListViewStyle(LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES | LVS_EX_HEADERDRAGDROP);
}
else
{
ctrlList.SetExtendedListViewStyle(LVS_EX_CHECKBOXES | LVS_EX_HEADERDRAGDROP);
}
// Set background color
ctrlList.SetBkColor(WinUtil::bgColor);
ctrlList.SetTextBkColor(WinUtil::bgColor);
ctrlList.SetTextColor(WinUtil::textColor);
// Create listview columns
WinUtil::splitTokens(columnIndexes, SETTING(ADLSEARCHFRAME_ORDER), COLUMN_LAST);
WinUtil::splitTokens(columnSizes, SETTING(ADLSEARCHFRAME_WIDTHS), COLUMN_LAST);
for(int j = 0; j < COLUMN_LAST; j++)
{
int fmt = LVCFMT_LEFT;
ctrlList.InsertColumn(j, CSTRING_I(columnNames[j]), fmt, columnSizes[j], j);
}
ctrlList.SetColumnOrderArray(COLUMN_LAST, columnIndexes);
// Create buttons
ctrlAdd.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
BS_PUSHBUTTON , 0, IDC_ADD);
ctrlAdd.SetWindowText(CSTRING(NEW));
ctrlAdd.SetFont(WinUtil::font);
ctrlEdit.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
BS_PUSHBUTTON , 0, IDC_EDIT);
ctrlEdit.SetWindowText(CSTRING(PROPERTIES));
ctrlEdit.SetFont(WinUtil::font);
ctrlRemove.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
BS_PUSHBUTTON , 0, IDC_REMOVE);
ctrlRemove.SetWindowText(CSTRING(REMOVE));
ctrlRemove.SetFont(WinUtil::font);
ctrlMoveUp.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
BS_PUSHBUTTON , 0, IDC_MOVE_UP);
ctrlMoveUp.SetWindowText(CSTRING(MOVE_UP));
ctrlMoveUp.SetFont(WinUtil::font);
ctrlMoveDown.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
BS_PUSHBUTTON , 0, IDC_MOVE_DOWN);
ctrlMoveDown.SetWindowText(CSTRING(MOVE_DOWN));
ctrlMoveDown.SetFont(WinUtil::font);
ctrlHelp.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
BS_PUSHBUTTON , 0, IDC_HELP_FAQ);
ctrlHelp.SetWindowText(CSTRING(WHATS_THIS));
ctrlHelp.SetFont(WinUtil::font);
// Create context menu
contextMenu.CreatePopupMenu();
contextMenu.AppendMenu(MF_STRING, IDC_ADD, CSTRING(NEW));
contextMenu.AppendMenu(MF_STRING, IDC_REMOVE, CSTRING(REMOVE));
contextMenu.AppendMenu(MF_STRING, IDC_EDIT, CSTRING(PROPERTIES));
// Load all searches
LoadAll();
bHandled = FALSE;
return TRUE;
}
// Close window
LRESULT ADLSearchFrame::onClose(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
ADLSearchManager::getInstance()->Save();
ADLSearchFrame::frame = NULL;
WinUtil::saveHeaderOrder(ctrlList, SettingsManager::ADLSEARCHFRAME_ORDER,
SettingsManager::ADLSEARCHFRAME_WIDTHS, COLUMN_LAST, columnIndexes, columnSizes);
MDIDestroy(m_hWnd);
return 0;
}
// Recalculate frame control layout
void ADLSearchFrame::UpdateLayout(BOOL bResizeBars /* = TRUE */)
{
RECT rect;
GetClientRect(&rect);
// Position bars and offset their dimensions
UpdateBarsPosition(rect, bResizeBars);
if(ctrlStatus.IsWindow())
{
CRect sr;
int w[1];
ctrlStatus.GetClientRect(sr);
w[0] = sr.Width() - 16;
ctrlStatus.SetParts(1, w);
}
// Position list control
CRect rc = rect;
rc.top += 2;
rc.bottom -= 28;
ctrlList.MoveWindow(rc);
// Position buttons
const long bwidth = 90;
const long bspace = 10;
rc = rect;
rc.bottom -= 2;
rc.top = rc.bottom - 22;
rc.left = 2;
rc.right = rc.left + bwidth;
ctrlAdd.MoveWindow(rc);
rc.left += bwidth + 2;
rc.right = rc.left + bwidth;
ctrlEdit.MoveWindow(rc);
rc.left += bwidth + 2;
rc.right = rc.left + bwidth;
ctrlRemove.MoveWindow(rc);
rc.left += bspace;
rc.left += bwidth + 2;
rc.right = rc.left + bwidth;
ctrlMoveUp.MoveWindow(rc);
rc.left += bwidth + 2;
rc.right = rc.left + bwidth;
ctrlMoveDown.MoveWindow(rc);
rc.left += bspace;
rc.left += bwidth + 2;
rc.right = rc.left + bwidth;
ctrlHelp.MoveWindow(rc);
}
// Keyboard shortcuts
LRESULT ADLSearchFrame::onChar(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
{
switch(wParam)
{
case VK_INSERT:
onAdd(0, 0, 0, bHandled);
break;
case VK_DELETE:
onRemove(0, 0, 0, bHandled);
break;
case VK_RETURN:
onEdit(0, 0, 0, bHandled);
break;
default:
bHandled = FALSE;
}
return 0;
}
LRESULT ADLSearchFrame::onContextMenu(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
{
// Get the bounding rectangle of the client area.
RECT rc;
POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
ctrlList.GetClientRect(&rc);
ctrlList.ScreenToClient(&pt);
// Hit-test
if(PtInRect(&rc, pt))
{
ctrlList.ClientToScreen(&pt);
contextMenu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, m_hWnd);
return TRUE;
}
return FALSE;
}
// Add new search
LRESULT ADLSearchFrame::onAdd(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
// Invoke edit dialog with fresh search
ADLSearch search;
ADLSProperties dlg(&search);
if(dlg.DoModal((HWND)*this) == IDOK)
{
// Add new search to the end or if selected, just before
ADLSearchManager::SearchCollection& collection = ADLSearchManager::getInstance()->collection;
int i = ctrlList.GetNextItem(-1, LVNI_SELECTED);
if(i < 0)
{
// Add to end
collection.push_back(search);
i = collection.size() - 1;
}
else
{
// Add before selection
collection.insert(collection.begin() + i, search);
}
// Update list control
int j = i;
while(j < (int)collection.size())
{
UpdateSearch(j++);
}
ctrlList.EnsureVisible(i, FALSE);
}
return 0;
}
// Edit existing search
LRESULT ADLSearchFrame::onEdit(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
// Get selection info
int i = ctrlList.GetNextItem(-1, LVNI_SELECTED);
if(i < 0)
{
// Nothing selected
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -