|
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: 20653 (0x50ad) Types: TextFile Names: »ibadjuster.c«
└─⟦8648bda34⟧ Bits:30007244 EUUGD5_II: X11R5 └─⟦87c3ac0e0⟧ »./contrib-3/contrib-3.00« └─⟦de8ce1454⟧ └─⟦this⟧ »contrib/lib/iv/src/bin/ibuild/ibadjuster.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. */ /* * Button component definitions. * $Header: /master/3.0/iv/src/bin/ibuild/RCS/ibadjuster.c,v 1.2 91/09/27 14:05:22 tang Exp $ */ #include "ibadjuster.h" #include "ibclasses.h" #include "ibcmds.h" #include "ibdialogs.h" #include "ibed.h" #include "ibgraphic.h" #include "ibvars.h" #include "ibvarviews.h" #include <Unidraw/catalog.h> #include <Unidraw/clipboard.h> #include <Unidraw/creator.h> #include <Unidraw/iterator.h> #include <Unidraw/manips.h> #include <Unidraw/unidraw.h> #include <Unidraw/ulist.h> #include <Unidraw/viewer.h> #include <Unidraw/Commands/edit.h> #include <Unidraw/Commands/macro.h> #include <Unidraw/Tools/tool.h> #include <InterViews/bitmap.h> #include <InterViews/canvas.h> #include <InterViews/painter.h> #include <InterViews/shape.h> #include <InterViews/Bitmaps/dmoverMask.bm> #include <InterViews/Bitmaps/umoverMask.bm> #include <InterViews/Bitmaps/lmoverMask.bm> #include <InterViews/Bitmaps/rmoverMask.bm> #include <InterViews/Bitmaps/enlargeMask.bm> #include <InterViews/Bitmaps/reducerMask.bm> #include <InterViews/Bitmaps/dmover.bm> #include <InterViews/Bitmaps/umover.bm> #include <InterViews/Bitmaps/lmover.bm> #include <InterViews/Bitmaps/rmover.bm> #include <InterViews/Bitmaps/enlarge.bm> #include <InterViews/Bitmaps/reducer.bm> #include <InterViews/event.h> #include <InterViews/paint.h> #include <InterViews/rubrect.h> #include <InterViews/transformer.h> #include <stream.h> #include <string.h> /*****************************************************************************/ AdjusterGraphic* AdjusterComp::GetAdjusterGraphic () { return (AdjusterGraphic*) GetGraphic(); } ClassId AdjusterComp::GetClassId () { return ADJUSTER_COMP; } boolean AdjusterComp::IsA (ClassId id) { return ADJUSTER_COMP == id || InteractorComp::IsA(id); } AdjusterComp::AdjusterComp (AdjusterGraphic* g) : InteractorComp(g) { if (g != nil) { GetClassNameVar()->SetName(g->GetClassName()); GetClassNameVar()->SetBaseClass(g->GetClassName()); } _adjusteeVar = nil; } AdjusterComp::~AdjusterComp () { delete _adjusteeVar; } void AdjusterComp::Instantiate () { InteractorComp::Instantiate(); if (_adjusteeVar == nil) { _adjusteeVar = new MemberNameVar("", false, false); } } StateVar* AdjusterComp::GetState (const char* name) { StateVar* stateVar = nil; if (strcmp(name, "AdjusteeVar") == 0) { stateVar = _adjusteeVar; } else { stateVar = InteractorComp::GetState(name); } return stateVar; } void AdjusterComp::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& AdjusterComp::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 AdjusterComp::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 AdjusterComp::Interpret (Command* cmd) { if (cmd->IsA(COLOR_CMD)) { ColorCmd* colorCmd = (ColorCmd*) cmd; PSColor* bg = colorCmd->GetBgColor(); if (bg == nil) { InteractorComp::Interpret(cmd); } } else if (!cmd->IsA(FONT_CMD) && !cmd->IsA(BRUSH_CMD)) { InteractorComp::Interpret(cmd); } } void AdjusterComp::Uninterpret (Command* cmd) { if (cmd->IsA(COLOR_CMD)) { ColorCmd* colorCmd = (ColorCmd*) cmd; PSColor* bg = colorCmd->GetBgColor(); if (bg == nil) { InteractorComp::Uninterpret(cmd); } } else if (!cmd->IsA(FONT_CMD) && !cmd->IsA(BRUSH_CMD)) { InteractorComp::Uninterpret(cmd); } } void AdjusterComp::Reconfig () { char* name = (char*)GetClassNameVar()->GetName(); Shape* shape = GetShapeVar()->GetShape(); int w, h; GetAdjusterGraphic()->GetSize(w, h); shape->Rect(w, h); if (strcmp(name, "LeftMover") == 0) { shape->Rigid(w/2, 0, h/2, vfil); } else if (strcmp(name, "RightMover") == 0) { shape->Rigid(w/2, 0, h/2, vfil); } else if (strcmp(name, "UpMover") == 0) { shape->Rigid(w/2, hfil, h/2); } else if (strcmp(name, "DownMover") == 0) { shape->Rigid(w/2, hfil, h/2); } else if (strcmp(name, "Enlarger") == 0) { shape->Rigid(w/2, hfil, h/2); } else if (strcmp(name, "Reducer") == 0) { shape->Rigid(w/2, hfil, h/2); } GetShapeVar()->Notify(); } void AdjusterComp::Read (istream& in) { InteractorComp::Read(in); Catalog* catalog = unidraw->GetCatalog(); ClassId id; in >> id; AdjusterGraphic* g = (AdjusterGraphic*) catalog->GetCreator()->Create(id); g->Read(in); g->SetCanvasVar(GetCanvasVar()); SetGraphic(g); delete _adjusteeVar; _adjusteeVar = (MemberNameVar*) unidraw->GetCatalog()->ReadStateVar(in); } void AdjusterComp::Write (ostream& out) { ClassId id; InteractorComp::Write(out); Catalog* catalog = unidraw->GetCatalog(); AdjusterGraphic* g = GetAdjusterGraphic(); id = g->GetClassId(); out << " " << id << " "; g->Write(out); unidraw->GetCatalog()->WriteStateVar(_adjusteeVar, out); } /*****************************************************************************/ AdjusterView::AdjusterView (AdjusterComp* subj) : InteractorView(subj) { } AdjusterComp* AdjusterView::GetAdjusterComp () { return (AdjusterComp*) GetSubject(); } ClassId AdjusterView::GetClassId () { return ADJUSTER_VIEW; } boolean AdjusterView::IsA (ClassId id) { return ADJUSTER_VIEW == id || InteractorView::IsA(id); } void AdjusterView::Update () { AdjusterGraphic* acomp = GetAdjusterComp()->GetAdjusterGraphic(); AdjusterGraphic* aview = (AdjusterGraphic*) GetGraphic(); IncurDamage(aview); *(Graphic*)aview = *(Graphic*)acomp; UpdateCanvasVar(); IncurDamage(aview); EraseHandles(); } InfoDialog* AdjusterView::GetInfoDialog () { InfoDialog* info = InteractorView::GetInfoDialog(); ButtonState* state = info->GetState(); AdjusterComp* acomp = GetAdjusterComp(); MemberNameVar* adjusteeVar = acomp->GetAdjusteeVar(); info->Include(new RelatedVarView(adjusteeVar, state, acomp)); return info; } /*****************************************************************************/ ClassId AdjusterCode::GetClassId () { return ADJUSTER_CODE; } boolean AdjusterCode::IsA(ClassId id) { return ADJUSTER_CODE == id || CodeView::IsA(id); } AdjusterCode::AdjusterCode (AdjusterComp* subj) : CodeView(subj) { } AdjusterComp* AdjusterCode::GetAdjusterComp () { return (AdjusterComp*) GetSubject(); } boolean AdjusterCode::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("adjuster") ) { _namelist->Append("adjuster"); out << "#include <InterViews/adjuster.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("adjuster")) { _namelist->Append("adjuster"); out << "#include <InterViews/adjuster.h>\n"; } } } else if (_emitInstanceInits) { InteractorComp* icomp = GetIntComp(); InteractorComp* ctarget = nil; const char* mname = icomp->GetMemberNameVar()->GetName(); AdjusterComp* adjuster = GetAdjusterComp(); MemberNameVar* mnamer = (MemberNameVar*) icomp->GetState( "AdjusteeVar" ); const char* adjustee = mnamer->GetName(); if (*adjustee == '\0') { strcat(_errbuf, mname); strcat(_errbuf, " has undefined adjusting target.\n"); return false; } else if (!Search(mnamer, ctarget)) { strcat(_errbuf, mname); strcat( _errbuf, "'s adjusting 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*) adjustee)) { if (!_instancelist->Find((void*) mname)) { _instancelist->Append(new UList((void*)mname)); BeginInstantiate(out); out << "("; InstanceName(out); const char* classname = icomp->GetClassNameVar()->GetBaseClass(); if ( strcmp(classname, "Enlarger") == 0 || strcmp(classname, "Reducer") == 0 ) { out << adjustee << ")"; } else if (strcmp(classname, "Panner") == 0) { int width = adjuster->GetShapeVar()->GetShape()->width; out << adjustee << ", " << width << ")"; } else { out << adjustee << ", 1" << ")"; } 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(); } boolean AdjusterCode::CoreConstDecls(ostream& out) { const char* classname =GetIntComp()->GetClassNameVar()->GetBaseClass(); out << "(const char*, Interactor*"; if ( strcmp(classname, "Enlarger") == 0 || strcmp(classname, "Reducer") == 0 ) { out << ");\n"; } else { out << ", int);\n"; } return out.good(); } boolean AdjusterCode::CoreConstInits(ostream& out) { const char* classname =GetIntComp()->GetClassNameVar()->GetBaseClass(); out << "(\n const char* name, Interactor* i"; if ( strcmp(classname, "Enlarger") == 0 || strcmp(classname, "Reducer") == 0 ) { out << "\n) : " << classname << "(name, i) {\n"; out << " perspective = new Perspective;\n"; out << "}\n\n"; } else { out << ", int w\n) : " << classname << "(name, i, w) {\n"; out << " perspective = new Perspective;\n"; out << "}\n\n"; } return out.good(); } boolean AdjusterCode::ConstDecls(ostream& out) { const char* classname =GetIntComp()->GetClassNameVar()->GetBaseClass(); out << "(const char*, Interactor*"; if ( strcmp(classname, "Enlarger") == 0 || strcmp(classname, "Reducer") == 0 ) { out << ");\n"; } else { out << ", int);\n"; } return out.good(); } boolean AdjusterCode::ConstInits(ostream& out) { const char* classname =GetIntComp()->GetClassNameVar()->GetBaseClass(); char coreclass[CHARBUFSIZE]; GetCoreClassName(coreclass); out << "(\n const char* name, Interactor* i"; if ( strcmp(classname, "Enlarger") == 0 || strcmp(classname, "Reducer") == 0 ) { out << "\n) : " << coreclass << "(name, i) {}\n\n"; } else { out << ", int w\n) : " << coreclass << "(name, i, w) {}\n\n"; } return out.good(); } boolean AdjusterCode::EmitIncludeHeaders(ostream& out) { SubclassNameVar* snamer = GetIntComp()->GetClassNameVar(); if (!snamer->IsSubclass() && !_namelist->Search("adjuster")) { _namelist->Append("adjuster"); out << "#include <InterViews/adjuster.h> \n"; } return out.good(); } /*****************************************************************************/ AdjusterGraphic::AdjusterGraphic ( CanvasVar* c, Graphic* g, Bitmap* fg_map, Bitmap* bg_map, int h, int w ) : IBGraphic(c, g) { Init(fg_map, bg_map, h, w); } void AdjusterGraphic::getExtent ( float& l, float& b, float& cx, float& cy, float& tol, Graphic* gs ) { CanvasVar* cvar = GetCanvasVar(); if (cvar == nil) { int w, h; w = _wmap; h = _hmap; CalcExtent(w, h, l, b, cx, cy, tol, gs); } else { CalcExtent(cvar->Width(), cvar->Height(), l,b,cx,cy,tol,gs); } tol = 0; } void AdjusterGraphic::Init(Bitmap* fg_map, Bitmap* bg_map, int h, int w) { _fg_map = fg_map; if (_fg_map != nil) { _fg_map->Reference(); } _bg_map = bg_map; if (_bg_map != nil) { _bg_map->Reference(); } _hmap = h; _wmap = w; } AdjusterGraphic::~AdjusterGraphic () { _fg_map->Unreference(); _bg_map->Unreference(); } Graphic* AdjusterGraphic::Copy () { return new AdjusterGraphic(nil, this, _fg_map, _bg_map, _hmap, _wmap); } void AdjusterGraphic::Read (istream& in) { ReadGS(in); } void AdjusterGraphic::Write (ostream& out) { WriteGS(out); } const char* AdjusterGraphic::GetClassName () { return "adjuster"; } ClassId AdjusterGraphic::GetClassId () { return ADJUSTER_GRAPHIC; } boolean AdjusterGraphic::IsA (ClassId id) { return ADJUSTER_GRAPHIC == id; } void AdjusterGraphic::draw (Canvas* c, Graphic* gs) { Coord xmax, ymax; if (GetCanvasVar() == nil) { xmax = _wmap; ymax = _hmap; } else { xmax = GetCanvasVar()->xmax(); ymax = GetCanvasVar()->ymax(); } update(gs); int offx = 0; int offy = 0; _p->ClearRect(c, 0, 0, xmax, ymax); if (xmax >= _wmap) { offx = xmax - _wmap; } if (ymax >= _hmap) { offy = ymax - _hmap; } _p->Stencil(c, offx/2, offy/2, _fg_map, _bg_map); } void AdjusterGraphic::drawClipped ( Canvas* c, Coord l, Coord b, Coord r, Coord t, Graphic* gs ) { Graphic::drawClipped(c, l, b, r, t, gs); } /*****************************************************************************/ LMoverGraphic::LMoverGraphic ( CanvasVar* cv, Graphic* g ) : AdjusterGraphic(cv, g) { if (_fg_map == nil) { _fg_map = new Bitmap( lmover_plain_bits, lmover_plain_width, lmover_plain_height ); _bg_map = new Bitmap( lmover_mask_bits, lmover_mask_width, lmover_mask_height ); } Init(_fg_map, _bg_map, lmover_plain_height, lmover_plain_width); } const char* LMoverGraphic::GetClassName () { return "LeftMover"; } ClassId LMoverGraphic::GetClassId () { return LMOVER_GRAPHIC; } boolean LMoverGraphic::IsA (ClassId id) { return LMOVER_GRAPHIC == id || AdjusterGraphic::IsA(id); } /*****************************************************************************/ RMoverGraphic::RMoverGraphic ( CanvasVar* cv, Graphic* g ) : AdjusterGraphic(cv, g) { if (_fg_map == nil) { _fg_map = new Bitmap( rmover_plain_bits, rmover_plain_width, rmover_plain_height ); _bg_map = new Bitmap( rmover_mask_bits, rmover_mask_width, rmover_mask_height ); } Init(_fg_map, _bg_map, rmover_plain_height, rmover_plain_width); } const char* RMoverGraphic::GetClassName () { return "RightMover"; } ClassId RMoverGraphic::GetClassId () { return RMOVER_GRAPHIC; } boolean RMoverGraphic::IsA (ClassId id) { return RMOVER_GRAPHIC == id || AdjusterGraphic::IsA(id); } /*****************************************************************************/ UMoverGraphic::UMoverGraphic ( CanvasVar* cv, Graphic* g ) : AdjusterGraphic(cv, g) { if (_fg_map == nil) { _fg_map = new Bitmap( umover_plain_bits, umover_plain_width, umover_plain_height ); _bg_map = new Bitmap( umover_mask_bits, umover_mask_width, umover_mask_height ); } Init(_fg_map, _bg_map, umover_plain_height, umover_plain_width); } const char* UMoverGraphic::GetClassName () { return "UpMover"; } ClassId UMoverGraphic::GetClassId () { return UMOVER_GRAPHIC; } boolean UMoverGraphic::IsA (ClassId id) { return UMOVER_GRAPHIC == id || AdjusterGraphic::IsA(id); } /*****************************************************************************/ DMoverGraphic::DMoverGraphic ( CanvasVar* cv, Graphic* g ) : AdjusterGraphic(cv, g) { if (_fg_map == nil) { _fg_map = new Bitmap( dmover_plain_bits, dmover_plain_width, dmover_plain_height ); _bg_map = new Bitmap( dmover_mask_bits, dmover_mask_width, dmover_mask_height ); } Init(_fg_map, _bg_map, dmover_plain_height, dmover_plain_width); } const char* DMoverGraphic::GetClassName () { return "DownMover"; } ClassId DMoverGraphic::GetClassId () { return DMOVER_GRAPHIC; } boolean DMoverGraphic::IsA (ClassId id) { return DMOVER_GRAPHIC == id || AdjusterGraphic::IsA(id); } /*****************************************************************************/ EnlargerGraphic::EnlargerGraphic ( CanvasVar* cv, Graphic* g ) : AdjusterGraphic(cv, g) { if (_fg_map == nil) { _fg_map = new Bitmap( enlarger_plain_bits, enlarger_plain_width, enlarger_plain_height ); _bg_map = new Bitmap( enlarger_mask_bits, enlarger_mask_width, enlarger_mask_height ); } Init(_fg_map, _bg_map, enlarger_plain_height, enlarger_plain_width); } const char* EnlargerGraphic::GetClassName () { return "Enlarger"; } ClassId EnlargerGraphic::GetClassId () { return ENLARGER_GRAPHIC; } boolean EnlargerGraphic::IsA (ClassId id) { return ENLARGER_GRAPHIC == id || AdjusterGraphic::IsA(id); } /*****************************************************************************/ ReducerGraphic::ReducerGraphic ( CanvasVar* cv, Graphic* g ) : AdjusterGraphic(cv, g) { if (_fg_map == nil) { _fg_map = new Bitmap( reducer_plain_bits, reducer_plain_width, reducer_plain_height ); _bg_map = new Bitmap( reducer_mask_bits, reducer_mask_width, reducer_mask_height ); } Init(_fg_map, _bg_map, reducer_plain_height, reducer_plain_width); } const char* ReducerGraphic::GetClassName () { return "Reducer"; } ClassId ReducerGraphic::GetClassId () { return REDUCER_GRAPHIC; } boolean ReducerGraphic::IsA (ClassId id) { return REDUCER_GRAPHIC == id || AdjusterGraphic::IsA(id); }