Subversion Repositories filter_foundry

Compare Revisions

Regard whitespace Rev 492 → Rev 493

/trunk/CHANGELOG.md
2,7 → 2,10
 
## 1.7.0.17 [Work-In-Progress]
- Fixed theoretical bug that can crash a Photoshop application if PLUGIN.DLL exists but is not loaded.
- Added translation for German systems (*)
 
(*) This bug/solution was tested on Windows but needs to be verified and/or implemented on Mac.
 
## 1.7.0.16 [22-Mar-2022]
- Fixed bug that caused PLUGIN.DLL sliders not working if the filter was called multiple times. You can hotfix existing standalone plugins by replacing "UnregisterSlider" with "UnRegisterSlider" using a hex-editor. Affected are plugins built using 1.7.0.13/14/15.
 
/trunk/language.c
26,7 → 26,7
TCHAR* szMsg;
int len;
len = LoadString(hDllInstance, MsgId, (LPTSTR)&szMsg, 0);
LoadString(hDllInstance, MsgId, ret, len);
LoadString(hDllInstance, MsgId, ret, len+1);
#else
Str255 msg;
GetIndString(msg, 1000, MsgId);
35,6 → 35,7
}
 
TCHAR* FF_GetMsg_Cpy(int MsgId) {
#ifdef WIN_ENV
TCHAR* szMsg;
int len;
TCHAR* ret;
41,6 → 42,13
len = LoadString(hDllInstance, MsgId, (LPTSTR)&szMsg, 0);
ret = (TCHAR*)malloc((len+1) * sizeof(TCHAR)); // TODO: This leaks memory! Like _strdup() does... Not a good design!
if (ret == NULL) return NULL;
LoadString(hDllInstance, MsgId, ret, len);
LoadString(hDllInstance, MsgId, ret, len+1);
return ret;
#else
Str255 msg;
TCHAR* ret;
GetIndString(msg, 1000, MsgId);
myp2cstrcpy(ret, msg);
return ret;
#endif
}
/trunk/language.h
18,10 → 18,6
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
 
// TODO: Search for more things to translate, e.g. in *_mac.*
// TODO: Translate "TODO: Translate" in *.c
// TODO: Translate dialogs
 
// TODO: Deutsche Umlaute sind kaputt (UTF8 Zeichen werden gezeigt)
// Hiermit geht es aber...
// Meldung "Unbekanntes Pragma" (trotzdem bringt es was?!)
175,5 → 171,86
#define MSG_FULLY_ZOOM_INOUT_ENUS "Fully zoom in/out"
#define MSG_FULLY_ZOOM_INOUT_DEDE "Vollständig rein/raus-zoomen"
 
#define MSG_LOAD_FILTER_SETTINGS_TITLE_ID 38
#define MSG_LOAD_FILTER_SETTINGS_TITLE_ENUS "Load filter settings"
#define MSG_LOAD_FILTER_SETTINGS_TITLE_DEDE "Filter-Einstellungen laden"
 
#define MSG_SAVE_FILTER_SETTINGS_TITLE_ID 39
#define MSG_SAVE_FILTER_SETTINGS_TITLE_ENUS "Save filter settings"
#define MSG_SAVE_FILTER_SETTINGS_TITLE_DEDE "Filter-Einstellungen speichern"
 
#define MSG_MAKE_FILTER_SETTINGS_TITLE_ID 40
#define MSG_MAKE_FILTER_SETTINGS_TITLE_ENUS "Create standalone filter"
#define MSG_MAKE_FILTER_SETTINGS_TITLE_DEDE "Eigenständigen Filter erzeugen"
 
#define MSG_ALL_SUPPORTED_FILES_ID 41
#define MSG_ALL_SUPPORTED_FILES_ENUS "All supported files"
#define MSG_ALL_SUPPORTED_FILES_DEDE "Alle unterstützten Dateien"
 
#define MSG_ALL_FILES_ID 42
#define MSG_ALL_FILES_ENUS "All files"
#define MSG_ALL_FILES_DEDE "Alle Dateien"
 
#define MSG_OPEN_AFS_ID 43
#define MSG_OPEN_AFS_ENUS "Filter Factory Settings"
#define MSG_OPEN_AFS_DEDE "Filter Factory Einstellungen"
 
#define MSG_OPEN_TXT_ID 44
#define MSG_OPEN_TXT_ENUS "PluginCommander or FFDecomp TXT file"
#define MSG_OPEN_TXT_DEDE "PluginCommander oder FFDecomp Text-Datei"
 
#define MSG_OPEN_8BF_ID 45
#define MSG_OPEN_8BF_ENUS "Filter Factory for Windows, Standalone Filter"
#define MSG_OPEN_8BF_DEDE "Filter Factory für Windows, Eigenständiger Filter"
 
#define MSG_OPEN_PFF_ID 46
#define MSG_OPEN_PFF_ENUS "Premiere TF / FF Settings"
#define MSG_OPEN_PFF_DEDE "Premiere TF / FF Einstellungen"
 
#define MSG_OPEN_PRM_ID 47
#define MSG_OPEN_PRM_ENUS "Premiere TF/FF for Windows, Standalone Filter"
#define MSG_OPEN_PRM_DEDE "Premiere TF/FF für Windows, Eigenständiger Filter"
 
#define MSG_OPEN_RSRC_ID 48
#define MSG_OPEN_RSRC_ENUS "FilterFactory for MacOS, Standalone Filter"
#define MSG_OPEN_RSRC_DEDE "FilterFactory für MacOS, Eigenständiger Filter"
 
#define MSG_OPEN_FFX_ID 49
#define MSG_OPEN_FFX_ENUS """Filters Unlimited"" filter"
#define MSG_OPEN_FFX_DEDE """Filters Unlimited"" Filter"
 
#define MSG_SAVE_AFS_ID 50
#define MSG_SAVE_AFS_ENUS "Filter Factory Settings"
#define MSG_SAVE_AFS_DEDE "Filter Factory Einstellungen"
 
#define MSG_SAVE_PFF_ID 51
#define MSG_SAVE_PFF_ENUS "Premiere TF / FF Settings"
#define MSG_SAVE_PFF_DEDE "Premiere TF / FF Einstellungen"
 
