File: MyImageListWindowPrivate.m

package info (click to toggle)
lynkeos.app 1.2-6
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 3,924 kB
  • sloc: objc: 7,122; ansic: 695; sh: 372; makefile: 59
file content (392 lines) | stat: -rw-r--r-- 12,113 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
//
//  Lynkeos
//  $Id: MyImageListWindowPrivate.m,v 1.8 2005/02/01 23:01:25 j-etienne Exp $
//
//  Created by Jean-Etienne LAMIAUD on Fri Oct 1 2004.
//  Copyright (c) 2003-2005. Jean-Etienne LAMIAUD
//
// This program 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.
//
// 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.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
//

#include "MyDocument.h"

#include "MyImageListWindowPrivate.h"

@implementation MyImageListWindow(Private)

- (NSString*) windowStateName
{
   switch( _windowState )
   {
      case ListMode: return( @"ListMode" );
      case AlignMode: return( @"AlignMode" );
      case Aligning: return( @"Aligning" );
      case AnalyzeMode: return( @"AnalyzeMode" );
      case Analyzing: return( @"Analyzing" );
      case StackMode: return( @"StackMode" );
      case Stacking: return( @"Stacking" );
      case ProcessMode: return( @"ProcessMode" );
      default: return( [NSString stringWithFormat:@"Unknown state : %d", 
                                 _windowState] );
   }
}

- (NSString*) windowModeName
{
   switch( _windowMode )
   {
      case DarkFrameMode: return( @"DarkFrameMode" );
      case FlatFieldMode: return( @"FlatFieldMode" );
      case ImageMode: return( @"ImageMode" );
      default: return( [NSString stringWithFormat:@"Unknown mode : %d", 
                                 _windowMode] );
   }
}

- (void) highlightOther :(BOOL)direct
{
   MyImageListEnumerator *list;
   MyImageListItem *item;

   if ( _windowState == ListMode || _windowState == AlignMode 
        || _windowState == AnalyzeMode )
   {
      list = [_currentList imageEnumeratorStartAt:_highlightedItem 
                                      directSense:direct];

      while ( (item = [list nextObject]) != nil 
              && [item getSelectionState] != NSOnState )
	 ;

      if ( item == nil )
	 return;

      if ( [item isMemberOfClass:[MyMovieImage class]] )
	 [_textView expandItem:[(MyMovieImage*)item getParent]];

      [self highlightItem:item];
   }
}

// Fill the popup with power of 2 up to the shorter side of the images
- (void) fillSidePopup
{
   NSEnumerator* list;
   MyImageListItem* item;
   long limit = -1.0;
   int side;
   
   NSAssert( _windowMode == ImageMode, @"fillSidePopup in non image mode" );
   
   // Check the minimum size from the list
   list = [[(MyObjectImageList*)_currentList imageArray] objectEnumerator];
   while ( (item = [list nextObject]) != nil )
   {
      NSSize size = [item imageSize];
      if ( size.width < limit || limit < 0 )
	 limit = size.width;
      if ( size.height < limit )
	 limit = size.height;
   }
   
   // Optimization : reconstruct only on size change
   if ( limit <= _sideMenuLimit/2 || limit >= _sideMenuLimit*2 )
   {
      NSString *searchSelection = nil, *analyzeSelection = nil;
      
      _sideMenuLimit = limit;
      [_searchSideMenu removeAllItems];
      [_analyzeSideMenu removeAllItems];
      for ( side = 16; side <= limit; side *= 2 )
      {
	 NSString* label = [NSString stringWithFormat:@"%d",side];
	 [_searchSideMenu addItemWithTitle:label];
	 [_analyzeSideMenu addItemWithTitle:label];
	 if ( side == (int)[(MyObjectImageList*)_currentList searchSquareSide] )
	    searchSelection = label;
	 if ( side == (int)[(MyObjectImageList*)_currentList analyzeSquareSide] )
	    analyzeSelection = label;
      }
      
      if ( searchSelection == nil )
      {
	 [_searchSideMenu selectItem:nil];
	 [_alignButton setEnabled:NO];
      }
      else
      {
	 [_searchSideMenu selectItemWithTitle:searchSelection];
	 [_alignButton setEnabled:YES];
      }
      if ( analyzeSelection == nil )
      {
	 [_analyzeSideMenu selectItem:nil];
	 [_analyzeButton setEnabled:NO];
      }
      else
      {
	 [_analyzeSideMenu selectItemWithTitle:analyzeSelection];
	 [_analyzeButton setEnabled:YES];
      }
   }

   _fillSideArmed = NO;
}

