|
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: 12354 (0x3042) Types: TextFile Names: »ibscroller.c«
└─⟦8648bda34⟧ Bits:30007244 EUUGD5_II: X11R5 └─⟦87c3ac0e0⟧ »./contrib-3/contrib-3.00« └─⟦de8ce1454⟧ └─⟦this⟧ »contrib/lib/iv/src/bin/ibuild/ibscroller.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/ibscroller.c,v 1.2 91/09/27 14:11:39 tang Exp $ */ #include "ibclasses.h" #include "ibcmds.h" #include "ibdialogs.h" #include "ibscroller.h" #include "ibvars.h" #include "ibvarviews.h" #include <Unidraw/catalog.h> #include <Unidraw/ulist.h> #include <Unidraw/unidraw.h> #include <Unidraw/Graphic/pspaint.h> #include <InterViews/paint.h> #include <InterViews/painter.h> #include <InterViews/shape.h> #include <InterViews/transformer.h> #include <math.h> #include <stream.h> #include <string.h> /*****************************************************************************/ static const int inset = 1; /* space between scroller canvas and bar */ /*****************************************************************************/ ScrollerGraphic* ScrollerComp::GetScrollerGraphic () { return (ScrollerGraphic*) GetGraphic(); } ClassId ScrollerComp::GetClassId () { return SCROLLER_COMP; } boolean ScrollerComp::IsA (ClassId id) { return SCROLLER_COMP == id || HVComp::IsA(id); } ScrollerComp::ScrollerComp (ScrollerGraphic* 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("HScroller"); GetClassNameVar()->SetBaseClass("HScroller"); } else { shape->Rect(g->MinorAxisSize(), nat); shape->Rigid(0, 0, shr, str); GetClassNameVar()->SetName("VScroller"); GetClassNameVar()->SetBaseClass("VScroller"); } } _adjusteeVar = nil; } ScrollerComp::~ScrollerComp () { delete _adjusteeVar; } void ScrollerComp::Instantiate () { HVComp::Instantiate(); if (_adjusteeVar == nil) { _adjusteeVar = new MemberNameVar("", false, false); } } void ScrollerComp::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& ScrollerComp::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 ScrollerComp::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 ScrollerComp::Interpret (Command* cmd) { if (!cmd->IsA(FONT_CMD)) { HVComp::Interpret(cmd); } } void ScrollerComp::Uninterpret (Command* cmd) { if (!cmd->IsA(FONT_CMD)) { HVComp::Uninterpret(cmd); } } HVGraphic* ScrollerComp::InitGraphic (Orientation o, int) { return new ScrollerGraphic(o, GetCanvasVar()); } StateVar* ScrollerComp::GetState (const char* name) { StateVar* stateVar = nil; if (strcmp(name, "AdjusteeVar") == 0) { stateVar = _adjusteeVar; } else { stateVar = HVComp::GetState(name); } return stateVar; } void ScrollerComp::Read (istream& in) { HVComp::Read(in); delete _adjusteeVar; _adjusteeVar = (MemberNameVar*) unidraw->GetCatalog()->ReadStateVar(in); } void ScrollerComp::Write (ostream& out) { HVComp::Write(out); unidraw->GetCatalog()->WriteStateVar(_adjusteeVar, out); } /*****************************************************************************/ ScrollerView::ScrollerView (ScrollerComp* subj) : HVView(subj) { } ClassId ScrollerView::GetClassId () { return SCROLLER_VIEW; } boolean ScrollerView::IsA (ClassId id) { return SCROLLER_VIEW == id || HVView::IsA(id); } ScrollerComp* ScrollerView::GetScrollerComp () { return (ScrollerComp*) GetSubject(); } InfoDialog* ScrollerView::GetInfoDialog () { InfoDialog* info = InteractorView::GetInfoDialog(); ButtonState* state = info->GetState(); ScrollerComp* scomp = GetScrollerComp(); MemberNameVar* adjusteeVar = scomp->GetAdjusteeVar(); info->Include(new RelatedVarView(adjusteeVar, state, scomp)); return info; } HVComp* ScrollerView::InitComp (Coord , Coord , Coord , Coord) { HVGraphic* gs = GetHVComp()->GetHVGraphic(); Orientation orient = gs->GetOrientation(); ScrollerGraphic* g = new ScrollerGraphic(orient, nil, gs); return new ScrollerComp(g); } /*****************************************************************************/ boolean ScrollerCode::IsA(ClassId id) { return SCROLLER_CODE == id || CodeView::IsA(id); } ClassId ScrollerCode::GetClassId () { return SCROLLER_CODE; } ScrollerCode::ScrollerCode (ScrollerComp* subj) : CodeView(subj) { } ScrollerComp* ScrollerCode::GetScrollerComp () { return (ScrollerComp*) GetSubject(); } boolean ScrollerCode::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("scroller") ) { _namelist->Append("scroller"); out << "#include <InterViews/scroller.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("scroller")) { _namelist->Append("scroller"); out << "#include <InterViews/scroller.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* scrollee = mnamer->GetName(); if (*scrollee == '\0') { strcat(_errbuf, mname); strcat(_errbuf, " has undefined scrolling target.\n"); return false; } else if (!Search(mnamer, ctarget)) { strcat(_errbuf, mname); strcat( _errbuf, "'s scrolling 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*) scrollee)) { if (!_instancelist->Find((void*) mname)) { _instancelist->Append(new UList((void*)mname)); scrollee = (*scrollee == '\0') ? "nil" : scrollee; BeginInstantiate(out); out << "("; InstanceName(out); out << scrollee << ")"; 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 ScrollerCode::CoreConstDecls(ostream& out) { out << "(const char*, Interactor*);\n"; return out.good(); } boolean ScrollerCode::CoreConstInits(ostream& out) { InteractorComp* icomp = GetIntComp(); SubclassNameVar* snamer = icomp->GetClassNameVar(); const char* baseclass = snamer->GetBaseClass(); out << "(\n const char* name, Interactor* i\n) : " << baseclass; out << "(name, i) {\n"; out << " perspective = new Perspective;\n"; out << "}\n\n"; return out.good(); } boolean ScrollerCode::ConstDecls(ostream& out) { out << "(const char*, Interactor* i);\n"; return out.good(); } boolean ScrollerCode::ConstInits(ostream& out) { char coreclass[CHARBUFSIZE]; GetCoreClassName(coreclass); out << "(\n const char* name, Interactor* i\n) : " << coreclass; out << "(name, i) {}\n\n"; return out.good(); } boolean ScrollerCode::EmitIncludeHeaders(ostream& out) { SubclassNameVar* snamer = GetIntComp()->GetClassNameVar(); if (!snamer->IsSubclass() && !_namelist->Search("scroller")) { _namelist->Append("scroller"); out << "#include <InterViews/scroller.h> \n"; } return out.good(); } /*****************************************************************************/ ScrollerGraphic::ScrollerGraphic ( Orientation o, CanvasVar* c, Graphic* g, int nat ) : HVGraphic(c, g) { int fil = (o == Horizontal) ? hfil : vfil; Init(nat, fil, fil, o); } int ScrollerGraphic::MinorAxisSize () { return round(.2*inch); } Graphic* ScrollerGraphic::Copy () { return new ScrollerGraphic(GetOrientation(), nil, this, _natural); } void ScrollerGraphic::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(); } 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; if (_orientation == Horizontal) { l = b = inset; r = xmax/3; t = ymax-inset; } else { l = inset; b = ymax - ymax/3; r = xmax - inset; t = ymax - inset; } _p->ClearRect(c, l, b, r, t); _p->Rect(c, l, b, r, t); _p->SetPattern(gs->GetPattern()); }