|
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: 32510 (0x7efe) Types: TextFile Names: »ibframe.c«
└─⟦8648bda34⟧ Bits:30007244 EUUGD5_II: X11R5 └─⟦87c3ac0e0⟧ »./contrib-3/contrib-3.00« └─⟦de8ce1454⟧ └─⟦this⟧ »contrib/lib/iv/src/bin/ibuild/ibframe.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 Frame component and derived classes. * $Header: /master/3.0/iv/src/bin/ibuild/RCS/ibframe.c,v 1.2 91/09/27 14:10:28 tang Exp $ */ #include "ibclasses.h" #include "ibcmds.h" #include "ibdialogs.h" #include "ibframe.h" #include "ibrubrect.h" #include "ibvars.h" #include "ibvarviews.h" #include <Unidraw/catalog.h> #include <Unidraw/clipboard.h> #include <Unidraw/creator.h> #include <Unidraw/editor.h> #include <Unidraw/Graphic/graphic.h> #include <Unidraw/iterator.h> #include <Unidraw/manips.h> #include <Unidraw/selection.h> #include <Unidraw/statevars.h> #include <Unidraw/ulist.h> #include <Unidraw/viewer.h> #include <Unidraw/unidraw.h> #include <Unidraw/Commands/brushcmd.h> #include <Unidraw/Tools/grcomptool.h> #include <InterViews/button.h> #include <InterViews/canvas.h> #include <InterViews/event.h> #include <InterViews/painter.h> #include <InterViews/shape.h> #include <InterViews/transformer.h> #include <string.h> #include <stream.h> #include <stdlib.h> /*****************************************************************************/ class FrameData : public lbrtData { public: FrameData(FrameComp*, int); virtual ~FrameData(); public: Transformer* _tf; }; FrameData::FrameData(FrameComp* fcomp, int width) : lbrtData(fcomp) { _void = (void*) width; _tf = new Transformer(fcomp->GetFrameGraphic()->GetTransformer()); } FrameData::~FrameData () { delete _tf; } class FramePicture : public IBGraphic { public: FramePicture(CanvasVar* = nil, Graphic* = nil); virtual void SetCanvasVar(CanvasVar*); virtual void SetColors(PSColor* f, PSColor* b); virtual void SetBrush(PSBrush*); virtual void Bequeath(); void SetFrameGraphic(FrameGraphic*); virtual void draw(Canvas*, Graphic*); virtual void drawClipped(Canvas*, Coord, Coord, Coord, Coord, Graphic*); void SetDamage(boolean); boolean GetDamage(); protected: FrameGraphic* _framegr; boolean _damage; }; FramePicture::FramePicture (CanvasVar* c, Graphic* g) : IBGraphic(c, g) { _framegr = nil; _damage = false; } void FramePicture::SetDamage (boolean damage) { _damage = damage; } boolean FramePicture::GetDamage () { return _damage; } void FramePicture::Bequeath () { Remove(_framegr); IBGraphic::Bequeath(); Append(_framegr); } void FramePicture::SetColors(PSColor* f, PSColor* b) { IBGraphic::SetColors(f, b); if (_framegr != nil) { _framegr->SetColors(f, b); } } void FramePicture::SetBrush(PSBrush* br) { if (br != nil && _framegr != nil) { int w = br->Width(); _framegr->SetThickness(w, w, w, w); } } void FramePicture::SetFrameGraphic(FrameGraphic* fg) { _framegr = fg; } void FramePicture::SetCanvasVar(CanvasVar* cvar) { IBGraphic::SetCanvasVar(cvar); if (_framegr != nil) { _framegr->SetCanvasVar(cvar); } } void FramePicture::draw (Canvas* c, Graphic* gs) { IBGraphic::draw(c, gs); if (_framegr != nil && !_framegr->IsA(MARGINFRAME_GRAPHIC)) { FullGraphic gstemp; Transformer ttemp; gstemp.SetTransformer(&ttemp); concatGraphic(_framegr, _framegr, gs, &gstemp); drawGraphic(_framegr, c, &gstemp); gstemp.SetTransformer(nil); /* to avoid deleting ttemp explicitly */ } } void FramePicture::drawClipped ( Canvas* c, Coord l, Coord b, Coord r, Coord t, Graphic* gs ) { Graphic::drawClipped(c, l, b, r, t, gs); } /*****************************************************************************/ FrameComp::FrameComp ( FrameGraphic* fg ) : MonoSceneComp(new FramePicture) { if (fg != nil) { FramePicture* fp = (FramePicture*) GetGraphic(); GetClassNameVar()->SetName(fg->GetClassName()); GetClassNameVar()->SetBaseClass(fg->GetClassName()); fp->Append(fg); fp->SetFrameGraphic(fg); } _framegr = fg; } ClassId FrameComp::GetClassId () { return FRAME_COMP; } boolean FrameComp::IsA (ClassId id) { return FRAME_COMP==id || MonoSceneComp::IsA(id); } void FrameComp::SetFrameGraphic(FrameGraphic* fg) { GetClassNameVar()->SetName(fg->GetClassName()); GetClassNameVar()->SetBaseClass(fg->GetClassName()); GetGraphic()->Remove(_framegr); GetGraphic()->Append(fg); _framegr = fg; } void FrameComp::Interpret (Command* cmd) { if (cmd->IsA(BRUSH_CMD) && !cmd->IsA(GLUEVISIBILITY_CMD)) { BrushCmd* brushcmd = (BrushCmd*) cmd; FrameGraphic* gr = GetFrameGraphic(); int lbrt; gr->GetThickness(lbrt, lbrt, lbrt, lbrt); cmd->Store(this, new VoidData((void*) lbrt)); lbrt = brushcmd->GetBrush()->Width(); gr->SetThickness(lbrt, lbrt, lbrt, lbrt); Reconfig(); Notify(); InteractorComp* kid = GetKid(); if (kid != nil) { kid->Interpret(cmd); } Propagate(cmd); } else if (cmd->IsA(COLOR_CMD)) { ColorCmd* colorCmd = (ColorCmd*) cmd; PSColor* fg = colorCmd->GetFgColor(); if (fg != nil) { InteractorComp::Interpret(cmd); } } else if (cmd->IsA(UNGROUP_CMD) || cmd->IsA(MONOSCENE_CMD)) { Editor* ed = cmd->GetEditor(); if (ed->GetComponent() != this) { FramePicture* fp = (FramePicture*) GetGraphic(); fp->SetDamage(true); Notify(); } MonoSceneComp::Interpret(cmd); } else if (cmd->IsA(NAVIGATE_CMD)) { FramePicture* fp = (FramePicture*) GetGraphic(); fp->SetDamage(true); MonoSceneComp::Interpret(cmd); } else { MonoSceneComp::Interpret(cmd); } } void FrameComp::Uninterpret (Command* cmd) { if (cmd->IsA(BRUSH_CMD) && !cmd->IsA(GLUEVISIBILITY_CMD)) { FrameGraphic* gr = GetFrameGraphic(); VoidData* vd = (VoidData*) cmd->Recall(this); int lbrt = (int) vd->_void; gr->SetThickness(lbrt, lbrt, lbrt, lbrt); Reconfig(); Notify(); InteractorComp* kid = GetKid(); if (kid != nil) { kid->Uninterpret(cmd); } Unpropagate(cmd); } else if (cmd->IsA(COLOR_CMD)) { ColorCmd* colorCmd = (ColorCmd*) cmd; PSColor* fg = colorCmd->GetFgColor(); if (fg != nil) { InteractorComp::Uninterpret(cmd); } } else if (cmd->IsA(UNGROUP_CMD) || cmd->IsA(MONOSCENE_CMD)) { Editor* ed = cmd->GetEditor(); if (ed->GetComponent() != this) { FramePicture* fp = (FramePicture*) GetGraphic(); fp->SetDamage(true); Notify(); } MonoSceneComp::Uninterpret(cmd); } else if (cmd->IsA(NAVIGATE_CMD)) { FramePicture* fp = (FramePicture*) GetGraphic(); fp->SetDamage(true); MonoSceneComp::Uninterpret(cmd); } else { MonoSceneComp::Uninterpret(cmd); } } void FrameComp::Resize () { int w = _canvasVar->Width(), h = _canvasVar->Height(); float cx, cy; int l, b, r, t; Coord x1, y1, x2, y2; InteractorComp* kid = GetKid(); if (kid != nil) { Graphic* kidgr = kid->GetGraphic(); _framegr->GetThickness(l, b, r, t); kidgr->Align(Center, _framegr, Center); _framegr->GetCenter(cx, cy); x1 = round(cx) - w/2 + l; y1 = round(cy) - h/2 + b; x2 = round(cx) + (w+1)/2 - r; y2 = round(cy) + (h+1)/2 - t; Place(kid, x1, y1, x2-1, y2-1); } } void FrameComp::Reconfig () { MonoSceneComp::Reconfig(); int l, b, r, t; GetFrameGraphic()->GetThickness(l, b, r, t); Shape* shape = GetShapeVar()->GetShape(); shape->width += l + r; shape->height += b + t; } void FrameComp::StoreCanvas(Command* cmd) { FrameData* prevData = (FrameData*) cmd->Recall(this); Iterator i; if (prevData == nil && GetCanvasVar() != nil) { int lbrt; FrameGraphic* gr = GetFrameGraphic(); gr->GetThickness(lbrt, lbrt, lbrt, lbrt); FrameData* framebox = new FrameData(this, lbrt); cmd->Store(this, framebox); InteractorComp* kid = GetKid(); if (kid != nil) { kid->StoreCanvas(cmd); } } } void FrameComp::RestoreCanvas(Command* cmd) { Iterator i; FrameData* d = (FrameData*) cmd->Recall(this); if (d != nil) { int lbrt; lbrt = (int) d->_void; Place(this, d->_l, d->_b, d->_r-1, d->_t-1); *GetShapeVar()->GetShape() = *d->_ibshape; Transformer* tr = GetGraphic()->GetTransformer(); if (tr == nil) { GetGraphic()->SetTransformer(new Transformer(d->_tr)); } else { *tr = *d->_tr; } FrameGraphic* fgr = GetFrameGraphic(); *fgr->GetTransformer() = *d->_tf; fgr->SetThickness(lbrt, lbrt, lbrt, lbrt); Notify(); InteractorComp* kid = GetKid(); if (kid != nil) { kid->RestoreCanvas(cmd); } } } void FrameComp::Read(istream& in) { MonoSceneComp::Read(in); Catalog* catalog = unidraw->GetCatalog(); ClassId id; in >> id; _framegr = (FrameGraphic*) catalog->GetCreator()->Create(id); _framegr->Read(in); _framegr->SetCanvasVar(GetCanvasVar()); FramePicture* fp = (FramePicture*) GetGraphic(); fp->Append(_framegr); fp->SetFrameGraphic(_framegr); } void FrameComp::Write(ostream& out) { ClassId id; MonoSceneComp::Write(out); Catalog* catalog = unidraw->GetCatalog(); id = _framegr->GetClassId(); out << " " << id << " "; _framegr->Write(out); } /*****************************************************************************/ FrameView::FrameView (FrameComp* subj) : MonoSceneView(subj) { _framegr = nil; } FrameComp* FrameView::GetFrameComp () { return (FrameComp*) GetSubject();} ClassId FrameView::GetClassId () { return FRAME_VIEW; } boolean FrameView::IsA (ClassId id) { return FRAME_VIEW == id || MonoSceneView::IsA(id); } Graphic* FrameView::GetGraphic () { Graphic* g = GraphicView::GetGraphic(); if (g == nil) { FrameComp* fcomp = GetFrameComp(); _framegr = (FrameGraphic*) fcomp->GetFrameGraphic()->Copy(); FramePicture* fp = new FramePicture; fp->Append(_framegr); fp->SetFrameGraphic(_framegr); g = fp; SetGraphic(g); } return g; } void FrameView::Update () { FramePicture* fcomp = (FramePicture*) GetFrameComp()->GetGraphic(); FramePicture* fview = (FramePicture*) GetGraphic(); int l, b, r, t; FrameGraphic* framegr = GetFrameComp()->GetFrameGraphic(); framegr->GetThickness(l, b, r, t); fcomp->SetDamage(false); IncurDamage(fview); *(Graphic*)fview = *(Graphic*)fcomp; *(Graphic*)_framegr = *(Graphic*)framegr; UpdateCanvasVar(); _framegr->SetThickness(l, b, r, t); IncurDamage(fview); GraphicViews::Update(); } /*****************************************************************************/ ClassId FrameCode::GetClassId () { return FRAME_CODE; } boolean FrameCode::IsA (ClassId id) { return FRAME_CODE ==id || MonoSceneCode::IsA(id); } FrameCode::FrameCode (FrameComp* subj) : MonoSceneCode(subj) { } FrameComp* FrameCode::GetFrameComp () { return (FrameComp*) GetSubject(); } boolean FrameCode::Definition (ostream& out) { int l, b, r, t; boolean ok = true; CodeView* kview = GetKidView(); if ( _emitInstanceDecls || _emitForward || _emitProperty || _emitClassHeaders || _emitHeaders ) { ok = ok && CodeView::Definition(out); if (kview != nil) { ok = ok && kview->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("frame")) { _namelist->Append("frame"); out << "#include <InterViews/frame.h>\n"; } } else { ok = ok && CodeView::Definition(out); } if (kview != nil) { ok = ok && kview->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("frame")) { _namelist->Append("frame"); out << "#include <InterViews/frame.h>\n"; } } else { if (kview != nil) { ok = ok && kview->Definition(out); } } } else if (_emitInstanceInits) { FrameComp* fcomp = GetFrameComp(); const char* mname = fcomp->GetMemberNameVar()->GetName(); if (!_instancelist->Find((void*) mname)) { _instancelist->Append(new UList((void*)mname)); BeginInstantiate(out); out << "("; InstanceName(out); out << "nil"; const char* classname =fcomp->GetClassNameVar()->GetBaseClass(); if ( strcmp(classname, "Frame") == 0) { FrameGraphic* fg = fcomp->GetFrameGraphic(); fg->GetThickness(l, b, r, t); out << ", " << l << ")"; } else if (strcmp(classname, "ShadowFrame") == 0) { int h, v; FrameGraphic* fg = fcomp->GetFrameGraphic(); ShadowFrameGraphic* sg = (ShadowFrameGraphic*) fg; sg->GetShadow(h, v); out << ", " << h << ", " << v << ")"; } else if (strcmp(classname, "MarginFrame") == 0) { MarginFrameComp* mfc = (MarginFrameComp*) fcomp; Shape* s = mfc->GetMarginStateVar()->GetShape(); out << ", "; out << s->width << ", "; out << s->hshrink << ", " << s->hstretch << ", "; out << s->height << ", "; out << s->vshrink << ", " << s->vstretch << ")"; } EndInstantiate(out); } if (kview != nil) { ok = kview->Definition(out) && ok; } if (AllKidsDefined() && !_lock) { _lock = true; InteractorComp* kid = fcomp->GetKid(); if (kid != nil) { const char* instance = kid->GetMemberNameVar()->GetName(); out << " " << mname << "->Insert("; out << instance << ");\n"; } } } else if ( _emitBSDecls || _emitBSInits || _emitFunctionDecls || _emitFunctionInits ) { if (kview != nil) { ok = ok && kview->Definition(out); } } else if ( _emitCoreDecls || _emitCoreInits || _emitClassDecls || _emitClassInits ) { ok = ok && CodeView::Definition(out); if (kview != nil) { ok = ok && kview->Definition(out); } } else if (_emitMain) { ok = ok && CodeView::Definition(out); } return ok; } boolean FrameCode::CoreConstDecls(ostream& out) { const char* classname =GetIntComp()->GetClassNameVar()->GetBaseClass(); out << "(const char*, Interactor*, "; if ( strcmp(classname, "Frame") == 0) { out << "int);\n"; } else if (strcmp(classname, "ShadowFrame") == 0) { out << "int, int);\n"; } else if (strcmp(classname, "MarginFrame") == 0) { out << "int, int, int, int, int, int);\n"; } return out.good(); } boolean FrameCode::CoreConstInits(ostream& out) { const char* classname =GetIntComp()->GetClassNameVar()->GetBaseClass(); out << "(\n const char* name, Interactor* i, "; if ( strcmp(classname, "Frame") == 0) { out << "int w\n) : " << classname << "(name, i, w) {\n"; out << " perspective = new Perspective;\n"; out << "}\n\n"; } else if (strcmp(classname, "ShadowFrame") == 0) { out << "int h, int v\n) : " << classname << "(name, i, h, v) {\n"; out << " perspective = new Perspective;\n"; out << "}\n\n"; } else if (strcmp(classname, "MarginFrame") == 0) { out << "int hn, int hshr, int hstr, int vn, int vshr, int vstr\n) : "; out << classname << "(name, i, hn, hshr, hstr, vn, vshr, vstr) {\n"; out << " perspective = new Perspective;\n"; out << "}\n\n"; } return out.good(); } boolean FrameCode::ConstDecls(ostream& out) { const char* classname =GetIntComp()->GetClassNameVar()->GetBaseClass(); out << "(const char*, Interactor*, "; if ( strcmp(classname, "Frame") == 0) { out << "int);\n"; } else if (strcmp(classname, "ShadowFrame") == 0) { out << "int, int);\n"; } else if (strcmp(classname, "MarginFrame") == 0) { out << "int, int, int, int, int, int);\n"; } return out.good(); } boolean FrameCode::ConstInits(ostream& out) { const char* classname =GetIntComp()->GetClassNameVar()->GetBaseClass(); char coreclass[CHARBUFSIZE]; GetCoreClassName(coreclass); out << "(\n const char* name, Interactor* i, "; if ( strcmp(classname, "Frame") == 0) { out << "int w\n) : " << coreclass << "(name, i, w) {}\n\n"; } else if (strcmp(classname, "ShadowFrame") == 0) { out << "int h, int v\n) : " << coreclass << "(name, i, h, v) {}\n\n"; } else if (strcmp(classname, "MarginFrame") == 0) { out << "int hn, int hshr, int hstr, int vn, int vshr, int vstr\n) : "; out << coreclass << "(name, i, hn, hshr, hstr, vn, vshr, vstr) {}\n\n"; } return out.good(); } boolean FrameCode::EmitIncludeHeaders(ostream& out) { SubclassNameVar* snamer = GetIntComp()->GetClassNameVar(); if (!snamer->IsSubclass() && !_namelist->Search("frame")) { _namelist->Append("frame"); out << "#include <InterViews/frame.h> \n"; } return out.good(); } /*************************************************************************/ FrameGraphic::FrameGraphic ( CanvasVar* c, Graphic* g, int width ) : IBGraphic(c, g) { SetThickness(width, width, width, width); } void FrameGraphic::getExtent ( float& l, float& b, float& cx, float& cy, float& tol, Graphic* gs ) { CanvasVar* cvar = GetCanvasVar(); if (cvar != nil) { CalcExtent(cvar->Width(), cvar->Height(), l,b,cx,cy,tol,gs); } tol = 0; } Graphic* FrameGraphic::Copy () { Iterator i; FrameGraphic* copy = new FrameGraphic(nil, this, _l); return copy; } void FrameGraphic::Read (istream& in) { ReadGS(in); in >> _l >> _b >> _r >> _t; } void FrameGraphic::Write (ostream& out) { WriteGS(out); out << _l << " " << _b << " " << _r << " " << _t << " "; } const char* FrameGraphic::GetClassName () { return "Frame"; } ClassId FrameGraphic::GetClassId () { return FRAME_GRAPHIC; } boolean FrameGraphic::IsA (ClassId id) { return FRAME_GRAPHIC == id; } void FrameGraphic::draw (Canvas* c, Graphic* gs) { Coord xmax, ymax; CanvasVar* cvar = GetCanvasVar(); if (cvar != nil) { update(gs); xmax = cvar->xmax(); ymax = cvar->ymax(); register Coord r = xmax - _r; register Coord t = ymax - _t; _p->FillRect(c, 0, 0, _l-1, t); _p->FillRect(c, _l, 0, xmax, _b-1); _p->FillRect(c, r+1, _b, xmax, ymax); _p->FillRect(c, 0, t+1, r, ymax); } } void FrameGraphic::drawClipped ( Canvas* c, Coord left, Coord bottom, Coord right, Coord top, Graphic* gs ) { Graphic::drawClipped(c, left, bottom, right, top, gs); } void FrameGraphic::GetThickness(int& l , int& b , int& r, int& t) { l = _l; b = _b; r = _r; t = _t; } void FrameGraphic::SetThickness(int l, int b, int r, int t) { _l = l; _b = b; _r = r; _t = t; } /*************************************************************************/ ShadowFrameGraphic::ShadowFrameGraphic ( CanvasVar* c, Graphic* g, int h, int v ) : FrameGraphic(c, g) { SetThickness(2, v, h, 2); } void ShadowFrameGraphic::GetShadow(int& h, int& v) { h = _r; v = _b; } void ShadowFrameGraphic::SetThickness(int , int b, int r, int ) { _l = 2; _b = b; _r = r; _t = 2; } Graphic* ShadowFrameGraphic::Copy () { Iterator i; FrameGraphic* copy = new ShadowFrameGraphic(nil, this, _r, _b); return copy; } const char* ShadowFrameGraphic::GetClassName () { return "ShadowFrame"; } ClassId ShadowFrameGraphic::GetClassId () { return SHADOWFRAME_GRAPHIC; } boolean ShadowFrameGraphic::IsA (ClassId id) { return SHADOWFRAME_GRAPHIC == id; } void ShadowFrameGraphic::draw (Canvas* c, Graphic* gs) { Coord xmax, ymax; CanvasVar* cvar = GetCanvasVar(); if (cvar != nil) { update(gs); xmax = cvar->xmax(); ymax = cvar->ymax(); register Coord r = xmax - _r; register Coord t = ymax - _t; register Coord v = _b + _t - 2; register Coord h = _l + _r - 2; /* borders */ _p->FillRect(c, _l, _b, _l, t); _p->FillRect(c, _l+1, _b, r, _b); _p->FillRect(c, r, _b+1, r, t+1); _p->FillRect(c, _l, t+1, r-1, t+1); /* shadows */ _p->FillRect(c, _r+1, 0, xmax, _b); _p->FillRect(c, xmax-_r, 0, xmax, ymax-_b); } } /*************************************************************************/ MarginFrameComp::MarginFrameComp (MarginFrameGraphic* fg) : FrameComp(fg) { int hm, hshr, hstr; int vm, vshr, vstr; _margin = nil; if (fg != nil) { fg->GetShrStr(hm, hshr, hstr, vm, vshr, vstr); Init(hm, hshr, hstr, vm, vshr, vstr); } } void MarginFrameComp::Init ( int hm, int hshr, int hstr, int vm, int vshr, int vstr ) { if (_margin != nil) { delete _margin; } IBShape* margin = new IBShape; _margin = new ShapeVar(margin); margin->width = hm; margin->hshrink = hshr; margin->hstretch = hstr; margin->height = vm; margin->vshrink = vshr; margin->vstretch = vstr; margin->hnat = margin->hstr = margin->hshr = true; margin->vnat = margin->vstr = margin->vshr = true; } ClassId MarginFrameComp::GetClassId () { return MARGINFRAME_COMP; } boolean MarginFrameComp::IsA (ClassId id) { return MARGINFRAME_COMP==id || FrameComp::IsA(id); } void MarginFrameComp::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(BRUSH_CMD) || cmd->IsA(GLUEVISIBILITY_CMD)) { FrameComp::Interpret(cmd); } else { MonoSceneComp::Interpret(cmd); } } void MarginFrameComp::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(BRUSH_CMD) || cmd->IsA(GLUEVISIBILITY_CMD)) { FrameComp::Uninterpret(cmd); } else { MonoSceneComp::Uninterpret(cmd); } } void MarginFrameComp::Resize () { int xmax = _canvasVar->Width(), ymax = _canvasVar->Height(); Shape* margin = _margin->GetShape(); float cx, cy; Coord x1, y1; InteractorComp* kid = GetKid(); if (kid != nil) { Graphic* kidgr = kid->GetGraphic(); _framegr->SetCanvasVar(_canvasVar); kidgr->Align(Center, _framegr, Center); _framegr->GetCenter(cx, cy); x1 = round(cx) - xmax/2; y1 = round(cy) - ymax/2; Shape* shape = GetShapeVar()->GetShape(); Coord hextra = (xmax+1) - shape->width; Coord h = margin->width*2; if (hextra > 0 && shape->hstretch != 0) { h += int(float(margin->hstretch*2) / float(shape->hstretch) * float(hextra)); } else if (hextra < 0 && shape->hshrink != 0) { h += int(float(margin->hshrink*2) / float(shape->hshrink) * float(hextra)); } Coord vextra = (ymax+1) - shape->height; Coord v = margin->height*2; if (vextra > 0 && shape->vstretch != 0) { v += int(float(margin->vstretch*2) / float(shape->vstretch) * float(vextra)); } else if (vextra < 0 && shape->vshrink != 0) { v += int(float(margin->vshrink*2) / float(shape->vshrink) * float(vextra)); } Place(kid, x1+h/2, y1+v/2, x1+xmax-h/2-1, y1+ymax-v/2-1); } } void MarginFrameComp::Reconfig () { MonoSceneComp::Reconfig(); Shape* margin = _margin->GetShape(); Shape* shape = GetShapeVar()->GetShape(); shape->width += margin->width*2; shape->height += margin->height*2; shape->hshrink += margin->hshrink*2; shape->hstretch += margin->hstretch*2; shape->vshrink += margin->vshrink*2; shape->vstretch += margin->vstretch*2; } StateVar* MarginFrameComp::GetState (const char* name) { StateVar* stateVar = nil; if (strcmp(name, "MarginStateVar") == 0) { stateVar = _margin; } else { stateVar = FrameComp::GetState(name); } return stateVar; } void MarginFrameComp::Read(istream& in) { FrameComp::Read(in); MarginFrameGraphic* mg = (MarginFrameGraphic*) _framegr; _margin = (ShapeVar*) unidraw->GetCatalog()->ReadStateVar(in); } void MarginFrameComp::Write(ostream& out) { FrameComp::Write(out); unidraw->GetCatalog()->WriteStateVar(_margin, out); } /*****************************************************************************/ MarginFrameView::MarginFrameView (MarginFrameComp* subj) : FrameView(subj) { _rigid = false; } MarginFrameComp* MarginFrameView::GetMarginFrameComp () { return (MarginFrameComp*) GetSubject(); } ClassId MarginFrameView::GetClassId () { return MARGINFRAME_VIEW; } boolean MarginFrameView::IsA (ClassId id) { return MARGINFRAME_VIEW == id || FrameView::IsA(id); } InfoDialog* MarginFrameView::GetInfoDialog () { InfoDialog* info = FrameView::GetInfoDialog(); ButtonState* state = info->GetState(); ShapeVar* margin = GetMarginFrameComp()->GetMarginStateVar(); info->Include(new MarginVarView(margin, state)); return info; } Manipulator* MarginFrameView::CreateManipulator ( Viewer* v, Event& e, Transformer* rel, Tool* tool ) { Manipulator* m = nil; Rubberband* rub = nil; if (tool->IsA(IBGRAPHIC_COMP_TOOL)) { m = InteractorView::CreateManipulator(v, e, rel, tool); } else if (tool->IsA(GRAPHIC_COMP_TOOL)) { _rigid = e.shift; GraphicView* views = v->GetGraphicView(); Selection* newSel = views->ViewIntersecting( e.x-SLOP, e.y-SLOP, e.x+SLOP, e.y+SLOP ); if (!newSel->IsEmpty()) { Coord l, b, r, t; Iterator i; newSel->First(i); GraphicView* gv = newSel->GetView(i); gv->GetGraphic()->GetBox(l, b, r, t); rub = new ConstrainScaleRect( nil, nil, l, b, r, t, (l+r)/2, (b+t)/2 ); v->GetSelection()->Append(gv); m = new DragManip(v, rub, rel, tool, Gravity); } } else { m = FrameView::CreateManipulator(v, e, rel, tool); } return m; } Command* MarginFrameView::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)) { Coord l, b, r, t; Coord ll, bb, rr, tt; DragManip* dm = (DragManip*) m; Selection* s = dm->GetViewer()->GetSelection(); Iterator i; s->First(i); GraphicView* gv = s->GetView(i); gv->GetGraphic()->GetBox(ll, bb, rr, tt); ConstrainScaleRect* sr = (ConstrainScaleRect*) dm->GetRubberband(); sr->GetCurrent(l, b, r, t); Transformer* rel = dm->GetTransformer(); Editor* ed = dm->GetViewer()->GetEditor(); ColorVar* colVar = (ColorVar*) ed->GetState("ColorVar"); if (rel != nil) { rel->InvTransformRect(l, b, r, t); rel->InvTransformRect(ll, bb, rr, tt); } _rigid = _rigid || dm->GraspEvent().shift; MarginFrameGraphic* mg; if (_rigid) { mg = new MarginFrameGraphic( nil, stdgraphic, r-rr+1, 0, 0, t-tt+1, 0, 0 ); } else { mg = new MarginFrameGraphic( nil, stdgraphic, r-rr+1, 1000000, 1000000, t-tt+1, 1000000, 1000000 ); } mg->SetColors( stdgraphic->GetFgColor(), colVar->GetBgColor() ); cmd = new MonoSceneCmd(ed, new MarginFrameComp(mg)); } else { cmd = FrameView::InterpretManipulator(m); } return cmd; } void MarginFrameView::Update () { MarginFrameComp* mcomp = GetMarginFrameComp(); IBGraphic* fcomp = mcomp->GetIBGraphic(); IBGraphic* fview = (IBGraphic*) GetGraphic(); int l, b, r, t; int hm, hshr, hstr, vm, vshr, vstr; MarginFrameGraphic* framegr = mcomp->GetMarginFrameGraphic(); framegr->GetThickness(l, b, r, t); framegr->GetShrStr(hm, hshr, hstr, vm, vshr, vstr); IncurDamage(fview); *(Graphic*)_framegr = *(Graphic*)framegr; *(Graphic*)fview = *(Graphic*)fcomp; UpdateCanvasVar(); MarginFrameGraphic* mg= (MarginFrameGraphic*) _framegr; mg->SetThickness(l, b, r, t); mg->SetShrStr(hm, hshr, hstr, vm, vshr, vstr); IncurDamage(fview); EraseHandles(); GraphicViews::Update(); } /*************************************************************************/ MarginFrameGraphic::MarginFrameGraphic ( CanvasVar* c, Graphic* g, int hm, int hshr, int hstr, int vm, int vshr, int vstr ) : FrameGraphic(c, g) { _hmargin = hm; _hshrink = hshr; _hstretch = hstr; _vmargin = vm; _vshrink = vshr; _vstretch = vstr; } Graphic* MarginFrameGraphic::Copy () { Iterator i; Graphic* copy = new MarginFrameGraphic( nil, this, _hmargin, _hshrink, _hstretch, _vmargin, _vshrink, _vstretch ); return copy; } void MarginFrameGraphic::GetShrStr( int& hm, int& hshr, int& hstr, int& vm, int& vshr, int& vstr ) { hm = _hmargin; hshr = _hshrink; hstr = _hstretch; vm = _vmargin; vshr = _vshrink; vstr = _vstretch; } void MarginFrameGraphic::SetShrStr( int hm, int hshr, int hstr, int vm, int vshr, int vstr ) { _hmargin = hm; _hstretch = hshr; _hstretch = hstr; _vmargin = vm; _vshrink = vshr; _vstretch = vstr; } void MarginFrameGraphic::Read (istream& in) { FrameGraphic::Read(in); in >> _hmargin >> _hshrink >> _hstretch; in >> _vmargin >> _vshrink >> _vstretch; } void MarginFrameGraphic::Write (ostream& out) { FrameGraphic::Write(out); out << _hmargin << " " << _hshrink << " " << _hstretch << '\n'; out << _vmargin << " " << _vshrink << " " << _vstretch << '\n'; } const char* MarginFrameGraphic::GetClassName () { return "MarginFrame"; } ClassId MarginFrameGraphic::GetClassId () { return MARGINFRAME_GRAPHIC; } boolean MarginFrameGraphic::IsA (ClassId id) { return (MARGINFRAME_GRAPHIC == id || FrameGraphic::IsA(id)); } void MarginFrameGraphic::draw (Canvas* c, Graphic* gs) { CanvasVar* cvar = GetCanvasVar(); if (cvar != nil) { update(gs); _p->SetColors(gs->GetFgColor(), gs->GetBgColor()); _p->ClearRect(c, 0, 0, cvar->xmax(), cvar->ymax()); } }