//Copyright+LGPL
//-----------------------------------------------------------------------------------------------------------------------------------------------
// Copyright 2000-2013 Makoto Mori, Nobuyuki Oba
//-----------------------------------------------------------------------------------------------------------------------------------------------
// This file is part of MMTTY.
// MMTTY is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License
// as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
// MMTTY 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 Lesser General Public License for more details.
// You should have received a copy of the GNU Lesser General Public License along with MMTTY. If not, see
// .
//-----------------------------------------------------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------
#include
#pragma hdrstop
#include "ShortCut.h"
#include "LogFile.h"
//---------------------------------------------------------------------
#pragma resource "*.dfm"
//TShortCutDlg *ShortCutDlg;
static int CurRow = 0;
static int TopRow = 0;
//---------------------------------------------------------------------
__fastcall TShortCutDlg::TShortCutDlg(TComponent* AOwner)
: TForm(AOwner)
{
FormStyle = ((TForm *)AOwner)->FormStyle;
m_DisEvent = 1;
Font->Name = ((TForm *)AOwner)->Font->Name;
Font->Charset = ((TForm *)AOwner)->Font->Charset;
if( Font->Charset != SHIFTJIS_CHARSET ){
Caption = "Assign ShortCut";
DelBtn->Caption = "Del";
CheckBtn->Caption = "Check Dupe";
OKBtn->Caption = "Close";
}
ShortCutName->Clear();
int i;
for( i = 0; KEYTBL[i].Key; i++ ){
ShortCutName->Items->Add(ToDXKey(KEYTBL[i].pName));
}
m_DisEvent = 0;
SBHelp->Visible = !JanHelp.IsEmpty();
}
typedef struct {
LPCSTR pSys;
LPCSTR pUser;
WORD *pKey;
}DEFTBL;
DEFTBL def[]={
{"RcvLog","受信記録(日付名)ファイル", &sys.m_SysKey[kkRcvLog]},
{"FileOut","テキストファイル送信", &sys.m_SysKey[kkFileOut]},
{"SaveRx","受信画面の内容をファイルにセーブ", &sys.m_SysKey[kkSaveRx]},
{"OpenLog","新しいログファイルのオープン", &sys.m_SysKey[kkOpenLog]},
{"Flush","ディスクにフラッシュ", &sys.m_SysKey[kkFlush]},
{"RecTime","受信サウンドを時刻名のファイルに記録", &sys.m_SysKey[kkRecTime]},
{"Rec","受信サウンドをファイルに記録", &sys.m_SysKey[kkRec]},
{"Play","受信サウンドをファイルから再生", &sys.m_SysKey[kkPlay]},
{"PlayPos","再生位置調整", &sys.m_SysKey[kkPlayPos]},
{"PlayStop","記録/再生の終了", &sys.m_SysKey[kkPlayStop]},
{"Paste","送信画面への貼り付け", &sys.m_SysKey[kkPaste]},
{"Panel","Control Panel", &sys.m_SysKey[kkPanel]},
{"MacBtn","Macro ボタン", &sys.m_SysKey[kkMac]},
{"Scope","オシロスコープ", &sys.m_SysKey[kkScope]},
{"ClrRxWindow","受信画面のクリア", &sys.m_SysKey[kkClrRxWindow]},
{"LogList","LogList", &sys.m_SysKey[kkLogList]},
{"QSOData","QSOData", &sys.m_SysKey[kkQSOData]},
{"EntTX","TXボタンで自動改行送信", &sys.m_SysKey[kkEntTX]},
{"WordWrap","キーボードのワードラップ", &sys.m_SysKey[kkWordWrap]},
{"RUN","ランニングモード", &sys.m_SysKey[kkRun]},
{"TNC","TNC模擬モード設定", &sys.m_SysKey[kkTNC]},
{"Option","設定画面", &sys.m_SysKey[kkOption]},
{"LogOpt","ログ設定画面", &sys.m_SysKey[kkLogOption]},
{"Profile1","Profile 1", &sys.m_SysKey[kkPro1]},
{"Profile2","Profile 2", &sys.m_SysKey[kkPro2]},
{"Profile3","Profile 3", &sys.m_SysKey[kkPro3]},
{"Profile4","Profile 4", &sys.m_SysKey[kkPro4]},
{"Profile5","Profile 5", &sys.m_SysKey[kkPro5]},
{"Profile6","Profile 6", &sys.m_SysKey[kkPro6]},
{"Profile7","Profile 7", &sys.m_SysKey[kkPro7]},
{"Profile8","Profile 8", &sys.m_SysKey[kkPro8]},
{"ProfileDef","MMTTY default", &sys.m_SysKey[kkProDef]},
{"ProfileRet","Return to the startup", &sys.m_SysKey[kkProRet]},
{"ExtCmd1","External 1", &sys.m_SysKey[kkExtCmd1]},
{"ExtCmd2","External 2", &sys.m_SysKey[kkExtCmd2]},
{"ExtCmd3","External 3", &sys.m_SysKey[kkExtCmd3]},
{"ExtCmd4","External 4", &sys.m_SysKey[kkExtCmd4]},
{"ExtReset","サスペンドの解除", &sys.m_SysKey[kkExtReset]},
{"ExtSusp","サスペンド", &sys.m_SysKey[kkExtSusp]},
{"FIG","FIG Button", &sys.m_SysKey[kkFIG]},
{"UOS","UOS Button", &sys.m_SysKey[kkUOS]},
{"TX","TX Button", &sys.m_SysKey[kkTX]},
{"TXOFF","TXOFF Button", &sys.m_SysKey[kkTXOFF]},
{"QSO","QSO Button", &sys.m_SysKey[kkQSO]},
{"OnQSO","QSO Button ON", &sys.m_SysKey[kkOnQSO]},
{"OffQSO","QSO Button OFF", &sys.m_SysKey[kkOffQSO]},
{"Capture","Capture Callsign", &sys.m_SysKey[kkCAPTURE]},
{"InitBox","Init Button", &sys.m_SysKey[kkInitBox]},
{"CALL","Call Box", &sys.m_SysKey[kkCall]},
{"NAME","Name Box", &sys.m_SysKey[kkName]},
{"QTH","QTH Box", &sys.m_SysKey[kkQTH]},
{"RST","HisRST Box", &sys.m_SysKey[kkRST]},
{"MyRST","MyRST Box", &sys.m_SysKey[kkMyRST]},
{"Freq","Frequency Box", &sys.m_SysKey[kkFreq]},
{"Find","Find Button", &sys.m_SysKey[kkFind]},
{"Clear","Clear Button", &sys.m_SysKey[kkClear]},
{"TxUp","入力画面 ↑", &sys.m_SysKey[kkInUp]},
{"TxDown","入力画面 ↓", &sys.m_SysKey[kkInDown]},
{"TxPUp","入力画面 ページ↑", &sys.m_SysKey[kkInPUp]},
{"TxPDown","入力画面 ページ↓", &sys.m_SysKey[kkInPDown]},
{"TxHome","入力画面 先頭", &sys.m_SysKey[kkInHome]},
{"TxEnd","入力画面 末尾", &sys.m_SysKey[kkInEnd]},
{"RxUp","受信画面 ↑", &sys.m_SysKey[kkRxUp]},
{"RxDown","受信画面 ↓", &sys.m_SysKey[kkRxDown]},
{"RxPUp","受信画面 ページ↑", &sys.m_SysKey[kkRxPUp]},
{"RxPDown","受信画面 ページ↓", &sys.m_SysKey[kkRxPDown]},
{"RxHome","受信画面 先頭", &sys.m_SysKey[kkRxHome]},
{"RxEnd","受信画面 末尾", &sys.m_SysKey[kkRxEnd]},
{"CharWaitL","文字Wait←", &sys.m_SysKey[kkCharWaitLeft]},
{"CharWaitR","文字Wait→", &sys.m_SysKey[kkCharWaitRight]},
{"DiddleWaitL","DiddleWait←", &sys.m_SysKey[kkDiddleWaitLeft]},
{"DiddleWaitR","DiddleWait→", &sys.m_SysKey[kkDiddleWaitRight]},
{"TxHeightUp","入力画面拡大", &sys.m_SysKey[kkInHeightUp]},
{"TxHeightDown","入力画面縮小", &sys.m_SysKey[kkInHeightDown]},
{"TxLTR","LTR送信", &sys.m_SysKey[kkTxLTR]},
{"TxFIG","FIG送信", &sys.m_SysKey[kkTxFIG]},
{"DecShift","SHIFT幅 狭める", &sys.m_SysKey[kkDecShift]},
{"IncShift","SHIFT幅 広げる", &sys.m_SysKey[kkIncShift]},
{"ChangeShift","SHIFT幅変更 (170/200/220/350/450)", &sys.m_SysKey[kkToggleShift]},
{"CallList","Callsign list", &sys.m_SysKey[kkCList]},
};
void SetMenuName(LPCSTR pkey, LPCSTR p)
{
int i;
for( i = 0; i < AN(def); i++ ){
if( !strcmp(def[i].pSys, pkey) ){
def[i].pUser = p;
return;
}
}
}
void SetExtMenuName(int n, LPCSTR p)
{
int i;
for( i = 0; i < AN(def); i++ ){
if( !strcmp(def[i].pSys, "ExtCmd1") ){
def[i+n].pUser = p;
return;
}
}
}
void SetProMenuName(int n, LPCSTR p)
{
int i;
for( i = 0; i < AN(def); i++ ){
if( !strcmp(def[i].pSys, "Profile1") ){
def[i+n].pUser = p;
return;
}
}
}
const DEFTBL *GetDP(int n)
{
static DEFTBL udef;
static char bf[32];
static WORD dummy = 0;
if( n < AN(def) ){
return &def[n];
}
n -= AN(def);
if( n < 4 ){
sprintf(bf, "IN%u", n + 1);
udef.pSys = bf;
udef.pUser = sys.m_InBtnName[n].c_str();
udef.pKey = &sys.m_InBtnKey[n];
return &udef;
}
n -= 4;
if( n < 16 ){
sprintf(bf, "M%u", n + 1);
udef.pSys = bf;
udef.pUser = sys.m_UserName[n].c_str();
udef.pKey = &sys.m_UserKey[n];
return &udef;
}
n -= 16;
if( n < MSGLISTMAX ){
sprintf(bf, "ML%u", n + 1);
udef.pSys = bf;
udef.pUser = sys.m_MsgName[n].c_str();
udef.pKey = &sys.m_MsgKey[n];
return &udef;
}
n -= MSGLISTMAX;
if( n < 5 ){
sprintf(bf, "QM%u", n + 1);
udef.pSys = bf;
udef.pUser = (sys.m_WinFontCharset != SHIFTJIS_CHARSET)?"QSO Button Macro":"QSO Button連動マクロ";
udef.pKey = &Log.m_LogSet.m_QSOMacroKey[n];
return &udef;
}
n -= 5;
if( n < 16 ){
sprintf(bf, "MEdit%u", n + 1);
udef.pSys = bf;
udef.pUser = sys.m_UserName[n].c_str();
udef.pKey = &sys.m_UserEditKey[n];
return &udef;
}
udef.pSys = "";
udef.pUser = "";
udef.pKey = &dummy;
return &udef;
}
//---------------------------------------------------------------------
void __fastcall TShortCutDlg::UpdateUI(int n)
{
if( n >= 0 ){
const DEFTBL *dp = GetDP(n);
m_DisEvent++;
ShortCutName->Text = GetKeyName(*dp->pKey);
m_DisEvent--;
}
}
//---------------------------------------------------------------------
void __fastcall TShortCutDlg::Execute(void)
{
Grid->RowCount = AN(def) + 4 + 16 + 64 + 5 + 16 + 1;
if( CurRow ){
Grid->Row = CurRow;
Grid->TopRow = TopRow;
}
UpdateUI(Grid->Row - 1);
ShowModal();
CurRow = Grid->Row;
TopRow = Grid->TopRow;
}
//---------------------------------------------------------------------------
// 重複のチェック
int __fastcall TShortCutDlg::IsDupe(int n)
{
#if 0
FILE *fp = fopen("F:\\LIST.TXT", "wt");
const DEFTBL *dp;
for( int j = 0; j < Grid->RowCount-1; j++ ){
dp = GetDP(j);
fprintf(fp, "%s : %s\n", dp->pSys, dp->pUser);
}
fclose(fp);
#endif
WORD ks;
const DEFTBL *s;
const DEFTBL *t;
int j;
s = GetDP(n);
ks = *s->pKey;
if( ks ){
for( j = 0; j < Grid->RowCount - 1; j++ ){
if( n != j ){
t = GetDP(j);
if( t->pKey ){
if( ks == *t->pKey ){
return 1;
}
}
}
}
}
return 0;
}
//---------------------------------------------------------------------
void __fastcall TShortCutDlg::GridDrawCell(TObject *Sender, int Col,
int Row, TRect &Rect, TGridDrawState State)
{
char bf[256];
Grid->Canvas->FillRect(Rect);
int X = Rect.Left + 4;
int Y = Rect.Top + 2;
if( Row ){
Row--;
const DEFTBL *dp = GetDP(Row);
bf[0] = 0;
switch(Col){
case 0: // 内部名
strcpy(bf, dp->pSys);
break;
case 1: // ユーザ名
strcpy(bf, dp->pUser);
break;
case 2: // ショートカット
strcpy(bf, GetKeyName(*dp->pKey));
if( IsDupe(Row) ){
Grid->Canvas->Font->Color = clRed;
}
break;
}
Grid->Canvas->TextOut(X, Y, bf);
}
else if( Font->Charset != SHIFTJIS_CHARSET ){
LPCSTR _tte[]={
"Internal","Define Name","Key"
};
Grid->Canvas->TextOut(X, Y, _tte[Col]);
}
else { // タイトル
LPCSTR _tt[]={
"内部名","ユーザー定義名","割り当てキー"
};
Grid->Canvas->TextOut(X, Y, _tt[Col]);
}
}
//---------------------------------------------------------------------------
void __fastcall TShortCutDlg::GridSelectCell(TObject *Sender, int Col,
int Row, bool &CanSelect)
{
if( Row ){
UpdateUI(Row - 1);
}
}
//---------------------------------------------------------------------------
void __fastcall TShortCutDlg::ShortCutNameChange(TObject *Sender)
{
if( m_DisEvent ) return;
m_DisEvent++;
int n = Grid->Row - 1;
if( n >= 0 ){
const DEFTBL *dp = GetDP(n);
*dp->pKey = GetKeyCode(AnsiString(ShortCutName->Text).c_str()); //JA7UDE 0428
Grid->Invalidate();
}
m_DisEvent--;
}
//---------------------------------------------------------------------------
void __fastcall TShortCutDlg::CheckBtnClick(TObject *Sender)
{
WORD ks;
AnsiString as;
const DEFTBL *s;
const DEFTBL *t;
int i, j;
for( i = 0; i < Grid->RowCount - 1; i++ ){
s = GetDP(i);
ks = *s->pKey;
if( ks ){
as = s->pSys;
for( j = i + 1; j < Grid->RowCount - 1; j++ ){
t = GetDP(j);
if( t->pKey ){
if( ks == *t->pKey ){
Grid->Row = j + 1;
WarningMB((Font->Charset != SHIFTJIS_CHARSET)?"Duplicated key '%s' and '%s'":"'%s' と '%s' が重複しています.", as.c_str(), t->pSys);
return;
}
}
}
}
}
InfoMB( (Font->Charset != SHIFTJIS_CHARSET)?"No duplicated":"重複するショートカットキーはありません." );
}
//---------------------------------------------------------------------------
void __fastcall TShortCutDlg::DelBtnClick(TObject *Sender)
{
int n = Grid->Row - 1;
if( n >= 0 ){
const DEFTBL *dp = GetDP(n);
*dp->pKey = 0;
UpdateUI(n);
Grid->Invalidate();
}
}
//---------------------------------------------------------------------------
void __fastcall TShortCutDlg::SBHelpClick(TObject *Sender)
{
ShowHtmlHelp("keyboardshortcuts.htm");
}
//---------------------------------------------------------------------------