|
|
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: 11597 (0x2d4d)
Types: TextFile
Names: »ibborder.c«
└─⟦8648bda34⟧ Bits:30007244 EUUGD5_II: X11R5
└─⟦87c3ac0e0⟧ »./contrib-3/contrib-3.00«
└─⟦de8ce1454⟧
└─⟦this⟧ »contrib/lib/iv/src/bin/ibuild/ibborder.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.
*/
/*
* Border component definitions.
* $Header: /master/3.0/iv/src/bin/ibuild/RCS/ibborder.c,v 1.2 91/09/27 14:06:05 tang Exp $
*/
#include "ibborder.h"
#include "ibclasses.h"
#include "ibcmds.h"
#include "ibed.h"
#include "ibvars.h"
#include <Unidraw/iterator.h>
#include <Unidraw/ulist.h>
#include <Unidraw/unidraw.h>
#include <Unidraw/clipboard.h>
#include <Unidraw/manips.h>
#include <Unidraw/viewer.h>
#include <Unidraw/Commands/macro.h>
#include <Unidraw/Graphic/geomobjs.h>
#include <Unidraw/Graphic/graphic.h>
#include <Unidraw/Tools/tool.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 <stream.h>
#include <string.h>
#include <stdlib.h>
/*****************************************************************************/
BorderGraphic* BorderComp::GetBorderGraphic () {
return (BorderGraphic*) GetGraphic();
}
ClassId BorderComp::GetClassId () { return BORDER_COMP; }
boolean BorderComp::IsA (ClassId id) {return BORDER_COMP==id||HVComp::IsA(id);}
BorderComp::BorderComp (BorderGraphic* g) : HVComp(g) {
if (g != nil) {
ShapeVar* shapeVar = GetShapeVar();
Shape* shape = shapeVar->GetShape();
int nat, shr, str;
g->GetShape(nat, shr, str);
if (g->GetOrientation() == Horizontal) {
shape->Rect(nat, g->MinorAxisSize());
shape->Rigid(shr, str, 0, 0);
GetClassNameVar()->SetName("HBorder");
GetClassNameVar()->SetBaseClass("HBorder");
} else {
shape->Rect(g->MinorAxisSize(), nat);
shape->Rigid(0, 0, shr, str);
GetClassNameVar()->SetName("VBorder");
GetClassNameVar()->SetBaseClass("VBorder");
}
}
}
void BorderComp::Interpret (Command* cmd) {
if (cmd->IsA(BRUSH_CMD) && !cmd->IsA(GLUEVISIBILITY_CMD)) {
BrushCmd* brushcmd = (BrushCmd*) cmd;
BorderGraphic* g = GetBorderGraphic();
int w = g->MinorAxisSize();
cmd->Store(this, new VoidData((void*) w));
w = brushcmd->GetBrush()->Width();
Shape* shape = GetShapeVar()->GetShape();
int cw, ch;
cw = _canvasVar->Width();
ch = _canvasVar->Height();
if (g->GetOrientation() == Horizontal) {
shape->height = w;
_canvasVar->SetSize(cw, w);
} else {
shape->width = w;
_canvasVar->SetSize(w, ch);
}
g->SetMinorAxisSize(w);
Reconfig();
Notify();
Propagate(cmd);
} else if (!cmd->IsA(FONT_CMD)){
HVComp::Interpret(cmd);
}
}
void BorderComp::Uninterpret (Command* cmd) {
if (cmd->IsA(BRUSH_CMD) && !cmd->IsA(GLUEVISIBILITY_CMD)) {
BorderGraphic* g = GetBorderGraphic();
VoidData* bd = (VoidData*) cmd->Recall(this);
int w = (int) bd->_void;
int cw, ch;
cw = _canvasVar->Width();
ch = _canvasVar->Height();
Shape* shape = GetShapeVar()->GetShape();
if (g->GetOrientation() == Horizontal) {
shape->height = w;
_canvasVar->SetSize(cw, w);
} else {
shape->width = w;
_canvasVar->SetSize(w, ch);
}
g->SetMinorAxisSize(w);
Reconfig();
Notify();
Unpropagate(cmd);
} else if (!cmd->IsA(FONT_CMD)){
HVComp::Uninterpret(cmd);
}
}
HVGraphic* BorderComp::InitGraphic (Orientation o, int w) {
return new BorderGraphic(o, GetCanvasVar(), nil, 0, w);
}
/*****************************************************************************/
ClassId BorderView::GetClassId () { return BORDER_VIEW; }
boolean BorderView::IsA (ClassId id) {return BORDER_VIEW==id||HVView::IsA(id);}
BorderView::BorderView (BorderComp* subj) : HVView(subj) { }
void BorderView::Update () {
int w;
BorderGraphic* gcomp = (BorderGraphic*) GetGraphicComp()->GetGraphic();
BorderGraphic* gview = (BorderGraphic*) GetGraphic();
w = gcomp->MinorAxisSize();
gview->SetMinorAxisSize(w);
HVView::Update();
gview->SetBrush(stdgraphic->GetBrush());
}
Command* BorderView::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(GRAPHIC_COMP_TOOL)) {
StretchingRect* stretchRect = (StretchingRect*) dm->GetRubberband();
Coord x0, y0, x1, y1;
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);
BrushVar* brVar = (BrushVar*) ed->GetState("BrushVar");
int w = brVar->GetBrush()->Width();
HVGraphic* gs = GetHVComp()->GetHVGraphic();
Orientation orient = gs->GetOrientation();
if(orient == Horizontal) {
y0 = y0 - w/2;
y1 = y0 + w;
} else {
x0 = x0 - w/2;
x1 = x0 + w;
}
HVComp* comp = InitComp(x0, y0, x1, y1);
HVGraphic* gr = (HVGraphic*) comp->GetGraphic();
ColorVar* colVar = (ColorVar*) ed->GetState("ColorVar");
if (colVar != nil) {
gr->SetColors(colVar->GetFgColor(), colVar->GetBgColor());
}
cmd = new MacroCmd(
ed, new PasteCmd(ed, new Clipboard(comp)),
new PlaceCmd(ed, x0, y0, x1-1, y1-1, new Clipboard(comp))
);
} else {
cmd = InteractorView::InterpretManipulator(m);
}
return cmd;
}
HVComp* BorderView::InitComp (Coord l, Coord b, Coord r, Coord t) {
HVGraphic* gs = GetHVComp()->GetHVGraphic();
BorderGraphic* g;
Orientation orient = gs->GetOrientation();
if (orient == Horizontal) {
g = new BorderGraphic(orient, nil, gs, 0, t-b);
} else {
g = new BorderGraphic(orient, nil, gs, 0, r-l);
}
return new BorderComp(g);
}
/*****************************************************************************/
ClassId BorderCode::GetClassId () { return BORDER_CODE; }
boolean BorderCode::IsA(ClassId id){return BORDER_CODE==id||CodeView::IsA(id);}
BorderCode::BorderCode (BorderComp* subj) : CodeView(subj) { }
BorderComp* BorderCode::GetBorderComp () { return (BorderComp*) GetSubject(); }
boolean BorderCode::Definition (ostream& out) {
boolean ok = true;
if (
_emitProperty || _emitInstanceDecls ||
_emitForward || _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("border")
) {
_namelist->Append("border");
out << "#include <InterViews/border.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("border")) {
_namelist->Append("border");
out << "#include <InterViews/border.h>\n";
}
}
} else if (_emitInstanceInits) {
InteractorComp* icomp = GetIntComp();
const char* mname = icomp->GetMemberNameVar()->GetName();
if (!_instancelist->Find((void*)mname)) {
_instancelist->Append(new UList((void*) mname));
BorderComp* bcomp = (BorderComp*) icomp;
int width = bcomp->GetBorderGraphic()->MinorAxisSize();
BeginInstantiate(out);
out << "(";
InstanceName(out, ", ");
out << width << " )";
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 BorderCode::CoreConstDecls(ostream& out) {
out << "(const char*, int);\n";
return out.good();
}
boolean BorderCode::CoreConstInits(ostream& out) {
InteractorComp* icomp = GetIntComp();
SubclassNameVar* snamer = icomp->GetClassNameVar();
const char* baseclass = snamer->GetBaseClass();
out << "(\n const char* name, int w\n) : " << baseclass;
out << "(name, w) {\n";
out << " perspective = new Perspective;\n";
out << "}\n\n";
return out.good();
}
boolean BorderCode::ConstDecls(ostream& out) {
out << "(const char*, int);\n";
return out.good();
}
boolean BorderCode::ConstInits(ostream& out) {
char coreclass[CHARBUFSIZE];
GetCoreClassName(coreclass);
out << "(\n const char* name, int w\n) : " << coreclass;
out << "(name, w) {}\n\n";
return out.good();
}
boolean BorderCode::EmitIncludeHeaders(ostream& out) {
SubclassNameVar* snamer = GetIntComp()->GetClassNameVar();
if (!snamer->IsSubclass() && !_namelist->Search("border")) {
_namelist->Append("border");
out << "#include <InterViews/border.h> \n";
}
return out.good();
}
/*****************************************************************************/
BorderGraphic::BorderGraphic (
Orientation o, CanvasVar* c, Graphic* g, int nat, int w
) : HVGraphic(c, g) {
int fil = (o == Horizontal) ? hfil : vfil;
Init(nat, fil, fil, o, w);
}
Graphic* BorderGraphic::Copy () {
return new BorderGraphic(
GetOrientation(), nil, this, _natural, _minorAxisSize
);
}
void BorderGraphic::draw (Canvas* c, Graphic* gs) {
update(gs);
Coord xmax, ymax;
CanvasVar* cvar = GetCanvasVar();
if (cvar == nil) {
if (_orientation == Horizontal) {
xmax = _natural;
ymax = MinorAxisSize() - 1;
} else {
xmax = MinorAxisSize() - 1;
ymax = _natural;
}
} else {
xmax = cvar->xmax();
ymax = cvar->ymax();
}
_p->FillRect(c, 0, 0, xmax, ymax);
}