mmsstv/CItems/QSLBox/TextDlg.cpp
2013-07-05 15:15:14 -05:00

672 lines
17 KiB
C++

//---------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "TextDlg.h"
//---------------------------------------------------------------------
#pragma resource "*.dfm"
//TTextDlgBox *TextDlgBox;
//---------------------------------------------------------------------
__fastcall TTextDlgBox::TTextDlgBox(HWND hWnd)
: TForm(hWnd)
{
MultProc();
m_DisEvent = 1;
m_pBitmap = NULL;
m_Change = 0;
m_DropProfile = 0;
m_FText = "";
if( sys.m_MsgEng ){
Font->Name = "Arial";
Font->Charset = ANSI_CHARSET;
Caption = "Set text and colors - "VER" "TTL;
CancelBtn->Caption = "Cancel";
FontBtn->Caption = "Font";
SBM->Caption = "Mac";
GBG->Caption = "Gradation";
GBS->Caption = "Shadow";
GBA->Caption = "Misc";
CBFixed->Caption = "Fixed box-size";
CBZero->Caption = "Slash zero";
SBLD->Caption = "Del";
SBLW->Caption = "Add";
GBY->Caption = "Style profiles";
L1->Caption = "Align";
L2->Caption = "Style name";
SBYD->Caption = "Del";
SBYW->Caption = "Add";
CBY->Text = "Untitled";
SBM->Hint = "Insert macro-keyword";
SBC->Hint = "Choose color's component";
SBLD->Hint = "Delete the text in the list";
SBLW->Hint = "Add current text into the list";
SBYD->Hint = "Delete the style in the profiles";
SBYW->Hint = "Add current style into the profiles";
SB3DD->Hint = "Make the shadow shorter";
SB3DI->Hint = "Make the shadow longer";
FontBtn->Hint = "Choose font";
SBFD->Hint = "Make the font smaller";
SBFI->Hint = "Make the font bigger";
}
else {
Caption = "テキストと色の設定 - "VER" "TTLJ;
CBY->Text = "無題";
}
SBFD->Glyph->Assign(SB3DD->Glyph);
SBFI->Glyph->Assign(SB3DI->Glyph);
MultProc();
if( sys.m_pTextList == NULL ){
sys.m_pTextList = new TStringList;
LoadStringsFromIniFile(sys.m_pTextList, "Strings", ININAME);
MultProc();
if(!sys.m_pTextList->Count){
sys.m_pTextList->Add("%c\\r\\nur %r\\r\\nde %m");
sys.m_pTextList->Add("Tnx for nice PIC\\r\\nur %r\\r\\nde %m");
sys.m_pTextList->Add("%n\\r\\nBest 73\\r\\nde %m");
}
}
ASSERT(sys.m_pTextList);
CBList->Items->Assign(sys.m_pTextList);
if( sys.m_pStyleList == NULL ){
sys.m_pStyleList = new TStringList;
LoadStringsFromIniFile(sys.m_pStyleList, "Styles", ININAME);
MultProc();
}
CBY->Items->Assign(sys.m_pStyleList);
CBY->Sorted = TRUE;
ShowHint = sys.m_WinNT;
MultProc();
}
//---------------------------------------------------------------------
void __fastcall TTextDlgBox::FormDestroy(TObject *Sender)
{
if( m_pBitmap != NULL ) delete m_pBitmap;
MultProc();
ASSERT(sys.m_pTextList);
sys.m_pTextList->Assign(CBList->Items);
}
//---------------------------------------------------------------------------
void __fastcall TTextDlgBox::TopMost(void)
{
::SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
}
//---------------------------------------------------------------------------
void __fastcall TTextDlgBox::NoTopMost(void)
{
::SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
}
//---------------------------------------------------------------------------
void __fastcall TTextDlgBox::UpdateUI(void)
{
m_DisEvent++;
int f = SBG1->Down ? FALSE : TRUE;
PG2->Visible = f;
PG3->Visible = f;
PG4->Visible = f;
SBC->Visible = f && sys.m_fColorComp;
f = !SBS1->Down;
if( !f ) CB3D->Checked = FALSE;
CB3D->Enabled = f;
PB1->Visible = f && (!SBS2->Down || !CB3D->Checked);
PB2->Visible = f && (SBS4->Down || CB3D->Checked);
PB3->Visible = f && CB3D->Checked;
UDL->Enabled = f && (SBS3->Down || !CB3D->Checked);
SBLW->Enabled = (!m_FText.IsEmpty() && CBList->Items->IndexOf(m_FText) < 0) ? TRUE : FALSE;
SBLD->Enabled = CBList->ItemIndex >= 0 ? TRUE : FALSE;
SBYW->Enabled = !CBY->Text.IsEmpty();
SBYD->Enabled = !CBY->Text.IsEmpty() && (sys.m_pStyleList->IndexOf(CBY->Text) >= 0);
UDX->Enabled = CB3D->Checked;
UDY->Enabled = CB3D->Checked;
SB3DI->Enabled = CB3D->Checked;
SB3DD->Enabled = CB3D->Checked;
if( sys.m_WinNT ){
char bf[32];
sprintf(bf, "W = %d", UDL->Position);
UDL->Hint = bf;
sprintf(bf, "3D(Y) = %d", UDY->Position);
UDY->Hint = bf;
sprintf(bf, "3D(X) = %d", UDX->Position);
UDX->Hint = bf;
}
m_DisEvent--;
}
//---------------------------------------------------------------------
void __fastcall TTextDlgBox::UpdateMemoFont(BYTE charset)
{
switch(charset){
case SHIFTJIS_CHARSET:
case HANGEUL_CHARSET:
case CHINESEBIG5_CHARSET: //
case 134: // 簡略
break;
default:
charset = Font->Charset;
break;
}
m_DisEvent++;
if( Memo->Font->Charset != charset ){
Memo->Font->Charset = charset;
}
m_DisEvent--;
}
//---------------------------------------------------------------------
int __fastcall TTextDlgBox::Execute(CItem *pItem)
{
MultProc();
m_Item.Copy(pItem);
UpdateDialog(&m_Item);
UpdateBitmap();
m_DisEvent = 0;
MultProc();
if( ShowModal() == IDOK ){
MultProc();
pItem->Copy(&m_Item);
if( pItem->m_ASize ){
pItem->m_OrgXW = -1;
}
MultProc();
return TRUE;
}
else {
MultProc();
return FALSE;
}
}
//---------------------------------------------------------------------
void __fastcall TTextDlgBox::UpdateFText(void)
{
AnsiString as;
if( Memo->Text.IsEmpty() ){
m_FText = "";
}
else {
::CrLf2Yen(as, Memo->Text);
LPSTR p = as.c_str();
if( *p ){
*(p+strlen(p)-1) = 0;
m_FText = p+1;
}
}
m_DisEvent++;
CBList->ItemIndex = CBList->Items->IndexOf(m_FText);
m_DisEvent--;
}
//---------------------------------------------------------------------
void __fastcall TTextDlgBox::UpdateItem(CItem *pItem)
{
UpdateUI();
if( SBG1->Down ){
pItem->m_Grade = 0;
}
else if( SBG2->Down ){
pItem->m_Grade = 1;
}
else if( SBG3->Down ){
pItem->m_Grade = 2;
}
else {
pItem->m_Grade = 3;
}
if( SBS1->Down ){
pItem->m_Shadow = 0;
}
else if( SBS2->Down ){
pItem->m_Shadow = 1;
}
else if( SBS3->Down ){
pItem->m_Shadow = 2;
}
else {
pItem->m_Shadow = 3;
}
if( SBA1->Down ){
pItem->m_Align = 0;
}
else if( SBA2->Down ){
pItem->m_Align = 1;
}
else {
pItem->m_Align = 2;
}
pItem->m_ColB[0].c = PB1->Color;
pItem->m_ColB[1].c = PB2->Color;
pItem->m_ColB[2].c = PB3->Color;
pItem->m_ColG[0].c = PG1->Color;
pItem->m_ColG[1].c = PG2->Color;
pItem->m_ColG[2].c = PG3->Color;
pItem->m_ColG[3].c = PG4->Color;
pItem->m_Line = UDL->Position;
pItem->m_ASize = !CBFixed->Checked;
pItem->m_Zero = CBZero->Checked;
pItem->m_Text = Memo->Text.c_str();
pItem->m_3d = (CB3D->Enabled && CB3D->Checked) ? 0x00010000 : 0;
pItem->m_3d |= ((UDY->Position << 8)&0x0000ff00);
pItem->m_3d |= (UDX->Position & 0x000000ff);
}
//---------------------------------------------------------------------
void __fastcall TTextDlgBox::UpdateDialog(CItem *pItem)
{
m_DisEvent++;
switch(pItem->m_Grade){
case 1:
SBG2->Down = TRUE;
break;
case 2:
SBG3->Down = TRUE;
break;
case 3:
SBG4->Down = TRUE;
break;
default:
SBG1->Down = TRUE;
break;
}
switch(pItem->m_Shadow){
case 1:
SBS2->Down = TRUE;
break;
case 2:
SBS3->Down = TRUE;
break;
case 3:
SBS4->Down = TRUE;
break;
default:
SBS1->Down = TRUE;
break;
}
switch(pItem->m_Align){
case 1:
SBA2->Down = TRUE;
break;
case 2:
SBA3->Down = TRUE;
break;
default:
SBA1->Down = TRUE;
break;
}
PB1->Color = pItem->m_ColB[0].c;
PB2->Color = pItem->m_ColB[1].c;
PB3->Color = pItem->m_ColB[2].c;
PG1->Color = pItem->m_ColG[0].c;
PG2->Color = pItem->m_ColG[1].c;
PG3->Color = pItem->m_ColG[2].c;
PG4->Color = pItem->m_ColG[3].c;
UDL->Position = SHORT(pItem->m_Line);
CBFixed->Checked = !pItem->m_ASize;
CBZero->Checked = pItem->m_Zero;
CB3D->Checked = pItem->m_3d & 0x00010000;
int xm = pItem->m_3d & 0x000000ff;
int ym = (pItem->m_3d >> 8) & 0x000000ff;
if( xm & 0x0080 ) xm |= 0xffffff80;
if( ym & 0x0080 ) ym |= 0xffffff80;
UDY->Position = SHORT(ym);
UDX->Position = SHORT(xm);
if( pItem->m_pFont != NULL ){
UpdateMemoFont(pItem->m_pFont->Charset);
}
Memo->Text = pItem->m_Text.c_str();
UpdateFText();
m_DisEvent--;
}
//---------------------------------------------------------------------
void __fastcall TTextDlgBox::UpdateBitmap(void)
{
MultProc();
m_Change = 0;
UpdateItem(&m_Item);
char bf[1024];
sys.m_fConvMac(bf, m_Item.GetText(), sizeof(bf)-1);
MultProc();
if( m_pBitmap == NULL ){
int xw = m_Item.m_OrgXW;
int yw = m_Item.m_OrgYW;
if( (xw < 0)||(yw < 0) ){
xw = 160;
yw = 128;
}
m_pBitmap = CreateBitmap(xw, yw);
}
FillBitmap(m_pBitmap, m_Item.m_Back);
MultProc();
m_pBitmap = m_Item.Draw(m_pBitmap, bf);
PBox->Invalidate();
}
//---------------------------------------------------------------------------
void __fastcall TTextDlgBox::PBoxPaint(TObject *Sender)
{
if( m_pBitmap == NULL ) return;
Graphics::TBitmap *pBitmap = m_pBitmap;
if( sys.m_BitPixel == 16 ){
pBitmap = new Graphics::TBitmap;
pBitmap->Width = m_pBitmap->Width;
pBitmap->Height = m_pBitmap->Height;
pBitmap->Canvas->Draw(0, 0, m_pBitmap);
}
pBitmap->Transparent = TRUE;
pBitmap->TransparentMode = tmFixed;
pBitmap->TransparentColor = pBitmap->Canvas->Pixels[0][0];
PBox->Canvas->Draw(0, 0, pBitmap);
pBitmap->Transparent = FALSE;
if( pBitmap != m_pBitmap ) delete pBitmap;
}
//---------------------------------------------------------------------------
void __fastcall TTextDlgBox::MemoChange(TObject *Sender)
{
if( m_DisEvent ) return;
m_Change = 2;
Timer->Enabled = TRUE;
UpdateFText();
}
//---------------------------------------------------------------------------
void __fastcall TTextDlgBox::TimerTimer(TObject *Sender)
{
if( m_Change ){
m_Change--;
if( !m_Change ){
Timer->Enabled = FALSE;
UpdateBitmap();
}
}
}
//---------------------------------------------------------------------------
void __fastcall TTextDlgBox::SBG1Click(TObject *Sender)
{
if( m_DisEvent ) return;
UpdateBitmap();
}
//---------------------------------------------------------------------------
void __fastcall TTextDlgBox::PB1Click(TObject *Sender)
{
TPanel *pPanel = (TPanel *)Sender;
InitCustomColor(ColorDialog);
AddCustomColor(ColorDialog, PG1->Color);
AddCustomColor(ColorDialog, PG2->Color);
AddCustomColor(ColorDialog, PG3->Color);
AddCustomColor(ColorDialog, PG4->Color);
AddCustomColor(ColorDialog, PB1->Color);
AddCustomColor(ColorDialog, PB2->Color);
AddCustomColor(ColorDialog, m_Item.m_Back.c);
ColorDialog->Color = pPanel->Color;
NoTopMost();
int r = ColorDialog->Execute();
TopMost();
if( r == TRUE ){
pPanel->Color = ColorDialog->Color;
UpdateBitmap();
}
}
//---------------------------------------------------------------------------
void __fastcall TTextDlgBox::FormActivate(TObject *Sender)
{
TopMost();
}
//---------------------------------------------------------------------------
void __fastcall TTextDlgBox::FormDeactivate(TObject *Sender)
{
NoTopMost();
}
//---------------------------------------------------------------------------
void __fastcall TTextDlgBox::UDLClick(TObject *Sender, TUDBtnType Button)
{
if( m_DisEvent ) return;
UpdateBitmap();
}
//---------------------------------------------------------------------------
void __fastcall TTextDlgBox::FontBtnClick(TObject *Sender)
{
FontDialog->Font->Assign(m_Item.m_pFont);
FontDialog->Font->Color = PG1->Color;
NoTopMost();
int r = FontDialog->Execute();
TopMost();
if( r == TRUE ){
m_Item.m_pFont->Assign(FontDialog->Font);
PG1->Color = FontDialog->Font->Color;
m_Item.UpdateFont();
if( m_Item.m_pFont != NULL ){
UpdateMemoFont(m_Item.m_pFont->Charset);
}
UpdateBitmap();
}
}
//---------------------------------------------------------------------------
void __fastcall TTextDlgBox::SBMClick(TObject *Sender)
{
if( sys.m_fGetMacKey ){
char bf[256];
NoTopMost();
int r = sys.m_fGetMacKey(bf, sizeof(bf));
TopMost();
if( r ){
Memo->SetFocus();
for( LPCSTR p = bf; *p; p++ ){
::PostMessage(Memo->Handle, WM_CHAR, *p, 0);
}
}
}
}
//---------------------------------------------------------------------------
void __fastcall TTextDlgBox::SBCClick(TObject *Sender)
{
if( sys.m_fColorComp ){
UCOL col[4];
col[0].c = PG1->Color;
col[1].c = PG2->Color;
col[2].c = PG3->Color;
col[3].c = PG4->Color;
NoTopMost();
int r = sys.m_fColorComp(&col[0].d);
TopMost();
if( r ){
PG1->Color = col[0].c;
PG2->Color = col[1].c;
PG3->Color = col[2].c;
PG4->Color = col[3].c;
UpdateBitmap();
}
}
}
//---------------------------------------------------------------------------
void __fastcall TTextDlgBox::SBLWClick(TObject *Sender)
{
m_DisEvent++;
CBList->Items->Add(m_FText);
CBList->ItemIndex = CBList->Items->IndexOf(m_FText);
UpdateUI();
m_DisEvent--;
}
//---------------------------------------------------------------------------
void __fastcall TTextDlgBox::SBLDClick(TObject *Sender)
{
m_DisEvent++;
if( CBList->ItemIndex >= 0 ){
int n = CBList->ItemIndex;
CBList->ItemIndex = -1;
CBList->Items->Delete(n);
UpdateUI();
}
m_DisEvent--;
}
//---------------------------------------------------------------------------
void __fastcall TTextDlgBox::CBListChange(TObject *Sender)
{
if( m_DisEvent ) return;
if( CBList->ItemIndex < 0 ) return;
m_DisEvent++;
AnsiString cs;
AnsiString as = CBList->Items->Strings[CBList->ItemIndex];
m_FText = as;
::Yen2CrLf(cs, as);
Memo->Text = cs;
UpdateBitmap();
m_DisEvent--;
}
//---------------------------------------------------------------------------
void __fastcall TTextDlgBox::SBYWClick(TObject *Sender)
{
m_DisEvent++;
int r = sys.m_pStyleList->IndexOf(CBY->Text);
if( r < 0 ) r = sys.m_pStyleList->Count;
CItem *pItem = new CItem;
pItem->Copy(&m_Item);
pItem->m_Text = CBY->Text;
char bf[64];
sprintf(bf, "Style.%u", r);
pItem->SaveToInifile(bf, ININAME);
delete pItem;
if( r == sys.m_pStyleList->Count ){
CBY->Items->Add(CBY->Text);
sys.m_pStyleList->Add(CBY->Text);
UpdateUI();
}
m_DisEvent--;
}
//---------------------------------------------------------------------------
void __fastcall TTextDlgBox::SBYDClick(TObject *Sender)
{
m_DisEvent++;
int r = sys.m_pStyleList->IndexOf(CBY->Text);
if( r >= 0 ){
char bf[64];
CItem *pItem = new CItem;
int i;
for( i = r; i < sys.m_pStyleList->Count - 1; i++ ){
sprintf(bf, "Style.%u", i+1);
pItem->LoadFromInifile(bf, ININAME);
sprintf(bf, "Style.%u", i);
pItem->SaveToInifile(bf, ININAME);
MultProc();
}
sprintf(bf, "Style.%u", i);
pItem->DeleteInifile(bf, ININAME);
delete pItem;
sys.m_pStyleList->Delete(r);
r = CBY->Items->IndexOf(CBY->Text);
if( r >= 0 ) CBY->Items->Delete(r);
UpdateUI();
}
m_DisEvent--;
}
//---------------------------------------------------------------------------
void __fastcall TTextDlgBox::CBYChange(TObject *Sender)
{
if( m_DisEvent ) return;
if( !m_DropProfile ){
UpdateUI();
return;
}
m_DropProfile = 0;
m_DisEvent++;
int r = sys.m_pStyleList->IndexOf(CBY->Text);
if( r >= 0 ){
AnsiString as = m_Item.m_Text;
CItem *pItem = new CItem;
char bf[64];
sprintf(bf, "Style.%u", r);
pItem->LoadFromInifile(bf, ININAME);
m_Item.Copy(pItem);
delete pItem;
m_Item.m_Text = as;
UpdateDialog(&m_Item);
UpdateBitmap();
}
m_DisEvent--;
}
//---------------------------------------------------------------------------
void __fastcall TTextDlgBox::CBYKeyPress(TObject *Sender, char &Key)
{
m_DropProfile = 0;
UpdateUI();
}
//---------------------------------------------------------------------------
void __fastcall TTextDlgBox::CBYDropDown(TObject *Sender)
{
m_DropProfile = 1;
}
//---------------------------------------------------------------------------
void __fastcall TTextDlgBox::PBoxMouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if( m_DisEvent ) return;
m_DisEvent++;
if( Button == mbRight ){
CB3D->Checked = FALSE;
}
else {
CB3D->Checked = TRUE;
int xc = m_pBitmap->Width / 2;
int yc = m_pBitmap->Height / 2;
int x = X - xc;
int y = Y - yc;
x = x * 48 / xc;
y = y * 48 / yc;
UDX->Position = SHORT(x);
UDY->Position = SHORT(y);
}
m_DisEvent--;
UpdateBitmap();
}
//---------------------------------------------------------------------------
void __fastcall TTextDlgBox::UD3D(int a)
{
m_DisEvent++;
int x = UDX->Position;
int y = UDY->Position;
int xs = (x >= 0) ? 1 : -1;
int ys = (y >= 0) ? 1 : -1;
x = ABS(x);
y = ABS(y);
if( (x == y) && !(x & 1) ){
x += a;
y += a;
if( x < 4 ) x = 4;
if( y < 4 ) y = 4;
if( x > 48 ) x = 48;
if( y > 48 ) y = 48;
}
else {
if( x < y ) x = y;
x &= 0xfffffffc;
y = x;
}
x *= xs; y *= ys;
UDX->Position = SHORT(x);
UDY->Position = SHORT(y);
m_DisEvent--;
UpdateBitmap();
}
//---------------------------------------------------------------------------
void __fastcall TTextDlgBox::SB3DIClick(TObject *Sender)
{
UD3D((Sender == SB3DI) ? 4 : -4);
}
//---------------------------------------------------------------------------
void __fastcall TTextDlgBox::SBFDClick(TObject *Sender)
{
if( m_Item.m_pFont == NULL ) return;
if( Sender == SBFD ){
if( m_Item.m_pFont->Height < -1 ) m_Item.m_pFont->Height++;
UpdateBitmap();
}
else {
m_Item.m_pFont->Height--;
UpdateBitmap();
}
}
//---------------------------------------------------------------------------