|
|
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: 17256 (0x4368)
Types: TextFile
Names: »ibslider.c«
└─⟦8648bda34⟧ Bits:30007244 EUUGD5_II: X11R5
└─⟦87c3ac0e0⟧ »./contrib-3/contrib-3.00«
└─⟦de8ce1454⟧
└─⟦this⟧ »contrib/lib/iv/src/bin/ibuild/ibslider.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.
*/
/*
* Scroller component definitions.
* $Header: /master/3.0/iv/src/bin/ibuild/RCS/ibslider.c,v 1.2 91/09/27 14:11:46 tang Exp $
*/
#include "ibclasses.h"
#include "ibcmds.h"
#include "ibcreator.h"
#include "ibdialogs.h"
#include "ibed.h"
#include "ibgraphic.h"
#include "ibrubrect.h"
#include "ibslider.h"
#include "ibvars.h"
#include "ibvarviews.h"
#include <Unidraw/catalog.h>
#include <Unidraw/clipboard.h>
#include <Unidraw/manips.h>
#include <Unidraw/ulist.h>
#include <Unidraw/unidraw.h>
#include <Unidraw/viewer.h>
#include <Unidraw/Commands/edit.h>
#include <Unidraw/Commands/macro.h>
#include <Unidraw/Graphic/pspaint.h>
#include <Unidraw/Tools/tool.h>
#include <InterViews/brush.h>
#include <InterViews/event.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>
/*****************************************************************************/
SliderGraphic* SliderComp::GetSliderGraphic () {
return (SliderGraphic*) GetGraphic();
}
ClassId SliderComp::GetClassId () { return SLIDER_COMP; }
boolean SliderComp::IsA (ClassId id) {
return SLIDER_COMP == id || InteractorComp::IsA(id);
}
SliderComp::SliderComp (SliderGraphic* g) : InteractorComp(g) {
GetClassNameVar()->SetName("Slider");
GetClassNameVar()->SetBaseClass("Slider");
_adjusteeVar = nil;
}
SliderComp::~SliderComp () {
delete _adjusteeVar;
}
void SliderComp::Instantiate () {
InteractorComp::Instantiate();
if (_adjusteeVar == nil) {
_adjusteeVar = new MemberNameVar("", false, false);
}
}
void SliderComp::Reconfig () {
Shape* shape = GetShapeVar()->GetShape();
int w, h;
GetSliderGraphic()->GetSize(w, h);
shape->Rect(w, h);
shape->Rigid(hfil, hfil, vfil, vfil);
GetShapeVar()->Notify();
}
StateVar* SliderComp::GetState (const char* name) {
StateVar* stateVar = nil;
if (strcmp(name, "AdjusteeVar") == 0) {
stateVar = _adjusteeVar;
} else {
stateVar = InteractorComp::GetState(name);
}
return stateVar;
}
void SliderComp::SetState(const char* adjustee, StateVar* stateVar) {
if (
strcmp(adjustee, "RelatedVar") == 0 ||
strcmp(adjustee, "AdjusteeVar") == 0
) {
MemberNameVar* memberVar = (MemberNameVar*) stateVar;
*_adjusteeVar = *memberVar;
} else {
InteractorComp::SetState(adjustee, stateVar);
}
}
InteractorComp& SliderComp::operator = (InteractorComp& comp) {
StateVar* adjusteevar = comp.GetState("AdjusteeVar");
if (adjusteevar != nil) {
SetState("AdjusteeVar", adjusteevar);
} else {
MemberNameVar* member = comp.GetMemberNameVar();
SetState("AdjusteeVar", member);
}
return *this;
}
boolean SliderComp::IsRelatableTo (InteractorComp* comp) {
boolean ok = false;
if (
comp->GetClassNameVar()->IsSubclass() ||
comp->IsA(ADJUSTER_COMP) || comp->IsA(DECK_COMP) ||
comp->IsA(GRBLOCK_COMP) || comp->IsA(PANNER_COMP) ||
comp->IsA(SCROLLER_COMP) || comp->IsA(SLIDER_COMP) ||
comp->IsA(STRBROWSER_COMP) || comp->IsA(STREDIT_COMP) ||
comp->IsA(TEXTEDIT_COMP) || comp->IsA(IBVIEWER_COMP) ||
comp->IsA(VIEWPORT_COMP)
) {
ok = true;
}
return ok;
}
void SliderComp::Interpret (Command* cmd) {
if (!cmd->IsA(FONT_CMD)) {
InteractorComp::Interpret(cmd);
}
}
void SliderComp::Uninterpret (Command* cmd) {
if (!cmd->IsA(FONT_CMD)) {
InteractorComp::Uninterpret(cmd);
}
}
void SliderComp::Read (istream& in) {
InteractorComp::Read(in);
Catalog* catalog = unidraw->GetCatalog();
ClassId id;
in >> id;
SliderGraphic* g = (SliderGraphic*) catalog->GetCreator()->Create(id);
g->Read(in);
g->SetCanvasVar(GetCanvasVar());
SetGraphic(g);
delete _adjusteeVar;
_adjusteeVar = (MemberNameVar*) unidraw->GetCatalog()->ReadStateVar(in);
}
void SliderComp::Write (ostream& out) {
ClassId id;
InteractorComp::Write(out);
Catalog* catalog = unidraw->GetCatalog();
SliderGraphic* g = GetSliderGraphic();
id = g->GetClassId();
out << " " << id << " ";
g->Write(out);
unidraw->GetCatalog()->WriteStateVar(_adjusteeVar, out);
}
/*****************************************************************************/
SliderView::SliderView (SliderComp* subj) : InteractorView(subj) { }
ClassId SliderView::GetClassId () { return SLIDER_VIEW; }
boolean SliderView::IsA (ClassId id) {
return SLIDER_VIEW == id || InteractorView::IsA(id);
}
SliderComp* SliderView::GetSliderComp () {
return (SliderComp*) GetSubject();
}
void SliderView::Update () {
SliderGraphic* scomp = GetSliderComp()->GetSliderGraphic();
SliderGraphic* sview = (SliderGraphic*) GetGraphic();
IncurDamage(sview);
*(Graphic*)sview = *(Graphic*)scomp;
UpdateCanvasVar();
IncurDamage(sview);
EraseHandles();
}
InfoDialog* SliderView::GetInfoDialog () {
InfoDialog* info = InteractorView::GetInfoDialog();
ButtonState* state = info->GetState();
SliderComp* scomp = GetSliderComp();
MemberNameVar* adjusteeVar = scomp->GetAdjusteeVar();
info->Include(new RelatedVarView(adjusteeVar, state, scomp));
return info;
}
Manipulator* SliderView::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 {
m = InteractorView::CreateManipulator(v, e, rel, tool);
}
return m;
}
Command* SliderView::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);
ColorVar* colVar = (ColorVar*) ed->GetState("ColorVar");
SliderGraphic* g = new SliderGraphic(x1-x0, y1-y0, nil,stdgraphic);
if (colVar != nil) {
g->SetColors(colVar->GetFgColor(), colVar->GetBgColor());
}
SliderComp* comp = new SliderComp(g);
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;
}
InteractorComp* SliderView::InitComp (Coord l, Coord b, Coord r, Coord t) {
IBGraphic* gs = GetInteractorComp()->GetIBGraphic();
int w, h;
w = r - l;
h = t - b;
SliderGraphic* g = new SliderGraphic(w, h, nil, gs);
return new SliderComp(g);
}
/*****************************************************************************/
ClassId SliderCode::GetClassId () { return SLIDER_CODE; }
boolean SliderCode::IsA(ClassId id) {
return SLIDER_CODE==id || CodeView::IsA(id);
}
SliderCode::SliderCode (SliderComp* subj) : CodeView(subj) { }
SliderComp* SliderCode::GetSliderComp () {
return (SliderComp*) GetSubject();
}
boolean SliderCode::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("panner")
) {
_namelist->Append("panner");
out << "#include <InterViews/panner.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("panner")) {
_namelist->Append("panner");
out << "#include <InterViews/panner.h>\n";
}
}
} else if (_emitInstanceInits) {
InteractorComp* icomp = GetIntComp();
InteractorComp* ctarget = nil;
const char* mname = icomp->GetMemberNameVar()->GetName();
MemberNameVar* mnamer = (MemberNameVar*) icomp->GetState(
"AdjusteeVar"
);
const char* slidee = mnamer->GetName();
if (*slidee == '\0') {
strcat(_errbuf, mname);
strcat(_errbuf, " has undefined sliding target.\n");
return false;
} else if (!Search(mnamer, ctarget)) {
strcat(_errbuf, mname);
strcat(
_errbuf, "'s sliding target is not in the same hierarchy.\n"
);
return false;
} else if (ctarget != nil && !icomp->IsRelatableTo(ctarget)) {
strcat(_errbuf, mname);
strcat(
_errbuf,
"'s adjusting target is not subclassed nor adjustable.\n"
);
return false;
}
if (_instancelist->Find((void*) slidee)) {
if (!_instancelist->Find((void*) mname)) {
_instancelist->Append(new UList((void*) mname));
char coreclass[CHARBUFSIZE];
char SliderClass[CHARBUFSIZE];
GetCoreClassName(coreclass);
strcpy(SliderClass, coreclass);
strcat(SliderClass, "_Slider");
boolean export = icomp->GetMemberNameVar()->GetExport();
const char* classname = icomp->GetClassNameVar()->GetName();
int w = icomp->GetCanvasVar()->Width();
slidee = (*slidee == '\0') ? "nil" : slidee;
if (icomp->GetClassNameVar()->IsSubclass()) {
BeginInstantiate(out);
out << "(";
} else {
if (export && !_emitMain) {
out << " " << mname << " = new " << SliderClass;
out << "(";
} else {
out << " " << classname << "* ";
out << mname << " = new " << SliderClass << "(";
}
}
InstanceName(out);
out << slidee << ", " << w << ")";
EndInstantiate(out);
_icomplete = true;
}
} else {
_icomplete = false;
}
} 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 SliderCode::CoreConstDecls(ostream& out) {
out << "(const char*, Interactor*, int width);\n";
return out.good();
}
boolean SliderCode::CoreConstInits(ostream& out) {
InteractorComp* icomp = GetIntComp();
SubclassNameVar* snamer = icomp->GetClassNameVar();
const char* baseclass = snamer->GetBaseClass();
out << "(\n const char* name, Interactor* i, int width\n) : ";
out << baseclass << "(name, i) {\n";
out << " perspective = new Perspective;\n";
out << " Perspective* target = i->GetPerspective();\n";
out << " shape->width = width;\n";
out << " float aspect = float(target->height)";
out << " / float(target->width);\n";
out << " shape->height = (int) (aspect * width);\n";
out << " shape->Rigid();\n";
out << "}\n\n";
return out.good();
}
boolean SliderCode::ConstDecls(ostream& out) {
out << "(const char*, Interactor*, int width);\n";
return out.good();
}
boolean SliderCode::ConstInits(ostream& out) {
char coreclass[CHARBUFSIZE];
GetCoreClassName(coreclass);
out << "(\n const char* name, Interactor* i, int width\n) : ";
out << coreclass << "(name, i, width) {}\n\n";
return out.good();
}
boolean SliderCode::EmitIncludeHeaders(ostream& out) {
SubclassNameVar* snamer = GetIntComp()->GetClassNameVar();
if (!snamer->IsSubclass() && !_namelist->Search("panner")) {
_namelist->Append("panner");
out << "#include <InterViews/panner.h> \n";
}
if (!_namelist->Search("shape")) {
_namelist->Append("shape");
out << "#include <InterViews/shape.h> \n";
}
return out.good();
}
/*****************************************************************************/
const char* SliderGraphic::GetClassName () { return "slider"; }
ClassId SliderGraphic::GetClassId () { return SLIDER_GRAPHIC; }
SliderGraphic::SliderGraphic (
int w, int h, CanvasVar* c, Graphic* g
) : IBGraphic(c, g) {
Init(w, h);
}
void SliderGraphic::Init(int w, int h) {
_width = w;
_height = h;
}
Graphic* SliderGraphic::Copy () {
return new SliderGraphic(_width, _height, nil, this);
}
void SliderGraphic::Read (istream& in) {
ReadGS(in);
in >> _width >> _height;
}
void SliderGraphic::Write (ostream& out) {
WriteGS(out);
out << _width << " " << _height << " ";
}
void SliderGraphic::getExtent (
float& l, float& b, float& cx, float& cy, float& tol, Graphic* gs
) {
CanvasVar* cvar = GetCanvasVar();
if (cvar == nil) {
int w, h;
w = _width;
h = _height;
CalcExtent(w, h, l, b, cx, cy, tol, gs);
} else {
CalcExtent(cvar->Width(), cvar->Height(), l,b,cx,cy,tol,gs);
}
tol = 0;
}
void SliderGraphic::drawClipped (
Canvas* c, Coord l, Coord b, Coord r, Coord t, Graphic* gs
) {
Graphic::drawClipped(c, l, b, r, t, gs);
}
void SliderGraphic::draw (Canvas* c, Graphic* gs) {
update(gs);
Coord xmax, ymax;
CanvasVar* cvar = GetCanvasVar();
if (cvar == nil) {
xmax = _width;
ymax = _height;
} else {
xmax = cvar->xmax();
ymax = cvar->ymax();
}
static Pattern* ltgray;
if (ltgray == nil) {
ltgray = new Pattern(Pattern::lightgray);
ltgray->Reference();
}
_p->SetPattern(ltgray);
_p->FillRect(c, 0, 0, xmax, ymax);
Coord l, b, r, t;
l = xmax/3;
b = ymax/3;
r = xmax - xmax/3;
t = ymax - ymax/3;
_p->ClearRect(c, l, b, r, t);
_p->Rect(c, l, b, r, t);
_p->Line(c, l+1, b-1, r+1, b-1);
_p->Line(c, r+1, b-1, r+1, t-1);
}