#define MSG_SAVE_TXT_ID 52
#define MSG_SAVE_TXT_ENUS "PluginCommander TXT file"
#define MSG_SAVE_TXT_DEDE "PluginCommander Text-Datei"
 
#define MSG_MAKE_8BF_ID 53
#define MSG_MAKE_8BF_ENUS "Filter plugin file"
#define MSG_MAKE_8BF_DEDE "Eigenständiger Filter"
 
#define MSG_ABOUT_BY_ID 54
#define MSG_ABOUT_BY_ENUS " by "
#define MSG_ABOUT_BY_DEDE " von "
 
#define MSG_ABOUT_BUILT_USING_ID 55
#define MSG_ABOUT_BUILT_USING_ENUS "This plugin was built using Filter Foundry "
#define MSG_ABOUT_BUILT_USING_DEDE "Dieses Plugin wurde erstellt mit Filter Foundry "
 
#define MSG_ABOUT_LATEST_VERSION_FROM_ID 56
#define MSG_ABOUT_LATEST_VERSION_FROM_ENUS "Latest version available from:"
#define MSG_ABOUT_LATEST_VERSION_FROM_DEDE "Aktuelle Version herunterladen:"
 
#define MSG_ABOUT_CONTACT_AUTHOR_ID 57
#define MSG_ABOUT_CONTACT_AUTHOR_ENUS "Please contact the author with any bug reports,\nsuggestions or comments.\nIf you use this program and like it, please consider\nmaking a donation."
#define MSG_ABOUT_CONTACT_AUTHOR_DEDE "Bitte kontaktieren Sie den Autor für Fehlerberichte,\nAnregungen und Kommentare.\nWenn Sie dieses Programm mögen,\nerwägen Sie bitte eine Spende."
 
 
void FF_GetMsg(TCHAR* ret, int MsgId);
TCHAR* FF_GetMsg_Cpy(int MsgId);
/trunk/language_mac.r
59,6 → 59,42
MSG_ERROR_IN_EXPRESSION_CLICK_DETAILS_ENUS,
MSG_ZOOM_IN_ENUS,
MSG_ZOOM_OUT_ENUS,
MSG_FULLY_ZOOM_INOUT_ENUS
MSG_FULLY_ZOOM_INOUT_ENUS,
MSG_LOAD_FILTER_SETTINGS_TITLE_ENUS,
MSG_SAVE_FILTER_SETTINGS_TITLE_ENUS,
MSG_MAKE_FILTER_SETTINGS_TITLE_ENUS,
MSG_ALL_SUPPORTED_FILES_ENUS,
MSG_ALL_FILES_ENUS,
MSG_OPEN_AFS_ENUS,
MSG_OPEN_TXT_ENUS,
MSG_OPEN_8BF_ENUS,
MSG_OPEN_PFF_ENUS,
MSG_OPEN_PRM_ENUS,
MSG_OPEN_RSRC_ENUS,
MSG_OPEN_FFX_ENUS,
MSG_SAVE_AFS_ENUS,
MSG_SAVE_PFF_ENUS,
MSG_SAVE_TXT_ENUS,
MSG_MAKE_8BF_ENUS,
MSG_LOAD_FILTER_SETTINGS_TITLE_ENUS,
MSG_SAVE_FILTER_SETTINGS_TITLE_ENUS,
MSG_MAKE_FILTER_SETTINGS_TITLE_ENUS,
MSG_ALL_SUPPORTED_FILES_ENUS,
MSG_ALL_FILES_ENUS,
MSG_OPEN_AFS_ENUS,
MSG_OPEN_TXT_ENUS,
MSG_OPEN_8BF_ENUS,
MSG_OPEN_PFF_ENUS,
MSG_OPEN_PRM_ENUS,
MSG_OPEN_RSRC_ENUS,
MSG_OPEN_FFX_ENUS,
MSG_SAVE_AFS_ENUS,
MSG_SAVE_PFF_ENUS,
MSG_SAVE_TXT_ENUS,
MSG_MAKE_8BF_ENUS,
MSG_ABOUT_BY_ENUS,
MSG_ABOUT_BUILT_USING_ENUS,
MSG_ABOUT_LATEST_VERSION_FROM_ENUS,
MSG_ABOUT_CONTACT_AUTHOR_ENUS
}
}
/trunk/language_win.rc
61,6 → 61,26
MSG_ZOOM_IN_ID, MSG_ZOOM_IN_ENUS
MSG_ZOOM_OUT_ID, MSG_ZOOM_OUT_ENUS
MSG_FULLY_ZOOM_INOUT_ID, MSG_FULLY_ZOOM_INOUT_ENUS
MSG_LOAD_FILTER_SETTINGS_TITLE_ID, MSG_LOAD_FILTER_SETTINGS_TITLE_ENUS
MSG_SAVE_FILTER_SETTINGS_TITLE_ID, MSG_SAVE_FILTER_SETTINGS_TITLE_ENUS
MSG_MAKE_FILTER_SETTINGS_TITLE_ID, MSG_MAKE_FILTER_SETTINGS_TITLE_ENUS
MSG_ALL_SUPPORTED_FILES_ID, MSG_ALL_SUPPORTED_FILES_ENUS
MSG_ALL_FILES_ID, MSG_ALL_FILES_ENUS
MSG_OPEN_AFS_ID, MSG_OPEN_AFS_ENUS
MSG_OPEN_TXT_ID, MSG_OPEN_TXT_ENUS
MSG_OPEN_8BF_ID, MSG_OPEN_8BF_ENUS
MSG_OPEN_PFF_ID, MSG_OPEN_PFF_ENUS
MSG_OPEN_PRM_ID, MSG_OPEN_PRM_ENUS
MSG_OPEN_RSRC_ID, MSG_OPEN_RSRC_ENUS
MSG_OPEN_FFX_ID, MSG_OPEN_FFX_ENUS
MSG_SAVE_AFS_ID, MSG_SAVE_AFS_ENUS
MSG_SAVE_PFF_ID, MSG_SAVE_PFF_ENUS
MSG_SAVE_TXT_ID, MSG_SAVE_TXT_ENUS
MSG_MAKE_8BF_ID, MSG_MAKE_8BF_ENUS
MSG_ABOUT_BY_ID, MSG_ABOUT_BY_ENUS
MSG_ABOUT_BUILT_USING_ID, MSG_ABOUT_BUILT_USING_ENUS
MSG_ABOUT_LATEST_VERSION_FROM_ID, MSG_ABOUT_LATEST_VERSION_FROM_ENUS
MSG_ABOUT_CONTACT_AUTHOR_ID, MSG_ABOUT_CONTACT_AUTHOR_ENUS
}
 
LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
104,4 → 124,25
MSG_ZOOM_IN_ID, MSG_ZOOM_IN_DEDE
MSG_ZOOM_OUT_ID, MSG_ZOOM_OUT_DEDE
MSG_FULLY_ZOOM_INOUT_ID, MSG_FULLY_ZOOM_INOUT_DEDE
MSG_LOAD_FILTER_SETTINGS_TITLE_ID, MSG_LOAD_FILTER_SETTINGS_TITLE_DEDE
MSG_SAVE_FILTER_SETTINGS_TITLE_ID, MSG_SAVE_FILTER_SETTINGS_TITLE_DEDE
MSG_MAKE_FILTER_SETTINGS_TITLE_ID, MSG_MAKE_FILTER_SETTINGS_TITLE_DEDE
MSG_ALL_SUPPORTED_FILES_ID, MSG_ALL_SUPPORTED_FILES_DEDE
MSG_ALL_FILES_ID, MSG_ALL_FILES_DEDE
MSG_OPEN_AFS_ID, MSG_OPEN_AFS_DEDE
MSG_OPEN_TXT_ID, MSG_OPEN_TXT_DEDE
MSG_OPEN_8BF_ID, MSG_OPEN_8BF_DEDE
MSG_OPEN_PFF_ID, MSG_OPEN_PFF_DEDE
MSG_OPEN_PRM_ID, MSG_OPEN_PRM_DEDE
MSG_OPEN_RSRC_ID, MSG_OPEN_RSRC_DEDE
MSG_OPEN_FFX_ID, MSG_OPEN_FFX_DEDE
MSG_SAVE_AFS_ID, MSG_SAVE_AFS_DEDE
MSG_SAVE_PFF_ID, MSG_SAVE_PFF_DEDE
MSG_SAVE_TXT_ID, MSG_SAVE_TXT_DEDE
MSG_MAKE_8BF_ID, MSG_MAKE_8BF_DEDE
MSG_ABOUT_BY_ID, MSG_ABOUT_BY_DEDE
MSG_ABOUT_BUILT_USING_ID, MSG_ABOUT_BUILT_USING_DEDE
MSG_ABOUT_LATEST_VERSION_FROM_ID, MSG_ABOUT_LATEST_VERSION_FROM_DEDE
MSG_ABOUT_CONTACT_AUTHOR_ID, MSG_ABOUT_CONTACT_AUTHOR_DEDE
 
}
/trunk/ui.c
358,16 → 358,104
dispose_preview();
return false; // end dialog
case OPENITEM:
{
TCHAR filters[3000];
TCHAR *tmp1, *tmp2;
size_t len;
 
memset(&filters[0], 0, sizeof(filters));
tmp1 = &filters[0];
 
FF_GetMsg(tmp1, MSG_ALL_SUPPORTED_FILES_ID);
tmp1 += xstrlen(tmp1);
len = xstrlen(tmp2 = TEXT(" (*.afs, *.8bf, *.pff, *.prm, *.bin, *.rsrc, *.txt, *.ffx)"));
memcpy(tmp1, tmp2, len * sizeof(TCHAR));
tmp1 += (len + 1);
len = xstrlen(tmp2 = TEXT("*.afs;*.8bf;*.pff;*.prm;*.bin;*.rsrc;*.txt;*.ffx"));
memcpy(tmp1, tmp2, len * sizeof(TCHAR));
tmp1 += (len + 1);
 
FF_GetMsg(tmp1, MSG_OPEN_AFS_ID);
tmp1 += xstrlen(tmp1);
len = xstrlen(tmp2 = TEXT(" (*.afs)"));
memcpy(tmp1, tmp2, len * sizeof(TCHAR));
tmp1 += (len + 1);
len = xstrlen(tmp2 = TEXT("*.afs"));
memcpy(tmp1, tmp2, len * sizeof(TCHAR));
tmp1 += (len + 1);
 
FF_GetMsg(tmp1, MSG_OPEN_TXT_ID);
tmp1 += xstrlen(tmp1);
len = xstrlen(tmp2 = TEXT(" (*.txt)"));
memcpy(tmp1, tmp2, len * sizeof(TCHAR));
tmp1 += (len + 1);
len = xstrlen(tmp2 = TEXT("*.txt"));
memcpy(tmp1, tmp2, len * sizeof(TCHAR));
tmp1 += (len + 1);
 
FF_GetMsg(tmp1, MSG_OPEN_8BF_ID);
tmp1 += xstrlen(tmp1);
len = xstrlen(tmp2 = TEXT(" (*.8bf)"));
memcpy(tmp1, tmp2, len * sizeof(TCHAR));
tmp1 += (len + 1);
len = xstrlen(tmp2 = TEXT("*.8bf"));
memcpy(tmp1, tmp2, len * sizeof(TCHAR));
tmp1 += (len + 1);
 
FF_GetMsg(tmp1, MSG_OPEN_PFF_ID);
tmp1 += xstrlen(tmp1);
len = xstrlen(tmp2 = TEXT(" (*.pff)"));
memcpy(tmp1, tmp2, len * sizeof(TCHAR));
tmp1 += (len + 1);
len = xstrlen(tmp2 = TEXT("*.pff"));
memcpy(tmp1, tmp2, len * sizeof(TCHAR));
tmp1 += (len + 1);
 
FF_GetMsg(tmp1, MSG_OPEN_PRM_ID);
tmp1 += xstrlen(tmp1);
len = xstrlen(tmp2 = TEXT(" (*.prm)"));
memcpy(tmp1, tmp2, len * sizeof(TCHAR));
tmp1 += (len + 1);
len = xstrlen(tmp2 = TEXT("*.prm"));
memcpy(tmp1, tmp2, len * sizeof(TCHAR));
tmp1 += (len + 1);
 
FF_GetMsg(tmp1, MSG_OPEN_RSRC_ID);
tmp1 += xstrlen(tmp1);
len = xstrlen(tmp2 = TEXT(" (*.bin, *.rsrc)"));
memcpy(tmp1, tmp2, len * sizeof(TCHAR));
tmp1 += (len + 1);
len = xstrlen(tmp2 = TEXT("*.bin;*.rsrc"));
memcpy(tmp1, tmp2, len * sizeof(TCHAR));
tmp1 += (len + 1);
 
FF_GetMsg(tmp1, MSG_OPEN_FFX_ID);
tmp1 += xstrlen(tmp1);
len = xstrlen(tmp2 = TEXT(" (*.ffx)"));
memcpy(tmp1, tmp2, len * sizeof(TCHAR));
tmp1 += (len + 1);
len = xstrlen(tmp2 = TEXT("*.ffx"));
memcpy(tmp1, tmp2, len * sizeof(TCHAR));
tmp1 += (len + 1);
 
FF_GetMsg(tmp1, MSG_ALL_FILES_ID);
tmp1 += xstrlen(tmp1);
len = xstrlen(tmp2 = TEXT(" (*.*)"));
memcpy(tmp1, tmp2, len * sizeof(TCHAR));
tmp1 += (len + 1);
len = xstrlen(tmp2 = TEXT("*.*"));
memcpy(tmp1, tmp2, len * sizeof(TCHAR));
tmp1 += (len + 1);
 
if(!gdata->standalone && choosefiletypes(
#ifdef MAC_ENV
(StringPtr)_strdup("\pChoose filter settings"), // "\p" means "Pascal string" // TODO: TRANSLATE
(StringPtr)_strdup("\pChoose filter settings"), // "\p" means "Pascal string" // TODO (Not important yet): TRANSLATE
& sfr, & reply, types, 2,
"All supported files (*.afs, *.8bf, *.pff, *.prm, *.bin, *.rsrc, *.txt, *.ffx)\0*.afs;*.8bf;*.pff;*.prm;*.bin;*.rsrc;*.txt;*.ffx\0Filter Factory Settings (*.afs, *.txt)\0*.afs;*.txt\0PluginCommander or FFDecomp TXT file (*.txt)\0*.txt\0Filter Factory for Windows, Standalone Filter (*.8bf)\0*.8bf\0Premiere TF/FF Settings (*.pff)\0*.pff\0Premiere TT/FF for Windows, Standalone Filter (*.prm)\0*.prm\0FilterFactory for MacOS, Standalone Filter (*.bin, *.rsrc)\0*.bin\0\"Filters Unlimited\" filter (*.ffx)\0*.ffx\0All files (*.*)\0*.*\0\0" // TODO: TRANSLATE
&filters[0]
#else
TEXT("Choose filter settings"), // TODO: TRANSLATE
FF_GetMsg_Cpy(MSG_LOAD_FILTER_SETTINGS_TITLE_ID),
& sfr, & reply, types, 2,
TEXT("All supported files (*.afs, *.8bf, *.pff, *.prm, *.bin, *.rsrc, *.txt, *.ffx)\0*.afs;*.8bf;*.pff;*.prm;*.bin;*.rsrc;*.txt;*.ffx\0Filter Factory Settings (*.afs, *.txt)\0*.afs;*.txt\0PluginCommander or FFDecomp TXT file (*.txt)\0*.txt\0Filter Factory for Windows, Standalone Filter (*.8bf)\0*.8bf\0Premiere TF/FF Settings (*.pff)\0*.pff\0Premiere TT/FF for Windows, Standalone Filter (*.prm)\0*.prm\0FilterFactory for MacOS, Standalone Filter (*.bin, *.rsrc)\0*.bin\0\"Filters Unlimited\" filter (*.ffx)\0*.ffx\0All files (*.*)\0*.*\0\0") // TODO: TRANSLATE
,gdata->hWndMainDlg
&filters[0], gdata->hWndMainDlg
#endif
)){
// Backup everything, otherwise we might lose parameter data if the loading fails
385,21 → 473,74
}
}
break;
}
case SAVEITEM:
{
TCHAR filters[3000];
TCHAR* tmp1, * tmp2;
size_t len;
 
memset(&filters[0], 0, sizeof(filters));
tmp1 = &filters[0];
 
FF_GetMsg(tmp1, MSG_ALL_SUPPORTED_FILES_ID);
tmp1 += xstrlen(tmp1);
len = xstrlen(tmp2 = TEXT(" (*.afs, *.pff, *.txt)"));
memcpy(tmp1, tmp2, len * sizeof(TCHAR));
tmp1 += (len + 1);
len = xstrlen(tmp2 = TEXT("*.afs;*.pff;*.txt"));
memcpy(tmp1, tmp2, len * sizeof(TCHAR));
tmp1 += (len + 1);
 
FF_GetMsg(tmp1, MSG_SAVE_AFS_ID);
tmp1 += xstrlen(tmp1);
len = xstrlen(tmp2 = TEXT(" (*.afs)"));
memcpy(tmp1, tmp2, len * sizeof(TCHAR));
tmp1 += (len + 1);
len = xstrlen(tmp2 = TEXT("*.afs"));
memcpy(tmp1, tmp2, len * sizeof(TCHAR));
tmp1 += (len + 1);
 
FF_GetMsg(tmp1, MSG_SAVE_PFF_ID);
tmp1 += xstrlen(tmp1);
len = xstrlen(tmp2 = TEXT(" (*.pff)"));
memcpy(tmp1, tmp2, len * sizeof(TCHAR));
tmp1 += (len + 1);
len = xstrlen(tmp2 = TEXT("*.pff"));
memcpy(tmp1, tmp2, len * sizeof(TCHAR));
tmp1 += (len + 1);
 
FF_GetMsg(tmp1, MSG_SAVE_TXT_ID);
tmp1 += xstrlen(tmp1);
len = xstrlen(tmp2 = TEXT(" (*.txt)"));
memcpy(tmp1, tmp2, len * sizeof(TCHAR));
tmp1 += (len + 1);
len = xstrlen(tmp2 = TEXT("*.txt"));
memcpy(tmp1, tmp2, len * sizeof(TCHAR));
tmp1 += (len + 1);
 
FF_GetMsg(tmp1, MSG_ALL_FILES_ID);
tmp1 += xstrlen(tmp1);
len = xstrlen(tmp2 = TEXT(" (*.*)"));
memcpy(tmp1, tmp2, len * sizeof(TCHAR));
tmp1 += (len + 1);
len = xstrlen(tmp2 = TEXT("*.*"));
memcpy(tmp1, tmp2, len * sizeof(TCHAR));
tmp1 += (len + 1);
 
if(!gdata->standalone && putfile(
#ifdef MAC_ENV
(StringPtr)_strdup("\pSave filter settings"), // "\p" means "Pascal string" // TODO: TRANSLATE
(StringPtr)_strdup("\pSave filter settings"), // "\p" means "Pascal string" // TODO (Not important yet): TRANSLATE
(StringPtr)_strdup("\0"),
TEXT_FILETYPE, SIG_SIMPLETEXT, & reply, & sfr,
"afs",
"All supported files (.afs, *.pff, .txt)\0*.afs;*.pff;*.txt\0Filter Factory Settings (*.afs)\0*.afs\0Premiere TF/FF Settings (*.pff)\0*.pff\0PluginCommander TXT file (*.txt)\0*.txt\0All files (*.*)\0*.*\0\0", 1 // TODO: TRANSLATE
& filters[0], 1
#else
TEXT("Save filter settings"), // TODO: TRANSLATE
FF_GetMsg_Cpy(MSG_SAVE_FILTER_SETTINGS_TITLE_ID),
TEXT("\0"),
TEXT_FILETYPE, SIG_SIMPLETEXT, & reply, & sfr,
TEXT("afs"),
TEXT("All supported files (.afs, *.pff, .txt)\0*.afs;*.pff;*.txt\0Filter Factory Settings (*.afs)\0*.afs\0Premiere TF/FF Settings (*.pff)\0*.pff\0PluginCommander TXT file (*.txt)\0*.txt\0All files (*.*)\0*.*\0\0"), 1 // TODO: TRANSLATE
,gdata->hWndMainDlg
& filters[0], 1, gdata->hWndMainDlg
#endif
)){
if(savefile_afs_pff_picotxt(&sfr)) {
436,6 → 577,7
}
}
break;
}
case MAKEITEM:
if (gdata->standalone) return true; // should not happen since the button should be grayed out
 
