|
|
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: 32393 (0x7e89)
Types: TextFile
Names: »ibscene.c«
└─⟦8648bda34⟧ Bits:30007244 EUUGD5_II: X11R5
└─⟦87c3ac0e0⟧ »./contrib-3/contrib-3.00«
└─⟦de8ce1454⟧
└─⟦this⟧ »contrib/lib/iv/src/bin/ibuild/ibscene.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 SceneView.
* $Header: /master/3.0/iv/src/bin/ibuild/RCS/ibscene.c,v 1.2 91/09/27 14:11:35 tang Exp $
*/
#include "ibclasses.h"
#include "ibcmds.h"
#include "ibdialogs.h"
#include "ibglobals.h"
#include "ibgraphic.h"
#include "ibscene.h"
#include "ibtools.h"
#include "ibvars.h"
#include "ibvarviews.h"
#include <InterViews/transformer.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/ulist.h>
#include <Unidraw/Commands/command.h>
#include <Unidraw/Commands/macro.h>
#include <Unidraw/Tools/tool.h>
#include <stream.h>
#include <string.h>
/*****************************************************************************/
SceneComp::SceneComp (IBGraphic* gr) : InteractorComp(gr) {
if (gr == nil) {
Graphic* graphic = GetGraphic();
delete graphic;
SetGraphic(new IBGraphic);
}
GetClassNameVar()->SetName("Scene");
GetClassNameVar()->SetBaseClass("Scene");
}
ClassId SceneComp::GetClassId () { return SCENE_COMP; }
boolean SceneComp::IsA (ClassId id) {
return SCENE_COMP == id || InteractorComp::IsA(id);
}
/*****************************************************************************/
static boolean copylock = true;
/*****************************************************************************/
void SceneComp::Interpret (Command* cmd) {
Iterator i;
Editor* ed = cmd->GetEditor();
if (cmd->IsA(GLUEVISIBILITY_CMD)) {
for (First(i); !Done(i); 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;
}
copylock = false;
cmd->SetClipboard(cb = globalcb->DeepCopy());
copylock = true;
}
for (cb->First(i); !cb->Done(i);) {
GraphicComp* kid = cb->GetComp(i);
if (!kid->IsA(INTERACTOR_COMP)) {
cb->Remove(i);
} else {
cb->Next(i);
}
}
InteractorComp::Interpret(cmd);
Propagate(cmd);
} else if (
cmd->IsA(DELETE_CMD) || cmd->IsA(CUT_CMD) ||
cmd->IsA(FRONT_CMD) ||
cmd->IsA(BACK_CMD) || cmd->IsA(DUP_CMD)
) {
InteractorComp::Interpret(cmd);
Propagate(cmd);
} else if (cmd->IsA(SCAN_CMD)) {
ScanCmd* scmd = (ScanCmd*) cmd;
InteractorComp::Interpret(cmd);
if (!scmd->Succeeded()) {
for (First(i); !Done(i) && !scmd->Succeeded(); Next(i)) {
GetComp(i)->Interpret(cmd);
}
}
} else if (cmd->IsA(GETCONFLICT_CMD)) {
InteractorComp::Interpret(cmd);
for (First(i); !Done(i); Next(i)) {
GetComp(i)->Interpret(cmd);
}
} else if (cmd->IsA(MONOSCENE_CMD)) {
MonoSceneCmd* mcmd = (MonoSceneCmd*) cmd;
Component* edComp = mcmd->GetEditor()->GetComponent();
if (edComp == (Component*) this) {
Iterator i, j;
Clipboard cbtmp;
Clipboard* cb = mcmd->GetClipboard();
Clipboard* mcb = mcmd->GetMSClipboard();
for (
cb->First(i), mcb->First(j) ;
!cb->Done(i); cb->Next(i), mcb->Next(j)
) {
InteractorComp* kid = (InteractorComp*) cb->GetComp(i);
InteractorComp* parent = (InteractorComp*) mcb->GetComp(j);
cbtmp.Clear();
cbtmp.Append(kid);
kid->StoreCanvas(mcmd->GetLogCmd());
Group(&cbtmp, parent, cmd);
lbrtData* lbrtbox = (lbrtData*) cmd->Recall(parent);
if (lbrtbox == nil) {
lbrtbox = new lbrtData(kid);
cmd->Store(parent, lbrtbox);
}
parent->Reconfig();
Place(parent);
}
Notify();
SelectClipboard(mcb, ed);
unidraw->Update();
Propagate(cmd);
}
} else if (cmd->IsA(SCENE_CMD)) {
SceneCmd* scmd = (SceneCmd*) cmd;
SceneComp* group = (SceneComp*) scmd->GetGroup();
Component* edComp = scmd->GetEditor()->GetComponent();
if (edComp == (Component*) this) {
Iterator i;
InteractorComp::Interpret(cmd);
group->Reconfig();
Clipboard* cb = cmd->GetClipboard();
Command* lcmd = scmd->GetLogCmd();
for (cb->First(i); !cb->Done(i); cb->Next(i)) {
InteractorComp* kid = (InteractorComp*) cb->GetComp(i);
kid->StoreCanvas(lcmd);
}
Place(group);
Propagate(cmd);
} else {
InteractorComp::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(REORDER_CMD)) {
ReorderCmd* rcmd = (ReorderCmd*) cmd;
Clipboard* cb;
cb = rcmd->GetClipboard();
Selection* s = ed->GetSelection();
if (cb == nil) {
rcmd->SetClipboard(cb = new Clipboard);
cb->Init(s);
}
Iterator i, pos;
cb->First(i);
GraphicComp* leader = cb->GetComp(i);
SetComp(leader, pos);
for (cb->Next(i); !cb->Done(i); cb->Next(i)) {
GraphicComp* comp = cb->GetComp(i);
StorePosition(comp, rcmd);
Remove(comp);
InsertAfter(pos, comp);
SetComp(comp, pos);
}
if (_canvasVar != nil) {
lbrtData d(this);
StoreCanvas(rcmd->GetLogCmd());
Reconfig();
Place(this, d._l, d._b, d._r-1, d._t-1);
unidraw->Update();
}
Propagate(cmd);
} else if (
!cmd->IsA(FONT_CMD) && !cmd->IsA(BRUSH_CMD) &&
!cmd->IsA(COLOR_CMD) && !cmd->IsA(ALIGN_CMD)
) {
InteractorComp::Interpret(cmd);
}
}
void SceneComp::Uninterpret (Command* cmd) {
Iterator i;
Editor* ed = cmd->GetEditor();
if (cmd->IsA(GLUEVISIBILITY_CMD)) {
for (Last(i); !Done(i); Prev(i)) {
GetComp(i)->Uninterpret(cmd);
}
} else if (
cmd->IsA(DELETE_CMD) || cmd->IsA(CUT_CMD) ||
cmd->IsA(PASTE_CMD) || cmd->IsA(FRONT_CMD) ||
cmd->IsA(BACK_CMD) || cmd->IsA(DUP_CMD)
) {
InteractorComp::Uninterpret(cmd);
Unpropagate(cmd);
} else if (cmd->IsA(MONOSCENE_CMD)) {
MonoSceneCmd* mcmd = (MonoSceneCmd*) cmd;
Component* edComp = mcmd->GetEditor()->GetComponent();
if (edComp == (Component*) this) {
Iterator i;
Clipboard* cb = cmd->GetClipboard();
for (cb->Last(i); !cb->Done(i); cb->Prev(i)) {
InteractorComp* kid = (InteractorComp*) cb->GetComp(i);
InteractorComp* parent = (InteractorComp*) kid->GetParent();
parent->Notify();
lbrtData* d = (lbrtData*) cmd->Recall(parent);
if (d != nil) {
Place(kid, d->_l, d->_b, d->_r-1, d->_t-1);
}
parent->Bequeath();
unidraw->CloseDependents(parent);
RestorePosition(kid, cmd);
kid->RestoreCanvas(mcmd->GetLogCmd());
Remove(parent);
}
Notify();
SelectClipboard(cb, ed);
unidraw->Update();
Unpropagate(cmd);
}
} else if (cmd->IsA(SCENE_CMD)) {
SceneCmd* scmd = (SceneCmd*) cmd;
SceneComp* group = (SceneComp*) scmd->GetGroup();
Component* edComp = scmd->GetEditor()->GetComponent();
if (edComp == (Component*) this) {
Iterator i;
Clipboard* cb = cmd->GetClipboard();
Command* lcmd = scmd->GetLogCmd();
for (cb->First(i); !cb->Done(i); cb->Next(i)) {
InteractorComp* kid = (InteractorComp*) cb->GetComp(i);
kid->RestoreCanvas(lcmd);
}
InteractorComp::Uninterpret(cmd);
Unpropagate(cmd);
} else {
InteractorComp::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(REORDER_CMD)) {
ReorderCmd* rcmd = (ReorderCmd*) cmd;
Iterator i;
Clipboard* cb = cmd->GetClipboard();
cb->First(i);
for (cb->Next(i); !cb->Done(i); cb->Next(i)) {
RestorePosition(cb->GetComp(i), cmd);
}
RestoreCanvas(rcmd->GetLogCmd());
unidraw->Update();
Unpropagate(cmd);
} else if (
!cmd->IsA(FONT_CMD) && !cmd->IsA(BRUSH_CMD) &&
!cmd->IsA(COLOR_CMD) && !cmd->IsA(ALIGN_CMD)
) {
InteractorComp::Uninterpret(cmd);
}
}
void SceneComp::Read (istream& in) {
InteractorComp::Read(in);
IBGraphic* g = GetIBGraphic();
int count;
in >> count;
for (int i = 0; i < count; ++i) {
Append((GraphicComp*) unidraw->GetCatalog()->ReadComponent(in));
}
g->FillBg(ReadBgFilled(in));
g->SetBrush(ReadBrush(in));
PSColor* fg = ReadColor(in);
PSColor* bg = ReadColor(in);
g->SetColors(fg, bg);
g->SetFont(ReadFont(in));
g->SetPattern(ReadPattern(in));
Transformer* t = ReadTransformer(in);
g->SetTransformer(t);
Unref(t);
g->SetCanvasVar(GetCanvasVar());
}
void SceneComp::Write (ostream& out) {
InteractorComp::Write(out);
Iterator i;
int count = 0;
IBGraphic* g = GetIBGraphic();
for (First(i); !Done(i); Next(i), ++count);
out << count << "\n";
for (First(i); !Done(i); Next(i)) {
GraphicComp* comp = GetComp(i);
unidraw->GetCatalog()->WriteComponent(comp, out);
out << "\n";
}
WriteBgFilled(g->BgFilled(), out);
WriteBrush(g->GetBrush(), out);
WriteColor(g->GetFgColor(), out);
WriteColor(g->GetBgColor(), out);
WriteFont(g->GetFont(), out);
WritePattern(g->GetPattern(), out);
WriteTransformer(g->GetTransformer(), out);
}
/*****************************************************************************/
SceneView::SceneView (SceneComp* subj) : InteractorView(subj) { _isel = nil; }
SceneComp* SceneView::GetSceneComp () { return (SceneComp*) GetSubject(); }
ClassId SceneView::GetClassId () { return SCENE_VIEW; }
boolean SceneView::IsA (ClassId id) {
return SCENE_VIEW == id || InteractorView::IsA(id);
}
Graphic* SceneView::GetGraphic () {
Graphic* g = GraphicView::GetGraphic();
if (g == nil) {
g = new IBGraphic;
SetGraphic(g);
}
return g;
}
Manipulator* SceneView::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 = InteractorView::CreateManipulator(v, e, rel, tool);
}
return m;
}
Command* SceneView::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 = InteractorView::InterpretManipulator(m);
}
return cmd;
}
/*****************************************************************************/
class KidData : public Data {
public:
KidData(InteractorComp*);
virtual ~KidData();
void SetKid(InteractorComp* kid);
InteractorComp* GetKid();
private:
InteractorComp* _kid;
};
InteractorComp* KidData::GetKid() { return _kid; }
void KidData::SetKid(InteractorComp* kid) { _kid = kid; }
KidData::KidData (InteractorComp* kid) { _kid = kid; }
KidData::~KidData () { delete _kid; }
/*****************************************************************************/
static boolean HasKids (Clipboard* cb) {
boolean retval = false;
Iterator i, j;
int count;
for (cb->First(i); !cb->Done(i); cb->Next(i)) {
GraphicComp* icomp = cb->GetComp(i);
for (
icomp->First(j), count = 0;
!icomp->Done(j); icomp->Next(j),
count++
);
if (count > 1) {
retval = true;
break;
}
}
return retval;
}
/*****************************************************************************/
MonoSceneComp::MonoSceneComp (IBGraphic* gr) : SceneComp(gr) {
GetClassNameVar()->SetName("MonoScene");
GetClassNameVar()->SetBaseClass("MonoScene");
}
ClassId MonoSceneComp::GetClassId () { return MONOSCENE_COMP; }
boolean MonoSceneComp::IsA (ClassId id) {
return MONOSCENE_COMP == id || SceneComp::IsA(id);
}
InteractorComp* MonoSceneComp::GetKid () {
Iterator i;
First(i);
return (InteractorComp*) GetComp(i);
}
void MonoSceneComp::Interpret (Command* cmd) {
Editor* ed = cmd->GetEditor();
if (cmd->IsA(PASTE_CMD)) {
Clipboard* cb = cmd->GetClipboard();
Iterator i;
if (cb == nil) {
Clipboard* globalcb = unidraw->GetCatalog()->GetClipboard();
if (globalcb->IsEmpty()) {
return;
}
copylock = false;
cmd->SetClipboard(cb = globalcb->DeepCopy());
copylock = true;
}
for (cb->First(i); !cb->Done(i); cb->Next(i)) {
InteractorComp* newKid = (InteractorComp*) cb->GetComp(i);
InteractorComp* oldKid = GetKid();
if (oldKid != nil) {
KidData* kidData = (KidData*) cmd->Recall(newKid);
if (kidData == nil) {
KidData* kidData = new KidData(oldKid);
cmd->Store(newKid, kidData);
} else {
kidData->SetKid(oldKid);
}
unidraw->CloseDependents(oldKid);
Remove(oldKid);
}
Append(newKid);
}
Notify();
SelectClipboard(cb, ed);
unidraw->Update();
Propagate(cmd);
} else if (cmd->IsA(UNGROUP_CMD)) {
Clipboard* cb = cmd->GetClipboard();
if (cb == nil) {
Selection* s = ed->GetSelection();
if (s->IsEmpty()) {
return;
}
cmd->SetClipboard(cb = new Clipboard);
cb->Init(s);
}
if (!HasKids(cb)) {
SceneComp::Interpret(cmd);
}
} else if (!cmd->IsA(DUP_CMD)) {
SceneComp::Interpret(cmd);
}
}
void MonoSceneComp::Uninterpret (Command* cmd) {
Editor* ed = cmd->GetEditor();
if (cmd->IsA(PASTE_CMD)) {
Clipboard* cb = cmd->GetClipboard();
if (cb != nil) {
Selection* s = ed->GetSelection();
Iterator i;
s->Clear();
for (cb->First(i); !cb->Done(i); cb->Next(i)) {
InteractorComp* newKid = (InteractorComp*) cb->GetComp(i);
Remove(newKid);
KidData* kidData = (KidData*) cmd->Recall(newKid);
if (kidData != nil) {
InteractorComp* oldKid = kidData->GetKid();
Append(oldKid);
kidData->SetKid(newKid);
} else {
kidData = new KidData(newKid);
cmd->Store(newKid, kidData);
}
}
Notify();
unidraw->Update();
}
Unpropagate(cmd);
} else if (!cmd->IsA(DUP_CMD)) {
SceneComp::Uninterpret(cmd);
}
}
void MonoSceneComp::Reconfig () {
InteractorComp* kid = GetKid();
if (kid != nil) {
kid->Reconfig();
*GetShapeVar() = *kid->GetShapeVar();
}
}
void MonoSceneComp::Resize () {
float cx, cy;
Coord x1, y1, x2, y2;
CanvasVar* cvar = GetCanvasVar();
int w = cvar->Width(), h = cvar->Height();
GetGraphic()->GetCenter(cx, cy);
x1 = round(cx) - w/2;
y1 = round(cy) - h/2;
x2 = round(cx) + (w+1)/2;
y2 = round(cy) + (h+1)/2;
InteractorComp* kid = GetKid();
if (kid != nil) {
Place(kid, x1, y1, x2-1, y2-1);
}
}
/*****************************************************************************/
MonoSceneView::MonoSceneView (MonoSceneComp* subj) : SceneView(subj) { }
MonoSceneComp* MonoSceneView::GetMonoSceneComp () {
return (MonoSceneComp*) GetSubject();
}
ClassId MonoSceneView::GetClassId () { return MONOSCENE_VIEW; }
boolean MonoSceneView::IsA (ClassId id) {
return MONOSCENE_VIEW == id || SceneView::IsA(id);
}
/*****************************************************************************/
ClassId MonoSceneCode::GetClassId () { return MONOSCENE_CODE; }
boolean MonoSceneCode::IsA(ClassId id) {
return MONOSCENE_CODE == id || CodeView::IsA(id);
}
MonoSceneCode::MonoSceneCode (GraphicComp* icomp) : CodeView (icomp) {}
CodeView* MonoSceneCode::GetKidView () {
Iterator i;
First(i);
return (CodeView*) GetView(i);
}
/*****************************************************************************/
UList* MonoSceneClass::_ClassList;
static UList* DupUList(UList* orig) {
UList* dup = new UList;
for (UList* i = orig->First();i != orig->End();i = i->Next()) {
dup->Append(new UList((*i)()));
}
return dup;
}
/*****************************************************************************/
class MonoSceneData : public VoidData {
public:
MonoSceneData(InteractorComp*);
virtual ~MonoSceneData();
};
MonoSceneData::MonoSceneData (InteractorComp* i) : VoidData(i) {}
MonoSceneData::~MonoSceneData () {
InteractorComp* icomp = (InteractorComp*) _void;
delete icomp;
}
/*****************************************************************************/
MonoSceneClass::MonoSceneClass (IBGraphic* gr) : MonoSceneComp(gr) {
if (gr != nil) {
SubclassNameVar* subclass = GetClassNameVar();
subclass->SetMachGen(true);
subclass->GenNewName();
subclass->SetAbstract(true);
}
if (_ClassList == nil) {
_ClassList = new UList;
}
_ClassList->Append(new UList(this));
}
MonoSceneClass::~MonoSceneClass () {
_ClassList->Delete(this);
}
void MonoSceneClass::Interpret (Command* cmd) {
if (cmd->IsA(GETCONFLICT_CMD)) {
GetConflictCmd* gcmd = (GetConflictCmd*) cmd;
if (gcmd->IsGlobal()) {
MonoSceneComp::Interpret(cmd);
} else if (!gcmd->GetScope()) {
gcmd->SetScope(true);
MonoSceneComp::Interpret(cmd);
}
} else if (cmd->IsA(SCAN_CMD)) {
Iterator i;
ScanCmd* scmd = (ScanCmd*) cmd;
const char* iclass = _classNameVar->GetName();
const char* sclass = scmd->GetClassName();
if (*sclass == '\0') {
InteractorComp::Interpret(cmd);
} else if (strcmp(iclass, sclass) == 0) {
scmd->SetScope(true);
SceneComp::Interpret(cmd);
scmd->SetScope(false);
} else if (!scmd->GetScope()) {
SceneComp::Interpret(cmd);
}
} else {
MonoSceneComp::Interpret(cmd);
}
}
void MonoSceneClass::Clone (Command* cmd) {
UList* mylist = DupUList(_ClassList);
const char* origname = GetClassNameVar()->GetName();
for (UList* i = mylist->First();i != mylist->End();i = i->Next()) {
MonoSceneClass* clone = (MonoSceneClass*) (*i) ();
const char* clonename = clone->GetClassNameVar()->GetName();
if (
clone->GetMemberNameVar() != nil &&
strcmp(clonename, origname) == 0 && clone != this &&
clone->GetRoot() == GetRoot()
) {
InteractorComp* ckid = clone->GetKid();
InteractorComp* mkid = GetKid();
if (cmd != nil) {
MonoSceneData* msdata = (MonoSceneData*)cmd->Recall(clone);
if (msdata == nil) {
cmd->Store(clone, new MonoSceneData(ckid));
if (mkid != nil) {
boolean unique = IBNameVar::GetUniqueFlag();
IBNameVar::SetUniqueFlag(false);
boolean localcopy = copylock;
copylock = true;
InteractorComp* cmkid =
(InteractorComp*)mkid->Copy();
copylock = localcopy;
IBNameVar::SetUniqueFlag(unique);
clone->Append(cmkid);
if (ckid != nil) {
Graphic* cgr = ckid->GetGraphic();
cgr->Align(Center, cmkid->GetGraphic(), Center);
clone->Remove(ckid);
clone->Reconfig();
}
}
clone->Place(clone);
} else {
InteractorComp* okid = (InteractorComp*) msdata->_void;
if (ckid != nil) {
clone->Remove(ckid);
}
msdata->_void = ckid;
if (okid != nil) {
clone->Append(okid);
}
clone->Notify();
}
} else {
if (mkid != nil) {
Remove(mkid);
delete mkid;
}
if (ckid != nil) {
boolean unique = IBNameVar::GetUniqueFlag();
IBNameVar::SetUniqueFlag(false);
boolean localcopy = copylock;
copylock = true;
InteractorComp* cmkid = (InteractorComp*) ckid->Copy();
copylock = localcopy;
IBNameVar::SetUniqueFlag(unique);
Append(cmkid);
Reconfig();
Place(this);
}
break;
}
}
}
delete mylist;
unidraw->Update();
}
void MonoSceneClass::UnClone (Command* cmd) {
UList* mylist = DupUList(_ClassList);
const char* origname = GetClassNameVar()->GetName();
for (UList* i = mylist->First();i != mylist->End();i = i->Next()) {
MonoSceneClass* clone = (MonoSceneClass*) (*i) ();
const char* clonename = clone->GetClassNameVar()->GetName();
if (
clone->GetMemberNameVar() != nil &&
strcmp(clonename, origname) == 0 && clone != this &&
clone->GetRoot() == GetRoot()
) {
MonoSceneData* msdata = (MonoSceneData*) cmd->Recall(clone);
if (msdata != nil) {
InteractorComp* ckid = (InteractorComp*) msdata->_void;
InteractorComp* okid = clone->GetKid();
if (okid != nil) {
clone->Remove(okid);
}
msdata->_void = okid;
if (ckid != nil) {
clone->Append(ckid);
}
clone->Notify();
}
}
}
delete mylist;
unidraw->Update();
}
void MonoSceneClass::Instantiate () {
if (_instanceNameVar == nil) {
MonoSceneComp::Instantiate();
GetMemberNameVar()->SetExport(true);
} else {
MonoSceneComp::Instantiate();
}
}
void MonoSceneClass::Read(istream& in) {
boolean unique = IBNameVar::GetUniqueFlag();
IBNameVar::SetUniqueFlag(false);
MonoSceneComp::Read(in);
IBNameVar::SetUniqueFlag(unique);
if (_memberVar != nil) {
_memberVar->GenNewName();
}
if (_instanceNameVar != nil) {
_instanceNameVar->GenNewName();
}
if (!copylock) {
Clone(nil);
}
}
ClassId MonoSceneClass::GetClassId () { return MONOSCENE_CLASS; }
boolean MonoSceneClass::IsA (ClassId id) {
return MONOSCENE_CLASS == id || MonoSceneComp::IsA(id);
}
/*****************************************************************************/
MonoSceneClassView::MonoSceneClassView (
MonoSceneClass* subj
) : MonoSceneView(subj) { }
MonoSceneClass* MonoSceneClassView::GetMonoSceneClass () {
return (MonoSceneClass*) GetSubject();
}
ClassId MonoSceneClassView::GetClassId () { return MONOSCENECLASS_VIEW; }
boolean MonoSceneClassView::IsA (ClassId id) {
return MONOSCENECLASS_VIEW == id || MonoSceneView::IsA(id);
}
/*****************************************************************************/
MonoSceneClassCode::MonoSceneClassCode (
MonoSceneClass* subj
) : MonoSceneCode(subj) { }
MonoSceneClass* MonoSceneClassCode::GetMonoSceneClass() {
return (MonoSceneClass*) GetSubject();
}
ClassId MonoSceneClassCode::GetClassId () { return MONOSCENECLASS_CODE; }
boolean MonoSceneClassCode::IsA(ClassId id) {
return MONOSCENECLASS_CODE == id || MonoSceneCode::IsA(id);
}
boolean MonoSceneClassCode::Definition (ostream& out) {
char coreclass[CHARBUFSIZE];
boolean ok = true;
MonoSceneClass* mclass = GetMonoSceneClass();
SubclassNameVar* snamer = mclass->GetClassNameVar();
MemberNameVar* mnamer = mclass->GetMemberNameVar();
const char* subclass = snamer->GetName();
const char* baseclass = snamer->GetBaseClass();
const char* mname = mnamer->GetName();
GetCoreClassName(coreclass);
CodeView* kidview = GetKidView();
MemberNameVar* kidname;
if (kidview != nil) {
kidname = kidview->GetIntComp()->GetMemberNameVar();
}
if (_emitInstanceInits) {
if (!_instancelist->Find((void*) mname)) {
_instancelist->Append(new UList((void*)mname));
BeginInstantiate(out);
out << "(";
InstanceName(out, ")");
EndInstantiate(out);
}
} else if (_emitClassHeaders || _emitHeaders || _emitForward) {
if (_scope || *_classname == '\0') {
if (!_emitHeaders) {
ok = ok && CodeView::Definition(out);
}
} else {
if (strcmp(subclass, _classname) == 0) {
_scope = true;
ok = ok && CodeView::Definition(out);
if (kidview != nil) {
ok = ok && kidview->Definition(out);
}
_scope = false;
} else {
if (kidview != nil) {
ok = ok && kidview->Definition(out);
}
}
}
} else if (
_emitBSDecls || _emitBSInits ||
_emitFunctionDecls || _emitFunctionInits
) {
ok = true;
} else if (_emitProperty) {
ok = ok && CodeView::Definition(out);
if (kidview != nil) {
ok = ok && kidview->Definition(out);
}
} else if (_emitInstanceDecls || _emitExpHeader) {
ok = ok && CodeView::Definition(out);
} else if (_emitCorehHeader) {
if (strcmp(subclass, _classname) == 0) {
if (!_namelist->Search("scene")) {
_namelist->Append("scene");
out << "#include <InterViews/scene.h>\n";
}
if (!_namelist->Search("window")) {
_namelist->Append("window");
out << "#include <InterViews/window.h>\n";
}
} else {
if (kidview != nil) {
ok = ok && kidview->Definition(out);
}
}
} else if (
_emitCoreDecls || _emitCoreInits || _emitClassDecls || _emitClassInits
) {
if (strcmp(subclass, _classname) == 0) {
ok = ok && CodeView::Definition(out);
CleanUp();
} else {
if (kidview != nil) {
ok = kidview->Definition(out) && ok;
}
}
}
return ok && out.good();
}
boolean MonoSceneClassCode::CoreConstDecls(ostream& out) {
boolean ok = true;
CodeView* kidview = GetKidView();
out << "(const char*);\n";
if (kidview != nil) {
ok = ok && EmitFunctionDecls(kidview, out);
}
out << "protected:\n";
out << " Interactor* Interior();\n";
out << "protected:\n";
_emitExport = true;
if (kidview != nil) {
ok = ok && EmitBSDecls(kidview, out);
ok = ok && EmitInstanceDecls(kidview, out);
}
_emitExport = false;
return out.good();
}
boolean MonoSceneClassCode::CoreConstInits(ostream& out) {
boolean ok = true;
CodeView* kidview = GetKidView();
MemberNameVar* kidname;
if (kidview != nil) {
kidname = kidview->GetIntComp()->GetMemberNameVar();
}
char coreclass[CHARBUFSIZE];
GetCoreClassName(coreclass);
out << "(const char* name) {\n";
out << " perspective = new Perspective;\n";
out << " SetInstance(name);\n";
out << " if (input != nil) {\n";
out << " input->Unreference();\n";
out << " }\n";
out << " input = allEvents;\n";
out << " input->Reference();\n";
out << " Insert(Interior());\n";
out << "}\n\n";
out << "Interactor* " << coreclass;
out << "::Interior() {\n";
if (kidview != nil) {
ok = ok && EmitBSInits(kidview, out);
ok = ok && EmitInstanceInits(kidview, out);
out << " return " << kidname->GetName() << ";\n};\n\n";
ok = ok && EmitFunctionInits(kidview, out);
}
return out.good();
}
boolean MonoSceneClassCode::ConstDecls(ostream& out) {
boolean ok = true;
CodeView* kidview = GetKidView();
out << "(const char*);\n\n";
if (kidview != nil) {
ok = ok && EmitFunctionDecls(kidview, out);
}
return out.good();
}
boolean MonoSceneClassCode::ConstInits(ostream& out) {
boolean ok = true;
CodeView* kidview = GetKidView();
char coreclass[CHARBUFSIZE];
GetCoreClassName(coreclass);
out << "(const char* name) : " << coreclass << "(name) {}\n\n";
if (kidview != nil) {
ok = ok && EmitFunctionInits(kidview, out);
}
return out.good();
}