|
|
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: 14492 (0x389c)
Types: TextFile
Names: »ibstrbrowser.c«
└─⟦8648bda34⟧ Bits:30007244 EUUGD5_II: X11R5
└─⟦87c3ac0e0⟧ »./contrib-3/contrib-3.00«
└─⟦de8ce1454⟧
└─⟦this⟧ »contrib/lib/iv/src/bin/ibuild/ibstrbrowser.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.
*/
#include "ibclasses.h"
#include "ibcmds.h"
#include "ibed.h"
#include "ibdialogs.h"
#include "ibmessage.h"
#include "ibrubrect.h"
#include "ibstrbrowser.h"
#include "ibtools.h"
#include "ibvars.h"
#include "ibvarviews.h"
#include <Unidraw/catalog.h>
#include <Unidraw/clipboard.h>
#include <Unidraw/manips.h>
#include <Unidraw/ulist.h>
#include <Unidraw/unidraw.h>
#include <Unidraw/viewer.h>
#include <Unidraw/Commands/edit.h>
#include <Unidraw/Commands/macro.h>
#include <Unidraw/Tools/tool.h>
#include <InterViews/brush.h>
#include <InterViews/event.h>
#include <InterViews/painter.h>
#include <InterViews/rubrect.h>
#include <InterViews/shape.h>
#include <InterViews/transformer.h>
#include <string.h>
#include <stream.h>
/*****************************************************************************/
StrBrowserComp::StrBrowserComp (StrBrowserGraphic* g) : ButtonComp(g) {
_uniqueSel = nil;
}
StrBrowserComp::~StrBrowserComp () {
delete _uniqueSel;
}
ClassId StrBrowserComp::GetClassId () { return STRBROWSER_COMP; }
boolean StrBrowserComp::IsA (ClassId id) {
return STRBROWSER_COMP == id || ButtonComp::IsA(id);
}
StrBrowserGraphic* StrBrowserComp::GetStrBrowserGraphic () {
return (StrBrowserGraphic*) GetGraphic();
}
void StrBrowserComp::Reconfig () {
Shape* shape = GetShapeVar()->GetShape();
StrBrowserGraphic* g = GetStrBrowserGraphic();
int w, h, rows, cols;
g->Natural(w, h);
g->GetRowsCols(rows, cols);
shape->Rect(w, h);
shape->Rigid(hfil, hfil, h - h/rows, vfil);
GetShapeVar()->Notify();
}
void StrBrowserComp::Instantiate() {
if (_instanceNameVar == nil) {
ButtonComp::Instantiate();
GetMemberNameVar()->SetExport(true);
GetButtonStateVar()->HideSetting();
_uniqueSel = new BooleanStateVar(true);
} else {
ButtonComp::Instantiate();
}
}
StateVar* StrBrowserComp::GetState (const char* name) {
StateVar* stateVar = nil;
if (strcmp(name, "UniqueSel") == 0) {
stateVar = _uniqueSel;
} else {
stateVar = ButtonComp::GetState(name);
}
return stateVar;
}
void StrBrowserComp::SetState (const char* name, StateVar* stateVar) {
if (strcmp(name, "UniqueSel") == 0) {
_uniqueSel = (BooleanStateVar*) stateVar;
} else {
ButtonComp::SetState(name, stateVar);
}
}
void StrBrowserComp::Read (istream& in) {
ButtonComp::Read(in);
delete _uniqueSel;
_uniqueSel = (BooleanStateVar*) unidraw->GetCatalog()->ReadStateVar(in);
}
void StrBrowserComp::Write (ostream& out) {
ButtonComp::Write(out);
unidraw->GetCatalog()->WriteStateVar(_uniqueSel, out);
}
/*****************************************************************************/
StrBrowserComp* StrBrowserView::GetStrBrowserComp() {
return (StrBrowserComp*) GetSubject();
}
StrBrowserView::StrBrowserView (StrBrowserComp* subj) : ButtonView(subj) { }
ClassId StrBrowserView::GetClassId () { return STRBROWSER_VIEW; }
boolean StrBrowserView::IsA (ClassId id) {
return STRBROWSER_VIEW == id || ButtonView::IsA(id);
}
Manipulator* StrBrowserView::CreateManipulator (
Viewer* v, Event& e, Transformer* rel, Tool* tool
) {
Rubberband* rub = nil;
Manipulator* m = nil;
Coord l, b, r, t;
int ixcon, iycon;
l = 0, b = 0, r = 1, t = 1;
rel->TransformRect(l, b, r, t);
ixcon = r-l, iycon = t-b;
if (tool->IsA(IBGRAPHIC_COMP_TOOL)) {
m = InteractorView::CreateManipulator(v, e, rel, tool);
} else if (tool->IsA(GRAPHIC_COMP_TOOL)) {
rub = new ConstrainRect(
nil, nil, e.x, e.y, e.x, e.y, 0, 0, ixcon, iycon
);
m = new DragManip(v, rub, rel, tool, XYEqual);
} else if (tool->IsA(STRETCH_TOOL)) {
m = MessageView::CreateManipulator(v, e, rel, tool);
DragManip* dm = (DragManip*) m;
DragConstraint dc = dm->GetConstraint();
RubberRect* rr = (RubberRect*) dm->GetRubberband();
rr->GetOriginal(l, b, r, t);
delete dm;
rub = new ConstrainRect(
nil, nil, l, b, r, t, 0, 0, ixcon, iycon
);
m = new DragManip(
v, rub, rel, tool, DragConstraint(dc | Gravity), r, t
);
} else if (!tool->IsA(RESHAPE_TOOL)){
m = MessageView::CreateManipulator(v, e, rel, tool);
}
return m;
}
Command* StrBrowserView::InterpretManipulator (Manipulator* m) {
Command* cmd = nil;
Tool* tool = m->GetTool();
if (tool->IsA(IBGRAPHIC_COMP_TOOL)) {
cmd = InteractorView::InterpretManipulator(m);
} else if (tool->IsA(GRAPHIC_COMP_TOOL)) {
DragManip* dm = (DragManip*) m;
IBEditor* ed = (IBEditor*) dm->GetViewer()->GetEditor();
Tool* tool = dm->GetTool();
Transformer* rel = dm->GetTransformer();
RubberRect* rubberRect = (RubberRect*) dm->GetRubberband();
Coord x0, y0, x1, y1;
rubberRect->GetCurrent(x0, y0, x1, y1);
NormalRect(x0, y0, x1, y1);
if (rel != nil) {
rel->InvTransformRect(x0, y0, x1, y1);
}
GetABSCoord(ed, x0, y0, x1, y1);
ColorVar* colVar = (ColorVar*) ed->GetState("ColorVar");
FontVar* fontVar = (FontVar*) ed->GetState("FontVar");
StrBrowserComp* comp = (StrBrowserComp*) GetStrBrowserComp()->Copy();
StrBrowserGraphic* g = (StrBrowserGraphic*) comp->GetGraphic();
g->SetRowsCols(y1-y0+1, x1-x0+1);
if (colVar != nil) {
g->SetColors(colVar->GetFgColor(), colVar->GetBgColor());
}
if (fontVar != nil) {
g->SetFont(fontVar->GetFont());
}
cmd = new MacroCmd(
ed, new PasteCmd(ed, new Clipboard(comp)),
new PlaceCmd(ed, x0, y0, x1-1, y1-1, new Clipboard(comp))
);
} else if (!tool->IsA(RESHAPE_TOOL)){
cmd = MessageView::InterpretManipulator(m);
}
return cmd;
}
InfoDialog* StrBrowserView::GetInfoDialog () {
IBEditor* ibed = (IBEditor*) GetViewer()->GetEditor();
InfoDialog* info = ButtonView::GetInfoDialog();
ButtonState* state = info->GetState();
StrBrowserComp* scomp = GetStrBrowserComp();
BooleanStateVar* uniqueSel = scomp->GetUniqueSel();
info->Include(
new BooleanStateVarView(uniqueSel, " Unique Selection ")
);
return info;
}
/*****************************************************************************/
boolean StrBrowserCode::IsA (ClassId id) {
return STRBROWSER_CODE == id || CodeView::IsA(id);
}
ClassId StrBrowserCode::GetClassId () { return STRBROWSER_CODE; }
StrBrowserCode::StrBrowserCode (StrBrowserComp* subj) : CodeView(subj) { }
StrBrowserComp* StrBrowserCode::GetStrBrowserComp () {
return (StrBrowserComp*) GetSubject();
}
boolean StrBrowserCode::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 = GetStrBrowserComp()->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 && mnamer->GetExport()&&!_namelist->Search("strbrowser")
) {
_namelist->Append("strbrowser");
out << "#include <InterViews/strbrowser.h>\n";
}
ButtonStateVar* bvar = icomp->GetButtonStateVar();
if (_scope && bvar->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("strbrowser")) {
_namelist->Append("strbrowser");
out << "#include <InterViews/strbrowser.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));
StrBrowserComp* strbcomp = GetStrBrowserComp();
int rows, cols;
int uniqueSel = (int) strbcomp->GetUniqueSel()->GetBooleanState();
BeginInstantiate(out);
StrBrowserGraphic* graphic = strbcomp->GetStrBrowserGraphic();
graphic->GetRowsCols(rows, cols);
ButtonStateVar* bsVar = strbcomp->GetButtonStateVar();
out << "(";
InstanceName(out);
out << bsVar->GetName() << ", ";
out << rows << ", " << cols << ", ";
if (uniqueSel) {
out << "true";
} else {
out << "false";
}
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 StrBrowserCode::CoreConstDecls(ostream& out) {
out << "(const char*, ButtonState*, int, int, boolean);\n";
return out.good();
}
boolean StrBrowserCode::CoreConstInits(ostream& out) {
InteractorComp* icomp = GetIntComp();
SubclassNameVar* snamer = icomp->GetClassNameVar();
const char* baseclass = snamer->GetBaseClass();
out << "(\n const char* name, ButtonState* bs,";
out << "int rows, int cols, boolean u\n) : " << baseclass;
out << "(name, bs, rows, cols, u) {}\n\n";
return out.good();
}
boolean StrBrowserCode::ConstDecls(ostream& out) {
out << "(const char*, ButtonState*, int, int, boolean);\n";
return out.good();
}
boolean StrBrowserCode::ConstInits(ostream& out) {
char coreclass[CHARBUFSIZE];
GetCoreClassName(coreclass);
out << "(\n const char* name, ButtonState* bs,";
out << "int rows, int cols, boolean u\n) : " << coreclass;
out << "(name, bs, rows, cols, u) {}\n\n";
return out.good();
}
boolean StrBrowserCode::EmitIncludeHeaders(ostream& out) {
SubclassNameVar* snamer = GetIntComp()->GetClassNameVar();
if (!snamer->IsSubclass() && !_namelist->Search("strbrowser")) {
_namelist->Append("strbrowser");
out << "#include <InterViews/strbrowser.h> \n";
}
if (!_namelist->Search("button")) {
_namelist->Append("button");
out << "#include <InterViews/button.h> \n";
}
return out.good();
}
/*****************************************************************************/
StrBrowserGraphic::StrBrowserGraphic (
const char* text, int width, int height, CanvasVar* c, Graphic* g
) : MessageGraphic(text, c, g) {
_width = width;
_height = height;
}
void StrBrowserGraphic::Natural (int& w, int& h) {
FullGraphic gs;
totalGS(gs);
PSFont* font = gs.GetFont();
w = _width - _width % font->Width("n");
h = _height - _height % font->Height();
}
void StrBrowserGraphic::GetRowsCols (int& rows, int& cols) {
FullGraphic gs;
totalGS(gs);
PSFont* font = gs.GetFont();
rows = _height / font->Height();
cols = _width / font->Width("n");
rows = (rows == 0) ? 1 : rows;
cols = (cols == 0) ? 1 : cols;
}
void StrBrowserGraphic::SetRowsCols(int rows, int cols) {
_width = cols;
_height = rows;
}
Graphic* StrBrowserGraphic::Copy () {
return new StrBrowserGraphic(GetText(), _width, _height, nil, this);
}
const char* StrBrowserGraphic::GetClassName () { return GetText(); }
ClassId StrBrowserGraphic::GetClassId () { return STRBROWSER_GRAPHIC; }
void StrBrowserGraphic::Read (istream& in) {
MessageGraphic::Read(in);
in >> _width >> _height;
}
void StrBrowserGraphic::Write (ostream& out) {
MessageGraphic::Write(out);
out << _width << " " << _height << " ";
}
void StrBrowserGraphic::draw (Canvas* c, Graphic* gs) {
Coord xmax, ymax;
CanvasVar* cvar = GetCanvasVar();
if (cvar == nil) {
Natural(xmax, ymax);
} else {
xmax = cvar->xmax();
ymax = cvar->ymax();
}
update(gs);
static Brush* b;
if (b == nil) {
b = new Brush(0xbbbb, 1);
Ref(b);
}
_p->SetBrush(b);
_p->ClearRect(c, 0, 0, xmax, ymax);
_p->Rect(c, 0, 0, xmax, ymax);
_p->Line(c, 0, 0, xmax, ymax);
_p->Line(c, 0, ymax, xmax, 0);
const Font* font = _p->GetFont();
const char* text = GetText();
int w = font->Width(text);
int h = font->Height();
_p->Text(c, text, (xmax+1-w)/2, (ymax+1-h)/2);
}