mmtty/ShortCut.cpp

409 lines
12 KiB
C++
Raw Permalink Normal View History

//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
// <http://www.gnu.org/licenses/>.
//-----------------------------------------------------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------
#include <vcl.h>
#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","<EFBFBD><EFBFBD><EFBFBD>M<EFBFBD>L<EFBFBD>^<5E>i<EFBFBD><69><EFBFBD>t<EFBFBD><74><EFBFBD>j<EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43>", &sys.m_SysKey[kkRcvLog]},
{"FileOut","<EFBFBD>e<EFBFBD>L<EFBFBD>X<EFBFBD>g<EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD>M", &sys.m_SysKey[kkFileOut]},
{"SaveRx","<EFBFBD><EFBFBD><EFBFBD>M<EFBFBD><EFBFBD><EFBFBD>ʂ̓<EFBFBD><EFBFBD>e<EFBFBD><EFBFBD><EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD>ɃZ<C983>[<5B>u", &sys.m_SysKey[kkSaveRx]},
{"OpenLog","<EFBFBD>V<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>O<EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD>̃I<CC83>[<5B>v<EFBFBD><76>", &sys.m_SysKey[kkOpenLog]},
{"Flush","<EFBFBD>f<EFBFBD>B<EFBFBD>X<EFBFBD>N<EFBFBD>Ƀt<EFBFBD><EFBFBD><EFBFBD>b<EFBFBD>V<EFBFBD><EFBFBD>", &sys.m_SysKey[kkFlush]},
{"RecTime","<EFBFBD><EFBFBD><EFBFBD>M<EFBFBD>T<EFBFBD>E<EFBFBD><EFBFBD><EFBFBD>h<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̃t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD>ɋL<C98B>^", &sys.m_SysKey[kkRecTime]},
{"Rec","<EFBFBD><EFBFBD><EFBFBD>M<EFBFBD>T<EFBFBD>E<EFBFBD><EFBFBD><EFBFBD>h<EFBFBD><EFBFBD><EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD>ɋL<C98B>^", &sys.m_SysKey[kkRec]},
{"Play","<EFBFBD><EFBFBD><EFBFBD>M<EFBFBD>T<EFBFBD>E<EFBFBD><EFBFBD><EFBFBD>h<EFBFBD><EFBFBD><EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Đ<EFBFBD>", &sys.m_SysKey[kkPlay]},
{"PlayPos","<EFBFBD>Đ<EFBFBD><EFBFBD>ʒu<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", &sys.m_SysKey[kkPlayPos]},
{"PlayStop","<EFBFBD>L<EFBFBD>^<5E>^<5E>Đ<EFBFBD><C490>̏I<CC8F><49>", &sys.m_SysKey[kkPlayStop]},
{"Paste","<EFBFBD><EFBFBD><EFBFBD>M<EFBFBD><EFBFBD><EFBFBD>ʂւ̓\<EFBFBD><EFBFBD><EFBFBD>t<EFBFBD><EFBFBD>", &sys.m_SysKey[kkPaste]},
{"Panel","Control Panel", &sys.m_SysKey[kkPanel]},
{"MacBtn","Macro <20>{<7B>^<5E><>", &sys.m_SysKey[kkMac]},
{"Scope","<EFBFBD>I<EFBFBD>V<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>R<EFBFBD>[<5B>v", &sys.m_SysKey[kkScope]},
{"ClrRxWindow","<EFBFBD><EFBFBD><EFBFBD>M<EFBFBD><EFBFBD><EFBFBD>ʂ̃N<EFBFBD><EFBFBD><EFBFBD>A", &sys.m_SysKey[kkClrRxWindow]},
{"LogList","LogList", &sys.m_SysKey[kkLogList]},
{"QSOData","QSOData", &sys.m_SysKey[kkQSOData]},
{"EntTX","TX<EFBFBD>{<7B>^<5E><><EFBFBD>Ŏ<EFBFBD><C58E><EFBFBD><EFBFBD><EFBFBD><EFBFBD>s<EFBFBD><73><EFBFBD>M", &sys.m_SysKey[kkEntTX]},
{"WordWrap","<EFBFBD>L<EFBFBD>[<5B>{<7B>[<5B>h<EFBFBD>̃<EFBFBD><CC83>[<5B>h<EFBFBD><68><EFBFBD>b<EFBFBD>v", &sys.m_SysKey[kkWordWrap]},
{"RUN","<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>j<EFBFBD><EFBFBD><EFBFBD>O<EFBFBD><EFBFBD><EFBFBD>[<5B>h", &sys.m_SysKey[kkRun]},
{"TNC","TNC<EFBFBD>͋[<5B><><EFBFBD>[<5B>h<EFBFBD>ݒ<EFBFBD>", &sys.m_SysKey[kkTNC]},
{"Option","<EFBFBD>ݒ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", &sys.m_SysKey[kkOption]},
{"LogOpt","<EFBFBD><EFBFBD><EFBFBD>O<EFBFBD>ݒ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", &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","<EFBFBD>T<EFBFBD>X<EFBFBD>y<EFBFBD><EFBFBD><EFBFBD>h<EFBFBD>̉<EFBFBD><EFBFBD><EFBFBD>", &sys.m_SysKey[kkExtReset]},
{"ExtSusp","<EFBFBD>T<EFBFBD>X<EFBFBD>y<EFBFBD><EFBFBD><EFBFBD>h", &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","<EFBFBD><EFBFBD><EFBFBD>͉<EFBFBD><EFBFBD><EFBFBD> <20><>", &sys.m_SysKey[kkInUp]},
{"TxDown","<EFBFBD><EFBFBD><EFBFBD>͉<EFBFBD><EFBFBD><EFBFBD> <20><>", &sys.m_SysKey[kkInDown]},
{"TxPUp","<EFBFBD><EFBFBD><EFBFBD>͉<EFBFBD><EFBFBD><EFBFBD> <20>y<EFBFBD>[<5B>W<EFBFBD><57>", &sys.m_SysKey[kkInPUp]},
{"TxPDown","<EFBFBD><EFBFBD><EFBFBD>͉<EFBFBD><EFBFBD><EFBFBD> <20>y<EFBFBD>[<5B>W<EFBFBD><57>", &sys.m_SysKey[kkInPDown]},
{"TxHome","<EFBFBD><EFBFBD><EFBFBD>͉<EFBFBD><EFBFBD><EFBFBD> <20>", &sys.m_SysKey[kkInHome]},
{"TxEnd","<EFBFBD><EFBFBD><EFBFBD>͉<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>", &sys.m_SysKey[kkInEnd]},
{"RxUp","<EFBFBD><EFBFBD><EFBFBD>M<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>", &sys.m_SysKey[kkRxUp]},
{"RxDown","<EFBFBD><EFBFBD><EFBFBD>M<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>", &sys.m_SysKey[kkRxDown]},
{"RxPUp","<EFBFBD><EFBFBD><EFBFBD>M<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>y<EFBFBD>[<5B>W<EFBFBD><57>", &sys.m_SysKey[kkRxPUp]},
{"RxPDown","<EFBFBD><EFBFBD><EFBFBD>M<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>y<EFBFBD>[<5B>W<EFBFBD><57>", &sys.m_SysKey[kkRxPDown]},
{"RxHome","<EFBFBD><EFBFBD><EFBFBD>M<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>", &sys.m_SysKey[kkRxHome]},
{"RxEnd","<EFBFBD><EFBFBD><EFBFBD>M<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>", &sys.m_SysKey[kkRxEnd]},
{"CharWaitL","<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Wait<EFBFBD><EFBFBD>", &sys.m_SysKey[kkCharWaitLeft]},
{"CharWaitR","<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Wait<EFBFBD><EFBFBD>", &sys.m_SysKey[kkCharWaitRight]},
{"DiddleWaitL","DiddleWait<EFBFBD><EFBFBD>", &sys.m_SysKey[kkDiddleWaitLeft]},
{"DiddleWaitR","DiddleWait<EFBFBD><EFBFBD>", &sys.m_SysKey[kkDiddleWaitRight]},
{"TxHeightUp","<EFBFBD><EFBFBD><EFBFBD>͉<EFBFBD><EFBFBD>ʊg<EFBFBD><EFBFBD>", &sys.m_SysKey[kkInHeightUp]},
{"TxHeightDown","<EFBFBD><EFBFBD><EFBFBD>͉<EFBFBD><EFBFBD>ʏk<EFBFBD><EFBFBD>", &sys.m_SysKey[kkInHeightDown]},
{"TxLTR","LTR<EFBFBD><EFBFBD><EFBFBD>M", &sys.m_SysKey[kkTxLTR]},
{"TxFIG","FIG<EFBFBD><EFBFBD><EFBFBD>M", &sys.m_SysKey[kkTxFIG]},
{"DecShift","SHIFT<EFBFBD><EFBFBD> <20><><EFBFBD>߂<EFBFBD>", &sys.m_SysKey[kkDecShift]},
{"IncShift","SHIFT<EFBFBD><EFBFBD> <20>L<EFBFBD><4C><EFBFBD><EFBFBD>", &sys.m_SysKey[kkIncShift]},
{"ChangeShift","SHIFT<EFBFBD><EFBFBD><EFBFBD>ύX (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<6F>A<EFBFBD><41><EFBFBD>}<7D>N<EFBFBD><4E>";
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;
}
//---------------------------------------------------------------------------
// <20>d<EFBFBD><64><EFBFBD>̃`<60>F<EFBFBD>b<EFBFBD>N
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: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
strcpy(bf, dp->pSys);
break;
case 1: // <20><><EFBFBD>[<5B>U<EFBFBD><55>
strcpy(bf, dp->pUser);
break;
case 2: // <20>V<EFBFBD><56><EFBFBD>[<5B>g<EFBFBD>J<EFBFBD>b<EFBFBD>g
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 { // <20>^<5E>C<EFBFBD>g<EFBFBD><67>
LPCSTR _tt[]={
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>","<EFBFBD><EFBFBD><EFBFBD>[<5B>U<EFBFBD>[<5B><><EFBFBD>`<60><>","<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ăL<EFBFBD>["
};
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' <20><> '%s' <20><><EFBFBD>d<EFBFBD><64><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><C482>܂<EFBFBD>.", as.c_str(), t->pSys);
return;
}
}
}
}
}
InfoMB( (Font->Charset != SHIFTJIS_CHARSET)?"No duplicated":"<EFBFBD>d<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>V<EFBFBD><EFBFBD><EFBFBD>[<5B>g<EFBFBD>J<EFBFBD>b<EFBFBD>g<EFBFBD>L<EFBFBD>[<5B>͂<EFBFBD><CD82><EFBFBD><EFBFBD>܂<EFBFBD><DC82><EFBFBD>." );
}
//---------------------------------------------------------------------------
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");
}
//---------------------------------------------------------------------------