This is NntpPanelControl.m in view mode; [Download] [Up]
#import "NntpPanelControl.h"
#import "ServerCell.h"
#import "MainWindowControl.h"
#import "NNTP.h"
#import "ArticleSet.h"
#import "NewsgroupSet.h"
#import "KillFilePanel.subproj/KillPanelController.h"
#import "descriptors.h"
#import "ArticleViewControl.h"
#include "regexpr.h"
#import "Alexandra.h"
#import "Composer.h"
@implementation NntpPanelControl
void handler(DPSTimedEntry te,double now, char *userData)
{
[((id)userData) newNewsAllServer:(id)userData];
}
- appWillTerminate:sender
{
int i,j;
id result=self;
result=[Composer confirmTermination];
if(result){
for(i=0,j=[nrList count];i<j;i++)
[[nrList objectAt:i] free];
}
return result;
}
- appDidBecomeActive:sender;
{
if([NXApp defaultBoolValue:DEFAULT_CHECKNN_ACTIVATION]){
[self renewNewNewsTimedEntry:self];
[self newNewsAllServer:self];
}
//[NXApp sendAction:@selector(newNews:) to:nil from:self];
return self;
}
- app:sender powerOffIn:(int)ms andSave:(BOOL)save
{
int i,j;
for(i=0,j=[nrList count];i<j;i++)
[[nrList objectAt:i] free];
return self;
}
- setupMenu:menu;
{
id aCell,aMenu;
int n,i;
aMenu=[[menu itemList] cellList];
n=[aMenu count];
for(i=0;i<n;i++)
{
aCell=[aMenu objectAt:i];
if(![aCell isEnabled])
{
[aCell setEnabled:TRUE];
if([aCell hasSubmenu])
[self setupMenu:[aCell target]];
else
{
[aCell setUpdateAction:@selector(menuActive:) forMenu:menu];
}
}
}
return self;
}
- appDidInit:sender
{
const char *buf;
BOOL openServers;
NXSize newCellSize,cellDist;
NXRect frameRect;
ServerCell *aCell;
openServers=FALSE;
nrList=[[List alloc] init];
[serverNameMatrix getFrame:&frameRect];
newCellSize.height=16.0;
newCellSize.width = frameRect.size.width;
cellDist.width=0.0;
cellDist.height=0.0;
[[serverNameMatrix superview] setAutoresizeSubviews:YES];
[serverNameMatrix setAutosizing:NX_WIDTHSIZABLE];
[serverNameMatrix setAutosizeCells:YES];
[serverNameMatrix setIntercell:&cellDist];
[[serverNameMatrix setCellSize:&newCellSize] setMode:NX_RADIOMODE];
[serverNameMatrix setMode:NX_RADIOMODE];
[serverNameMatrix setEmptySelectionEnabled:YES];
[serverNameMatrix setDoubleAction:[openButton action]];
aCell=[[ServerCell alloc] init];
[[[aCell setSlowLink:FALSE] setOpenOnStartup:FALSE] serverClosed:self];
[serverNameMatrix setPrototype:aCell];
[self setupMenu:mainMenu];
[NXApp setAutoupdate:TRUE];
//insert servernames in matrix
if(((buf=[NXApp defaultValue:"NNTPServer"])!=NULL)&&(*buf!='\0')){
List *cellList;
int i,j;
if(buf[0]=='\0')
return self;
[self addCellsToMatrix:buf];
cellList=[serverNameMatrix cellList];
j=[cellList count];
for(i=0;i<j;i++){
id aCell=[cellList objectAt:i];
[aCell readServerOptions];
if([aCell openOnStartup]==TRUE){
[serverNameMatrix selectCellAt:i:0];
[self openServer:self];
openServers=TRUE;
}
}
if(openServers==TRUE){
[serverNameMatrix selectCellAt:-1:-1];
}
}
if(openServers==FALSE)
[[serverNameMatrix window] makeKeyAndOrderFront:self];
//which regular expression syntax to use?
buf=[NXApp defaultValue:"RegExprSyntax"];
if(buf!=NULL){
if(!strcasecmp(buf,"EMACS"))
re_set_syntax(RE_SYNTAX_EMACS);
if(!strcasecmp(buf,"AWK"))
re_set_syntax(RE_SYNTAX_AWK);
else if(!strcasecmp(buf,"EGREP"))
re_set_syntax(RE_SYNTAX_EGREP);
else if(!strcasecmp(buf,"GREP"))
re_set_syntax(RE_SYNTAX_GREP);
}
[ERROR_MANAGER addObserver:self
selector:@selector(renewNewNewsTimedEntry:)
forError:ENOTEPrefsChanged];
[self renewNewNewsTimedEntry:self];
[[NXApp appListener] setServicesDelegate:self];
return self;
}
- addCellsToMatrix:(const char *)serverlist
{
char buf[200];
const char *ptr;
int r,c;
id aCell;
ptr=serverlist;
while((ptr!=NULL)&&(ptr[0]!='\0')){
sscanf(ptr,"%s",buf);
[serverNameMatrix getNumRows:&r numCols:&c];
[serverNameMatrix addRow];
aCell=[serverNameMatrix cellAt:r :0];
[aCell setStringValue:buf];
ptr+=strlen(buf);
if(ptr[0]==' ')
ptr++;
}
[serverNameMatrix sizeToCells];
return self;
}
- addNewServer:sender
{
int i;
int r,c;
ServerCell *aCell;
const char *aString;
aString=[newServerName stringValue];
if(strchr(aString,' ')){
NXRunAlertPanel("ALEXANDRA","No space characters allowed in the nntp server name.",NULL,NULL,NULL);
return self;
}
if(aString[0]!='\0'){
[serverNameMatrix getNumRows:&r numCols:&c];
for(i=0;i<r;i++)
if(strcmp([[serverNameMatrix cellAt:i :0] stringValue],aString)==0)
return self;
[self addCellsToMatrix:aString];
aCell=[serverNameMatrix cellAt:r :0];
[aCell setOpenOnStartup:([newServerOOS state]==1)];
[aCell setSlowLink:([newServerSL state]==1)];
[aCell setUserString:[newServerUser stringValue] ];
[aCell setPasswdString:[newServerPassword stringValue] ];
[serverNameMatrix display];
[self addServerToDefaultDB:aString];
[aCell writeServerOptions];
}
[[newServerName controlView] selectTextAt:0];
return self;
}
- serverWillClose:sender
{
int i,j;
List *cellList;
const char *servername=[[sender nntpServer] serverName];
cellList=[serverNameMatrix cellList];
j=[cellList count];
for(i=0;i<j;i++){
ServerCell *aCell=[cellList objectAt:i];
if(strcmp([aCell stringValue],servername)==0){
[aCell serverClosed:self];
break;
}
}
[nrList removeObject:sender];
[serverNameMatrix display];
return self;
}
- openServer:sender
{
int i,j;
[serverNameMatrix getNumRows:&j numCols:&i];
for(i=0;i<j;i++){
ServerCell *aCell=[serverNameMatrix cellAt:i :0];
if(([aCell state]==1)&&([aCell isOpen]==FALSE)){
//open server
if(starter==nil)
if([NXApp loadNibSection:"newsreader.nib" owner:self withNames:NO]==nil)
return nil;
if([starter connectNNTP:[aCell stringValue] slowLink:[aCell slowLink]]==TRUE){
[nrList addObject:starter];
[aCell serverOpened:self];
starter=nil;
}
}
}
[serverNameMatrix display];
return self;
}
- removeServer:sender
{
int i,j;
[serverNameMatrix getNumRows:&j numCols:&i];
for(i=j-1;i>=0;i--){
ServerCell *aCell=[serverNameMatrix cellAt:i :0];
if(([aCell state]==1)&&([aCell isOpen]==FALSE)){
[self removeServerFromDefaultDB:[aCell stringValue]];
[serverNameMatrix removeRowAt:i andFree:YES];
}
}
[[serverNameMatrix sizeToCells] display];
[self serverSelected:self];
return self;
}
- serverSelected:sender
{
List *selList;
int j;
selList=[serverNameMatrix getSelectedCells:nil];
j=[selList count];
if(j==1){
ServerCell *aCell=[selList objectAt:0];
[[newServerOOS setState:(int)[aCell openOnStartup]] display];
[[newServerSL setState:(int)[aCell slowLink]] display];
[newServerUser setStringValue:[aCell user]];
[newServerPassword setStringValue:[aCell pass]];
[newServerName takeStringValueFrom:[selList lastObject]];
[[newServerName controlView] selectTextAt:0];
[openButton setEnabled:![aCell isOpen]];
[removeButton setEnabled:![aCell isOpen]];
}
else {
[[newServerOOS setState:0] display];
[[newServerSL setState:0] display];
[newServerName setStringValue:""];
[newServerPassword setStringValue:""];
[newServerUser setStringValue:""];
[openButton setEnabled:FALSE];
[removeButton setEnabled:FALSE];
}
[selList free];
return self;
}
- windowDidUpdate:(Window *)sender;
{
const char *uname;
int i,r,c;
if([NXApp keyWindow]!=[serverNameMatrix window])
return self;
uname=[newServerName stringValue];
[serverNameMatrix getNumRows:&r numCols:&c];
for(i=0;i<r;i++)
if(!strcmp([[serverNameMatrix cellAt:i:0] stringValue],uname))
break;
if(i==r){
[serverNameMatrix selectCellAt:-1:-1];
[openButton setEnabled:FALSE];
[removeButton setEnabled:FALSE];
//[newServerUser setStringValue:""];
//[newServerPassword setStringValue:""];
}
else{
ServerCell *aCell=[serverNameMatrix cellAt:i:0];
[serverNameMatrix selectCellAt:i:0];
[openButton setEnabled:![aCell isOpen]];
[removeButton setEnabled:![aCell isOpen]];
//[newServerUser setStringValue:[aCell user]];
//[newServerPassword setStringValue:[aCell pass]];
}
[addButton setEnabled:((i==r)&&(uname[0]!='\0'))];
return self;
}
- openOnStartup:sender
{
id selCell=[serverNameMatrix selectedCell];
if(selCell!=nil){
[selCell setOpenOnStartup:(BOOL)[newServerOOS state]];
[selCell writeServerOptions];
}
return self;
}
- slowLink:sender
{
id selCell=[serverNameMatrix selectedCell];
if(selCell!=nil){
[selCell setSlowLink:(BOOL)[newServerSL state]];
[selCell writeServerOptions];
}
return self;
}
- (BOOL)menuActive:menuCell
{
id currentDelegate=[[NXApp mainWindow] delegate];
BOOL askIfEnable=[currentDelegate isKindOf:[MainWindowControl class]];
BOOL menuEnabled=[menuCell isEnabled];
BOOL enable;
if(askIfEnable==TRUE){
const char *menuTitle=[menuCell title];
const char *action=[actionTable valueForStringKey:menuTitle];
if(action!=NULL){
if(strcmp(action,"sorting")==0)
enable=[currentDelegate sortCellEnabled:menuCell];
else if(strcmp(action,"viewselector")==0)
enable=[currentDelegate selectViewCellEnabled:menuCell];
else if(strcmp(action,"headerfield")==0)
enable=[currentDelegate headermodeCellEnabled:menuCell];
else{
SEL aSel=sel_getUid(action);
int e=(int)[currentDelegate perform:aSel];
enable=(e==1);
if(enable&&([menuCell action]==@selector(killAuthor:)))
enable=[currentDelegate killAuthorEnabled];
}
}
else
enable=TRUE;
}
else
enable=FALSE;
if(enable!=menuEnabled){
[menuCell setEnabled:enable];
return TRUE;
}
return FALSE;
}
- addServerToDefaultDB:(const char *)name
{
char *buf;
const char *server=[NXApp defaultValue:"NNTPServer"];
if((server==NULL)||(server[0]=='\0')){
[NXApp setDefault:"NNTPServer" to:name];
return self;
}
buf=(char *)malloc((strlen(name)+strlen(server)+2)*sizeof(char));
strcpy(buf,server);
if(server!=NULL)
strcat(buf," ");
strcat(buf,name);
[NXApp setDefault:"NNTPServer" to:buf];
free(buf);
return self;
}
- removeServerFromDefaultDB:(const char *)name
{
int i;
char *buf;
char *tail;
const char *server=[NXApp defaultValue:"NNTPServer"];
tail=strstr(server,name);
if(tail!=NULL){
i=strlen(server)-strlen(tail);
buf=(char *)malloc(strlen(server)*sizeof(char));
tail+=strlen(name);
if(tail[0]==' ')
tail++;
else if(i>0)
i--;
strncpy(buf,server,i);
buf[i]='\0';
strcat(buf,tail);
[NXApp setDefault:"NNTPServer" to:buf];
free(buf);
}
return self;
}
- showKillPanel:sender
{
if(![[[NXApp mainWindow] delegate] isKindOf:[MainWindowControl class]])
return self;
if(killPanelController==nil)
if([NXApp loadNibSection:"KillPanel.nib" owner:self withNames:NO]==nil){
killPanelController=nil;
return nil;
}
[killPanelController showPanel:[NXApp mainWindow]];
return self;
}
- showArticleInspector:sender
{
static id articleInspector=nil;
if(!articleInspector)
articleInspector=[[ArticleHeaderController alloc] init];
[[articleInspector window] makeKeyAndOrderFront:self];
return self;
}
- setUser:sender
{
id selCell=[serverNameMatrix selectedCell];
if(selCell!=nil){
[selCell setUserString:[newServerUser stringValue]];
[selCell writeServerOptions];
}
return self;
}
- setPasswd:sender
{
id selCell=[serverNameMatrix selectedCell];
if(selCell!=nil){
[selCell setPasswdString:[newServerPassword stringValue]];
[selCell writeServerOptions];
}
return self;
}
- newNewsAllServer:sender
{
int i,j=[nrList count];
for(i=0;i<j;i++)
[[[nrList objectAt:i] newsgroupSet] newNews:self];
return self;
}
- renewNewNewsTimedEntry:sender
{
int interval;
[self removeNewNewsTimedEntry:self];
interval=[NXApp defaultIntValue:DEFAULT_CHECKNN_PERIOD];
if(interval>0)
newNewsTE=DPSAddTimedEntry(interval*60.0,(DPSTimedEntryProc)handler,
self,NX_BASETHRESHOLD);
return self;
}
- removeNewNewsTimedEntry:sender
{
if(newNewsTE){
DPSRemoveTimedEntry(newNewsTE);
newNewsTE=0;
}
return self;
}
- performURLService:pboard userData:(const char *)data error:(char **)err
{
char *buf,*url;
int length,i,j;
[pboard types];
[pboard readType:NXAsciiPboardType data:&buf length:&length];
if(length>5){
id aCell=nil;
url=malloc((length+2)*sizeof(char));
strncpy(url,buf,length);
url[length]='\0';
[serverNameMatrix getNumRows:&j numCols:&i];
for(i=0;i<j;i++){
id someCell=[serverNameMatrix cellAt:i :0];
if([someCell isOpen]){
aCell=someCell;
break;
}
}
if(aCell){
id mc=nil;
for(i=0,j=[nrList count];i<j;i++){
id aMainController=[nrList objectAt:i];
if(!strcmp([[aMainController nntpServer] serverName],
[aCell stringValue])){
mc=aMainController;
break;
}
}
[[mc newsgroupSet] selectURL:url];
}
else
NXRunAlertPanel("Service","Can't select article. No connection to any server.",NULL,NULL,NULL);
free(url);
}
else
NXRunAlertPanel("Service","No valid URL.",NULL,NULL,NULL);
[pboard deallocatePasteboardData:buf length:length];
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.