This is CNewsConfigPanel.m in view mode; [Download] [Up]
/*+++* * RCS CNewsConfigPanel.m,v 1.5 1995/07/13 11:47:31 tom Exp * title: CNewsConfigPanel.m * abstract: implementation of CNewsConfigPanel class, for NewsConfig.app * author: T.R.Hageman, Groningen, The Netherlands * created: December 1994 * modified: (see RCS Log at end) * copyright: * * Copyright (C) 1994,1995 Tom R. Hageman. * * This 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 software 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 software; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * description: * *---*/ #import "CNewsConfigPanel.h" #import "CheckedBrowserCell.h" #import "configkeys.h" #include <string.h> @interface CNewsConfigPanel (Private) - (void)_configure; - (const char *)_activegroups; - (void)_setActiveGroups; - (void)_selectionToActive:(BOOL)value; // Browser delegate methods. - (int)browser:sender fillMatrix:matrix inColumn:(int)column; @end @implementation CNewsConfigPanel - awakeFromNib { // Configure the activegroups browser some more. [[[[[activegroups setCellClass:[CheckedBrowserCell class]] /* {{ ???Arrow keys still don't work??? Browser refuses to become first responder. Maybe because it's in a box?}} */ acceptArrowKeys:YES andSendActionMessages:NO] setTarget:self] setAction:@selector(activeSelected:)] setDoubleAction:@selector(toggleActive:)]; return self; } // Action methods - revert:sender { [self _configure]; return self; } - activeSelected:sender // single-click (or just select) browser item { List *selection = [[List alloc] init]; [activegroups getSelectedCells:selection]; [activeButtons setEnabled:([selection count] > 0)]; [selection free]; return self; } - toggleActive:sender // double-click browser item { CheckedBrowserCell *cell = [activegroups selectedCell]; [cell setChecked:![cell checked]]; [activegroups display]; // unkh! return self; } - addSelectionToActive:sender { [self _selectionToActive:YES]; return self; } - removeSelectionFromActive:sender { [self _selectionToActive:NO]; return self; } - (void)setConfiguration:(HashTable *)aTable { if (table) [table free]; table = aTable; [self _configure]; } - (HashTable *)configuration { HashTable *result = [[HashTable alloc] initKeyDesc:"*" valueDesc:"*"]; const char *v; #define SETRESULT(field, key) [result insertKey:key value:\ (char *)(((v = [field stringValue]) && *(v += strspn(v, " \t"))) ? v :\ [table valueForKey:key])] SETRESULT(organization, ORGANIZATION); SETRESULT(hostname, HOSTNAME); SETRESULT(uucpname, UUCPNAME); SETRESULT(newsfeed, NEWSFEED); SETRESULT(newsfeedSubscriptions, NEWSFEED_SUBSCRIPTIONS); SETRESULT(newsfeedDistribution, NEWSFEED_DISTRIBUTION); SETRESULT(newsfeedFlags, NEWSFEED_FLAGS); #undef SETRESULT if ([immednews intValue]) [result insertKey:IMMEDNEWS value:"yes"]; if ([expirermdir intValue]) [result insertKey:EXPIRERMDIR value:"yes"]; if ([allowNewHierarchies intValue]) [result insertKey:ALLGROUPS value:"yes"]; if ([addsignature intValue]) { if (!((v = [addsigMaxlines stringValue]) && *(v += strspn(v, " \t")))) { v = "all"; } [result insertKey:ADDSIGNATURE value:(char *)v]; } [result insertKey:ACTIVEGROUPS value:(char *)[self _activegroups]]; #define PROPAGATE(key) \ ((void) ([table isKey:key] && \ [result insertKey:key value:[table valueForKey:key]])) PROPAGATE(AVAILABLEGROUPS); PROPAGATE(EXPIRERMDIR_PRESENT); PROPAGATE(ADDSIGNATURE_PRESENT); PROPAGATE(IMMEDNEWS_PRESENT); #undef PROPAGATE return result; } - setEnabled:(BOOL)yn { [okButton setEnabled:yn]; return self; } - (BOOL)isEnabled { return [okButton isEnabled]; } @end // CNewsConfigPanel @implementation CNewsConfigPanel (Private) // (re)configure the window with the values in table. - (void)_configure { const char *v; [self disableFlushWindow]; [organization setStringValue:[table valueForKey:ORGANIZATION]]; [hostname setStringValue:[table valueForKey:HOSTNAME]]; [uucpname setStringValue:[table valueForKey:UUCPNAME]]; [newsfeed setStringValue:[table valueForKey:NEWSFEED]]; [newsfeedSubscriptions setStringValue:[table valueForKey:NEWSFEED_SUBSCRIPTIONS]]; [newsfeedDistribution setStringValue:[table valueForKey:NEWSFEED_DISTRIBUTION]]; [newsfeedFlags setStringValue:[table valueForKey:NEWSFEED_FLAGS]]; [immednews setIntValue:[table isKey:IMMEDNEWS]]; [expirermdir setIntValue:[table isKey:EXPIRERMDIR]]; [allowNewHierarchies setIntValue:[table isKey:ALLGROUPS]]; if (!(v = [table valueForKey:ADDSIGNATURE]) || *v == '\0' || *v == 'n' || *v == 'N' || strcmp(v, "0") == 0) { [addsignature setIntValue:NO]; [addsigMaxlines setStringValue:""]; } else { [addsignature setIntValue:YES]; [addsigMaxlines setStringValue:(NXIsDigit(*v) ? v : "")]; } // Initialize `activeGroups'. [self _setActiveGroups]; // Disable some fields is news config does not support them. [expirermdir setEnabled:[table isKey:EXPIRERMDIR_PRESENT]]; [addsignature setEnabled:[table isKey:ADDSIGNATURE_PRESENT]]; [immednews setEnabled:[table isKey:IMMEDNEWS_PRESENT]]; // Remove the blurb from the window. if ([expirermdir isEnabled] && [addsignature isEnabled] && [immednews isEnabled]) { [negenExtrasBlurb removeFromSuperview]; } [self reenableFlushWindow]; [self flushWindowIfNeeded]; } // Extract the active groups from the browser. - (const char *)_activegroups { NXStream *stream = NXOpenMemory(NULL, 0, NX_WRITEONLY); const char *result; int dummy; int row = 0, active = 0; CheckedBrowserCell *cell; for (; cell = [activegroups getLoadedCellAtRow:row inColumn:0]; row++) { if (![cell checked]) continue; if (active) { NXPutc(stream, ' '); } NXPrintf(stream, "%s", [cell stringValue]); ++active; } NXPutc(stream, '\0'); NXGetMemoryBuffer(stream, &result, &dummy, &dummy); NXClose(stream); return result; } // Initialize the browser with the group list, and mark active groups. - (void)_setActiveGroups { // Load the browser (we are its delegate). [activegroups loadColumnZero]; // Selection is zapped in the process... [activeButtons setEnabled:NO]; } - (void)_selectionToActive:(BOOL)value { List *selection = [[List alloc] init]; [activegroups getSelectedCells:selection]; [selection makeObjectsPerform:@selector(setChecked:) with:(id)(int)value]; // XXX {{{Should we deselect the selection?}}} [selection free]; [activegroups display]; // unkh! } // browser delegate method: fill in the browser. - (int)browser:sender fillMatrix:matrix inColumn:(int)column { int row = 0, nrows; CheckedBrowserCell *cell = nil; const char *group; char *groups = [table valueForKey:AVAILABLEGROUPS]; // This happens at nib instantiation time. if (groups == NULL) return 0; groups = NXCopyStringBuffer(groups); // Add all availablegroups in browser. // ASSUMPTION: both group lists are sorted. if (group = strtok(groups, " ")) do { [matrix addRow]; cell = [matrix cellAt:row :0]; [[[cell setStringValue:group] setLoaded:YES] setLeaf:YES]; ++row; } while (group = strtok(NULL, " ")); free(groups); nrows = row; row = 0; // Now set state (and image) for all active groups groups = NXCopyStringBuffer([table valueForKey:ACTIVEGROUPS]); if (group = strtok(groups, " ")) do { int c = -1; while (row < nrows && (c = strcmp([(cell = [matrix cellAt:row:0]) stringValue], group)) < 0) { row++; } if (c != 0) { [matrix insertRowAt:row]; cell = [matrix cellAt:row :0]; [[[cell setStringValue:group] setLoaded:YES] setLeaf:YES]; ++nrows; } [cell setChecked:YES]; ++row; } while (group = strtok(NULL, " ")); free(groups); return nrows; } @end // CNewsConfigPanel (Private) //====================================================================== // CNewsConfigPanel.m,v // Revision 1.5 1995/07/13 11:47:31 tom // (-setEnabled:,isEnabled): new methods; // (-configuration): add ALLGROUPS support, propagate IMMEDNEWS_PRESENT; // (-configure:): handle ALLGROUPS and IMMEDNEWS_PRESENT. // // Revision 1.4 1995/01/15 22:50:47 tom // (awakeFromNib): comment fix; (setConfiguration): free old table; // (_configuration): propagate non-GUI key/value pairs; // (_setActiveGroups): disable activeButtons. // // Revision 1.3 1995/01/11 13:48:40 tom // (#import): CheckedBrowserCell.h; (Private): declare new support methods; // (awakeFromNib): new, extra browserconfiguration; // (activeSelected:,addSelectionToActive:,removeSelectionFromActive:): new; // (setConfiguration:): use _setActiveGroups; // (configuration): use [CheckedBrowserCell checked] to test active state; // (_setActiveGroups,_selectionToActive:): new private support methods; // (browser:fillMatrix:inColumn:): use [CheckedBrowserCell setChecked:] to store // active state. // // Revision 1.2 1994/12/24 02:10:34 tom // (configuration): use "yes" for BOOL keys; enable extended options and // remove blurb if extensions are supported by installed CNews version. // // Revision 1.2 1994/12/24 02:10:34 tom // (configuration): use "yes" for BOOL keys; enable extended options and // remove blurb if extensions are supported by installed CNews version. // // Revision 1.1 1994/12/20 14:41:15 tom // Initial revision // //======================================================================
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.