Subversion Repositories filter_foundry

Rev

Rev 511 | Rev 536 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. /*
  2.     This file is part of "Filter Foundry", a filter plugin for Adobe Photoshop
  3.     Copyright (C) 2003-2009 Toby Thain, toby@telegraphics.com.au
  4.     Copyright (C) 2018-2022 Daniel Marschall, ViaThinkSoft
  5.  
  6.     This program is free software; you can redistribute it and/or modify
  7.     it under the terms of the GNU General Public License as published by
  8.     the Free Software Foundation; either version 2 of the License, or
  9.     (at your option) any later version.
  10.  
  11.     This program is distributed in the hope that it will be useful,
  12.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.     GNU General Public License for more details.
  15.  
  16.     You should have received a copy of the GNU General Public License
  17.     along with this program; if not, write to the Free Software
  18.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  19. */
  20.  
  21. /* This is PLATFORM INDEPENDENT user interface code - mainly dialog logic */
  22.  
  23. #include "ff.h"
  24. #include "compat_string.h"
  25.  
  26. int ctls[8],maps[4];
  27. int checksliders_result;
  28.  
  29. /* one-time initialisation of dialog box */
  30.  
  31. void builddlginit(DIALOGREF dp){
  32.         int i;
  33.         char s[0x100];
  34.  
  35.         if(gdata->parmloaded){
  36.                 SETCTLTEXT(dp,CATEGORYITEM, gdata->parm.szCategory);
  37.                 SETCTLTEXT(dp,TITLEITEM,    gdata->parm.szTitle);
  38.                 SETCTLTEXT(dp,COPYRIGHTITEM,gdata->parm.szCopyright);
  39.                 SETCTLTEXT(dp,AUTHORITEM,   gdata->parm.szAuthor);
  40.                 for(i=0;i<4;++i){
  41.                         SETCTLTEXT(dp,FIRSTMAPNAMEITEM+i,gdata->parm.szMap[i]);
  42.                 }
  43.                 for(i=0;i<8;++i){
  44.                         SETCTLTEXT(dp,FIRSTCTLNAMEITEM+i,gdata->parm.szCtl[i]);
  45.                 }
  46.         }else{
  47.                 /* strictly speaking this is not needed on the Mac,
  48.                    we can set initial values statically in the rez description */
  49.                 SETCTLTEXT(dp,CATEGORYITEM, "Filter Foundry");
  50.                 SETCTLTEXT(dp,TITLEITEM,    "Untitled");
  51.                 SETCTLTEXT(dp,COPYRIGHTITEM,""); //"Filter Foundry Copyright (C) 2003-2009 Toby Thain, 2018-" RELEASE_YEAR " Daniel Marschall"
  52.                 SETCTLTEXT(dp,AUTHORITEM,   "Anonymous");
  53.                 strcpy(s,"Map X");
  54.                 for(i = 0; i < 4; ++i){
  55.                         s[4] = (char)('0' + i);
  56.                         SETCTLTEXT(dp,FIRSTMAPNAMEITEM+i,s);
  57.                 }
  58.                 strcpy(s,"ctl(X)");
  59.                 for(i = 0; i < 8; ++i){
  60.                         s[4] = (char)('0' + i);
  61.                         SETCTLTEXT(dp,FIRSTCTLNAMEITEM+i,s);
  62.                 }
  63.         }
  64.  
  65.         checksliders_result = checksliders(4,ctls,maps);
  66.         for(i = 4; i--;){
  67.                 DISABLEDLGITEM(dp,FIRSTMAPCHECKITEM+i);
  68.                 if(maps[i] || (checksliders_result & CHECKSLIDERS_MAP_AMBIGUOUS))
  69.                         CHECKDLGBUTTON(dp,FIRSTMAPCHECKITEM+i,true);
  70.                 else
  71.                         HideDialogItem(dp,FIRSTMAPNAMEITEM+i);
  72.         }
  73.         for(i = 8; i--;){
  74.                 DISABLEDLGITEM(dp,FIRSTCTLCHECKITEM+i);
  75.                 if((ctls[i] || (checksliders_result & CHECKSLIDERS_CTL_AMBIGUOUS)) &&
  76.                    // When map() is activated, we don't need ctl labels,
  77.                    // since the standalone filter will only show map labels
  78.                    !maps[i/2] &&
  79.                    (!(checksliders_result & CHECKSLIDERS_MAP_AMBIGUOUS))
  80.                    )
  81.                         CHECKDLGBUTTON(dp,FIRSTCTLCHECKITEM+i,true);
  82.                 else
  83.                         HideDialogItem(dp,FIRSTCTLNAMEITEM+i);
  84.         }
  85.  
  86.         CHECKDLGBUTTON(dp, PROTECTITEM, 0); // TODO: should we remember the last setting?
  87.  
  88.         SELECTDLGITEMTEXT(dp,TITLEITEM,0,-1);
  89. }
  90.  
  91. Boolean containsUnicodeInput(DIALOGREF dp, int item) {
  92.         enum { MAXFIELD = 0x100 };
  93.         char sa[MAXFIELD + 1];
  94.         wchar_t sw[MAXFIELD + 1];
  95.         size_t i;
  96.  
  97.         GetDlgItemTextA(dp, item, sa, MAXFIELD);
  98.         GetDlgItemTextW(dp, item, sw, MAXFIELD);
  99.         for (i = 0; i < strlen(sa); i++) {
  100.                 if (((wchar_t)sa[i] != sw[i]) && (sa[i] == '?')) {
  101.                         return true;
  102.                 }
  103.         }
  104.  
  105.         return false;
  106. }
  107.  
  108. Boolean containsExtCharset(DIALOGREF dp, int item) {
  109.         enum { MAXFIELD = 0x100 };
  110.         char s[MAXFIELD + 1];
  111.         size_t i;
  112.  
  113.         GetDlgItemTextA(dp, item, s, MAXFIELD);
  114.         for (i = 0; i < strlen(s); i++) {
  115.                 if ((unsigned char)s[i] > (unsigned char)0x7F) {
  116.                         return true;
  117.                 }
  118.         }
  119.  
  120.         return false;
  121. }
  122.  
  123. /* process an item hit. return false if the dialog is finished; otherwise return true. */
  124.  
  125. Boolean builddlgitem(DIALOGREF dp,int item){
  126.         enum{MAXFIELD=0x100};
  127.         char s[MAXFIELD+1];
  128.         int i,needui;
  129.         TCHAR fname[MAX_PATH + 1];
  130.         StandardFileReply sfr;
  131.         NavReplyRecord reply;
  132.         #ifdef UNICODE
  133.         Boolean unicode;
  134.         #endif
  135.         Boolean extCharset;
  136.  
  137.         switch(item){
  138. #ifdef MAC_ENV
  139.         case ok:
  140. #else
  141.         case IDOK:
  142. #endif
  143.                 // Do a few checks first
  144.                 GetDlgItemTextA(dp, CATEGORYITEM, s, MAXFIELD);
  145.                 if (strlen(s) == 0) {
  146.                         simplealert_id(MSG_CATEGORY_EMPTY_ERR_ID);
  147.                         return true; // don't continue (i.e. don't call EndDialog). Let the user correct the input
  148.                 }
  149.                 GetDlgItemTextA(dp, TITLEITEM, s, MAXFIELD);
  150.                 if (strlen(s) == 0) {
  151.                         simplealert_id(MSG_TITLE_EMPTY_ERR_ID);
  152.                         return true; // don't continue (i.e. don't call EndDialog). Let the user correct the input
  153.                 }
  154.  
  155.                 // The PiPL and PARM structure does only define single byte charsets
  156.                 #ifdef UNICODE
  157.                 unicode =
  158.                         containsUnicodeInput(dp, CATEGORYITEM) ||
  159.                         containsUnicodeInput(dp, TITLEITEM) ||
  160.                         containsUnicodeInput(dp, COPYRIGHTITEM) ||
  161.                         containsUnicodeInput(dp, AUTHORITEM);
  162.                 #endif
  163.                 extCharset =
  164.                         containsExtCharset(dp, CATEGORYITEM) ||
  165.                         containsExtCharset(dp, TITLEITEM) ||
  166.                         containsExtCharset(dp, COPYRIGHTITEM) ||
  167.                         containsExtCharset(dp, AUTHORITEM);
  168.  
  169.                 // The AETE structure does only define single byte charsets
  170.                 for (i = 0; i < 8; ++i) {
  171.                         if (ctls[i] || (checksliders_result & CHECKSLIDERS_CTL_AMBIGUOUS)) {
  172.                                 #ifdef UNICODE
  173.                                 unicode |= containsUnicodeInput(dp, FIRSTCTLNAMEITEM + i);
  174.                                 #endif
  175.                                 extCharset |= containsExtCharset(dp, FIRSTCTLNAMEITEM + i);
  176.                         }
  177.                 }
  178.                 for (i = 0; i < 4; ++i) {
  179.                         if (maps[i] || (checksliders_result & CHECKSLIDERS_MAP_AMBIGUOUS)) {
  180.                                 #ifdef UNICODE
  181.                                 unicode |= containsUnicodeInput(dp, FIRSTMAPNAMEITEM + i);
  182.                                 #endif
  183.                                 extCharset |= containsExtCharset(dp, FIRSTMAPNAMEITEM + i);
  184.                         }
  185.                 }
  186.  
  187.                 #ifdef UNICODE
  188.                 if (unicode) {
  189.                         // "unicode" means that there are characters that will be converted to "?" when converting wchar_t* => char*
  190.                         // Note that this is might be not true if your the characters are mapped in your current default Ansi Charset (e.g. German Umlauts on a German computer)
  191.                         simplewarning_id(MSG_UNICODE_DATA_WARNING_ID);
  192.                 }
  193.                 else
  194.                 #endif
  195.                 if (extCharset) {
  196.                         simplewarning_id(MSG_EXTCHARSET_DATA_WARNING_ID);
  197.                 }
  198.  
  199.                 // Now begin
  200.                 memset(&gdata->parm,0,sizeof(PARM_T));
  201.                 GetDlgItemTextA(dp,CATEGORYITEM,gdata->parm.szCategory,MAXFIELD-4/*ProtectFlag*/);
  202.                 GetDlgItemTextA(dp,TITLEITEM,gdata->parm.szTitle,MAXFIELD);
  203.                 GetDlgItemTextA(dp,COPYRIGHTITEM,gdata->parm.szCopyright,MAXFIELD);
  204.                 GetDlgItemTextA(dp,AUTHORITEM,gdata->parm.szAuthor,MAXFIELD);
  205.                 gdata->parm.cbSize = PARM_SIZE;
  206.                 gdata->parm.standalone = 1;  //0=original FF, 1=standalone filter
  207.                 needui = 0;
  208.                 // Sliders
  209.                 for(i = 0; i < 8; ++i){
  210.                         gdata->parm.val[i] = slider[i];
  211.                         gdata->parm.ctl_used[i] = ctls[i] || (checksliders_result & CHECKSLIDERS_CTL_AMBIGUOUS);
  212.                         needui |= gdata->parm.ctl_used[i];
  213.                         GetDlgItemTextA(dp,FIRSTCTLNAMEITEM+i, gdata->parm.szCtl[i],MAXFIELD);
  214.                 }
  215.                 // Maps
  216.                 for (i = 0; i < 4; ++i) {
  217.                         gdata->parm.map_used[i] = maps[i] || (checksliders_result & CHECKSLIDERS_MAP_AMBIGUOUS);
  218.                         needui |= gdata->parm.map_used[i];
  219.                         GetDlgItemTextA(dp, FIRSTMAPNAMEITEM + i, gdata->parm.szMap[i], MAXFIELD);
  220.                 }
  221.                 // Expressions
  222.                 for (i = 0; i < 4; ++i) {
  223.                         if (strlen(expr[i]) >= sizeof(gdata->parm.szFormula[i])) {
  224.                                 if (i == 0) {
  225.                                         simplealert_id(MSG_FORMULA_R_1023_TRUNCATED_ID);
  226.                                 }
  227.                                 else if (i == 1) {
  228.                                         simplealert_id(MSG_FORMULA_G_1023_TRUNCATED_ID);
  229.                                 }
  230.                                 else if (i == 2) {
  231.                                         simplealert_id(MSG_FORMULA_B_1023_TRUNCATED_ID);
  232.                                 }
  233.                                 else if (i == 3) {
  234.                                         simplealert_id(MSG_FORMULA_A_1023_TRUNCATED_ID);
  235.                                 }
  236.                                 expr[i][sizeof(gdata->parm.szFormula[i]) - 1] = '\0';
  237.                         }
  238.                         strcpy(gdata->parm.szFormula[i], expr[i]);
  239.                 }
  240.                 gdata->parm.popDialog = needui; //true if need to pop a parameter dialog
  241.                 gdata->parm.unknown1 = gdata->parm.unknown2 = gdata->parm.unknown3 = 0;
  242.                 gdata->parm.iProtected = ISDLGBUTTONCHECKED(dp,PROTECTITEM); // == 1 means protected
  243.                 gdata->obfusc = (Boolean)ISDLGBUTTONCHECKED(dp,PROTECTITEM);
  244.  
  245.                 GetDlgItemText(dp, TITLEITEM, fname, MAXFIELD);
  246.  
  247.                 {
  248.                         TCHAR* tmp1;
  249.                         TCHAR* filters, *title;
  250.                         Boolean makeDlgRet;
  251.  
  252.                         title = (TCHAR*)malloc(1024);
  253.                         if (title == NULL) return false;
  254.  
  255.                         filters = (TCHAR*)malloc(4096);
  256.                         if (filters == NULL) return false;
  257.                         memset(filters, 0, 4096);
  258.                         tmp1 = filters;
  259.  
  260.                         FF_GetMsg(title, MSG_MAKE_FILTER_SETTINGS_TITLE_ID);
  261.  
  262.                         strcpy_advance_id(&tmp1, MSG_MAKE_8BF_ID);
  263.                         strcpy_advance(&tmp1, (TCHAR*)TEXT(" (*.8bf)")); tmp1++;
  264.                         strcpy_advance(&tmp1, (TCHAR*)TEXT("*.8bf")); tmp1++;
  265.  
  266.                         strcpy_advance_id(&tmp1, MSG_ALL_FILES_ID);
  267.                         strcpy_advance(&tmp1, (TCHAR*)TEXT(" (*.*)")); tmp1++;
  268.                         strcpy_advance(&tmp1, (TCHAR*)TEXT("*.*")); tmp1++;
  269.  
  270.                         #ifdef MACMACHO
  271.                         strcat(fname, ".plugin");
  272.                         #endif
  273.  
  274.                         makeDlgRet = putfile(
  275. #ifdef MAC_ENV
  276.                                 "\pMake standalone filter", // "\p" means "Pascal string" // TODO (Not important yet): TRANSLATE
  277.                                 myc2pstr(_strdup(fname)), // TODO: memory leak?
  278.                                 PS_FILTER_FILETYPE, kPhotoshopSignature, &reply, &sfr,
  279.                                 "8bf", &filters[0], 1
  280. #else
  281.                                 title,
  282.                                 fname,
  283.                                 PS_FILTER_FILETYPE, kPhotoshopSignature, &reply, &sfr,
  284.                                 TEXT("8bf"),
  285.                                 &filters[0], 1
  286.                                 , (HWND)dp
  287. #endif
  288.                         );
  289.                        
  290.                         free(filters);
  291.                         free(title);
  292.  
  293.                         if (makeDlgRet) {
  294.                                 make_standalone(&sfr);
  295.                         }
  296.                         else {
  297.                                 return true; // keep going. Let the user correct their input
  298.                         }
  299.                 }
  300.  
  301.                 return false; // end dialog
  302. #ifdef MAC_ENV
  303.         case cancel:
  304. #else
  305.         case IDCANCEL:
  306. #endif
  307.                 return false; // end dialog
  308.         case PROTECTITEM:
  309.                 CHECKDLGBUTTON(dp, item, ISDLGBUTTONCHECKED(dp,item) ^ 1);
  310.                 break;
  311.         }
  312.  
  313.         return true; // keep going
  314. }
  315.