You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
288 lines
6.3 KiB
288 lines
6.3 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
// |
|
//=============================================================================// |
|
// |
|
// Half-Life Model Viewer (c) 1999 by Mete Ciragan |
|
// |
|
// file: FileAssociation.cpp |
|
// last modified: May 04 1999, Mete Ciragan |
|
// copyright: The programs and associated files contained in this |
|
// distribution were developed by Mete Ciragan. The programs |
|
// are not in the public domain, but they are freely |
|
// distributable without licensing fees. These programs are |
|
// provided without guarantee or warrantee expressed or |
|
// implied. |
|
// |
|
// version: 1.2 |
|
// |
|
// email: mete@swissquake.ch |
|
// web: http://www.swissquake.ch/chumbalum-soft/ |
|
// |
|
#include "FileAssociation.h" |
|
#include <stdio.h> |
|
#include <stdlib.h> |
|
#include <string.h> |
|
#include <mxtk/mx.h> |
|
|
|
|
|
|
|
FileAssociation *g_FileAssociation = 0; |
|
|
|
|
|
|
|
FileAssociation::FileAssociation () |
|
: mxWindow (0, 100, 100, 400, 210, "File Associations", mxWindow::Dialog) |
|
{ |
|
cExtension = new mxChoice (this, 5, 5, 220, 22, IDC_EXTENSION); |
|
|
|
//new mxButton (this, 230, 5, 75, 22, "Add", IDC_ADD); |
|
//new mxButton (this, 310, 5, 75, 22, "Remove", IDC_REMOVE); |
|
|
|
new mxGroupBox (this, 5, 30, 380, 115, "Assocations"); |
|
rbAction[0] = new mxRadioButton (this, 10, 50, 120, 22, "program", IDC_ACTION1, true); |
|
rbAction[1] = new mxRadioButton (this, 10, 72, 120, 22, "associated program", IDC_ACTION2); |
|
rbAction[2] = new mxRadioButton (this, 10, 94, 120, 22, "HLMV default", IDC_ACTION3); |
|
rbAction[3] = new mxRadioButton (this, 10, 116, 120, 22, "none", IDC_ACTION4); |
|
leProgram = new mxLineEdit (this, 130, 50, 220, 22, "", IDC_PROGRAM); |
|
leProgram->setEnabled (false); |
|
bChooseProgram = new mxButton (this, 352, 50, 22, 22, ">>", IDC_CHOOSEPROGRAM); |
|
bChooseProgram->setEnabled (false); |
|
|
|
rbAction[0]->setChecked (false); |
|
rbAction[1]->setChecked (true); |
|
|
|
new mxButton (this, 110, 155, 75, 22, "Ok", IDC_OK); |
|
new mxButton (this, 215, 155, 75, 22, "Cancel", IDC_CANCEL); |
|
|
|
initAssociations (); |
|
} |
|
|
|
|
|
|
|
FileAssociation::~FileAssociation () |
|
{ |
|
} |
|
|
|
|
|
|
|
int |
|
FileAssociation::handleEvent (mxEvent *event) |
|
{ |
|
if (event->event != mxEvent::Action) |
|
return 0; |
|
|
|
switch (event->action) |
|
{ |
|
case IDC_EXTENSION: |
|
{ |
|
int index = cExtension->getSelectedIndex (); |
|
if (index >= 0) |
|
setAssociation (index); |
|
} |
|
break; |
|
|
|
case IDC_ACTION1: |
|
case IDC_ACTION2: |
|
case IDC_ACTION3: |
|
case IDC_ACTION4: |
|
{ |
|
leProgram->setEnabled (rbAction[0]->isChecked ()); |
|
bChooseProgram->setEnabled (rbAction[0]->isChecked ()); |
|
|
|
int index = cExtension->getSelectedIndex (); |
|
if (index >= 0) |
|
d_associations[index].association = event->action - IDC_ACTION1; |
|
|
|
} |
|
break; |
|
|
|
case IDC_PROGRAM: |
|
{ |
|
int index = cExtension->getSelectedIndex (); |
|
if (index >= 0) |
|
strcpy (d_associations[index].program, leProgram->getLabel ()); |
|
} |
|
break; |
|
|
|
case IDC_CHOOSEPROGRAM: |
|
{ |
|
const char *ptr = mxGetOpenFileName (this, 0, "*.exe"); |
|
if (ptr) |
|
{ |
|
leProgram->setLabel (ptr); |
|
|
|
int index = cExtension->getSelectedIndex (); |
|
if (index >= 0) |
|
strcpy (d_associations[index].program, leProgram->getLabel ()); |
|
} |
|
} |
|
break; |
|
|
|
case IDC_OK: |
|
saveAssociations (); |
|
|
|
case IDC_CANCEL: |
|
setVisible (false); |
|
break; |
|
} |
|
|
|
return 1; |
|
} |
|
|
|
|
|
|
|
void |
|
FileAssociation::initAssociations () |
|
{ |
|
int i; |
|
|
|
cExtension->removeAll (); |
|
|
|
for (i = 0; i < 16; i++) |
|
d_associations[i].association = -1; |
|
|
|
char path[256]; |
|
strcpy (path, mx::getApplicationPath ()); |
|
strcat (path, "/hlmv.fa"); |
|
FILE *file = fopen (path, "rt"); |
|
if (!file) |
|
return; |
|
|
|
i = 0; |
|
char line[256]; |
|
while (i < 16 && fgets (line, 256, file)) |
|
{ |
|
int j = 0; |
|
while (line[++j] != '\"'); |
|
line[j] = '\0'; |
|
strcpy (d_associations[i].extension, &line[1]); |
|
|
|
while (line[++j] != '\"'); |
|
int k = j + 1; |
|
while (line[++j] != '\"'); |
|
line[j] = '\0'; |
|
strcpy (d_associations[i].program, &line[k]); |
|
|
|
d_associations[i].association = atoi (&line[++j]); |
|
|
|
cExtension->add (d_associations[i].extension); |
|
++i; |
|
} |
|
|
|
fclose (file); |
|
|
|
setAssociation (0); |
|
} |
|
|
|
|
|
|
|
void |
|
FileAssociation::setAssociation (int index) |
|
{ |
|
cExtension->select (index); |
|
leProgram->setLabel (d_associations[index].program); |
|
|
|
for (int i = 0; i < 4; i++) |
|
rbAction[i]->setChecked (i == d_associations[index].association); |
|
|
|
leProgram->setEnabled (d_associations[index].association == 0); |
|
bChooseProgram->setEnabled (d_associations[index].association == 0); |
|
|
|
// TODO: check for valid associtaion |
|
#ifdef WIN32__ |
|
char path[256]; |
|
|
|
strcpy (path, mx_gettemppath ()); |
|
strcat (path, "/hlmvtemp."); |
|
strcat (path, d_associations[index].extension); |
|
|
|
FILE *file = fopen (path, "wb"); |
|
if (file) |
|
fclose (file); |
|
|
|
int val = (int) ShellExecute ((HWND) getHandle (), "open", path, 0, 0, SW_HIDE); |
|
char str[32]; |
|
sprintf (str, "%d", val); |
|
setLabel (str); |
|
rbAction[1]->setEnabled (val != 31); |
|
/* |
|
WORD dw = 0; |
|
HICON hIcon = ExtractAssociatedIcon ((HINSTANCE) GetWindowLong ((HWND) getHandle (), GWL_HINSTANCE), path, &dw); |
|
SendMessage ((HWND) getHandle (), WM_SETICON, (WPARAM) ICON_SMALL, (LPARAM) hIcon); |
|
char str[32]; |
|
sprintf (str, "%d", (int) hIcon); |
|
setLabel (str); |
|
*/ |
|
DeleteFile (path); |
|
|
|
//DestroyIcon (hIcon); |
|
#endif |
|
|
|
rbAction[2]->setEnabled ( |
|
!mx_strcasecmp (d_associations[index].extension, "mdl") || |
|
!mx_strcasecmp (d_associations[index].extension, "tga") || |
|
!mx_strcasecmp (d_associations[index].extension, "wav") |
|
); |
|
} |
|
|
|
|
|
|
|
void |
|
FileAssociation::saveAssociations () |
|
{ |
|
char path[256]; |
|
|
|
strcpy (path, mx::getApplicationPath ()); |
|
strcat (path, "/hlmv.fa"); |
|
|
|
FILE *file = fopen (path, "wt"); |
|
if (!file) |
|
return; |
|
|
|
for (int i = 0; i < 16; i++) |
|
{ |
|
if (d_associations[i].association == -1) |
|
break; |
|
|
|
fprintf (file, "\"%s\" \"%s\" %d\n", |
|
d_associations[i].extension, |
|
d_associations[i].program, |
|
d_associations[i].association); |
|
} |
|
|
|
fclose (file); |
|
} |
|
|
|
|
|
|
|
int |
|
FileAssociation::getMode (char *extension) |
|
{ |
|
for (int i = 0; i < 16; i++) |
|
{ |
|
//if (!strcmp (d_associations[i].extension, mx_strlower (extension))) |
|
if (!strcmp (d_associations[i].extension, extension)) |
|
return d_associations[i].association; |
|
} |
|
|
|
return -1; |
|
} |
|
|
|
|
|
|
|
char * |
|
FileAssociation::getProgram (char *extension) |
|
{ |
|
for (int i = 0; i < 16; i++) |
|
{ |
|
//if (!strcmp (d_associations[i].extension, mx_strlower (extension))) |
|
if (!strcmp (d_associations[i].extension, extension)) |
|
return d_associations[i].program; |
|
} |
|
|
|
return 0; |
|
}
|
|
|