|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T i
Length: 25982 (0x657e)
Types: TextFile
Names: »ibgrblock.c«
└─⟦8648bda34⟧ Bits:30007244 EUUGD5_II: X11R5
└─⟦87c3ac0e0⟧ »./contrib-3/contrib-3.00«
└─⟦de8ce1454⟧
└─⟦this⟧ »contrib/lib/iv/src/bin/ibuild/ibgrblock.c«
/*
* Copyright (c) 1991 Stanford University
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided
* that the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation, and that the name of Stanford not be used in advertising or
* publicity pertaining to distribution of the software without specific,
* written prior permission. Stanford makes no representations about
* the suitability of this software for any purpose. It is provided "as is"
* without express or implied warranty.
*
* STANFORD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
* IN NO EVENT SHALL STANFORD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "ibclasses.h"
#include "ibcmds.h"
#include "ibcreator.h"
#include "ibdialogs.h"
#include "ibed.h"
#include "ibgraphic.h"
#include "ibgrblock.h"
#include "ibgrcomp.h"
#include "ibinteractor.h"
#include "ibmanips.h"
#include "ibrect.h"
#include "ibrubrect.h"
#include "ibtools.h"
#include "ibvars.h"
#include "ibvarviews.h"
#include <Unidraw/catalog.h>
#include <Unidraw/clipboard.h>
#include <Unidraw/creator.h>
#include <Unidraw/iterator.h>
#include <Unidraw/manips.h>
#include <Unidraw/selection.h>
#include <Unidraw/ulist.h>
#include <Unidraw/unidraw.h>
#include <Unidraw/viewer.h>
#include <Unidraw/Commands/colorcmd.h>
#include <Unidraw/Commands/datas.h>
#include <Unidraw/Commands/edit.h>
#include <Unidraw/Commands/macro.h>
#include <Unidraw/Graphic/polygons.h>
#include <Unidraw/Tools/tool.h>
#include <InterViews/brush.h>
#include <InterViews/event.h>
#include <InterViews/painter.h>
#include <InterViews/rubrect.h>
#include <InterViews/shape.h>
#include <InterViews/transformer.h>
#include <string.h>
#include <stream.h>
/*****************************************************************************/
static const float PAGE_WIDTH = 8.5;
static const float PAGE_HEIGHT = 11.0;
/*****************************************************************************/
class IdrawData : public VoidData {
public:
IdrawData(IGraphicComps*);
virtual ~IdrawData();
};
IdrawData::IdrawData(IGraphicComps* grcomp) : VoidData(grcomp) {}
IdrawData::~IdrawData() {
IGraphicComps* top = (IGraphicComps*) _void;
delete top;
}
/*****************************************************************************/
class GrBlockData : public lbrtData {
public:
GrBlockData(GrBlockComp*);
virtual ~GrBlockData();
public:
Transformer* _tf;
};
GrBlockData::GrBlockData(GrBlockComp* grbcomp) : lbrtData(grbcomp) {
_tf = new Transformer(grbcomp->GetGrBlockGraphic()->GetTransformer());
}
GrBlockData::~GrBlockData () {
delete _tf;
}
class GrBlockPicture : public IBGraphic {
public:
GrBlockPicture(CanvasVar* = nil, Graphic* = nil);
virtual void SetCanvasVar(CanvasVar*);
virtual void SetColors(PSColor* f, PSColor* b);
virtual PSColor* GetBgColor();
void SetGrBlockGraphic(GrBlockGraphic*);
protected:
virtual void getExtent(float&, float&, float&, float&, float&, Graphic*);
virtual void draw(Canvas*, Graphic*);
virtual void drawClipped(Canvas*, Coord, Coord, Coord, Coord, Graphic*);
virtual void concatGS(Graphic*, Graphic*, Graphic*);
protected:
GrBlockGraphic* _grblockgr;
boolean _damage;
};
GrBlockPicture::GrBlockPicture (CanvasVar* c, Graphic* g) : IBGraphic(c, g) {
_grblockgr = nil;
_damage = false;
}
void GrBlockPicture::SetColors(PSColor*, PSColor*) {}
PSColor* GrBlockPicture::GetBgColor () {
if (_grblockgr != nil) {
return _grblockgr->GetBgColor();
}
return nil;
}
void GrBlockPicture::SetGrBlockGraphic(GrBlockGraphic* grblockgr) {
_grblockgr = grblockgr;
}
void GrBlockPicture::SetCanvasVar(CanvasVar* cvar) {
IBGraphic::SetCanvasVar(cvar);
if (_grblockgr != nil) {
_grblockgr->SetCanvasVar(cvar);
}
}
void GrBlockPicture::getExtent (
float& l, float& b, float& cx, float& cy, float& tol, Graphic* gs
) {
if (_grblockgr != nil) {
FullGraphic gstemp;
concat(_grblockgr, gs, &gstemp);
getExtentGraphic(_grblockgr, l, b, cx, cy, tol, &gstemp);
} else {
IBGraphic::getExtent(l, b, cx, cy, tol, gs);
}
}
void GrBlockPicture::draw (Canvas* c, Graphic* gs) {
Coord l, b, r, t;
if (_grblockgr != nil) {
getBox(l, b, r, t, gs);
if (_clipping != nil) {
BoxObj* src1 = new BoxObj(l, b, r, t);
BoxObj* src2 = _clipping;
BoxObj dest = *src1 - *src2;
_p->Clip(c, dest._left, dest._bottom, dest._right, dest._top);
_clipping = &dest;
IBGraphic::draw(c, gs);
_clipping = src2;
_p->Clip(c, src2->_left, src2->_bottom, src2->_right, src2->_top);
delete src1;
} else {
_clipping = new BoxObj(l, b, r, t);
_p->Clip(c, l, b, r, t);
IBGraphic::draw(c, gs);
_p->NoClip();
delete _clipping;
_clipping = nil;
}
} else {
IBGraphic::draw(c, gs);
}
}
void GrBlockPicture::drawClipped (
Canvas* c, Coord l, Coord b, Coord r, Coord t, Graphic* gs
) {
Graphic::drawClipped(c, l, b, r, t, gs);
}
void GrBlockPicture::concatGS (Graphic* a, Graphic* b, Graphic* dest) {
IBGraphic::concatGS(a, b, dest);
dest->FillBg(UNDEF);
dest->SetColors(nil, nil);
dest->SetFont(nil);
dest->SetBrush(nil);
}
/*****************************************************************************/
GrBlockComp::GrBlockComp (
GrBlockGraphic* g
) : MonoSceneComp(new GrBlockPicture) {
if (g != nil) {
GrBlockPicture* gp = (GrBlockPicture*) GetGraphic();
gp->Append(g);
gp->SetGrBlockGraphic(g);
GetClassNameVar()->SetName("GraphicBlock");
GetClassNameVar()->SetBaseClass("GraphicBlock");
}
_top = new IGraphicComps;
_top->Instantiate();
MonoSceneComp::Append(_top);
_top->GetGraphic()->SetTag(this);
_grblockgr = g;
}
GrBlockComp::~GrBlockComp () {
MonoSceneComp::Remove(_top);
delete _top;
}
ClassId GrBlockComp::GetClassId () { return GRBLOCK_COMP; }
boolean GrBlockComp::IsA (ClassId id) {
return GRBLOCK_COMP == id || MonoSceneComp::IsA(id);
}
void GrBlockComp::SetGrBlockGraphic(GrBlockGraphic* g) {
GetGraphic()->Remove(_grblockgr);
GetGraphic()->Append(g);
delete _grblockgr;
_grblockgr = g;
}
void GrBlockComp::Instantiate() {
if (_instanceNameVar == nil) {
MonoSceneComp::Instantiate();
} else {
MonoSceneComp::Instantiate();
}
}
void GrBlockComp::Interpret(Command* cmd) {
if (cmd->IsA(IDRAW_CMD)) {
IdrawData* idata = (IdrawData*) cmd->Recall(this);
if (idata == nil) {
cmd->Store(this, new IdrawData(_top));
} else {
MonoSceneComp::Remove(_top);
IGraphicComps* top = (IGraphicComps*) idata->_void;
idata->_void = _top;
_top = top;
MonoSceneComp::Append(_top);
Propagate(cmd);
}
} else if (cmd->IsA(UNGROUP_CMD)) {
Component* comp = cmd->GetEditor()->GetComponent();
if (comp == (Component*) this) {
GraphicComps::Interpret(cmd);
Propagate(cmd);
}
} else if (cmd->IsA(PASTE_CMD)) {
Clipboard* cb = cmd->GetClipboard();
Iterator i;
if (cb == nil) {
Clipboard* globalcb = unidraw->GetCatalog()->GetClipboard();
if (globalcb->IsEmpty()) {
return;
}
cmd->SetClipboard(cb = globalcb->DeepCopy());
}
for (cb->First(i); !cb->Done(i);) {
GraphicComp* kid = cb->GetComp(i);
if (kid->IsA(INTERACTOR_COMP)) {
cb->Remove(i);
} else {
cb->Next(i);
}
}
InteractorComp::Interpret(cmd);
Propagate(cmd);
} else if (cmd->IsA(SCAN_CMD) || cmd->IsA(GETCONFLICT_CMD)) {
MonoSceneComp::Interpret(cmd);
} else if (cmd->IsA(COLOR_CMD)) {
ColorCmd* colorCmd = (ColorCmd*) cmd;
PSColor* fg = colorCmd->GetFgColor();
PSColor* bg = colorCmd->GetBgColor();
if (fg == nil) {
bg = (bg == nil) ? _grblockgr->GetBgColor() : bg;
cmd->Store(
this, new ColorData(
_grblockgr->GetFgColor(), _grblockgr->GetBgColor()
)
);
_grblockgr->SetColors(fg, bg);
Notify();
Propagate(cmd);
}
} else if (cmd->IsA(INFO_CMD)) {
MonoSceneComp::Interpret(cmd);
} else if (!cmd->IsA(FONT_CMD) && !cmd->IsA(PLACE_CMD)) {
InteractorComp::Interpret(cmd);
}
}
void GrBlockComp::Uninterpret(Command* cmd) {
if (cmd->IsA(IDRAW_CMD)) {
IdrawData* idata = (IdrawData*) cmd->Recall(this);
if (idata != nil) {
MonoSceneComp::Remove(_top);
IGraphicComps* top = (IGraphicComps*) idata->_void;
idata->_void = _top;
_top = top;
MonoSceneComp::Append(_top);
Unpropagate(cmd);
}
} else if (cmd->IsA(UNGROUP_CMD)) {
Component* comp = cmd->GetEditor()->GetComponent();
if (comp == (Component*) this) {
GraphicComps::Uninterpret(cmd);
Unpropagate(cmd);
}
} else if (cmd->IsA(COLOR_CMD)) {
ColorData* cd = (ColorData*) cmd->Recall(this);
if (cd != nil) {
_grblockgr->SetColors(cd->_fg, cd->_bg);
Notify();
Unpropagate(cmd);
}
} else if (cmd->IsA(INFO_CMD)) {
MonoSceneComp::Uninterpret(cmd);
} else if (!cmd->IsA(FONT_CMD) && !cmd->IsA(PLACE_CMD)) {
InteractorComp::Uninterpret(cmd);
}
}
void GrBlockComp::First(Iterator& i) {
_top->First(i);
}
void GrBlockComp::Last(Iterator& i) {
_top->Last(i);
}
void GrBlockComp::Next(Iterator& i) {
_top->Next(i);
}
void GrBlockComp::Prev(Iterator& i) {
_top->Prev(i);
}
boolean GrBlockComp::Done(Iterator i) {
return _top->Done(i);
}
boolean GrBlockComp::IsEmpty() {
Iterator i;
_top->First(i);
return _top->Done(i);
}
GraphicComp* GrBlockComp::GetComp(Iterator i) {
return _top->GetComp(i);
}
void GrBlockComp::SetComp(GraphicComp* comp, Iterator& i) {
_top->SetComp(comp, i);
}
void GrBlockComp::Append(GraphicComp* comp) {
_top->Append(comp);
}
void GrBlockComp::Prepend(GraphicComp* comp) {
_top->Prepend(comp);
}
void GrBlockComp::InsertBefore(Iterator i, GraphicComp* comp) {
_top->InsertBefore(i, comp);
}
void GrBlockComp::InsertAfter(Iterator i, GraphicComp* comp) {
_top->InsertAfter(i, comp);
}
void GrBlockComp::Remove(GraphicComp* comp) {
_top->Remove(comp);
}
void GrBlockComp::Remove(Iterator& i) {
_top->Remove(i);
}
void GrBlockComp::Bequeath () {
Graphic* root = GetGraphic();
root->Bequeath();
_top->Bequeath();
}
void GrBlockComp::StoreCanvas(Command* cmd) {
GrBlockData* prevData = (GrBlockData*) cmd->Recall(this);
Iterator i;
if (prevData == nil && GetCanvasVar() != nil) {
GrBlockGraphic* gr = GetGrBlockGraphic();
GrBlockData* grblockbox = new GrBlockData(this);
cmd->Store(this, grblockbox);
}
}
void GrBlockComp::RestoreCanvas(Command* cmd) {
Iterator i;
GrBlockData* d = (GrBlockData*) cmd->Recall(this);
if (d != nil) {
Place(this, d->_l, d->_b, d->_r-1, d->_t-1);
*GetShapeVar()->GetShape() = *d->_ibshape;
GetGraphic()->SetTransformer(new Transformer(d->_tr));
GetGrBlockGraphic()->SetTransformer(new Transformer(d->_tf));
Notify();
}
}
void GrBlockComp::Reconfig() {
Coord l, b, r, t;
_top->GetGraphic()->GetBox(l, b, r, t);
Shape* shape = GetShapeVar()->GetShape();
shape->width = r - l - 2;
shape->height = t - b - 2;
}
void GrBlockComp::Resize () {
Picture* topgr = (Picture*) _top->GetGraphic();
if (!topgr->IsEmpty()) {
topgr->Align(Center, _grblockgr, Center);
}
SubNotify();
}
void GrBlockComp::SubNotify () {
Iterator i;
Picture* topgr = (Picture*) _top->GetGraphic();
topgr->Bequeath();
for (First(i); !Done(i); Next(i)) {
GetComp(i)->Notify();
}
}
void GrBlockComp::Read(istream& in) {
Catalog* catalog = unidraw->GetCatalog();
MonoSceneComp::Read(in);
ClassId id;
in >> id;
_grblockgr = (GrBlockGraphic*) catalog->GetCreator()->Create(id);
_grblockgr->Read(in);
_grblockgr->SetCanvasVar(GetCanvasVar());
GrBlockPicture* fp = (GrBlockPicture*) GetGraphic();
fp->Append(_grblockgr);
fp->SetGrBlockGraphic(_grblockgr);
_top->GetGraphic()->SetTag(this);
}
void GrBlockComp::Write(ostream& out) {
ClassId id;
Catalog* catalog = unidraw->GetCatalog();
MonoSceneComp::Write(out);
id = _grblockgr->GetClassId();
out << " " << id << " ";
_grblockgr->Write(out);
}
void GrBlockComp::ReadGraphicComp(const char* filename) {
IComp::SetRelease(false);
IBCreator::SetLock(false);
Catalog* catalog = unidraw->GetCatalog();
float cx, cy, ncx, ncy;
Picture* topgr = (Picture*) _top->GetGraphic();
if (!topgr->IsEmpty()) {
topgr->GetCenter(cx, cy);
} else {
_grblockgr->GetCenter(cx, cy);
}
MonoSceneComp::Remove(_top);
catalog->Forget(_top, filename);
catalog->Retrieve(filename, (Component*&) _top);
MonoSceneComp::Append(_top);
_top->Instantiate();
topgr = (Picture*) _top->GetGraphic();
topgr->GetCenter(ncx, ncy);
topgr->Translate(cx-ncx, cy-ncy);
topgr->SetTag(this);
IBCreator::SetLock(true);
IComp::SetRelease(true);
}
void GrBlockComp::WriteGraphicComp(const char* filename) {
IComp::SetRelease(false);
Catalog* catalog = unidraw->GetCatalog();
const float w = round(PAGE_WIDTH * inches);
const float h = round(PAGE_HEIGHT * inches);
float cx, cy;
MonoSceneComp::Remove(_top);
Graphic* topgr = _top->GetGraphic();
topgr->GetCenter(cx, cy);
topgr->Translate(w/2-cx, h/2-cy);
catalog->Save(_top, filename);
topgr->Translate(cx-w/2, cy-h/2);
MonoSceneComp::Append(_top);
IComp::SetRelease(true);
}
/*****************************************************************************/
GrBlockComp* GrBlockView::GetGrBlockComp() {
return (GrBlockComp*) GetSubject();
}
GrBlockView::GrBlockView (GrBlockComp* subj) : MonoSceneView(subj) { }
ClassId GrBlockView::GetClassId () { return GRBLOCK_VIEW; }
boolean GrBlockView::IsA (ClassId id) {
return GRBLOCK_VIEW == id || MonoSceneView::IsA(id);
}
Graphic* GrBlockView::GetGraphic () {
Graphic* g = GraphicView::GetGraphic();
if (g == nil) {
GrBlockComp* grbcomp = GetGrBlockComp();
_grblockgr = (GrBlockGraphic*) grbcomp->GetGrBlockGraphic()->Copy();
GrBlockPicture* grblock = new GrBlockPicture;
grblock->Append(_grblockgr);
grblock->SetGrBlockGraphic(_grblockgr);
g = grblock;
SetGraphic(g);
}
return g;
}
void GrBlockView::Update () {
GrBlockPicture* grbcomp = (GrBlockPicture*) GetGrBlockComp()->GetGraphic();
GrBlockPicture* grbview = (GrBlockPicture*) GetGraphic();
GrBlockGraphic* grblockgr = GetGrBlockComp()->GetGrBlockGraphic();
if (
Different(grbcomp, grbview) || Different(grblockgr, _grblockgr)
) {
IncurDamage(grbview);
*(Graphic*)grbview = *(Graphic*)grbcomp;
*(Graphic*)_grblockgr = *(Graphic*)grblockgr;
UpdateCanvasVar();
IncurDamage(grbview);
}
GraphicViews::Update();
}
Manipulator* GrBlockView::CreateManipulator (
Viewer* v, Event& e, Transformer* rel, Tool* tool
) {
Rubberband* rub = nil;
Manipulator* m = nil;
Coord l, b, r, t;
int ixcon, iycon;
l = 0, b = 0, r = 1, t = 1;
rel->TransformRect(l, b, r, t);
ixcon = r-l, iycon = t-b;
if (tool->IsA(IBGRAPHIC_COMP_TOOL)) {
m = InteractorView::CreateManipulator(v, e, rel, tool);
} else if (tool->IsA(GRAPHIC_COMP_TOOL)) {
rub = new ConstrainRect(
nil, nil, e.x, e.y, e.x, e.y, 0, 0, ixcon, iycon
);
m = new DragManip(v, rub, rel, tool, XYEqual);
} else if (tool->IsA(STRETCH_TOOL)) {
m = InteractorView::CreateManipulator(v, e, rel, tool);
DragManip* dm = (DragManip*) m;
DragConstraint dc = dm->GetConstraint();
RubberRect* rr = (RubberRect*) dm->GetRubberband();
rr->GetOriginal(l, b, r, t);
delete dm;
rub = new ConstrainRect(
nil, nil, l, b, r, t, 0, 0, ixcon, iycon
);
m = new DragManip(
v, rub, rel, tool, DragConstraint(dc | Gravity), r, t
);
} else if (tool->IsA(EXAMINE_TOOL)) {
Editor* ed = v->GetEditor();
ExamineMenu* popup = new ExamineMenu;
ExamineTool* etool = (ExamineTool*) tool;
Selection* selPath = etool->GetSelPath();
Control* info = etool->CreateInfoEntry(selPath, ed);
Control* att = etool->CreatePropsEntry(selPath, ed);
if (info != nil) {
popup->Include(info);
} else {
return nil;
}
if (att != nil) {
popup->Include(att);
}
popup->Include(
new CommandItem(
" Graphics ", Center, new IdrawCmd(ed, GetGrBlockComp())
)
);
m = new PopupManip(v, popup, tool);
} else if (tool->IsA(RESHAPE_TOOL)) {
m = SceneView::CreateManipulator(v, e, rel, tool);
} else {
m = InteractorView::CreateManipulator(v, e, rel, tool);
}
return m;
}
Command* GrBlockView::InterpretManipulator (Manipulator* m) {
Command* cmd = nil;
Tool* tool = m->GetTool();
if (tool->IsA(IBGRAPHIC_COMP_TOOL)) {
cmd = InteractorView::InterpretManipulator(m);
} else if (tool->IsA(GRAPHIC_COMP_TOOL)) {
DragManip* dm = (DragManip*) m;
IBEditor* ed = (IBEditor*) dm->GetViewer()->GetEditor();
Tool* tool = dm->GetTool();
Transformer* rel = dm->GetTransformer();
RubberRect* rubberRect = (RubberRect*) dm->GetRubberband();
Coord x0, y0, x1, y1;
rubberRect->GetCurrent(x0, y0, x1, y1);
NormalRect(x0, y0, x1, y1);
if (rel != nil) {
rel->InvTransformRect(x0, y0, x1, y1);
}
GetABSCoord(ed, x0, y0, x1, y1);
GraphicComp* gcomp = CreateProtoComp(ed, x0, y0, x1, y1);
cmd = new MacroCmd(
ed, new PasteCmd(ed, new Clipboard(gcomp)),
new PlaceCmd(ed, x0, y0, x1-1, y1-1, new Clipboard(gcomp))
);
} else if (tool->IsA(RESHAPE_TOOL)){
cmd = SceneView::InterpretManipulator(m);
} else {
cmd = InteractorView::InterpretManipulator(m);
}
return cmd;
}
GraphicComp* GrBlockView::CreateProtoComp (
Editor* ed, Coord x0, Coord y0, Coord x1, Coord y1
) {
ColorVar* colVar = (ColorVar*) ed->GetState("ColorVar");
GrBlockComp* gcomp = (GrBlockComp*) GetGrBlockComp()->Copy();
Graphic* grblockgr = gcomp->GetGrBlockGraphic();
grblockgr->SetColors(nil, colVar->GetBgColor());
SF_Rect* rect = new SF_Rect(x0, y0, x1, y1, stdgraphic);
rect->SetPattern(psclear);
IRectComp* rectcomp = new IRectComp(rect);
rectcomp->Instantiate();
gcomp->GetTop()->Append(rectcomp);
return gcomp;
}
/*****************************************************************************/
boolean GrBlockCode::IsA (ClassId id) {
return GRBLOCK_CODE == id || MonoSceneCode::IsA(id);
}
ClassId GrBlockCode::GetClassId () { return GRBLOCK_CODE; }
GrBlockCode::GrBlockCode (GrBlockComp* subj) : MonoSceneCode(subj) { }
GrBlockComp* GrBlockCode::GetGrBlockComp () {
return (GrBlockComp*) GetSubject();
}
boolean GrBlockCode::Definition (ostream& out) {
boolean ok = true;
Iterator i;
char coreclass[CHARBUFSIZE];
GrBlockComp* grbcomp = GetGrBlockComp();
SubclassNameVar* snamer = grbcomp->GetClassNameVar();
MemberNameVar* mnamer = grbcomp->GetMemberNameVar();
const char* subclass = snamer->GetName();
const char* baseclass = snamer->GetBaseClass();
const char* mname = mnamer->GetName();
GetCoreClassName(coreclass);
if (_emitProperty) {
ok = ok && CodeView::Definition(out);
} else if (
_emitInstanceDecls || _emitForward ||
_emitClassHeaders || _emitHeaders
) {
ok = ok && CodeView::Definition(out);
ok = ok && Iterate(out);
} else if (_emitExpHeader) {
if (!snamer->IsSubclass()) {
if (_scope && mnamer->GetExport()&&!_namelist->Search("grblock")) {
_namelist->Append("grblock");
out << "#include <Unidraw/Graphic/grblock.h> \n";
}
} else {
ok = ok && CodeView::Definition(out);
}
ok = ok && Iterate(out);
} else if (_emitCorehHeader) {
if (snamer->IsSubclass() && strcmp(subclass, _classname) == 0) {
if (!_namelist->Search("grblock")) {
_namelist->Append("grblock");
out << "#include <Unidraw/Graphic/grblock.h>\n";
}
}
ok = ok && Iterate(out);
} else if (_emitInstanceInits) {
if (!_instancelist->Find((void*)mname)) {
_instancelist->Append(new UList((void*)mname));
ok = ok && EmitGraphicState(out);
BeginInstantiate(out);
out << "(";
InstanceName(out);
out << "nil)";
EndInstantiate(out);
for(First(i); !Done(i); Next(i)) {
CodeView* kid = (CodeView*) GetView(i);
ok = ok && EmitInstanceDecls(kid, out);
}
ok = ok && Iterate(out);
out << " Picture* " << mname << "_pic = new Picture;\n";
for(First(i); !Done(i); Next(i)) {
CodeView* kid = (CodeView*) GetView(i);
MemberNameVar* kmnamer = kid->GetIComp()->GetMemberNameVar();
const char* kmname = kmnamer->GetName();
out << " " << mname << "_pic->Append(";
out << kmname << ");\n";
}
out << " " << mname << "->SetGraphic(" << mname << "_pic);\n";
}
} else if (
_emitBSDecls || _emitBSInits ||
_emitFunctionDecls || _emitFunctionInits
) {
ok = true;
} else if (
_emitCoreDecls || _emitCoreInits || _emitClassDecls || _emitClassInits
) {
ok = ok && CodeView::Definition(out);
ok = ok && Iterate(out);
} else if (_emitMain) {
ok = ok && CodeView::Definition(out);
}
return out.good() && ok;
}
boolean GrBlockCode::CoreConstDecls(ostream& out) {
out << "(const char*, Graphic*);\n";
return out.good();
}
boolean GrBlockCode::CoreConstInits(ostream& out) {
InteractorComp* icomp = GetIntComp();
SubclassNameVar* snamer = icomp->GetClassNameVar();
const char* baseclass = snamer->GetBaseClass();
out << "(\n const char* name, Graphic* gr\n) : ";
out << baseclass << "(name, gr) {}\n\n";
return out.good();
}
boolean GrBlockCode::ConstDecls(ostream& out) {
out << "(const char*, Graphic*);\n";
return out.good();
}
boolean GrBlockCode::ConstInits(ostream& out) {
char coreclass[CHARBUFSIZE];
GetCoreClassName(coreclass);
out << "(\n const char* name, Graphic* gr\n) : ";
out << coreclass << "(name, gr) {}\n\n";
return out.good();
}
boolean GrBlockCode::EmitIncludeHeaders(ostream& out) {
SubclassNameVar* snamer = GetIntComp()->GetClassNameVar();
if (!snamer->IsSubclass() && !_namelist->Search("grblock")) {
_namelist->Append("grblock");
}
if (
strcmp(snamer->GetName(), _classname) != 0 &&
!_namelist->Search("transformer")
) {
_namelist->Append("transformer");
out << "#include <InterViews/transformer.h> \n";
out << "#include <Unidraw/Graphic/grblock.h> \n";
out << "#include <Unidraw/Graphic/picture.h> \n";
out << "#include <Unidraw/Graphic/pspaint.h> \n";
}
return out.good();
}
boolean GrBlockCode::EmitGraphicState(ostream& out) {
Iterator i;
boolean ok = true;
_emitGraphicState = true;
ok = ok && Iterate(out);
_emitGraphicState = false;
if (!ok) {
strcat(_errbuf, "GraphicState initialization failed.\n");
}
return ok;
}
/*****************************************************************************/
GrBlockGraphic::GrBlockGraphic (CanvasVar* c, Graphic* g) : IBGraphic(c, g) {}
void GrBlockGraphic::getExtent (
float& l, float& b, float& cx, float& cy, float& tol, Graphic* gs
) {
CanvasVar* cvar = GetCanvasVar();
if (cvar != nil) {
CalcExtent(cvar->Width(), cvar->Height(), l,b,cx,cy,tol,gs);
}
tol = 0;
}
Graphic* GrBlockGraphic::Copy () {
Graphic* copy = new GrBlockGraphic(nil, this);
return copy;
}
ClassId GrBlockGraphic::GetClassId () { return GRBLOCK_GRAPHIC; }
boolean GrBlockGraphic::IsA (ClassId id) { return GRBLOCK_GRAPHIC == id; }
void GrBlockGraphic::Read (istream& in) {
ReadGS(in);
}
void GrBlockGraphic::Write (ostream& out) {
WriteGS(out);
}
void GrBlockGraphic::draw (Canvas* c, Graphic* gs) {
Coord xmax, ymax;
CanvasVar* cvar = GetCanvasVar();
if (cvar != nil) {
update(gs);
xmax = cvar->xmax();
ymax = cvar->ymax();
_p->SetPattern(psclear);
_p->ClearRect(c, 0, 0, xmax, ymax);
}
}
void GrBlockGraphic::drawClipped (
Canvas* c, Coord left, Coord bottom, Coord right, Coord top, Graphic* gs
) {
Graphic::drawClipped(c, left, bottom, right, top, gs);
}