|
|
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: 17852 (0x45bc)
Types: TextFile
Names: »ibbutton.c«
└─⟦8648bda34⟧ Bits:30007244 EUUGD5_II: X11R5
└─⟦87c3ac0e0⟧ »./contrib-3/contrib-3.00«
└─⟦de8ce1454⟧
└─⟦this⟧ »contrib/lib/iv/src/bin/ibuild/ibbutton.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.
*/
/*
* Button component definitions.
* $Header: /master/3.0/iv/src/bin/ibuild/RCS/ibbutton.c,v 1.2 91/09/27 14:07:17 tang Exp $
*/
#include "ibbutton.h"
#include "ibclasses.h"
#include "ibcmds.h"
#include "ibdialogs.h"
#include "ibed.h"
#include "ibinteractor.h"
#include "ibvars.h"
#include "ibvarviews.h"
#include <Unidraw/catalog.h>
#include <Unidraw/iterator.h>
#include <Unidraw/manips.h>
#include <Unidraw/ulist.h>
#include <Unidraw/unidraw.h>
#include <Unidraw/viewer.h>
#include <Unidraw/Commands/edit.h>
#include <Unidraw/Tools/tool.h>
#include <InterViews/bitmap.h>
#include <InterViews/painter.h>
#include <InterViews/shape.h>
#include <InterViews/Bitmaps/radioMask.bm>
#include <InterViews/Bitmaps/radio.bm>
#include <stream.h>
#include <string.h>
#include <stdlib.h>
/*****************************************************************************/
static const int pad = 3;
static const int sep = 3;
/*****************************************************************************/
Bitmap* RadioButtonGraphic::radioMask;
Bitmap* RadioButtonGraphic::radioPlain;
/*****************************************************************************/
ButtonComp::ButtonComp (MessageGraphic* g) : MessageComp(g) {
if (g != nil) {
GetClassNameVar()->SetName(g->GetClassName());
GetClassNameVar()->SetBaseClass(g->GetClassName());
}
_bsVar = nil;
}
ButtonComp::~ButtonComp () {
delete _bsVar;
}
ClassId ButtonComp::GetClassId () { return BUTTON_COMP; }
boolean ButtonComp::IsA (ClassId id) {
return BUTTON_COMP == id || MessageComp::IsA(id);
}
StateVar* ButtonComp::GetState (const char* name) {
StateVar* stateVar = nil;
if (strcmp(name, "ButtonStateVar") == 0) {
stateVar = _bsVar;
} else if (strcmp(name, "AlignStateVar") != 0) {
stateVar = MessageComp::GetState(name);
}
return stateVar;
}
void ButtonComp::SetState (const char* name, StateVar* stateVar) {
if (strcmp(name, "ButtonStateVar") == 0) {
ButtonStateVar* bsVar = (ButtonStateVar*) stateVar;
*_bsVar = *bsVar;
} else {
MessageComp::SetState(name, stateVar);
}
}
InteractorComp& ButtonComp::operator = (InteractorComp& comp) {
InteractorComp::operator = (comp);
StateVar* state = comp.GetButtonStateVar();
if (state != nil) {
ButtonStateVar* bsVar = (ButtonStateVar*) state;
if (_bsVar != nil) {
*_bsVar = *bsVar;
}
}
return *this;
}
boolean ButtonComp::IsRelatableTo (InteractorComp* comp) {
boolean ok = false;
if (comp->GetButtonStateVar() != nil) {
ok = true;
}
return ok;
}
void ButtonComp::Relate (InteractorComp* comp) {
*this = *comp;
int setting = _bsVar->GetSetting();
_bsVar->SetSetting(++setting);
}
void ButtonComp::Instantiate () {
InteractorComp::Instantiate();
if (_bsVar == nil) {
_bsVar = new ButtonStateVar();
MessageGraphic* mgr = GetMessageGraphic();
if (mgr != nil && mgr->GetClassId() == CHECKBOX_GRAPHIC) {
_bsVar->SetSetting(1);
}
_bsVar->GenNewName();
}
}
void ButtonComp::Interpret(Command* cmd) {
if (cmd->IsA(GETCONFLICT_CMD)) {
GetConflictCmd* gcmd = (GetConflictCmd*) cmd;
const char* cname = gcmd->GetCName();
MessageComp::Interpret(cmd);
UList* conflictlist = gcmd->GetConflict();
ButtonSharedName* bsnamer = _bsVar->GetButtonSharedName();
const char* buttonname = bsnamer->GetName();
const char* funcname = bsnamer->GetFuncName();
if (strcmp(buttonname, cname) == 0 || strcmp(funcname, cname) == 0) {
conflictlist->Append(new UList(bsnamer));
}
} else if (!cmd->IsA(ALIGN_CMD)) {
MessageComp::Interpret(cmd);
}
}
void ButtonComp::Uninterpret(Command* cmd) {
if (!cmd->IsA(ALIGN_CMD)) {
MessageComp::Uninterpret(cmd);
}
}
void ButtonComp::Read (istream& in) {
MessageComp::Read(in);
delete _bsVar;
_bsVar = (ButtonStateVar*) unidraw->GetCatalog()->ReadStateVar(in);
}
void ButtonComp::Write (ostream& out) {
MessageComp::Write(out);
unidraw->GetCatalog()->WriteStateVar(_bsVar, out);
}
/*****************************************************************************/
ButtonView::ButtonView (ButtonComp* subj) : MessageView(subj) { }
ButtonComp* ButtonView::GetButtonComp () { return (ButtonComp*) GetSubject(); }
ClassId ButtonView::GetClassId () { return BUTTON_VIEW; }
boolean ButtonView::IsA (ClassId id) {
return BUTTON_VIEW == id || MessageView::IsA(id);
}
Manipulator* ButtonView::CreateManipulator (
Viewer* v, Event& e, Transformer* rel, Tool* tool
) {
Manipulator* m = nil;
if (tool->IsA(GRAPHIC_COMP_TOOL)) {
m = InteractorView::CreateManipulator(v, e, rel, tool);
} else {
m = MessageView::CreateManipulator(v, e, rel, tool);
}
return m;
}
Command* ButtonView::InterpretManipulator (Manipulator* m) {
Command* cmd = nil;
Tool* tool = m->GetTool();
if (tool->IsA(GRAPHIC_COMP_TOOL)) {
cmd = InteractorView::InterpretManipulator(m);
} else {
cmd = MessageView::InterpretManipulator(m);
}
return cmd;
}
InfoDialog* ButtonView::GetInfoDialog () {
IBEditor* ibed = (IBEditor*) GetViewer()->GetEditor();
InfoDialog* info = MessageView::GetInfoDialog();
ButtonState* state = info->GetState();
ButtonComp* bcomp = GetButtonComp();
ButtonStateVar* bsVar = GetButtonComp()->GetButtonStateVar();
info->Include(new ButtonStateVarView(bsVar, state, bcomp, ibed));
return info;
}
/*****************************************************************************/
ClassId ButtonCode::GetClassId () { return BUTTON_CODE; }
boolean ButtonCode::IsA(ClassId id){return BUTTON_CODE==id||CodeView::IsA(id);}
ButtonCode::ButtonCode (ButtonComp* subj) : CodeView(subj) { }
ButtonComp* ButtonCode::GetButtonComp () { return (ButtonComp*) GetSubject(); }
boolean ButtonCode::Definition (ostream& out) {
boolean ok = true;
if (
_emitProperty || _emitBSDecls ||
_emitBSInits || _emitInstanceDecls || _emitHeaders ||
_emitFunctionDecls || _emitFunctionInits || _emitClassHeaders
) {
return CodeView::Definition(out);
} else if (_emitForward) {
if (_scope) {
ok = ok && CodeView::Definition(out);
ButtonStateVar* bsVar = GetButtonComp()->GetButtonStateVar();
if (
bsVar->GetExport() && !_bsdeclslist->Search("ButtonState")
) {
_bsdeclslist->Append("ButtonState");
out << "class ButtonState;\n";
}
}
} else if (_emitExpHeader) {
InteractorComp* icomp = GetIntComp();
MemberNameVar* mnamer = icomp->GetMemberNameVar();
SubclassNameVar* snamer = icomp->GetClassNameVar();
if (!snamer->IsSubclass()) {
if (_scope) {
ButtonStateVar* bsVar = icomp->GetButtonStateVar();
if (
(mnamer->GetExport() || bsVar->GetExport()) &&
!_namelist->Search("button")
) {
_namelist->Append("button");
out << "#include <InterViews/button.h>\n";
}
}
} else {
ok = ok && CodeView::Definition(out);
}
} else if (_emitCorehHeader) {
InteractorComp* icomp = GetIntComp();
SubclassNameVar* snamer = icomp->GetClassNameVar();
const char* subclass = snamer->GetName();
if (snamer->IsSubclass() && strcmp(subclass, _classname) == 0) {
if (!_namelist->Search("button")) {
_namelist->Append("button");
out << "#include <InterViews/button.h>\n";
}
}
} else if (_emitInstanceInits) {
InteractorComp* icomp = GetIntComp();
const char* mname = icomp->GetMemberNameVar()->GetName();
if (!_instancelist->Find((void*) mname)) {
_instancelist->Append(new UList((void*)mname));
ButtonComp* button = GetButtonComp();
BeginInstantiate(out);
MessageGraphic* graphic = button->GetMessageGraphic();
const char* text = graphic->GetText();
ButtonStateVar* bsVar = button->GetButtonStateVar();
int setting = bsVar->GetSetting();
const char* classname = icomp->GetClassNameVar()->GetBaseClass();
out << "(";
InstanceName(out);
out << "\"" << text << "\", " << bsVar->GetName();
out << ", " << setting;
if (strcmp(classname, "CheckBox") == 0) {
out << ", " << bsVar->GetInitial();
}
out << ")";
EndInstantiate(out);
}
} else if (
_emitCoreDecls || _emitCoreInits || _emitClassDecls || _emitClassInits
) {
ok = ok && CodeView::Definition(out);
} else if (_emitMain) {
ok = ok && CodeView::Definition(out);
}
return out.good() && ok;
}
boolean ButtonCode::CoreConstDecls(ostream& out) {
const char* classname =GetIntComp()->GetClassNameVar()->GetBaseClass();
out << "(const char*, const char*, ButtonState*, int";
if (strcmp(classname, "CheckBox") == 0) {
out << ", int";
}
out << ");\n";
return out.good();
}
boolean ButtonCode::CoreConstInits(ostream& out) {
const char* classname =GetIntComp()->GetClassNameVar()->GetBaseClass();
out <<"(\n const char* name, const char* text, ButtonState* bs, int s";
if (strcmp(classname, "CheckBox") == 0) {
out << ", int i\n) : " << classname << "(name, text, bs, s, i) {\n";
out << " perspective = new Perspective;\n";
out << "}\n\n";
} else {
out << "\n) : " << classname << "(name, text, bs, s) {\n";
out << " perspective = new Perspective;\n";
out << "}\n\n";
}
return out.good();
}
boolean ButtonCode::ConstDecls(ostream& out) {
const char* classname =GetIntComp()->GetClassNameVar()->GetBaseClass();
out << "(const char*, const char*, ButtonState*, int";
if (strcmp(classname, "CheckBox") == 0) {
out << ", int";
}
out << ");\n";
return out.good();
}
boolean ButtonCode::ConstInits(ostream& out) {
const char* classname =GetIntComp()->GetClassNameVar()->GetBaseClass();
char coreclass[CHARBUFSIZE];
GetCoreClassName(coreclass);
out <<"(\n const char* name, const char* text, ButtonState* bs, int s";
if (strcmp(classname, "CheckBox") == 0) {
out << ", int i\n) : " << coreclass << "(name, text, bs, s, i) {}\n\n";
} else {
out << "\n) : " << coreclass << "(name, text, bs, s) {}\n\n";
}
return out.good();
}
boolean ButtonCode::EmitIncludeHeaders(ostream& out) {
SubclassNameVar* snamer = GetIntComp()->GetClassNameVar();
if (!snamer->IsSubclass() && !_namelist->Search("button")) {
_namelist->Append("button");
out << "#include <InterViews/button.h> \n";
}
return out.good();
}
/*****************************************************************************/
PushButtonGraphic::PushButtonGraphic (
const char* text, CanvasVar* c, Graphic* g
) : MessageGraphic(text, c, g) { }
void PushButtonGraphic::Natural (int& w, int& h) {
FullGraphic gs;
totalGS(gs);
PSFont* font = gs.GetFont();
w = font->Width(GetText()) + font->Width(" ");
h = font->Height() + 2*pad;
}
Graphic* PushButtonGraphic::Copy () {
return new PushButtonGraphic(GetText(), nil, this);
}
const char* PushButtonGraphic::GetClassName () { return "PushButton"; }
ClassId PushButtonGraphic::GetClassId () { return PUSHBUTTON_GRAPHIC; }
void PushButtonGraphic::GetTextPosition (Coord& l, Coord& b, const Font* f) {
Coord xmax, ymax;
if (GetCanvasVar() == nil) {
Natural(xmax, ymax);
} else {
xmax = GetCanvasVar()->xmax();
}
l = (xmax + 1 - f->Width(GetText()))/2;
b = pad;
}
void PushButtonGraphic::draw (Canvas* c, Graphic* gs) {
Coord xmax, ymax;
if (GetCanvasVar() == nil) {
Natural(xmax, ymax);
} else {
xmax = GetCanvasVar()->xmax();
ymax = GetCanvasVar()->ymax();
}
update(gs);
_p->ClearRect(c, 0, 0, xmax, ymax);
int r = min(10*pixels, min(xmax+1, ymax+1)/6);
Coord x[16], y[16];
x[0] = 0; y[0] = r;
x[1] = 0; y[1] = r + r;
x[2] = 0; y[2] = ymax - r - r;
x[3] = 0; y[3] = ymax - r;
x[4] = r; y[4] = ymax;
x[5] = r + r; y[5] = ymax;
x[6] = xmax - r - r; y[6] = ymax;
x[7] = xmax - r; y[7] = ymax;
x[8] = xmax; y[8] = ymax - r;
x[9] = xmax; y[9] = ymax - r - r;
x[10] = xmax; y[10] = r + r;
x[11] = xmax; y[11] = r;
x[12] = xmax - r; y[12] = 0;
x[13] = xmax - r - r; y[13] = 0;
x[14] = r + r; y[14] = 0;
x[15] = r; y[15] = 0;
Coord tx, ty;
GetTextPosition(tx, ty, _p->GetFont());
_p->SetColors(gs->GetBgColor(), gs->GetFgColor());
_p->FillRect(c, 0, 0, xmax, ymax);
_p->SetColors(gs->GetFgColor(), gs->GetBgColor());
_p->ClosedBSpline(c, x, y, 16);
_p->Text(c, GetText(), tx, ty);
}
/*****************************************************************************/
RadioButtonGraphic::RadioButtonGraphic (
const char* text, CanvasVar* c, Graphic* g
) : MessageGraphic(text, c, g) {
if (radioMask == nil) {
radioMask = new Bitmap(
radio_mask_bits, radio_mask_width, radio_mask_height
);
radioMask->Reference();
radioPlain = new Bitmap(
radio_plain_bits, radio_plain_width, radio_plain_height
);
radioPlain->Reference();
}
}
void RadioButtonGraphic::Natural (int& w, int& h) {
FullGraphic gs;
totalGS(gs);
PSFont* font = gs.GetFont();
h = font->Height();
w = font->Width(GetText()) + h + sep;
}
void RadioButtonGraphic::GetTextPosition (Coord& l, Coord& b, const Font* f) {
int h = f->Height();
int r = radio_plain_width;
l = r + sep;
Coord xmax, ymax;
if (GetCanvasVar() == nil) {
Natural(xmax, ymax);
} else {
ymax = GetCanvasVar()->ymax();
}
b = (ymax + 1 - h) / 2;
}
Graphic* RadioButtonGraphic::Copy () {
return new RadioButtonGraphic(GetText(), nil, this);
}
const char* RadioButtonGraphic::GetClassName () { return "RadioButton"; }
ClassId RadioButtonGraphic::GetClassId () { return RADIOBUTTON_GRAPHIC; }
void RadioButtonGraphic::draw (Canvas* c, Graphic* gs) {
Coord xmax, ymax;
if (GetCanvasVar() == nil) {
Natural(xmax, ymax);
} else {
xmax = GetCanvasVar()->xmax();
ymax = GetCanvasVar()->ymax();
}
update(gs);
_p->ClearRect(c, 0, 0, xmax, ymax);
Coord tx, ty;
GetTextPosition(tx, ty, _p->GetFont());
_p->Text(c, GetText(), tx, ty);
Coord x = 0;
Coord y = (ymax+1 - radio_plain_height)/2;
_p->Stencil(c, x, y, radioPlain, radioMask);
}
/*****************************************************************************/
CheckBoxGraphic::CheckBoxGraphic (
const char* text, CanvasVar* c, Graphic* g
) : MessageGraphic(text, c, g) { }
void CheckBoxGraphic::Natural (int& w, int& h) {
FullGraphic gs;
totalGS(gs);
PSFont* font = gs.GetFont();
h = font->Height();
w = font->Width(GetText()) + h + sep;
}
Graphic* CheckBoxGraphic::Copy () {
return new CheckBoxGraphic(GetText(), nil, this);
}
const char* CheckBoxGraphic::GetClassName () { return "CheckBox"; }
ClassId CheckBoxGraphic::GetClassId () { return CHECKBOX_GRAPHIC; }
inline int HalfRadioButtonSize (int h) { return round(.4*h); }
inline int HalfCheckBoxSize (int h) { return round(.4*h); }
void CheckBoxGraphic::GetTextPosition (Coord& l, Coord& b, const Font* f) {
int h = f->Height();
int t = HalfCheckBoxSize(h);
l = 2*t + sep;
Coord xmax, ymax;
if (GetCanvasVar() == nil) {
Natural(xmax, ymax);
} else {
ymax = GetCanvasVar()->ymax();
}
b = (ymax + 1 - h) / 2;
}
void CheckBoxGraphic::draw (Canvas* c, Graphic* gs) {
Coord xmax, ymax;
if (GetCanvasVar() == nil) {
Natural(xmax, ymax);
} else {
xmax = GetCanvasVar()->xmax();
ymax = GetCanvasVar()->ymax();
}
update(gs);
_p->ClearRect(c, 0, 0, xmax, ymax);
int h = _p->GetFont()->Height();
int t = HalfCheckBoxSize(h);
Coord tx, ty;
GetTextPosition(tx, ty, _p->GetFont());
_p->Text(c, GetText(), tx, ty);
Coord cx = t;
Coord cy = (ymax + 1)/2;
Coord left = cx - t;
Coord right = cx + t;
Coord bottom = cy - t;
Coord top = cy + t;
_p->Rect(c, left, bottom, right, top);
}