Subversion Repositories filter_foundry

Rev

Rev 536 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
259 daniel-mar 1
/*
2
    This file is part of "Filter Foundry", a filter plugin for Adobe Photoshop
536 daniel-mar 3
    Copyright (C) 2003-2009 Toby Thain, toby@telegraphics.net
550 daniel-mar 4
    Copyright (C) 2018-2023 Daniel Marschall, ViaThinkSoft
259 daniel-mar 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"
365 daniel-mar 24
#include "compat_string.h"
259 daniel-mar 25
 
26
int checksliders_result;
27
 
28
/* one-time initialisation of dialog box */
29
 
30
void builddlginit(DIALOGREF dp){
31
        int i;
32
 
550 daniel-mar 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]);
259 daniel-mar 39
        }
550 daniel-mar 40
        for(i=0;i<8;++i){
41
                SETCTLTEXT(dp,FIRSTCTLNAMEITEM+i,gdata->parm.szCtl[i]);
42
        }
259 daniel-mar 43
 
550 daniel-mar 44
        checksliders_result = checksliders(4);
259 daniel-mar 45
        for(i = 4; i--;){
46
                DISABLEDLGITEM(dp,FIRSTMAPCHECKITEM+i);
550 daniel-mar 47
                if(gdata->parm.map_used[i] || (checksliders_result & CHECKSLIDERS_MAP_AMBIGUOUS))
259 daniel-mar 48
                        CHECKDLGBUTTON(dp,FIRSTMAPCHECKITEM+i,true);
49
                else
50
                        HideDialogItem(dp,FIRSTMAPNAMEITEM+i);
51
        }
52
        for(i = 8; i--;){
53
                DISABLEDLGITEM(dp,FIRSTCTLCHECKITEM+i);
550 daniel-mar 54
                if((gdata->parm.ctl_used[i] || (checksliders_result & CHECKSLIDERS_CTL_AMBIGUOUS)) &&
259 daniel-mar 55
                   // When map() is activated, we don't need ctl labels,
56
                   // since the standalone filter will only show map labels
550 daniel-mar 57
                   !gdata->parm.map_used[i/2] &&
259 daniel-mar 58
                   (!(checksliders_result & CHECKSLIDERS_MAP_AMBIGUOUS))
59
                   )
60
                        CHECKDLGBUTTON(dp,FIRSTCTLCHECKITEM+i,true);
61
                else
62
                        HideDialogItem(dp,FIRSTCTLNAMEITEM+i);
63
        }
64
 
339 daniel-mar 65
        CHECKDLGBUTTON(dp, PROTECTITEM, 0); // TODO: should we remember the last setting?
66
 
259 daniel-mar 67
        SELECTDLGITEMTEXT(dp,TITLEITEM,0,-1);
68
}
69
 
518 daniel-mar 70
#define MAXFIELD 0x100
71
 
