|
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: 10869 (0x2a75) Types: TextFile Names: »ibbox.c«
└─⟦8648bda34⟧ Bits:30007244 EUUGD5_II: X11R5 └─⟦87c3ac0e0⟧ »./contrib-3/contrib-3.00« └─⟦de8ce1454⟧ └─⟦this⟧ »contrib/lib/iv/src/bin/ibuild/ibbox.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. */ /* * Implementation of Box component and derived classes. * $Header: /master/3.0/iv/src/bin/ibuild/RCS/ibbox.c,v 1.2 91/09/27 14:07:11 tang Exp $ */ #include "ibbox.h" #include "ibclasses.h" #include "ibvars.h" #include <Unidraw/iterator.h> #include <Unidraw/ulist.h> #include <Unidraw/Graphic/graphic.h> #include <InterViews/shape.h> #include <string.h> #include <stream.h> /*****************************************************************************/ struct BoxDimension { int natural, stretch, shrink; }; struct BoxCanonical { BoxDimension major, minor; }; /*****************************************************************************/ BoxComp::BoxComp () { } ClassId BoxComp::GetClassId () { return BOX_COMP; } boolean BoxComp::IsA (ClassId id) { return BOX_COMP==id || SceneComp::IsA(id);} void BoxComp::Resize () { Shape aggrshape; // combined shape of components BoxCanonical total; // components' shape along major axis int major, minor; // actual dimensions of box int have, need; // how much box is willing/needs to change boolean grow; // true if stretching, false if shrinking BoxCanonical s; // element shape along major axis int pos, len; // pos and size of next elem on major axis CanvasVar* cvar = GetCanvasVar(); float cx, cy, w = float(cvar->Width()), h = float(cvar->Height()); GetGraphic()->GetCenter(cx, cy); PointObj lb(round(cx - w/2), round(cy - h/2)); ComputeShape(&aggrshape); GetActual(major, minor); GetCanonical(&aggrshape, total); int n = total.major.natural; if (major > n) { grow = true; // more space than desired ==> stretch elements have = total.major.stretch; need = min(major - n, have); } else { grow = false; // less space than desired ==> shrink elements have = total.major.shrink; need = min(n - major, have); } pos = 0; Iterator i; for (First(i); !Done(i); Next(i)) { InteractorComp* kid = GetIComp(i); GetCanonical(kid->GetShapeVar()->GetShape(), s); len = s.major.natural; if (have > 0) { if (grow) { n = int(double(s.major.stretch)*double(need)/double(have)); len += n; have -= s.major.stretch; } else { n = int(double(s.major.shrink)*double(need)/double(have)); len -= n; have -= s.major.shrink; } need -= n; } n = s.minor.natural; if (n == 0) { n = minor; } else if (n > minor) { n = max(n - s.minor.shrink, minor); } else if (n < minor) { n = min(n + s.minor.stretch, minor); } PlaceElement(kid, pos, len, n, lb); pos += len; } } void BoxComp::Reconfig () { Iterator i; for (First(i); !Done(i); Next(i)) { GetIComp(i)->Reconfig(); } ComputeShape(GetShapeVar()->GetShape()); } void BoxComp::ComputeShape (Shape*) { } void BoxComp::GetActual (int&, int&) { } void BoxComp::GetCanonical (Shape*, struct BoxCanonical&) { } void BoxComp::PlaceElement (InteractorComp*, Coord, int, int, PointObj&) {} /*****************************************************************************/ HBoxComp::HBoxComp () { GetClassNameVar()->SetName("HBox"); GetClassNameVar()->SetBaseClass("HBox"); } ClassId HBoxComp::GetClassId () { return HBOX_COMP; } boolean HBoxComp::IsA (ClassId id) { return HBOX_COMP==id || BoxComp::IsA(id);} void HBoxComp::ComputeShape (Shape* box) { box->width = 0; box->height = 0; box->Rigid(0, 0, vfil, vfil); int vmin = -vfil; int vmax = vfil; Iterator i; for (First(i); !Done(i); Next(i)) { InteractorComp* kid = GetIComp(i); Shape* s = kid->GetShapeVar()->GetShape(); box->width += s->width; box->height = max(box->height, s->height); box->hstretch += s->hstretch; box->hshrink += s->hshrink; vmin = max(s->height - s->vshrink, vmin); vmax = min(s->height + s->vstretch, vmax); } box->vstretch = max(0, vmax - box->height); box->vshrink = max(0, box->height - vmin); } void HBoxComp::GetActual (int& major, int& minor) { major = GetCanvasVar()->Width(); minor = GetCanvasVar()->Height(); } void HBoxComp::GetCanonical (Shape* s, BoxCanonical& b) { b.major.natural = s->width; b.major.shrink = s->hshrink; b.major.stretch = s->hstretch; b.minor.natural = s->height; b.minor.shrink = s->vshrink; b.minor.stretch = s->vstretch; } void HBoxComp::PlaceElement ( InteractorComp* comp, Coord x, int length, int h, PointObj& lb ) { Coord x1, y1, x2, y2; x1 = lb._x + x; x2 = x1 + length - 1; y1 = lb._y; y2 = y1 + h - 1; Place(comp, x1, y1, x2, y2); } /*****************************************************************************/ VBoxComp::VBoxComp () { GetClassNameVar()->SetName("VBox"); GetClassNameVar()->SetBaseClass("VBox"); } ClassId VBoxComp::GetClassId () { return VBOX_COMP; } boolean VBoxComp::IsA (ClassId id) { return VBOX_COMP==id || BoxComp::IsA(id);} void VBoxComp::ComputeShape (Shape* box) { box->width = 0; box->height = 0; box->Rigid(hfil, hfil, 0, 0); int hmin = -hfil; int hmax = hfil; Iterator i; for (First(i); !Done(i); Next(i)) { InteractorComp* kid = GetIComp(i); Shape* s = kid->GetShapeVar()->GetShape(); box->width = max(box->width, s->width); box->height += s->height; box->vstretch += s->vstretch; box->vshrink += s->vshrink; hmin = max(s->width - s->hshrink, hmin); hmax = min(s->width + s->hstretch, hmax); } box->hstretch = max(0, hmax - box->width); box->hshrink = max(0, box->width - hmin); } void VBoxComp::GetActual (int& major, int& minor) { major = GetCanvasVar()->Height(); minor = GetCanvasVar()->Width(); } void VBoxComp::GetCanonical (Shape* s, BoxCanonical& b) { b.major.natural = s->height; b.major.shrink = s->vshrink; b.major.stretch = s->vstretch; b.minor.natural = s->width; b.minor.shrink = s->hshrink; b.minor.stretch = s->hstretch; } void VBoxComp::PlaceElement ( InteractorComp* comp, Coord y, int length, int w, PointObj& lb ) { Coord x1, y1, x2, y2; x1 = lb._x; y2 = lb._y + GetCanvasVar()->ymax() - y; x2 = x1 + w - 1; y1 = y2 - length + 1; Place(comp, x1, y1, x2, y2); } /*****************************************************************************/ ClassId BoxCode::GetClassId () { return BOX_CODE; } boolean BoxCode::IsA (ClassId id) { return BOX_CODE ==id || CodeView::IsA(id);} BoxCode::BoxCode (BoxComp* subj) : CodeView(subj) { } BoxComp* BoxCode::GetBoxComp () { return (BoxComp*) GetSubject(); } boolean BoxCode::Definition (ostream& out) { boolean ok = true; Iterator i; if ( _emitInstanceDecls || _emitForward || _emitProperty || _emitClassHeaders || _emitHeaders ) { ok = ok && CodeView::Definition(out); ok = ok && Iterate(out); } else if (_emitExpHeader) { InteractorComp* icomp = GetIntComp(); MemberNameVar* mnamer = icomp->GetMemberNameVar(); SubclassNameVar* snamer = icomp->GetClassNameVar(); if (!snamer->IsSubclass()) { if (_scope && mnamer->GetExport() && !_namelist->Search("box")) { _namelist->Append("box"); out << "#include <InterViews/box.h>\n"; } } else { ok = ok && CodeView::Definition(out); } ok = ok && Iterate(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("box")) { _namelist->Append("box"); out << "#include <InterViews/box.h>\n"; } } else { ok = ok && Iterate(out); } } else if (_emitInstanceInits) { InteractorComp* icomp = GetIntComp(); const char* mname = icomp->GetMemberNameVar()->GetName(); if (!_instancelist->Find((void*) mname)) { _instancelist->Append(new UList((void*)mname)); BeginInstantiate(out); out << "();\n"; } ok = ok && Iterate(out); if (AllKidsDefined() && !_lock) { _lock = true; for (icomp->First(i); !icomp->Done(i); icomp->Next(i)) { InteractorComp* kid = (InteractorComp*) icomp->GetComp(i); const char* instance = kid->GetMemberNameVar()->GetName(); out << " " << mname << "->Insert("; out << instance << ");\n"; } } } else if ( _emitBSDecls || _emitBSInits || _emitFunctionDecls || _emitFunctionInits ) { ok = ok && Iterate(out); } else if ( _emitCoreDecls || _emitCoreInits || _emitClassDecls || _emitClassInits ) { ok = ok && CodeView::Definition(out); ok = ok && Iterate(out); } else if (_emitMain) { ok = ok && CodeView::Definition(out); } return ok; } boolean BoxCode::CoreConstDecls(ostream& out) { out << "();\n"; return out.good(); } boolean BoxCode::CoreConstInits(ostream& out) { out << "() {\n"; out << " perspective = new Perspective;\n"; out << "}\n\n"; return out.good(); } boolean BoxCode::ConstDecls(ostream& out) { out << "();\n"; return out.good(); } boolean BoxCode::ConstInits(ostream& out) { out << "() {}\n\n"; return out.good(); } boolean BoxCode::EmitIncludeHeaders(ostream& out) { SubclassNameVar* snamer = GetIntComp()->GetClassNameVar(); if (!snamer->IsSubclass() && !_namelist->Search("box")) { _namelist->Append("box"); out << "#include <InterViews/box.h> \n"; } return out.good(); }