|
|
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: 63840 (0xf960)
Types: TextFile
Names: »ibcmds.c«
└─⟦8648bda34⟧ Bits:30007244 EUUGD5_II: X11R5
└─⟦87c3ac0e0⟧ »./contrib-3/contrib-3.00«
└─⟦de8ce1454⟧
└─⟦this⟧ »contrib/lib/iv/src/bin/ibuild/ibcmds.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 user interface builder-specific commands.
* $Header: /master/3.0/iv/src/bin/ibuild/RCS/ibcmds.c,v 1.2 91/09/27 14:07:23 tang Exp $
*/
#include "ibbitmap.h"
#include "ibbutton.h"
#include "ibclasses.h"
#include "ibcmds.h"
#include "ibcode.h"
#include "ibcomp.h"
#include "ibcreator.h"
#include "ibdialogs.h"
#include "ibed.h"
#include "ibframe.h"
#include "ibglobals.h"
#include "ibgrblock.h"
#include "ibprocs.h"
#include "ibscene.h"
#include "ibtoolpanel.h"
#include "ibtools.h"
#include "ibvars.h"
#include "ibversion.h"
#include <Unidraw/catalog.h>
#include <Unidraw/clipboard.h>
#include <Unidraw/ctrlinfo.h>
#include <Unidraw/editorinfo.h>
#include <Unidraw/editor.h>
#include <Unidraw/globals.h>
#include <Unidraw/iterator.h>
#include <Unidraw/selection.h>
#include <Unidraw/statevars.h>
#include <Unidraw/unidraw.h>
#include <Unidraw/viewer.h>
#include <Unidraw/creator.h>
#include <Unidraw/ulist.h>
#include <Unidraw/Commands/catcmds.h>
#include <Unidraw/Commands/datas.h>
#include <Unidraw/Commands/transforms.h>
#include <Unidraw/Components/grcomp.h>
#include <Unidraw/Graphic/damage.h>
#include <Unidraw/Graphic/graphic.h>
#include <Unidraw/Graphic/pspaint.h>
#include <Unidraw/Graphic/util.h>
#include <Unidraw/Tools/grcomptool.h>
#include <InterViews/filechooser.h>
#include <InterViews/bitmap.h>
#include <InterViews/frame.h>
#include <InterViews/message.h>
#include <InterViews/sensor.h>
#include <InterViews/shape.h>
#include <osfcn.h>
#include <stdio.h>
#include <stdlib.h>
#include <stream.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#ifdef sgi
/* SGI vfork is bogus */
#define vfork fork
#endif
/*****************************************************************************/
enum {Gen_File, Gen_Files, Gen_Make};
/*****************************************************************************/
// 4.2 -> hpux standard conversion of getwd
#ifdef hpux
#include <sys/param.h>
#define getwd(a) getcwd(a,MAXPATHLEN)
#endif
/*****************************************************************************/
char* GetDirName (const char* fullname) {
static char retval[CHARBUFSIZE];
char pathname[CHARBUFSIZE];
strcpy(retval, fullname);
if (retval[0] == '.' && retval[1] == '.') {
getwd(pathname);
sprintf(retval, "%s/%s", pathname, fullname);
}
char* tmp = strrchr(retval, '/');
if (tmp != nil) {
tmp[1] = '\0';
} else {
strcpy(retval, "./");
}
return retval;
}
char* GetOrigName (const char* fullname) {
static char retval[CHARBUFSIZE];
char* orig = strrchr(fullname, '/');
if (orig == nil) {
strcpy(retval, fullname);
} else {
strcpy(retval, &orig[1]);
}
return retval;
}
/*****************************************************************************/
static void Warning (Editor* ed, const char* warning) {
StringBrowserDialog dialog(warning);
ed->InsertDialog(&dialog);
dialog.Acknowledge();
ed->RemoveDialog(&dialog);
}
static boolean Abort (Editor* ed, int pid, const char* warning) {
boolean aborted;
AbortDialog dialog(pid, warning);
ed->InsertDialog(&dialog);
aborted = dialog.Abort();
ed->RemoveDialog(&dialog);
return aborted;
}
/*****************************************************************************/
GetFirewallCmd::GetFirewallCmd (GraphicComp* target) {
_target = target;
_firewall = nil;
}
void GetFirewallCmd::Execute () {
if (_target != nil) {
_target->Interpret(this);
}
}
Command* GetFirewallCmd::Copy () {
return new GetFirewallCmd(_target);
}
ClassId GetFirewallCmd::GetClassId () { return GETFIREWALL_CMD; }
boolean GetFirewallCmd::IsA (ClassId id) {
return GETFIREWALL_CMD == id || Command::IsA(id);
}
/*****************************************************************************/
GetTopLevelCmd::GetTopLevelCmd (GraphicComp* target) {
_target = target;
_toplevel = nil;
}
void GetTopLevelCmd::Execute () {
_target->Interpret(this);
}
Command* GetTopLevelCmd::Copy () {
return new GetTopLevelCmd(_target);
}
ClassId GetTopLevelCmd::GetClassId () { return GETTOPLEVEL_CMD; }
boolean GetTopLevelCmd::IsA (ClassId id) {
return GETTOPLEVEL_CMD == id || Command::IsA(id);
}
/*****************************************************************************/
GetConflictCmd::GetConflictCmd (
GraphicComp* target, const char* cname, boolean global
) {
_ctarget = nil;
_target = target;
_conflictlist = new UList;
_cname = strnew(cname);
_global = global;
_scope = false;
}
GetConflictCmd::~GetConflictCmd () {
delete _conflictlist;
delete _cname;
}
void GetConflictCmd::Execute () {
_scope = false;
if (_target != nil) {
_target->Interpret(this);
}
}
Command* GetConflictCmd::Copy () {
return new GetConflictCmd(_target, _cname, _global);
}
ClassId GetConflictCmd::GetClassId () { return GETCONFLICT_CMD; }
boolean GetConflictCmd::IsA (ClassId id) {
return GETCONFLICT_CMD == id || Command::IsA(id);
}
/*****************************************************************************/
GetNameVarsCmd::GetNameVarsCmd (GraphicComp* target) {
_target = target;
_subclass = nil;
_member = nil;
_instance = nil;
}
void GetNameVarsCmd::Execute () {
if (_target != nil) {
_target->Interpret(this);
}
}
Command* GetNameVarsCmd::Copy () {
return new GetNameVarsCmd(_target);
}
ClassId GetNameVarsCmd::GetClassId () { return GETNAMEVARS_CMD; }
boolean GetNameVarsCmd::IsA (ClassId id) {
return GETNAMEVARS_CMD == id || Command::IsA(id);
}
/*****************************************************************************/
ScanCmd::ScanCmd (GraphicComp* target, const char* classname, ClassId id) {
_target = target;
_classname = strnew(classname);
_classid = id;
_succeeded = false;
_scope = false;
}
ScanCmd::~ScanCmd () {
delete _classname;
}
void ScanCmd::Execute () {
_scope = false;
if (_target != nil) {
_target->Interpret(this);
}
}
Command* ScanCmd::Copy () {
return new ScanCmd(_target, _classname, _classid);
}
ClassId ScanCmd::GetClassId () { return SCAN_CMD; }
boolean ScanCmd::IsA (ClassId id) {
return SCAN_CMD == id || Command::IsA(id);
}
/*****************************************************************************/
class LogCmd : public Command {
public:
LogCmd();
};
LogCmd::LogCmd () {}
/*****************************************************************************/
ClassId AboutCmd::GetClassId () { return ABOUT_CMD; }
boolean AboutCmd::IsA (ClassId id) {return ABOUT_CMD==id || Command::IsA(id);}
AboutCmd::AboutCmd (ControlInfo* c) : Command(c) { }
AboutCmd::AboutCmd (Editor* ed) : Command(ed) { }
Command* AboutCmd::Copy () {
Command* copy = new AboutCmd(CopyControlInfo());
InitCopy(copy);
return copy;
}
void AboutCmd::Execute () {
Editor* ed = GetEditor();
AcknowledgeDialog dialog(VERSION);
ed->InsertDialog(&dialog);
dialog.Acknowledge();
ed->RemoveDialog(&dialog);
}
boolean AboutCmd::Reversible () { return false; }
/*****************************************************************************/
ClassId TabCmd::GetClassId () { return TAB_CMD; }
boolean TabCmd::IsA (ClassId id) {return TAB_CMD==id || Command::IsA(id);}
TabCmd::TabCmd (ControlInfo* c) : Command(c) { }
TabCmd::TabCmd (Editor* ed) : Command(ed) { }
Command* TabCmd::Copy () {
Command* copy = new TabCmd(CopyControlInfo());
InitCopy(copy);
return copy;
}
void TabCmd::Execute () {
Iterator i;
Editor* ed = GetEditor();
Viewer* viewer = ed->GetViewer();
GraphicView* gv = viewer->GetGraphicView();
Selection* gsel = viewer->GetSelection();
GraphicView* target = nil;
if (gsel->IsEmpty()) {
gv->First(i);
target = gv->GetView(i);
} else {
gsel->Last(i);
target = gsel->GetView(i);
gv->SetView(target, i);
gv->Next(i);
if (gv->Done(i)) {
gv->First(i);
}
target = gv->GetView(i);
}
if (target != nil) {
gsel->Clear();
gsel->Append(target);
gsel->Update();
target->Interpret(this);
}
}
boolean TabCmd::Reversible() { return false; }
/*****************************************************************************/
ClassId NewViewCmd::GetClassId () { return NEWVIEW_CMD; }
boolean NewViewCmd::IsA (ClassId id) {
return NEWVIEW_CMD == id || Command::IsA(id);
}
NewViewCmd::NewViewCmd (ControlInfo* c, GraphicComp* comp) : Command(c) {
_comp = comp;
}
NewViewCmd::NewViewCmd (Editor* ed, GraphicComp* comp) : Command(ed) {
_comp = comp;
}
Command* NewViewCmd::Copy () {
Command* copy = new NewViewCmd(CopyControlInfo(), GetGraphicComp());
InitCopy(copy);
return copy;
}
void NewViewCmd::Execute () {
IBEditor* ed = (IBEditor*) GetEditor();
GraphicComp* comp = (_comp == nil) ? Command::GetGraphicComp() : _comp;
IBEditor* newEd = new IBEditor(comp);
*newEd->GetState("ModifStatusVar") = *ed->GetState("ModifStatusVar");
*newEd->GetState("FontVar") = *ed->GetState("FontVar");
*newEd->GetState("BrushVar") = *ed->GetState("BrushVar");
*newEd->GetState("ColorVar") = *ed->GetState("ColorVar");
*newEd->GetState("PatternVar") = *ed->GetState("PatternVar");
unidraw->Open(newEd);
}
boolean NewViewCmd::Reversible () { return false; }
void NewViewCmd::Read (istream& in) {
Command::Read(in);
_comp = (GraphicComp*) unidraw->GetCatalog()->ReadComponent(in);
}
void NewViewCmd::Write (ostream& out) {
Command::Write(out);
unidraw->GetCatalog()->WriteComponent(GetGraphicComp(), out);
}
/*****************************************************************************/
static void SelectView(Viewer* viewer, GraphicComp* target) {
Selection* sel = viewer->GetSelection();
sel->Clear();
GraphicView* gv = viewer->GetGraphicView();
GraphicView* view = gv->GetGraphicView(target);
if (view != nil) sel->Append(view);
sel->Update();
}
/*****************************************************************************/
ClassId NavigateCmd::GetClassId () { return NAVIGATE_CMD; }
boolean NavigateCmd::IsA (ClassId id) {
return NAVIGATE_CMD == id || Command::IsA(id);
}
NavigateCmd::NavigateCmd (
ControlInfo* c, boolean root, GraphicComp* parent, GraphicComp* kid
) : Command(c) {
_parent = parent;
_kid = kid;
_oparent = nil;
_okid = nil;
_root = root;
_reversible = true;
}
NavigateCmd::NavigateCmd (
Editor* ed, boolean root, GraphicComp* parent, GraphicComp* kid
) : Command(ed) {
_parent = parent;
_kid = kid;
_oparent = nil;
_okid = nil;
_root = root;
_reversible = true;
}
Command* NavigateCmd::Copy () {
Command* copy = new NavigateCmd(CopyControlInfo(), _root, _parent, _kid);
InitCopy(copy);
return copy;
}
void NavigateCmd::Execute () {
Iterator i;
Editor* ed = GetEditor();
Viewer* viewer = ed->GetViewer();
_oparent = (GraphicComp*) ed->GetComponent();
if (_okid == nil) {
Selection* sel = ed->GetSelection();
if (sel->Number() == 1) {
sel->First(i);
_okid = (GraphicComp*) sel->GetView(i)->GetGraphicComp();
sel->Clear();
}
}
if (_parent != nil) {
if (_parent != _oparent) {
ed->SetComponent(_parent);
} else {
_reversible = false;
return;
}
} else if (_root) {
GraphicComp* grcomp = (GraphicComp*) ed->GetComponent();
GraphicComp* root = (GraphicComp*) grcomp->GetRoot();
if (root != _oparent) {
ed->SetComponent(root);
GetTopLevelCmd toplevelCmd(grcomp);
toplevelCmd.Execute();
_kid = toplevelCmd.GetTopLevel();
} else {
_reversible = false;
return;
}
} else {
GraphicComp* icomp = (GraphicComp*) ed->GetComponent();
GraphicComp* parent = (GraphicComp*) icomp->GetParent();
if (parent != nil) {
ed->SetComponent(parent);
_kid = icomp;
} else {
_reversible = false;
return;
}
}
Component* comp = ed->GetComponent();
CompNameVar* compNameVar = (CompNameVar*) ed->GetState("CompNameVar");
if (compNameVar != nil) compNameVar->SetComponent(comp);
comp->Interpret(this);
_oparent->Interpret(this);
ed->Update();
comp->Notify(); // hack for menus
unidraw->Update();
if (_kid != nil) {
SelectView(viewer, _kid);
}
}
void NavigateCmd::Unexecute () {
Editor* ed = GetEditor();
Viewer* viewer = ed->GetViewer();
Component* comp = ed->GetComponent();
ed->SetComponent(_oparent);
CompNameVar* compNameVar = (CompNameVar*) ed->GetState("CompNameVar");
if (compNameVar != nil) compNameVar->SetComponent(_oparent);
comp->Uninterpret(this);
_oparent->Uninterpret(this);
ed->Update();
_oparent->Notify();
unidraw->Update();
if (_okid != nil) {
SelectView(viewer, _okid);
}
}
boolean NavigateCmd::Reversible () { return _reversible; }
/*****************************************************************************/
ClassId PlaceCmd::GetClassId () { return PLACE_CMD; }
boolean PlaceCmd::IsA (ClassId id) { return PLACE_CMD==id || Command::IsA(id);}
PlaceCmd::PlaceCmd (ControlInfo* c, Clipboard* cb) : Command(c, cb) {
_natural = true;
}
PlaceCmd::PlaceCmd (Editor* ed, Clipboard* cb) : Command(ed,cb){
_natural = true;
}
PlaceCmd::PlaceCmd (
Editor* ed, Coord l, Coord b, Coord r, Coord t, Clipboard* cb
) : Command(ed, cb) {
_natural = false;
_l = l; _b = b; _r = r; _t = t;
}
Command* PlaceCmd::Copy () {
PlaceCmd* copy = new PlaceCmd(CopyControlInfo(), DeepCopyClipboard());
InitCopy(copy);
copy->_natural = _natural;
copy->_l = _l; copy->_b = _b; copy->_r = _r; copy->_t = _t;
return copy;
}
void PlaceCmd::Execute () {
GetEditor()->GetComponent()->Interpret(this);
}
void PlaceCmd::Unexecute () {
GetEditor()->GetComponent()->Uninterpret(this);
}
boolean PlaceCmd::Placement (Coord& l, Coord& b, Coord& r, Coord& t) {
l = _l; b = _b; r = _r; t = _t;
return !_natural;
}
void PlaceCmd::Read (istream& in) {
Command::Read(in);
in >> _natural >> _l >> _b >> _r >> _t;
}
void PlaceCmd::Write (ostream& out) {
Command::Write(out);
out << _natural << " " << _l << " " << _b << " " << _r << " " << _t << " ";
}
/*****************************************************************************/
ClassId GlueVisibilityCmd::GetClassId () { return GLUEVISIBILITY_CMD; }
boolean GlueVisibilityCmd::IsA (ClassId id) {
return GLUEVISIBILITY_CMD == id || BrushCmd::IsA(id);
}
GlueVisibilityCmd::GlueVisibilityCmd (
ControlInfo* c, boolean visible
) : BrushCmd(c, visible ? pssingle : psnonebr) { }
GlueVisibilityCmd::GlueVisibilityCmd (
Editor* ed, boolean visible
) : BrushCmd(ed, visible ? pssingle : psnonebr) { }
boolean GlueVisibilityCmd::Visible () { return !GetBrush()->None(); }
Command* GlueVisibilityCmd::Copy () {
Command* copy = new GlueVisibilityCmd(CopyControlInfo(), Visible());
InitCopy(copy);
return copy;
}
void GlueVisibilityCmd::Execute () {
Command::Execute();
}
void GlueVisibilityCmd::Unexecute () {
Command::Unexecute();
}
/*****************************************************************************/
ClassId SceneCmd::GetClassId () { return SCENE_CMD; }
boolean SceneCmd::IsA (ClassId id) {
return SCENE_CMD == id || GroupCmd::IsA(id);
}
SceneCmd::SceneCmd (
ControlInfo* c, SceneComp* dest
) : GroupCmd(c, dest) {
_log = nil;
}
SceneCmd::SceneCmd (
Editor* ed, SceneComp* dest
) : GroupCmd(ed, dest) {
_log = nil;
}
SceneCmd::~SceneCmd () {
delete _log;
}
Command* SceneCmd::Copy () {
GraphicComp* group = GetGroup();
SceneComp* dest = (group == nil) ? nil : (SceneComp*)group->Copy();
Command* copy = new SceneCmd(CopyControlInfo(), dest);
InitCopy(copy);
return copy;
}
void SceneCmd::Execute () {
Clipboard* cb = GetClipboard();
GraphicComp* group = GetGroup();
if (cb == nil) {
SetClipboard(cb = new Clipboard);
Editor* ed = GetEditor();
Selection* s = ed->GetSelection();
if (s->Number() >= 1) {
Iterator i;
_log = new LogCmd;
GraphicView* views = ed->GetViewer()->GetGraphicView();
for (s->First(i); !s->Done(i); s->Next(i)) {
s->GetView(i)->Interpret(this);
}
}
}
if (!cb->IsEmpty()) {
group->Interpret(this);
_executed = true;
}
}
/*****************************************************************************/
ClassId MonoSceneCmd::GetClassId () { return MONOSCENE_CMD; }
boolean MonoSceneCmd::IsA (ClassId id) {
return MONOSCENE_CMD == id || GroupCmd::IsA(id);
}
MonoSceneCmd::MonoSceneCmd (
ControlInfo* c, MonoSceneComp* dest
) : GroupCmd(c, dest) {
_mcb = nil;
_log = nil;
_executed = false;
}
MonoSceneCmd::MonoSceneCmd (
Editor* ed, MonoSceneComp* dest
) : GroupCmd(ed, dest) {
_mcb = nil;
_log = nil;
_executed = false;
}
MonoSceneCmd::~MonoSceneCmd () {
if (!_executed && _mcb != nil) {
_mcb->DeleteComps();
}
delete _mcb;
delete _log;
}
Command* MonoSceneCmd::Copy () {
GraphicComp* group = GetGroup();
MonoSceneComp* dest = (group == nil) ? nil : (MonoSceneComp*)group->Copy();
dest->GetClassNameVar()->GenNewName();
Command* copy = new MonoSceneCmd(CopyControlInfo(), dest);
InitCopy(copy);
return copy;
}
void MonoSceneCmd::Execute () {
Iterator i;
GraphicComp* group = GetGroup();
Editor* editor = GetEditor();
Clipboard* cb = GetClipboard();
BrushVar* brVar = (BrushVar*) editor->GetState("BrushVar");
ColorVar* colVar = (ColorVar*) editor->GetState("ColorVar");
if (cb == nil) {
Selection* s = editor->GetSelection();
SetClipboard(cb = new Clipboard);
if (s->IsEmpty()) {
return;
}
cb->Init(s);
_mcb = new Clipboard;
_log = new LogCmd;
for (cb->First(i); !cb->Done(i); cb->Next(i)) {
GraphicComp* parent = (GraphicComp*) group->Copy();
parent->GetGraphic()->SetColors(
colVar->GetFgColor(), colVar->GetBgColor()
);
parent->GetGraphic()->SetBrush(brVar->GetBrush());
parent->Interpret(this);
_mcb->Append(parent);
}
} else {
for (_mcb->First(i); !_mcb->Done(i); _mcb->Next(i)) {
GraphicComp* parent = _mcb->GetComp(i);
parent->Interpret(this);
}
}
GetEditor()->GetComponent()->Interpret(this);
_executed = true;
}
void MonoSceneCmd::Unexecute() {
Iterator i;
for (_mcb->First(i); !_mcb->Done(i); _mcb->Next(i)) {
GraphicComp* parent = _mcb->GetComp(i);
parent->Uninterpret(this);
}
GetEditor()->GetComponent()->Uninterpret(this);
_executed = false;
}
/*****************************************************************************/
class InfoData : public Data {
public:
InfoData(UList*);
virtual ~InfoData();
void SwitchStates(UList*);
private:
UList* _statelist;
};
InfoData::InfoData (UList* statelist) {
_statelist = new UList;
for (UList* i = statelist->First(); i != statelist->End(); i = i->Next()) {
StateVar* state = (StateVar*) (*i)();
StateVar* copy = state->Copy();
_statelist->Append(new UList(copy));
}
}
InfoData::~InfoData () {
for (UList* i=_statelist->First(); i != _statelist->End(); i = i->Next()) {
StateVar* state = (StateVar*) (*i)();
delete state;
}
delete _statelist;
}
void InfoData::SwitchStates(UList* statelist) {
UList* i = statelist->First();
UList* j = _statelist->First();
for (;
i != statelist->End() && j != _statelist->End();
i = i->Next(), j = j->Next()
) {
StateVar* src = (StateVar*) (*i)();
StateVar* dest = (StateVar*) (*j)();
StateVar* tmp = dest->Copy();
*tmp = *dest;
*dest = *src;
*src = *tmp;
delete tmp;
}
}
/*****************************************************************************/
ClassId InfoCmd::GetClassId () { return INFO_CMD; }
boolean InfoCmd::IsA (ClassId id) { return INFO_CMD == id || Command::IsA(id);}
InfoCmd::InfoCmd (ControlInfo* c, GraphicView* view) : Command(c) {
_view = view;
_placeCmd = nil;
_infoData = nil;
_info = nil;
_iStates = nil;
_ibshape = nil;
_oshape = nil;
_reversible = false;
}
InfoCmd::InfoCmd (Editor* ed, GraphicView* view) : Command(ed) {
_view = view;
_placeCmd = nil;
_infoData = nil;
_info = nil;
_iStates = nil;
_ibshape = nil;
_oshape = nil;
_reversible = false;
}
InfoCmd::~InfoCmd () {
delete _placeCmd;
delete _infoData;
delete _info;
delete _iStates;
delete _oshape;
}
Command* InfoCmd::Copy () {
Command* newCmd = new InfoCmd(CopyControlInfo(), _view);
InitCopy(newCmd);
return newCmd;
}
static boolean Different(Shape* src, Shape* dest) {
return (
(src->width != dest->width) ||
(src->height != dest->height) ||
(src->hstretch != dest->hstretch) ||
(src->vstretch != dest->vstretch) ||
(src->hshrink != dest->hshrink) ||
(src->vshrink != dest->vshrink)
);
}
boolean InfoCmd::Accept() {
Editor* ed = GetEditor();
boolean done = false;
boolean accepted;
const char* errors;
ed->InsertDialog(_info);
while (!done) {
accepted = _info->Accept();
if (accepted) {
delete _iStates;
delete _infoData;
_iStates = _info->GetAffectedStates();
_infoData = new InfoData(_iStates);
if (!_info->AppliedChanges(errors)) {
AcknowledgeDialog errorMsg("Error!", errors);
ed->InsertDialog(&errorMsg);
errorMsg.Acknowledge();
ed->RemoveDialog(&errorMsg);
_infoData->SwitchStates(_iStates);
} else {
done = true;
}
} else {
done = true;
}
}
ed->RemoveDialog(_info);
return accepted;
}
void InfoCmd::Execute () {
Iterator i;
Clipboard* cb = GetClipboard();
Editor* ed = GetEditor();
if (cb == nil) {
SetClipboard(cb = new Clipboard);
GraphicComp* grcomp = (GraphicComp*) _view->GetGraphicComp();
cb->Append(grcomp);
_view->Interpret(this);
if (Accept()) {
_reversible = true;
if (_oshape != nil && Different(_ibshape, _oshape)) {
InteractorComp* intcomp = (InteractorComp*) grcomp;
CanvasVar* cvar = intcomp->GetCanvasVar();
Coord x1, y1, x2, y2;
float cx, cy;
int w = _ibshape->width;
int h = _ibshape->height;
if (w == 0 && !_ibshape->hnat) {
w = cvar->Width();
}
if (h == 0 && !_ibshape->vnat) {
h = cvar->Height();
}
intcomp->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;
_placeCmd = new PlaceCmd(
ed, x1, y1, x2-1, y2-1, new Clipboard(intcomp)
);
_placeCmd->Execute();
}
GetFirewallCmd firewallCmd(grcomp);
firewallCmd.Execute();
InteractorComp* firewall = firewallCmd.GetFirewall();
if (firewall != nil && firewall->IsANewScope()) {
MonoSceneClass* mfirewall = (MonoSceneClass*) firewall;
mfirewall->Clone(this);
}
}
} else {
cb->First(i);
GraphicComp* grcomp = cb->GetComp(i);
grcomp->Interpret(this);
GetFirewallCmd firewallCmd(grcomp);
firewallCmd.Execute();
InteractorComp* firewall = firewallCmd.GetFirewall();
_infoData->SwitchStates(_iStates);
if (_placeCmd != nil) {
_placeCmd->Execute();
}
if (firewall != nil && firewall->IsANewScope()) {
MonoSceneClass* mfirewall = (MonoSceneClass*) firewall;
mfirewall->Clone(this);
}
}
}
void InfoCmd::Unexecute () {
Clipboard* cb = GetClipboard();
if (_placeCmd != nil) {
_placeCmd->Unexecute();
}
_infoData->SwitchStates(_iStates);
Iterator i;
cb->First(i);
GraphicComp* grcomp = cb->GetComp(i);
grcomp->Uninterpret(this);
GetFirewallCmd firewallCmd(grcomp);
firewallCmd.Execute();
InteractorComp* firewall = firewallCmd.GetFirewall();
if (firewall != nil && firewall->IsANewScope()) {
MonoSceneClass* mfirewall = (MonoSceneClass*) firewall;
mfirewall->UnClone(this);
}
}
boolean InfoCmd::Reversible () { return _reversible; }
/*****************************************************************************/
ClassId PropsCmd::GetClassId () { return PROPS_CMD; }
boolean PropsCmd::IsA (ClassId id) {
return PROPS_CMD == id || Command::IsA(id);
}
PropsCmd::PropsCmd (ControlInfo* c, InteractorComp* icomp) : Command(c) {
_icomp = icomp;
}
PropsCmd::PropsCmd (Editor* ed, InteractorComp* icomp) : Command(ed) {
_icomp = icomp;
}
Command* PropsCmd::Copy () {
Command* newCmd = new PropsCmd(CopyControlInfo(), _icomp);
InitCopy(newCmd);
return newCmd;
}
void PropsCmd::Execute () {
Editor* ed = GetEditor();
Clipboard* cb = GetClipboard();
if (cb == nil) {
const char* errors;
boolean accepted;
SetClipboard(cb = new Clipboard);
cb->Append(_icomp);
_icomp->Interpret(this);
PropsDialog* propsDialog = new PropsDialog(_icomp);
ed->InsertDialog(propsDialog);
while (
(accepted = propsDialog->Accept()) &&
!propsDialog->AppliedChanges(errors)
) {
AcknowledgeDialog errorMsg("Error!", errors);
ed->InsertDialog(&errorMsg);
errorMsg.Acknowledge();
ed->RemoveDialog(&errorMsg);
}
ed->RemoveDialog(propsDialog);
delete propsDialog;
if (accepted) {
_reversible = true;
_icomp->Propagate(this);
}
} else {
_icomp->Interpret(this);
}
}
void PropsCmd::Unexecute () {
Iterator i;
Clipboard* cb = GetClipboard();
cb->First(i);
InteractorComp* icomp = (InteractorComp*) cb->GetComp(i);
icomp->Uninterpret(this);
}
boolean PropsCmd::Reversible () { return _reversible; }
/*****************************************************************************/
ClassId IdrawCmd::GetClassId () { return IDRAW_CMD; }
boolean IdrawCmd::IsA (ClassId id) {
return IDRAW_CMD == id || Command::IsA(id);
}
IdrawCmd::IdrawCmd (ControlInfo* c, GrBlockComp* grblock) : Command(c) {
_grblock = grblock;
_placeCmd = nil;
_reversible = true;
}
IdrawCmd::IdrawCmd (Editor* ed, GrBlockComp* grblock) : Command(ed) {
_grblock = grblock;
_placeCmd = nil;
_reversible = true;
}
IdrawCmd::~IdrawCmd () {
delete _placeCmd;
}
Command* IdrawCmd::Copy () {
Command* newCmd = new IdrawCmd(CopyControlInfo(), _grblock);
InitCopy(newCmd);
return newCmd;
}
void IdrawCmd::Execute () {
Editor* ed = GetEditor();
char buf[CHARBUFSIZE];
Clipboard* cb = GetClipboard();
if (cb == nil) {
boolean aborted = false;
SetClipboard(cb = new Clipboard);
cb->Append(_grblock);
char* tmpname = tmpnam(NULL);
_grblock->WriteGraphicComp(tmpname);
int pid = vfork();
if (pid == -1) {
sprintf(buf, "Can't fork to execute idraw");
Warning(ed, buf);
} else if (pid == 0) {
/* child */
set_child_process_group();
execlp("idraw", "idraw", tmpname, nil);
_exit(0);
} else {
/* parent */
sprintf(buf, "Executing idraw");
aborted = Abort(ed, pid, buf);
if (!aborted) {
_grblock->Interpret(this);
_grblock->ReadGraphicComp(tmpname);
_grblock->Propagate(this);
_placeCmd = new PlaceCmd(ed, new Clipboard(_grblock));
} else {
_reversible = false;
}
unlink(tmpname);
}
} else {
_grblock->Interpret(this);
}
if (_placeCmd != nil) {
_placeCmd->Execute();
unidraw->Update(true);
}
}
void IdrawCmd::Unexecute () {
_grblock->Uninterpret(this);
_placeCmd->Unexecute();
unidraw->Update(true);
}
/*****************************************************************************/
ClassId CodeCmd::GetClassId () { return CODE_CMD; }
boolean CodeCmd::IsA (ClassId id) { return CODE_CMD == id || Command::IsA(id);}
CodeCmd::CodeCmd (ControlInfo* c) : Command(c) { Init(); }
CodeCmd::CodeCmd (Editor* ed) : Command(ed) { Init(); }
void CodeCmd::Init() {
_option = nil;
_save_cmd = nil;
_dialogList = new UList;
}
CodeCmd::~CodeCmd () {
delete _option;
delete _save_cmd;
for(
UList* i = _dialogList->First(); i != _dialogList->End(); i = i->Next()
) {
ConflictDialog* conflict = (ConflictDialog*) (*i)();
delete conflict;
}
delete _dialogList;
}
Command* CodeCmd::Copy () {
Command* newCmd = new CodeCmd(CopyControlInfo());
InitCopy(newCmd);
return newCmd;
}
void CodeCmd::Execute () {
InteractorComp* comps = (InteractorComp*) GetGraphicComp()->GetRoot();
*_errbuf = '\0';
DoIt(comps);
}
void CodeCmd::DoIt (InteractorComp* comps) {
boolean ok;
Editor* ed = GetEditor();
CompNameVar* compNameVar = (CompNameVar*) ed->GetState("CompNameVar");
const char* name = compNameVar->GetName();
if (name == nil) {
if (_save_cmd == nil) {
FileChooser* fc = new FileChooser(
"", "Please save before generating.", ".", 10, 24, " OK "
);
_save_cmd = new SaveCompAsCmd(ed, fc);
}
_save_cmd->Execute();
}
name = compNameVar->GetName();
if (name != nil) {
if (_option == nil) {
_option = new OptionDialog(
"Interface generation options:", "",
Gen_File, " Generate source only",
Gen_Files, " Generate sources and makefile",
Gen_Make, " Generate and build"
);
}
_editor->InsertDialog(_option);
boolean accepted = _option->Accept();
_editor->RemoveDialog(_option);
if (accepted) {
int select = _option->Option();
CodeView* ev = (CodeView*) comps->Create(CODE_VIEW);
comps->Attach(ev);
ev->Update();
if (select == Gen_File) {
ok = GenFile(name, ev);
delete ev;
} else if (select == Gen_Files) {
ok = GenFiles(name, ev);
delete ev;
} else if (select == Gen_Make) {
ok = GenFiles(name, ev);
delete ev;
if (ok) {
Make(name);
}
}
if (!ok) {
const char* errors = ev->GetErrors();
strcat(_errbuf, errors);
if (*_errbuf != '\0') {
Warning(_editor, _errbuf);
}
}
}
}
}
boolean CodeCmd::GenFiles (const char* name, CodeView* ev) {
boolean ok = GenMultipleFiles(name, ev);
if (ok) {
Catalog* catalog = unidraw->GetCatalog();
ConflictDialog* conflict = nil;
char cext[8];
const char* app_ccdefine = getenv("APP_CCDEFINE");
if (app_ccdefine == nil) {
strcpy(cext, CC_SUFFIX);
} else {
strcpy(cext, app_ccdefine);
}
char makefile[CHARBUFSIZE];
char imakefile[CHARBUFSIZE];
char properties[CHARBUFSIZE];
char mainfile[CHARBUFSIZE];
sprintf(properties, "%s-props", name);
sprintf(mainfile, "%s-main%s", name, cext);
sprintf(makefile, "%s-make", name);
sprintf(imakefile, "%s-imake", name);
ok = ok && CheckConflicts(
conflict, properties, true, mainfile, true,
imakefile, true, makefile, true
);
boolean skipped = conflict->Skipped();
if (
(skipped || ok) && !catalog->Exists(properties) ||
ok && conflict->Checked(properties) &&catalog->Writable(properties)
) {
ok = GenPropFile(name, ev) && ok;
}
if (
(skipped || ok) && !catalog->Exists(mainfile) ||
ok && conflict->Checked(mainfile) && catalog->Writable(mainfile)
) {
ok = GenMainFile(name, ev) && ok;
}
if (
(skipped || ok) && !catalog->Exists(imakefile) ||
ok && conflict->Checked(imakefile) && catalog->Writable(imakefile)
) {
ok = GenIMakeFile(name, ev) && ok;
}
if (
(skipped || ok) && !catalog->Exists(makefile) ||
ok && conflict->Checked(makefile) && catalog->Writable(makefile)
) {
ok = GenMakeFile(name, ev) && ok;
}
ok = ok || skipped;
}
return ok;
}
boolean CodeCmd::GenFile (const char* name, CodeView* ev) {
boolean ok = GenMultipleFiles(name, ev);
if (ok) {
Catalog* catalog = unidraw->GetCatalog();
ConflictDialog* conflict = nil;
char properties[CHARBUFSIZE];
char mainfile[CHARBUFSIZE];
char cext[8];
const char* app_ccdefine = getenv("APP_CCDEFINE");
if (app_ccdefine == nil) {
strcpy(cext, CC_SUFFIX);
} else {
strcpy(cext, app_ccdefine);
}
sprintf(properties, "%s-props", name);
sprintf(mainfile, "%s-main%s", name, cext);
ok = ok && CheckConflicts(
conflict, properties, true, mainfile, true
);
boolean skipped = conflict->Skipped();
if (
(skipped || ok) && !catalog->Exists(properties) ||
ok && conflict->Checked(properties) &&catalog->Writable(properties)
) {
ok = GenPropFile(name, ev) && ok;
}
if (
(skipped || ok) && !catalog->Exists(mainfile) ||
ok && conflict->Checked(mainfile) && catalog->Writable(mainfile)
) {
ok = GenMainFile(name, ev) && ok;
}
ok = ok || skipped;
}
return ok;
}
boolean CodeCmd::GenMultipleFiles (const char* name, CodeView* ev) {
ConflictDialog* conflict = nil;
boolean ok = true;
Catalog* catalog = unidraw->GetCatalog();
char fheaderfile[CHARBUFSIZE];
char fsrcfile[CHARBUFSIZE];
char fcorehfile[CHARBUFSIZE];
char fcorecfile[CHARBUFSIZE];
char forig[CHARBUFSIZE];
char cext[8];
const char* cname;
const char* app_ccdefine = getenv("APP_CCDEFINE");
if (app_ccdefine == nil) {
strcpy(cext, CC_SUFFIX);
} else {
strcpy(cext, app_ccdefine);
}
char* dir =GetDirName(name);
UList* classlist = new UList;
ev->GetClassList(classlist);
for (UList* i = classlist->First(); i != classlist->End(); i = i->Next()) {
SubclassNameVar* subclass = (SubclassNameVar*) (*i) ();
cname = subclass->GetName();
sprintf(fheaderfile, "%s%s.h", dir, cname);
sprintf(fsrcfile, "%s%s%s", dir, cname, cext);
sprintf(fcorehfile, "%s%s-core.h", dir, cname);
sprintf(fcorecfile, "%s%s-core%s", dir, cname, cext);
sprintf(forig, "%s%s", dir, cname);
ok = CheckConflicts(
conflict, fheaderfile, false, fsrcfile, false,
fcorehfile, true, fcorecfile, true
);
boolean skipped = conflict->Skipped();
if (
(skipped || ok) && !catalog->Exists(fheaderfile) ||
ok && conflict->Checked(fheaderfile) &&
catalog->Writable(fheaderfile)
) {
ok = GenDothFile(forig, ev) && ok;
}
if (
(skipped || ok) && !catalog->Exists(fsrcfile) ||
ok && conflict->Checked(fsrcfile) &&
catalog->Writable(fsrcfile)
) {
ok = GenDotcFile(forig, ev) && ok;
}
if (
(skipped || ok) && !catalog->Exists(fcorehfile) ||
ok && conflict->Checked(fcorehfile) &&
catalog->Writable(fcorehfile)
) {
ok = GenCorehFile(forig, ev) && ok;
}
if (
(skipped || ok) && !catalog->Exists(fcorecfile) ||
ok && conflict->Checked(fcorecfile) &&
catalog->Writable(fcorecfile)
) {
ok = GenCorecFile(forig, ev) && ok;
}
ok = ok || skipped;
if (!ok) {
break;
}
}
delete classlist;
return ok;
}
static int StrToNum (const char* name) {
int count = 0;
for(int i = 0; name[i] != '\0'; i++) {
count += name[i];
}
return count;
}
boolean CodeCmd::CheckConflicts (
ConflictDialog*& conflict,
const char* file1, boolean check1,
const char* file2, boolean check2,
const char* file3, boolean check3,
const char* file4, boolean check4
) {
Editor* ed = GetEditor();
void* comp = ed->GetComponent();
int hash_id = 0;
hash_id += StrToNum(file1);
hash_id += StrToNum(file2);
hash_id += StrToNum(file3);
hash_id += StrToNum(file4);
Catalog* catalog = unidraw->GetCatalog();
boolean accepted = true;
conflict = nil;
for (
UList* i = _dialogList->First(); i != _dialogList->End(); i = i->Next()
) {
ConflictDialog* cdialog = (ConflictDialog*) (*i) ();
if (cdialog->GetId() == comp && cdialog->GetHashId() == hash_id) {
conflict = cdialog;
break;
}
}
if (conflict == nil) {
conflict = new ConflictDialog(comp);
_dialogList->Prepend(new UList(conflict));
conflict->AddConflict(file1, check1);
conflict->AddConflict(file2, check2);
if (*file3 != '\0') {
conflict->AddConflict(file3, check3);
}
if (*file4 != '\0') {
conflict->AddConflict(file4, check4);
}
}
conflict->Update();
if (
*file1 !='\0' && catalog->Writable(file1) && catalog->Exists(file1) ||
*file2 !='\0' && catalog->Writable(file2) && catalog->Exists(file2) ||
*file3 !='\0' && catalog->Writable(file3) && catalog->Exists(file3) ||
*file4 !='\0' && catalog->Writable(file4) && catalog->Exists(file4)
) {
ed->InsertDialog(conflict);
accepted = conflict->Accept();
ed->RemoveDialog(conflict);
}
return accepted;
}
boolean CodeCmd::GenIMakeFile(const char* filename, CodeView* ev) {
char cmd[CHARBUFSIZE*10];
char* dir = GetDirName(filename);
char* orig = GetOrigName(filename);
sprintf(cmd, "cd %s; ibmkmf -m %s", dir, orig);
UList* classlist = new UList;
ev->GetClassList(classlist);
for (UList* i = classlist->First(); i != classlist->End(); i = i->Next()) {
SubclassNameVar* subclass = (SubclassNameVar*) (*i) ();
const char* cname = subclass->GetName();
strcat(cmd, " ");
strcat(cmd, cname);
}
int retcode = system(cmd);
if (retcode != 0) {
strcat(_errbuf, "IMakefile generation failed!!\n");
return false;
}
delete classlist;
return true;
}
boolean CodeCmd::GenMakeFile(const char* filename, CodeView*) {
char cmd[CHARBUFSIZE];
boolean ok = true;
sprintf(cmd, "ibmkmf %s", filename);
int retcode = system(cmd);
if (retcode != 0) {
strcat(_errbuf, "Makefile generation failed!!\n");
ok = false;
} else {
Catalog* catalog = unidraw->GetCatalog();
char* dir = GetDirName(filename);
char* orig = GetOrigName(filename);
char mfile[CHARBUFSIZE];
sprintf(mfile, "%smakefile", dir);
char* tmpname = tmpnam(NULL);
if (catalog->Exists(mfile)) {
sprintf(cmd, "mv %s %s", mfile, tmpname);
ok = (system(cmd) == 0) && ok;
}
sprintf(cmd, "mv %s-make %s", filename, mfile);
ok = (system(cmd) == 0) && ok;
char buf[CHARBUFSIZE];
int pid = fork();
if (pid == -1) {
sprintf(buf, "Cannot fork to make %s!!", orig);
Warning(GetEditor(), buf);
ok = false;
} else if (pid == 0) {
/* child */
set_child_process_group();
sprintf(cmd, "cd %s; make depend", dir);
system(cmd);
_exit(0);
} else {
/* parent */
sprintf(buf, "Generating dependencies for \"%s\"", orig);
ok = !Abort(GetEditor(), pid, buf);
}
sprintf(cmd, "mv %s %s-make", mfile, filename);
ok = (system(cmd) == 0) && ok;
if (catalog->Exists(tmpname)) {
sprintf(cmd, "mv %s %s", tmpname, mfile);
ok = (system(cmd) == 0) && ok;
}
}
return ok;
}
boolean CodeCmd::GenPropFile(const char* filename, CodeView* ev) {
filebuf fbuf;
char* orig = GetOrigName(filename);
char fullfile[CHARBUFSIZE];
sprintf(fullfile, "%s-main.o", filename);
unlink(fullfile);
sprintf(fullfile, "%s-props", filename);
boolean ok = fbuf.open(fullfile, output) != 0;
if (ok) {
ostream* pout = new ostream(&fbuf);
ok = ok && ev->GenPropFile(orig, *pout);
pout->flush();
fbuf.sync();
delete pout;
} else {
strcat(_errbuf, "Cannot open property file ");
strcat(_errbuf, fullfile);
strcat(_errbuf, "!!\n");
}
return ok;
}
boolean CodeCmd::GenMainFile(const char* filename, CodeView* ev) {
filebuf fbuf;
char* orig = GetOrigName(filename);
char fullfile[CHARBUFSIZE];
char cext[8];
const char* app_ccdefine = getenv("APP_CCDEFINE");
if (app_ccdefine == nil) {
strcpy(cext, CC_SUFFIX);
} else {
strcpy(cext, app_ccdefine);
}
sprintf(fullfile, "%s-main.o", filename);
unlink(fullfile);
sprintf(fullfile, "%s-main%s", filename, cext);
boolean ok = fbuf.open(fullfile, output) != 0;
if (ok) {
ostream* mout = new ostream(&fbuf);
ok = ok && ev->GenMainFile(orig, *mout);
mout->flush();
fbuf.sync();
delete mout;
} else {
strcat(_errbuf, "Cannot open main file ");
strcat(_errbuf, fullfile);
strcat(_errbuf, "!!\n");
}
return ok;
}
boolean CodeCmd::GenDothFile(const char* filename, CodeView* ev) {
filebuf fbuf;
char* orig = GetOrigName(filename);
char fullfile[CHARBUFSIZE];
sprintf(fullfile, "%s.o", filename);
unlink(fullfile);
sprintf(fullfile, "%s.h", filename);
boolean ok = fbuf.open(fullfile, output) != 0;
if (ok) {
ostream* hout = new ostream(&fbuf);
ok = ok && ev->GenDothFile(orig, *hout);
hout->flush();
fbuf.sync();
delete hout;
} else {
strcat(_errbuf, "Cannot open header file ");
strcat(_errbuf, fullfile);
strcat(_errbuf, "!!\n");
}
return ok;
}
boolean CodeCmd::GenDotcFile(const char* filename, CodeView* ev) {
filebuf fbuf;
char* orig = GetOrigName(filename);
char fullfile[CHARBUFSIZE];
char cext[8];
const char* app_ccdefine = getenv("APP_CCDEFINE");
if (app_ccdefine == nil) {
strcpy(cext, CC_SUFFIX);
} else {
strcpy(cext, app_ccdefine);
}
sprintf(fullfile, "%s.o", filename);
unlink(fullfile);
sprintf(fullfile, "%s%s", filename, cext);
boolean ok = fbuf.open(fullfile, output) != 0;
if (ok) {
ostream* cout = new ostream(&fbuf);
ok = ok && ev->GenDotcFile(orig, *cout);
cout->flush();
fbuf.sync();
delete cout;
} else {
strcat(_errbuf, "Cannot open source file ");
strcat(_errbuf, fullfile);
strcat(_errbuf, "!!\n");
}
return ok;
}
boolean CodeCmd::GenCorehFile(const char* filename, CodeView* ev) {
filebuf fbuf;
char* orig = GetOrigName(filename);
char fullfile[CHARBUFSIZE];
sprintf(fullfile, "%s-core.o", filename);
unlink(fullfile);
sprintf(fullfile, "%s.o", filename);
unlink(fullfile);
sprintf(fullfile, "%s-core.h", filename);
boolean ok = fbuf.open(fullfile, output) != 0;
if (ok) {
ostream* hout = new ostream(&fbuf);
ok = ok && ev->GenCorehFile(orig, *hout);
hout->flush();
fbuf.sync();
delete hout;
} else {
strcat(_errbuf, "Cannot open template header file ");
strcat(_errbuf, fullfile);
strcat(_errbuf, "!!\n");
}
return ok;
}
boolean CodeCmd::GenCorecFile(const char* filename, CodeView* ev) {
filebuf fbuf;
char* orig = GetOrigName(filename);
char fullfile[CHARBUFSIZE];
char cext[8];
const char* app_ccdefine = getenv("APP_CCDEFINE");
if (app_ccdefine == nil) {
strcpy(cext, CC_SUFFIX);
} else {
strcpy(cext, app_ccdefine);
}
sprintf(fullfile, "%s-core.o", filename);
unlink(fullfile);
sprintf(fullfile, "%s-core%s", filename, cext);
boolean ok = fbuf.open(fullfile, output) != 0;
if (ok) {
ostream* cout = new ostream(&fbuf);
ok = ok && ev->GenCorecFile(orig, *cout);
cout->flush();
fbuf.sync();
delete cout;
} else {
strcat(_errbuf, "Cannot open template source file ");
strcat(_errbuf, fullfile);
strcat(_errbuf, "!!\n");
}
return ok;
}
void CodeCmd::Make(const char* file) {
char* orig = GetOrigName(file);
char* dir = GetDirName(file);
char buf[CHARBUFSIZE];
int pid = fork();
if (pid == -1) {
sprintf(buf, "Cannot fork to make %s!!", orig);
Warning(GetEditor(), buf);
} else if (pid == 0) {
/* child */
set_child_process_group();
char cmd[CHARBUFSIZE];
sprintf(cmd, "cd %s; make -f %s-make", dir, orig);
system(cmd);
_exit(0);
} else {
/* parent */
sprintf(buf, "Compiling \"%s\"", orig);
Abort(GetEditor(), pid, buf);
}
}
boolean CodeCmd::Reversible () { return false; }
/*****************************************************************************/
ClassId ExeCmd::GetClassId () { return EXE_CMD; }
boolean ExeCmd::IsA (ClassId id) { return EXE_CMD==id || ViewCompCmd::IsA(id);}
ExeCmd::ExeCmd (ControlInfo* c) : ViewCompCmd(c) { }
ExeCmd::ExeCmd (Editor* ed) : ViewCompCmd(ed) { }
Command* ExeCmd::Copy () {
Command* newCmd = new ExeCmd(CopyControlInfo());
InitCopy(newCmd);
return newCmd;
}
void ExeCmd::Execute () {
Editor* ed = GetEditor();
if (_dialog == nil) {
_dialog = new ExeDialog("./");
} else {
_dialog->Update();
}
ed->InsertDialog(_dialog);
boolean accepted = _dialog->Accept();
ed->RemoveDialog(_dialog);
if (accepted) {
char buf[CHARBUFSIZE];
char* name = (char* )_dialog->Choice();
int pid = vfork();
if (pid == -1) {
sprintf(buf, "Can't fork to execute \"%s\"\n", name);
Warning(ed, buf);
} else if (pid == 0) {
/* child */
set_child_process_group();
sprintf(buf, "-display %s", getenv("DISPLAY"));
execlp(name, name, buf, nil);
_exit(0);
} else {
/* parent */
char* slash = strrchr(name, '/');
char* filename = (slash == nil) ? name : slash + 1;
sprintf(buf, "Executing \"%s\"", filename);
Abort(ed, pid, buf);
}
}
}
boolean ExeCmd::Reversible () { return false; }
/*****************************************************************************/
ClassId NewToolCmd::GetClassId () { return NEWTOOL_CMD; }
boolean NewToolCmd::IsA (ClassId id) {
return NEWTOOL_CMD == id || Command::IsA(id);
}
NewToolCmd::NewToolCmd (ControlInfo* c) : Command(c) {
_option = nil;
_scmd = nil;
}
NewToolCmd::NewToolCmd (Editor* ed) : Command(ed) {
_option = nil;
_scmd = nil;
}
NewToolCmd::~NewToolCmd () {
delete _option;
delete _scmd;
}
Command* NewToolCmd::Copy () {
Command* newCmd = new NewToolCmd(CopyControlInfo());
InitCopy(newCmd);
return newCmd;
}
enum {BITMAP, MINIATURE, PLAIN_TEXT};
void NewToolCmd::Execute () {
Editor* ed = GetEditor();
CompNameVar* compNameVar = (CompNameVar*) ed->GetState("CompNameVar");
const char* name = compNameVar->GetName();
if (name == nil) {
if (_scmd == nil) {
char subtitle[CHARBUFSIZE];
sprintf(
subtitle, "Please save before creating the tool."
);
FileChooser* fc = new FileChooser(
"", subtitle, ".", 10,24," OK "
);
_scmd = new SaveCompAsCmd(ed, fc);
}
_scmd->Execute();
}
name = compNameVar->GetName();
if (name != nil) {
if (_option == nil) {
_option = new OptionDialog(
"Icon for the tool palette:", "",
BITMAP, " Custom bitmap",
MINIATURE, " Miniature",
PLAIN_TEXT, " Name of interface (plain text)"
);
}
ed->InsertDialog(_option);
boolean accepted = _option->Accept();
ed->RemoveDialog(_option);
if (accepted) {
InitNewTool(name, _option->Option());
}
}
}
static boolean WriteBitmap(const char* bitmapfile, const char* orig) {
filebuf fbuf;
boolean ok = fbuf.open(bitmapfile, output) != 0;
if (ok) {
ostream bout(&fbuf);
bout << "#define " << orig << "_width 20\n";
bout << "#define " << orig << "_height 20\n";
bout << "static char " << orig << "_bits[] = {\n";
for (int i = 0; i < 5; i++) {
bout << " ";
for (int j = 0; j < 12; j++) {
bout << "0x00, ";
}
bout << "\n";
}
bout << "};\n";
bout.flush();
fbuf.sync();
ok = ok && bout.good();
}
return ok;
}
boolean NewToolCmd::CreateCtrlInfo (
GraphicComp* origComp, char* file, ControlInfo*& ctrlInfo, int select
) {
IBEditor* ed = (IBEditor*) GetEditor();
boolean success = false;
if (select == BITMAP) {
boolean ok = true;
char bitmapfile[CHARBUFSIZE];
Catalog* catalog = unidraw->GetCatalog();
const char* toolspath = getenv("TOOLDIR");
if (toolspath == nil) {
sprintf(bitmapfile, "./%s.bm", file);
} else {
sprintf(bitmapfile, "%s/%s.bm", toolspath, file);
}
struct stat st;
if (!catalog->Exists(bitmapfile)) {
ok = WriteBitmap(bitmapfile, file);
if (!ok) {
char Error[CHARBUFSIZE];
sprintf(Error,"bitmap file %s generation failed!", bitmapfile);
Warning(ed, Error);
}
}
if (ok) {
int pid = fork();
if (pid == -1) {
Warning(ed, "Can't fork to run bitmap!");
} else if (pid == 0) {
/* child */
char cmd[CHARBUFSIZE];
char* dir = GetDirName(bitmapfile);
char* bm = GetOrigName(bitmapfile);
set_child_process_group();
sprintf(cmd, "cd %s; bitmap %s", dir, bm);
system(cmd);
_exit(0);
} else {
/* parent */
char buf[CHARBUFSIZE];
sprintf(buf, "Executing bitmap");
boolean aborted = Abort(ed, pid, buf);
if (!aborted) {
if (
stat(bitmapfile, &st) == 0 &&
(st.st_mode & S_IRUSR) != 0
) {
success = true;
BitmapGraphic* bitmapgr= new BitmapGraphic(
stdgraphic, bitmapfile
);
BitmapComp* bitmapcomp = new BitmapComp(bitmapgr);
ctrlInfo = new ControlInfo(bitmapcomp, "");
} else {
Warning(
ed,"Bitmap creation failed. Please try again!\n"
);
}
} else {
success = false;
}
}
}
} else if (select == MINIATURE) {
GraphicComp* comp = (GraphicComp*) origComp->Copy();
GraphicView* view = (GraphicView*) comp->Create(COMPONENT_VIEW);
comp->Attach(view);
view->Update();
Graphic* g = view->GetGraphic()->Copy();
delete view;
float l, b, r, t, scale;
const float size = 25.0;
g->GetBounds(l, b, r, t);
scale = min(size/(r - l), size/(t - b));
ScaleCmd scaleCmd((Editor*) nil, scale, scale);
comp->GraphicComp::Interpret(&scaleCmd);
ctrlInfo = new ControlInfo(comp, "");
success = true;
} else if (select == PLAIN_TEXT) {
ctrlInfo = new ControlInfo(file);
success = true;
}
return success;
}
void NewToolCmd::InitNewTool (const char* protoName, int selection) {
char* filename = GetOrigName(protoName);
ControlInfo* ctrlInfo;
Iterator i;
GraphicComp* protoComp;
int numcomp = 0;
IBEditor* ibEd = (IBEditor*) GetEditor();
GraphicComp* EdComp = ibEd->GetGraphicComp();
Selection* select = ibEd->GetSelection();
for (EdComp->First(i); !EdComp->Done(i); EdComp->Next(i), numcomp++) {}
if (numcomp == 1) {
EdComp->First(i);
EdComp = EdComp->GetComp(i);
}
if (CreateCtrlInfo(EdComp, (char*)filename, ctrlInfo, selection)) {
select->Hide();
protoComp = (GraphicComp*) EdComp->Copy();
Tool* tool = new IBGraphicCompTool(ctrlInfo, protoComp);
char toolName[CHARBUFSIZE];
sprintf(toolName, "%s.tool", filename);
Iterator i;
for (unidraw->First(i); !unidraw->Done(i); unidraw->Next(i)) {
IBEditor* iEd = (IBEditor*) unidraw->GetEditor(i);
ToolPanel* toolpanel = iEd->GetToolPanel();
toolpanel->Install(toolName, tool);
toolpanel->Change();
}
select->Show();
}
}
boolean NewToolCmd::Reversible () { return false; }
/*****************************************************************************/
ClassId ToolsCmd::GetClassId () { return TOOLS_CMD; }
boolean ToolsCmd::IsA (ClassId id) {return TOOLS_CMD==id || Command::IsA(id);}
ToolsCmd::ToolsCmd (ControlInfo* c) : Command(c) { }
ToolsCmd::ToolsCmd (Editor* ed) : Command(ed) { }
Command* ToolsCmd::Copy () {
Command* newCmd = new ToolsCmd(CopyControlInfo());
InitCopy(newCmd);
return newCmd;
}
void ToolsCmd::Execute () {
IBEditor* ibEd = (IBEditor*) GetEditor();
ToolPanel* toolpanel = ibEd->GetToolPanel();
EditorInfo* edInfo = toolpanel->GetEditorInfo();
InstallRemoveDialog toolsdialog = InstallRemoveDialog(edInfo);
ibEd->InsertDialog(&toolsdialog);
boolean accepted = toolsdialog.Accept();
ibEd->RemoveDialog(&toolsdialog);
if (accepted) {
EditorInfo* installed = (EditorInfo*) toolsdialog.Installed();
EditorInfo* removed = (EditorInfo*) toolsdialog.Removed();
Iterator i;
for (unidraw->First(i); !unidraw->Done(i); unidraw->Next(i)) {
IBEditor* iEd = (IBEditor*) unidraw->GetEditor(i);
ToolPanel* itoolpanel = iEd->GetToolPanel();
for (int i = 0; i < installed->Count(); i++) {
itoolpanel->Install(installed->GetName(i));
}
for (i = 0; i < removed->Count(); i++) {
itoolpanel->Uninstall(removed->GetName(i));
}
itoolpanel->Change();
}
}
}
boolean ToolsCmd::Reversible () { return false; }
/*****************************************************************************/
class CloneMapElem : public UMapElem {
public:
CloneMapElem(InteractorComp*);
virtual ~CloneMapElem();
virtual void* id();
virtual void* tag();
public:
InteractorComp* _orig;
InteractorComp* _clone;
};
class CloneMap : public UMap {
public:
CloneMap();
void Register(InteractorComp*);
InteractorComp* GetClone(InteractorComp*);
};
/*****************************************************************************/
CloneMapElem::CloneMapElem (InteractorComp* orig) {
Catalog* catalog = unidraw->GetCatalog();
ClassId id = orig->GetClassId();
_orig = orig;
_clone = (InteractorComp*) catalog->GetCreator()->Create(id);
_clone->Instantiate();
*_clone = *_orig;
}
CloneMapElem::~CloneMapElem () { delete _clone; }
void* CloneMapElem::id () { return (void*) _orig; }
void* CloneMapElem::tag () { return (void*) _clone; }
/*****************************************************************************/
CloneMap::CloneMap () { }
void CloneMap::Register (InteractorComp* orig) {
UMap::Register(new CloneMapElem(orig));
}
InteractorComp* CloneMap::GetClone(InteractorComp* orig) {
CloneMapElem* map = (CloneMapElem*) FindId((void*) orig);
return (InteractorComp*) map->tag();
}
/*****************************************************************************/
ClassId RelateCmd::GetClassId () { return RELATE_CMD; }
boolean RelateCmd::IsA (ClassId id){return RELATE_CMD==id || Command::IsA(id);}
RelateCmd::RelateCmd (
ControlInfo* c, InteractorComp* src, InteractorComp* dest
) : Command(c) {
_src = src;
_dest = dest;
_clonemap = new CloneMap;
}
RelateCmd::RelateCmd (
Editor* ed, InteractorComp* src, InteractorComp* dest
) : Command(ed) {
_src = src;
_dest = dest;
_clonemap = new CloneMap;
}
RelateCmd::~RelateCmd () { delete _clonemap; }
void RelateCmd::Execute () {
RecurRelate(_src, _dest);
_src->Propagate(this);
_dest->Propagate(this);
}
void RelateCmd::Unexecute() {
RecurUnrelate(_src, _dest);
_src->Unpropagate(this);
_dest->Unpropagate(this);
}
void RelateCmd::RecurRelate(InteractorComp* src, InteractorComp* dest) {
if (src != nil && dest != nil) {
if (dest->IsRelatableTo(src)) {
_clonemap->Register(dest);
_clonemap->Register(src);
dest->Relate(src);
_src->Interpret(this);
_dest->Interpret(this);
} else if (src->IsRelatableTo(dest)) {
_clonemap->Register(dest);
_clonemap->Register(src);
src->Relate(dest);
_src->Interpret(this);
_dest->Interpret(this);
} else if (src->IsAScene() && !dest->IsAScene()) {
Iterator i;
for (src->First(i); !src->Done(i); src->Next(i)) {
InteractorComp* kid = (InteractorComp*) src->GetComp(i);
RecurRelate(kid, dest);
}
} else if (dest->IsAScene() && !src->IsAScene()) {
Iterator i;
for (dest->First(i); !dest->Done(i); dest->Next(i)) {
InteractorComp* kid = (InteractorComp*) dest->GetComp(i);
RecurRelate(src, kid);
}
}
}
}
void RelateCmd::RecurUnrelate(InteractorComp* src, InteractorComp* dest) {
if (src != nil && dest != nil) {
if (dest->IsRelatableTo(src) || src->IsRelatableTo(dest)) {
InteractorComp* dclone = _clonemap->GetClone(dest);
InteractorComp* sclone = _clonemap->GetClone(src);
dest->Unrelate(dclone);
src->Unrelate(sclone);
_src->Uninterpret(this);
_dest->Uninterpret(this);
} else if (src->IsAScene() && !dest->IsAScene()) {
Iterator i;
for (src->First(i); !src->Done(i); src->Next(i)) {
InteractorComp* kid = (InteractorComp*) src->GetComp(i);
RecurUnrelate(kid, dest);
}
} else if (dest->IsAScene() && !src->IsAScene()) {
Iterator i;
for (dest->First(i); !dest->Done(i); dest->Next(i)) {
InteractorComp* kid = (InteractorComp*) dest->GetComp(i);
RecurUnrelate(src, kid);
}
}
}
}
/*****************************************************************************/
ClassId EditCmd::GetClassId () { return EDIT_CMD; }
boolean EditCmd::IsA (ClassId id) { return EDIT_CMD == id || Command::IsA(id);}
EditCmd::EditCmd (
ControlInfo* c, Clipboard* cb, const char* text
) : Command(c, cb) {
_oldtext = _newtext = nil;
_replacee = nil;
SetNewText(text);
}
EditCmd::EditCmd (
Editor* ed, Clipboard* cb, const char* text
) : Command(ed, cb) {
_oldtext = _newtext = nil;
_replacee = nil;
SetNewText(text);
}
EditCmd::EditCmd (
Editor* ed, Clipboard* cb, GraphicComp* replacee
) : Command(ed, cb) {
_oldtext = _newtext = nil;
_replacee = replacee;
}
EditCmd::~EditCmd() {
delete _oldtext;
delete _newtext;
delete _replacee;
}
Command* EditCmd::Copy () {
Command* newCmd = new EditCmd(CopyControlInfo());
InitCopy(newCmd);
return newCmd;
}
void EditCmd::SetOldText (const char* text) {
if (text != nil) {
delete _oldtext;
_oldtext = strnew(text);
}
}
void EditCmd::SetNewText (const char* text) {
if (text != nil) {
delete _newtext;
_newtext = strnew(text);
}
}
GraphicComp* EditCmd::SwapComp (GraphicComp* replacee) {
GraphicComp* tmp = _replacee;
_replacee = replacee;
return tmp;
}
/*****************************************************************************/
ClassId ReorderCmd::GetClassId () { return REORDER_CMD; }
boolean ReorderCmd::IsA (ClassId id) {
return REORDER_CMD==id || Command::IsA(id);
}
ReorderCmd::ReorderCmd (ControlInfo* c) : Command(c) {
_log = nil;
_executed = false;
}
ReorderCmd::ReorderCmd (Editor* ed) : Command(ed) {
_log = nil;
_executed = false;
}
ReorderCmd::~ReorderCmd () {
if (!_executed) {
delete _log;
}
}
Command* ReorderCmd::Copy () {
Command* copy = new ReorderCmd(CopyControlInfo());
InitCopy(copy);
return copy;
}
void ReorderCmd::Execute () {
_executed = true;
_log = new LogCmd;
GetEditor()->GetComponent()->Interpret(this);
}
void ReorderCmd::Unexecute() {
_executed = false;
GetEditor()->GetComponent()->Uninterpret(this);
}