|
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: 11607 (0x2d57) Types: TextFile Names: »ibgrcomp.c«
└─⟦8648bda34⟧ Bits:30007244 EUUGD5_II: X11R5 └─⟦87c3ac0e0⟧ »./contrib-3/contrib-3.00« └─⟦de8ce1454⟧ └─⟦this⟧ »contrib/lib/iv/src/bin/ibuild/ibgrcomp.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 IGraphicComps and IGraphicViews and derived classes. */ #include "ibgrcomp.h" #include "ibclasses.h" #include "ibcmds.h" #include "ibvars.h" #include <Unidraw/catalog.h> #include <Unidraw/clipboard.h> #include <Unidraw/editor.h> #include <Unidraw/iterator.h> #include <Unidraw/manips.h> #include <Unidraw/selection.h> #include <Unidraw/viewer.h> #include <Unidraw/unidraw.h> #include <Unidraw/Graphic/graphic.h> #include <Unidraw/Tools/tool.h> #include <InterViews/transformer.h> #include <stream.h> #include <string.h> /*****************************************************************************/ static const char* igrcomps_delim = "%igrcomps_delim"; /*****************************************************************************/ IGraphicComps::IGraphicComps () { GetClassNameVar()->SetName("Picture"); GetClassNameVar()->SetBaseClass("Picture"); } void IGraphicComps::Instantiate () { Iterator i; IComp::Instantiate(); for (First(i); !Done(i); Next(i)) { IComp* ikid = (IComp*) GetComp(i); ikid->Instantiate(); } } GraphicComp* IGraphicComps::GetTarget () { return nil; } void IGraphicComps::Interpret (Command* cmd) { Iterator i; if (cmd->IsA(SCAN_CMD)) { ScanCmd* scmd = (ScanCmd*) cmd; IComp::Interpret(cmd); if (!scmd->Succeeded()) { for (First(i); !Done(i) && !scmd->Succeeded(); Next(i)) { GetComp(i)->Interpret(cmd); } } } else if (cmd->IsA(PASTE_CMD)) { Clipboard* cb = cmd->GetClipboard(); Iterator i; if (cb == nil) { Clipboard* globalcb = unidraw->GetCatalog()->GetClipboard(); if (globalcb->IsEmpty()) { return; } cmd->SetClipboard(cb = globalcb->DeepCopy()); } for (cb->First(i); !cb->Done(i);) { GraphicComp* kid = cb->GetComp(i); if (kid->IsA(INTERACTOR_COMP)) { cb->Remove(i); } else { cb->Next(i); } } GraphicComps::Interpret(cmd); Propagate(cmd); } else if (cmd->IsA(GETCONFLICT_CMD)) { IComp::Interpret(cmd); for (First(i); !Done(i); Next(i)) { GetComp(i)->Interpret(cmd); } } else if (cmd->IsA(EDIT_CMD)) { IComp::Interpret(cmd); Propagate(cmd); } else if ( cmd->IsA(INFO_CMD) || cmd->IsA(GETNAMEVARS_CMD) || cmd->IsA(GETFIREWALL_CMD) || cmd->IsA(GETTOPLEVEL_CMD) ) { IComp::Interpret(cmd); } else if (cmd->IsA(UNGROUP_CMD)) { Component* edComp = cmd->GetEditor()->GetComponent(); if (edComp == (Component*) this) { GraphicComps::Interpret(cmd); Propagate(cmd); } else { GraphicComps::Interpret(cmd); } } else if ( !cmd->IsA(SCENE_CMD) && !cmd->IsA(MONOSCENE_CMD) && !cmd->IsA(NAVIGATE_CMD) ) { GraphicComps::Interpret(cmd); Propagate(cmd); } } void IGraphicComps::Uninterpret (Command* cmd) { if (cmd->IsA(EDIT_CMD)) { IComp::Uninterpret(cmd); Unpropagate(cmd); } else if (cmd->IsA(INFO_CMD)) { IComp::Uninterpret(cmd); } else if (cmd->IsA(UNGROUP_CMD)) { Component* edComp = cmd->GetEditor()->GetComponent(); if (edComp == (Component*) this) { GraphicComps::Uninterpret(cmd); Unpropagate(cmd); } else { GraphicComps::Uninterpret(cmd); } } else if ( !cmd->IsA(SCENE_CMD) && !cmd->IsA(MONOSCENE_CMD) && !cmd->IsA(NAVIGATE_CMD) ) { GraphicComps::Uninterpret(cmd); Unpropagate(cmd); } } void IGraphicComps::Read (istream& in) { GraphicComps::Read(in); ReadStateVars(in); } void IGraphicComps::Write (ostream& out) { GraphicComps::Write(out); WriteStateVars(out); } ClassId IGraphicComps::GetSubstId(const char*& delim) { delim = igrcomps_delim; return GRAPHIC_COMPS; } ClassId IGraphicComps::GetClassId () { return IGRAPHIC_COMPS; } boolean IGraphicComps::IsA (ClassId id) { return IGRAPHIC_COMPS == id || IComp::IsA(id); } /*****************************************************************************/ IGraphicViews::IGraphicViews (IGraphicComps* subj) : IView (subj) { _isel=nil;} Selection* IGraphicViews::SelectAll() { return GraphicViews::SelectAll(); } Selection* IGraphicViews::ViewContaining(Coord x, Coord y) { return GraphicViews::ViewContaining(x, y); } Selection* IGraphicViews::ViewsContaining(Coord x, Coord y) { return GraphicViews::ViewsContaining(x, y); } Selection* IGraphicViews::ViewIntersecting( Coord l, Coord b , Coord r, Coord t ) { return GraphicViews::ViewIntersecting(l, b, r, t); } Selection* IGraphicViews::ViewsIntersecting( Coord l, Coord b, Coord r , Coord t ) { return GraphicViews::ViewsIntersecting(l, b, r, t); } Selection* IGraphicViews::ViewsWithin(Coord l, Coord b, Coord r, Coord t) { return GraphicViews::ViewsWithin(l, b, r, t); } Manipulator* IGraphicViews::CreateManipulator ( Viewer* v, Event& e, Transformer* rel, Tool* tool ) { Manipulator* m = nil; if (tool->IsA(RESHAPE_TOOL)) { Iterator i; _isel = ViewIntersecting(e.x-SLOP,e.y-SLOP,e.x+SLOP,e.y+SLOP); if (!_isel->IsEmpty()) { _isel->First(i); GraphicView* gv = _isel->GetView(i); Transformer* t = GetGraphic()->GetTransformer(); if (t != nil) { rel->Premultiply(t); } m = gv->CreateManipulator(v, e, rel, tool); } } else { m = GraphicViews::CreateManipulator(v, e, rel, tool); } return m; } Command* IGraphicViews::InterpretManipulator (Manipulator* m) { Tool* tool = m->GetTool(); Command* cmd = nil; if (tool->IsA(RESHAPE_TOOL)) { Iterator i; _isel->First(i); GraphicView* gv = _isel->GetView(i); cmd = gv->InterpretManipulator(m); delete _isel; _isel = nil; } else { cmd = GraphicViews::InterpretManipulator(m); } return cmd; } void IGraphicViews::DrawHandles () { GraphicViews::DrawHandles(); } void IGraphicViews::RedrawHandles () { GraphicViews::RedrawHandles(); } void IGraphicViews::EraseHandles () { GraphicViews::EraseHandles(); } void IGraphicViews::InitHandles () { GraphicViews::InitHandles(); } /*****************************************************************************/ ClassId GroupCode::GetClassId () { return IGROUP_CODE; } boolean GroupCode::IsA(ClassId id) { return IGROUP_CODE == id || CodeView::IsA(id); } GroupCode::GroupCode (IGraphicComps* subj) : CodeView(subj) {} IGraphicComps* GroupCode::GetIGraphicComps () { return (IGraphicComps*) GetSubject(); } boolean GroupCode::Definition (ostream& out) { Iterator i; boolean ok = true; IGraphicComps* grcomps = GetIGraphicComps(); Graphic* picture= grcomps->GetGraphic(); SubclassNameVar* snamer = grcomps->GetClassNameVar(); MemberNameVar* mnamer = grcomps->GetMemberNameVar(); const char* mname = mnamer->GetName(); const char* subclass = snamer->GetName(); if (_emitGraphicState) { ok = WriteGraphicDecls(picture, out); ok = ok && Iterate(out); } else if ( _emitInstanceDecls || _emitForward || _emitClassHeaders || _emitHeaders ) { ok = CodeView::Definition(out); if (_emitInstanceDecls && _emitGraphicComp && !_emitExport) { out << " GraphicComps* " << mname << "_comp;\n"; } ok = ok && Iterate(out); } else if (_emitExpHeader) { if (!snamer->IsSubclass()) { if ( _scope && mnamer->GetExport() && !_namelist->Search("picture") ) { _namelist->Append("picture"); out << "#include <Unidraw/Graphic/picture.h> \n"; } } else { ok = CodeView::Definition(out); } ok = ok && Iterate(out); } else if (_emitCorehHeader) { if (snamer->IsSubclass() && strcmp(subclass, _classname) == 0) { if (!_namelist->Search("picture")) { _namelist->Append("picture"); out << "#include <Unidraw/Graphic/picture.h> \n"; } } else { ok = ok && Iterate(out); } } else if (_emitInstanceInits) { out << " {\n"; out << " " << mname << " = new " << subclass << ";\n"; ok = WriteGraphicInits(picture, out); if (_emitGraphicComp) { out << " " << mname; out << "_comp = new GraphicComps(" << mname << ");\n"; } out << " }\n"; for (First(i); !Done(i); Next(i)) { CodeView* cv = (CodeView*) GetView(i); ok = ok && cv->Definition(out); const char* kmname = cv->GetIComp()->GetMemberNameVar()->GetName(); if (_emitGraphicComp) { out << " " << mname << "_comp->Append("; out << kmname << "_comp);\n"; } else { out << " " << mname << "->Append("; out << kmname << ");\n"; } } } else if ( _emitCoreDecls || _emitCoreInits || _emitClassDecls || _emitClassInits ) { ok = ok && CodeView::Definition(out); ok = ok && Iterate(out); } return ok && out.good(); } boolean GroupCode::CoreConstDecls(ostream& out) { out << "(Graphic* = nil);\n"; return out.good(); } boolean GroupCode::CoreConstInits(ostream& out) { IComp* icomp = GetIComp(); SubclassNameVar* snamer = icomp->GetClassNameVar(); const char* baseclass = snamer->GetBaseClass(); out << "(Graphic* gr) : "; out << baseclass << "(gr) {}\n\n"; return out.good(); } boolean GroupCode::ConstDecls(ostream& out) { out << "(Graphic* = nil);\n"; return out.good(); } boolean GroupCode::ConstInits(ostream& out) { char coreclass[CHARBUFSIZE]; GetCoreClassName(coreclass); out << "(Graphic* gr) : "; out << coreclass << "(gr) {}\n\n"; return out.good(); } boolean GroupCode::EmitIncludeHeaders(ostream& out) { if (!_namelist->Search("grcomp") && _emitGraphicComp) { _namelist->Append("grcomp"); out << "#include <Unidraw/Components/grcomp.h> \n"; } return out.good(); }