This is MainWindowControl.m in view mode; [Download] [Up]
#import "Alexandra.h"
#import "MainWindowControl.h"
#import "NewsgroupSetMatrix.h"
#import "NewsgroupSet.h"
#import "Newsgroup.h"
#import "SideSplitView.h"
#import "NntpPanelControl.h"
#import "ArticleViewControl.h"
#import "Decoding.subproj/DecoderController.h"
#import "NNTP.h"
#import "KillFile.h"
#include <math.h>
#import <misckit/MiscAppDefaults.h>
#import "descriptors.h"
#import "KeyEventResponder.h"
@implementation MainWindowControl
- free
{
[otherNGView free];
[theNGSet dumpNewsrc:self];
[[mainWindow close] free];
[offscreenWindow free];
[theNGSet free];
[theArticleSet free];
[nntpServer free];
[theArticleViewControl free];
[killFile free];
return [super free];
}
- (BOOL) connectNNTP:(const char *)servername slowLink:(BOOL)slow
{
char buf1[100],buf2[100];
const char *sideSplitViewW;
const char *splitViewH;
id keyHandler;
[nntpServer init];
[nntpServer setSlowLink:slow];
if([nntpServer openServerNamed:servername]==nil)
return FALSE;
[killFile setPath];
[postButton setEnabled:[nntpServer canPost]];
if(![nntpServer canPost])
{
[postButton setTitle:[postButton altTitle]];
[postButton setIcon:[postButton altIcon]];
}
EM_DURING
[theNGSet scanNewsrcAndActive];
EM_HANDLER
if([EMLocalException exceptionClass]==EMClassNNTPErrors)
return(FALSE);
NX_RERAISE();
EM_ENDHANDLER
sprintf(buf1,"SideSplitView %s",servername);
sprintf(buf2,"SplitView %s",servername);
sideSplitViewW=[NXApp defaultValue:buf1];
splitViewH=[NXApp defaultValue:buf2];
if(sideSplitViewW!=NULL){
NXRect theRect;
[upperPartLeft getFrame:&theRect];
[upperPartLeft sizeTo:atof(sideSplitViewW) :NX_HEIGHT(&theRect)];
}
if(splitViewH!=NULL){
NXRect theRect;
int uheight,lheight;
sscanf(splitViewH,"%d %d",&uheight,&lheight);
[sideSplitView getFrame:&theRect];
[sideSplitView sizeTo:(NX_WIDTH(&theRect)) :(NXCoord)(uheight+4)];
[articleView getFrame:&theRect];
[articleView sizeTo:(NX_WIDTH(&theRect)) :(NXCoord)(lheight+4)];
}
[sideSplitView setLeftView:upperPartLeft];
[sideSplitView setRightView:upperPartRight];
[sideSplitView initViews];
[splitView addSubview:sideSplitView];
[splitView addSubview:articleView];
[splitView adjustSubviews];
[[theArticleViewControl theText] setDelegate:theArticleViewControl];
[theNGSetMatrix setMatrixCellList:[theNGSet matrixList]];
[theNGSetMatrix loadMatrix];
[otherNGView setMatrixCellList:[theNGSet matrixList]];
[mainWindow setTitle:servername];
[mainWindow setFrameAutosaveName:servername];
[mainWindow setFrameUsingName:servername];
[mainWindow makeFirstResponder:theNGSetMatrix];
keyHandler=[[KeyEventResponder alloc] init];
[keyHandler setNextResponder:[splitView nextResponder]];
[splitView setNextResponder:keyHandler];
[keyHandler setNGSet:theNGSet];
[keyHandler setArticleSet:theArticleSet];
sprintf(buf1,"BrowserViewEnabled %s",servername);
if([NXApp defaultBoolValue:buf1])
[theNGSet switchToBrowserView:self];
[mainWindow display];
[mainWindow makeKeyAndOrderFront:self];
return TRUE;
}
- disconnectAndClose:sender;
{
return [mainWindow performClose:sender];
}
- nntpServer
{
return nntpServer;
}
- killFile
{
return killFile;
}
- articleText
{
return [theArticleViewControl theText];
}
- newsgroupMatrix
{
return [theNGSet theMatrix];
}
- articleMatrix
{
return [theArticleSet theMatrix];
}
- articleViewControll
{
return theArticleViewControl;
}
- newsgroupSet
{
return theNGSet;
}
- articleSet
{
return theArticleSet;
}
- (BOOL)articleSelected
{
return ([theArticleSet numSelCells]==1);
}
- (BOOL)articlesSelected
{
return ([theArticleSet numSelCells]>0);
}
- (BOOL)newsgroupSelected
{
return ([theNGSet numSelCells]==1);
}
- (BOOL)newsgroupsSelected
{
return ([theNGSet numSelCells]>0);
}
- printText:sender
{
[theArticleViewControl printText:sender];
return self;
}
- uudecode:sender
{
if ([self articlesSelected]) {
// Lazily load the decoder controller.
if (decoderController == nil) {
decoderController = [ [DecoderController alloc] init];
}
// Begin the uudecoding, and pass self since the uudecoder needs
// access to the article list, etc.
[decoderController doDecoding:self];
}
else {
NXBeep();
}
return self;
}
- forward:(SEL)aSelector :(marg_list)argFrame
{
if([theArticleSet respondsTo:aSelector])
return [theArticleSet performv:aSelector :argFrame];
if([theNGSet respondsTo:aSelector])
return [theNGSet performv:aSelector :argFrame];
if([theArticleViewControl respondsTo:aSelector])
return [theArticleViewControl performv:aSelector :argFrame];
if([killFile respondsTo:aSelector])
return [killFile performv:aSelector :argFrame];
[self doesNotRecognize:aSelector];
return self;
}
- (BOOL)respondsTo:(SEL)aSelector
{
if([theArticleSet respondsTo:aSelector])
return TRUE;
if([theNGSet respondsTo:aSelector])
return TRUE;
if([theArticleViewControl respondsTo:aSelector])
return TRUE;
if([killFile respondsTo:aSelector])
return TRUE;
return [super respondsTo:aSelector];
}
- sideSplitViewDidResizeSubviews:sender
{
char buf1[80];
char buf2[80];
NXRect frameRect;
[upperPartLeft getFrame:&frameRect];
sprintf(buf1,"SideSplitView %s",[nntpServer serverName]);
sprintf(buf2,"%d",(int)floor(NX_WIDTH(&frameRect)));
[NXApp setDefault:buf1 to:buf2];
return self;
}
- splitViewDidResizeSubviews:sender
{
NXRect frameRect1,frameRect2;
char buf1[80],buf2[80];
[sideSplitView getFrame:&frameRect1];
[articleView getFrame:&frameRect2];
sprintf(buf1,"SplitView %s",[nntpServer serverName]);
sprintf(buf2,"%d %d", (int)floor(NX_HEIGHT(&frameRect1)), (int)floor(NX_HEIGHT(&frameRect2)));
[NXApp setDefault:buf1 to:buf2];
return self;
}
- windowWillMiniaturize:sender toMiniwindow:miniwindow
{
[sender setMiniwindowIcon:"app"];
return self;
}
- (BOOL)killAuthorEnabled
{
if((![nntpServer usesNov])&&(![nntpServer doesPrefetchFrom]))
return FALSE;
return TRUE;
}
- (BOOL)sortCellEnabled:menueCell
{
BOOL answer=TRUE;
char buf1[255];
int sortType;
BOOL useNov=[nntpServer usesNov];
sprintf(buf1,"SortType %s",[nntpServer serverName]);
sortType=[NXApp defaultIntValue:buf1];
if(!useNov){
if((![nntpServer doesPrefetchDate])&&
([menueCell action]==@selector(sortArticlesByDate:)))
return FALSE;
if((![nntpServer doesPrefetchFrom])&&
([menueCell action]==@selector(sortArticlesByName:)))
return FALSE;
}
switch(sortType){
case SORT_BY_NUMBER:
if([menueCell action]==@selector(sortArticlesByNumber:)) answer=FALSE;
break;
case SORT_BY_SUBJECT:
if([menueCell action]==@selector(sortArticlesBySubject:)) answer=FALSE;
break;
case SORT_BY_DATE:
if([menueCell action]==@selector(sortArticlesByDate:)) answer=FALSE;
break;
case SORT_BY_REAL_NAME:
if([menueCell action]==@selector(sortArticlesByName:)) answer=FALSE;
break;
}
return answer;
}
- freeAndClose:sender
{
[myOwner serverWillClose:self];
[self free];
return self;
}
- windowWillClose:sender
{
int answer=NXRunAlertPanel("ALEXANDRA","Close connection to NNTP Server %s?",NULL, "Cancel",NULL,[nntpServer serverName]);
if(answer!=NX_ALERTALTERNATE){
[self freeAndClose:self];
return self;
}
return nil;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.