ftp.nice.ch/pub/next/graphics/video/VideoTeXT.1.1a.N.bs.tar.gz#/VideoTeXT1.1a/Quelltexte/Inspector.m

This is Inspector.m in view mode; [Download] [Up]

/* (c) 1992 Dirk Schwarzhans, Matthias Braun
   Use under the terms of the GNU General Public License */
   
#import "Inspector.h"

#import <appkit/Application.h>
#import <appkit/Button.h>
#import <appkit/Form.h>
#import <appkit/FormCell.h>
#import <appkit/Matrix.h>
#import <appkit/Panel.h>
#import <appkit/Text.h>
#import <appkit/View.h>
#import <objc/List.h>

#define STATE2BOOL(a) (a ? YES : NO)
#define BOOL2STATE(a) (a ? 1 : 0)

@implementation Inspector

// **********************************************************
// Dummy-Methoden för den Fall, daû kein delegate bekannt ist
// **********************************************************
- requestPage:(int)page subpage:(int)subpage forWindow:(Window *)window
{	return self;	}

- subpageBrowse:(int)direction
{	return self;	}

- clearPageMemoryRequested
{	return self;	}

- holdPage:(BOOL)mode
{	return self;	}
- setIVTRegisters:(unsigned char)mode :(unsigned char)normDispCtrl 
  :(unsigned char)newsDispCtrl :(unsigned char)dispMode
{	return self;	}

// ************************************************************
// interne Methoden, die nach auûen nicht bekanntgegeben werden
// ************************************************************
- getColorsFromView
{
	const NXColor	*colors;
	int				i;

	colors = [inspectedView colorTab];
	for (i = 0; i < VT_COLORS; i++)
		[colorWells[i] setColor:colors[i]];

	return self;
}

- updatePageControlBox
{
	if ([inspectedView isFlashing] == YES)
		[flashSwitch setState:1];
	else
		[flashSwitch setState:0];

	if ([inspectedView textHidden] == YES)
		[showHiddenSwitch setState:1];
	else
		[showHiddenSwitch setState:0];
		
	[fontSizeForm setIntValue:[inspectedView fontSize]];

	return self;
}

// *******************************************************************
// Methoden öber die der Inspektor initialisiert und konfiguriert wird
// *******************************************************************
- initAndEnable:(BOOL)mode;
{
	[super init];
	[NXApp loadNibSection:"Inspector.nib" owner:self];
	menuMatrix = [[[inspectorMenuButton cell] target] itemList];
	[menuMatrix selectCellAt:0:0];
	inspectedView = nil;
	delegate = self;

	activeBox = idleBox;
	[self setEnabled:mode];
	[inspectorPanel makeKeyAndOrderFront:self];
	[self ivtSwitchesChanged:self];
	
	// Muû leider sein, da man im IB keine Matrix mit NXColorWells bekommt. 
	colorWells[0] = colorWellBlack;
	colorWells[1] = colorWellRed;
	colorWells[2] = colorWellGreen;
	colorWells[3] = colorWellYellow;
	colorWells[4] = colorWellBlue;
	colorWells[5] = colorWellMagenta;
	colorWells[6] = colorWellCyan;
	colorWells[7] = colorWellWhite;
	// Man könnte natörlich eine Klasse 'NXColorWellCell' als Unterklasse von 'Cell'
	// schreiben und den Interface-Builder öber ladbare Paletten erweitern, damit
	// er Matrizen von 'NXColorWell' unterstötzt.
	
	return self;
}

- init
{
	return [self initAndEnable:NO];
}

- inspectView:(VideoTextView *)view
{
	inspectedView = view;
	[self getColorsFromView];
	[self updatePageControlBox];
	[inspectorPanel display];
	return self;
}

- setDelegate:object
{
	delegate = object;
	
	return self;
}

- setEnabled:(BOOL)mode
{
	[inspectorMenuButton setEnabled:mode];
	[[menuMatrix cellList] makeObjectsPerform:@selector(setEnabled:) with:(id)mode];
	if (mode == YES)
		[self menuEntrySelected:menuMatrix];
	else
	{
		[[inspectorPanel contentView] replaceSubview:activeBox with:idleBox];
		activeBox = [idleBox display];
	}
	enabled = mode;
	
	return self;	
}

- (BOOL)isEnabled
{
	return enabled;
}

- makeKeyAndOrderFront:sender;
{
	[inspectorPanel makeKeyAndOrderFront:self];
	return self;
}

// ************************************************************************
// Methoden mit denen von 'Auûen' ZustÙnde der Schalter oder der Inhalt der
// Textfelder im InspectorPanel verÙndert werden
// ************************************************************************
- setIncomingPage:(const char *)number
{
	[incomingPagesText setStringValue:number];

	return self;
}

- setHoldPageSwitch:(BOOL)mode
{
	[holdSwitch setState:BOOL2STATE(mode)];

	return self;
}

- setCareSubpage:(BOOL)mode
{
	[subpageSwitch setState:BOOL2STATE(mode)];
	[[requestDataForm cellAt:1:0] setEnabled:mode];

	return self;
}

