mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-02-13 03:33:48 +00:00
793 lines
28 KiB
C++
793 lines
28 KiB
C++
//---------------------------------------------------------------------------
|
|
#include <vcl.h>
|
|
#include <stdlib.h>
|
|
#include <dir.h>
|
|
#pragma hdrstop
|
|
//---------------------------------------------------------------------------
|
|
#pragma package(smart_init)
|
|
#pragma resource "*.dfm"
|
|
#include "Main.h"
|
|
TMainForm *MainForm;
|
|
//---------------------------------------------------------------------------
|
|
#include "About.h"
|
|
#include "Help.h"
|
|
|
|
# define PAGE_CHUNKS 1
|
|
# define PAGE_REPORT 2
|
|
# define PAGE_OPTIONS 3
|
|
# define PAGE_ABOUT 4
|
|
# define PAGE_HELP 5
|
|
|
|
/* ************************************************************************** */
|
|
/* * * */
|
|
/* * MngDump is based on Gerard Juyn's MngTree * */
|
|
/* * * */
|
|
/* * COPYRIGHT NOTICE: * */
|
|
/* * * */
|
|
/* * Copyright (c) 2000 Andy Protano * */
|
|
/* * Gerard Juyn (gerard@libmng.com) * */
|
|
/* * [You may insert additional notices after this sentence if you modify * */
|
|
/* * this source] * */
|
|
/* * * */
|
|
/* * For the purposes of this copyright and license, "Contributing Authors" * */
|
|
/* * is defined as the following set of individuals: * */
|
|
/* * * */
|
|
/* * Gerard Juyn (gerard@libmng.com) * */
|
|
/* * Andy Protano (a.a.protano@care4free.net) * */
|
|
/* * * */
|
|
/* * This program is supplied "AS IS". The Contributing Authors * */
|
|
/* * disclaim all warranties, expressed or implied, including, without * */
|
|
/* * limitation, the warranties of merchantability and of fitness for any * */
|
|
/* * purpose. The Contributing Authors assume no liability for direct, * */
|
|
/* * indirect, incidental, special, exemplary, or consequential damages, * */
|
|
/* * which may result from the use of the MNG Library, even if advised of * */
|
|
/* * the possibility of such damage. * */
|
|
/* * * */
|
|
/* * Permission is hereby granted to use, copy, modify, and distribute this * */
|
|
/* * source code, or portions hereof, for any purpose, without fee, subject * */
|
|
/* * to the following restrictions: * */
|
|
/* * * */
|
|
/* * 1. The origin of this source code must not be misrepresented; * */
|
|
/* * you must not claim that you wrote the original software. * */
|
|
/* * * */
|
|
/* * 2. Altered versions must be plainly marked as such and must not be * */
|
|
/* * misrepresented as being the original source. * */
|
|
/* * * */
|
|
/* * 3. This Copyright notice may not be removed or altered from any source * */
|
|
/* * or altered source distribution. * */
|
|
/* * * */
|
|
/* * The Contributing Authors specifically permit, without fee, and * */
|
|
/* * encourage the use of this source code as a component to supporting * */
|
|
/* * the MNG and JNG file format in commercial products. If you use this * */
|
|
/* * source code in a product, acknowledgment would be highly appreciated. * */
|
|
/* * * */
|
|
/* ************************************************************************** */
|
|
|
|
//---------------------------------------------------------------------------
|
|
//---------------------------------------------------------------------------
|
|
__fastcall TMainForm::TMainForm(TComponent* Owner)
|
|
: TForm(Owner)
|
|
{
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
__fastcall TMainForm::~TMainForm( void )
|
|
{
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
void __fastcall TMainForm::OnMinMax(TMessage& Msg)
|
|
{
|
|
((POINT far *)Msg.LParam)[3].x = 500;
|
|
((POINT far *)Msg.LParam)[3].y = 450;
|
|
|
|
TForm::Dispatch(&Msg);
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
// MessageBox Methods
|
|
// ----------------------------------------------------------------------
|
|
int __fastcall TMainForm::MessageBox( String &as, UINT flags )
|
|
{
|
|
return ::MessageBox( Handle, as.c_str(), Application->Title.c_str(), flags );
|
|
}
|
|
// ----------------------------------------------------------------------
|
|
void __fastcall TMainForm::MsgBoxOk( String as )
|
|
{
|
|
(void)MessageBox( as, MB_ICONINFORMATION );
|
|
}
|
|
//-------------------------------------------------------------------------
|
|
int __fastcall TMainForm::MsgBoxYN( String as )
|
|
{
|
|
return MessageBox( as, MB_YESNO + MB_ICONQUESTION + MB_DEFBUTTON1 );
|
|
}
|
|
//-------------------------------------------------------------------------
|
|
int __fastcall TMainForm::MsgBoxYNC( String as )
|
|
{
|
|
return MessageBox( as, MB_YESNOCANCEL | MB_ICONQUESTION );
|
|
}
|
|
//-------------------------------------------------------------------------
|
|
void __fastcall TMainForm::MsgBoxStop( String as )
|
|
{
|
|
(void)MessageBox( as, MB_ICONSTOP );
|
|
}
|
|
//-------------------------------------------------------------------------
|
|
void __fastcall TMainForm::MsgBoxInfo( String as )
|
|
{
|
|
(void)MessageBox( as, MB_OK | MB_ICONINFORMATION );
|
|
}
|
|
//-------------------------------------------------------------------------
|
|
void __fastcall TMainForm::MsgBoxWarn( String as )
|
|
{
|
|
(void)MessageBox( as, MB_OK | MB_ICONWARNING );
|
|
}
|
|
//-------------------------------------------------------------------------
|
|
void __fastcall TMainForm::FormCreate(TObject *Sender)
|
|
{
|
|
// For when the application name changes - coz i'll forget !
|
|
asAppName = Application->Title;
|
|
// And while we've got it set the caption
|
|
Caption = Application->Title;
|
|
|
|
// Load About Screen
|
|
LabelAbout->Caption = _szAbout;
|
|
// Load Help Screen
|
|
LabelHelp->Caption = _szHelp;
|
|
|
|
fd = NULL;
|
|
strList = new TStringList();
|
|
|
|
asTab = " ";// default tab size 2
|
|
RadioGroupTabSize->ItemIndex = 1; // range is zero based
|
|
|
|
// Start with the help pane
|
|
PageControl1->ActivePage = tsHelp;
|
|
|
|
mnuWordWrap->Checked = false;
|
|
// This call will TOGGLE and set word wrap for all the applicables
|
|
// editors and enable/disable the Horz scroll bar.
|
|
mnuWordWrapClick( this ); // So start with false to get to true;
|
|
|
|
// Clear things from design time settings
|
|
StaticTextStatus->Caption = "";
|
|
//strList->Clear(); constructor dodid that
|
|
pnlChunks->Caption = "";
|
|
ListBoxChunks->Clear();
|
|
RichEditChunks->Clear();
|
|
RichEditReport->Clear();
|
|
ProgressBar1->Min = 0;
|
|
ProgressBar1->Position = 0;
|
|
SetChunkCount( 0 );
|
|
|
|
// Set default states for switches
|
|
cbPaletteEntries->Checked = false;
|
|
cbRGBOrder->Checked = true;
|
|
cbRawData->Checked = true;
|
|
cbComments->Checked = true;
|
|
cbMacroIdentifier->Checked = true;
|
|
cbBool->Checked = true;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
void __fastcall TMainForm::FormDestroy(TObject *Sender)
|
|
{
|
|
delete strList;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
void __fastcall TMainForm::mnuExitClick(TObject *Sender)
|
|
{
|
|
Close();
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
void __fastcall TMainForm::mnuFileOpenClick(TObject *Sender)
|
|
{
|
|
if( !OpenDialog1->Execute() )
|
|
return;
|
|
|
|
Application->ProcessMessages(); // Refresh the screen
|
|
LoadFile();
|
|
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
void __fastcall TMainForm::mnuReloadClick(TObject *Sender)
|
|
{
|
|
// Only reload - if we have something to reload
|
|
if( OpenDialog1->FileName.Length() )
|
|
LoadFile();
|
|
else
|
|
MsgBoxStop( "Nothing to reload yet !" );
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
void __fastcall TMainForm::mnuUndoClick(TObject *Sender)
|
|
{
|
|
if( RichEditReport->Lines->Count ) // Do we have something in there ?
|
|
RichEditReport->Undo();
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
void __fastcall TMainForm::mnuCutClick(TObject *Sender)
|
|
{
|
|
if( RichEditReport->Lines->Count ) // Do we have something in there ?
|
|
RichEditReport->CutToClipboard();
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
void __fastcall TMainForm::mnuCopyClick(TObject *Sender)
|
|
{
|
|
if( RichEditReport->Lines->Count ) // Do we have something in there ?
|
|
RichEditReport->CopyToClipboard();
|
|
}
|
|
//-------------------------------------------------------------------------
|
|
void __fastcall TMainForm::sbtnCopyChunkClick(TObject *Sender)
|
|
{
|
|
if( RichEditChunks->Lines->Count ) // Do we have something in there ?
|
|
{
|
|
// Copy chunk data from Chunks pane to clipboard
|
|
RichEditChunks->SelectAll();
|
|
RichEditChunks->CopyToClipboard();
|
|
RichEditChunks->SelLength = 0;
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
void __fastcall TMainForm::mnuPasteClick(TObject *Sender)
|
|
{
|
|
if( RichEditReport->Lines->Count ) // Do we have something in there ?
|
|
RichEditReport->PasteFromClipboard();
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
void __fastcall TMainForm::mnuSelectAllClick(TObject *Sender)
|
|
{
|
|
if( RichEditReport->Lines->Count ) // Do we have something in there ?
|
|
RichEditReport->SelectAll();
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
void __fastcall TMainForm::mnuWordWrapClick(TObject *Sender)
|
|
{
|
|
bool bWrap;
|
|
|
|
mnuWordWrap->Checked = !mnuWordWrap->Checked;
|
|
bWrap = mnuWordWrap->Checked;
|
|
|
|
RichEditChunks->WordWrap = bWrap;
|
|
RichEditReport->WordWrap = bWrap;
|
|
|
|
if( bWrap ) { // if Word wrap on then no need for horizontal scrollbar
|
|
RichEditChunks->ScrollBars = ssVertical;
|
|
RichEditReport->ScrollBars = ssVertical;
|
|
} else { // Horizontal scrollbar required (auto)
|
|
RichEditChunks->ScrollBars = ssBoth;
|
|
RichEditReport->ScrollBars = ssBoth;
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
void __fastcall TMainForm::mnuSetFontClick(TObject *Sender)
|
|
{
|
|
if( FontDialog1->Execute() )
|
|
{
|
|
RichEditChunks->Font = FontDialog1->Font;
|
|
RichEditReport->Font = FontDialog1->Font;
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
void __fastcall TMainForm::FontDialog1Apply(TObject *Sender, HWND Wnd)
|
|
{
|
|
RichEditChunks->Font = FontDialog1->Font;
|
|
RichEditReport->Font = FontDialog1->Font;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
void __fastcall TMainForm::mnuFindClick(TObject *Sender)
|
|
{
|
|
if( RichEditReport->Lines->Count == 0 )
|
|
{
|
|
MsgBoxStop( "Find what ?.");
|
|
return;
|
|
}
|
|
|
|
FindDialog->Execute();
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
void __fastcall TMainForm::FindDialogFind(TObject *Sender)
|
|
{
|
|
TSearchTypes st;
|
|
TFindDialog *fd;
|
|
int newpos;
|
|
|
|
if( RichEditReport->Lines->Count == 0 )
|
|
{
|
|
MsgBoxStop( "Find what ?.");
|
|
return;
|
|
}
|
|
|
|
fd = dynamic_cast<TFindDialog *>( Sender );
|
|
|
|
if( fd->Options.Contains( frMatchCase ) )
|
|
st << stMatchCase;
|
|
if( fd->Options.Contains( frWholeWord ) )
|
|
st << stWholeWord;
|
|
|
|
if( RichEditReport->SelLength )
|
|
RichEditReport->SelStart += 1;
|
|
|
|
newpos = RichEditReport->FindText( fd->FindText,
|
|
RichEditReport->SelStart, RichEditReport->Text.Length(), st );
|
|
|
|
if( newpos != -1 ) {
|
|
RichEditReport->SelStart = newpos;
|
|
RichEditReport->SelLength = fd->FindText.Length();
|
|
} else {
|
|
MsgBoxInfo( "End of document reached." );
|
|
RichEditReport->SelStart = 0;
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
void __fastcall TMainForm::mnuFindNextClick(TObject *Sender)
|
|
{
|
|
if( RichEditReport->Lines->Count == 0 )
|
|
{
|
|
MsgBoxStop( "Find what ?.");
|
|
return;
|
|
}
|
|
|
|
FindDialogFind( FindDialog );
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
void __fastcall TMainForm::mnuPrintClick(TObject *Sender)
|
|
{
|
|
if( RichEditReport->Lines->Count == 0 )
|
|
{
|
|
MsgBoxStop( "I can't find anything to print !.");
|
|
return;
|
|
}
|
|
|
|
RichEditReport->Print( ExtractFileName( OpenDialog1->FileName ) );
|
|
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
void __fastcall TMainForm::mnuPrintSetupClick(TObject *Sender)
|
|
{
|
|
PrinterSetupDialog->Execute();
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
void __fastcall TMainForm::mnuSaveClick(TObject *Sender)
|
|
{
|
|
if( RichEditReport->Lines->Count == 0 )
|
|
{
|
|
MsgBoxStop( "I can't find anything to save !.");
|
|
return;
|
|
}
|
|
|
|
// Grab the graphic's filename and change to "txt" extension
|
|
{
|
|
char szFile[ MAXFILE ];
|
|
char szExt[ MAXEXT ];
|
|
char szDest[ MAXPATH ];
|
|
String as;
|
|
|
|
fnsplit( OpenDialog1->FileName.c_str(), NULL, NULL, szFile, szExt );
|
|
|
|
memset( szDest, 0, MAXPATH );
|
|
strcat( szDest, szFile );
|
|
strcat( szDest, "\." );
|
|
strcat( szDest, "txt" );
|
|
as = szDest;
|
|
|
|
// Initially create a text file of the same name as the graphic
|
|
// but with "txt" extension
|
|
SaveDialog1->FileName = as;
|
|
}
|
|
|
|
if( !SaveDialog1->Execute() )
|
|
return; // Given up hey ?
|
|
|
|
RichEditReport->Lines->SaveToFile( SaveDialog1->FileName );
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
//---------------------------------------------------------------------------
|
|
//---------------------------------------------------------------------------
|
|
void __fastcall TMainForm::LoadFile( void )
|
|
{
|
|
int bStatus;
|
|
|
|
// Can we open the file ?
|
|
if( (fd = fopen( OpenDialog1->FileName.c_str(), "rb") ) == NULL )
|
|
{
|
|
MsgBoxStop( "Cannot open input file\n\n" + OpenDialog1->FileName );
|
|
return;
|
|
}
|
|
|
|
pnlChunks->Caption = "";
|
|
strList->Clear();
|
|
ListBoxChunks->Clear();
|
|
RichEditChunks->Clear();
|
|
RichEditReport->Clear();
|
|
|
|
ProgressBar1->Min = 0;
|
|
ProgressBar1->Position = 0;
|
|
SetChunkCount( 0 );
|
|
|
|
RichEditReport->Lines->Add( "" );
|
|
RichEditReport->Lines->Add( "Chunk contents of file :" );
|
|
RichEditReport->Lines->Add( OpenDialog1->FileName );
|
|
RichEditReport->Lines->Add( "" );
|
|
|
|
// Make report pane visible - prove we are working and not locked up
|
|
PageControl1->ActivePage = tsReport;
|
|
|
|
try {
|
|
StaticTextStatus->Caption = "Working ... please wait";
|
|
StaticTextStatus->Update();
|
|
bStatus = DumpTree(); // true indicates success
|
|
}
|
|
__finally {
|
|
ProgressBar1->Position = 0;
|
|
StaticTextStatus->Caption = "Ok";
|
|
fclose( fd );
|
|
fd = NULL;
|
|
}
|
|
|
|
if( !bStatus ) // We have an error
|
|
{
|
|
pnlChunks->Caption = "";
|
|
strList->Clear();
|
|
ListBoxChunks->Clear();
|
|
RichEditChunks->Clear();
|
|
|
|
RichEditReport->Lines->Add("");
|
|
RichEditReport->Lines->Add("An error occurred while reading the file.");
|
|
|
|
} else { // Read file and chunks without any problems
|
|
|
|
// Set Report Panels caption
|
|
pnlChunks->Caption = "Chunk 1 of " + String( ListBoxChunks->Items->Count );
|
|
|
|
// Set Listbox to first item
|
|
ListBoxChunks->ItemIndex = 0;
|
|
|
|
// Put gleeful message in report pane
|
|
RichEditChunks->Lines->Add( "" );
|
|
RichEditChunks->Lines->Add(
|
|
"No error's found when reading file ... " );
|
|
RichEditChunks->Lines->Add(
|
|
"Click the list box to display the data for each chunk.");
|
|
|
|
// Place cursor at top of editor
|
|
RichEditChunks->SelStart = 0;
|
|
RichEditChunks->SelLength = 0;
|
|
|
|
// Place cursor at top of editor
|
|
RichEditReport->SelStart = 0;
|
|
RichEditReport->SelLength = 0;
|
|
|
|
// Lock richedits - so an immediate undo does not make data vanish !
|
|
RichEditReport->Modified = false;
|
|
// @ap@ Borland should fix this ! (it don't work)
|
|
}
|
|
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
bool __fastcall TMainForm::DumpTree( void )
|
|
{
|
|
mng_handle hMNG;
|
|
|
|
// let's initialize the library
|
|
hMNG = mng_initialize( (mng_ptr)this, Alloc, Free, NULL );
|
|
|
|
if( !hMNG ) // did that work out ?
|
|
{
|
|
MNGError( hMNG, "Cannot initialize libmng." );
|
|
mng_cleanup( &hMNG ); // Always cleanup the library
|
|
MsgBoxStop( "Bye!" );
|
|
Application->Terminate(); // Exit now
|
|
}
|
|
|
|
// setup callbacks
|
|
if( (mng_setcb_openstream ( hMNG, OpenStream ) != 0) ||
|
|
(mng_setcb_closestream ( hMNG, CloseStream ) != 0) ||
|
|
(mng_setcb_processheader( hMNG,ProcessHeader ) != 0) ||
|
|
(mng_setcb_readdata ( hMNG, FileReadData ) != 0)
|
|
)
|
|
{
|
|
MNGError( hMNG, "Cannot set callbacks for libmng.");
|
|
mng_cleanup( &hMNG ); // Always cleanup the library
|
|
MsgBoxStop( "Bye!" );
|
|
Application->Terminate(); // Exit now
|
|
}
|
|
else
|
|
{
|
|
// read the file into memory
|
|
if( mng_read( hMNG ) != 0 )
|
|
{
|
|
// Because we read the whole file in first,
|
|
// here is where bad input files first choke !
|
|
MNGError( hMNG, "Cannot read the file." );
|
|
mng_cleanup( &hMNG ); // Always cleanup the library
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
// run through the chunk list
|
|
if( mng_iterate_chunks( hMNG, 0, IterateChunks ) != 0 )
|
|
{
|
|
MNGError( hMNG, "Error Getting Chunk info!" );
|
|
mng_cleanup( &hMNG ); // Always cleanup the library
|
|
return false; // Errors may occur with bad chunk data
|
|
}
|
|
}
|
|
}
|
|
|
|
mng_cleanup( &hMNG ); // Always cleanup the library
|
|
|
|
return true;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
void __fastcall TMainForm::MNGError( mng_handle hMNG, String SHMsg )
|
|
{
|
|
// get extended info
|
|
mng_uint32 iErrorcode;
|
|
mng_uint8 iSeverity;
|
|
mng_chunkid iChunkname;
|
|
mng_uint32 iChunkseq;
|
|
mng_int32 iExtra1;
|
|
mng_int32 iExtra2;
|
|
mng_pchar zErrortext;
|
|
char szFormatStr[ 256 ];
|
|
|
|
iErrorcode = mng_getlasterror( hMNG, &iSeverity, &iChunkname,
|
|
&iChunkseq, &iExtra1, &iExtra2,
|
|
&zErrortext);
|
|
|
|
wsprintf( szFormatStr,
|
|
"Error = %d; Severity = %d; Chunknr = %d; Extra1 = %d",
|
|
(int)iErrorcode, (int)iSeverity, (int)iChunkseq, (int)iExtra1
|
|
);
|
|
|
|
MsgBoxStop( SHMsg + "\n\n" + String( zErrortext ) + "\n\n" + String( szFormatStr ) );
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
void __fastcall TMainForm::ListBoxChunksClick(TObject *Sender)
|
|
{
|
|
// When the Chunks listbox is clicked ...
|
|
// display strings from strlist in the RichEditChunks window.
|
|
int iIndex = ListBoxChunks->ItemIndex;
|
|
|
|
if( !ListBoxChunks->Items->Count )
|
|
return;
|
|
|
|
// Update panel to reflect the selection : "Chunk N of NChunks"
|
|
pnlChunks->Caption = "Chunk " + String( iIndex + 1) +
|
|
" of " + String( ListBoxChunks->Items->Count );
|
|
|
|
// Reset Chunks windows ...
|
|
RichEditChunks->Clear();
|
|
RichEditChunks->Lines->Add( "" );
|
|
// ... Chunks header string : "Chunk N : XXXX" (XXXX == Chunk name)
|
|
RichEditChunks->Lines->Add( "Chunk " + String( iIndex + 1 ) + " : " +
|
|
ListBoxChunks->Items->Strings[ iIndex ] );
|
|
// ... Seperator line
|
|
//RichEditChunks->Lines->Add("");
|
|
|
|
// ... add the data from the stringlist
|
|
{
|
|
String as = strList->Strings[ iIndex ] + 1;
|
|
String z;
|
|
int n =1;
|
|
do{
|
|
if( as[n] == '\n' )
|
|
{
|
|
RichEditChunks->Lines->Add( z );
|
|
z = "";
|
|
}
|
|
else
|
|
z = z + as[n];
|
|
n+=1;
|
|
} while( n < as.Length() );
|
|
RichEditChunks->Lines->Add( z );
|
|
}
|
|
|
|
// ... Seperator line
|
|
RichEditChunks->Lines->Add("");
|
|
|
|
// Place cursor at top of editor
|
|
RichEditChunks->SelStart = 0;
|
|
RichEditChunks->SelLength = 0;
|
|
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
void __fastcall TMainForm::EventShowPage(TObject *Sender)
|
|
{
|
|
|
|
switch( ((TTabSheet *)Sender)->Tag ) {
|
|
case PAGE_REPORT :
|
|
mnuPrint->Enabled = true;
|
|
mnuEdit->Enabled = true;
|
|
mnuUndo->Enabled = true;
|
|
mnuSave->Enabled = true;
|
|
sbtnSave->Enabled = true;
|
|
sbtnUndo->Enabled = true;
|
|
mnuCut->Enabled = true;
|
|
sbtnCut->Enabled = true;
|
|
mnuCopy->Enabled = true;
|
|
sbtnCopy->Enabled = true;
|
|
mnuPaste->Enabled = true;
|
|
sbtnPaste->Enabled = true;
|
|
mnuSearch->Enabled = true;
|
|
sbtnPrint->Enabled = true;
|
|
break;
|
|
//case PAGE_CHUNKS :
|
|
//case PAGE_OPTIONS :
|
|
///case PAGE_ABOUT :
|
|
//case PAGE_HELP :
|
|
default :
|
|
mnuPrint->Enabled = false;
|
|
mnuEdit->Enabled = false;
|
|
// no need to enable/disable menu commands as none will be available
|
|
mnuSave->Enabled = false;
|
|
sbtnSave->Enabled = false;
|
|
sbtnUndo->Enabled = false;
|
|
sbtnCut->Enabled = false;
|
|
sbtnCopy->Enabled = false;
|
|
sbtnPaste->Enabled = false;
|
|
mnuSearch->Enabled = false;
|
|
sbtnPrint->Enabled = false;
|
|
}
|
|
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
void __fastcall TMainForm::RadioGroupTabSizeClick(TObject *Sender)
|
|
{
|
|
switch( RadioGroupTabSize->ItemIndex ) {
|
|
case 0 : asTab = " "; break;
|
|
case 1 : asTab = " "; break;
|
|
case 2 : asTab = " "; break;
|
|
case 3 : asTab = " "; break;
|
|
case 4 : asTab = " "; break;
|
|
case 5 : asTab = " "; break;
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
String __fastcall TMainForm::PadInt( int iInt, int iWidth )
|
|
{
|
|
|
|
char szFmtStr[ 24 ];
|
|
char szInt[ 24 ]; // Should be wide enough !
|
|
String as;
|
|
wsprintf( szFmtStr,"%%%d\d\0",iWidth ); //"%[iWidth]d"
|
|
as = szFmtStr;
|
|
wsprintf( szInt, szFmtStr, iInt );
|
|
|
|
return String( szInt );
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
mng_bool __fastcall TMainForm::ShowChunk(
|
|
mng_handle hMNG, mng_handle hChunk, mng_chunkid iChunktype )
|
|
{
|
|
String asDataText;
|
|
|
|
// Fill asDataText with string data including newline's ...
|
|
// this is added to string list for each chunk
|
|
// and also added to the tail end of "Report"
|
|
|
|
// NOTE :
|
|
// Return True to continue processing.
|
|
// If mng_getchunk_xxxx fails just return false to the
|
|
// caller "(bool) myiterchunk" which inturn will then return false
|
|
// to "(mng_retcode) mng_iterate_chunks(...)" which will then
|
|
// give us the correct error code.
|
|
// In other words DON'T check for errors in "(bool) myiterchunk" !
|
|
|
|
switch( iChunktype ) {
|
|
case MNG_UINT_BACK :
|
|
if( !Info_BACK( hMNG, hChunk, asDataText ) ) return false; break;
|
|
case MNG_UINT_BASI :
|
|
if( !Info_BASI( hMNG, hChunk, asDataText ) ) return false; break;
|
|
case MNG_UINT_CLIP :
|
|
if( !Info_CLIP( hMNG, hChunk, asDataText ) ) return false; break;
|
|
case MNG_UINT_CLON :
|
|
if( !Info_CLON( hMNG, hChunk, asDataText ) ) return false; break;
|
|
case MNG_UINT_DBYK : // untested @ap@
|
|
if( !Info_DBYK( hMNG, hChunk, asDataText ) ) return false; break;
|
|
case MNG_UINT_DEFI :
|
|
if( !Info_DEFI( hMNG, hChunk, asDataText ) ) return false; break;
|
|
case MNG_UINT_DHDR :
|
|
if( !Info_DHDR( hMNG, hChunk, asDataText ) ) return false; break;
|
|
case MNG_UINT_DISC : // untested @ap@
|
|
if( !Info_DISC( hMNG, hChunk, asDataText ) ) return false; break;
|
|
case MNG_UINT_DROP : // untested @ap@
|
|
if( !Info_DROP( hMNG, hChunk, asDataText ) ) return false; break;
|
|
case MNG_UINT_ENDL :
|
|
if( !Info_ENDL( hMNG, hChunk, asDataText ) ) return false; break;
|
|
case MNG_UINT_FRAM :
|
|
if( !Info_FRAM( hMNG, hChunk, asDataText ) ) return false; break;
|
|
case MNG_UINT_IDAT :
|
|
if( !Info_IDAT( hMNG, hChunk, asDataText ) ) return false; break;
|
|
case MNG_UINT_IEND :
|
|
if( !Info_IEND( hMNG, hChunk, asDataText ) ) return false; break;
|
|
case MNG_UINT_IHDR :
|
|
if( !Info_IHDR( hMNG, hChunk, asDataText ) ) return false; break;
|
|
#define MNG_UINT_IJNG 0x494a4e47L // Function AWOL @ap@
|
|
#define MNG_UINT_IPNG 0x49504e47L // Function AWOL @ap@
|
|
case MNG_UINT_JDAT :
|
|
if( !Info_JDAT( hMNG, hChunk, asDataText ) ) return false; break;
|
|
case MNG_UINT_JHDR :
|
|
if( !Info_JHDR( hMNG, hChunk, asDataText ) ) return false; break;
|
|
#define MNG_UINT_JSEP 0x4a534550L // Function AWOL @ap@
|
|
case MNG_UINT_LOOP :
|
|
if( !Info_LOOP( hMNG, hChunk, asDataText ) ) return false; break;
|
|
#define MNG_UINT_MaGN 0x4d61474eL // which one "mng_getchunk_magn" ?
|
|
case MNG_UINT_MEND :
|
|
if( !Info_MEND( hMNG, hChunk, asDataText ) ) return false; break;
|
|
case MNG_UINT_MHDR :
|
|
if( !Info_MHDR( hMNG, hChunk, asDataText ) ) return false; break;
|
|
case MNG_UINT_MOVE :
|
|
if( !Info_MOVE( hMNG, hChunk, asDataText ) ) return false; break;
|
|
#define MNG_UINT_MaGN 0x4d61474eL // which one "mng_getchunk_magn" ?
|
|
case MNG_UINT_ORDR :
|
|
if( !Info_ORDR( hMNG, hChunk, asDataText ) ) return false; break;
|
|
case MNG_UINT_PAST :
|
|
if( !Info_PAST( hMNG, hChunk, asDataText ) ) return false; break;
|
|
case MNG_UINT_PLTE :
|
|
if( !Info_PLTE( hMNG, hChunk, asDataText ) ) return false; break;
|
|
case MNG_UINT_PPLT :
|
|
if( !Info_PPLT( hMNG, hChunk, asDataText ) ) return false; break;
|
|
case MNG_UINT_PROM :
|
|
if( !Info_PROM( hMNG, hChunk, asDataText ) ) return false; break;
|
|
case MNG_UINT_SAVE :
|
|
if( !Info_SAVE( hMNG, hChunk, asDataText ) ) return false; break;
|
|
case MNG_UINT_SEEK :
|
|
if( !Info_SEEK( hMNG, hChunk, asDataText ) ) return false; break;
|
|
case MNG_UINT_SHOW :
|
|
if( !Info_SHOW( hMNG, hChunk, asDataText ) ) return false; break;
|
|
case MNG_UINT_TERM :
|
|
if( !Info_TERM( hMNG, hChunk, asDataText ) ) return false; break;
|
|
case MNG_UINT_bKGD :
|
|
if( !Info_bKGD( hMNG, hChunk, asDataText ) ) return false; break;
|
|
case MNG_UINT_cHRM :
|
|
if( !Info_cHRM( hMNG, hChunk, asDataText ) ) return false; break;
|
|
case MNG_UINT_eXPI :
|
|
if( !Info_eXPI( hMNG, hChunk, asDataText ) ) return false; break;
|
|
case MNG_UINT_fPRI :
|
|
if( !Info_fPRI( hMNG, hChunk, asDataText ) ) return false; break;
|
|
case MNG_UINT_gAMA :
|
|
if( !Info_gAMA( hMNG, hChunk, asDataText ) ) return false; break;
|
|
case MNG_UINT_hIST :
|
|
if( !Info_hIST( hMNG, hChunk, asDataText ) ) return false; break;
|
|
case MNG_UINT_iCCP :
|
|
if( !Info_iCCP( hMNG, hChunk, asDataText ) ) return false; break;
|
|
case MNG_UINT_iTXt : // untested @ap@
|
|
if( !Info_iTXt( hMNG, hChunk, asDataText ) ) return false; break;
|
|
case MNG_UINT_nEED :
|
|
if( !Info_nEED( hMNG, hChunk, asDataText ) ) return false; break;
|
|
#define MNG_UINT_oFFs 0x6f464673L // Function AWOL @ap@
|
|
#define MNG_UINT_pCAL 0x7043414cL // Function AWOL @ap@
|
|
case MNG_UINT_pHYg : // untested @ap@
|
|
if( !Info_pHYg( hMNG, hChunk, asDataText ) ) return false; break;
|
|
case MNG_UINT_pHYs :
|
|
if( !Info_pHYs( hMNG, hChunk, asDataText ) ) return false; break;
|
|
case MNG_UINT_sBIT :
|
|
if( !Info_sBIT( hMNG, hChunk, asDataText ) ) return false; break;
|
|
#define MNG_UINT_sCAL 0x7343414cL // Function AWOL @ap@
|
|
case MNG_UINT_sPLT : // untested @ap@
|
|
if( !Info_sPLT( hMNG, hChunk, asDataText ) ) return false; break;
|
|
case MNG_UINT_sRGB :
|
|
if( !Info_sRGB( hMNG, hChunk, asDataText ) ) return false; break;
|
|
case MNG_UINT_tEXt :
|
|
if( !Info_tEXt( hMNG, hChunk, asDataText ) ) return false; break;
|
|
case MNG_UINT_tIME :
|
|
if( !Info_tIME( hMNG, hChunk, asDataText ) ) return false; break;
|
|
case MNG_UINT_tRNS :
|
|
if( !Info_tRNS( hMNG, hChunk, asDataText ) ) return false; break;
|
|
case MNG_UINT_zTXt :
|
|
if( !Info_zTXt( hMNG, hChunk, asDataText ) ) return false; break;
|
|
case MNG_UINT_HUH :
|
|
default : // this will catch unknown chunks - Huh !
|
|
if( !Info_Unknown( hMNG, hChunk, asDataText ) ) return false; break;
|
|
} // end of switch
|
|
//-------------------------------------------------
|
|
|
|
// Add this chunk's string to our string list
|
|
strList->Insert( GetChunkCount(), asDataText );
|
|
|
|
// Now's the time to bump chunk count
|
|
IncChunkCount();
|
|
|
|
// Add this chunk's string to the Report
|
|
MainForm->RichEditReport->Lines->Add( asDataText );
|
|
|
|
return true;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|