1/*
2**  FilterEditorWindow.m
3**
4**  Copyright (c) 2001-2007
5**
6**  Author: Ludovic Marcotte <ludovic@Sophos.ca>
7**
8**  This program is free software; you can redistribute it and/or modify
9**  it under the terms of the GNU General Public License as published by
10**  the Free Software Foundation; either version 2 of the License, or
11**  (at your option) any later version.
12**
13**  This program is distributed in the hope that it will be useful,
14**  but WITHOUT ANY WARRANTY; without even the implied warranty of
15**  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16**  GNU General Public License for more details.
17**
18**  You should have received a copy of the GNU General Public License
19**  along with this program.  If not, see <http://www.gnu.org/licenses/>.
20*/
21
22#include "FilterEditorWindow.h"
23
24#include "Constants.h"
25#include "LabelWidget.h"
26
27//
28//
29//
30@implementation FilterEditorWindow
31
32- (void) dealloc
33{
34  NSDebugLog(@"FilterEditorWindow: -dealloc");
35
36  RELEASE(descriptionField);
37  RELEASE(activeButton);
38
39  RELEASE(filterTypeMatrix);
40
41  // External program
42  RELEASE(externalProgramButton);
43  RELEASE(externalProgramField);
44  RELEASE(externalProgramPopUpButton);
45
46  RELEASE(criteriaBox);
47
48  // First criteria
49  RELEASE(criteriaSourcePopUpButtonA);
50  RELEASE(criteriaFindOperationPopUpButtonA);
51  RELEASE(criteriaStringFieldA);
52  RELEASE(criteriaPopUpButtonA);
53
54  // Second criteria
55  RELEASE(criteriaConditionPopUpButtonB);
56  RELEASE(criteriaSourcePopUpButtonB);
57  RELEASE(criteriaFindOperationPopUpButtonB);
58  RELEASE(criteriaStringFieldB);
59  RELEASE(criteriaPopUpButtonB);
60
61  // Third criteria
62  RELEASE(criteriaConditionPopUpButtonC);
63  RELEASE(criteriaSourcePopUpButtonC);
64  RELEASE(criteriaFindOperationPopUpButtonC);
65  RELEASE(criteriaStringFieldC);
66  RELEASE(criteriaPopUpButtonC);
67
68  RELEASE(matrix);
69  RELEASE(actionColorWell);
70  RELEASE(actionFolderNamePopUpButton);
71  RELEASE(actionEMailStringPopUpButton);
72  RELEASE(actionEMailStringField);
73  RELEASE(actionEMailStringButton);
74
75  RELEASE(pathToSoundField);
76  RELEASE(chooseFileButton);
77
78  [super dealloc];
79}
80
81
82//
83//
84//
85- (void) layoutWindow
86{
87  LabelWidget *descriptionLabel, *filterTypeLabel, *externalProgramLabel1, *externalProgramLabel2;
88  NSButton *okButton, *cancelButton;
89
90  NSButtonCell *cell;
91  NSBox *box;
92
93  // Descriction & activate
94  descriptionLabel = [LabelWidget labelWidgetWithFrame: NSMakeRect(10,485,80,TextFieldHeight)
95				  label: _(@"Description:")];
96  [[self contentView] addSubview: descriptionLabel];
97
98  descriptionField = [[NSTextField alloc] initWithFrame: NSMakeRect(100,485,290,TextFieldHeight)];
99  [[self contentView] addSubview: descriptionField];
100
101  activeButton = [[NSButton alloc] initWithFrame: NSMakeRect(410,485,70,ButtonHeight)];
102  [activeButton setButtonType: NSSwitchButton];
103  [activeButton setBordered: NO];
104  [activeButton setTitle: _(@"Active")];
105  [[self contentView] addSubview: activeButton];
106
107
108  // Filter type
109  filterTypeLabel = [LabelWidget labelWidgetWithFrame: NSMakeRect(10,455,70,TextFieldHeight)
110				 label: _(@"Filter type:")];
111  [[self contentView] addSubview: filterTypeLabel];
112
113  cell = [[NSButtonCell alloc] init];
114  [cell setButtonType: NSRadioButton];
115  [cell setBordered: NO];
116  [cell setImagePosition: NSImageLeft];
117
118  filterTypeMatrix = [[NSMatrix alloc] initWithFrame:NSMakeRect(90,453,200,ButtonHeight)
119			     mode: NSRadioModeMatrix
120			     prototype: cell
121			     numberOfRows: 1
122			     numberOfColumns: 2];
123  [filterTypeMatrix setIntercellSpacing: NSMakeSize(20, 0)];
124  [filterTypeMatrix setAutosizesCells: NO];
125  [filterTypeMatrix setAllowsEmptySelection: NO];
126  RELEASE(cell);
127
128  [[filterTypeMatrix cellAtRow: 0  column: 0] setTitle: _(@"Incoming")];
129  [[filterTypeMatrix cellAtRow: 0  column: 1] setTitle: _(@"Outgoing")];
130  [[self contentView] addSubview: filterTypeMatrix];
131
132
133  // External program
134  box = [[NSBox alloc] initWithFrame: NSMakeRect(10,360,480,90)];
135  [box setTitle: _(@"External Program")];
136
137  externalProgramButton = [[NSButton alloc] initWithFrame: NSMakeRect(10,35,215,TextFieldHeight)];
138  [externalProgramButton setButtonType: NSSwitchButton];
139  [externalProgramButton setBordered: NO];
140  [externalProgramButton setTitle: _(@"Process with external program:")];
141  [box addSubview: externalProgramButton];
142
143  externalProgramField = [[NSTextField alloc] initWithFrame: NSMakeRect(235,35,230,TextFieldHeight)];
144  [box addSubview: externalProgramField];
145
146  externalProgramLabel1 = [LabelWidget labelWidgetWithFrame: NSMakeRect(100,0,130,TextFieldHeight)
147				      label: _(@"and apply criteria(s)")];
148  [box addSubview: externalProgramLabel1];
149
150  externalProgramPopUpButton = [[NSPopUpButton alloc] initWithFrame: NSMakeRect(235,0,80,ButtonHeight)];
151  [externalProgramPopUpButton setAutoenablesItems: NO];
152  [externalProgramPopUpButton addItemWithTitle: _(@"after")];
153  [externalProgramPopUpButton addItemWithTitle: _(@"before")];
154  [box addSubview: externalProgramPopUpButton];
155
156  externalProgramLabel2 = [LabelWidget labelWidgetWithFrame: NSMakeRect(325,0,120,TextFieldHeight)
157				       label: _(@"program execution.")];
158  [box addSubview: externalProgramLabel2];
159
160  [[self contentView] addSubview: box];
161  RELEASE(box);
162
163  //
164  // The criteria box
165  //
166  criteriaBox = [[NSBox alloc] initWithFrame: NSMakeRect(10,225,480,125)];
167  [criteriaBox setTitle: _(@"Criteria")];
168
169  //
170  // First criteria
171  //
172  criteriaSourcePopUpButtonA = [[NSPopUpButton alloc] initWithFrame: NSMakeRect(60,65,80,ButtonHeight)];
173  [criteriaSourcePopUpButtonA addItemWithTitle: _(@"To")];
174  [criteriaSourcePopUpButtonA addItemWithTitle: _(@"Cc")];
175  [criteriaSourcePopUpButtonA addItemWithTitle: _(@"To or Cc")];
176  [criteriaSourcePopUpButtonA addItemWithTitle: _(@"Subject")];
177  [criteriaSourcePopUpButtonA addItemWithTitle: _(@"From")];
178  [criteriaSourcePopUpButtonA addItemWithTitle: _(@"Expert...")];
179  [criteriaSourcePopUpButtonA setTarget: [self windowController]];
180  [criteriaSourcePopUpButtonA setAction: @selector(criteriaSourceSelectionHasChanged:)];
181  [criteriaBox addSubview: criteriaSourcePopUpButtonA];
182
183  criteriaFindOperationPopUpButtonA = [[NSPopUpButton alloc] initWithFrame: NSMakeRect(150,65,130,ButtonHeight)];
184  [criteriaFindOperationPopUpButtonA setAutoenablesItems: NO];
185  [criteriaFindOperationPopUpButtonA addItemWithTitle: _(@"Contains")];
186  [criteriaFindOperationPopUpButtonA addItemWithTitle: _(@"Is Equal")];
187  [criteriaFindOperationPopUpButtonA addItemWithTitle: _(@"Has Prefix")];
188  [criteriaFindOperationPopUpButtonA addItemWithTitle: _(@"Has Suffix")];
189  [criteriaFindOperationPopUpButtonA addItemWithTitle: _(@"Match Expression")];
190  [criteriaFindOperationPopUpButtonA setTarget: [self windowController]];
191  [criteriaFindOperationPopUpButtonA setAction: @selector(criteriaFindOperationSelectionHasChanged:)];
192  [criteriaBox addSubview: criteriaFindOperationPopUpButtonA];
193
194  criteriaStringFieldA = [[NSTextField alloc] initWithFrame: NSMakeRect(285,65,180,TextFieldHeight)];
195  [criteriaStringFieldA setEditable: YES];
196  [criteriaBox addSubview: criteriaStringFieldA];
197
198  criteriaPopUpButtonA = [[NSPopUpButton alloc] initWithFrame: NSMakeRect(285,65,180,ButtonHeight)];
199
200  //
201  // Second criteria
202  //
203  criteriaConditionPopUpButtonB = [[NSPopUpButton alloc] initWithFrame: NSMakeRect(5,35,50,ButtonHeight)];
204  [criteriaConditionPopUpButtonB setAutoenablesItems: NO];
205  [criteriaConditionPopUpButtonB addItemWithTitle: _(@"and")];
206  [criteriaConditionPopUpButtonB addItemWithTitle: _(@"or")];
207  [criteriaBox addSubview: criteriaConditionPopUpButtonB];
208
209  criteriaSourcePopUpButtonB = [[NSPopUpButton alloc] initWithFrame: NSMakeRect(60,35,80,ButtonHeight)];
210  [criteriaSourcePopUpButtonB addItemWithTitle: _(@"(none)")];
211  [criteriaSourcePopUpButtonB addItemWithTitle: _(@"To")];
212  [criteriaSourcePopUpButtonB addItemWithTitle: _(@"Cc")];
213  [criteriaSourcePopUpButtonB addItemWithTitle: _(@"To or Cc")];
214  [criteriaSourcePopUpButtonB addItemWithTitle: _(@"Subject")];
215  [criteriaSourcePopUpButtonB addItemWithTitle: _(@"From")];
216  [criteriaSourcePopUpButtonB addItemWithTitle: _(@"Expert...")];
217  [criteriaSourcePopUpButtonB setTarget: [self windowController]];
218  [criteriaSourcePopUpButtonB setAction: @selector(criteriaSourceSelectionHasChanged:)];
219  [criteriaBox addSubview: criteriaSourcePopUpButtonB];
220
221  criteriaFindOperationPopUpButtonB = [[NSPopUpButton alloc] initWithFrame: NSMakeRect(150,35,130,ButtonHeight)];
222  [criteriaFindOperationPopUpButtonB setAutoenablesItems: NO];
223  [criteriaFindOperationPopUpButtonB addItemWithTitle: _(@"Contains")];
224  [criteriaFindOperationPopUpButtonB addItemWithTitle: _(@"Is Equal")];
225  [criteriaFindOperationPopUpButtonB addItemWithTitle: _(@"Has Prefix")];
226  [criteriaFindOperationPopUpButtonB addItemWithTitle: _(@"Has Suffix")];
227  [criteriaFindOperationPopUpButtonB addItemWithTitle: _(@"Match Expression")];
228  [criteriaFindOperationPopUpButtonB setTarget: [self windowController]];
229  [criteriaFindOperationPopUpButtonB setAction: @selector(criteriaFindOperationSelectionHasChanged:)];
230  [criteriaBox addSubview: criteriaFindOperationPopUpButtonB];
231
232  criteriaStringFieldB = [[NSTextField alloc] initWithFrame: NSMakeRect(285,35,180,TextFieldHeight)];
233  [criteriaStringFieldB setEditable: YES];
234  [criteriaBox addSubview: criteriaStringFieldB];
235
236  criteriaPopUpButtonB = [[NSPopUpButton alloc] initWithFrame: NSMakeRect(285,35,180,ButtonHeight)];
237
238
239  //
240  // Third criteria
241  //
242  criteriaConditionPopUpButtonC = [[NSPopUpButton alloc] initWithFrame: NSMakeRect(5,5,50,ButtonHeight)];
243  [criteriaConditionPopUpButtonC setAutoenablesItems: NO];
244  [criteriaConditionPopUpButtonC addItemWithTitle: _(@"and")];
245  [criteriaConditionPopUpButtonC addItemWithTitle: _(@"or")];
246  [criteriaBox addSubview: criteriaConditionPopUpButtonC];
247
248  criteriaSourcePopUpButtonC = [[NSPopUpButton alloc] initWithFrame: NSMakeRect(60,5,80,ButtonHeight)];
249  [criteriaSourcePopUpButtonC addItemWithTitle: _(@"(none)")];
250  [criteriaSourcePopUpButtonC addItemWithTitle: _(@"To")];
251  [criteriaSourcePopUpButtonC addItemWithTitle: _(@"Cc")];
252  [criteriaSourcePopUpButtonC addItemWithTitle: _(@"To or Cc")];
253  [criteriaSourcePopUpButtonC addItemWithTitle: _(@"Subject")];
254  [criteriaSourcePopUpButtonC addItemWithTitle: _(@"From")];
255  [criteriaSourcePopUpButtonC addItemWithTitle: _(@"Expert...")];
256  [criteriaSourcePopUpButtonC setTarget: [self windowController]];
257  [criteriaSourcePopUpButtonC setAction: @selector(criteriaSourceSelectionHasChanged:)];
258  [criteriaBox addSubview: criteriaSourcePopUpButtonC];
259
260  criteriaFindOperationPopUpButtonC = [[NSPopUpButton alloc] initWithFrame: NSMakeRect(150,5,130,ButtonHeight)];
261  [criteriaFindOperationPopUpButtonC setAutoenablesItems: NO];
262  [criteriaFindOperationPopUpButtonC addItemWithTitle: _(@"Contains")];
263  [criteriaFindOperationPopUpButtonC addItemWithTitle: _(@"Is Equal")];
264  [criteriaFindOperationPopUpButtonC addItemWithTitle: _(@"Has Prefix")];
265  [criteriaFindOperationPopUpButtonC addItemWithTitle: _(@"Has Suffix")];
266  [criteriaFindOperationPopUpButtonC addItemWithTitle: _(@"Match Expression")];
267  [criteriaFindOperationPopUpButtonC setTarget: [self windowController]];
268  [criteriaFindOperationPopUpButtonC setAction: @selector(criteriaFindOperationSelectionHasChanged:)];
269  [criteriaBox addSubview: criteriaFindOperationPopUpButtonC];
270
271  criteriaStringFieldC = [[NSTextField alloc] initWithFrame: NSMakeRect(285,5,180,TextFieldHeight)];
272  [criteriaStringFieldC setEditable: YES];
273  [criteriaBox addSubview: criteriaStringFieldC];
274
275  criteriaPopUpButtonC = [[NSPopUpButton alloc] initWithFrame: NSMakeRect(285,5,180,ButtonHeight)];
276
277  // We add our box
278  [[self contentView] addSubview: criteriaBox];
279
280  //
281  // The action box
282  //
283  box = [[NSBox alloc] initWithFrame: NSMakeRect(10,45,480,175)];
284  [box setTitle: _(@"Action")];
285
286  cell = [[NSButtonCell alloc] init];
287  [cell setButtonType: NSRadioButton];
288  [cell setBordered: NO];
289  [cell setImagePosition: NSImageLeft];
290
291  matrix = [[NSMatrix alloc] initWithFrame:NSMakeRect(5,5,145,120)
292			     mode: NSRadioModeMatrix
293			     prototype: cell
294			     numberOfRows: 5
295			     numberOfColumns: 1];
296  [matrix setTarget: [self windowController]];
297  [matrix setIntercellSpacing: NSMakeSize(0, 5)];
298  [matrix setAutosizesCells: NO];
299  [matrix setAllowsEmptySelection: NO];
300  RELEASE(cell);
301
302  [[matrix cellAtRow: 0  column: 0] setTitle: _(@"Set the color to:")];
303  [[matrix cellAtRow: 1  column: 0] setTitle: _(@"Transfer to mailbox:")];
304  [[matrix cellAtRow: 2  column: 0] setTitle: _(@"Do...")];
305  [[matrix cellAtRow: 3  column: 0] setTitle: _(@"Delete the message")];
306  [[matrix cellAtRow: 4  column: 0] setTitle: _(@"Play Sound")];
307  [box addSubview: matrix];
308
309  actionColorWell = [[NSColorWell alloc] initWithFrame: NSMakeRect(155,120,125,ButtonHeight)];
310  [box addSubview: actionColorWell];
311
312  actionFolderNamePopUpButton = [[NSPopUpButton alloc] initWithFrame: NSMakeRect(155,90,310,ButtonHeight)];
313  [box addSubview: actionFolderNamePopUpButton];
314
315  actionEMailStringPopUpButton = [[NSPopUpButton alloc] initWithFrame: NSMakeRect(155,60,90,ButtonHeight)];
316  [actionEMailStringPopUpButton setAutoenablesItems: NO];
317  [actionEMailStringPopUpButton addItemWithTitle: _(@"Bounce to:")];
318  [actionEMailStringPopUpButton addItemWithTitle: _(@"Forward to:")];
319  [actionEMailStringPopUpButton addItemWithTitle: _(@"Reply to:")];
320  [box addSubview: actionEMailStringPopUpButton];
321
322  actionEMailStringField = [[NSTextField alloc] initWithFrame: NSMakeRect(255,60,100,TextFieldHeight)];
323  [actionEMailStringField setEditable: YES];
324  [box addSubview: actionEMailStringField];
325
326  actionEMailStringButton = [[NSButton alloc] initWithFrame: NSMakeRect(365,58,100, ButtonHeight)];
327  [actionEMailStringButton setTitle: _(@"Set message")];
328  [actionEMailStringButton setTarget: [self windowController]];
329  [actionEMailStringButton setAction: @selector(setMessage:)];
330  [box addSubview: actionEMailStringButton];
331
332  //
333  // For setting the path to the sound file
334  //
335  pathToSoundField = [[NSTextField alloc] initWithFrame: NSMakeRect(155,5,200,TextFieldHeight)];
336  [pathToSoundField setEditable: YES];
337  [box addSubview: pathToSoundField];
338
339  chooseFileButton = [[NSButton alloc] initWithFrame: NSMakeRect(365,3,100,ButtonHeight)];
340  [chooseFileButton setTitle: _(@"Choose file")];
341  [chooseFileButton setTarget: [self windowController]];
342  [chooseFileButton setAction: @selector(chooseFileButtonClicked:)];
343  [box addSubview: chooseFileButton];
344
345  [[self contentView] addSubview: box];
346  RELEASE(box);
347
348  cancelButton = [[NSButton alloc] initWithFrame: NSMakeRect(320,10,80,ButtonHeight)];;
349  [cancelButton setButtonType: NSMomentaryPushButton];
350  [cancelButton setKeyEquivalent: @"\e"];
351  [cancelButton setTitle: _(@"Cancel")];
352  [cancelButton setTarget: [self windowController]];
353  [cancelButton setAction: @selector(cancelClicked:) ];
354  [[self contentView] addSubview: cancelButton];
355  RELEASE(cancelButton);
356
357  okButton = [[NSButton alloc] initWithFrame: NSMakeRect(410,10,80,ButtonHeight)];
358  [okButton setButtonType: NSMomentaryPushButton];
359  [okButton setKeyEquivalent: @"\r"];
360  [okButton setImagePosition: NSImageRight];
361  [okButton setImage: [NSImage imageNamed: @"common_ret"]];
362  [okButton setAlternateImage: [NSImage imageNamed: @"common_retH"]];
363  [okButton setTitle: _(@"OK")];
364  [okButton setTarget: [self windowController]];
365  [okButton setAction: @selector(okClicked:)];
366  [[self contentView] addSubview: okButton];
367  RELEASE(okButton);
368
369  // We set the initial responder and the next key views
370  [self setInitialFirstResponder: descriptionField];
371  [descriptionField setNextKeyView: activeButton];
372
373  // FIXME
374  [activeButton setNextKeyView: criteriaSourcePopUpButtonA];
375  [criteriaSourcePopUpButtonA setNextKeyView: criteriaFindOperationPopUpButtonA];
376  [criteriaFindOperationPopUpButtonA setNextKeyView: criteriaStringFieldA];
377  [criteriaStringFieldA setNextKeyView: descriptionField];
378}
379
380@end
381
382
383
384
385
386