|
|
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: 28326 (0x6ea6)
Types: TextFile
Names: »ibinteractor.c«
└─⟦8648bda34⟧ Bits:30007244 EUUGD5_II: X11R5
└─⟦87c3ac0e0⟧ »./contrib-3/contrib-3.00«
└─⟦de8ce1454⟧
└─⟦this⟧ »contrib/lib/iv/src/bin/ibuild/ibinteractor.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.
*/
/*
* Interactor component definitions.
* $Header: /master/3.0/iv/src/bin/ibuild/RCS/ibinteractor.c,v 1.2 91/09/27 14:10:46 tang Exp $
*/
#include "ibclasses.h"
#include "ibcmds.h"
#include "ibdialogs.h"
#include "ibed.h"
#include "ibframe.h"
#include "ibgraphic.h"
#include "ibglobals.h"
#include "ibinteractor.h"
#include "ibmanips.h"
#include "ibtools.h"
#include "ibvars.h"
#include "ibvarviews.h"
#include <Unidraw/catalog.h>
#include <Unidraw/clipboard.h>
#include <Unidraw/iterator.h>
#include <Unidraw/manips.h>
#include <Unidraw/selection.h>
#include <Unidraw/statevars.h>
#include <Unidraw/ulist.h>
#include <Unidraw/unidraw.h>
#include <Unidraw/viewer.h>
#include <Unidraw/Commands/brushcmd.h>
#include <Unidraw/Commands/colorcmd.h>
#include <Unidraw/Commands/edit.h>
#include <Unidraw/Commands/font.h>
#include <Unidraw/Commands/macro.h>
#include <Unidraw/Commands/patcmd.h>
#include <Unidraw/Commands/transforms.h>
#include <Unidraw/Graphic/geomobjs.h>
#include <Unidraw/Graphic/graphic.h>
#include <Unidraw/Graphic/pspaint.h>
#include <Unidraw/Tools/tool.h>
#include <InterViews/button.h>
#include <InterViews/event.h>
#include <InterViews/rubrect.h>
#include <InterViews/shape.h>
#include <InterViews/transformer.h>
#include <math.h>
#include <stdlib.h>
#include <stream.h>
#include <string.h>
/*****************************************************************************/
lbrtData::lbrtData (InteractorComp* icomp) : VoidData(nil) {
float gcx, gcy;
CanvasVar* ivar = icomp->GetCanvasVar();
int bodywidth = ivar->Width();
int bodyheight = ivar->Height();
icomp->GetGraphic()->GetCenter(gcx, gcy);
_l = round(gcx) - bodywidth/2;
_b = round(gcy) - bodyheight/2;
_r = round(gcx) + (bodywidth+1)/2;
_t = round(gcy) + (bodyheight+1)/2;
_ibshape = icomp->GetShapeVar()->GetShape()->Copy();
_tr = new Transformer(icomp->GetGraphic()->GetTransformer());
}
lbrtData::~lbrtData () {
delete _ibshape;
delete _tr;
}
class FontData : public lbrtData {
public:
FontData(InteractorComp*, PSFont*);
};
FontData::FontData (InteractorComp* icomp, PSFont* psfont) : lbrtData(icomp) {
_void = psfont;
}
/*****************************************************************************/
class PropsData : public Data {
public:
PropsData(InteractorComp*);
virtual ~PropsData();
Props* GetProps();
StateVar* GetStateVar();
private:
Props* _props;
StateVar* _state;
};
PropsData::PropsData (InteractorComp* icomp) {
_props = icomp->GetProps()->Copy();
_state = icomp->GetInstanceNameVar()->Copy();
}
PropsData::~PropsData () {
delete _props;
delete _state;
}
Props* PropsData::GetProps () { return _props; }
StateVar* PropsData::GetStateVar () { return _state; }
/*****************************************************************************/
Props::Props (const char* text) {
_props = new char[CHARBUFSIZE];
_size = CHARBUFSIZE;
SetPropsText(text);
}
Props::~Props () {
delete _props;
}
Props* Props::Copy () {
Props* copy = new Props("");
copy->SetPropsText(_props);
return copy;
}
void Props::Read (istream& in) {
char* props = unidraw->GetCatalog()->ReadString(in);
in >> _size;
delete _props;
_props = new char[_size];
strcpy(_props, props);
delete props;
}
void Props::Write(ostream& out) {
unidraw->GetCatalog()->WriteString(_props, out);
out << " " << _size << " ";
}
void Props::SetPropsText(const char* text) {
int len = strlen(text);
if (len < _size) {
strcpy(_props, text);
} else {
delete _props;
_props = strnew(text);
_size = len + 1;
}
}
/*****************************************************************************/
ClassId InteractorComp::GetClassId () { return INTERACTOR_COMP; }
boolean InteractorComp::IsA (ClassId id) {
return INTERACTOR_COMP == id || GraphicComps::IsA(id);
}
InteractorComp::InteractorComp (IBGraphic* g) : GraphicComps(g) {
_classNameVar = new SubclassNameVar("Interactor", false);
_shapeVar = new ShapeVar(new IBShape);
_props = new Props("");
_memberVar = nil;
_instanceNameVar = nil;
_canvasVar = nil;
}
InteractorComp::~InteractorComp () {
delete _canvasVar;
delete _props;
delete _shapeVar;
delete _classNameVar;
delete _instanceNameVar;
delete _memberVar;
}
void InteractorComp::Propagate (Command* cmd) {
Clipboard* cb = cmd->GetClipboard();
if (
(cb != nil && cb->Includes(this)) ||
cmd->GetEditor()->GetComponent() == (Component*) this
) {
GetFirewallCmd firewallCmd(this);
firewallCmd.Execute();
InteractorComp* firewall = firewallCmd.GetFirewall();
if (firewall != nil && firewall->IsANewScope()) {
MonoSceneClass* mfirewall = (MonoSceneClass*) firewall;
mfirewall->Clone(cmd);
}
}
}
void InteractorComp::Unpropagate (Command* cmd) {
Clipboard* cb = cmd->GetClipboard();
if (
(cb != nil && cb->Includes(this)) ||
cmd->GetEditor()->GetComponent() == (Component*) this
) {
GetFirewallCmd firewallCmd(this);
firewallCmd.Execute();
InteractorComp* firewall = firewallCmd.GetFirewall();
if (firewall != nil && firewall->IsANewScope()) {
MonoSceneClass* mfirewall = (MonoSceneClass*) firewall;
mfirewall->UnClone(cmd);
}
}
}
void InteractorComp::Interpret (Command* cmd) {
Editor* ed = cmd->GetEditor();
Coord l, b, r, t;
if (cmd->IsA(PLACE_CMD)) {
Iterator i;
PlaceCmd* placeCmd = (PlaceCmd*) cmd;
Clipboard* cb = placeCmd->GetClipboard();
Selection* s = ed->GetSelection();
if (cb == nil) {
if (s->IsEmpty()) {
return;
}
cmd->SetClipboard(cb = new Clipboard);
cb->Init(s);
}
for (cb->First(i); !cb->Done(i); cb->Next(i)) {
InteractorComp* parent = (InteractorComp*) cb->GetComp(i);
parent->StoreCanvas(placeCmd);
parent->Reconfig();
if (placeCmd->Placement(l, b, r, t)) {
Place(parent, l, b, r, t);
} else {
Place(parent);
}
}
unidraw->Update();
} else if (cmd->IsA(INFO_CMD)) {
} else if (cmd->IsA(FONT_CMD)) {
PSFont* font = ((FontCmd*) cmd)->GetFont();
cmd->Store(this, new FontData(this, GetGraphic()->GetFont()));
GetGraphic()->SetFont(font);
Reconfig();
Place(this);
Propagate(cmd);
} else if (cmd->IsA(COLOR_CMD)) {
GraphicComps::Interpret(cmd);
Propagate(cmd);
} else if (cmd->IsA(PROPS_CMD)) {
PropsData* props = (PropsData*) cmd->Recall(this);
if (props == nil) {
props = new PropsData(this);
cmd->Store(this, props);
} else {
Props* pclone = _props->Copy();
InstanceNameVar* sclone =
(InstanceNameVar*) _instanceNameVar->Copy();
Props* porig = props->GetProps();
InstanceNameVar* sorig = (InstanceNameVar*) props->GetStateVar();
pclone->SetPropsText(_props->GetPropsText());
_props->SetPropsText(porig->GetPropsText());
porig->SetPropsText(pclone->GetPropsText());
*sclone = *_instanceNameVar;
*_instanceNameVar = *sorig;
*sorig = *sclone;
delete pclone;
delete sclone;
Propagate(cmd);
}
} else if (cmd->IsA(GETFIREWALL_CMD)) {
GetFirewallCmd* gcmd = (GetFirewallCmd*) cmd;
InteractorComp* parent = (InteractorComp*) GetParent();
if (parent != nil && parent->IsANewScope()) {
gcmd->SetFirewall(parent);
} else if (parent == (InteractorComp*) GetRoot()) {
gcmd->SetFirewall(this);
} else if (parent != nil) {
parent->Interpret(cmd);
}
} else if (cmd->IsA(GETTOPLEVEL_CMD)) {
GetTopLevelCmd* gcmd = (GetTopLevelCmd*) cmd;
InteractorComp* parent = (InteractorComp*) GetParent();
if (parent == (InteractorComp*) GetRoot()) {
gcmd->SetTopLevel(this);
} else if (parent != nil) {
parent->Interpret(cmd);
}
} else if (cmd->IsA(GETCONFLICT_CMD)) {
GetConflictCmd* gcmd = (GetConflictCmd*) cmd;
const char* cname = gcmd->GetCName();
UList* conflictlist = gcmd->GetConflict();
const char* member = nil;
const char* instance = nil;
const char* classname = nil;
if (_memberVar != nil) {
member = _memberVar->GetName();
}
if (_instanceNameVar != nil) {
instance = _instanceNameVar->GetName();
}
if (_classNameVar != nil) {
classname = _classNameVar->GetName();
}
if (member != nil && strcmp(member, cname) == 0) {
conflictlist->Append(new UList(_memberVar->GetMemberSharedName()));
gcmd->SetCTarget(this);
}
if (instance != nil && strcmp(instance, cname) == 0) {
conflictlist->Append(new UList(_instanceNameVar));
}
if (classname != nil && strcmp(classname, cname) == 0) {
conflictlist->Append(new UList(_classNameVar));
}
} else if (cmd->IsA(GETNAMEVARS_CMD)) {
GetNameVarsCmd* gcmd = (GetNameVarsCmd*) cmd;
gcmd->SetClassNameVar(_classNameVar);
gcmd->SetInstanceNameVar(_instanceNameVar);
gcmd->SetMemberNameVar(_memberVar);
} else if (cmd->IsA(SCAN_CMD)) {
ScanCmd* scmd = (ScanCmd*) cmd;
const char* iclass = _classNameVar->GetName();
const char* sclass = scmd->GetClassName();
if (*sclass == '\0' || scmd->GetScope()) {
if (IsA(scmd->GetTargetId())) {
scmd->SetSucceeded(true);
}
}
} else if (
!cmd->IsA(GLUEVISIBILITY_CMD) &&
!cmd->IsA(ALIGN_CMD) &&
!cmd->IsA(BRUSH_CMD) && !cmd->IsA(UNGROUP_CMD)
) {
GraphicComps::Interpret(cmd);
}
}
void InteractorComp::Uninterpret (Command* cmd) {
Editor* ed = cmd->GetEditor();
if (cmd->IsA(PLACE_CMD)) {
Iterator i;
Clipboard* cb = cmd->GetClipboard();
for (cb->First(i); !cb->Done(i); cb->Next(i)) {
InteractorComp* parent = (InteractorComp*) cb->GetComp(i);
parent->RestoreCanvas(cmd);
}
unidraw->Update();
} else if (cmd->IsA(INFO_CMD)) {
} else if (cmd->IsA(FONT_CMD)) {
FontData* fd = (FontData*) cmd->Recall(this);
PSFont* font = (PSFont*) fd->_void;
GetGraphic()->SetFont(font);
Reconfig();
Place(this, fd->_l, fd->_b, fd->_r-1, fd->_t-1);
Unpropagate(cmd);
} else if (cmd->IsA(COLOR_CMD)) {
GraphicComps::Uninterpret(cmd);
Unpropagate(cmd);
} else if (cmd->IsA(PROPS_CMD)) {
PropsData* props = (PropsData*) cmd->Recall(this);
Props* pclone = _props->Copy();
InstanceNameVar* sclone =
(InstanceNameVar*) _instanceNameVar->Copy();
Props* porig = props->GetProps();
InstanceNameVar* sorig = (InstanceNameVar*) props->GetStateVar();
pclone->SetPropsText(_props->GetPropsText());
_props->SetPropsText(porig->GetPropsText());
porig->SetPropsText(pclone->GetPropsText());
*sclone = *_instanceNameVar;
*_instanceNameVar = *sorig;
*sorig = *sclone;
delete pclone;
delete sclone;
Unpropagate(cmd);
} else if (
!cmd->IsA(GLUEVISIBILITY_CMD) &&
!cmd->IsA(ALIGN_CMD) &&
!cmd->IsA(BRUSH_CMD) && !cmd->IsA(UNGROUP_CMD)
) {
GraphicComps::Uninterpret(cmd);
}
}
void InteractorComp::StoreCanvas(Command* cmd) {
lbrtData* prevData = (lbrtData*) cmd->Recall(this);
Iterator i;
if (prevData == nil && GetCanvasVar() != nil) {
lbrtData* lbrtbox = new lbrtData(this);
cmd->Store(this, lbrtbox);
for (First(i); !Done(i); Next(i)) {
InteractorComp* kid = (InteractorComp*) GetComp(i);
kid->StoreCanvas(cmd);
}
}
}
void InteractorComp::RestoreCanvas(Command* cmd) {
Iterator i;
lbrtData* d = (lbrtData*) cmd->Recall(this);
if (d != nil) {
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;
}
Notify();
for (First(i); !Done(i); Next(i)) {
InteractorComp* kid = (InteractorComp*) GetComp(i);
kid->RestoreCanvas(cmd);
}
}
}
InteractorComp& InteractorComp::operator = (InteractorComp&) { return *this;}
void InteractorComp::Relate (InteractorComp* comp) {
*this = *comp;
}
void InteractorComp::Unrelate (InteractorComp* comp) {
*this = *comp;
}
void InteractorComp::Instantiate() {
if (_instanceNameVar == nil) {
_instanceNameVar = new InstanceNameVar;
_instanceNameVar->GenNewName();
}
if (_memberVar == nil) {
char buf[CHARBUFSIZE];
sprintf(buf, "_%s_0", _classNameVar->GetName());
_memberVar = new MemberNameVar(buf);
_memberVar->GenNewName();
}
}
InteractorComp* InteractorComp::GetIComp (Iterator i) {
return (InteractorComp*) GetComp(i);
}
IBGraphic* InteractorComp::GetIBGraphic () {
return (IBGraphic*) GetGraphic();
}
void InteractorComp::Reconfig () {
Iterator i;
for (First(i); !Done(i); Next(i)) {
GetIComp(i)->Reconfig();
}
}
void InteractorComp::Resize () { }
void InteractorComp::SetState(const char* name, StateVar* stateVar) {
if (strcmp(name, "CanvasVar") == 0) {
_canvasVar = (CanvasVar*) stateVar;
} else if (strcmp(name, "ClassNameVar") == 0) {
_classNameVar = (SubclassNameVar*) stateVar;
} else if (strcmp(name, "MemberNameVar") == 0) {
MemberNameVar* memberVar = (MemberNameVar*) stateVar;
*_memberVar = *memberVar;
} else if (strcmp(name, "InstanceNameVar") == 0) {
_instanceNameVar = (InstanceNameVar*) stateVar;
} else if (strcmp(name, "ShapeVar") == 0) {
_shapeVar = (ShapeVar*) stateVar;
}
}
StateVar* InteractorComp::GetState (const char* name) {
StateVar* stateVar = nil;
if (strcmp(name, "CanvasVar") == 0) {
stateVar = _canvasVar;
} else if (strcmp(name, "ClassNameVar") == 0) {
stateVar = _classNameVar;
} else if (strcmp(name, "MemberNameVar") == 0) {
stateVar = _memberVar;
} else if (strcmp(name, "InstanceNameVar") == 0) {
stateVar = _instanceNameVar;
} else if (strcmp(name, "ShapeVar") == 0) {
stateVar = _shapeVar;
}
return stateVar;
}
void InteractorComp::Read (istream& in) {
GraphicComp::Read(in);
Catalog* catalog = unidraw->GetCatalog();
delete _canvasVar;
delete _shapeVar;
delete _classNameVar;
delete _instanceNameVar;
delete _memberVar;
_canvasVar = (CanvasVar*) catalog->ReadStateVar(in);
_classNameVar = (SubclassNameVar*) catalog->ReadStateVar(in);
_memberVar = (MemberNameVar*) catalog->ReadStateVar(in);
_instanceNameVar = (InstanceNameVar*) catalog->ReadStateVar(in);
_shapeVar = (ShapeVar*) catalog->ReadStateVar(in);
_props->Read(in);
}
void InteractorComp::Write (ostream& out) {
GraphicComp::Write(out);
Catalog* catalog = unidraw->GetCatalog();
catalog->WriteStateVar(_canvasVar, out);
catalog->WriteStateVar(_classNameVar, out);
catalog->WriteStateVar(_memberVar, out);
catalog->WriteStateVar(_instanceNameVar, out);
catalog->WriteStateVar(_shapeVar, out);
_props->Write(out);
}
void InteractorComp::InitCanvas (InteractorComp* comp) {
comp->_canvasVar = new CanvasVar;
IBGraphic* g = comp->GetIBGraphic();
g->SetCanvasVar(comp->_canvasVar);
}
void InteractorComp::Place (InteractorComp* comp) {
comp->Instantiate();
if (comp->_canvasVar == nil) {
InitCanvas(comp);
}
Shape* shape = comp->GetShapeVar()->GetShape();
comp->_canvasVar->SetSize(shape->width, shape->height);
comp->Resize();
comp->Notify();
}
void InteractorComp::Place (
InteractorComp* comp, Coord l, Coord b, Coord r, Coord t
) {
Iterator i;
float cx, cy;
comp->Instantiate();
if (comp->_canvasVar == nil) {
InitCanvas(comp);
}
IBGraphic* g = comp->GetIBGraphic();
comp->GetCanvasVar()->SetSize(r-l+1, t-b+1);
comp->Resize();
g->GetCenter(cx, cy);
g->Translate(float(l+r)/2 - cx, float(b+t)/2 - cy);
comp->Notify();
}
/*****************************************************************************/
InteractorComp* InteractorView::GetInteractorComp () {
return (InteractorComp*) GetSubject();
}
InteractorView::InteractorView (InteractorComp* subj) : GraphicViews(subj) { }
ClassId InteractorView::GetClassId () { return INTERACTOR_VIEW; }
boolean InteractorView::IsA (ClassId id) {
return INTERACTOR_VIEW == id || GraphicViews::IsA(id);
}
InfoDialog* InteractorView::GetInfoDialog () {
InfoDialog* info = new InfoDialog;
ButtonState* state = info->GetState();
InteractorComp* icomp = GetInteractorComp();
SubclassNameVar* classNameVar = icomp->GetClassNameVar();
MemberNameVar* memberVar = icomp->GetMemberNameVar();
CanvasVar* canvasVar = icomp->GetCanvasVar();
ShapeVar* shapeVar = icomp->GetShapeVar();
info->Include(new SubclassNameVarView(classNameVar, state, icomp));
info->Include(new MemberNameVarView(memberVar, state, icomp));
info->Include(new CanvasVarView(canvasVar));
info->Include(new ShapeVarView(shapeVar, state));
return info;
}
Graphic* InteractorView::GetGraphic () {
Graphic* g = GraphicView::GetGraphic();
if (g == nil) {
g = GetGraphicComp()->GetGraphic();
g = g->Copy();
SetGraphic(g);
}
return g;
}
void InteractorView::GetABSCoord(
Editor* ed, Coord& x0, Coord& y0, Coord& x1, Coord& y1
) {
Transformer fulltrans;
GraphicComp* grcomp = (GraphicComp*) ed->GetComponent();
Graphic* g = grcomp->GetGraphic();
g->TotalTransformation(fulltrans);
fulltrans.TransformRect(x0, y0, x1, y1);
}
Manipulator* InteractorView::CreateManipulator (
Viewer* v, Event& e, Transformer* rel, Tool* tool
) {
Manipulator* m = nil;
if (tool->IsA(STRETCH_TOOL)) {
Selection* s = v->GetSelection(), *newSel;
GraphicView* views = v->GetGraphicView();
s->Clear();
newSel = views->ViewIntersecting(
e.x-SLOP, e.y-SLOP, e.x+SLOP, e.y+SLOP
);
s->Exclusive(newSel);
delete newSel;
m = GraphicViews::CreateManipulator(v, e, rel, tool);
} else if (tool->IsA(EXAMINE_TOOL)) {
Editor* ed = v->GetEditor();
ExamineMenu* popup = new ExamineMenu;
ExamineTool* etool = (ExamineTool*) tool;
Selection* selPath = etool->GetSelPath();
Control* info = etool->CreateInfoEntry(selPath, ed);
Control* att = etool->CreatePropsEntry(selPath, ed);
if (info != nil) {
popup->Include(info);
} else {
return nil;
}
if (att != nil) {
popup->Include(att);
}
m = new PopupManip(v, popup, tool);
} else {
m = GraphicViews::CreateManipulator(v, e, rel, tool);
}
return m;
}
Command* InteractorView::InterpretManipulator (Manipulator* m) {
Command* cmd = nil;
Tool* tool = m->GetTool();
if (tool->IsA(GRAPHIC_COMP_TOOL)) {
cmd = InterpretGraphicCompManip(m);
if (cmd != nil) {
IBEditor* ed = (IBEditor*) cmd->GetEditor();
Clipboard* cb = cmd->GetClipboard();
if (!tool->IsA(IBGRAPHIC_COMP_TOOL)) {
Iterator i;
ColorVar* colVar = (ColorVar*) ed->GetState("ColorVar");
FontVar* fontVar = (FontVar*) ed->GetState("FontVar");
for(cb->First(i); !cb->Done(i); cb->Next(i)) {
Graphic* gr = cb->GetComp(i)->GetGraphic();
if (IsA(ADJUSTER_VIEW)) {
gr->SetColors(
colVar->GetFgColor(), stdgraphic->GetBgColor()
);
} else {
gr->SetColors(
colVar->GetFgColor(), colVar->GetBgColor()
);
}
gr->SetFont(fontVar->GetFont());
}
cmd = new MacroCmd(ed, cmd, new PlaceCmd(ed, cb->Copy()));
}
}
} else if (tool->IsA(STRETCH_TOOL)) {
Viewer* v = m->GetViewer();
DragManip* dm = (DragManip*) m;
Editor* ed = v->GetEditor();
Transformer* rel = dm->GetTransformer();
RubberRect* rr = (RubberRect*) dm->GetRubberband();
Coord x0, y0, x1, y1;
rr->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);
cmd = new PlaceCmd(ed, x0, y0, x1-1, y1-1);
} else {
cmd = GraphicViews::InterpretManipulator(m);
}
return cmd;
}
void InteractorView::Interpret(Command* cmd) {
if (cmd->IsA(INFO_CMD)) {
InfoCmd* info = (InfoCmd*) cmd;
InteractorComp* icomp = GetInteractorComp();
ShapeVar* svar = icomp->GetShapeVar();
info->SetInfoDialog(GetInfoDialog());
info->SetOrigIBShape(svar->GetShape()->Copy());
info->SetIBShape(svar->GetShape());
} else {
GraphicViews::Interpret(cmd);
}
}
boolean InteractorView::UpdateCanvasVar () {
IBGraphic* gcomp = GetInteractorComp()->GetIBGraphic();
IBGraphic* gview = (IBGraphic*) GetGraphic();
CanvasVar* ccomp = gcomp->GetCanvasVar();
CanvasVar* cview = gview->GetCanvasVar();
boolean changed = ccomp != cview;
if (changed) {
if (ccomp == nil) {
delete cview;
gview->SetCanvasVar(nil);
} else if (cview == nil) {
gview->SetCanvasVar((CanvasVar*) ccomp->Copy());
} else {
*cview = *ccomp;
}
}
return changed;
}
boolean InteractorView::Different (Graphic* g1, Graphic* g2) {
boolean different = true;
if (
g1->GetFgColor() == g2->GetFgColor() &&
g1->GetBgColor() == g2->GetBgColor() &&
g1->BgFilled() == g2->BgFilled() &&
g1->GetPattern() == g2->GetPattern() &&
g1->GetBrush() == g2->GetBrush() &&
g1->GetFont() == g2->GetFont()
) {
Transformer identity;
Transformer* t1 = g1->GetTransformer();
Transformer* t2 = g2->GetTransformer();
if (t1 == t2) {
different = false;
} else if (t1 == nil) {
different = *t2 != identity;
} else if (t2 == nil) {
different = *t1 != identity;
} else {
different = *t1 != *t2;
}
}
return different;
}
/*****************************************************************************/
ClassId HVComp::GetClassId () { return HVCOMP; }
boolean HVComp::IsA (ClassId id) {return HVCOMP==id ||InteractorComp::IsA(id);}
HVGraphic* HVComp::GetHVGraphic () { return (HVGraphic*) GetGraphic(); }
HVGraphic* HVComp::InitGraphic (Orientation, int) { return nil; }
HVComp::HVComp (HVGraphic* g) : InteractorComp(g) { }
void HVComp::Reconfig () {
Shape* shape = GetShapeVar()->GetShape();
HVGraphic* g = GetHVGraphic();
if (g->GetOrientation() == Horizontal) {
g->SetShape(shape->width, shape->hshrink, shape->hstretch);
} else {
g->SetShape(shape->height, shape->vshrink, shape->vstretch);
}
}
void HVComp::Read (istream& in) {
InteractorComp::Read(in);
int orient, w;
in >> orient;
in >> w;
HVGraphic* g = InitGraphic(orient, w);
g->ReadGS(in);
SetGraphic(g);
Reconfig();
}
void HVComp::Write (ostream& out) {
InteractorComp::Write(out);
HVGraphic* g = GetHVGraphic();
out << g->GetOrientation() << " ";
out << g->MinorAxisSize() << " ";
g->WriteGS(out);
}
/*****************************************************************************/
HVComp* HVView::InitComp (Coord, Coord, Coord, Coord) { return nil; }
HVComp* HVView::GetHVComp () { return (HVComp*) GetSubject(); }
ClassId HVView::GetClassId () { return HVVIEW; }
boolean HVView::IsA (ClassId id) {return HVVIEW==id ||InteractorView::IsA(id);}
HVView::HVView (HVComp* subj) : InteractorView(subj) { }
void HVView::Update () {
HVGraphic* gcomp = GetHVComp()->GetHVGraphic();
HVGraphic* gview = (HVGraphic*) GetGraphic();
int nat, shr, str;
IncurDamage(gview);
*(Graphic*)gview = *(Graphic*)gcomp;
gcomp->GetShape(nat, shr, str);
gview->SetShape(nat, shr, str);
UpdateCanvasVar();
IncurDamage(gview);
EraseHandles();
}
Manipulator* HVView::CreateManipulator (
Viewer* v, Event& e, Transformer* rel, Tool* tool
) {
Manipulator* m = nil;
if (tool->IsA(GRAPHIC_COMP_TOOL)) {
HVGraphic* g = GetHVComp()->GetHVGraphic();
Coord xminor = g->MinorAxisSize();
Coord yminor = xminor;
if (rel != nil) {
Coord x0 = 0, y0 = 0;
rel->Transform(x0, y0);
rel->Transform(xminor, yminor);
xminor = abs(xminor - x0);
yminor = abs(yminor - y0);
}
Orientation orient = g->GetOrientation();
Coord x0, y0, x1, y1;
Side side;
if (orient == Horizontal) {
x0 = x1 = e.x;
y0 = e.y - yminor/2;
y1 = y0 + yminor - 1;
side = RightSide;
} else {
x0 = e.x - xminor/2;
x1 = x0 + xminor - 1;
y0 = y1 = e.y;
side = BottomSide;
}
Rubberband* rub = new StretchingRect(nil, nil, x0, y0, x1, y1, side);
m = new DragManip(v, rub, rel, tool);
} else {
m = InteractorView::CreateManipulator(v, e, rel, tool);
}
return m;
}
Command* HVView::InterpretManipulator (Manipulator* m) {
DragManip* dm = (DragManip*) m;
Editor* ed = dm->GetViewer()->GetEditor();
Tool* tool = dm->GetTool();
Transformer* rel = dm->GetTransformer();
Command* cmd = nil;
if (tool->IsA(GRAPHIC_COMP_TOOL)) {
StretchingRect* stretchRect = (StretchingRect*) dm->GetRubberband();
Coord x0, y0, x1, y1;
stretchRect->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);
HVComp* comp = InitComp(x0, y0, x1, y1);
Graphic* gr = comp->GetGraphic();
ColorVar* colVar = (ColorVar*) ed->GetState("ColorVar");
if (colVar != nil) {
gr->SetColors(colVar->GetFgColor(), colVar->GetBgColor());
}
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;
}