This is ContourUserPane.m in view mode; [Download] [Up]
/* * Copyright (C) 1993 Robert Davis * * This program is free software; you can redistribute it and/or * modify it under the terms of Version 2, or any later version, of * the GNU General Public License as published by the Free Software * Foundation. */ static char RCSId[]="$Id: ContourUserPane.m,v 1.2 1993/05/04 16:21:30 davis Exp $"; #import <appkit/Application.h> #import <appkit/publicWraps.h> /* NXBeep() */ #import <appkit/TextField.h> #import "CellScrollView.h" #import "ContourUserPane.h" #import "DoubleObject.h" #import "DoubleValueSortedList.h" #import "EditMatrix.h" #import "Status.h" #import "StatusContour.h" #import "SubCell.h" @interface ContourUserPane (Private) - _updateControlsForSelectedLevel; @end @implementation ContourUserPane - init { [super init]; [NXApp loadNibSection: "ContourUserPane.nib" owner: self withNames: NO fromZone: [self zone]]; /* Setup the scroll view */ [scrollView initMatrixCellClass:[SubCell class] cols:1]; levelsMatrix = [scrollView cellMatrix]; [[levelsMatrix setAction:@selector(selectLevel:)] setTarget:self]; return self; } - (BOOL)updateStatus:aStatus doc:aDoc { BOOL isEnabled; if ([super updateStatus:aStatus doc:aDoc]) { levelsList = [status levelDefs]; [scrollView loadCol:0 from:levelsList]; } else [scrollView loadCol:0 from:nil]; [self selectLevel:self]; [addButton setEnabled:isEnabled = [doc isEnabled]]; [valueField setEnabled:isEnabled]; [valueFieldTitle setEnabled:isEnabled]; [levelsMatrix setEnabled:isEnabled]; [deleteButton setEnabled:isEnabled = (isEnabled && [levelsMatrix selectedCell])]; [modifyButton setEnabled:isEnabled]; return YES; } - add:sender { DoubleObject *doubleObject; int location; BOOL changed = YES; doubleObject = [[DoubleObject allocFromZone:[status zone]] initFromDouble:[valueField doubleValue]]; location = [levelsList addObjectIfDoubleAbsent:doubleObject]; if (location == NX_NOT_IN_LIST) { [doubleObject free]; location = [levelsMatrix selectedRow]; changed = NO; NXBeep(); } [scrollView loadCol:0 from:levelsList]; [levelsMatrix scrollCellToVisible:location :0]; [levelsMatrix selectCellAt:location :0]; [self selectLevel:self]; if (changed) [status reportSettingsChange:self]; return self; } - modify:sender { DoubleObject *dobj = [[levelsMatrix selectedCell] subObject]; int location; [dobj setDoubleValue:[valueField doubleValue]]; /* * Remove the level from the list and reinsert it, * to maintain the sort order of the list. */ location = [levelsList addObject:[levelsList removeObject:dobj]]; [scrollView loadCol:0 from:levelsList]; [levelsMatrix scrollCellToVisible:location: 0]; [levelsMatrix selectCellAt:location :0]; [self selectLevel:self]; [status reportSettingsChange:self]; return self; } - delete:sender { int i; int maxrow = [levelsMatrix cellCount] - 1; int row = maxrow; BOOL gotRow = NO; for (i = maxrow; i >= 0; i--) { SubCell *cell = [levelsMatrix cellAt:i:0]; if ([cell isHighlighted]) { /* * If a cell is highlighted, remove (and free) the * corresponding item from the list of DoubleObjects. */ [[levelsList removeObject:[cell subObject]] free]; if (!gotRow) { row = (i == maxrow)? i - 1 :i; gotRow = YES; } else row--; } } [scrollView loadCol:0 from:levelsList]; [levelsMatrix selectCellAt:row :0]; [levelsMatrix scrollCellToVisible:row :0]; [self selectLevel:self]; if (gotRow) /* gotRow will be YES if any cells were deleted */ [status reportSettingsChange:self]; return self; } /* * Selects a level if none is selected and then updates the controls * based on the selected level. */ - selectLevel:sender { if (![levelsMatrix selectedCell] && ![levelsMatrix multipleCellsSelected]) { [levelsMatrix selectCellAt:0:0]; } [self _updateControlsForSelectedLevel]; return self; } // Shuts up the compiler about unused RCSId - (const char *) rcsid { return RCSId; } @end @implementation ContourUserPane (Private) - _updateControlsForSelectedLevel { SubCell *singleCell = [levelsMatrix selectedCell]; BOOL enabled = (singleCell || [levelsMatrix multipleCellsSelected]); if (singleCell) { DoubleObject *dobj = [singleCell subObject]; [valueField setDoubleValue:[dobj doubleValue]]; } else { [valueField setStringValue:""]; } [deleteButton setEnabled:enabled]; [modifyButton setEnabled:singleCell? YES:NO]; [valueField selectText:self]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.