/trunk/ui_build.c
252,21 → 252,47
*/
GetDlgItemText(dp, TITLEITEM, fname, MAXFIELD);
 
{
TCHAR filters[3000];
TCHAR* tmp1, * tmp2;
size_t len;
 
memset(&filters[0], 0, sizeof(filters));
tmp1 = &filters[0];
 
FF_GetMsg(tmp1, MSG_MAKE_8BF_ID);
tmp1 += xstrlen(tmp1);
len = xstrlen(tmp2 = TEXT(" (*.8bf)"));
memcpy(tmp1, tmp2, len * sizeof(TCHAR));
tmp1 += (len + 1);
len = xstrlen(tmp2 = TEXT("*.8bf"));
memcpy(tmp1, tmp2, len * sizeof(TCHAR));
tmp1 += (len + 1);
 
FF_GetMsg(tmp1, MSG_ALL_FILES_ID);
tmp1 += xstrlen(tmp1);
len = xstrlen(tmp2 = TEXT(" (*.*)"));
memcpy(tmp1, tmp2, len * sizeof(TCHAR));
tmp1 += (len + 1);
len = xstrlen(tmp2 = TEXT("*.*"));
memcpy(tmp1, tmp2, len * sizeof(TCHAR));
tmp1 += (len + 1);
 
#ifdef MACMACHO
strcat(fname, ".plugin");
#endif
if (putfile(
#ifdef MAC_ENV
(StringPtr)_strdup("\pMake standalone filter"), // "\p" means "Pascal string" // TODO: TRANSLATE
(StringPtr)_strdup("\pMake standalone filter"), // "\p" means "Pascal string" // TODO (Not important yet): TRANSLATE
(StringPtr)myc2pstr(_strdup(fname)),
PS_FILTER_FILETYPE, kPhotoshopSignature, & reply, & sfr,
"8bf", "Filter plugin file (.8bf)\0*.8bf\0\0", 1 // TODO: TRANSLATE
"8bf", &filters[0], 1
#else
TEXT("Make standalone filter"), // TODO: TRANSLATE
FF_GetMsg_Cpy(MSG_MAKE_FILTER_SETTINGS_TITLE_ID),
fname,
PS_FILTER_FILETYPE, kPhotoshopSignature, & reply, & sfr,
TEXT("8bf"),
TEXT("Filter plugin file (.8bf)\0*.8bf\0\0"), 1 // TODO: TRANSLATE
&filters[0], 1
, (HWND)dp
#endif
)) {
275,6 → 301,7
else {
return true; // keep going. Let the user correct their input
}
}
 
return false; // end dialog
#ifdef MAC_ENV
/trunk/ui_win.c
41,46 → 41,69
extern HINSTANCE hDllInstance;
 
void DoAbout(AboutRecordPtr pb){
char text[1000];
char title[200];
PlatformData *p = (PlatformData*)pb->platformData;
 
if (gdata && gdata->standalone) {
sprintf(title, "About %s", gdata->parm.szTitle);
sprintf(text, "%s by %s\n" /* {Title} by {Author} */
"%s\n" /* {Copyright} */
"\n"
"This plugin was built using Filter Foundry " VERSION_STR
TCHAR filters[3000];
TCHAR* tmp1, * tmp2;
 
memset(&filters[0], 0, sizeof(filters));
tmp1 = &filters[0];
 
//strcpy(gdata->parm.szTitle, "TestTitle");
//strcpy(gdata->parm.szAuthor, "TestAuthor");
//strcpy(gdata->parm.szCopyright, "TestCopyright");
 
tmp1 += mbstowcs(tmp1, gdata->parm.szTitle, 100);
FF_GetMsg(tmp1, MSG_ABOUT_BY_ID); tmp1 += xstrlen(tmp1);
tmp1 += mbstowcs(tmp1, gdata->parm.szAuthor, 100);
tmp1 += mbstowcs(tmp1, "\n", 100);
 
tmp1 += mbstowcs(tmp1, gdata->parm.szCopyright, 100);
tmp1 += mbstowcs(tmp1, "\n\n", 100);
 
FF_GetMsg(tmp1, MSG_ABOUT_BUILT_USING_ID); tmp1 += xstrlen(tmp1);
tmp1 += mbstowcs(tmp1, VERSION_STR, 100);
 
#ifdef _WIN64
" (64 bit)\n"
tmp1 += mbstowcs(tmp1, " (64 bit)\n", 100);
#else
" (32 bit)\n"
tmp1 += mbstowcs(tmp1, " (32 bit)\n", 100);
#endif
"(C) 2003-2009 Toby Thain, 2018-" RELEASE_YEAR " Daniel Marschall\n"
"available from " PROJECT_URL,
gdata->parm.szTitle,
gdata->parm.szAuthor,
gdata->parm.szCopyright);
 
tmp1 += mbstowcs(tmp1, "(C) 2003-2009 Toby Thain, 2018-" RELEASE_YEAR " Daniel Marschall\n", 100);
 
FF_GetMsg(tmp1, MSG_ABOUT_LATEST_VERSION_FROM_ID); tmp1 += xstrlen(tmp1);
tmp1 += mbstowcs(tmp1, "\n", 100);
tmp1 += mbstowcs(tmp1, PROJECT_URL, 100);
 
showmessage(&filters[0]);
} else {
sprintf(title, "About Filter Foundry");
sprintf(text, "Filter Foundry " VERSION_STR
TCHAR filters[3000];
TCHAR* tmp1, * tmp2;
 
memset(&filters[0], 0, sizeof(filters));
tmp1 = &filters[0];
 
tmp1 += mbstowcs(tmp1, "Filter Foundry " VERSION_STR, 100);
#ifdef _WIN64
" (64 bit)\n"
tmp1 += mbstowcs(tmp1, " (64 bit)\n", 100);
#else
" (32 bit)\n"
tmp1 += mbstowcs(tmp1, " (32 bit)\n", 100);
#endif
"(C) 2003-2009 Toby Thain, 2018-" RELEASE_YEAR " Daniel Marschall\n"
"\n"
"Latest version available from\n"
PROJECT_URL "\n"
"\nPlease contact the author with any bug reports,\n"
"suggestions or comments.\n"
"If you use this program and like it, please consider\n"
"making a donation.");
}
 
MessageBoxA((HWND)p->hwnd, text, title, MB_TASKMODAL|MB_ICONINFORMATION|MB_OK);
tmp1 += mbstowcs(tmp1, "(C) 2003-2009 Toby Thain, 2018-" RELEASE_YEAR " Daniel Marschall\n\n", 100);
 
FF_GetMsg(tmp1, MSG_ABOUT_LATEST_VERSION_FROM_ID); tmp1 += xstrlen(tmp1);
tmp1 += mbstowcs(tmp1, "\n", 100);
tmp1 += mbstowcs(tmp1, PROJECT_URL, 100);
tmp1 += mbstowcs(tmp1, "\n\n", 100);
 
FF_GetMsg(tmp1, MSG_ABOUT_CONTACT_AUTHOR_ID); tmp1 += xstrlen(tmp1);
 
showmessage(&filters[0]);
}
}
 
