|
|
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: 17233 (0x4351)
Types: TextFile
Names: »ibmessage.c«
└─⟦8648bda34⟧ Bits:30007244 EUUGD5_II: X11R5
└─⟦87c3ac0e0⟧ »./contrib-3/contrib-3.00«
└─⟦de8ce1454⟧
└─⟦this⟧ »contrib/lib/iv/src/bin/ibuild/ibmessage.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.
*/
/*
* Message component definitions.
* $Header: /master/3.0/iv/src/bin/ibuild/RCS/ibmessage.c,v 1.2 91/09/27 14:11:07 tang Exp $
*/
#include "ibmessage.h"
#include "ibclasses.h"
#include "ibcmds.h"
#include "ibed.h"
#include "ibglobals.h"
#include "ibtools.h"
#include "ibvars.h"
#include <Unidraw/catalog.h>
#include <Unidraw/clipboard.h>
#include <Unidraw/creator.h>
#include <Unidraw/manips.h>
#include <Unidraw/statevars.h>
#include <Unidraw/unidraw.h>
#include <Unidraw/ulist.h>
#include <Unidraw/viewer.h>
#include <Unidraw/Commands/align.h>
#include <Unidraw/Commands/edit.h>
#include <Unidraw/Commands/macro.h>
#include <Unidraw/Graphic/pspaint.h>
#include <Unidraw/Tools/reshape.h>
#include <Unidraw/Tools/tool.h>
#include <InterViews/painter.h>
#include <InterViews/shape.h>
#include <InterViews/transformer.h>
#include <stream.h>
#include <string.h>
/*****************************************************************************/
ClassId MessageComp::GetClassId () { return MESSAGE_COMP; }
boolean MessageComp::IsA (ClassId id) {
return MESSAGE_COMP == id || InteractorComp::IsA(id);
}
MessageComp::MessageComp (MessageGraphic* g) : InteractorComp(g) {
if (g != nil) {
GetClassNameVar()->SetName("Message");
GetClassNameVar()->SetBaseClass("Message");
}
}
MessageGraphic* MessageComp::GetMessageGraphic () {
return (MessageGraphic*) GetGraphic();
}
InteractorComp& MessageComp::operator = (InteractorComp& comp) {
MessageComp::operator = (comp);
return *this;
}
void MessageComp::Interpret(Command* cmd) {
if (cmd->IsA(EDIT_CMD)) {
EditCmd* editcmd = (EditCmd*) cmd;
editcmd->SetOldText(GetMessageGraphic()->GetText());
GetMessageGraphic()->SetText(editcmd->GetNewText());
Reconfig();
StoreCanvas(cmd);
Place(this);
Propagate(cmd);
} else if (cmd->IsA(ALIGN_CMD)) {
AlignCmd* alignCmd = (AlignCmd*) cmd;
Alignment a;
MessageGraphic* mg = GetMessageGraphic();
cmd->Store(this, new VoidData((void*) mg->GetAlignment()));
alignCmd->GetAlignment(a, a);
GetMessageGraphic()->SetAlignment(a);
Notify();
Propagate(cmd);
} else {
InteractorComp::Interpret(cmd);
}
}
void MessageComp::Uninterpret(Command* cmd) {
if (cmd->IsA(EDIT_CMD)) {
EditCmd* editcmd = (EditCmd*) cmd;
editcmd->SetNewText(GetMessageGraphic()->GetText());
GetMessageGraphic()->SetText(editcmd->GetOldText());
Reconfig();
RestoreCanvas(cmd);
Unpropagate(cmd);
} else if (cmd->IsA(ALIGN_CMD)) {
VoidData* vd = (VoidData*) cmd->Recall(this);
Alignment a = (Alignment) vd->_void;
GetMessageGraphic()->SetAlignment(a);
Notify();
Unpropagate(cmd);
} else {
InteractorComp::Uninterpret(cmd);
}
}
void MessageComp::Reconfig () {
Shape* shape = GetShapeVar()->GetShape();
int w, h;
GetMessageGraphic()->Natural(w, h);
shape->Rect(w, h);
shape->Rigid();
GetShapeVar()->Notify();
}
void MessageComp::Read (istream& in) {
Catalog* catalog = unidraw->GetCatalog();
InteractorComp::Read(in);
ClassId id;
in >> id;
MessageGraphic* g = (MessageGraphic*) catalog->GetCreator()->Create(id);
g->Read(in);
g->SetCanvasVar(GetCanvasVar());
SetGraphic(g);
}
void MessageComp::Write (ostream& out) {
ClassId id;
Catalog* catalog = unidraw->GetCatalog();
InteractorComp::Write(out);
MessageGraphic* g = GetMessageGraphic();
id = g->GetClassId();
out << " " << id << " ";
g->Write(out);
}
/*****************************************************************************/
MessageView::MessageView (MessageComp* subj) : InteractorView(subj) { }
MessageComp* MessageView::GetMessageComp(){return (MessageComp*) GetSubject();}
ClassId MessageView::GetClassId () { return MESSAGE_VIEW; }
boolean MessageView::IsA (ClassId id) {
return MESSAGE_VIEW == id || InteractorView::IsA(id);
}
void MessageView::Update () {
MessageGraphic* bcomp = GetMessageComp()->GetMessageGraphic();
MessageGraphic* bview = (MessageGraphic*) GetGraphic();
IncurDamage(bview);
*(Graphic*) bview = *(Graphic*) bcomp;
UpdateCanvasVar();
bview->SetText(bcomp->GetText());
bview->SetAlignment(bcomp->GetAlignment());
IncurDamage(bview);
EraseHandles();
}
Painter* InitPainter (Graphic* g, Transformer* rel) {
Painter* p = new Painter;
p->SetFont(g->GetFont());
p->FillBg(g->BgFilled());
p->SetColors(g->GetFgColor(), g->GetBgColor());
p->SetTransformer(rel);
Unref(rel);
return p;
}
Manipulator* MessageView::CreateManipulator (
Viewer* v, Event& e, Transformer* rel, Tool* tool
) {
Manipulator* m = nil;
IBEditor* ed = (IBEditor*) v->GetEditor();
if (tool->IsA(IBGRAPHIC_COMP_TOOL)) {
m = InteractorView::CreateManipulator(v, e, rel, tool);
} else if (tool->IsA(GRAPHIC_COMP_TOOL)) {
FontVar* fontvar = (FontVar*) ed->GetState("FontVar");
PSFont* font = fontvar->GetFont();
ColorVar* colorvar = (ColorVar*) ed->GetState("ColorVar");
PSColor* fg = colorvar->GetFgColor();
PSColor* bg = colorvar->GetBgColor();
Graphic* g = GetMessageComp()->GetGraphic();
g->SetFont(font);
g->SetColors(fg, bg);
Painter* painter = InitPainter(g, rel);
m = new TextManip(v, painter, 0, tool);
} else if (tool->IsA(RESHAPE_TOOL)) {
MessageGraphic* msg = (MessageGraphic*) GetGraphic();
rel = new Transformer;
Painter* painter = InitPainter(msg, rel);
const char* text = msg->GetText();
int size = strlen(text);
msg->TotalTransformation(*rel);
Coord xpos, ypos;
msg->GetTextPosition(xpos, ypos, msg->GetFont());
rel->Transform(xpos, ypos);
m = new TextManip(v, text, size, xpos, ypos, painter, 0, tool);
} else {
m = InteractorView::CreateManipulator(v, e, rel, tool);
}
return m;
}
Command* MessageView::InterpretManipulator (Manipulator* m) {
IBEditor* ed = (IBEditor*) m->GetViewer()->GetEditor();
Tool* tool = m->GetTool();
Command* cmd = nil;
if (tool->IsA(IBGRAPHIC_COMP_TOOL)) {
cmd = InteractorView::InterpretManipulator(m);
} else if (tool->IsA(GRAPHIC_COMP_TOOL) || tool->IsA(RESHAPE_TOOL)) {
TextManip* tm = (TextManip*) m;
int size;
const char* text = tm->GetText(size);
if (tool->IsA(GRAPHIC_COMP_TOOL)) {
MessageGraphic* protogr = GetMessageComp()->GetMessageGraphic();
MessageComp* msgComp = (MessageComp*) GetMessageComp()->Copy();
MessageGraphic* msg = msgComp->GetMessageGraphic();
msg->SetText(text);
msg->Position(tm);
cmd = new MacroCmd(
ed, new PasteCmd(ed, new Clipboard(msgComp)),
new PlaceCmd(ed, new Clipboard(msgComp))
);
} else {
cmd = new EditCmd(ed, new Clipboard(GetMessageComp()), text);
}
} else {
cmd = InteractorView::InterpretManipulator(m);
}
return cmd;
}
void MessageView::Interpret(Command* cmd) {
if (cmd->IsA(TAB_CMD)) {
TabTool tabTool;
GetViewer()->UseTool(&tabTool);
InteractorView::Interpret(cmd);
} else {
InteractorView::Interpret(cmd);
}
}
/*****************************************************************************/
MessageCode::MessageCode (MessageComp* subj) : CodeView(subj) { }
MessageComp* MessageCode::GetMessageComp(){return (MessageComp*) GetSubject();}
ClassId MessageCode::GetClassId () { return MESSAGE_CODE; }
boolean MessageCode::IsA(ClassId id) {
return MESSAGE_CODE == id || CodeView::IsA(id);
}
boolean MessageCode::Definition (ostream& out) {
boolean ok = true;
if (
_emitProperty || _emitInstanceDecls ||
_emitForward || _emitClassHeaders || _emitHeaders
) {
return CodeView::Definition(out);
} else if (_emitExpHeader) {
InteractorComp* icomp = GetIntComp();
MemberNameVar* mnamer = icomp->GetMemberNameVar();
SubclassNameVar* snamer = icomp->GetClassNameVar();
if (!snamer->IsSubclass()) {
if (_scope && mnamer->GetExport()&&!_namelist->Search("message")) {
_namelist->Append("message");
out << "#include <InterViews/message.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("message")) {
_namelist->Append("message");
out << "#include <InterViews/message.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));
BeginInstantiate(out);
MessageComp* mcomp = GetMessageComp();
const char* text = mcomp->GetMessageGraphic()->GetText();
out << "(";
InstanceName(out);
out << "\"" << text << "\", ";
Alignment a = mcomp->GetMessageGraphic()->GetAlignment();
Align(a, out);
out << ")";
EndInstantiate(out);
}
} else if (
_emitBSDecls || _emitBSInits ||
_emitFunctionDecls || _emitFunctionInits
) {
return true;
} else if (
_emitCoreDecls || _emitCoreInits || _emitClassDecls || _emitClassInits
) {
ok = ok && CodeView::Definition(out);
} else if (_emitMain) {
ok = ok && CodeView::Definition(out);
}
return out.good() && ok;
}
void MessageCode::Align(Alignment a, ostream& out) {
if (a == TopLeft) {
out << "TopLeft";
} else if (a == TopCenter) {
out << "TopCenter";
} else if (a == TopRight) {
out << "TopRight";
} else if (a == CenterLeft) {
out << "CenterLeft";
} else if (a == Center) {
out << "Center";
} else if (a == CenterRight) {
out << "CenterRight";
} else if (a == BottomLeft) {
out << "BottomLeft";
} else if (a == BottomCenter) {
out << "BottomCenter";
} else if (a == BottomRight) {
out << "BottomRight";
} else if (a == Left) {
out << "Left";
} else if (a == Right) {
out << "Right";
} else if (a == Top) {
out << "Top";
} else if (a == Bottom) {
out << "Bottom";
} else if (a == HorizCenter) {
out << "HorizCenter";
} else if (a == VertCenter) {
out << "VertCenter";
}
}
boolean MessageCode::CoreConstDecls(ostream& out) {
out << "(const char*, const char*, Alignment);\n";
return out.good();
}
boolean MessageCode::CoreConstInits(ostream& out) {
InteractorComp* icomp = GetIntComp();
SubclassNameVar* snamer = icomp->GetClassNameVar();
const char* baseclass = snamer->GetBaseClass();
out << "(\n const char* i, const char* name, Alignment al\n) : ";
out << baseclass;
out << "(i, name, al) {\n";
out << " perspective = new Perspective;\n";
out << "}\n\n";
return out.good();
}
boolean MessageCode::ConstDecls(ostream& out) {
out << "(const char*, const char*, Alignment);\n";
return out.good();
}
boolean MessageCode::ConstInits(ostream& out) {
char coreclass[CHARBUFSIZE];
GetCoreClassName(coreclass);
out << "(\n const char* i, const char* name, Alignment al\n) : ";
out << coreclass;
out << "(i, name, al) {}\n\n";
return out.good();
}
boolean MessageCode::EmitIncludeHeaders(ostream& out) {
SubclassNameVar* snamer = GetIntComp()->GetClassNameVar();
if (!snamer->IsSubclass() && !_namelist->Search("message")) {
_namelist->Append("message");
out << "#include <InterViews/message.h> \n";
}
return out.good();
}
/*****************************************************************************/
MessageGraphic::MessageGraphic (
const char* text, CanvasVar* c, Graphic* g, Alignment align, int pad
) : IBGraphic(c, g) {
_text = (text == nil) ? nil : strnew(text);
_align = align;
_pad = pad;
}
MessageGraphic::~MessageGraphic () { delete _text; }
ClassId MessageGraphic::GetClassId () { return MESSAGE_GRAPHIC; }
const char* MessageGraphic::GetClassName () { return "Message"; }
Graphic* MessageGraphic::Copy(){
return new MessageGraphic(GetText(), nil, this, _align);
}
void MessageGraphic::Natural (int& w, int& h) {
FullGraphic gs;
totalGS(gs);
PSFont* font = gs.GetFont();
w = font->Width(GetText()) + 2*_pad;
h = font->Height() + 2*_pad;
}
void MessageGraphic::Read (istream& in) {
char* text;
ReadGS(in);
text = unidraw->GetCatalog()->ReadString(in);
in >> _align >> _pad;
SetText(text);
delete text;
}
void MessageGraphic::Write (ostream& out) {
WriteGS(out);
unidraw->GetCatalog()->WriteString(GetText(), out);
out << _align << " " << _pad << " ";
}
void MessageGraphic::SetText (const char* text) {
if (text != _text || strcmp(text, _text) != 0) {
delete _text;
_text = strnew(text);
}
}
void MessageGraphic::getExtent (
float& l, float& b, float& cx, float& cy, float& tol, Graphic* gs
) {
CanvasVar* cvar = GetCanvasVar();
if (cvar == nil) {
int w, h;
Natural(w, h);
CalcExtent(w, h, l, b, cx, cy, tol, gs);
} else {
CalcExtent(cvar->Width(), cvar->Height(), l,b,cx,cy,tol,gs);
}
tol = 0;
}
void MessageGraphic::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);
_p->ClearRect(c, 0, 0, xmax, ymax);
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->Text(c, GetText(), tx+_pad, ty+_pad);
}
void MessageGraphic::drawClipped (
Canvas* c, Coord l, Coord b, Coord r, Coord t, Graphic* gs
) {
Graphic::drawClipped(c, l, b, r, t, gs);
}
void MessageGraphic::GetTextPosition (Coord& l, Coord& b, const Font*) {
Coord xmax, ymax;
l = b = 0;
if (GetCanvasVar() == nil) {
Natural(xmax, ymax);
} else {
xmax = GetCanvasVar()->xmax();
ymax = GetCanvasVar()->ymax();
}
int width, height;
Natural(width, height);
switch (_align) {
case Left:
case TopLeft:
case CenterLeft:
case BottomLeft:
l = 0;
break;
case TopCenter:
case Center:
case BottomCenter:
case HorizCenter:
l = (xmax + 1 - width)/2;
break;
case Right:
case TopRight:
case CenterRight:
case BottomRight:
l = xmax + 1 - width;
break;
case Bottom:
case Top:
case VertCenter:
/* leave unchanged */
break;
}
switch (_align) {
case Bottom:
case BottomLeft:
case BottomCenter:
case BottomRight:
b = 0;
break;
case CenterLeft:
case Center:
case CenterRight:
case VertCenter:
b = (ymax + 1 - height) / 2;
break;
case Top:
case TopLeft:
case TopCenter:
case TopRight:
b = ymax + 1 - height;
break;
case Left:
case Right:
case HorizCenter:
/* leave unchanged */
break;
}
}
void MessageGraphic::Position (TextManip* tm) {
Painter* p = tm->GetPainter();
Transformer* rel = p->GetTransformer();
Coord xpos, ypos, tx, ty;
tm->GetPosition(xpos, ypos);
GetTextPosition(tx, ty, p->GetFont());
if (rel != nil) {
rel->InvTransform(xpos, ypos);
}
Translate(xpos-tx, ypos-ty);
}