- (void) updateListControls
{
   BOOL controlsEnabled = _highlightedItem != nil;
   BOOL nextEnabled = [[_currentList imageArray] count] != 0;

   [_minusButton setEnabled:controlsEnabled];
   [_prevButton setEnabled:nextEnabled];
   [_nextButton setEnabled:nextEnabled];
   [_toggleButton setEnabled:controlsEnabled];
}

- (void) updateAnalyzeControls
{
   MyIntegerPoint o;
   MyObjectImageList *list = (MyObjectImageList*)_currentList;

   NSAssert1( _windowMode == ImageMode, 
              @"Analyze controls updating in mode %@", [self windowModeName] );

   if ( _windowState == AnalyzeMode )
   {
      BOOL menuEnabled = ( _highlightedItem != nil
                           && ![_highlightedItem isMemberOfClass:
                                                            [MyMovie class]] );
      BOOL controlsEnabled = ( menuEnabled
                               && [_analyzeSideMenu indexOfSelectedItem] >= 0);

      o = [list analyzeSquareOrigin];

      [_analyzeFieldX setFloatValue: o.x];
      [_analyzeFieldX setEnabled: controlsEnabled];
      [_analyzeFieldY setFloatValue: o.y];
      [_analyzeFieldY setEnabled: controlsEnabled];
      [_analyzeSideMenu setEnabled: menuEnabled];
      [_analyzeMethodMenu selectItemAtIndex: 
                                 [(MyDocument*)[self document] analysisMethod]];
      [_analyzeMethodMenu setEnabled: YES];

      [_analyzeButton setEnabled:controlsEnabled];
   }
   else
   {
      [_analyzeFieldX setEnabled: NO];
      [_analyzeFieldY setEnabled: NO];
      [_analyzeSideMenu setEnabled: NO];
      [_analyzeMethodMenu setEnabled: NO];

      [_analyzeButton setEnabled:_windowState == Analyzing];
   }
   

}

- (void) updateSelectThresholdSlide
{
   MyObjectImageList *list = (MyObjectImageList*)_currentList;
   double qmin, qmax;

   NSAssert1( _windowMode == ImageMode, @"Select threshold change in mode : %@", 
              [self windowModeName] );

   qmin = [list minQuality],
   qmax = [list maxQuality];

   if ( qmin < 0.0 || qmax < 0.0 )
   {
      [_minQualityText setStringValue:@""];
      [_maxQualityText setStringValue:@""];
      [_selectThresholdSlide setEnabled:NO];
   }
   else
   {
      [_selectThresholdSlide setEnabled:YES];
      [_minQualityText setDoubleValue:qmin];
      [_selectThresholdSlide setMinValue:qmin];
      [_maxQualityText setDoubleValue:qmax];
      [_selectThresholdSlide setMaxValue:qmax];
      [_selectThresholdSlide setDoubleValue:[list qualityThreshold]];
   }
}

- (void) updateStackControls
{
   // In stack mode, the hilight is set to the first selected line
   // therefore, if there is no hilight, there is no image at all
   BOOL enabled = (_highlightedItem != nil);
   MyIntegerSize s;

   if ( _windowMode == ImageMode )
   {
      if ( _windowState == StackMode )
      {
         MyObjectImageList *list = (MyObjectImageList*)_currentList;
         MyIntegerRect r = [list cropRectangle];

         s = r.size;

         [_cropX setFloatValue: r.origin.x];
         [_cropX setEnabled: enabled];
         [_cropY setFloatValue: r.origin.y];
         [_cropY setEnabled: enabled];
         [_cropW setFloatValue: r.size.width];
         [_cropW setEnabled: enabled];
         [_cropH setFloatValue: r.size.height];
         [_cropH setEnabled: enabled];
         [_doubleButton setState:
                           ([list sizeFactor] == 2 ? NSOnState : NSOffState)];
         [_doubleButton setEnabled: enabled];
      }
      else
      {
         [_cropX setEnabled: NO];
         [_cropY setEnabled: NO];
         [_cropW setEnabled: NO];
         [_cropH setEnabled: NO];
         [_doubleButton setEnabled: NO];
      }
   }
   else
   {
      s = [(MyDocument*)[self document] lockedSize];

      [_cropX setFloatValue: 0];
      [_cropX setEnabled: NO];
      [_cropY setFloatValue: 0];
      [_cropY setEnabled: NO];
      [_cropW setFloatValue: s.width];
      [_cropW setEnabled: NO];
      [_cropH setFloatValue: s.height];
      [_cropH setEnabled: NO];
      [_doubleButton setEnabled: NO];
   }

   if ( _windowMode == FlatFieldMode )
      [_monoStackButton setState: 
         ([(MyDocument*)[self document] monochromeFlat] ? 
                                                     NSOnState : NSOffState)];
   else
      [_monoStackButton setState: NSOffState ];
   [_monoStackButton setEnabled: enabled && _windowMode == FlatFieldMode ];

   [_stackButton setEnabled: _windowState == Stacking ||
                             (enabled && s.width != 0 && s.height != 0) ];
}

