1//
2//  PRCCustTraceEdges.m
3//  PRICE
4//
5//  Created by Riccardo Mottola on Thu Mar 18 2004.
6//  Copyright (c) 2004-2010 Carduus. All rights reserved.
7//
8// This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
9// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
10
11#import "PRCCustTraceEdges.h"
12#import "PRCustTraceEdges.h"
13#import "MyDocument.h"
14#import "PRMedian.h"
15
16
17@implementation PRCCustTraceEdges
18
19- (id)init
20{
21    if ((self = [super init]))
22    {
23        filter = [[PRCustTraceEdges alloc] init];
24    }
25    return self;
26}
27
28- (IBAction)showFilter:(id)sender
29{
30    [super showFilter:sender];
31
32    if (!edgeWindow)
33        [NSBundle loadNibNamed:@"CustTraceEdges" owner:self];
34    [edgeWindow makeKeyAndOrderFront:nil];
35
36    /* edge tracer NIB defaults setting */
37    [thresholdSlider setEnabled:YES];
38    [thresholdField setEnabled:YES];
39    if ([[filterType selectedItem] tag] >= 7)
40        [zeroCrossCheck setEnabled:YES];
41    thresholdLevel = [thresholdField floatValue];
42
43    /* median image panes enables from NIB */
44    if ([enableCheck1 state] == NSOffState)
45        [self toggleStatePane1:NO];
46    if ([enableCheck2 state] == NSOffState)
47        [self toggleStatePane2:NO];
48    if ([enableCheck3 state] == NSOffState)
49        [self toggleStatePane3:NO];
50
51    [self parametersChanged:self];
52}
53
54- (NSArray *)encodeParameters
55{
56    BOOL enable1, enable2, enable3;
57    enum medianForms theForm1, theForm2, theForm3;
58    BOOL isSeparable1, isSeparable2, isSeparable3;
59    int theSize1, theSize2, theSize3;
60    BOOL zeroCrossOn;
61    NSArray        *parameters;
62
63    theForm1 = theForm2 = theForm3 = 0;
64    isSeparable1 = isSeparable2 = isSeparable3 = 0;
65    theSize1 = theSize2 = theSize3 = 0;
66
67    if ([enableCheck1 state] == NSOnState)
68    {
69        enable1 = YES;
70        if ([separableCheck1 state] == NSOnState)
71            isSeparable1 = YES;
72        else
73            isSeparable1 = NO;
74        switch ([[formSelect1 selectedItem] tag])
75        {
76            case 1: theForm1 = HORIZONTAL_F;
77                break;
78            case 2: theForm1 = VERTICAL_F;
79                break;
80            case 3: theForm1 = CROSS_F;
81                break;
82            case 4: theForm1 = BOX_F;
83                break;
84            default: NSLog(@"Unrecognized form selected");
85                theForm1 = BOX_F;
86        }
87        theSize1 = [sizeSlider1 intValue];
88    } else
89        enable1 = NO;
90
91    if ([enableCheck2 state] == NSOnState)
92    {
93        enable2 = YES;
94        if ([separableCheck2 state] == NSOnState)
95            isSeparable2 = YES;
96        else
97            isSeparable2 = NO;
98        switch ([[formSelect2 selectedItem] tag])
99        {
100            case 1: theForm2 = HORIZONTAL_F;
101                break;
102            case 2: theForm2 = VERTICAL_F;
103                break;
104            case 3: theForm2 = CROSS_F;
105                break;
106            case 4: theForm2 = BOX_F;
107                break;
108            default: NSLog(@"Unrecognized form selected");
109                theForm2 = BOX_F;
110        }
111        theSize2 = [sizeSlider2 intValue];
112    } else
113        enable2 = NO;
114
115    if ([enableCheck3 state] == NSOnState)
116    {
117        enable3 = YES;
118            if ([separableCheck3 state] == NSOnState)
119            isSeparable3 = YES;
120        else
121            isSeparable3 = NO;
122        switch ([[formSelect3 selectedItem] tag])
123        {
124            case 1: theForm3 = HORIZONTAL_F;
125                break;
126            case 2: theForm3 = VERTICAL_F;
127                break;
128            case 3: theForm3 = CROSS_F;
129                break;
130            case 4: theForm3 = BOX_F;
131                break;
132            default: NSLog(@"Unrecognized form selected");
133                theForm3 = BOX_F;
134        }
135        theSize3 = [sizeSlider3 intValue];
136    } else
137        enable3 = NO;
138
139    if ([zeroCrossCheck state] == NSOnState)
140        zeroCrossOn = YES;
141    else
142        zeroCrossOn = NO;
143
144    /* set automatically  zero cross */
145    if ([[filterType selectedItem] tag] < 7)
146    {
147        [zeroCrossCheck setState:NO];
148        zeroCrossOn = NO;
149    }
150
151    parameters = [NSArray arrayWithObjects:
152        [NSNumber numberWithInt: [[filterType selectedItem] tag]],
153        [NSNumber numberWithFloat: thresholdLevel],
154        [NSNumber numberWithBool: zeroCrossOn],
155        [NSNumber numberWithBool: enable1],
156        [NSNumber numberWithInt: theForm1],
157        [NSNumber numberWithInt: theSize1],
158        [NSNumber numberWithBool: isSeparable1],
159        [NSNumber numberWithBool: enable2],
160        [NSNumber numberWithInt: theForm2],
161        [NSNumber numberWithInt: theSize2],
162        [NSNumber numberWithBool: isSeparable2],
163        [NSNumber numberWithBool: enable3],
164        [NSNumber numberWithInt: theForm3],
165        [NSNumber numberWithInt: theSize3],
166        [NSNumber numberWithBool: isSeparable3],
167        nil];
168
169
170    return parameters;
171}
172
173- (void)closeFilterPanel
174{
175    [edgeWindow performClose:nil];
176}
177
178- (IBAction)changeSize1:(id)sender
179{
180    [sizeField1 setIntValue :[sizeSlider1 intValue] * 2 + 1];
181    [self parametersChanged:sender];
182}
183
184- (IBAction)changeSize2:(id)sender
185{
186    [sizeField2 setIntValue :[sizeSlider2 intValue] * 2 + 1];
187    [self parametersChanged:sender];
188}
189
190- (IBAction)changeSize3:(id)sender
191{
192    [sizeField3 setIntValue :[sizeSlider3 intValue] * 2 + 1];
193    [self parametersChanged:sender];
194}
195
196- (IBAction)enablePane1:(id)sender
197{
198    if ([enableCheck1 state] == NSOnState)
199        [self toggleStatePane1:YES];
200    else
201        [self toggleStatePane1:NO];
202    [self parametersChanged:sender];
203
204}
205
206- (IBAction)enablePane2:(id)sender
207{
208    if ([enableCheck2 state] == NSOnState)
209        [self toggleStatePane2:YES];
210    else
211        [self toggleStatePane2:NO];
212    [self parametersChanged:sender];
213}
214
215- (IBAction)enablePane3:(id)sender
216{
217    if ([enableCheck3 state] == NSOnState)
218        [self toggleStatePane3:YES];
219    else
220        [self toggleStatePane3:NO];
221    [self parametersChanged:sender];
222}
223
224
225- (IBAction)toggleStatePane1:(BOOL) state
226{
227    if (state == NSOnState)
228    {
229        [separableCheck1 setEnabled:YES];
230        [formSelect1 setEnabled:YES];
231        [sizeSlider1 setEnabled:YES];
232    } else
233    {
234        [separableCheck1 setEnabled:NO];
235        [formSelect1 setEnabled:NO];
236        [sizeSlider1 setEnabled:NO];
237    }
238}
239
240- (IBAction)toggleStatePane2:(BOOL) state
241{
242    if (state == NSOnState)
243    {
244        [separableCheck2 setEnabled:YES];
245        [formSelect2 setEnabled:YES];
246        [sizeSlider2 setEnabled:YES];
247    } else
248    {
249        [separableCheck2 setEnabled:NO];
250        [formSelect2 setEnabled:NO];
251        [sizeSlider2 setEnabled:NO];
252    }
253}
254
255- (IBAction)toggleStatePane3:(BOOL) state
256{
257    if (state == NSOnState)
258    {
259        [separableCheck3 setEnabled:YES];
260        [formSelect3 setEnabled:YES];
261        [sizeSlider3 setEnabled:YES];
262    } else
263    {
264        [separableCheck3 setEnabled:NO];
265        [formSelect3 setEnabled:NO];
266        [sizeSlider3 setEnabled:NO];
267    }
268}
269
270
271- (IBAction)changeThreshold:(id)sender
272{
273    thresholdLevel = [sender floatValue];
274    [thresholdField setFloatValue:thresholdLevel];
275    [self parametersChanged:sender];
276}
277
278@end
279