- setRequestPage:(int)page
{
	[requestDataForm setIntValue:page at:0];
	
	return self;
}

- setRequestSubpage:(int)subpage
{
	[requestDataForm setIntValue:subpage at:1];	
	
	return self;
}

// *************************************************************************
// Methoden die öber Schalter, etc. aus dem InspectorPanel aufgerufen werden
// *************************************************************************
- menuEntrySelected:sender
{
	Box *newBox;
	
	switch([sender selectedRow])
	{
	case 0:
		newBox = pageDataBox;
		break;
	case 1:
		newBox = displayControlBox;
		break;
	case 2:
		newBox = colorControlBox;
		break;
	case 3:
		newBox = ivtControlBox;
		break;
	default:
		newBox = idleBox;
		break;
	}
	[inspectorMenuButton setTitleNoCopy:[[sender selectedCell] title]];
	[[inspectorPanel contentView] replaceSubview:activeBox with:newBox];
	[activeBox = newBox display];
		
    return self;
}

- resetColorPanel:sender
{
	[inspectedView resetColorTab];
	[self getColorsFromView];
	
    return self;
}

- setColors:sender
{
	NXColor	colors[VT_COLORS];
	int		i;
	
	for (i = 0; i < VT_COLORS; i++)
		colors[i] = [colorWells[i] color];
		
	[inspectedView setColorTab:colors];
	
    return self;
}

- displaySwitchChanged:sender
{
	[inspectedView allowFlashing:STATE2BOOL([flashSwitch state])];
	[inspectedView showHiddenText:STATE2BOOL([showHiddenSwitch state])];

    return self;
}

- newPageRequested:sender
{
	int page, subpage;
	
	page = [requestDataForm intValueAt:0];
	if ([subpageSwitch state] == 1)
		subpage = [requestDataForm intValueAt:1];
	else
		subpage = 0;		
	
	[delegate requestPage:page subpage:subpage forWindow:[inspectedView window]];
			  
	return self;
}

- holdSwitchChanged:sender
{
	[delegate holdPage:STATE2BOOL([sender state])]; 

	return self;
}

- subpageForwardBackward:sender
{
	[delegate subpageBrowse:(2 * [sender selectedCol] - 1)];

	return self;
}

- clearPageMemory:sender
{
	[delegate clearPageMemoryRequested];

	return self;
}

- subpageSwitchChanged:sender
{
	[self setCareSubpage:STATE2BOOL([sender state])];
    
	return self;
}

- newPageNumberEntered:sender
{
	if ([sender selectedRow] == 1 || [subpageSwitch state] == 0)
		[pageRequestButton performClick:self];
	else
		[sender selectTextAt:1];

	return self;
}

- ivtSwitchesChanged:sender
{
	unsigned char mode, normDispCtrl, newsDispCtrl, dispMode;
	int i;
	static const unsigned char regBit[] = {64, 4, 1};
	
	dispMode = normDispCtrl = newsDispCtrl = 0;
	
	// flimmerfrei
	if ([[teleDisplaySwitches cellAt:0 :0] state])
		mode = 6;
	else
		mode = 0;
		
	// Einblendefeld in Zeile
	for (i = 0; i < 3; i++)
	{
		if ([[boxPositionSwitches cellAt:0 :i] state])
			dispMode |= (1 << i); 
	}
	
	// Textfreigabe
	if ([[teleDisplaySwitches cellAt:1 :0] state])
		dispMode |= 32;
		
	// doppelteHöhe, untere HÙlfte
	if ([[teleDisplaySwitches cellAt:0 :1] state])
	{
		dispMode |= 8;
		[[teleDisplaySwitches cellAt:1 :1] setEnabled:YES];
		if ([[teleDisplaySwitches cellAt:1 :1] state])
			dispMode |= 16;
	}
	else
	{
		[[teleDisplaySwitches cellAt:1 :1] setState:0];
		[[teleDisplaySwitches cellAt:1 :1] setEnabled:NO];
	}
	
	// Anzeige in Einblendefeldern
	for (i = 0; i < 3; i++)
	{
		if ([[normpageInBoxSwitches cellAt:i :0] state])
			normDispCtrl |= regBit[i];
		if ([[normpageOutBoxSwitches cellAt:i :0] state])
			normDispCtrl |= (regBit[i] << 1);
		if ([[newspageInBoxSwitches cellAt:i :0] state])
			newsDispCtrl |= regBit[i];
		if ([[newspageOutBoxSwitches cellAt:i :0] state])
			newsDispCtrl |= (regBit[i] << 1);
	}	
	
	[delegate setIVTRegisters:mode :normDispCtrl :newsDispCtrl :dispMode];
	
	return self;
}

// als 'delegate' von Text (fontSizeForm)
- textDidEnd:sender endChar:(unsigned short)whyEnd
{
	if (whyEnd == NX_RETURN)
	{
		[inspectedView setFontSize:[fontSizeForm intValueAt:0]];
		[inspectedView display];
	}

	return self;
}



@end

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.