reman3/Rayman_X/cpa/Appli/WinS2B/main.cpp

235 lines
9.7 KiB
C++

//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
// FILE : Main.cpp
// AUTHOR : Catalin Cocos
//__________________________________________________________________________________________________
#include "stdinc.h"
#include "resource.h"
#include "app.h"
#include "list.h"
#include "Tree.h"
#include "Process.h"
//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
// DESC. : main
// AUTHOR : Catalin Cocos
//__________________________________________________________________________________________________
int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
hInstance = hInst;
InitCommonControls(); // initialize common controls
HANDLE reDLL = LoadLibrary("RICHED32.DLL");
if(!reDLL) return MessageBox( NULL, "Unable to load RICHED32.DLL", "Fatal error!", MB_ICONHAND|MB_OK);
RECT r = {30, 40, 480, 65};
RGBQUAD clr = {100, 60, 255 };
CSplashScreen* pSS = new CSplashScreen(hInstance, IDB_SPLASHBITMAP, 1500, 24, &r, "Courier new Bold", &clr);
pSS->SetText("Initializing conversion Engine...");
{
char* szPath = GetAppPathPlus( "Translation\\" ); // the conversion rules
char PathBuffer[_MAX_PATH];
strcpy(PathBuffer, szPath);
strcat(PathBuffer, "*.cvt");
int error = 0;
unsigned line;
WIN32_FIND_DATA fd;
HANDLE hSearch = FindFirstFile( PathBuffer, &fd );
for(BOOL Found = (hSearch != INVALID_HANDLE_VALUE); Found; Found = FindNextFile( hSearch, &fd))
{
strcpy(PathBuffer, szPath);
strcat(PathBuffer, fd.cFileName);
if( error = CnvEng.SetRules(PathBuffer, &line)) break;
}
if( hSearch != INVALID_HANDLE_VALUE ) FindClose( hSearch );
delete[] szPath;
if( error )
{
char Text[2000];
switch (error)
{
case SB_ERR_UNKNOWN: strcpy( Text, "Unknown Internal Error - Please contact your distributor!"); break;
case SB_ERR_FILEOPEN: strcpy( Text, "Unable to open file."); break;
case SB_ERR_UNKNOWN_KEYWORD: strcpy( Text, "Unknown Keyword."); break;
case SB_ERR_MISPLACED_KEYWORD: strcpy( Text, "Misplaced Keyword."); break;
case SB_ERR_UNKNOWN_TYPE: strcpy( Text, "Unknown Parameter Type."); break;
case SB_ERR_TAG_VALUE_MISSING: strcpy( Text, "Missing Entry Tag Value."); break;
case SB_ERR_ILLEGAL_ASSIGNEMENT: strcpy( Text, "Illegal Assignement."); break;
case SB_ERR_VOID_ENTRY_DESCRIPTION: strcpy( Text, "Empty Entry Description."); break;
case SB_ERR_UNEXPECTED_EOF: strcpy( Text, "Unexpected End of File reached."); break;
}
strcat( Text, "\r\n File :");
strcat( Text, fd.cFileName);
strcat( Text, "\r\n Line :");
itoa( line, Text + strlen(Text), 10);
pSS->Close();
FreeLibrary( reDLL );
return MessageBox( NULL, Text, "Fatal error!", MB_ICONHAND|MB_OK);
}
}
hProcessSemaphore = CreateSemaphore( NULL, 0, 1, "S2B_Process_Semaphore" );
hStopSemaphore = CreateSemaphore( NULL, 0, 1, "S2B_StopProcess_Semaphore" );
pSS->SetText("Initializing...");
// set the current cfg file
char* szIni = GetAppPathPlus( INIFILE ); // get configuration file name
HANDLE iniFile = CreateFile(szIni,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL); // open thefile
char* fname;
if( iniFile != INVALID_HANDLE_VALUE)
{
LoadFileName(iniFile, fname, szIni);
CloseHandle(iniFile);
}
else fname = GetAppPathPlus( DEFCFG ); // get configuration file name
strcpy(CrtCfg, fname);
delete[] fname;
delete[] szIni; // we don't need it anymore
// create the application Window
WNDCLASS wcls =
{ 0, AppWndProc, 0, 0, hInstance,
LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1)),
NULL,//LoadCursor(NULL, MAKEINTRESOURCE(IDC_CURSOR1)),
(HBRUSH)((long)COLOR_BTNFACE+1),
MAKEINTRESOURCE(IDR_MENU1),"WinS2BFrame"
};
RegisterClass(&wcls);
// create the main window
hWApp = CreateWindowEx (0,"WinS2BFrame",APPNAME,
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,CW_USEDEFAULT,0,CW_USEDEFAULT,0,
NULL,NULL,hInstance,NULL);
// create the toolbar
MakeToolbar( hWApp );
// create the status bar
hWStatusbar = CreateStatusWindow( WS_CLIPSIBLINGS|WS_CHILD|WS_VISIBLE|SBARS_SIZEGRIP, "Ready", hWApp,IDW_STATUSBAR);
// compute the client rectangle corrections
GetWindowRect(hWToolbar, &r);
ToolbarHeight = r.bottom -r.top;
GetWindowRect(hWStatusbar, &r);
StatusHeight = r.bottom -r.top;
// create the output window
hWOut = CreateWindowEx (WS_EX_CLIENTEDGE,"RichEdit" , "",
WS_HSCROLL|WS_VSCROLL|WS_CLIPSIBLINGS|ES_READONLY|ES_MULTILINE|ES_AUTOVSCROLL | WS_CHILD | WS_VISIBLE, 0, ToolbarHeight, 100, 100,
hWApp,(HANDLE)IDW_OUTPUT,hInstance,NULL);
CHARFORMAT cf= { sizeof(CHARFORMAT) };
cf.dwMask = CFM_BOLD|CFM_FACE|CFM_COLOR|CFM_SIZE;
cf.dwEffects = 0;
cf.yHeight = -10;
cf.crTextColor = RGB(0, 255, 0);
cf.bCharSet = DEFAULT_CHARSET;
cf.bPitchAndFamily = DEFAULT_PITCH|FF_DONTCARE;
strcpy(cf.szFaceName, "Arial");
SendMessage(hWOut, EM_SETCHARFORMAT, SCF_ALL, (LPARAM) &cf ); // set the character format
SendMessage(hWOut, EM_SETBKGNDCOLOR, 0, (LPARAM) RGB( 0, 0, 60 )); // set the background color
SendMessage(hWOut, EM_EXLIMITTEXT, 0, 0x200000 );
OutIWP = (WNDPROC)SetWindowLong( hWOut, GWL_WNDPROC, (LONG)OutWndProc); // change the window procedure
SetTxtProp( RGB(255, 100, 0), CFE_BOLD);
AddTxt(APPNAME);
AddTxt(" initialized successfuly.");
SetTxtProp();
// create the filter list
hWFilter = CreateWindowEx (WS_EX_CLIENTEDGE,WC_LISTVIEW,APPNAME,
LVS_SHOWSELALWAYS|LVS_SORTASCENDING|LVS_LIST|WS_CLIPSIBLINGS|WS_CHILD|WS_VISIBLE, 0, ToolbarHeight, 100, 100,
hWApp,(HANDLE)IDW_FILTER,hInstance,NULL);
ListView_SetImageList( hWFilter, ImageList_LoadBitmap( hInstance, MAKEINTRESOURCE( IDB_FILTERSTATES ), 16, 0, RGB( 0, 0, 0xFF ) ), LVSIL_STATE );
ListView_SetBkColor( hWFilter, GetSysColor(COLOR_BTNFACE));
ListView_SetTextBkColor( hWFilter, GetSysColor(COLOR_BTNFACE));
FilterIWP = (WNDPROC)SetWindowLong( hWFilter, GWL_WNDPROC, (LONG)FilterWndProc); // change the window procedure
// create the file list
hWList = CreateWindowEx (WS_EX_CLIENTEDGE,WC_LISTVIEW,APPNAME,
LVS_SHOWSELALWAYS|LVS_SORTASCENDING|LVS_LIST|WS_CLIPSIBLINGS|WS_CHILD|WS_VISIBLE, 103, ToolbarHeight, 100, 100,
hWApp,(HANDLE)IDW_LIST,hInstance,NULL);
ListIWP = (WNDPROC)SetWindowLong( hWList, GWL_WNDPROC, (LONG)ListWndProc); // change the window procedure
DragAcceptFiles( hWList, TRUE); //process dragged files
ListView_SetImageList( hWList, ImageList_LoadBitmap( hInstance, MAKEINTRESOURCE( IDB_FILESTATES ), 16, 0, RGB( 0, 0, 0xFF ) ), LVSIL_STATE );
pListTip = new CTip(hWApp);
// create the tree view
hWTree = CreateWindowEx (WS_EX_CLIENTEDGE,WC_TREEVIEW,APPNAME,
WS_CLIPSIBLINGS|WS_CHILD|WS_VISIBLE|TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS|TVS_SHOWSELALWAYS, 0, ToolbarHeight+103, 100, 100,
hWApp,(HANDLE)IDW_TREE,hInstance,NULL);
TreeIWP = (WNDPROC)SetWindowLong( hWTree, GWL_WNDPROC, (LONG)TreeWndProc); // change the window procedure
HIMAGELIST htreeIL = ImageList_LoadBitmap( hInstance, MAKEINTRESOURCE( IDB_FOLDERIMAGES), 16, 0, RGB( 0, 0, 0xFF ));
ImageList_SetOverlayImage( htreeIL,2,1);
TreeView_SetImageList( hWTree, htreeIL, TVSIL_NORMAL );
TreeView_SetImageList( hWTree, ImageList_LoadBitmap( hInstance, MAKEINTRESOURCE( IDB_FOLDERSTATES ), 22, 0, RGB( 0, 0, 0xFF ) ), TVSIL_STATE );
InitTree();
// create the list view
hWListView = CreateWindowEx (WS_EX_CLIENTEDGE,WC_LISTVIEW,APPNAME,
LVS_SHOWSELALWAYS|LVS_SORTASCENDING|LVS_LIST|WS_CLIPSIBLINGS|WS_CHILD|WS_VISIBLE, 103, ToolbarHeight+103, 100, 100,
hWApp,(HANDLE)IDW_LISTVIEW,hInstance,NULL);
ListView_SetImageList( hWListView, ImageList_LoadBitmap( hInstance, MAKEINTRESOURCE( IDB_FILESTATES ), 16, 0, RGB( 0, 0, 0xFF ) ), LVSIL_STATE );
ViewIWP = (WNDPROC)SetWindowLong( hWListView, GWL_WNDPROC, (LONG)ViewWndProc); // change the window procedure
// load the application configuration
pSS->SetText("Loading configuration...");
UpdateAppName();
ShowWindow( hWApp, LoadConfiguration()? SW_SHOWMAXIMIZED: nCmdShow );
// ShowWindow( hWApp, nCmdShow );
Refresh();
UpdateWindow( hWApp );
pSS->SetText("Welcome to");
pSS->Close();
// the message loop
HACCEL hViewsAcc = LoadAccelerators( hInstance, MAKEINTRESOURCE(IDR_VIEWS_ACCEL));
HACCEL hMainAcc = LoadAccelerators( hInstance, MAKEINTRESOURCE(IDR_MAIN_ACCEL));
MSG msg;
BOOL OnIdleEnabled = TRUE;
BOOL Mode;
HWND FocusW;
for(;;)
{
Mode = 1;
if( OnIdleEnabled )
{
// enter here if there are still messages in the meassage queue: no problem, PeekMessage will not stress the system
if(!PeekMessage(&msg,NULL,0,0,PM_REMOVE))
Mode = 0; // this means the message queue is empty => next time we'll call GetMessage(),
// which will return only when it will find a message in the queue => let the system make it's stuff
else if(msg.message == WM_QUIT) break;
}
else if(GetMessage(&msg,NULL,0,0) <=0 ) break; // call this when the message queue is empty
if(Mode)
{
OnIdleEnabled = TRUE; // a message is processed (there was no idle time) => retrieve the next message with the PeekMessage() function
if(msg.message == WM_QUIT) break;
if(!TranslateAccelerator( hWApp, hMainAcc, &msg))
{
FocusW = GetFocus();
if( !FocusW || FocusW == hWOut || !TranslateAccelerator( FocusW, hViewsAcc, &msg))
{
if(msg.message == WM_SYSKEYDOWN) pListTip->Show(NULL,NULL);//SendMessage(hWApp, msg.message, msg.wParam, msg.lParam);
TranslateMessage (&msg);
DispatchMessage (&msg);
}
}
}
else
{
OnIdle();
OnIdleEnabled = FALSE; // the message queue is empty => use the GetMessage() function
}
}
delete pListTip;
FreeLibrary( reDLL );
CloseHandle(hProcessSemaphore);
CloseHandle(hStopSemaphore);
return 0;
}