static char *sccs_id= (sccs_id, "@(#)Group.c	3.6 7/28/92");

//$Group$
#include "Group.h"
#include "DrawView.h"
#include "ObjList.h"
#include "Class.h"

//---- Group -------------------------------------------------------------------

MetaImpl0(Group);

Group::Group(ObjList *gr)
{
    ObjListIter next(gr);
    Shape *s;
    Rectangle b;
    group= gr;

    while (s= (Shape*)next())
	b.Merge(s->bbox);
#ifdef ET25
    next.Reset();
#else
    next.Reset(group);
#endif
    while (s= (Shape*)next())
	s->bbox-= b.origin;   
    Init(b.NW(), b.SE());
}

Group::~Group()
{
    SafeDelete(group);
}

void Group::SetContainer(View *v)
{
    Shape::SetContainer(v);
    group->ForEach(Shape,SetContainer)(v);
}
	
ObjList *Group::Ungroup()
{
    ObjList *copy= (ObjList*)group->DeepClone();
    ObjListIter next(copy);
    Shape *s;
    
    while (s= (Shape*)next())
	s->bbox+= bbox.origin;   
    return copy;
}

void Group::Draw(Rectangle r)
{
#ifdef ET25
    Iter previous(group->MakeReversedIterator());
#else
    RevObjListIter previous(group);
#endif
    register Shape *s;

#ifdef ET25
    GrTranslate(bbox.origin);
#else
    Point oldorigin= port->origin;
    port->origin+= bbox.origin;
#endif
    r.origin-= bbox.origin;
    while (s= (Shape*) previous())
        s->DrawAll(r);
#ifdef ET25
    GrTranslate(-bbox.origin);
#else
    port->origin= oldorigin;
#endif
}


void Group::Highlight(HighlightState h)
{
    GrSetInk(ePatGrey50);
    Shape::Highlight(h);
    GrSetInk(ePatBlack);
}

ShapeStretcher *Group::NewStretcher(class DrawView *, int)
{
    return (ShapeStretcher*) gNoChanges;
}

#ifdef ET25
OStream& Group::PrintOn(OStream& s)
#else
ostream& Group::PrintOn(ostream& s)
#endif
{
    Shape::PrintOn(s);
    return s << group SP;
}

#ifdef ET25
IStream& Group::ReadFrom(IStream& s)
#else
istream& Group::ReadFrom(istream& s)
#endif
{
    Shape::ReadFrom(s);
    return s >> group;
}
