This is NewsgroupsMatrix.m in view mode; [Download] [Up]
// NewsgroupsMatrix.m #import "NewsgroupsMatrix.h" @implementation NewsgroupsMatrix + newFrame:(const NXRect *)frameRect { self = [super newFrame:frameRect]; numBitmaps = NEWSGROUP_NUM_BITMAPS; [protoCell setNumBitmaps:numBitmaps]; numColumns = NEWSGROUP_NUM_COLUMNS; [protoCell setNumColumns:numColumns]; tabs[0] = NEWSGROUP_TAB_0; tabs[1] = NEWSGROUP_TAB_1; tabs[2] = NEWSGROUP_TAB_2; [self calcTabs]; bogus = TRUE; return self; } #ifdef bugs - mouseDown:(NXEvent *)thisEvent { int mouseFlags = [self mouseDownFlags]; int shouldLoop = YES; int oldMask; NXTrackingTimer myTimer; NXEvent *nextEvent, lastEvent; if (mouseFlags & (NX_SHIFTMASK | NX_ALTERNATEMASK)) [super mouseDown:thisEvent]; else { oldMask = [window addToEventMask:NX_LMOUSEDRAGGEDMASK]; lastEvent = *thisEvent; NXBeginTimer(&myTimer, 0.05, 0.05); while (shouldLoop) { nextEvent = [NXApp getNextEvent:(NX_LMOUSEUPMASK | NX_LMOUSEDRAGGEDMASK | NX_TIMERMASK)]; switch (nextEvent->type) { case NX_LMOUSEUP: shouldLoop = NO; break; case NX_LMOUSEDRAGGED: lastEvent = *nextEvent; break; case NX_TIMER: [self autoscroll:&lastEvent]; break; default: break; } } NXEndTimer(&myTimer); [window setEventMask:oldMask]; } return(self); } - ( BOOL ) _mouseHit:(NXPoint * )x row:( int * )y col:( int * )z { int did = [super _mouseHit:x row:y col:z]; printf("%d mousehit point, row %d col %d\n", did, *y, *z); return did; } - ( BOOL ) _loopHit:( struct _NXPoint * )x row:( int * )y col:( int * )z ; { int did = [super _loopHit:x row:y col:z]; printf("%d loophit point, row %d col %d\n", did, *y, *z); return did; } #endif - readNewsrc { char newsrcName[BUFFER_SIZE], buffer[BUFFER_SIZE]; NXStream *newsrcStream; Newsgroup *group; // read in .newsrc sprintf(newsrcName, "%s/%s", NXHomeDirectory(), NEWSRC_NAME); [self empty]; if ((newsrcStream = NXMapFile(newsrcName, NX_READONLY)) == NULL) NXRunAlertPanel("News Bulletin", "Can't find Newsrc file (%s). A new one will be created.", NULL, NULL, NULL, newsrcName); else { while ((group = [Newsgroup newFromNewsrc:newsrcStream]) != nil) [itemsList addObject:group]; if ([itemsList count]) { bogus = FALSE; // not empty, so back up .newsrc sprintf(buffer, "cp %s %s~", newsrcName, newsrcName); system(buffer); } NXCloseMemory(newsrcStream, NX_FREEBUFFER); } return self; } - writeNewsrc { char newsrcName[BUFFER_SIZE]; int newsrcDescriptor; NXStream *newsrcStream; int itemIndex; Newsgroup *group; sprintf(newsrcName, "%s/%s", NXHomeDirectory(), NEWSRC_NAME); if (!bogus && [itemsList count]) { // write out .newsrc newsrcDescriptor = open(newsrcName, O_WRONLY | O_CREAT | O_TRUNC, VREAD | VWRITE); if (!newsrcDescriptor || !(newsrcStream = NXOpenFile(newsrcDescriptor, NX_WRITEONLY))) { NXRunAlertPanel("News Bulletin", "Can't write Newsrc file (%s). Read messages will be forgotten.", NULL, NULL, NULL, newsrcName); } else { for (itemIndex = 0; itemIndex < [itemsList count]; itemIndex++) { [(Newsgroup *)[itemsList objectAt:itemIndex] writeToNewsrc:newsrcStream]; } NXClose(newsrcStream); close(newsrcDescriptor); } } return self; } - setupNNTP:(FILE *)newnntpFile; { int inCode; char inCodeText[BUFFER_SIZE]; Newsgroup *group; char name[BUFFER_SIZE]; int ch; long first, last; BOOL post; int addedGroupCount = 0; nntpFile = newnntpFile; fprintf(nntpFile, "list\r\n"); fflush(nntpFile); fseek(nntpFile, (long)0, SEEK_END); fscanf(nntpFile, "%d %[^\r]\r\n", &inCode, &inCodeText); if (inCode != OK_GROUPS) { NXRunAlertPanel("News Flash", "Can't get list of Newsgroups from NNTP (but connection is ok).", NULL, NULL, NULL); return nil; } while ((ch = fgetc(nntpFile)) != '.') { ungetc(ch, nntpFile); fscanf(nntpFile, "%s %d %d %c\r\n", &name, &last, &first, &post); if ((group = [((HashList *)itemsList)->nameHash valueForKey:name]) == nil) { group = [Newsgroup newName:name subscribed:TRUE]; [itemsList insertObject:group at:addedGroupCount]; addedGroupCount++; } [group setAvailableFirst:first last:last]; group->bogus = FALSE; group->moderated = !(post == 'y'); if (group->moderated) [group setModerated:group->moderated]; } fgetc(nntpFile); // \r fgetc(nntpFile); // \n fseek(nntpFile, (long)0, SEEK_END); [self sendAction]; if (addedGroupCount) { NXRunAlertPanel("News Bulletin", "Added %d new Newsgroups to beginning of Newsrc.", "OK", NULL, NULL, addedGroupCount); bogus = FALSE; } return self; } - (BOOL)itemVisible:item { Newsgroup *group = item; BOOL highlighted = FALSE; if (group->cell) highlighted = [group->cell isHighlighted]; return group->shown = ((showUnsubscribed || group->subscribed) && (showNoNewMessages || (group->newMessages > 0)) || highlighted) && !group->bogus; } #ifdef NOMORE - updateCellVisible:(IconColumnCell *)aCell { Newsgroup *newsgroup = (Newsgroup *)aCell->aux; int row, col; BOOL newShown = [self itemVisible:newsgroup]; if (!newShown) { if ([self getRow:&row andCol:&col ofCell:newsgroup->cell] != nil) { [self removeRowAt:row andFree:TRUE]; [self sizeToCells]; } } return self; } #endif - takeGroupFrom:sender { const char *groupName; int groupNameLength; int i, cellIndex; groupName = [sender stringValue]; groupNameLength = strlen(groupName); for (i=0, cellIndex = -1; (cellIndex == -1) && (i<numRows); i++) { if (strncmp(groupName, [((Newsgroup *)((IconColumnCell *) ((List *)cellList)->dataPtr[i])->aux) name], groupNameLength) == 0) cellIndex = i; } [self selectCellAt:cellIndex :0]; [self sendAction]; return self; } - toggleSubscribed:sender { [self sendAction:@selector(cellToggleSubscribed:) to:self forAllCells:FALSE]; [[self superview] display]; return self; } - cellToggleSubscribed:(IconColumnCell *)aCell { [((Newsgroup *)aCell->aux) setSubscribed: !((Newsgroup *)aCell->aux)->subscribed]; return self; } - showUnsubscribed:sender { showUnsubscribed = (BOOL)[sender intValue]; [self sendAction]; return self; } - showNoNewMessages:sender { showNoNewMessages = (BOOL)[sender intValue]; [self sendAction]; return self; } - selectWayUp:sender { NXBeep(); return self; } - selectWayDown:sender; { NXBeep(); return self; } - catchUp:sender { if (NXRunAlertPanel("News Bulletin", "This will junk all articles in selected newsgroups.", NULL, "Cancel", NULL) == NX_ALERTDEFAULT) { [self sendAction:@selector(cellCatchUp:) to:self forAllCells:FALSE]; [[self superview] display]; refreshTarget = TRUE; [self sendAction]; } return self; } - cellCatchUp:(IconColumnCell *)aCell { Newsgroup *group = ((Newsgroup *)aCell->aux); [group addSeenFirst:group->available.first last:group->available.last]; return self; } - setGroupForm:anObject { groupForm = anObject; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.