444 daniel-mar 72
Boolean containsUnicodeInput(DIALOGREF dp, int item) {
512 daniel-mar 73
        char sa[MAXFIELD + 1];
444 daniel-mar 74
        wchar_t sw[MAXFIELD + 1];
75
        size_t i;
259 daniel-mar 76
 
512 daniel-mar 77
        GetDlgItemTextA(dp, item, sa, MAXFIELD);
444 daniel-mar 78
        GetDlgItemTextW(dp, item, sw, MAXFIELD);
512 daniel-mar 79
        for (i = 0; i < strlen(sa); i++) {
80
                if (((wchar_t)sa[i] != sw[i]) && (sa[i] == '?')) {
444 daniel-mar 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
 
259 daniel-mar 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;
444 daniel-mar 107
        TCHAR fname[MAX_PATH + 1];
365 daniel-mar 108
        StandardFileReply sfr;
109
        NavReplyRecord reply;
444 daniel-mar 110
        #ifdef UNICODE
111
        Boolean unicode;
112
        #endif
113
        Boolean extCharset;
550 daniel-mar 114
        InternalState tmpState;
259 daniel-mar 115
 
116
        switch(item){
363 daniel-mar 117
#ifdef MAC_ENV
118
        case ok:
119
#else
259 daniel-mar 120
        case IDOK:
363 daniel-mar 121
#endif
259 daniel-mar 122
                // Do a few checks first
444 daniel-mar 123
                GetDlgItemTextA(dp, CATEGORYITEM, s, MAXFIELD);
259 daniel-mar 124
                if (strlen(s) == 0) {
492 daniel-mar 125
                        simplealert_id(MSG_CATEGORY_EMPTY_ERR_ID);
363 daniel-mar 126
                        return true; // don't continue (i.e. don't call EndDialog). Let the user correct the input
259 daniel-mar 127
                }
444 daniel-mar 128
                GetDlgItemTextA(dp, TITLEITEM, s, MAXFIELD);
259 daniel-mar 129
                if (strlen(s) == 0) {
492 daniel-mar 130
                        simplealert_id(MSG_TITLE_EMPTY_ERR_ID);
363 daniel-mar 131
                        return true; // don't continue (i.e. don't call EndDialog). Let the user correct the input
259 daniel-mar 132
                }
133
 
444 daniel-mar 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) {
550 daniel-mar 150
                        if (gdata->parm.ctl_used[i] || (checksliders_result & CHECKSLIDERS_CTL_AMBIGUOUS)) {
444 daniel-mar 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) {
550 daniel-mar 158
                        if (gdata->parm.map_used[i] || (checksliders_result & CHECKSLIDERS_MAP_AMBIGUOUS)) {
444 daniel-mar 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) {
512 daniel-mar 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)
492 daniel-mar 170
                        simplewarning_id(MSG_UNICODE_DATA_WARNING_ID);
444 daniel-mar 171
                }
172
                else
173
                #endif
174
                if (extCharset) {
492 daniel-mar 175
                        simplewarning_id(MSG_EXTCHARSET_DATA_WARNING_ID);
444 daniel-mar 176
                }
177
 
259 daniel-mar 178
                // Now begin
444 daniel-mar 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);
259 daniel-mar 183
                needui = 0;
376 daniel-mar 184
                // Sliders
259 daniel-mar 185
                for(i = 0; i < 8; ++i){
550 daniel-mar 186
                        gdata->parm.ctl_used[i] = gdata->parm.ctl_used[i] || (checksliders_result & CHECKSLIDERS_CTL_AMBIGUOUS);
259 daniel-mar 187
                        needui |= gdata->parm.ctl_used[i];
550 daniel-mar 188
                        GetDlgItemTextA(dp, FIRSTCTLNAMEITEM + i, gdata->parm.szCtl[i], MAXFIELD);
259 daniel-mar 189
                }
376 daniel-mar 190
                // Maps
191
                for (i = 0; i < 4; ++i) {
550 daniel-mar 192
                        gdata->parm.map_used[i] = gdata->parm.map_used[i] || (checksliders_result & CHECKSLIDERS_MAP_AMBIGUOUS);
259 daniel-mar 193
                        needui |= gdata->parm.map_used[i];
444 daniel-mar 194
                        GetDlgItemTextA(dp, FIRSTMAPNAMEITEM + i, gdata->parm.szMap[i], MAXFIELD);
376 daniel-mar 195
                }
550 daniel-mar 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;
259 daniel-mar 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
456 daniel-mar 203
                gdata->obfusc = (Boolean)ISDLGBUTTONCHECKED(dp,PROTECTITEM);
365 daniel-mar 204
 
444 daniel-mar 205
                GetDlgItemText(dp, TITLEITEM, fname, MAXFIELD);
206
 
493 daniel-mar 207
                {
496 daniel-mar 208
                        TCHAR* tmp1;
209
                        TCHAR* filters, *title;
210
                        Boolean makeDlgRet;
493 daniel-mar 211
 
496 daniel-mar 212
                        title = (TCHAR*)malloc(1024);
213
                        if (title == NULL) return false;
493 daniel-mar 214
 
496 daniel-mar 215
                        filters = (TCHAR*)malloc(4096);
216
                        if (filters == NULL) return false;
217
                        memset(filters, 0, 4096);
218
                        tmp1 = filters;
493 daniel-mar 219
 
496 daniel-mar 220
                        FF_GetMsg(title, MSG_MAKE_FILTER_SETTINGS_TITLE_ID);
493 daniel-mar 221
 
496 daniel-mar 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
 
493 daniel-mar 230
                        #ifdef MACMACHO
231
                        strcat(fname, ".plugin");
232
                        #endif
496 daniel-mar 233
 
234
                        makeDlgRet = putfile(
235
#ifdef MAC_ENV
498 daniel-mar 236
                                "\pMake standalone filter", // "\p" means "Pascal string" // TODO (Not important yet): TRANSLATE
237
                                myc2pstr(_strdup(fname)), // TODO: memory leak?
493 daniel-mar 238
                                PS_FILTER_FILETYPE, kPhotoshopSignature, &reply, &sfr,
239
                                "8bf", &filters[0], 1
496 daniel-mar 240
#else
241
                                title,
493 daniel-mar 242
                                fname,
243
                                PS_FILTER_FILETYPE, kPhotoshopSignature, &reply, &sfr,
244
                                TEXT("8bf"),
245
                                &filters[0], 1
246
                                , (HWND)dp
496 daniel-mar 247
#endif
248
                        );
536 daniel-mar 249
 
496 daniel-mar 250
                        free(filters);
251
                        free(title);
252
 
253
                        if (makeDlgRet) {
550 daniel-mar 254
                                parm_cleanup();
493 daniel-mar 255
                                make_standalone(&sfr);
256
                        }
365 daniel-mar 257
                }
258
 
550 daniel-mar 259
                restoreInternalState(tmpState);
260
 
381 daniel-mar 261
                return false; // end dialog
363 daniel-mar 262
#ifdef MAC_ENV
263
        case cancel:
264
#else
259 daniel-mar 265
        case IDCANCEL:
363 daniel-mar 266
#endif
259 daniel-mar 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
}