Boolean simplealert(TCHAR* s){
HWND hwnd;
/trunk/ui_win.rc
24,6 → 24,11
#include "commctrl.h"
#include "ui.h"
 
// TODO: Deutsche Umlaute sind kaputt (UTF8 Zeichen werden gezeigt)
// Hiermit geht es aber...
// Meldung "Unbekanntes Pragma" (trotzdem bringt es was?!)
#pragma code_page(65001)
 
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
CAUTION_ICO ICON "caution.ico"
 
102,6 → 107,71
PUSHBUTTON "Cancel", IDCANCEL, 210, 253, 42, 14
END
 
LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
ID_MAINDLG DIALOG DISCARDABLE 150,50, 312,277
STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Filter Foundry"
FONT 8, "MS Sans Serif"
BEGIN
DEFPUSHBUTTON "OK", IDOK, 260, 253, 42, 14
 
/* "Preview" is a subclass of "Static", defined in ui_win.c */
CONTROL "", PREVIEWITEM, "Preview", SS_OWNERDRAW|SS_NOTIFY|SS_SUNKEN, 15,10, 100,100
 
CONTROL "+", ZOOMINITEM, "Button", BS_PUSHBUTTON | BS_CENTER | BS_FLAT | WS_CHILD | WS_VISIBLE, 102,115, 14,12
CONTROL "-", ZOOMOUTITEM, "Button", BS_PUSHBUTTON | BS_CENTER | BS_FLAT | WS_CHILD | WS_VISIBLE, 15,115, 14,12
CONTROL "", ZOOMLEVELITEM, "Button", BS_PUSHBUTTON | BS_CENTER | BS_FLAT | WS_CHILD | WS_VISIBLE, 38,115, 55,12
 
LTEXT "ctl(0)",FIRSTCTLLABELITEM, 129, 10, 25,12
LTEXT "ctl(1)",FIRSTCTLLABELITEM+1, 129, 25, 25,12
LTEXT "ctl(2)",FIRSTCTLLABELITEM+2, 129, 40, 25,12
LTEXT "ctl(3)",FIRSTCTLLABELITEM+3, 129, 55, 25,12
LTEXT "ctl(4)",FIRSTCTLLABELITEM+4, 129, 70, 25,12
LTEXT "ctl(5)",FIRSTCTLLABELITEM+5, 129, 85, 25,12
LTEXT "ctl(6)",FIRSTCTLLABELITEM+6, 129,100, 25,12
LTEXT "ctl(7)",FIRSTCTLLABELITEM+7, 129,115, 25,12
 
CONTROL "",FIRSTCTLITEM, "FoundrySlider", 0, 154,10, 105,10
CONTROL "",FIRSTCTLITEM+1, "FoundrySlider", 0, 154,25, 105,10
CONTROL "",FIRSTCTLITEM+2, "FoundrySlider", 0, 154,40, 105,10
CONTROL "",FIRSTCTLITEM+3, "FoundrySlider", 0, 154,55, 105,10
CONTROL "",FIRSTCTLITEM+4, "FoundrySlider", 0, 154,70, 105,10
CONTROL "",FIRSTCTLITEM+5, "FoundrySlider", 0, 154,85, 105,10
CONTROL "",FIRSTCTLITEM+6, "FoundrySlider", 0, 154,100, 105,10
CONTROL "",FIRSTCTLITEM+7, "FoundrySlider", 0, 154,115, 105,10
 
EDITTEXT FIRSTCTLTEXTITEM, 273, 10, 24,12, ES_NUMBER|ES_RIGHT
EDITTEXT FIRSTCTLTEXTITEM+1, 273, 25, 24,12, ES_NUMBER|ES_RIGHT
EDITTEXT FIRSTCTLTEXTITEM+2, 273, 40, 24,12, ES_NUMBER|ES_RIGHT
EDITTEXT FIRSTCTLTEXTITEM+3, 273, 55, 24,12, ES_NUMBER|ES_RIGHT
EDITTEXT FIRSTCTLTEXTITEM+4, 273, 70, 24,12, ES_NUMBER|ES_RIGHT
EDITTEXT FIRSTCTLTEXTITEM+5, 273, 85, 24,12, ES_NUMBER|ES_RIGHT
EDITTEXT FIRSTCTLTEXTITEM+6, 273,100, 24,12, ES_NUMBER|ES_RIGHT
EDITTEXT FIRSTCTLTEXTITEM+7, 273,115, 24,12, ES_NUMBER|ES_RIGHT
 
LTEXT "R =",FIRSTLABELITEM, 15,135, 13,12
LTEXT "G =",FIRSTLABELITEM+1, 15,163, 13,12
LTEXT "B =",FIRSTLABELITEM+2, 15,191, 13,12
LTEXT "A =",FIRSTLABELITEM+3, 15,219, 13,12
 
/* "Caution" is a subclass of "Button", defined in ui_win.c */
CONTROL "!",FIRSTICONITEM, "Caution",BS_PUSHBUTTON | BS_CENTER | BS_FLAT | BS_OWNERDRAW | WS_CHILD | WS_CLIPSIBLINGS, 15,147, 16,16
CONTROL "!",FIRSTICONITEM+1, "Caution",BS_PUSHBUTTON | BS_CENTER | BS_FLAT | BS_OWNERDRAW | WS_CHILD | WS_CLIPSIBLINGS, 15,175, 16,16
CONTROL "!",FIRSTICONITEM+2, "Caution",BS_PUSHBUTTON | BS_CENTER | BS_FLAT | BS_OWNERDRAW | WS_CHILD | WS_CLIPSIBLINGS, 15,203, 16,16
CONTROL "!",FIRSTICONITEM+3, "Caution",BS_PUSHBUTTON | BS_CENTER | BS_FLAT | BS_OWNERDRAW | WS_CHILD | WS_CLIPSIBLINGS, 15,231, 16,16
 
EDITTEXT FIRSTEXPRITEM, 35,135, 262, 24, ES_AUTOVSCROLL|ES_MULTILINE|ES_WANTRETURN|WS_VSCROLL
EDITTEXT FIRSTEXPRITEM+1, 35,163, 262, 24, ES_AUTOVSCROLL|ES_MULTILINE|ES_WANTRETURN|WS_VSCROLL
EDITTEXT FIRSTEXPRITEM+2, 35,191, 262, 24, ES_AUTOVSCROLL|ES_MULTILINE|ES_WANTRETURN|WS_VSCROLL
EDITTEXT FIRSTEXPRITEM+3, 35,219, 262, 24, ES_AUTOVSCROLL|ES_MULTILINE|ES_WANTRETURN|WS_VSCROLL
 
PUSHBUTTON "Laden...", OPENITEM, 10, 253, 42, 14
PUSHBUTTON "Speichern...", SAVEITEM, 60, 253, 42, 14
PUSHBUTTON "Erzeugen...", MAKEITEM, 110, 253, 42, 14
PUSHBUTTON "Hilfe", HELPITEM, 160, 253, 42, 14
PUSHBUTTON "Abbrechen", IDCANCEL, 210, 253, 42, 14
END
 
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
ID_PARAMDLG DIALOG DISCARDABLE 150,50, 308,161
STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
154,6 → 224,58
LTEXT "", PARAMCOPYITEM, 60,137, 140,20
END
 
LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
ID_PARAMDLG DIALOG DISCARDABLE 150,50, 308,161
STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Filter Foundry"
FONT 8, "MS Sans Serif"
BEGIN
DEFPUSHBUTTON "OK", IDOK, 256,137, 42,14
 
/* "Preview" is a subclass of "Static", defined in ui_win.c */
CONTROL "", PREVIEWITEM, "Preview",SS_OWNERDRAW|SS_NOTIFY|SS_SUNKEN, 15,10, 100,100
 
CONTROL "+", ZOOMINITEM, "Button", BS_PUSHBUTTON | BS_CENTER | BS_FLAT | WS_CHILD | WS_VISIBLE, 103,115, 12,12
CONTROL "-", ZOOMOUTITEM, "Button", BS_PUSHBUTTON | BS_CENTER | BS_FLAT | WS_CHILD | WS_VISIBLE, 15,115, 12,12
CONTROL "", ZOOMLEVELITEM, "Button", BS_PUSHBUTTON | BS_CENTER | BS_FLAT | WS_CHILD | WS_VISIBLE, 37,115, 56,12
 
LTEXT "ctl(0)",FIRSTCTLLABELITEM, 129, 10, 25,12
LTEXT "ctl(1)",FIRSTCTLLABELITEM+1, 129, 25, 25,12
LTEXT "ctl(2)",FIRSTCTLLABELITEM+2, 129, 40, 25,12
LTEXT "ctl(3)",FIRSTCTLLABELITEM+3, 129, 55, 25,12
LTEXT "ctl(4)",FIRSTCTLLABELITEM+4, 129, 70, 25,12
LTEXT "ctl(5)",FIRSTCTLLABELITEM+5, 129, 85, 25,12
LTEXT "ctl(6)",FIRSTCTLLABELITEM+6, 129,100, 25,12
LTEXT "ctl(7)",FIRSTCTLLABELITEM+7, 129,115, 25,12
 
LTEXT "map(0)",FIRSTMAPLABELITEM, 129, 18, 25,12
LTEXT "map(1)",FIRSTMAPLABELITEM+1, 129, 48, 25,12
LTEXT "map(2)",FIRSTMAPLABELITEM+2, 129, 78, 25,12
LTEXT "map(3)",FIRSTMAPLABELITEM+3, 129,108, 25,12
 
CONTROL "",FIRSTCTLITEM, "FoundrySlider", 0, 154, 10, 100,10
CONTROL "",FIRSTCTLITEM+1, "FoundrySlider", 0, 154, 25, 100,10
CONTROL "",FIRSTCTLITEM+2, "FoundrySlider", 0, 154, 40, 100,10
CONTROL "",FIRSTCTLITEM+3, "FoundrySlider", 0, 154, 55, 100,10
CONTROL "",FIRSTCTLITEM+4, "FoundrySlider", 0, 154, 70, 100,10
CONTROL "",FIRSTCTLITEM+5, "FoundrySlider", 0, 154, 85, 100,10
CONTROL "",FIRSTCTLITEM+6, "FoundrySlider", 0, 154,100, 100,10
CONTROL "",FIRSTCTLITEM+7, "FoundrySlider", 0, 154,115, 100,10
 
EDITTEXT FIRSTCTLTEXTITEM, 269, 10, 24,12, ES_NUMBER|ES_RIGHT
EDITTEXT FIRSTCTLTEXTITEM+1, 269, 25, 24,12, ES_NUMBER|ES_RIGHT
EDITTEXT FIRSTCTLTEXTITEM+2, 269, 40, 24,12, ES_NUMBER|ES_RIGHT
EDITTEXT FIRSTCTLTEXTITEM+3, 269, 55, 24,12, ES_NUMBER|ES_RIGHT
EDITTEXT FIRSTCTLTEXTITEM+4, 269, 70, 24,12, ES_NUMBER|ES_RIGHT
EDITTEXT FIRSTCTLTEXTITEM+5, 269, 85, 24,12, ES_NUMBER|ES_RIGHT
EDITTEXT FIRSTCTLTEXTITEM+6, 269,100, 24,12, ES_NUMBER|ES_RIGHT
EDITTEXT FIRSTCTLTEXTITEM+7, 269,115, 24,12, ES_NUMBER|ES_RIGHT
 
PUSHBUTTON "Abbrechen", IDCANCEL, 206,137, 42,14
LTEXT "", PARAMAUTHORITEM, 10,137, 42,20
LTEXT "", PARAMCOPYITEM, 60,137, 140,20
END
 
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
ID_BUILDDLG DIALOG DISCARDABLE 150,50, 208,243
STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
205,3 → 327,55
 
PUSHBUTTON "Cancel", IDCANCEL, 106,219, 42,14
END
 
LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
ID_BUILDDLG DIALOG DISCARDABLE 150,50, 208,243
STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Eigenständigen Filter erzeugen"
FONT 8, "MS Sans Serif"
BEGIN
DEFPUSHBUTTON "OK...", IDOK, 156,219, 42,14
 
/* for initial values of the following EDITTEXT fields, see ui_build.c */
EDITTEXT CATEGORYITEM, 50, 10, 148,12
EDITTEXT TITLEITEM, 50, 25, 148,12
EDITTEXT COPYRIGHTITEM, 50, 40, 148,24, ES_MULTILINE|ES_WANTRETURN
EDITTEXT AUTHORITEM, 50, 67, 148,12
 
EDITTEXT FIRSTMAPNAMEITEM, 50, 92, 50,12
EDITTEXT FIRSTMAPNAMEITEM+1, 50,122, 50,12
EDITTEXT FIRSTMAPNAMEITEM+2, 50,152, 50,12
EDITTEXT FIRSTMAPNAMEITEM+3, 50,182, 50,12
 
EDITTEXT FIRSTCTLNAMEITEM, 154, 92, 50,12
EDITTEXT FIRSTCTLNAMEITEM+1, 154,107, 50,12
EDITTEXT FIRSTCTLNAMEITEM+2, 154,122, 50,12
EDITTEXT FIRSTCTLNAMEITEM+3, 154,137, 50,12
EDITTEXT FIRSTCTLNAMEITEM+4, 154,152, 50,12
EDITTEXT FIRSTCTLNAMEITEM+5, 154,167, 50,12
EDITTEXT FIRSTCTLNAMEITEM+6, 154,182, 50,12
EDITTEXT FIRSTCTLNAMEITEM+7, 154,197, 50,12
 
CHECKBOX "Map 0",FIRSTMAPCHECKITEM, 10, 92, 35,12
CHECKBOX "Map 1",FIRSTMAPCHECKITEM+1, 10,122, 35,12
CHECKBOX "Map 2",FIRSTMAPCHECKITEM+2, 10,152, 35,12
CHECKBOX "Map 3",FIRSTMAPCHECKITEM+3, 10,182, 35,12
 
CHECKBOX "ctl(0)",FIRSTCTLCHECKITEM, 114, 92, 35,12
CHECKBOX "ctl(1)",FIRSTCTLCHECKITEM+1, 114,107, 35,12
CHECKBOX "ctl(2)",FIRSTCTLCHECKITEM+2, 114,122, 35,12
CHECKBOX "ctl(3)",FIRSTCTLCHECKITEM+3, 114,137, 35,12
CHECKBOX "ctl(4)",FIRSTCTLCHECKITEM+4, 114,152, 35,12
CHECKBOX "ctl(5)",FIRSTCTLCHECKITEM+5, 114,167, 35,12
CHECKBOX "ctl(6)",FIRSTCTLCHECKITEM+6, 114,182, 35,12
CHECKBOX "ctl(7)",FIRSTCTLCHECKITEM+7, 114,197, 35,12
 
CHECKBOX "Filter schützen",PROTECTITEM, 10,219, 90,12
 
LTEXT "Kategorie:", 100, 10,10, 35,12
LTEXT "Titel:", 101, 10,25, 35,12
LTEXT "Copyright:", 102, 10,40, 35,12
LTEXT "Autor:", 103, 10,67, 35,12
 
PUSHBUTTON "Abbrechen", IDCANCEL, 106,219, 42,14
END