|
|
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: 19780 (0x4d44)
Types: TextFile
Names: »ibvars.c«
└─⟦8648bda34⟧ Bits:30007244 EUUGD5_II: X11R5
└─⟦87c3ac0e0⟧ »./contrib-3/contrib-3.00«
└─⟦de8ce1454⟧
└─⟦this⟧ »contrib/lib/iv/src/bin/ibuild/ibvars.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 variables.
* $Header: /master/3.0/iv/src/bin/ibuild/RCS/ibvars.c,v 1.2 91/09/27 14:12:18 tang Exp $
*/
#include "ibclasses.h"
#include "ibinteractor.h"
#include "ibvars.h"
#include <Unidraw/catalog.h>
#include <Unidraw/unidraw.h>
#include <Unidraw/ulist.h>
#include <InterViews/button.h>
#include <InterViews/shape.h>
#include <OS/string.h>
#include <stream.h>
#include <string.h>
#include <stdlib.h>
/*****************************************************************************/
CanvasVar::CanvasVar (int w, int h) { _width = w; _height = h; }
void CanvasVar::SetSize (int w, int h) {
if (w != _width || h != _height) {
_width = w;
_height = h;
Notify();
}
}
StateVar& CanvasVar::operator = (StateVar& var) {
StateVar::operator=(var);
if (var.IsA(CANVAS_VAR)) {
CanvasVar* cvar = (CanvasVar*) &var;
SetSize(cvar->Width(), cvar->Height());
}
return *this;
}
boolean CanvasVar::operator != (StateVar& var) {
boolean nequal = true;
if (var.IsA(CANVAS_VAR)) {
CanvasVar* cvar = (CanvasVar*) &var;
if (Width() == cvar->Width() && Height() == cvar->Height()) {
nequal = false;
}
}
return nequal;
}
StateVar* CanvasVar::Copy () { return new CanvasVar(_width, _height); }
ClassId CanvasVar::GetClassId () { return CANVAS_VAR; }
boolean CanvasVar::IsA (ClassId id) {
return CANVAS_VAR == id || StateVar::IsA(id);
}
void CanvasVar::Read (istream& in) {
StateVar::Read(in);
in >> _width >> _height;
}
void CanvasVar::Write (ostream& out) {
StateVar::Write(out);
out << _width << " " << _height << " ";
}
/*****************************************************************************/
boolean IBNameVar::_unique;
int IBNameVar::_IBSerial;
/*****************************************************************************/
IBNameVar::IBNameVar (const char* name, boolean machgen ) : NameVar(name) {
_machgen = machgen;
}
StateVar* IBNameVar::Copy () {
IBNameVar* copy = new IBNameVar(GetName(), _machgen);
return copy;
}
ClassId IBNameVar::GetClassId () { return IBNAME_VAR; }
boolean IBNameVar::IsA (ClassId id) {
return IBNAME_VAR == id || NameVar::IsA(id);
}
StateVar& IBNameVar::operator = (StateVar& var) {
NameVar::operator=(var);
if (var.IsA(IBNAME_VAR)) {
IBNameVar* name = (IBNameVar*) &var;
_machgen = name->GetMachGen();
}
return *this;
}
void IBNameVar::GenNewName () {
const char* name = GetName();
if (name != nil && GetMachGen()) {
if (_unique) {
char Name[CHARBUFSIZE], tmp[CHARBUFSIZE];
strcpy(tmp, name);
if (*name == '_') {
strcpy(tmp, &name[1]);
}
char* trail = strrchr(tmp, '_');
if (trail != NULL) {
*trail = '\0';
}
sprintf(Name, "_%s_%i\0", tmp, GetSerial()++);
SetName(Name);
} else {
char* trail = strrchr(name, '_');
if (trail != NULL) {
String num_str(&trail[1]);
int sequence;
num_str.convert(sequence);
int& serial = GetSerial();
serial = max(++sequence, serial);
}
}
}
}
void IBNameVar::Read (istream& in) {
NameVar::Read(in);
in >> _machgen;
GenNewName();
}
void IBNameVar::Write (ostream& out) {
NameVar::Write(out);
out << " " << _machgen << " ";
}
/*****************************************************************************/
int InstanceNameVar::_iSerial;
/*****************************************************************************/
InstanceNameVar::InstanceNameVar (
const char* name, boolean machgen
) : IBNameVar(name, machgen) {}
InstanceNameVar::InstanceNameVar (IBNameVar* name) {
SetName(name->GetName());
SetMachGen(name->GetMachGen());
}
StateVar* InstanceNameVar::Copy () {
InstanceNameVar* copy = new InstanceNameVar(this);
return copy;
}
ClassId InstanceNameVar::GetClassId () { return INSTANCENAME_VAR; }
boolean InstanceNameVar::IsA (ClassId id) {
return INSTANCENAME_VAR == id || IBNameVar::IsA(id);
}
void InstanceNameVar::Read (istream& in) {
IBNameVar::Read(in);
if (GetMachGen()) {
char* number = strrchr(GetName(), '_') + 1;
_iSerial = (_iSerial > atoi(number)) ? _iSerial : atoi(number) +1;
}
}
/*****************************************************************************/
SharedName::SharedName (
const char* name, boolean machgen
) : IBNameVar(name, machgen) {}
/*****************************************************************************/
MemberSharedName::MemberSharedName (
const char* name, boolean export, boolean machgen
) : SharedName(name, machgen) {
_export = export;
}
StateVar* MemberSharedName::Copy () {
MemberSharedName* copy = new MemberSharedName(
GetName(), GetExport(), GetMachGen()
);
return copy;
}
ClassId MemberSharedName::GetClassId () { return MEMBERSHAREDNAME; }
boolean MemberSharedName::IsA (ClassId id) {
return MEMBERSHAREDNAME == id || SharedName::IsA(id);
}
StateVar& MemberSharedName::operator = (StateVar& var) {
IBNameVar::operator = (var);
if (var.IsA(MEMBERSHAREDNAME)) {
MemberSharedName* mvar = (MemberSharedName*) &var;
_export = mvar->GetExport();
}
return *this;
}
void MemberSharedName::Read (istream& in) {
IBNameVar::Read(in);
in >> _export;
if (GetMachGen()) {
char* number = strrchr(GetName(), '_') + 1;
_mSerial = (_mSerial > atoi(number)) ? _mSerial : atoi(number) + 1;
}
}
void MemberSharedName::Write (ostream& out) {
IBNameVar::Write(out);
out << " " << _export << " ";
}
/*****************************************************************************/
int MemberSharedName::_mSerial;
/*****************************************************************************/
MemberNameVar::MemberNameVar (
const char* name, boolean export, boolean machgen
) {
_msharedname = nil;
if (name != nil) {
_msharedname = new MemberSharedName(name, export, machgen);
_msharedname->ref();
}
}
MemberNameVar::MemberNameVar (MemberSharedName* msharedname) {
_msharedname = msharedname;
_msharedname->ref();
}
MemberNameVar::~MemberNameVar () {
_msharedname->unref();
}
StateVar* MemberNameVar::Copy () {
MemberNameVar* copy = new MemberNameVar(_msharedname);
return copy;
}
ClassId MemberNameVar::GetClassId () { return MEMBERNAME_VAR; }
boolean MemberNameVar::IsA (ClassId id) {
return MEMBERNAME_VAR == id || StateVar::IsA(id);
}
StateVar& MemberNameVar::operator = (StateVar& var) {
StateVar::operator=(var);
if (var.IsA(MEMBERNAME_VAR)) {
MemberNameVar* mvar = (MemberNameVar*) &var;
SetMemberSharedName(mvar->GetMemberSharedName());
}
return *this;
}
void MemberNameVar::SetMemberSharedName (MemberSharedName* msharedname) {
if (msharedname != nil) {
msharedname->ref();
}
if (_msharedname != nil && _msharedname != msharedname) {
_msharedname->unref();
}
_msharedname = msharedname;
}
void MemberNameVar::Read (istream& in) {
StateVar::Read(in);
Catalog* catalog = unidraw->GetCatalog();
if (_msharedname != nil) {
_msharedname->unref();
}
_msharedname = (MemberSharedName*) catalog->ReadStateVar(in);
_msharedname->ref();
}
void MemberNameVar::Write (ostream& out) {
StateVar::Write(out);
unidraw->GetCatalog()->WriteStateVar(_msharedname, out);
}
/*****************************************************************************/
int ButtonSharedName::_bsSerial;
/*****************************************************************************/
ButtonSharedName::ButtonSharedName(
const char* name, const char* func, boolean machgen
) : SharedName(name, machgen) {
_initial = 0;
_export = true;
if (func != nil) {
_func = strnew(func);
} else {
_func = strnew("");
}
}
ButtonSharedName::~ButtonSharedName () {
delete _func;
}
void ButtonSharedName::SetFuncName(const char* func) {
delete _func;
if (func != nil) {
_func = strnew(func);
}
}
StateVar* ButtonSharedName::Copy () {
ButtonSharedName* copy = new ButtonSharedName(
GetName(), _func, GetMachGen()
);
copy->SetInitial(_initial);
copy->SetExport(_export);
return copy;
}
StateVar& ButtonSharedName::operator = (StateVar& var) {
IBNameVar::operator=(var);
if (var.IsA(BUTTONSHAREDNAME)) {
ButtonSharedName* name = (ButtonSharedName*) &var;
_initial = name->GetInitial();
_export = name->GetExport();
SetFuncName(name->GetFuncName());
}
return *this;
}
ClassId ButtonSharedName::GetClassId () { return BUTTONSHAREDNAME; }
boolean ButtonSharedName::IsA (ClassId id) {
return BUTTONSHAREDNAME == id || IBNameVar::IsA(id);
}
void ButtonSharedName::Read (istream& in) {
IBNameVar::Read(in);
in >> _initial >> _export;
_func = unidraw->GetCatalog()->ReadString(in);
}
void ButtonSharedName::Write (ostream& out) {
IBNameVar::Write(out);
out << " " << _initial << " " << _export;
unidraw->GetCatalog()->WriteString(_func, out);
}
/*****************************************************************************/
ButtonStateVar::ButtonStateVar (const char* name) {
Init();
_bsharedname = new ButtonSharedName(name);
_bsharedname->ref();
_showsetting = true;
}
ButtonStateVar::~ButtonStateVar () {
_bsharedname->unref();
}
StateVar* ButtonStateVar::Copy () {
return new ButtonStateVar(_bsharedname, _setting);
}
ClassId ButtonStateVar::GetClassId () { return BUTTONSTATE_VAR; }
boolean ButtonStateVar::IsA (ClassId id) {
return BUTTONSTATE_VAR == id || StateVar::IsA(id);
}
void ButtonStateVar::Init () {
_setting = 0;
_showsetting = true;
_bsharedname = nil;
}
ButtonStateVar::ButtonStateVar (ButtonSharedName* bsharedname, int setting) {
Init();
_setting = setting;
_bsharedname = bsharedname;
_bsharedname->ref();
}
StateVar& ButtonStateVar::operator = (StateVar& var) {
StateVar::operator=(var);
if (var.IsA(BUTTONSTATE_VAR)) {
ButtonStateVar* bvar = (ButtonStateVar*) &var;
_setting = bvar->GetSetting();
SetButtonSharedName(bvar->GetButtonSharedName());
}
return *this;
}
void ButtonStateVar::SetSetting (int setting) {
_setting = setting;
}
void ButtonStateVar::SetButtonSharedName (ButtonSharedName* bsharedname) {
if (bsharedname != nil) {
bsharedname->ref();
}
if (_bsharedname != nil && _bsharedname != bsharedname) {
_bsharedname->unref();
}
_bsharedname = bsharedname;
}
void ButtonStateVar::Read (istream& in) {
Catalog* catalog = unidraw->GetCatalog();
if (_bsharedname != nil) {
_bsharedname->unref();
}
StateVar::Read(in);
_bsharedname = (ButtonSharedName*) catalog->ReadStateVar(in);
_bsharedname->ref();
in >> _setting >> _showsetting;
}
void ButtonStateVar::Write (ostream& out) {
Catalog* catalog = unidraw->GetCatalog();
StateVar::Write(out);
catalog->WriteStateVar(_bsharedname, out);
out << " " << _setting << " " << _showsetting << "\n";
}
/*****************************************************************************/
IBShape::IBShape () {
hnat = vnat = false;
hstr = vstr = false;
hshr = vshr = false;
}
IBShape& IBShape::operator = (IBShape& ishape) {
width = ishape.width;
height = ishape.height;
hshrink = ishape.hshrink;
hstretch = ishape.hstretch;
vshrink = ishape.vshrink;
vstretch = ishape.vstretch;
return *this;
}
IBShape* IBShape::Copy () {
IBShape* copy = new IBShape;
*copy = *this;
return copy;
}
/*****************************************************************************/
ShapeVar::ShapeVar (IBShape* s) {
_ibshape = s;
}
ShapeVar::~ShapeVar () { delete _ibshape; }
void ShapeVar::SetShape (IBShape* s) {
if (s != _ibshape) {
delete _ibshape;
_ibshape = s;
Notify();
}
}
StateVar& ShapeVar::operator = (StateVar& var) {
if (var.IsA(SHAPE_VAR)) {
StateVar::operator=(var);
ShapeVar* svar = (ShapeVar*) &var;
IBShape* varshape = svar->GetShape();
if (varshape == nil) {
SetShape(varshape);
} else {
if (_ibshape == nil) {
_ibshape = new IBShape;
}
*_ibshape = *varshape;
Notify();
}
}
return *this;
}
StateVar* ShapeVar::Copy () {
ShapeVar* copy = new ShapeVar;
*copy = *this;
return copy;
}
ClassId ShapeVar::GetClassId () { return SHAPE_VAR; }
boolean ShapeVar::IsA (ClassId id) { return SHAPE_VAR==id ||StateVar::IsA(id);}
void ShapeVar::Read (istream& in) {
StateVar::Read(in);
char lookahead;
in >> lookahead;
if (lookahead != '~') {
in.putback(lookahead);
_ibshape = new IBShape;
in >> _ibshape->width >> _ibshape->height;
in >> _ibshape->hstretch >> _ibshape->vstretch;
in >> _ibshape->hshrink >> _ibshape->vshrink;
in >> _ibshape->aspect >> _ibshape->hunits >> _ibshape->vunits;
in >> _ibshape->hnat >> _ibshape->vnat;
in >> _ibshape->hstr >> _ibshape->vstr;
in >> _ibshape->hshr >> _ibshape->vshr;
}
}
void ShapeVar::Write (ostream& out) {
StateVar::Write(out);
if (_ibshape == nil) {
out << "~ ";
} else {
out << _ibshape->width << " " << _ibshape->height << " ";
out << _ibshape->hstretch << " " << _ibshape->vstretch << " ";
out << _ibshape->hshrink << " " << _ibshape->vshrink << " ";
out << _ibshape->aspect << " ";
out << _ibshape->hunits << " " << _ibshape->vunits << " ";
out << _ibshape->hnat << " " << _ibshape->vnat << " ";
out << _ibshape->hstr << " " << _ibshape->vstr << " ";
out << _ibshape->hshr << " " << _ibshape->vshr << " ";
}
}
/*****************************************************************************/
TrackNameVar::TrackNameVar (const char* n) : IBNameVar(n, true) {}
StateVar* TrackNameVar::Copy () {
return new TrackNameVar(GetName());
}
void TrackNameVar::GenNewName () {}
ClassId TrackNameVar::GetClassId () { return PROCNAME_VAR; }
boolean TrackNameVar::IsA (ClassId id) {
return PROCNAME_VAR == id || IBNameVar::IsA(id);
}
/*****************************************************************************/
int SubclassNameVar::_subclassSerial;
/*****************************************************************************/
SubclassNameVar::SubclassNameVar (
const char* baseclass, boolean machgen, boolean abstract
) : IBNameVar(baseclass, machgen) {
_baseClass = nil;
if (baseclass != nil) {
SetBaseClass(baseclass);
}
_abstract = abstract;
}
SubclassNameVar::~SubclassNameVar() {
delete _baseClass;
}
boolean SubclassNameVar::IsSubclass() {
return (strcmp(GetName(), _baseClass) != 0);
}
StateVar& SubclassNameVar::operator = (StateVar& var) {
IBNameVar::operator=(var);
if (var.IsA(SUBCLASSNAME_VAR)) {
SubclassNameVar* sVar = (SubclassNameVar*) &var;
SetBaseClass(sVar->GetBaseClass());
SetAbstract(sVar->IsAbstract());
}
return *this;
}
void SubclassNameVar::SetBaseClass(const char* name) {
delete _baseClass;
_baseClass = strnew(name);
}
StateVar* SubclassNameVar::Copy () {
SubclassNameVar* copy = new SubclassNameVar(
_baseClass, GetMachGen(), IsAbstract()
);
copy->SetName(GetName());
return copy;
}
ClassId SubclassNameVar::GetClassId () { return SUBCLASSNAME_VAR; }
boolean SubclassNameVar::IsA (ClassId id) {
return SUBCLASSNAME_VAR == id || IBNameVar::IsA(id);
}
void SubclassNameVar::Read (istream& in) {
delete _baseClass;
_baseClass = unidraw->GetCatalog()->ReadString(in);
IBNameVar::Read(in);
in >> _abstract;
}
void SubclassNameVar::Write (ostream& out) {
unidraw->GetCatalog()->WriteString(_baseClass, out);
IBNameVar::Write(out);
out << _abstract << " ";
}
/*****************************************************************************/
FBrowserVar::FBrowserVar (const char* dir, const char* textfilter) {
_dir = nil;
_textfilter = nil;
if (dir != nil) {
SetDirName(dir);
}
if (textfilter != nil) {
SetTextFilter(textfilter);
}
}
FBrowserVar::~FBrowserVar() {
delete _dir;
delete _textfilter;
}
StateVar& FBrowserVar::operator = (StateVar& var) {
StateVar::operator=(var);
if (var.IsA(FBROWSER_VAR)) {
FBrowserVar* fVar = (FBrowserVar*) &var;
SetDirName(fVar->GetDirName());
SetTextFilter(fVar->GetTextFilter());
}
return *this;
}
void FBrowserVar::SetDirName(const char* dir) {
delete _dir;
_dir = strnew(dir);
}
void FBrowserVar::SetTextFilter(const char* textfilter) {
delete _textfilter;
_textfilter = strnew(textfilter);
}
StateVar* FBrowserVar::Copy () {
FBrowserVar* copy = new FBrowserVar(_dir, _textfilter);
return copy;
}
ClassId FBrowserVar::GetClassId () { return FBROWSER_VAR; }
boolean FBrowserVar::IsA (ClassId id) {
return FBROWSER_VAR == id || StateVar::IsA(id);
}
void FBrowserVar::Read (istream& in) {
StateVar::Read(in);
delete _dir;
delete _textfilter;
_dir = unidraw->GetCatalog()->ReadString(in);
_textfilter = unidraw->GetCatalog()->ReadString(in);
}
void FBrowserVar::Write (ostream& out) {
StateVar::Write(out);
unidraw->GetCatalog()->WriteString(_dir, out);
unidraw->GetCatalog()->WriteString(_textfilter, out);
}
/*****************************************************************************/
BooleanStateVar::BooleanStateVar (boolean bstate) { _bstate = bstate; }
StateVar* BooleanStateVar::Copy () {
BooleanStateVar* copy = new BooleanStateVar(_bstate);
return copy;
}
StateVar& BooleanStateVar::operator = (StateVar& var) {
StateVar::operator=(var);
if (var.IsA(BOOLEANSTATE_VAR)) {
BooleanStateVar* bvar = (BooleanStateVar*) &var;
SetBooleanState(bvar->GetBooleanState());
}
return *this;
}
ClassId BooleanStateVar::GetClassId () { return BOOLEANSTATE_VAR; }
boolean BooleanStateVar::IsA (ClassId id) {
return BOOLEANSTATE_VAR == id || StateVar::IsA(id);
}
void BooleanStateVar::Read (istream& in) {
StateVar::Read(in);
in >> _bstate;
}
void BooleanStateVar::Write (ostream& out) {
StateVar::Write(out);
out << _bstate << " ";
}