//--------------------------------------------------------------------------- #include #include #include #pragma hdrstop #include "APTable_F.h" #include "MainImage.h" #include "APMenu_F.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TAPTableForm *APTableForm; //--------------------------------------------------------------------------- __fastcall TAPTableForm::TAPTableForm(TComponent* Owner) : TForm(Owner) { SetSmallFont(Font); sbInsert->Caption = IDS_COMMON_SAVEAS; sbsave->Caption = IDS_COMMON_SAVEAS; sbOverwrite->Caption = IDS_COMMON_SAVE; sbDelete->Caption = IDS_COMMON_DELETE; sbRename->Caption = IDS_COMMON_RENAME; sbExit->Caption = IDS_COMMON_EXIT; } //--------------------------------------------------------------------------- void __fastcall TAPTableForm::FormCreate(TObject *Sender) { APTableView = true; sbsave->Enabled = false; /* TIniFile *IniFile = new TIniFile(DirectoryItem + "\\Main.ini"); if (IniFile) { DirectoryListBox->Directory = IniFile->ReadString("APTable", "DirectoryName", DirectoryTreatment); delete IniFile; } */ DirectoryListBox->Directory = DirectoryTreatment; Data = new TList; } //--------------------------------------------------------------------------- void __fastcall TAPTableForm::FormDestroy(TObject *Sender) { if(APMenuForm) APMenuForm->sbView->Enabled = true; TIniFile *IniFile = new TIniFile(DirectoryItem + "\\Main.ini"); if (IniFile) { IniFile->WriteString("APTable", "DirectoryName", DirectoryListBox->Directory); delete IniFile; } ExitData(); delete Data; } //--------------------------------------------------------------------------- void __fastcall TAPTableForm::InitForm() { if (MainImageForm->iMainImage->uBitmap->BitsPerPixel == 8) { Panel->Height = 80; } else { Panel->Height = 40; } InitData(); } //--------------------------------------------------------------------------- void __fastcall TAPTableForm::InitData() { TFileInfor *fi; HANDLE hFile = INVALID_HANDLE_VALUE; int ec; TTexVersion ver; if (Data) { ExitData(); for (int i=0; iItems->Count; i++) { fi = new TFileInfor; fi->Name = FileListBox->Items->Strings[i]; fi->Bitmap = new Graphics::TBitmap; if ((hFile = CreateFile(fi->Name.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE) goto next; if (!LoadFromTexpiaTag(hFile, fi, &ver)) goto next; CloseHandle(hFile); Data->Add(fi); continue; next: if (hFile!=INVALID_HANDLE_VALUE) CloseHandle(hFile); if (fi) delete fi; } if (Data->Count>0) { DrawGrid->RowCount = ((Data->Count -1)/DrawGrid->ColCount)+1; } else { DrawGrid->RowCount = 0; } DrawGrid->Repaint(); } } //--------------------------------------------------------------------------- void __fastcall TAPTableForm::ExitData() { TFileInfor *fi; if (Data) { while (Data->Count>0) { fi = (TFileInfor *)Data->Last(); Data->Remove(fi); delete fi; } } } //--------------------------------------------------------------------------- void __fastcall TAPTableForm::DrawGridDrawCell(TObject *Sender, int Col, int Row, TRect &Rect, TGridDrawState State) { int n; TFileInfor *fi; TRect r; APTableView = true; //2001.3.28 lhskys a,s È®´ë Ãà¼Ò¸¦ À§Çؼ­... n = Row * DrawGrid->ColCount + Col; if (n < Data->Count) { fi = (TFileInfor *) Data->Items[n]; if (Col == DrawGrid->Col && Row==DrawGrid->Row) FileName = fi->Name; StretchBlt(DrawGrid->Canvas->Handle,Rect.Left+10,Rect.Top+5,80,100, fi->Bitmap->Canvas->Handle,0,0,int(80/((StrToInt(txtZoom->Text)+2)/3.0)), int(100/((StrToInt(txtZoom->Text)+2)/3.0)),SRCCOPY); r.Left = Rect.Left+5; r.Top = Rect.Top+110; r.Right = Rect.Left+85; r.Bottom = Rect.Top + 110 + DrawGrid->Canvas->TextHeight(fi->Name); DrawGrid->Canvas->TextRect(r, Rect.Left+5, Rect.Top+110, fi->Name); } } //--------------------------------------------------------------------------- void __fastcall TAPTableForm::sbFunctionClick(TObject *Sender) { TSpeedButton *sb = (TSpeedButton *) Sender; Item = sb->Tag; sbsave->Enabled = false; switch (Item) { case 1: sbsave->Enabled = true; } if(sb->Tag ==1 || sb->Tag == 4) Edit1->SetFocus(); } //--------------------------------------------------------------------------- void __fastcall TAPTableForm::DrawGridDblClick(TObject *Sender) { int n = DrawGrid->ColCount * DrawGrid->Row + DrawGrid->Col; if (n >= FileListBox->Items->Count) return; AnsiString fn = FileListBox->Items->Strings[n]; if (MainImageForm->iMainImage->uBitmap->BitsPerPixel == 8) { switch (Item) { case 2: SaveToAPTFile(fn); FileListBox->Update(); InitData(); DrawGrid->Repaint(); break; case 3: Delete_File(fn); break; case 4: if (RenameFile(fn, PasteExtension(Edit1->Text)) == false) EXCEPTION_MESSAGE_OK(EC_FILE_EXIST_ALREADY); FileListBox->Update(); InitData(); DrawGrid->Repaint(); break; } }else { fn = DirectoryListBox->Directory + "\\" + fn; APMenuForm->InsertImage(fn); Close(); } } //--------------------------------------------------------------------------- void __fastcall TAPTableForm::Delete_File(AnsiString fn) { SHFILEOPSTRUCT shfile; AnsiString asFrom; char *ucFrom = NULL, *ch = NULL, *ph; memset(&shfile, 0, sizeof(SHFILEOPSTRUCT)); shfile.hwnd = Handle; shfile.wFunc = FO_DELETE; int len = DirectoryListBox->Directory.Length(); if ((ch = (char *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len + 2)) == NULL) goto fail; strcpy(ch, DirectoryListBox->Directory.c_str()); ph = ch + (len-1); if (*ph == '\\') asFrom = DirectoryListBox->Directory+fn; else asFrom = DirectoryListBox->Directory+"\\"+fn; if ((ucFrom = (char *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, asFrom.Length()+2)) == NULL) goto fail; strcpy(ucFrom, asFrom.c_str()); shfile.pFrom = ucFrom; shfile.fFlags = FOF_ALLOWUNDO ; SHFileOperation(&shfile); HeapFree(GetProcessHeap(), 0, ucFrom); HeapFree(GetProcessHeap(), 0, ch); FileListBox->Update(); InitData(); DrawGrid->Repaint(); return; fail: if (ch) HeapFree(GetProcessHeap(), 0, ch); } //--------------------------------------------------------------------------- void __fastcall TAPTableForm::sbExitClick(TObject *Sender) { APTableView = false; Close(); APMenuForm->sbView->Enabled = true; } //--------------------------------------------------------------------------- void __fastcall TAPTableForm::Edit1KeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { AnsiString fn, cmfn, cmfn2; bool same = false; if (Key == 13) { switch (Item) { case 1: fn = PasteExtension(Edit1->Text); for (int i = 0; i < FileListBox->Items->Count; i++) { cmfn = FileListBox->Items->Strings[i].LowerCase(); cmfn2 = fn.LowerCase(); if (cmfn == cmfn2) { int btn = EXCEPTION_MESSAGE2_OKCANCEL(EC_FILE_EXIST_ALREADY, (IDS_MESSAGE_REALLYFILESAVE).c_str()); if (btn == mrOk) SaveToAPTFile(fn); same = true; break; } } if (same == false) SaveToAPTFile(fn); break; } FileListBox->Update(); InitData(); DrawGrid->Repaint(); } } //--------------------------------------------------------------------------- AnsiString __fastcall TAPTableForm::PasteExtension(AnsiString FileName) { char *s; AnsiString fn; int FileNameLength, last1, last2, last3, last4; char FileIndex1, FileIndex2, FileIndex3, FileIndex4; //=============================================================== FileNameLength = FileName.Length(); if(FileNameLength > 4){ last1 = FileNameLength-3; last2 = FileNameLength-2; last3 = FileNameLength-1; last4 = FileNameLength; FileIndex1 = '.'; FileIndex2 = 'a'; FileIndex3 = 'p'; FileIndex4 = 't'; if((FileIndex1 == FileName[last1])&&(FileIndex2 == FileName[last2]) && (FileIndex3 == FileName[last3])&&(FileIndex4 == FileName[last4])){ s = "PASS"; }else s=NULL; }else s=NULL; //=============================================================== // s = AnsiStrScan(FileName.c_str(), '.'); if (s==NULL) fn = FileName + ".apt"; else fn = FileName; return fn; } //--------------------------------------------------------------------- void __fastcall TAPTableForm::SaveToAPTFile(AnsiString fn) { TEXPIAFILEHEADER tpfh; TRect src; RGBQUAD rgb[256]; TTexpiaBitmap *tag = NULL, *tb = NULL; TPException ec = EC_NONE; TPItemImage *Image = MainImageForm->iMainImage; HANDLE hFile = INVALID_HANDLE_VALUE; if ((hFile = CreateFile(fn.c_str(),GENERIC_WRITE, 0, NULL, OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE) { ec = EC_FILE_NOT_CREATE; goto fail; } tpfh.Version = TexVersion('P', 'T', 230); tpfh.CanvasInfor = MainImageForm->CanvasInfor; tpfh.BitsPerPixel = 8; tpfh.Compress = cmZLib; if(MainImageForm->WorkArea->Mask) src = MainImageForm->WorkArea->Range; else { src.Left = 0; src.Right = MainImageForm->iMainImage->uBitmap->Width; src.Top = 0; src.Bottom = MainImageForm->iMainImage->uBitmap->Height; } tpfh.CanvasInfor.DotsPerInch = tpfh.CanvasInfor.DotsPerInch; tpfh.CanvasInfor.SetSize(cstFree, src.Right-src.Left, src.Bottom-src.Top); if ((tb = new TTexpiaBitmap)==NULL) { ec = EC_MEMORY_LACK; goto fail; } if (Image->uBitmap->BitsPerPixel == 8) { Image->uBitmap->GetColors(0, 256, rgb); tb->Create(Image->uBitmap->Width, Image->uBitmap->Height, 8, rgb); } else { tb->Create(Image->uBitmap->Width, Image->uBitmap->Height, Image->uBitmap->BitsPerPixel); } if ((tag = new TTexpiaBitmap)==NULL) { ec = EC_MEMORY_LACK; goto fail; } APMakeTexpiaTag(tag, Image->uBitmap, src); Image->uBitmap->CopyToTexpia(tb, 0, 0, tb->Width, tb->Height, 0, 0, SRCCOPY); if (MainImageForm->WorkArea && MainImageForm->WorkArea->Mask) { if (!SaveToTexpiaFile(hFile, MainImageForm->Palette, tpfh, tag, tb, &MainImageForm->WorkArea->Range)) { ec = EC_FILE_NOT_WRITE; goto fail; } } else { if (!SaveToTexpiaFile(hFile, MainImageForm->Palette, tpfh, tag, tb)) { ec = EC_FILE_NOT_WRITE; goto fail; } } CloseHandle(hFile); delete tag; delete tb; return; fail: if (tb) delete tb; if (tag) delete tag; if (hFile != INVALID_HANDLE_VALUE) CloseHandle(hFile); EXCEPTION_MESSAGE_OK(ec); } //--------------------------------------------------------------------------- void __fastcall TAPTableForm::Edit1DblClick(TObject *Sender) { Edit1->SelectAll(); Edit1->SetFocus(); } //--------------------------------------------------------------------------- void __fastcall TAPTableForm::Edit1Click(TObject *Sender) { Edit1->SetFocus(); } //--------------------------------------------------------------------------- void __fastcall TAPTableForm::DirectoryListBoxChange(TObject *Sender) { InitData(); DrawGrid->Repaint(); } //--------------------------------------------------------------------------- void __fastcall TAPTableForm::APMakeTexpiaTag(TTexpiaBitmap *tag, TUnionBitmap *tb, TRect src) // convert by celberus { TCanvas *cv = NULL; double rx, ry; double lastx,lasty; int i,w, h, x, y, hh, ww, mw, mh, rtn; // HDC dcSrc = NULL; Byte *srcp, *srcpp, *dstp; TPException ec = EC_NONE; RGBQUAD rgb[256]; Byte *DP, *SP; if (tb->BitsPerPixel==8) { if (!(tag->Create(80, 100, 8, rgb))) {ec = EC_MEMORY_LACK; goto fail;} tb->GetColors(0, 256, rgb); tag->PutColors(0, 256, rgb); } else { if (!(tag->Create(80, 100, 24))) {ec = EC_MEMORY_LACK; goto fail;} } if ((cv = tag->CreateCanvas())==NULL) { ec = EC_RESOURCE_LACK; goto fail; } cv->Brush->Color = clWhite; cv->FillRect(Rect(0, 0, 80, 100)); rx = 80.0/(src.Right-src.Left); ry = 100.0/(src.Bottom-src.Top); // if ((dcSrc = tb->CreateDC())==NULL) { ec = EC_RESOURCE_LACK; goto fail; } SetStretchBltMode(cv->Handle, COLORONCOLOR); if (rx>ry) { w = (src.Right-src.Left)*ry; h = (src.Bottom-src.Top)*ry; ww = 80 / w; mw = 80 % w; lastx = double(mw) / double(w); for(i = 0; i < ww ; i++){ // rtn = StretchBlt(cv->Handle, i*w, 0, w, h, dcSrc, src.Left, src.Top, // src.Right-src.Left, src.Bottom-src.Top, SRCCOPY); rtn = tb->UnionStretchBlt(cv->Handle, i*w, 0, w, h, src.Left, src.Top, src.Right-src.Left, src.Bottom-src.Top, SRCCOPY); // convert by celberus } // rtn = StretchBlt(cv->Handle, i*w, 0, int(w*lastx), h, dcSrc, src.Left, src.Top, // int((src.Right-src.Left)*lastx), src.Bottom-src.Top, SRCCOPY); rtn = tb->UnionStretchBlt(cv->Handle, i*w, 0, int(w*lastx), h, src.Left, src.Top, int((src.Right-src.Left)*lastx), src.Bottom-src.Top, SRCCOPY); // convert by celberus } else { w = (src.Right-src.Left)*rx; h = (src.Bottom-src.Top)*rx; hh = 100 / h; mh = 100 % h; lasty = double(mh) / double(h); for(i = 0; i < hh ; i++) { // rtn = StretchBlt(cv->Handle,0,i*h,w,h ,dcSrc,src.Left,src.Top, // src.Right-src.Left, src.Bottom-src.Top, SRCCOPY); rtn = tb->UnionStretchBlt(cv->Handle,0,i*h,w,h , src.Left,src.Top, src.Right-src.Left, src.Bottom-src.Top, SRCCOPY); // convert by celberus } // rtn = StretchBlt(cv->Handle,0,i*h,w,int(h*lasty),dcSrc,src.Left, src.Top, // src.Right-src.Left,int((src.Bottom-src.Top)*lasty),SRCCOPY); rtn = tb->UnionStretchBlt(cv->Handle,0,i*h,w,int(h*lasty),src.Left, src.Top, src.Right-src.Left,int((src.Bottom-src.Top)*lasty),SRCCOPY); // convert by celberus } // tb->DeleteDC(dcSrc); dcSrc = NULL; tag->DeleteCanvas(cv); cv = NULL; if (!rtn) { tb->StartScanLine(); tag->StartScanLine(); if (tb->BitsPerPixel==8) { for (y=0; yGetScanLine(y*ry); dstp = tag->GetScanLine(y); for (x=0; xPutScanLine(y); } } else { for (y=0; yGetScanLine(y/ry); dstp = tag->GetScanLine(y); for (x=0; xPutScanLine(y); } } tb->StopScanLine(); tag->StopScanLine(); } return; fail : // if (dcSrc) tb->DeleteDC(dcSrc); if (cv) tag->DeleteCanvas(cv); EXCEPTION_MESSAGE_OK(ec); } //--------------------------------------------------------------------------- void __fastcall TAPTableForm::sbZoomClick(TObject *Sender) { int i; i = StrToInt(txtZoom->Text); i++; txtZoom->Text = IntToStr(i); } //--------------------------------------------------------------------------- void __fastcall TAPTableForm::txtZoomChange(TObject *Sender) { DrawGrid->Repaint(); } //--------------------------------------------------------------------------- void __fastcall TAPTableForm::sbZoomOutClick(TObject *Sender) { int i; i = StrToInt(txtZoom->Text); if(i <2) i =1; else i--; txtZoom->Text = IntToStr(i); } //--------------------------------------------------------------------------- void __fastcall TAPTableForm::FormClose(TObject *Sender, TCloseAction &Action) { APTableView = false; } //--------------------------------------------------------------------------- void __fastcall TAPTableForm::sbsaveClick(TObject *Sender) { AnsiString fn, cmfn, cmfn2; bool same = false; switch (Item) { case 1: fn = PasteExtension(Edit1->Text); for (int i = 0; i < FileListBox->Items->Count; i++) { cmfn = FileListBox->Items->Strings[i].LowerCase(); cmfn2 = fn.LowerCase(); if (cmfn == cmfn2) { int btn = EXCEPTION_MESSAGE2_OKCANCEL(EC_FILE_EXIST_ALREADY, (IDS_MESSAGE_REALLYFILESAVE).c_str()); if (btn == mrOk) SaveToAPTFile(fn); same = true; break; } } if (same == false) SaveToAPTFile(fn); break; } FileListBox->Update(); InitData(); DrawGrid->Repaint(); } //---------------------------------------------------------------------------