Subversion Repositories filter_foundry

Rev

Rev 536 | 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.net
  4.     Copyright (C) 2018-2023 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 checksliders_result;
  27.  
  28. /* one-time initialisation of dialog box */
  29.  
  30. void builddlginit(DIALOGREF dp){
  31.         int i;
  32.  
  33.         SETCTLTEXT(dp,CATEGORYITEM, gdata->parm.szCategory);
  34.         SETCTLTEXT(dp,TITLEITEM,    gdata->parm.szTitle);
  35.         SETCTLTEXT(dp,COPYRIGHTITEM,gdata->parm.szCopyright);
  36.         SETCTLTEXT(dp,AUTHORITEM,   gdata->parm.szAuthor);
  37.         for(i=0;i<4;++i){
  38.                 SETCTLTEXT(dp,FIRSTMAPNAMEITEM+i,gdata->parm.szMap[i]);
  39.         }
  40.         for(i=0;i<8;++i){
  41.                 SETCTLTEXT(dp,FIRSTCTLNAMEITEM+i,gdata->parm.szCtl[i]);
  42.         }
  43.  
  44.         checksliders_result = checksliders(4);
  45.         for(i = 4; i--;){
  46.                 DISABLEDLGITEM(dp,FIRSTMAPCHECKITEM+i);
  47.                 if(gdata->parm.map_used[i] || (checksliders_result & CHECKSLIDERS_MAP_AMBIGUOUS))
  48.                         CHECKDLGBUTTON(dp,FIRSTMAPCHECKITEM+i,true);
  49.                 else
  50.                         HideDialogItem(dp,FIRSTMAPNAMEITEM+i);
  51.         }
  52.         for(i = 8; i--;){
  53.                 DISABLEDLGITEM(dp,FIRSTCTLCHECKITEM+i);
  54.                 if((gdata->parm.ctl_used[i] || (checksliders_result & CHECKSLIDERS_CTL_AMBIGUOUS)) &&
  55.                    // When map() is activated, we don't need ctl labels,
  56.                    // since the standalone filter will only show map labels
  57.                    !gdata->parm.map_used[i/2] &&
  58.                    (!(checksliders_result & CHECKSLIDERS_MAP_AMBIGUOUS))
  59.                    )
  60.                         CHECKDLGBUTTON(dp,FIRSTCTLCHECKITEM+i,true);
  61.                 else
  62.                         HideDialogItem(dp,FIRSTCTLNAMEITEM+i);
  63.         }
  64.  
  65.         CHECKDLGBUTTON(dp, PROTECTITEM, 0); // TODO: should we remember the last setting?
  66.  
  67.         SELECTDLGITEMTEXT(dp,TITLEITEM,0,-1);
  68. }
  69.  
  70. #define MAXFIELD 0x100
  71.  
  72. Boolean containsUnicodeInput(DIALOGREF dp, int item) {
  73.         char sa[MAXFIELD + 1];
  74.         wchar_t sw[MAXFIELD + 1];
  75.         size_t i;
  76.  
  77.         GetDlgItemTextA(dp, item, sa, MAXFIELD);
  78.         GetDlgItemTextW(dp, item, sw, MAXFIELD);
  79.         for (i = 0; i < strlen(sa); i++) {
  80.                 if (((wchar_t)sa[i] != sw[i]) && (sa[i] == '?')) {
  81.                         return true;
  82.                 }
  83.         }
  84.  
  85.         return false;
  86. }
  87.  
  88. Boolean containsExtCharset(DIALOGREF dp, int item) {
  89.         char s[MAXFIELD + 1];
  90.         size_t i;
  91.  
  92.         GetDlgItemTextA(dp, item, s, MAXFIELD);
  93.         for (i = 0; i < strlen(s); i++) {
  94.                 if ((unsigned char)s[i] > (unsigned char)0x7F) {
  95.                         return true;
  96.                 }
  97.         }
  98.  
  99.         return false;
  100. }
  101.  
  102. /* process an item hit. return false if the dialog is finished; otherwise return true. */
  103.  
  104. Boolean builddlgitem(DIALOGREF dp,int item){
  105.         char s[MAXFIELD+1];
  106.         int i,needui;
  107.         TCHAR fname[MAX_PATH + 1];
  108.         StandardFileReply sfr;
  109.         NavReplyRecord reply;
  110.         #ifdef UNICODE
  111.         Boolean unicode;
  112.         #endif
  113.         Boolean extCharset;
  114.         InternalState tmpState;
  115.  
  116.         switch(item){
  117. #ifdef MAC_ENV
  118.         case ok:
  119. #else
  120.         case IDOK:
  121. #endif
  122.                 // Do a few checks first
  123.                 GetDlgItemTextA(dp, CATEGORYITEM, s, MAXFIELD);
  124.                 if (strlen(s) == 0) {
  125.                         simplealert_id(MSG_CATEGORY_EMPTY_ERR_ID);
  126.                         return true; // don't continue (i.e. don't call EndDialog). Let the user correct the input
  127.                 }
  128.                 GetDlgItemTextA(dp, TITLEITEM, s, MAXFIELD);
  129.                 if (strlen(s) == 0) {
  130.                         simplealert_id(MSG_TITLE_EMPTY_ERR_ID);
  131.                         return true; // don't continue (i.e. don't call EndDialog). Let the user correct the input
  132.                 }
  133.  
  134.                 // The PiPL and PARM structure does only define single byte charsets
  135.                 #ifdef UNICODE
  136.                 unicode =
  137.                         containsUnicodeInput(dp, CATEGORYITEM) ||
  138.                         containsUnicodeInput(dp, TITLEITEM) ||
  139.                         containsUnicodeInput(dp, COPYRIGHTITEM) ||
  140.                         containsUnicodeInput(dp, AUTHORITEM);
  141.                 #endif
  142.                 extCharset =
  143.                         containsExtCharset(dp, CATEGORYITEM) ||
  144.                         containsExtCharset(dp, TITLEITEM) ||
  145.                         containsExtCharset(dp, COPYRIGHTITEM) ||
  146.                         containsExtCharset(dp, AUTHORITEM);
  147.  
  148.                 // The AETE structure does only define single byte charsets
  149.                 for (i = 0; i < 8; ++i) {
  150.                         if (gdata->parm.ctl_used[i] || (checksliders_result & CHECKSLIDERS_CTL_AMBIGUOUS)) {
  151.                                 #ifdef UNICODE
  152.                                 unicode |= containsUnicodeInput(dp, FIRSTCTLNAMEITEM + i);
  153.                                 #endif
  154.                                 extCharset |= containsExtCharset(dp, FIRSTCTLNAMEITEM + i);
  155.                         }
  156.                 }
  157.                 for (i = 0; i < 4; ++i) {
  158.                         if (gdata->parm.map_used[i] || (checksliders_result & CHECKSLIDERS_MAP_AMBIGUOUS)) {
  159.                                 #ifdef UNICODE
  160.                                 unicode |= containsUnicodeInput(dp, FIRSTMAPNAMEITEM + i);
  161.                                 #endif
  162.                                 extCharset |= containsExtCharset(dp, FIRSTMAPNAMEITEM + i);
  163.                         }
  164.                 }
  165.  
  166.                 #ifdef UNICODE
  167.                 if (unicode) {
  168.                         // "unicode" means that there are characters that will be converted to "?" when converting wchar_t* => char*
  169.                         // 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)
  170.                         simplewarning_id(MSG_UNICODE_DATA_WARNING_ID);
  171.                 }
  172.                 else
  173.                 #endif
  174.                 if (extCharset) {
  175.                         simplewarning_id(MSG_EXTCHARSET_DATA_WARNING_ID);
  176.                 }
  177.  
  178.                 // Now begin
  179.                 GetDlgItemTextA(dp,CATEGORYITEM,gdata->parm.szCategory,MAXFIELD-4/*ProtectFlag*/);
  180.                 GetDlgItemTextA(dp,TITLEITEM,gdata->parm.szTitle,MAXFIELD);
  181.                 GetDlgItemTextA(dp,COPYRIGHTITEM,gdata->parm.szCopyright,MAXFIELD);
  182.                 GetDlgItemTextA(dp,AUTHORITEM,gdata->parm.szAuthor,MAXFIELD);
  183.                 needui = 0;
  184.                 // Sliders
  185.                 for(i = 0; i < 8; ++i){
  186.                         gdata->parm.ctl_used[i] = gdata->parm.ctl_used[i] || (checksliders_result & CHECKSLIDERS_CTL_AMBIGUOUS);
  187.                         needui |= gdata->parm.ctl_used[i];
  188.                         GetDlgItemTextA(dp, FIRSTCTLNAMEITEM + i, gdata->parm.szCtl[i], MAXFIELD);
  189.                 }
  190.                 // Maps
  191.                 for (i = 0; i < 4; ++i) {
  192.                         gdata->parm.map_used[i] = gdata->parm.map_used[i] || (checksliders_result & CHECKSLIDERS_MAP_AMBIGUOUS);
  193.                         needui |= gdata->parm.map_used[i];
  194.                         GetDlgItemTextA(dp, FIRSTMAPNAMEITEM + i, gdata->parm.szMap[i], MAXFIELD);
  195.                 }
  196.  
  197.                 tmpState = saveInternalState(); // the standalone flag and obfuscation must not be preserved, otherwise we cannot continue editing the filter
  198.  
  199.                 gdata->parm.standalone = 1;
  200.                 gdata->parm.popDialog = needui; //true if need to pop a parameter dialog
  201.                 gdata->parm.unknown1 = gdata->parm.unknown2 = gdata->parm.unknown3 = 0;
  202.                 gdata->parm.iProtected = ISDLGBUTTONCHECKED(dp,PROTECTITEM); // == 1 means protected
  203.                 gdata->obfusc = (Boolean)ISDLGBUTTONCHECKED(dp,PROTECTITEM);
  204.  
  205.                 GetDlgItemText(dp, TITLEITEM, fname, MAXFIELD);
  206.  
  207.                 {
  208.                         TCHAR* tmp1;
  209.                         TCHAR* filters, *title;
  210.                         Boolean makeDlgRet;
  211.  
  212.                         title = (TCHAR*)malloc(1024);
  213.                         if (title == NULL) return false;
  214.  
  215.                         filters = (TCHAR*)malloc(4096);
  216.                         if (filters == NULL) return false;
  217.                         memset(filters, 0, 4096);
  218.                         tmp1 = filters;
  219.  
  220.                         FF_GetMsg(title, MSG_MAKE_FILTER_SETTINGS_TITLE_ID);
  221.  
  222.                         strcpy_advance_id(&tmp1, MSG_MAKE_8BF_ID);
  223.                         strcpy_advance(&tmp1, (TCHAR*)TEXT(" (*.8bf)")); tmp1++;
  224.                         strcpy_advance(&tmp1, (TCHAR*)TEXT("*.8bf")); tmp1++;
  225.  
  226.                         strcpy_advance_id(&tmp1, MSG_ALL_FILES_ID);
  227.                         strcpy_advance(&tmp1, (TCHAR*)TEXT(" (*.*)")); tmp1++;
  228.                         strcpy_advance(&tmp1, (TCHAR*)TEXT("*.*")); tmp1++;
  229.  
  230.                         #ifdef MACMACHO
  231.                         strcat(fname, ".plugin");
  232.                         #endif
  233.  
  234.                         makeDlgRet = putfile(
  235. #ifdef MAC_ENV
  236.                                 "\pMake standalone filter", // "\p" means "Pascal string" // TODO (Not important yet): TRANSLATE
  237.                                 myc2pstr(_strdup(fname)), // TODO: memory leak?
  238.                                 PS_FILTER_FILETYPE, kPhotoshopSignature, &reply, &sfr,
  239.                                 "8bf", &filters[0], 1
  240. #else
  241.                                 title,
  242.                                 fname,
  243.                                 PS_FILTER_FILETYPE, kPhotoshopSignature, &reply, &sfr,
  244.                                 TEXT("8bf"),
  245.                                 &filters[0], 1
  246.                                 , (HWND)dp
  247. #endif
  248.                         );
  249.  
  250.                         free(filters);
  251.                         free(title);
  252.  
  253.                         if (makeDlgRet) {
  254.                                 parm_cleanup();
  255.                                 make_standalone(&sfr);
  256.                         }
  257.                 }
  258.  
  259.                 restoreInternalState(tmpState);
  260.  
  261.                 return false; // end dialog
  262. #ifdef MAC_ENV
  263.         case cancel:
  264. #else
  265.         case IDCANCEL:
  266. #endif
  267.                 return false; // end dialog
  268.         case PROTECTITEM:
  269.                 CHECKDLGBUTTON(dp, item, ISDLGBUTTONCHECKED(dp,item) ^ 1);
  270.                 break;
  271.         }
  272.  
  273.         return true; // keep going
  274. }
  275.