|
|
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: 13175 (0x3377)
Types: TextFile
Names: »ibglue.c«
└─⟦8648bda34⟧ Bits:30007244 EUUGD5_II: X11R5
└─⟦87c3ac0e0⟧ »./contrib-3/contrib-3.00«
└─⟦de8ce1454⟧
└─⟦this⟧ »contrib/lib/iv/src/bin/ibuild/ibglue.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.
*/
/*
* Glue component definitions.
* $Header: /master/3.0/iv/src/bin/ibuild/RCS/ibglue.c,v 1.2 91/09/27 14:10:33 tang Exp $
*/
#include "ibclasses.h"
#include "ibcmds.h"
#include "ibed.h"
#include "ibglue.h"
#include "ibmanips.h"
#include "ibvars.h"
#include <Unidraw/clipboard.h>
#include <Unidraw/ulist.h>
#include <Unidraw/Graphic/graphic.h>
#include <Unidraw/Graphic/pspaint.h>
#include <Unidraw/iterator.h>
#include <Unidraw/Tools/tool.h>
#include <Unidraw/viewer.h>
#include <InterViews/paint.h>
#include <InterViews/painter.h>
#include <InterViews/rubrect.h>
#include <InterViews/shape.h>
#include <InterViews/transformer.h>
#include <math.h>
#include <stdlib.h>
#include <stream.h>
#include <string.h>
/*****************************************************************************/
static Pattern* horizBars;
static Pattern* vertBars;
/*****************************************************************************/
GlueGraphic* GlueComp::GetGlueGraphic () { return (GlueGraphic*) GetGraphic();}
ClassId GlueComp::GetClassId () { return GLUE_COMP; }
boolean GlueComp::IsA (ClassId id) {return GLUE_COMP == id || HVComp::IsA(id);}
GlueComp::GlueComp (GlueGraphic* g) : HVComp(g) {
if (g != nil) {
IBShape* ibshape = GetShapeVar()->GetShape();
int nat, shr, str;
g->GetShape(nat, shr, str);
if (g->GetOrientation() == Horizontal) {
ibshape->Rect(nat, 0);
ibshape->Rigid(shr, str, vfil, vfil);
GetClassNameVar()->SetName("HGlue");
GetClassNameVar()->SetBaseClass("HGlue");
ibshape->hnat = ibshape->hstr = ibshape->hshr = true;
} else {
ibshape->Rect(0, nat);
ibshape->Rigid(hfil, hfil, shr, str);
GetClassNameVar()->SetName("VGlue");
GetClassNameVar()->SetBaseClass("VGlue");
ibshape->vnat = ibshape->vstr = ibshape->vshr = true;
}
}
}
void GlueComp::Interpret (Command* cmd) {
if (cmd->IsA(GLUEVISIBILITY_CMD)) {
PSBrush* br = ((GlueVisibilityCmd*) cmd)->GetBrush();
GlueGraphic* g = GetGlueGraphic();
cmd->Store(this, new VoidData(g->GetBrush()));
g->SetBrush(br);
Notify();
} else if (!cmd->IsA(BRUSH_CMD) && !cmd->IsA(FONT_CMD)) {
HVComp::Interpret(cmd);
}
}
void GlueComp::Uninterpret (Command* cmd) {
if (cmd->IsA(GLUEVISIBILITY_CMD)) {
VoidData* vd = (VoidData*) cmd->Recall(this);
PSBrush* br = (PSBrush*) vd->_void;
GlueGraphic* g = GetGlueGraphic();
g->SetBrush(br);
Notify();
} else if (!cmd->IsA(BRUSH_CMD) && !cmd->IsA(FONT_CMD)) {
HVComp::Uninterpret(cmd);
}
}
HVGraphic* GlueComp::InitGraphic (Orientation o, int) {
return new GlueGraphic(0, o, GetCanvasVar(), nil);
}
/*****************************************************************************/
ClassId GlueView::GetClassId () { return GLUE_VIEW; }
boolean GlueView::IsA (ClassId id) {return GLUE_VIEW == id || HVView::IsA(id);}
GlueView::GlueView (GlueComp* subj) : HVView(subj) { _rigid = false;}
Manipulator* GlueView::CreateManipulator (
Viewer* v, Event& e, Transformer* rel, Tool* tool
) {
Manipulator* m = nil;
if (tool->IsA(IBGRAPHIC_COMP_TOOL)) {
m = InteractorView::CreateManipulator(v, e, rel, tool);
} else if (tool->IsA(GRAPHIC_COMP_TOOL)) {
_rigid = e.shift;
DragManip* dm = (DragManip*) HVView::CreateManipulator(v, e, rel, tool);
m = new DragManip(v, dm->GetRubberband(), rel, tool);
delete dm;
} else {
m = HVView::CreateManipulator(v, e, rel, tool);
}
return m;
}
Command* GlueView::InterpretManipulator (Manipulator* m) {
DragManip* dm = (DragManip*) m;
Editor* ed = dm->GetViewer()->GetEditor();
Tool* tool = dm->GetTool();
Transformer* rel = dm->GetTransformer();
Command* cmd = nil;
if (tool->IsA(IBGRAPHIC_COMP_TOOL)) {
cmd = InteractorView::InterpretManipulator(m);
} else if (tool->IsA(GRAPHIC_COMP_TOOL)) {
Coord x0, y0, x1, y1;
StretchingRect* stretchRect = (StretchingRect*) dm->GetRubberband();
stretchRect->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);
HVComp* comp = InitComp(x0, y0, x1, y1);
GlueGraphic* gr = (GlueGraphic*) comp->GetGraphic();
ColorVar* colVar = (ColorVar*) ed->GetState("ColorVar");
if (colVar != nil) {
gr->SetColors(colVar->GetFgColor(), colVar->GetBgColor());
}
_rigid = _rigid || dm->GraspEvent().shift;
if (_rigid) {
IBShape* ibshape = comp->GetShapeVar()->GetShape();
if (gr->GetOrientation() == Horizontal) {
ibshape->Rigid(0, 0, vfil, vfil);
} else {
ibshape->Rigid(hfil, hfil, 0, 0);
}
}
cmd = new MacroCmd(
ed, new PasteCmd(ed, new Clipboard(comp)),
new PlaceCmd(ed, x0, y0, x1-1, y1-1, new Clipboard(comp))
);
} else {
cmd = HVView::InterpretManipulator(m);
}
return cmd;
}
HVComp* GlueView::InitComp (Coord x0, Coord y0, Coord x1, Coord y1) {
HVGraphic* gs = GetHVComp()->GetHVGraphic();
Orientation orient = gs->GetOrientation();
int nat = (orient == Horizontal) ? abs(x0 - x1) : abs(y0 - y1);
GlueGraphic* g = new GlueGraphic(nat, orient, nil, gs);
return new GlueComp(g);
}
/*****************************************************************************/
ClassId GlueCode::GetClassId () { return GLUE_CODE; }
boolean GlueCode::IsA(ClassId id) { return GLUE_CODE==id || CodeView::IsA(id);}
GlueCode::GlueCode (GlueComp* subj) : CodeView(subj) { }
GlueComp* GlueCode::GetGlueComp () { return (GlueComp*) GetSubject(); }
boolean GlueCode::Definition (ostream& out) {
boolean ok = true;
if (
_emitInstanceDecls || _emitForward ||
_emitProperty || _emitClassHeaders || _emitHeaders
) {
return CodeView::Definition(out);
} else if (_emitExpHeader) {
InteractorComp* icomp = GetIntComp();
MemberNameVar* mnamer = icomp->GetMemberNameVar();
SubclassNameVar* snamer = icomp->GetClassNameVar();
if (!snamer->IsSubclass()) {
if (_scope && mnamer->GetExport() && !_namelist->Search("glue")) {
_namelist->Append("glue");
out << "#include <InterViews/glue.h>\n";
}
} else {
ok = ok && CodeView::Definition(out);
}
} else if (_emitCorehHeader) {
InteractorComp* icomp = GetIntComp();
SubclassNameVar* snamer = icomp->GetClassNameVar();
const char* subclass = snamer->GetName();
if (snamer->IsSubclass() && strcmp(subclass, _classname) == 0) {
if (!_namelist->Search("glue")) {
_namelist->Append("glue");
out << "#include <InterViews/glue.h>\n";
}
}
} else if (_emitInstanceInits) {
int nat, shr, str;
InteractorComp* icomp = GetIntComp();
const char* mname = icomp->GetMemberNameVar()->GetName();
if (!_instancelist->Find((void*) mname)) {
_instancelist->Append(new UList((void*)mname));
char coreclass[CHARBUFSIZE];
char HGlueClass[CHARBUFSIZE];
char VGlueClass[CHARBUFSIZE];
GetCoreClassName(coreclass);
strcpy(HGlueClass, coreclass);
strcat(HGlueClass, "_HGlue");
strcpy(VGlueClass, coreclass);
strcat(VGlueClass, "_VGlue");
boolean export = icomp->GetMemberNameVar()->GetExport();
const char* classname = icomp->GetClassNameVar()->GetName();
if (icomp->GetClassNameVar()->IsSubclass()) {
BeginInstantiate(out);
out << "(";
} else {
if (export && !_emitMain) {
out << " " << mname << " = new ";
} else {
out << " " << classname << "* ";
out << mname << " = new ";
}
if (strcmp(classname, "HGlue") == 0) {
out << HGlueClass << "(";
} else {
out << VGlueClass << "(";
}
}
Shape* shape = GetGlueComp()->GetShapeVar()->GetShape();
GlueGraphic* gr = GetGlueComp()->GetGlueGraphic();
if (gr->GetOrientation() == Horizontal) {
nat = shape->width;
shr = shape->hshrink;
str = shape->hstretch;
} else {
nat = shape->height;
shr = shape->vshrink;
str = shape->vstretch;
}
InstanceName(out);
out << nat << ", " << shr << ", " << str << ")";
EndInstantiate(out);
}
} else if (
_emitBSDecls || _emitBSInits ||
_emitFunctionDecls || _emitFunctionInits
) {
return true;
} else if (
_emitCoreDecls || _emitCoreInits || _emitClassDecls || _emitClassInits
) {
ok = ok && CodeView::Definition(out);
} else if (_emitMain) {
ok = ok && CodeView::Definition(out);
}
return out.good() && ok;
}
boolean GlueCode::CoreConstDecls(ostream& out) {
out << "(const char*, int nat, int shr, int str);\n\n";
out << "protected:\n";
out << " virtual void Resize();\n";
return out.good();
}
boolean GlueCode::CoreConstInits(ostream& out) {
InteractorComp* icomp = GetIntComp();
SubclassNameVar* snamer = icomp->GetClassNameVar();
const char* baseclass = snamer->GetBaseClass();
char coreclass[CHARBUFSIZE];
GetCoreClassName(coreclass);
out << "(\n const char* name, int nat, int shr, int str\n) : ";
out << baseclass << "(name, nat, shr, str) {\n";
out << " perspective = new Perspective;\n";
out << "}\n\n";
out << "void " << coreclass << "::Resize () {\n";
out << " " << baseclass << "::Resize();\n";
out << " canvas->SetBackground(output->GetBgColor());\n";
out << "}\n\n";
return out.good();
}
boolean GlueCode::ConstDecls(ostream& out) {
out << "(const char*, int nat, int shr, int str);\n";
return out.good();
}
boolean GlueCode::ConstInits(ostream& out) {
char coreclass[CHARBUFSIZE];
GetCoreClassName(coreclass);
out << "(\n const char* name, int nat, int shr, int str\n) : ";
out << coreclass << "(name, nat, shr, str) {}\n\n";
return out.good();
}
boolean GlueCode::EmitIncludeHeaders(ostream& out) {
SubclassNameVar* snamer = GetIntComp()->GetClassNameVar();
if (!snamer->IsSubclass() && !_namelist->Search("glue")) {
_namelist->Append("glue");
out << "#include <InterViews/glue.h> \n";
}
return out.good();
}
/*****************************************************************************/
GlueGraphic::GlueGraphic (
int nat, Orientation o, CanvasVar* c, Graphic* g
) : HVGraphic(c, g) {
Init(nat, nat, (o == Horizontal) ? hfil : vfil, o);
}
int GlueGraphic::MinorAxisSize () { return round(.5*cm); }
Graphic* GlueGraphic::Copy () {
return new GlueGraphic(_natural, GetOrientation(), nil, this);
}
void GlueGraphic::draw (Canvas* c, Graphic* gs) {
if (horizBars == nil) {
horizBars = new Pattern(0x8888);
vertBars = new Pattern(0xf000);
Ref(horizBars);
Ref(vertBars);
}
update(gs);
Coord xmax, ymax;
if (GetCanvasVar() == nil) {
if (_orientation == Horizontal) {
xmax = _natural;
ymax = MinorAxisSize() - 1;
} else {
xmax = MinorAxisSize() - 1;
ymax = _natural;
}
} else {
xmax = GetCanvasVar()->xmax();
ymax = GetCanvasVar()->ymax();
}
if (GetBrush()->None()) {
_p->ClearRect(c, 0, 0, xmax, ymax);
} else {
_p->SetPattern((_orientation == Horizontal) ? vertBars : horizBars);
_p->FillRect(c, 0, 0, xmax, ymax);
}
}