-
-
Notifications
You must be signed in to change notification settings - Fork 44
/
history.cpp
86 lines (72 loc) · 3.67 KB
/
history.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
/*=============================================================================
*
* ヒストリ
*
===============================================================================
/ Copyright (C) 1997-2007 Sota. All rights reserved.
/
/ Redistribution and use in source and binary forms, with or without
/ modification, are permitted provided that the following conditions
/ are met:
/
/ 1. Redistributions of source code must retain the above copyright
/ notice, this list of conditions and the following disclaimer.
/ 2. Redistributions in binary form must reproduce the above copyright
/ notice, this list of conditions and the following disclaimer in the
/ documentation and/or other materials provided with the distribution.
/
/ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
/ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
/ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
/ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
/ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
/ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
/ USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
/ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
/ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
/ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
/============================================================================*/
#include "common.h"
static std::vector<HISTORYDATA> histories;
static constexpr std::array MenuHistId{
MENU_HIST_1, MENU_HIST_2, MENU_HIST_3, MENU_HIST_4, MENU_HIST_5,
MENU_HIST_6, MENU_HIST_7, MENU_HIST_8, MENU_HIST_9, MENU_HIST_10,
MENU_HIST_11, MENU_HIST_12, MENU_HIST_13, MENU_HIST_14, MENU_HIST_15,
MENU_HIST_16, MENU_HIST_17, MENU_HIST_18, MENU_HIST_19, MENU_HIST_20,
};
// ホスト情報をヒストリリストの先頭に追加する
void AddHostToHistory(Host const& host) {
AddHistoryToHistory({ host, PassToHist == YES, AskTransferType() });
}
// ヒストリをヒストリリストの先頭に追加する
void AddHistoryToHistory(HISTORYDATA const& history) {
histories.insert(begin(histories), history);
if (FileHist < size_as<int>(histories))
histories.resize(FileHist);
}
HOSTDATA::HOSTDATA(struct HISTORYDATA const& history) {
CopyDefaultHost(this);
static_cast<Host&>(*this) = Host{ history, PassToHist == YES };
}
// 全ヒストリをメニューにセット
void SetAllHistoryToMenu() {
auto menu = GetSubMenu(GetMenu(GetMainHwnd()), 0);
for (int const i : std::views::iota(DEF_FMENU_ITEMS, GetMenuItemCount(menu)))
DeleteMenu(menu, DEF_FMENU_ITEMS, MF_BYPOSITION);
AppendMenuW(menu, MF_SEPARATOR, 0, NULL);
for (int i = 0; auto const& history : histories) {
auto const text = std::format(L"&{} {} ({}) {}"sv, i < 9 ? wchar_t(L'0' + i + 1) : i == 9 ? L'0' : L'*', history.HostAdrs, history.UserName, history.RemoteInitDir);
AppendMenuW(menu, MF_STRING, MenuHistId[i++], text.c_str());
}
}
// 指定メニューコマンドに対応するヒストリを返す
// MenuCmd : 取り出すヒストリに割り当てられたメニューコマンド (MENU_xxx)
std::optional<HISTORYDATA> GetHistoryByCmd(int menuId) {
if (auto it = std::find(begin(MenuHistId), end(MenuHistId), menuId); it != end(MenuHistId))
if (auto const index = (size_t)std::distance(begin(MenuHistId), it); index < size(histories))
return histories[index];
return {};
}
std::vector<HISTORYDATA> const& GetHistories() noexcept {
return histories;
}