Files
envi-code/SourceCode/Code2026/EarthWormMain/CmdQueryDlg.cpp
T
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

161 lines
3.7 KiB
C++

#include "stdafx.h"
#include "CmdQueryDlg.h"
#include "CmdQuery.h"
#include <sstream>
#include <iomanip>
#include <stack>
#include "CoreTools.h"
#include "CmdQueryHotkeyDlg.h"
IMPLEMENT_DYNAMIC(CmdQueryDlg, CDialog)
CmdQueryDlg::CmdQueryDlg(CWnd* pParent)
: CDialog(IDD_CMD_QUERY_DLG, pParent) { }
CmdQueryDlg::~CmdQueryDlg() { }
void CmdQueryDlg::initShow()
{
m_searchCombo.SetFocus();
m_searchCombo.SetWindowText(_T(""));
}
void CmdQueryDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_SEARCH_COMBO, m_searchCombo);
}
BOOL CmdQueryDlg::OnInitDialog()
{
return CDialog::OnInitDialog();
}
BOOL CmdQueryDlg::PreTranslateMessage(MSG * pMsg)
{
if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)
{
OnCbnSelectOKCombo();
return TRUE;
}
return 0;
}
BEGIN_MESSAGE_MAP(CmdQueryDlg, CDialog)
ON_BN_CLICKED(IDOK, &CmdQueryDlg::OnBnClickedOk)
ON_BN_CLICKED(IDCANCEL, &CmdQueryDlg::OnBnClickedOk)
ON_BN_CLICKED(IDC_SETTING_BTN, &CmdQueryDlg::OnBnClickedSetting)
ON_CBN_EDITCHANGE(IDC_SEARCH_COMBO, &CmdQueryDlg::OnCbnEditchangeCombo)
ON_CBN_SELENDOK(IDC_SEARCH_COMBO, &CmdQueryDlg::OnCbnSelectOKCombo)
ON_MESSAGE(WM_ACAD_KEEPFOCUS, &CmdQueryDlg::onAcadKeepFocus)
ON_WM_SHOWWINDOW()
END_MESSAGE_MAP()
void CmdQueryDlg::OnBnClickedOk()
{
CDialog::OnOK();
}
void CmdQueryDlg::OnBnClickedSetting()
{
CAcModuleResourceOverride myResources;
CmdQueryHotkeyDlg hotkeyDlg(this);
CmdQuery::endHook();
hotkeyDlg.DoModal();
CmdQuery::startHook();
}
void CmdQueryDlg::OnCbnEditchangeCombo()
{
CString str(_T(""));
m_searchCombo.GetWindowText(str);
if (str.IsEmpty())
{
m_searchCombo.ResetContent();
std::deque<CString>::const_iterator it = m_cmds.begin();
for (; it != m_cmds.end(); ++it)
{
m_searchCombo.AddString(*it);
}
m_searchCombo.ShowDropDown();
return;
}
CmdQuery::CmdQueryItems items;
CmdQuery::findCommand(str, items);
if (items.empty()) return;
m_searchCombo.ShowDropDown();
m_searchCombo.ResetContent();
m_searchCombo.SetWindowText(str);
m_searchCombo.SetEditSel(str.GetLength(), str.GetLength());
std::wstringstream wsm;
for (size_t i = 0; i < items.size(); ++i)
{
CmdQuery::CmdQueryItem &item = items[i];
wsm.str(_T(""));
wsm << std::setw(7) << std::setfill(_T(' ')) << std::left << (LPCTSTR)item.m_cmdItem.m_sCmd
<< _T("|") << std::setw(4) << std::setfill(wchar_t(0x3000)) << std::left << (LPCTSTR)item.m_cmdItem.m_sName
<< _T("|") << std::setw(4) << std::setfill(wchar_t(0x3000)) << std::left << (LPCTSTR)item.m_sGroupName
<< _T("|") << std::setw(4) << std::setfill(wchar_t(0x3000)) << std::left << (LPCTSTR)item.m_sMnuTitle;
m_searchCombo.AddString(wsm.str().c_str());
if (i > 10) break;
}
}
void CmdQueryDlg::OnCbnSelectOKCombo()
{
int idx(m_searchCombo.GetCurSel());
if (idx == -1) return;
CString str(_T(""));
m_searchCombo.GetLBText(idx, str);
//m_searchCombo.GetWindowText(str);
std::vector<CString> vec(0);
CoreTools::SplitString(str, _T('|'), vec);
if (vec.empty()) return;
CString ss(vec[0]);
ss.TrimLeft();
ss.TrimRight();
acedPostCommand(vec[0] + _T(" "));
this->ShowWindow(SW_HIDE);
if (std::find(m_cmds.begin(), m_cmds.end(), str) == m_cmds.end())
{
if (m_cmds.size() > 20)
m_cmds.pop_back();
m_cmds.push_front(str);
}
}
LONG_PTR CmdQueryDlg::onAcadKeepFocus(UINT_PTR, LONG_PTR)
{
POINT pt;
::GetCursorPos(&pt);
CRect rect;
GetWindowRect(&rect);
if (!(rect.PtInRect(pt)))
{
return FALSE;
}
return TRUE;
}
void CmdQueryDlg::OnShowWindow(BOOL bShow, UINT nStatus)
{
CString str = CmdQuery::getHotkeyString();
SetWindowText(CString(_T("上华命令搜索 ")) + str);
m_searchCombo.ResetContent();
std::deque<CString>::const_iterator it = m_cmds.begin();
for (; it != m_cmds.end(); ++it)
{
m_searchCombo.AddString(*it);
}
}