mirror of
https://github.com/n5ac/mmvari.git
synced 2025-12-06 04:12:03 +01:00
527 lines
14 KiB
C++
527 lines
14 KiB
C++
//Copyright+LGPL
|
||
|
||
//-----------------------------------------------------------------------------------------------------------------------------------------------
|
||
// Copyright 2000-2013 Makoto Mori, Nobuyuki Oba
|
||
//-----------------------------------------------------------------------------------------------------------------------------------------------
|
||
// This file is part of MMVARI.
|
||
|
||
// MMVARI 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.
|
||
|
||
// MMVARI 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 "QsoDlg.h"
|
||
#include "Country.h"
|
||
#include "MmcgDlg.h"
|
||
#include "Main.h"
|
||
//#include "TextEdit.h"
|
||
//#include "LogPic.h"
|
||
//---------------------------------------------------------------------
|
||
#pragma resource "*.dfm"
|
||
//TQSODlgBox *QSODlgBox;
|
||
//---------------------------------------------------------------------
|
||
__fastcall TQSODlgBox::TQSODlgBox(TComponent* AOwner)
|
||
: TForm(AOwner)
|
||
{
|
||
FormStyle = ((TForm *)AOwner)->FormStyle;
|
||
Font->Name = ((TForm *)AOwner)->Font->Name;
|
||
Font->Charset = ((TForm *)AOwner)->Font->Charset;
|
||
LStat->Font->Name = ((TForm *)AOwner)->Font->Name;
|
||
LStat->Font->Charset = ((TForm *)AOwner)->Font->Charset;
|
||
m_fp = NULL;
|
||
|
||
EditHis->Items->Assign(MainVARI->HisRST->Items);
|
||
EditMy->Items->Assign(MainVARI->MyRST->Items);
|
||
if( sys.m_MsgEng ){
|
||
Grid->Font->Name = ((TForm *)AOwner)->Font->Name;
|
||
Grid->Font->Charset = ((TForm *)AOwner)->Font->Charset;
|
||
Caption = "QSO Data";
|
||
CancelBtn->Caption = "Close";
|
||
OKBtn->Caption = "Write";
|
||
}
|
||
switch(Log.m_LogSet.m_TimeZone){
|
||
case 'I':
|
||
if( sys.m_LCID == 0x0412 ){
|
||
LTimeZone->Caption = "KST";
|
||
}
|
||
else {
|
||
LTimeZone->Caption = "JST";
|
||
}
|
||
break;
|
||
default:
|
||
LTimeZone->Caption = "UTC";
|
||
break;
|
||
}
|
||
if( Log.m_LogSet.m_DateType & 1 ){
|
||
Grid->ColWidths[0] = (Grid->ColWidths[0] * 10) / 8;
|
||
}
|
||
m_EditFlag = 0;
|
||
m_fSelect = FALSE;
|
||
FormCenter(this);
|
||
}
|
||
|
||
void __fastcall TQSODlgBox::UpdateBtn(void)
|
||
{
|
||
OKBtn->Enabled = m_EditFlag;
|
||
}
|
||
|
||
void __fastcall TQSODlgBox::SetCountry(void)
|
||
{
|
||
m_Country = "";
|
||
|
||
if( !Cty.IsData() ) return;
|
||
LPCSTR p = ClipCC(m_fp->GetText());
|
||
if( !(*p) ) return;
|
||
|
||
SYSTEMTIME now;
|
||
GetUTC(&now);
|
||
|
||
WORD tim = WORD((now.wHour * 60 + now.wMinute) * 30 + now.wSecond/2);
|
||
|
||
int n;
|
||
if( (n = Cty.GetNoP(p))!=0 ){
|
||
CTL *cp = Cty.GetCTL(n-1);
|
||
char bf[256];
|
||
char tbf[5];
|
||
tbf[0] = 0;
|
||
if( cp->TD != NULL ){
|
||
tim = AdjustRolTimeUTC(tim, *cp->TD);
|
||
if( tim ){
|
||
tim /= WORD(30);
|
||
sprintf(tbf, "%02u%02u%c", tim / 60, tim % 60, *cp->TD);
|
||
}
|
||
}
|
||
sprintf(bf, " %s/%s %s %s",
|
||
(cp->Name!=NULL) ? cp->Name : "",
|
||
(cp->Cont!=NULL) ? cp->Cont : "",
|
||
tbf,
|
||
(cp->QTH!=NULL) ? cp->QTH : ""
|
||
);
|
||
m_Country = bf;
|
||
}
|
||
}
|
||
|
||
int __fastcall TQSODlgBox::Execute(CLogFind *fp, SDMMLOG *sp, int n)
|
||
{
|
||
m_fp = fp;
|
||
UpdateTextData(sp, n);
|
||
Grid->RowCount = fp->GetCount() ? fp->GetCount() + 1 : 2;
|
||
// Grid->TopRow = 1;
|
||
Grid->Row = 1;
|
||
// Grid->Enabled = FALSE;
|
||
m_fSelect = FALSE;
|
||
for( int i = 0; i < fp->GetCount(); i++ ){
|
||
if( n == fp->pFindTbl[i] ){
|
||
m_fSelect = TRUE;
|
||
// Grid->Enabled = TRUE;
|
||
Grid->Row = i + 1;
|
||
Grid->TopRow = (i > 4) ? Grid->Row - 4 : 1;
|
||
break;
|
||
}
|
||
}
|
||
SetCountry();
|
||
char bf[512];
|
||
strcpy(bf, sys.m_MsgEng ? "Initial Data":"QSO<EFBFBD>f<EFBFBD>[<5B>^<5E><><EFBFBD><EFBFBD><EFBFBD>l");
|
||
if( m_fSelect ){
|
||
if( sp->btime ){
|
||
sprintf(bf, "[%s]", fp->GetText());
|
||
strcat(bf, m_Country.c_str());
|
||
}
|
||
else if( *fp->GetText() ){
|
||
sprintf(bf, "[%s]", fp->GetText());
|
||
strcat(bf, m_Country.c_str());
|
||
}
|
||
}
|
||
Caption = bf;
|
||
UpdateStat();
|
||
m_EditFlag = 0;
|
||
UpdateBtn();
|
||
m_CurNo = n;
|
||
if( ShowModal() == IDOK ){
|
||
if( m_EditFlag ){
|
||
UpdateCurData(&m_sd);
|
||
Log.PutData(&m_sd, m_CurNo);
|
||
}
|
||
}
|
||
if( m_CurNo == n ){
|
||
memcpy(sp, &m_sd, sizeof(SDMMLOG));
|
||
}
|
||
else {
|
||
Log.GetData(sp, n);
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
int __fastcall TQSODlgBox::ShowFind(CLogFind *fp)
|
||
{
|
||
m_fp = fp;
|
||
if( fp->GetCount() ){
|
||
Log.GetData(&m_sd, fp->pFindTbl[0]);
|
||
m_CurNo = fp->pFindTbl[0];
|
||
}
|
||
else {
|
||
memset(&m_sd, 0, sizeof(SDMMLOG));
|
||
OKBtn->Enabled = FALSE;
|
||
}
|
||
SetCountry();
|
||
char bf[512];
|
||
UpdateTextData(&m_sd, fp->pFindTbl[0]);
|
||
Grid->RowCount = fp->GetCount() ? fp->GetCount() + 1 : 2;
|
||
Grid->TopRow = 1;
|
||
Grid->Row = 1;
|
||
sprintf(bf, "[%s]", fp->GetText());
|
||
strcat(bf, m_Country.c_str());
|
||
Caption = bf;
|
||
UpdateStat();
|
||
m_EditFlag = 0;
|
||
m_fSelect = TRUE;
|
||
UpdateBtn();
|
||
if( ShowModal() == IDOK ){
|
||
if( m_EditFlag ){
|
||
UpdateCurData(&m_sd);
|
||
Log.PutData(&m_sd, m_CurNo);
|
||
}
|
||
return TRUE;
|
||
}
|
||
else {
|
||
return FALSE;
|
||
}
|
||
}
|
||
|
||
void __fastcall TQSODlgBox::UpdateTextData(SDMMLOG *sp, int n)
|
||
{
|
||
m_CurNo = n;
|
||
memcpy(&m_sd, sp, sizeof(SDMMLOG));
|
||
UpdateTextData(&m_sd);
|
||
}
|
||
|
||
void __fastcall TQSODlgBox::UpdateTextData(SDMMLOG *sp)
|
||
{
|
||
SDMMLOG sd;
|
||
memcpy(&sd, sp, sizeof(SDMMLOG));
|
||
if( Log.m_LogSet.m_TimeZone != 'I' ){
|
||
JSTtoUTC(&sd);
|
||
}
|
||
EditDate->Text = Log.GetDateString(&sd);
|
||
EditBgn->Text = Log.GetTimeString(sd.btime);
|
||
EditEnd->Text = Log.GetTimeString(sd.etime);
|
||
EditCall->Text = sp->call;
|
||
EditName->Text = sp->name;
|
||
EditQTH->Text = sp->qth;
|
||
EditHis->Text = sp->ur;
|
||
EditMy->Text = sp->my;
|
||
EditBand->Text = Log.GetFreqString(sp->band, sp->fq);
|
||
EditMode->Text = Log.GetModeString(sp->mode);
|
||
EditRem->Text = sp->rem;
|
||
EditQSL->Text = sp->qsl;
|
||
if( sp->env ){
|
||
EditEnv->Text = sp->env;
|
||
}
|
||
else {
|
||
EditEnv->Text = "";
|
||
}
|
||
EditOpt1->Text = Log.GetOptStr(0, sp);
|
||
EditOpt2->Text = Log.GetOptStr(1, sp);
|
||
EditUsr1->Text = Log.GetOptStr(2, sp);
|
||
EditUsr2->Text = Log.GetOptStr(3, sp);
|
||
EditS->Text = sp->send;
|
||
EditR->Text = sp->recv;
|
||
EditM->Text = sp->cq;
|
||
EditPow->Text = sp->pow;
|
||
m_EditFlag = 0;
|
||
UpdateBtn();
|
||
}
|
||
|
||
void __fastcall TQSODlgBox::UpdateCurData(SDMMLOG *sp)
|
||
{
|
||
int y, m, d, h;
|
||
|
||
switch(Log.m_LogSet.m_DateType){
|
||
case 2: // dd-mm-yy
|
||
case 3: // dd-mm-yyyy
|
||
if( sscanf(AnsiString(EditDate->Text).c_str(), "%u.%u.%u", &d, &m, &y) == 3 ){ //JA7UDE 0428
|
||
sp->year = BYTE(y % 100);
|
||
sp->date = WORD(m * 100 + d);
|
||
}
|
||
break;
|
||
case 4: // mm-dd-yy
|
||
case 5: // mm-dd-yyyy
|
||
if( sscanf(AnsiString(EditDate->Text).c_str(), "%u.%u.%u", &m, &d, &y) == 3 ){ //JA7UDE 0428
|
||
sp->year = BYTE(y % 100);
|
||
sp->date = WORD(m * 100 + d);
|
||
}
|
||
break;
|
||
default: // yy-mm-dd, yyyy-mm-dd
|
||
if( sscanf(AnsiString(EditDate->Text).c_str(), "%u.%u.%u", &y, &m, &d) == 3 ){ //JA7UDE 0428
|
||
sp->year = BYTE(y % 100);
|
||
sp->date = WORD(m * 100 + d);
|
||
}
|
||
break;
|
||
}
|
||
if( !EditBgn->Text.IsEmpty() ){
|
||
if( sscanf(AnsiString(EditBgn->Text).c_str(), "%u", &d) == 1){ //JA7UDE 0428
|
||
h = d / 100;
|
||
m = d % 100;
|
||
if( (sp->btime / 30) != (h * 60 + m) ){
|
||
sp->btime = WORD((h * 60 + m) * 30 + 1);
|
||
}
|
||
}
|
||
}
|
||
if( !EditEnd->Text.IsEmpty() ){
|
||
if( sscanf(AnsiString(EditEnd->Text).c_str(), "%u", &d) == 1){ //JA7UDE 0428
|
||
h = d / 100;
|
||
m = d % 100;
|
||
if( (sp->etime / 30) != (h * 60 + m) ){
|
||
sp->etime = WORD((h * 60 + m) * 30 + 1);
|
||
}
|
||
}
|
||
}
|
||
StrCopy(sp->call, AnsiString(EditCall->Text).c_str(), MLCALL); //JA7UDE 0428
|
||
jstrupr(sp->call);
|
||
StrCopy(sp->name, AnsiString(EditName->Text).c_str(), MLNAME); //JA7UDE 0428
|
||
if( Log.m_LogSet.m_UpperName ) jstrupr(sp->name);
|
||
StrCopy(sp->qth, AnsiString(EditQTH->Text).c_str(), MLQTH); //JA7UDE 0428
|
||
if( Log.m_LogSet.m_UpperQTH ) jstrupr(sp->qth);
|
||
StrCopy(sp->ur, AnsiString(EditHis->Text).c_str(), MLRST); //JA7UDE 0428
|
||
jstrupr(sp->ur);
|
||
StrCopy(sp->my, AnsiString(EditMy->Text).c_str(), MLRST); //JA7UDE 0428
|
||
jstrupr(sp->my);
|
||
Log.SetFreq(sp, AnsiString(EditBand->Text).c_str()); //JA7UDE 0428
|
||
Log.SetMode(sp, AnsiString(EditMode->Text).c_str()); //JA7UDE 0428
|
||
StrCopy(sp->rem, AnsiString(EditRem->Text).c_str(), MLREM); //JA7UDE 0428
|
||
if( Log.m_LogSet.m_UpperREM ) jstrupr(sp->rem);
|
||
StrCopy(sp->qsl, AnsiString(EditQSL->Text).c_str(), MLQSL); //JA7UDE 0428
|
||
if( Log.m_LogSet.m_UpperQSL ) jstrupr(sp->qsl);
|
||
if( sscanf(AnsiString(EditEnv->Text).c_str(), "%u", &d) == 1){ //JA7UDE 0428
|
||
sp->env = WORD(d);
|
||
}
|
||
else {
|
||
sp->env = 0;
|
||
}
|
||
Log.SetOptStr(0, sp, AnsiString(EditOpt1->Text).c_str()); //JA7UDE 0428
|
||
Log.SetOptStr(1, sp, AnsiString(EditOpt2->Text).c_str()); //JA7UDE 0428
|
||
Log.SetOptStr(2, sp, AnsiString(EditUsr1->Text).c_str()); //JA7UDE 0428
|
||
Log.SetOptStr(3, sp, AnsiString(EditUsr2->Text).c_str()); //JA7UDE 0428
|
||
sp->send = *EditS->Text.c_str();
|
||
sp->recv = *EditR->Text.c_str();
|
||
sp->cq = *EditM->Text.c_str();
|
||
sp->cq = char(toupper(sp->cq));
|
||
StrCopy(sp->pow, AnsiString(EditPow->Text).c_str(), MLPOW); //JA7UDE 0428
|
||
jstrupr(sp->pow);
|
||
if( Log.m_LogSet.m_TimeZone != 'I' ){
|
||
UTCtoJST(sp);
|
||
}
|
||
}
|
||
//---------------------------------------------------------------------
|
||
void __fastcall TQSODlgBox::UpdateStat(void)
|
||
{
|
||
char bf[256];
|
||
|
||
int cmp1max = m_fp->m_FindCmp1Max;
|
||
int cmp2max = m_fp->m_FindCmp2Max;
|
||
if( cmp2max && (m_fp->pFindTbl[0] == Log.m_CurNo) ){
|
||
cmp1max--;
|
||
cmp2max--;
|
||
}
|
||
if( sys.m_MsgEng ){
|
||
if( !cmp2max ){
|
||
strcpy(bf, "No Data");
|
||
}
|
||
else if( cmp1max != cmp2max ){
|
||
sprintf(bf, "Perfect: %u SameCall: %u", cmp1max, cmp2max - cmp1max);
|
||
}
|
||
else {
|
||
sprintf(bf, "Perfect: %u", cmp1max );
|
||
}
|
||
}
|
||
else {
|
||
if( !cmp2max ){
|
||
strcpy(bf, "<EFBFBD><EFBFBD><EFBFBD>v<EFBFBD>Ȃ<EFBFBD>");
|
||
}
|
||
else if( cmp1max != cmp2max ){
|
||
sprintf(bf, "<EFBFBD><EFBFBD><EFBFBD>S<EFBFBD><EFBFBD><EFBFBD>v: %u<><75> <20><><EFBFBD><EFBFBD><EFBFBD>R<EFBFBD>[<5B><>: %u<><75>", cmp1max, cmp2max - cmp1max);
|
||
}
|
||
else {
|
||
sprintf(bf, "<EFBFBD><EFBFBD><EFBFBD>S<EFBFBD><EFBFBD><EFBFBD>v: %u<><75>", cmp1max );
|
||
}
|
||
}
|
||
LStat->Caption = bf;
|
||
}
|
||
//---------------------------------------------------------------------#if 0
|
||
void __fastcall TQSODlgBox::GridDrawCell(TObject *Sender, int Col, int Row,
|
||
TRect &Rect, TGridDrawState State)
|
||
{
|
||
char bf[256];
|
||
SDMMLOG sd;
|
||
|
||
Grid->Canvas->FillRect(Rect);
|
||
int X = Rect.Left + 4;
|
||
int Y = Rect.Top + 2;
|
||
|
||
if( Row ){
|
||
Row--;
|
||
bf[0] = 0;
|
||
if( Row < m_fp->GetCount() ){
|
||
Log.GetData(&sd, m_fp->pFindTbl[Row]);
|
||
if( ((Row+1) != Grid->Row)||(Col != Grid->Col) ){
|
||
if( m_fp->pFindTbl[Row] == Log.m_CurNo ){
|
||
Grid->Canvas->Font->Color = clLtGray;
|
||
}
|
||
else if( Row < m_fp->m_FindCmp1Max ){
|
||
Grid->Canvas->Font->Color = clRed;
|
||
}
|
||
else if( Row < m_fp->m_FindCmp2Max ){
|
||
Grid->Canvas->Font->Color = clGreen;
|
||
}
|
||
}
|
||
if( Log.m_LogSet.m_TimeZone != 'I' ){
|
||
JSTtoUTC(&sd);
|
||
}
|
||
}
|
||
else {
|
||
memset(&sd, 0, sizeof(SDMMLOG));
|
||
}
|
||
switch(Col){
|
||
case 0: // Date
|
||
strcpy(bf, Log.GetDateString(&sd));
|
||
break;
|
||
case 1: // Time
|
||
strcpy(bf, Log.GetTimeString(sd.btime));
|
||
break;
|
||
case 2: // Call
|
||
strcpy(bf, sd.call);
|
||
break;
|
||
case 3: // M
|
||
bf[0] = sd.cq;
|
||
bf[1] = 0;
|
||
break;
|
||
case 4: // HisRST
|
||
strcpy(bf, sd.ur);
|
||
break;
|
||
case 5: // MyRST
|
||
strcpy(bf, sd.my);
|
||
break;
|
||
case 6: // Band
|
||
strcpy(bf, Log.GetFreqString(sd.band, sd.fq));
|
||
break;
|
||
case 7: // Mode
|
||
strcpy(bf, Log.GetModeString(sd.mode));
|
||
break;
|
||
case 8: // Pow
|
||
strcpy(bf, sd.pow);
|
||
break;
|
||
case 9: // Name
|
||
strcpy(bf, sd.name);
|
||
break;
|
||
case 10: // QTH
|
||
strcpy(bf, sd.qth);
|
||
break;
|
||
case 11: // S
|
||
bf[0] = sd.send;
|
||
bf[1] = 0;
|
||
break;
|
||
case 12: // R
|
||
bf[0] = sd.recv;
|
||
bf[1] = 0;
|
||
break;
|
||
case 13: // REM
|
||
strcpy(bf, sd.rem);
|
||
break;
|
||
case 14: // QSL
|
||
strcpy(bf, sd.qsl);
|
||
break;
|
||
case 15: // etime;
|
||
strcpy(bf, Log.GetTimeString(sd.etime));
|
||
break;
|
||
case 16: // Env
|
||
if( sd.env ) sprintf(bf, "%u", sd.env);
|
||
break;
|
||
case 17: // Opt1
|
||
strcpy(bf, sd.opt1);
|
||
break;
|
||
case 18: // Opt2
|
||
strcpy(bf, sd.opt2);
|
||
break;
|
||
case 19: // Usr1
|
||
break;
|
||
case 20: // Usr2
|
||
break;
|
||
}
|
||
Grid->Canvas->TextRect(Rect, X, Y, bf);
|
||
}
|
||
else { // <20>^<5E>C<EFBFBD>g<EFBFBD><67>
|
||
LPCSTR _tt[]={
|
||
"Date","JST","Call","M", "His","My","Band","Mode","Pow","Name","QTH","S","R",
|
||
"Note","QSL", "End", "Env", "Opt1", "Opt2", "Usr1", "Usr2",
|
||
};
|
||
if( Col == 1 ){
|
||
Grid->Canvas->TextRect(Rect, X, Y, LTimeZone->Caption);
|
||
}
|
||
else {
|
||
Grid->Canvas->TextRect(Rect, X, Y, _tt[Col]);
|
||
}
|
||
}
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall TQSODlgBox::GridSelectCell(TObject *Sender, int Col,
|
||
int Row, bool &CanSelect)
|
||
{
|
||
if( !m_fSelect ) return;
|
||
|
||
int n = Row - 1;
|
||
if( n < m_fp->GetCount() ){
|
||
if( m_CurNo != m_fp->pFindTbl[n] ){
|
||
if( m_EditFlag ){
|
||
UpdateCurData(&m_sd);
|
||
Log.PutData(&m_sd, m_CurNo);
|
||
m_EditFlag = 0;
|
||
}
|
||
m_CurNo = m_fp->pFindTbl[n];
|
||
Log.GetData(&m_sd, m_CurNo);
|
||
UpdateTextData(&m_sd, m_CurNo);
|
||
Grid->Invalidate();
|
||
UpdateBtn();
|
||
}
|
||
}
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall TQSODlgBox::SBMMCGClick(TObject *Sender)
|
||
{
|
||
TMmcgDlgBox *pBox = new TMmcgDlgBox(this);
|
||
|
||
AnsiString qth = EditQTH->Text;
|
||
AnsiString opt = EditOpt1->Text;
|
||
AnsiString cal = EditCall->Text; //JA7UDE 0428
|
||
if( pBox->Execute(cal, qth, opt) == TRUE ){ //JA7UDE 0428
|
||
EditQTH->Text = qth;
|
||
EditOpt1->Text = opt;
|
||
}
|
||
delete pBox;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall TQSODlgBox::EditDateChange(TObject *Sender)
|
||
{
|
||
m_EditFlag = 1;
|
||
UpdateBtn();
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall TQSODlgBox::GridClick(TObject *Sender)
|
||
{
|
||
if( !m_fSelect ){
|
||
Grid->Row = 1;
|
||
return;
|
||
}
|
||
}
|
||
//---------------------------------------------------------------------------
|