|
|
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: 36220 (0x8d7c)
Types: TextFile
Names: »ibvarviews.c«
└─⟦8648bda34⟧ Bits:30007244 EUUGD5_II: X11R5
└─⟦87c3ac0e0⟧ »./contrib-3/contrib-3.00«
└─⟦de8ce1454⟧
└─⟦this⟧ »contrib/lib/iv/src/bin/ibuild/ibvarviews.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 state variable views.
* $Header: /master/3.0/iv/src/bin/ibuild/RCS/ibvarviews.c,v 1.2 91/09/27 14:12:22 tang Exp $
*/
#include "ibadjuster.h"
#include "ibbutton.h"
#include "ibclasses.h"
#include "ibcmds.h"
#include "ibcomp.h"
#include "ibdialogs.h"
#include "ibed.h"
#include "ibmenu.h"
#include "ibgrblock.h"
#include "ibvars.h"
#include "ibvarviews.h"
#include <Unidraw/iterator.h>
#include <Unidraw/ulist.h>
#include <InterViews/box.h>
#include <InterViews/border.h>
#include <InterViews/button.h>
#include <InterViews/deck.h>
#include <InterViews/frame.h>
#include <InterViews/glue.h>
#include <InterViews/message.h>
#include <InterViews/matcheditor.h>
#include <InterViews/scene.h>
#include <InterViews/scroller.h>
#include <InterViews/scrollbar.h>
#include <InterViews/strbrowser.h>
#include <InterViews/strchooser.h>
#include <InterViews/tray.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*****************************************************************************/
static char buf[CHARBUFSIZE];
/*****************************************************************************/
static const char* IntToString (int i) {
sprintf(buf, "%d", i);
return strnew(buf);
}
static Message* IntToMsg (int i) {
sprintf(buf, "%d", i);
return new Message(buf);
}
inline Interactor* PaddedFrame (Interactor* i) {
return new Frame(new MarginFrame(i, 2));
}
inline Interactor* RightJustified (Interactor* i) {
return new HBox(new HGlue(0, 0, 500), i);
}
inline Interactor* LeftJustified (Interactor* i) {
return new HBox(i, new HGlue);
}
/*****************************************************************************/
IBVarView::IBVarView (
StateVar* stateVar, GraphicComp* icomp
) : StateVarView(stateVar) {
_icomp = icomp;
}
boolean IBVarView::ChangedSubject(const char*& errors) {
errors = nil;
return true;
}
void IBVarView::SetAffectedStates(UList* ilist) {
StateVar* subject = GetSubject();
UList* target = ilist->Find(subject);
if (target == nil) {
ilist->Append(new UList(subject));
}
}
/*****************************************************************************/
CanvasVarView::CanvasVarView (CanvasVar* canvasVar) : IBVarView(canvasVar){}
void CanvasVarView::Init () {
CanvasVar* cvar = (CanvasVar*) _subject;
const char* string = "Canvas Dimensions (width x height): %d x %d";
sprintf(buf, string, cvar->Width(), cvar->Height());
Insert(new HBox(new Message(buf, Left), new HGlue));
}
/*****************************************************************************/
class InfoButtonState : public ButtonState {
public:
InfoButtonState(int, BSDialog* = nil, IBEditor* = nil);
virtual void Notify ();
private:
BSDialog* _dialog;
IBEditor* _ed;
};
InfoButtonState::InfoButtonState (
int i, BSDialog* dialog, IBEditor* ed
) : ButtonState(i) {
_dialog = dialog;
_ed = ed;
}
void InfoButtonState::Notify () {
ButtonState::Notify();
int value;
GetValue(value);
if (value == 1) {
if (_dialog->Init()) {
_ed->InsertDialog(_dialog);
while(_dialog->Accept() && !_dialog->ChangeBS());
_ed->RemoveDialog(_dialog);
}
SetValue(0);
}
}
/*****************************************************************************/
ButtonStateVarView::ButtonStateVarView (
ButtonStateVar* bsv, ButtonState* bs, GraphicComp* icomp, IBEditor* ibed
) : IBVarView(bsv, icomp) {
_showsetting = bsv->DisplaySetting();
_bsdialog = new BSDialog(this);
_ibed = ibed;
_namechange = false;
_bsname = (ButtonSharedName*) bsv->GetButtonSharedName()->Copy();
Insert(Interior(bs));
}
ButtonStateVarView::~ButtonStateVarView () {
delete _bsdialog;
delete _bsname;
}
static ButtonSharedName* FindFirstConflict(UList* ulist, const char* name) {
ButtonSharedName* bsname = nil;
for (UList* i = ulist->First(); i != ulist->End(); i = i->Next()) {
StateVar* state = (StateVar*) (*i)();
if (state->IsA(BUTTONSHAREDNAME)) {
ButtonSharedName* bstmp = (ButtonSharedName*) state;
if (strcmp(bstmp->GetName(), name) == 0) {
bsname = (ButtonSharedName*) state;
break;
}
}
}
return bsname;
}
void ButtonStateVarView::SetAffectedStates(UList* ilist) {
IBVarView::SetAffectedStates(ilist);
ButtonStateVar* button = (ButtonStateVar*) GetSubject();
ButtonSharedName* bsname = button->GetButtonSharedName();
ilist->Append(new UList(bsname));
}
boolean ButtonStateVarView::ChangedSubject (const char*& errors) {
errors = nil;
if (*_bs->Text() != '\0') {
ButtonStateVar* button = (ButtonStateVar*) GetSubject();
ButtonSharedName* bsname = button->GetButtonSharedName();
GetFirewallCmd firewallCmd(_icomp);
firewallCmd.Execute();
GetConflictCmd conflictCmd(firewallCmd.GetFirewall(), _bs->Text());
conflictCmd.Execute();
UList* ulist = conflictCmd.GetConflict();
for (UList* i = ulist->First(); i != ulist->End(); i = i->Next()) {
StateVar* state = (StateVar*) (*i)();
if (state->IsA(BUTTONSHAREDNAME)) {
ButtonSharedName* bstmp = (ButtonSharedName*) state;
if (strcmp(bstmp->GetFuncName(), _bs->Text()) == 0) {
sprintf(
buf,"ButtonState name %s has been used",
_bs->Text()
);
errors = buf;
return false;
}
} else if (!state->IsA(INSTANCENAME_VAR)) {
sprintf(
buf,"ButtonState name %s has been used", _bs->Text()
);
errors = buf;
return false;
}
}
if (_showsetting && _setting->Text() != '\0') {
int setting = atoi(_setting->Text());
button->SetSetting(setting);
}
if (strcmp(_bsname->GetName(), bsname->GetName()) == 0) {
bsname->SetInitial(_bsname->GetInitial());
bsname->SetExport(_bsname->GetExport());
bsname->SetFuncName(_bsname->GetFuncName());
if (strcmp(_bs->Text(), bsname->GetName()) != 0) {
bsname = FindFirstConflict(ulist, _bs->Text());
if (bsname != nil) {
button->SetButtonSharedName(bsname);
} else {
bsname = new ButtonSharedName(_bs->Text(), "", false);
button->SetButtonSharedName(bsname);
}
}
} else {
if (strcmp(_bs->Text(), _bsname->GetName()) != 0) {
if (_namechange) {
bsname->SetMachGen(false);
bsname->SetName(_bsname->GetName());
bsname->SetInitial(_bsname->GetInitial());
bsname->SetExport(_bsname->GetExport());
bsname->SetFuncName(_bsname->GetFuncName());
}
bsname = FindFirstConflict(ulist, _bs->Text());
if (bsname != nil) {
button->SetButtonSharedName(bsname);
} else {
bsname = new ButtonSharedName(_bs->Text(), "", false);
button->SetButtonSharedName(bsname);
}
} else {
if (_namechange) {
bsname->SetMachGen(false);
bsname->SetName(_bsname->GetName());
bsname->SetInitial(_bsname->GetInitial());
bsname->SetExport(_bsname->GetExport());
bsname->SetFuncName(_bsname->GetFuncName());
} else {
bsname = FindFirstConflict(ulist, _bs->Text());
if (bsname != nil) {
button->SetButtonSharedName(bsname);
} else {
bsname = new ButtonSharedName(_bs->Text(), "", false);
button->SetButtonSharedName(bsname);
}
bsname->SetMachGen(false);
bsname->SetInitial(_bsname->GetInitial());
bsname->SetExport(_bsname->GetExport());
bsname->SetFuncName(_bsname->GetFuncName());
}
}
}
} else {
sprintf(buf, "Null ButtonState name is invalid");
errors = buf;
}
return errors == nil;
}
void ButtonStateVarView::Init () {
ButtonStateVar* subj = (ButtonStateVar*) GetSubject();
int setting = subj->GetSetting();
ButtonSharedName* bsname = subj->GetButtonSharedName();
if (bsname != nil) {
_bs->Message(bsname->GetName());
}
if (_showsetting) {
_setting->Message(IntToString(setting));
}
}
Interactor* ButtonStateVarView::Interior (ButtonState* bs) {
const char* sample = "999";
const int gap = round(.1*cm);
_bs = new MatchEditor(bs, "a rather long name");
_bs->Match("%[_a-zA-Z]%[_a-zA-Z0-9_]", true);
Message* nameMsg = new Message("ButtonState Name: ");
PushButton* pbutton = new PushButton(
"ButtonState...", new InfoButtonState(0, _bsdialog, _ibed), 1
);
Interactor* bsname= PaddedFrame(_bs);
HBox* namer = new HBox(
bsname,
new HGlue(2*gap, 0, 0),
pbutton
);
namer->Align(Center);
Tray* t = new Tray;
t->HBox(t, nameMsg, namer, t);
if (_showsetting) {
_setting = new MatchEditor(bs, sample);
_setting->Match("%d", true);
Interactor* setter = new Frame(new MarginFrame(_setting, 2));
Message* settingMsg = new Message("Setting Value: ");
t->HBox(
t,settingMsg,new HGlue(2*gap,0,0),setter,new HGlue(0,0,100*hfil),t
);
t->Align(VertCenter, settingMsg, setter);
t->Align(Left, nameMsg, settingMsg);
t->Align(Left, namer, setter);
t->VBox(t, namer, new VGlue(gap), setter, new VGlue(gap), t);
t->VBox(
t, new VGlue(gap), nameMsg, new VGlue(gap),
settingMsg, new VGlue(gap), t
);
} else {
t->VBox(t, new VGlue(gap), nameMsg, new VGlue(gap), t);
}
return t;
}
/*****************************************************************************/
CtrlStateVarView::CtrlStateVarView (
ButtonStateVar* bsv, ButtonState* bs, GraphicComp* icomp, IBEditor* ibed
) : ButtonStateVarView(bsv, bs, icomp, ibed) {
delete _bsdialog;
_bsdialog = new CtrlDialog(this);
Insert(Interior(bs));
}
Interactor* CtrlStateVarView::Interior (ButtonState* bs) {
const char* sample = "999";
const int gap = round(.1*cm);
_bs = new MatchEditor(bs, "a rather long name");
_bs->Match("%[_a-zA-Z]%[_a-zA-Z0-9_]", true);
Message* nameMsg = new Message("ControlState Name: ");
PushButton* pbutton = new PushButton(
"ControlState...", new InfoButtonState(0, _bsdialog, _ibed), 1
);
Interactor* bsname= PaddedFrame(_bs);
HBox* namer = new HBox(
bsname,
new HGlue(2*gap, 0, 0),
pbutton
);
namer->Align(Center);
Tray* t = new Tray;
t->HBox(t, nameMsg, namer, t);
t->Align(VertCenter, nameMsg, namer);
return t;
}
/*****************************************************************************/
InstanceNameVarView::InstanceNameVarView (
InstanceNameVar* inv, ButtonState* bs, GraphicComp* icomp,
const char* msg
) : IBVarView(inv, icomp) {
_msg = strnew(msg);
Insert(Interior(bs));
}
InstanceNameVarView::~InstanceNameVarView () { delete _msg; }
boolean InstanceNameVarView::ChangedSubject (const char*&) {
const char* name = _name->Text();
InstanceNameVar* iname = (InstanceNameVar*) GetSubject();
if (strcmp(iname->GetName(), name) != 0) {
iname->SetName(name);
iname->SetMachGen(false);
}
return true;
}
void InstanceNameVarView::Init () {
InstanceNameVar* iname = (InstanceNameVar*) GetSubject();
const char* name = iname->GetName();
if( name != nil) {
_name->Message(name);
}
}
Interactor* InstanceNameVarView::Interior (ButtonState* bs) {
const int gap = round(.1*cm);
HBox* hbox = new HBox(
new Message(_msg),
PaddedFrame(_name = new MatchEditor(bs, "a rather long name"))
);
hbox->Align(Center);
_name->Match("%[_a-zA-Z]%[_a-zA-Z0-9_.]", true);
return hbox;
}
/*****************************************************************************/
class NameChooserDialog : public StringChooser {
public:
NameChooserDialog(
ButtonState*, int rows, int cols, const char*, const char*
);
void Append(const char*);
private:
Interactor* AddScroller(Interactor* i);
Interactor* Interior(const char*);
};
NameChooserDialog::NameChooserDialog(
ButtonState* bs, int rows, int cols, const char* sample, const char* title
) : StringChooser(bs, rows, cols, sample) {
Insert(Interior(title));
}
void NameChooserDialog::Append(const char* string) {
_browser->Append(string);
}
Interactor* NameChooserDialog::AddScroller(Interactor* i) {
return new HBox(
new MarginFrame(i, 2),
new VBorder,
new VScrollBar(i)
);
}
Interactor* NameChooserDialog::Interior(const char* title) {
const int space = round(.5*cm);
HBox* titleblock = new HBox(
new MarginFrame(new class Message(title)),
new HGlue
);
return new MarginFrame(
new VBox(
titleblock,
new VGlue(space, 0),
new Frame(new MarginFrame(_sedit, 2)),
new VGlue(space, 0),
new Frame(AddScroller(_browser)),
new VGlue(space, 0),
new HBox(
new VGlue(space, 0),
new HGlue,
new PushButton("Cancel", state, '\007'),
new HGlue(space, 0),
new PushButton(" OK ", state, '\r')
)
), space, space/2, 0
);
}
/*****************************************************************************/
class NameChooserState : public ButtonState {
public:
NameChooserState(int, NameChooserView*);
virtual void Notify ();
private:
NameChooserView* _chooserView;
};
NameChooserState::NameChooserState (
int i, NameChooserView* chooserView
) : ButtonState(i) {
_chooserView = chooserView;
}
void NameChooserState::Notify () {
ButtonState::Notify();
int value;
GetValue(value);
if (value == 1) {
_chooserView->Accept();
SetValue(0);
}
}
/*****************************************************************************/
NameChooserView::NameChooserView (
IBNameVar* nvar, ButtonState* bs,
IBEditor* ibed, const char* title, const char* msg
) : IBVarView(nvar, nil) {
_msg = strnew(msg);
_chooser = new NameChooserDialog(
new ButtonState, 10, 24, nvar->GetName(), title
);
_ibed = ibed;
Insert(Interior(bs));
}
NameChooserView::~NameChooserView () {
delete _chooser;
delete _msg;
}
void NameChooserView::Append(const char* msg) {
_chooser->Append(msg);
}
void NameChooserView::Accept () {
boolean ok;
_ibed->InsertDialog(_chooser);
ok = _chooser->Accept();
_ibed->RemoveDialog(_chooser);
if (ok) {
_name->Message(_chooser->Choice());
}
}
boolean NameChooserView::ChangedSubject (const char*&) {
const char* name = _name->Text();
IBNameVar* chooser = (IBNameVar*) GetSubject();
if (name != nil) {
chooser->SetName(name);
chooser->SetMachGen(false);
}
return true;
}
void NameChooserView::Init () {
IBNameVar* chooser = (IBNameVar*) GetSubject();
const char* name = chooser->GetName();
if( name != nil) {
_name->Message(name);
}
}
Interactor* NameChooserView::Interior (ButtonState* bs) {
const int gap = round(.1*cm);
HBox* hbox = new HBox(
new Message(_msg),
PaddedFrame(_name = new MatchEditor(bs, "a rather long name")),
new HGlue(2*gap, 0, 0),
new PushButton("Library...", new NameChooserState(0, this), 1)
);
hbox->Align(Center);
return hbox;
}
/*****************************************************************************/
MemberNameVarView::MemberNameVarView (
MemberNameVar* inv, ButtonState* bs, GraphicComp* icomp, const char* msg
) : IBVarView(inv, icomp) {
MemberNameVar* iname = (MemberNameVar*) GetSubject();
_export = new ButtonState((int) iname->GetExport());
_msg = strnew(msg);
Insert(Interior(bs));
}
MemberNameVarView::~MemberNameVarView () { delete _msg; }
void MemberNameVarView::SetAffectedStates(UList* ilist) {
IBVarView::SetAffectedStates(ilist);
MemberNameVar* mnamer = (MemberNameVar*) GetSubject();
MemberSharedName* msnamer = mnamer->GetMemberSharedName();
ilist->Append(new UList(msnamer));
}
boolean MemberNameVarView::ChangedSubject (const char*& errors) {
errors = nil;
int value;
const char* name = _name->Text();
_export->GetValue(value);
MemberNameVar* mnamer = (MemberNameVar*) GetSubject();
MemberSharedName* msnamer = mnamer->GetMemberSharedName();
if (name != nil && *name != '\0') {
GetFirewallCmd firewallCmd(_icomp);
firewallCmd.Execute();
GetConflictCmd conflictCmd(firewallCmd.GetFirewall(), name);
conflictCmd.Execute();
UList* ulist = conflictCmd.GetConflict();
for(UList* i = ulist->First(); i != ulist->End(); i = i->Next()) {
StateVar* state = (StateVar*) (*i)();
if (
!state->IsA(INSTANCENAME_VAR) && state != msnamer
) {
sprintf(
buf,
"Member name \"%s\" already exists.",
name
);
errors = buf;
return false;
}
}
msnamer->SetExport(value);
if (strcmp(msnamer->GetName(), name) != 0) {
msnamer->SetName(name);
msnamer->SetMachGen(false);
}
errors = nil;
} else {
sprintf(buf, "Null member name is invalid");
errors = buf;
}
return errors == nil;
}
void MemberNameVarView::Init () {
MemberNameVar* mnamer = (MemberNameVar*) GetSubject();
const char* name = mnamer->GetName();
if( name != nil) {
_name->Message(name);
}
}
Interactor* MemberNameVarView::Interior (ButtonState* bs) {
const int gap = round(.1*cm);
HBox* hbox = new HBox(
new Message(_msg),
PaddedFrame(_name = new MatchEditor(bs, "a rather long name")),
new HGlue(2*gap, 0, 0),
new CheckBox("Export", _export, 1, 0)
);
hbox->Align(Center);
_name->Match("%[_a-zA-Z]%[_a-zA-Z0-9_]", true);
return hbox;
}
/*****************************************************************************/
TrackNameVarView::TrackNameVarView (
TrackNameVar* nameVar, ButtonState* bs, GraphicComp* icomp
) : IBVarView(nameVar, icomp) {
Insert(Interior(bs));
}
boolean TrackNameVarView::ChangedSubject (const char*& errors) {
errors = nil;
const char* name = _name->Text();
TrackNameVar* proc = (TrackNameVar*) GetSubject();
if (name != nil) {
GetFirewallCmd firewallCmd(_icomp);
firewallCmd.Execute();
GetConflictCmd conflictCmd(firewallCmd.GetFirewall(), name);
conflictCmd.Execute();
UList* cl = conflictCmd.GetConflict();
for (UList* i = cl->First(); i != cl->End(); i = i->Next()) {
StateVar* state = (StateVar*) (*i)();
if (state->IsA(BUTTONSHAREDNAME)) {
ButtonSharedName* bstmp = (ButtonSharedName*) state;
if (strcmp(bstmp->GetName(), name) == 0) {
sprintf(
buf,
"A ButtonState name \"%s\" already exists.",
name
);
errors = buf;
return false;
}
} else if (
!state->IsA(PROCNAME_VAR) && !state->IsA(INSTANCENAME_VAR)
) {
sprintf(
buf,
"A member or class name \"%s\" already exists.",
name
);
errors = buf;
return false;
}
}
proc->SetName(name);
proc->SetMachGen(false);
}
return errors == nil;
}
void TrackNameVarView::Init () {
TrackNameVar* proc = (TrackNameVar*) GetSubject();
const char* name = proc->GetName();
if( name != nil) {
_name->Message(name);
}
}
Interactor* TrackNameVarView::Interior (ButtonState* bs) {
TrackNameVar* proc = (TrackNameVar*) GetSubject();
HBox* hbox = new HBox(
new Message("Member function: "),
PaddedFrame(_name = new MatchEditor(bs, "a rather long name"))
);
hbox->Align(Center);
_name->Match("%[_a-zA-Z]%[_a-zA-Z0-9_]", true);
return hbox;
}
/*****************************************************************************/
ShapeVarView::ShapeVarView (ShapeVar* s, ButtonState* bs) : IBVarView(s) {
if (bs != nil) {
Insert(Interior(bs));
}
}
boolean ShapeVarView::ChangedSubject (const char*&) {
ShapeVar* subj = (ShapeVar*) GetSubject();
IBShape* subshape = subj->GetShape();
subshape->width =
(subshape->hnat) ? atoi(_width->Text()) : subshape->width;
subshape->height =
(subshape->vnat) ? atoi(_height->Text()) : subshape->height;
subshape->hshrink =
(subshape->hshr) ? atoi(_hshrink->Text()) : subshape->hshrink;
subshape->vshrink =
(subshape->vshr) ? atoi(_vshrink->Text()) : subshape->vshrink;
subshape->hstretch =
(subshape->hstr) ? atoi(_hstretch->Text()) : subshape->hstretch;
subshape->vstretch =
(subshape->vstr) ? atoi(_vstretch->Text()) : subshape->vstretch;
return true;
}
void ShapeVarView::Init () {
ShapeVar* subj = (ShapeVar*) GetSubject();
IBShape* ibshape = subj->GetShape();
if (ibshape->hnat) {
_width->Message(IntToString(ibshape->width));
}
if (ibshape->vnat) {
_height->Message(IntToString(ibshape->height));
}
if (ibshape->hstr) {
_hstretch->Message(IntToString(ibshape->hstretch));
}
if (ibshape->vstr) {
_vstretch->Message(IntToString(ibshape->vstretch));
}
if (ibshape->hshr) {
_hshrink->Message(IntToString(ibshape->hshrink));
}
if (ibshape->vshr) {
_vshrink->Message(IntToString(ibshape->vshrink));
}
}
Interactor* ShapeVarView::Interior (ButtonState* bs) {
Interactor* interior = nil;
Interactor* natw, *nath;
Interactor* hshr, *vshr;
Interactor* hstr, *vstr;
const char* sample = "9999999999";
ShapeVar* subj = (ShapeVar*) GetSubject();
IBShape* ibshape = subj->GetShape();
if (ibshape->hnat) {
_width = new MatchEditor(bs, sample);
_width->Match("%d", true);
natw = PaddedFrame(_width);
} else {
natw = IntToMsg(ibshape->width);
}
if (ibshape->vnat) {
_height = new MatchEditor(bs, sample);
_height->Match("%d", true);
nath = PaddedFrame(_height);
} else {
nath = IntToMsg(ibshape->height);
}
if (ibshape->hshr) {
_hshrink = new MatchEditor(bs, sample);
_hshrink->Match("%d", true);
hshr = PaddedFrame(_hshrink);
} else {
hshr = IntToMsg(ibshape->hshrink);
}
if (ibshape->vshr) {
_vshrink = new MatchEditor(bs, sample);
_vshrink->Match("%d", true);
vshr = PaddedFrame(_vshrink);
} else {
vshr = IntToMsg(ibshape->vshrink);
}
if (ibshape->hstr) {
_hstretch = new MatchEditor(bs, sample);
_hstretch->Match("%d", true);
hstr = PaddedFrame(_hstretch);
} else {
hstr = IntToMsg(ibshape->hstretch);
}
if (ibshape->vstr) {
_vstretch = new MatchEditor(bs, sample);
_vstretch->Match("%d", true);
vstr = PaddedFrame(_vstretch);
} else {
vstr = IntToMsg(ibshape->vstretch);
}
return Interior(natw, nath, hshr, vshr, hstr, vstr);
}
Interactor* ShapeVarView::Interior (
Interactor* natw, Interactor* nath,
Interactor* hshr, Interactor* vshr,
Interactor* hstr, Interactor* vstr
) {
natw = RightJustified(natw); nath = LeftJustified(nath);
hshr = RightJustified(hshr); vshr = LeftJustified(vshr);
hstr = RightJustified(hstr); vstr = LeftJustified(vstr);
const int gap = round(.1*cm);
Message* natSize, *shrink, *stretch;
GetMessages(natSize, shrink, stretch);
Message* xnat = new Message(" x ");
Message* xshr = new Message(" x ");
Message* xstr = new Message(" x ");
Tray* t = new Tray;
t->HBox(t, natSize, natw, xnat); t->HBox(xnat, nath, new HGlue, t);
t->HBox(t, shrink, hshr, xshr); t->HBox(xshr, vshr, new HGlue, t);
t->HBox(t, stretch, hstr, xstr); t->HBox(xstr, vstr, new HGlue, t);
t->Align(Left, natw, hshr, hstr);
t->Align(Right, natw, hshr, hstr);
t->Align(Left, nath, vshr, vstr);
t->Align(Right, nath, vshr, vstr);
t->Align(VertCenter, natSize, natw, xnat, nath);
t->Align(VertCenter, shrink, hshr, xshr, vshr);
t->Align(VertCenter, stretch, hstr, xstr, vstr);
t->VBox(t, natw, new VGlue(gap), hshr, new VGlue(gap), hstr, t);
t->VBox(t, nath, new VGlue(gap), vshr, new VGlue(gap), vstr, t);
return new HBox(new VBox(t, new VGlue), new HGlue);
}
void ShapeVarView::GetMessages(Message*& m1, Message*& m2, Message*& m3) {
m1 = new Message("Natural Size (width x height): ");
m2 = new Message("Shrinkability (horiz x vert): ");
m3 = new Message("Stretchability (horiz x vert): ");
}
/*****************************************************************************/
MarginVarView::MarginVarView (
ShapeVar* s, ButtonState* bs
) : ShapeVarView(s, bs) {
Insert(Interior(bs));
}
void MarginVarView::GetMessages(Message*& m1, Message*& m2, Message*& m3) {
m1 = new Message("Natural Margins (horiz x vert): ");
m2 = new Message("Shrinkability (horiz x vert): ");
m3 = new Message("Stretchability (horiz x vert): ");
}
/*****************************************************************************/
RelatedVarView::RelatedVarView (
MemberNameVar* sv, ButtonState* bs, GraphicComp* icomp, const char* msg
) : IBVarView(sv, icomp) {
_msg = strnew(msg);
Insert(Interior(bs));
}
RelatedVarView::~RelatedVarView () { delete _msg; }
boolean RelatedVarView::ChangedSubject (const char*& errors) {
errors = nil;
const char* name = _name->Text();
if (name != nil && *name != '\0') {
GetFirewallCmd firewallCmd(_icomp);
firewallCmd.Execute();
GetConflictCmd conflictCmd(firewallCmd.GetFirewall(), name);
conflictCmd.Execute();
UList* cl = conflictCmd.GetConflict();
if (cl->IsEmpty()) {
sprintf(
buf, "No interactor member named \"%s\" exists.", name
);
errors = buf;
} else {
UList* i = cl->First();
StateVar* msnamer = (StateVar*) (*i)();
if (!msnamer->IsA(MEMBERSHAREDNAME)) {
sprintf(
buf, "\"%s\" is not a defined member name.", name
);
errors = buf;
} else {
MemberNameVar* mnamer = (MemberNameVar*) GetSubject();
InteractorComp* icomp = (InteractorComp*) _icomp;
InteractorComp* ctarget = conflictCmd.GetCTarget();
if (ctarget != nil && icomp->IsRelatableTo(ctarget)) {
mnamer->SetMemberSharedName((MemberSharedName*) msnamer);
} else {
const char* iname = icomp->GetMemberNameVar()->GetName();
sprintf(
buf, "\"%s\" is not relatable with \"%s\".",name,iname
);
errors = buf;
}
}
}
} else if (*name == '\0') {
MemberNameVar* mnamer = (MemberNameVar*) GetSubject();
mnamer->SetMemberSharedName(new MemberSharedName("", false, false));
}
return errors == nil;
}
void RelatedVarView::Init () {
MemberNameVar* mnamer = (MemberNameVar*) GetSubject();
const char* name = mnamer->GetName();
if( name != nil) {
_name->Message(name);
}
}
Interactor* RelatedVarView::Interior (ButtonState* bs) {
const int gap = round(.1*cm);
HBox* hbox = new HBox(
new Message(_msg),
PaddedFrame(_name = new MatchEditor(bs, "a rather long name"))
);
_name->Match("%[_a-zA-Z]%[_a-zA-Z0-9_]", true);
hbox->Align(Center);
return hbox;
}
/*****************************************************************************/
SubclassNameVarView::SubclassNameVarView (
SubclassNameVar* inv, ButtonState* bs, GraphicComp* icomp
) : IBVarView(inv, icomp) {
Insert(Interior(bs));
}
boolean SubclassNameVarView::ChangedSubject (const char*& errors) {
errors = nil;
const char* subclass = _subclass->Text();
SubclassNameVar* subvar = (SubclassNameVar*) GetSubject();
const char* orig = subvar->GetName();
const char* baseclass = subvar->GetBaseClass();
if (strcmp(orig, subclass) != 0) {
if (*subclass != '\0') {
if (strcmp(subclass, baseclass) != 0) {
GetConflictCmd conflictCmd(
(GraphicComp*) _icomp->GetRoot(), subclass, true
);
conflictCmd.Execute();
UList* cl = conflictCmd.GetConflict();
for(UList* i = cl->First(); i != cl->End(); i = i->Next()) {
StateVar* state = (StateVar*) (*i)();
if (state->IsA(SUBCLASSNAME_VAR) && state != subvar) {
SubclassNameVar* svar = (SubclassNameVar*) state;
if (strcmp(svar->GetBaseClass(), baseclass) != 0) {
sprintf(
buf,
"\"%s\" has been used with a different base class.",
subclass
);
errors = buf;
return false;
}
}
}
GetFirewallCmd firewallCmd(_icomp);
firewallCmd.Execute();
GetConflictCmd sconflict(firewallCmd.GetFirewall(),subclass);
sconflict.Execute();
cl = sconflict.GetConflict();
for(i = cl->First(); i != cl->End(); i = i->Next()) {
StateVar* state = (StateVar*) (*i)();
if (
!state->IsA(INSTANCENAME_VAR) &&
!state->IsA(SUBCLASSNAME_VAR) &&
state != subvar
) {
sprintf(
buf,
"A member or procedure name \"%s\" already exists.",
subclass
);
errors = buf;
return false;
}
}
} else if (subvar->IsAbstract()) {
sprintf(buf, "Base class %s is abstract!!", subclass);
errors = buf;
return false;
}
subvar->SetMachGen(false);
subvar->SetName(subclass);
errors = nil;
} else {
sprintf(buf, "Null subclass name is invalid");
errors = buf;
}
}
return errors == nil;
}
void SubclassNameVarView::Init () {
SubclassNameVar* subvar = (SubclassNameVar*) GetSubject();
const char* subclass = subvar->GetName();
if( subclass != nil) {
_subclass->Message(subclass);
}
}
Interactor* SubclassNameVarView::Interior (ButtonState* bs) {
const int gap = round(.1*cm);
SubclassNameVar* subvar = (SubclassNameVar*) GetSubject();
const char* baseclass = subvar->GetBaseClass();
HBox* hbox1 = new HBox(
new Message("Class Name: "),
PaddedFrame(
_subclass = new MatchEditor(bs, "a rather long name")
)
);
HBox* hbox2 = new HBox(
new Message("Base Class Name: "),
new Message(baseclass),
new HGlue
);
VBox* vbox = new VBox(hbox1, new VGlue(2, 0, 0), hbox2);
hbox1->Align(Center);
hbox2->Align(Center);
_subclass->Match("%[_a-zA-Z]%[_a-zA-Z0-9_]", true);
return vbox;
}
/*****************************************************************************/
BooleanStateVarView::BooleanStateVarView (
BooleanStateVar* bstate, const char* message
) : IBVarView(bstate) {
_bstate = new ButtonState(bstate->GetBooleanState());
_message = strnew(message);
Insert(Interior());
}
BooleanStateVarView::~BooleanStateVarView () {
delete _message;
}
boolean BooleanStateVarView::ChangedSubject (const char*&) {
int value;
_bstate->GetValue(value);
BooleanStateVar* bstate = (BooleanStateVar*) GetSubject();
bstate->SetBooleanState(value);
return true;
}
Interactor* BooleanStateVarView::Interior () {
HBox* hbox = new HBox(
new CheckBox(_message, _bstate, 1, 0),
new HGlue
);
hbox->Align(Center);
return hbox;
}
/*****************************************************************************/
FBrowserVarView::FBrowserVarView (
FBrowserVar* fbVar, ButtonState* bs
) : IBVarView(fbVar) {
Insert(Interior(bs));
}
FBrowserVarView::~FBrowserVarView () {
delete _dir;
delete _textfilter;
}
boolean FBrowserVarView::ChangedSubject (const char*&) {
const char* dir = _dir->Text();
const char* textfilter = _textfilter->Text();
FBrowserVar* fbVar = (FBrowserVar*) GetSubject();
fbVar->SetDirName(dir);
fbVar->SetTextFilter(textfilter);
return true;
}
void FBrowserVarView::Init () {
FBrowserVar* fbVar = (FBrowserVar*) GetSubject();
_dir->Message(fbVar->GetDirName());
_textfilter->Message(fbVar->GetTextFilter());
}
Interactor* FBrowserVarView::Interior (ButtonState* bs) {
const int gap = round(.1*cm);
FBrowserVar* fbVar = (FBrowserVar*) GetSubject();
_dir = new MatchEditor(bs, "a rather long name");
_textfilter = new MatchEditor(bs, "a rather long name");
Tray* t = new Tray;
Interactor* dir = PaddedFrame(_dir);
Interactor* textfilter = PaddedFrame(_textfilter);
Interactor* mdir = new Message("Directory: ");
Interactor* mtextfilter = new Message("Text Filter: ");
t->HBox(t, mdir, dir, t);
t->HBox(t, mtextfilter, textfilter, t);
t->VBox(
t, new VGlue(gap), mdir, new VGlue(gap), mtextfilter,
new VGlue(gap), t
);
t->VBox(
t, new VGlue(gap), dir, new VGlue(gap), textfilter,
new VGlue(gap), t
);
t->Align(VertCenter, mdir, dir);
t->Align(VertCenter, mtextfilter, textfilter);
t->Align(Left, dir, textfilter);
return t;
}