/*
Pencil V1.0, Copyright 1994, 95 by Florian Marquardt.
This program may be distributed under the terms of the GNU general
public license (Start Pencil and select "Info>COPYING..." for a copy of the
license).
*/
#import "MultipleSelection.h"

@implementation MultipleSelection
- (BOOL)selected:(NXEvent *)te:(int *)cp:(id)view
{	int i=[slist count]; while(i--) if([[slist objectAt:i] selected:te:cp:view]) return YES; return NO; }
- (BOOL)move:(NXEvent *)te:(int *)cp:(id)view:(float)bsize
{ return NO;  }
- create:(NXEvent *)te:(int *)cp:(id)view:(float)bsize { return self; }
- createPolyFreehand:(NXEvent *)te:(int *)cp:(id)view:(float)bsize { return self; }
- (void)draw:(NXRect *)re
{	int i, c=[slist count]; for(i=0;i<c;i++) [[slist objectAt:i] draw:re]; }
- (void)drawControl:(NXRect *)re:(int)cp:(float)bsize
{	int i, c=[slist count]; for(i=0;i<c;i++) [[slist objectAt:i] drawControl:re:-1:bsize]; }
- initWithSettings:(char *)name:(NXColor)co1:(NXColor)co2:(float)lw:(char *)dm:(char *)fm:(char *)sm:(char *)ud
{ return self; }
- giveSettings:(char **)name:(NXColor *)co1:(NXColor *)co2:(float *)lw:(char **)dmeth:(char **)fillmeth:(char **)strokemeth:(char **)ud { [[slist objectAt:0] giveSettings:name:co1:co2:lw:dmeth:fillmeth:strokemeth:ud]; return self; }
- setMethodname:(char*)name
{ int i=[slist count]; while(i--) [[slist objectAt:i] setMethodname:name]; return self; }
- setDrawingMethod:(char *)name
{ int i=[slist count]; while(i--) [[slist objectAt:i] setDrawingMethod:name]; return self; }
- setStrokeMethod:(char *)name
{ int i=[slist count]; while(i--) [[slist objectAt:i] setStrokeMethod:name]; return self; }
- setFillMethod:(char *)name
{ int i=[slist count]; while(i--) [[slist objectAt:i] setFillMethod:name]; return self; }
- setSpecialAttributes:(char *)name
{ int i=[slist count]; while(i--) [[slist objectAt:i] setSpecialAttributes:name]; return self; }
- setColor1:(NXColor)col
{ int i=[slist count]; while(i--) [[slist objectAt:i] setColor1:col]; return self; }
- setColor2:(NXColor)col
{ int i=[slist count]; while(i--) [[slist objectAt:i] setColor2:col]; return self; }
- setLineWidth:(float)lw
{ int i=[slist count]; while(i--) [[slist objectAt:i] setLineWidth:lw]; return self; }
- addTranslation:(float)dtx:(float)dty
{ int i=[slist count]; while(i--) [[slist objectAt:i] addTranslation:dtx:dty]; return self; }
- (void)rotateAroundCenter:(float)x:(float)y fromPoint:(NXPoint *)pt1 toPoint:(NXPoint *)pt2
{ int i=[slist count]; while(i--) [[slist objectAt:i] rotateAroundCenter:x:y fromPoint:pt1 toPoint:pt2]; }
- insertNextPoint:(int *)cp { return self; }
- insertPoint:(int *)cp { return self; }
- deletePoint:(int *)cp { return self; }
- calculateBoundingBox:(id)view
{
NXRect thebounds; int i=[slist count]-1;
[[slist objectAt:i] calculateBoundingBox:view]; [[slist objectAt:i] giveBounds:&bounds];
while(i--) { [[slist objectAt:i] calculateBoundingBox:view]; [[slist objectAt:i] giveBounds:&thebounds]; NXUnionRect( &thebounds, &bounds); } return self;
}
- giveBounds:(NXRect *)bnd
{  *bnd=bounds; return self; }
- initWithGraphic:(id)graphic
{	[super init]; slist=[[[List alloc] init] addObject:graphic]; return self; }
- initEmpty
{	[super init]; slist=[[List alloc] init]; return self; }
- addToSelection:(id)graphic posFromEnd:(int)pos
{	[slist insertObject:graphic at:[slist count]-pos]; return self; }
- free
{
	int i;
	if(slist)
	{
	i=[slist count];
	while(i--) [[slist objectAt:i] select:NO];
	[slist free];
	}
	return [super free];
}
- freeOrig
{
	return [super free];
}
- select:(BOOL)yesno { if(yesno==NO) { [self free]; } return self; }
- toFrontIn:(id)list
{
	int i, c=[list count]; id g;
	for(i=0;c--;++i) if([g=[list objectAt:i] selected]) { [list removeObjectAt:i];  [list addObject:g]; --i; }
	return self;
}
- toBackIn:(id)list
{
	int i,c=[list count]; id g;
	for(i=c-1;c--;--i) if([g=[list objectAt:i] selected]) { [list removeObjectAt:i];  [list insertObject:g at:0]; ++i; }
	return self;
}
- deleteThemIn:(id)list
{
	int i=[slist count]; id g;
	while(i--) { [list removeObject:g=[slist objectAt:i]]; [g free]; }
	[slist free];
	slist=nil;
	return [self free];
}
- (BOOL)partOfSelection:(id)graphic
{
	if([slist indexOf:graphic]==NX_NOT_IN_LIST) return(NO); else return(YES);
}
- addElementsTo:(id)list
{
	int i, c=[slist count];
	for(i=0;i<c;i++)	[list addObject:[[slist objectAt:i] select:YES]];
	return self;
}

- moveElementsFrom:(id)list1 to:(id)list2
{
	int i, c=[slist count];
	for(i=0;i<c;i++)	{ [list1 removeObject:[slist objectAt:i]]; [list2 addObject:[[slist objectAt:i] select:YES]]; }
	return self;
}

- (void)scaleCenter:(float)cx:(float)cy by:(float)scx:(float)scy
{ int i=[slist count]; while(i--) [[slist objectAt:i] scaleCenter:cx:cy by:scx:scy];
}

- slist { return slist; }

- write:(NXTypedStream *)stream
{
	int i,n;

	[super write:stream];
	n=[slist count];
	NXWriteType(stream, "i", &n);
	for(i=0;i<n;i++)
		NXWriteObject(stream, [slist objectAt:i]);
	return self;
}

- read:(NXTypedStream *)stream
{
	int i,n;

	[super read:stream];
	n=[slist count];
	NXReadType(stream, "i", &n);
	if(slist)	[slist free];
	[slist=[List alloc] setAvailableCapacity:n];
	for(i=0;i<n;i++)
		[slist addObject:NXReadObject(stream)];
	return self;
}
@end