- (void) updateProcessControls
{
   REAL w = [_currentList whiteLevel];
   REAL b = [_currentList blackLevel];

   // Update the levels (common to all modes)
   if ( w > b )
   {
      REAL minL = [(MyDocument*)[self document] minLevel];
      REAL maxL = [(MyDocument*)[self document] maxLevel];

      if ( _windowMode == FlatFieldMode )
      {
         // Trick to display the levels 0..100
         minL *= 100;
         maxL *= 100;
      }
      
      if ( b < minL )
	 b = minL;
      if ( b > maxL )
	 b = maxL - 1.0/HUGE;
      [_blackLevel setEnabled:YES];
      [_blackTextLevel setEnabled:YES];
      [_blackLevel setMinValue:minL];
      [_blackLevel setMaxValue:maxL];
      [_blackLevel setDoubleValue:b];
      [_blackTextLevel setDoubleValue:b];

      if ( w < minL )
	 w = minL + 1.0/HUGE;
      if ( w > maxL )
	 w = maxL;
      [_whiteLevel setEnabled:YES];
      [_whiteTextLevel setEnabled:YES];
      [_whiteLevel setMinValue:minL];
      [_whiteLevel setMaxValue:maxL];
      [_whiteLevel setDoubleValue:w];
      [_whiteTextLevel setDoubleValue:w];
   }
   else
   {
      [_blackLevel setEnabled:NO];
      [_blackTextLevel setEnabled:NO];
      [_blackTextLevel setStringValue:@""];
      [_whiteLevel setEnabled:NO];
      [_whiteTextLevel setEnabled:NO];
      [_whiteTextLevel setStringValue:@""];
   }

   // Update the process parameters
   if ( _windowMode == ImageMode )
   {
      // Controls are valid in image mode, and values are in the image list
      MyObjectImageList *list = (MyObjectImageList*)_currentList;
      double dR = [list dRadius];
      double dT = [list dThreshold];
      double uR = [list uRadius];
      double uG = [list uGain];

      [_deconvRadius setDoubleValue:dR];
      [_deconvRadius setEnabled:YES];
      [_deconvTextRadius setDoubleValue:dR];
      [_deconvTextRadius setEnabled:YES];
      [_deconvThreshold setDoubleValue:dT];
      [_deconvThreshold setEnabled:YES];
      [_deconvTextThreshold setDoubleValue:dT];
      [_deconvTextThreshold setEnabled:YES];
      [_unsharpRadius setDoubleValue:uR];
      [_unsharpRadius setEnabled:YES];
      [_unsharpTextRadius setDoubleValue:uR];
      [_unsharpTextRadius setEnabled:YES];
      [_unsharpGain setDoubleValue:uG];
      [_unsharpGain setEnabled:YES];
      [_unsharpTextGain setDoubleValue:uG];
      [_unsharpTextGain setEnabled:YES];
   }
   else
   {
      // Controls are disabled and reset to default values in other modes
      [_deconvRadius setDoubleValue:1.0];
      [_deconvRadius setEnabled:NO];
      [_deconvTextRadius setDoubleValue:1.0];
      [_deconvTextRadius setEnabled:NO];
      [_deconvThreshold setDoubleValue:1.0];
      [_deconvThreshold setEnabled:NO];
      [_deconvTextThreshold setDoubleValue:1.0];
      [_deconvTextThreshold setEnabled:NO];
      [_unsharpRadius setDoubleValue:1.0];
      [_unsharpRadius setEnabled:NO];
      [_unsharpTextRadius setDoubleValue:1.0];
      [_unsharpTextRadius setEnabled:NO];
      [_unsharpGain setDoubleValue:0.0];
      [_unsharpGain setEnabled:NO];
      [_unsharpTextGain setDoubleValue:0.0];
      [_unsharpTextGain setEnabled:NO];
   }
}

@end