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