|
|
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: 19034 (0x4a5a)
Types: TextFile
Names: »ibcommandctrl.c«
└─⟦8648bda34⟧ Bits:30007244 EUUGD5_II: X11R5
└─⟦87c3ac0e0⟧ »./contrib-3/contrib-3.00«
└─⟦de8ce1454⟧
└─⟦this⟧ »contrib/lib/iv/src/bin/ibuild/ibcommandctrl.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 PanelCtrl
* $Header: /master/3.0/iv/src/bin/ibuild/RCS/ibcommandctrl.c,v 1.2 91/09/27 14:07:34 tang Exp $
*/
#include "ibclasses.h"
#include "ibtext.h"
#include "ibdialogs.h"
#include "ibed.h"
#include "ibeditor.h"
#include "ibgrcomp.h"
#include "ibvars.h"
#include "ibvarviews.h"
#include "ibcommandctrl.h"
#include <Unidraw/iterator.h>
#include <Unidraw/page.h>
#include <Unidraw/statevars.h>
#include <Unidraw/selection.h>
#include <Unidraw/viewer.h>
#include <Unidraw/ulist.h>
#include <Unidraw/unidraw.h>
#include <Unidraw/Tools/tool.h>
#include <Unidraw/Components/text.h>
#include <Unidraw/Commands/command.h>
#include <Unidraw/Graphic/graphic.h>
#include <InterViews/brush.h>
#include <InterViews/shape.h>
#include <InterViews/transformer.h>
#include <math.h>
#include <stream.h>
#include <string.h>
/*****************************************************************************/
static const int HPAD = 4; // horizontal padding around control labels
static const int VPAD = 1; // vertical padding around control labels
static const int SEP = 8; // separation between label & equiv
static const int MINHT = 15; // minimum height of control labels
static const int MINWD = 15; // minimum width of control labels
/*****************************************************************************/
CommandCtrlComp::CommandCtrlComp (PanelCtrlGraphic* gr) : PanelCtrlComp(gr) {
if (gr != nil) {
SubclassNameVar* subclass = GetClassNameVar();
subclass->SetName("CommandControl");
subclass->SetBaseClass("CommandControl");
}
}
ClassId CommandCtrlComp::GetClassId () { return COMMANDCONTROL_COMP; }
boolean CommandCtrlComp::IsA (ClassId id) {
return COMMANDCONTROL_COMP == id || PanelCtrlComp::IsA(id);
}
void CommandCtrlComp::Instantiate () {
if (_toolname == nil) {
_toolname = new TrackNameVar("NOPCmd");
}
PanelCtrlComp::Instantiate();
}
void CommandCtrlComp::Reconfig () {
Shape* shape = GetShapeVar()->GetShape();
int x0, y0, x1, y1;
TextComp* textcomp = (TextComp*) GetKeyLabel()->GetTarget();
TextGraphic* textgr = textcomp->GetText();
const char* kl = textgr->GetOriginal();
GetTop()->GetGraphic()->GetBox(x0, y0, x1, y1);
shape->width = 2*HPAD + x1 - x0;
shape->height = max(2*VPAD + y1 - y0, MINHT);
if (*kl != '\0') {
PSFont* f = stdgraphic->GetFont();
shape->width += f->Width(kl) + SEP;
shape->height = max(shape->height, f->Height() + 2*VPAD);
}
shape->Rigid(shape->width, hfil, 0, 0);
}
void CommandCtrlComp::Resize () {
Iterator i;
PanelCtrlGraphic* pcgr = GetPanelCtrlGraphic();
TextComp* textcomp = (TextComp*) GetKeyLabel()->GetTarget();
TextGraphic* textgr = textcomp->GetText();
const char* kl = textgr->GetOriginal();
Picture* topgr = (Picture*) GetTop()->GetGraphic();
pcgr->SetPattern(psclear);
if (*kl == '\0') {
if (!topgr->IsEmpty()) {
topgr->Align(Center, pcgr, Center);
}
} else {
if (!topgr->IsEmpty()) {
topgr->Translate(-HPAD, 0);
topgr->Align(CenterLeft, pcgr, CenterLeft);
topgr->Translate(HPAD, 0);
pcgr->Align(CenterRight, textgr, CenterRight);
textgr->Translate(-HPAD, 0);
}
}
textcomp->Notify();
SubNotify();
}
void CommandCtrlComp::Interpret(Command* cmd) {
if (!cmd->IsA(GETCONFLICT_CMD)) {
PanelCtrlComp::Interpret(cmd);
}
}
void CommandCtrlComp::Uninterpret(Command* cmd) {
if (!cmd->IsA(GETCONFLICT_CMD)) {
PanelCtrlComp::Uninterpret(cmd);
}
}
boolean CommandCtrlComp::IsRelatableTo (InteractorComp* comp) {
boolean ok = false;
if (comp->IsA(EDITOR_COMP) || comp->IsA(COMMANDCONTROL_COMP)) {
ok = true;
}
return ok;
}
/*****************************************************************************/
CommandCtrlView::CommandCtrlView (
CommandCtrlComp* subj
) : PanelCtrlView(subj) { _keylabel = nil; }
CommandCtrlComp* CommandCtrlView::GetCommandCtrlComp () {
return (CommandCtrlComp*) GetSubject();
}
ClassId CommandCtrlView::GetClassId () { return COMMANDCONTROL_VIEW; }
boolean CommandCtrlView::IsA (ClassId id) {
return COMMANDCONTROL_VIEW == id || PanelCtrlView::IsA(id);
}
GraphicComp* CommandCtrlView::CreateProtoComp (
Editor* ed, Coord l, Coord b, Coord r, Coord t
) {
ColorVar* colVar = (ColorVar*) ed->GetState("ColorVar");
FontVar* fontVar = (FontVar*) ed->GetState("FontVar");
float mcx, mcy, cx, cy;
CommandCtrlComp* comComp = (CommandCtrlComp*) GetCommandCtrlComp()->Copy();
Graphic* topgr = comComp->GetTop()->GetGraphic();
mcx = (r-l)/2.0; mcy = (t-b)/2.0;
topgr->SetColors(colVar->GetFgColor(), colVar->GetBgColor());
topgr->SetFont(fontVar->GetFont());
topgr->GetCenter(cx, cy);
topgr->Translate(mcx-cx, mcy-cy);
topgr->Translate(HPAD, 0);
return comComp;
}
InfoDialog* CommandCtrlView::GetInfoDialog () {
IBEditor* ibed = (IBEditor*) GetViewer()->GetEditor();
InfoDialog* info = InteractorView::GetInfoDialog();
ButtonState* state = info->GetState();
CommandCtrlComp* comComp = GetCommandCtrlComp();
IBNameVar* comName = comComp->GetToolName();
MemberNameVar* edVar = comComp->GetEditorVar();
NameChooserView* comChooser = new NameChooserView(
comName, state, ibed,
"Library commands: ", "Command Name: "
);
comChooser->Append("AlignCmd Bottom Bottom");
comChooser->Append("AlignCmd Bottom Top");
comChooser->Append("AlignCmd Center Center");
comChooser->Append("AlignCmd HorizCenter HorizCenter");
comChooser->Append("AlignCmd Left Left");
comChooser->Append("AlignCmd Left Right");
comChooser->Append("AlignCmd Right Left");
comChooser->Append("AlignCmd Right Right");
comChooser->Append("AlignCmd Top Bottom");
comChooser->Append("AlignCmd Top Top");
comChooser->Append("AlignCmd VertCenter VertCenter");
comChooser->Append("AlignToGridCmd");
comChooser->Append("BackCmd");
comChooser->Append("BrushCmd");
comChooser->Append("CenterCmd");
comChooser->Append("CloseEditorCmd");
comChooser->Append("ColorCmd fg");
comChooser->Append("ColorCmd bg");
comChooser->Append("CopyCmd");
comChooser->Append("CutCmd");
comChooser->Append("DeleteCmd");
comChooser->Append("DupCmd");
comChooser->Append("FontCmd");
comChooser->Append("FrontCmd");
comChooser->Append("GravityCmd");
comChooser->Append("GridCmd");
comChooser->Append("GridSpacingCmd");
comChooser->Append("GroupCmd");
comChooser->Append("ImportCmd");
comChooser->Append("NewCompCmd");
comChooser->Append("NormSizeCmd");
comChooser->Append("OrientationCmd");
comChooser->Append("PatternCmd");
comChooser->Append("PasteCmd");
comChooser->Append("PrintCmd");
comChooser->Append("QuitCmd");
comChooser->Append("RedoCmd");
comChooser->Append("RedToFitCmd");
comChooser->Append("RevertCmd");
comChooser->Append("RotateCmd 90.0");
comChooser->Append("RotateCmd -90.0");
comChooser->Append("SaveCompCmd");
comChooser->Append("SaveCompAsCmd");
comChooser->Append("ScaleCmd -1.0 1.0");
comChooser->Append("ScaleCmd 1.0 -1.0");
comChooser->Append("SlctAllCmd");
comChooser->Append("UndoCmd");
comChooser->Append("UngroupCmd");
comChooser->Append("ViewCompCmd");
info->Include(new RelatedVarView(
edVar, state, comComp, "Editor Name: ")
);
info->Include(comChooser);
return info;
}
/*****************************************************************************/
CommandCtrlCode::CommandCtrlCode (
CommandCtrlComp* subj
) : PanelCtrlCode(subj) { }
CommandCtrlComp* CommandCtrlCode::GetCommandCtrlComp() {
return (CommandCtrlComp*) GetSubject();
}
ClassId CommandCtrlCode::GetClassId () { return COMMANDCONTROL_CODE; }
boolean CommandCtrlCode::IsA(ClassId id) {
return COMMANDCONTROL_CODE == id || PanelCtrlCode::IsA(id);
}
boolean CommandCtrlCode::Definition (ostream& out) {
char coreclass[CHARBUFSIZE];
char Keycode[16], Com[16], Arg1[16], Arg2[16];
boolean ok = true;
Iterator i;
CommandCtrlComp* ctrlComp = GetCommandCtrlComp();
SubclassNameVar* snamer = ctrlComp->GetClassNameVar();
MemberNameVar* mnamer = ctrlComp->GetMemberNameVar();
TextComp* textcomp = (TextComp*) ctrlComp->GetKeyLabel()->GetTarget();
TextGraphic* textgr = textcomp->GetText();
MemberNameVar* edVar = ctrlComp->GetEditorVar();
const char* edname = edVar->GetName();
const char* text = textgr->GetOriginal();
const char* com = ctrlComp->GetToolName()->GetName();
const char* subclass = snamer->GetName();
const char* baseclass = snamer->GetBaseClass();
const char* mname = mnamer->GetName();
strcpy(Keycode, text);
HashKeyCode(Keycode);
InteractorComp* dummy;
GetCoreClassName(coreclass);
if (*edname == '\0') {
strcat(_errbuf, mname);
strcat(_errbuf, " has undefined Editor.\n");
return false;
} else if (!Search(edVar, dummy)) {
strcat(_errbuf, mname);
strcat(
_errbuf, "'s Editor is not in the same hierachy.\n"
);
return false;
}
_emitGraphicComp = true;
if (_emitInstanceInits) {
if (!_instancelist->Find((void*)mname)) {
_instancelist->Append(new UList((void*)mname));
ok = ok && EmitGraphicState(out);
for(First(i); !Done(i); Next(i)) {
CodeView* kid = (CodeView*) GetView(i);
ok = ok && EmitInstanceDecls(kid, out);
}
ok = ok && Iterate(out);
const char* kidname = nil;
if (!SingleKid()) {
out << " GraphicComps* " << mname;
out << "_comp = new GraphicComps;\n";
for(First(i); !Done(i); Next(i)) {
CodeView* kid = (CodeView*) GetView(i);
MemberNameVar* kmnamer=kid->GetIComp()->GetMemberNameVar();
const char* kmname = kmnamer->GetName();
out << " " << mname << "_comp->Append(";
out << kmname << "_comp);\n";
}
kidname = mname;
} else {
First(i);
CodeView* kidv = (CodeView*) GetView(i);
MemberNameVar* kmnamer=kidv->GetIComp()->GetMemberNameVar();
kidname = kmnamer->GetName();
}
out << " ControlInfo* " << mname;
out << "_info = new ControlInfo(";
*Arg1 = '\0';
*Arg2 = '\0';
/* some sscanfs need writable string */
char* writable_com = strnew(com);
sscanf(writable_com, "%s%s%s", Com, Arg1, Arg2);
delete writable_com;
out << kidname << "_comp, \"" << text << "\", \"";
out << Keycode << "\");\n";
out << " Command* " << mname << "_com = new ";
if (*com == '\0') {
strcat(_errbuf, mname);
strcat(_errbuf, " has undefined Command.\n");
return false;
}
if (strcmp(Com, "NewCompCmd") == 0) {
out << Com << "(" << mname << "_info, new GraphicComps);\n";
} else if (
strcmp(Com, "ScaleCmd") == 0 ||
strcmp(Com, "AlignCmd") == 0
) {
out << Com << "(" << mname << "_info, ";
out << Arg1 << ", " << Arg2 << ");\n";
} else if (strcmp(Com, "RotateCmd") == 0) {
out << Com << "(" << mname << "_info, ";
out << Arg1 << ");\n";
} else if (strcmp(Com, "FontCmd") == 0) {
out << Com << "(\n " << mname << "_info, ";
out << kidname << "_comp->GetGraphic()->GetFont()\n );\n";
} else if (strcmp(Com, "BrushCmd") == 0) {
out << Com << "(\n " << mname << "_info, ";
out << kidname << "_comp->GetGraphic()->GetBrush()\n );\n";
} else if (strcmp(Com, "PatternCmd") == 0) {
out << Com << "(\n " << mname << "_info, ";
out << kidname <<"_comp->GetGraphic()->GetPattern()\n );\n";
} else if (strcmp(Com, "ColorCmd") == 0) {
out << Com << "(" << mname << "_info, ";
if (strcmp(Arg1, "fg") == 0) {
out << kidname;
out << "_comp->GetGraphic()->GetFgColor(), nil\n );\n";
} else if (strcmp(Arg1, "bg") == 0) {
out << "nil, " << kidname;
out << "_comp->GetGraphic()->GetBgColor()\n );\n";
} else {
out << kidname << "_comp->GetGraphic()->GetFgColor(), ";
out << kidname;
out << "_comp->GetGraphic()->GetBgColor()\n );\n";
}
} else {
out << Com << "(" << mname << "_info);\n";
}
BeginInstantiate(out);
out << "(";
InstanceName(out);
out << mname << "_info)";
EndInstantiate(out);
out << " GetKeyMap()->Register(";
out << mname << ");\n";
out << " " << mname << "_com->SetEditor(this);\n";
}
} else if (_emitBSDecls || _emitBSInits) {
ok = true;
} else {
ok = ok && PanelCtrlCode::Definition(out);
}
_emitGraphicComp = true;
return out.good() && ok;
}
boolean CommandCtrlCode::CoreConstDecls(ostream& out) {
out << "(const char*, ControlInfo*);\n";
return out.good();
}
boolean CommandCtrlCode::CoreConstInits(ostream& out) {
InteractorComp* icomp = GetIntComp();
SubclassNameVar* snamer = icomp->GetClassNameVar();
const char* baseclass = snamer->GetBaseClass();
out << "(\n const char* name, ControlInfo* info";
out << "\n) : ";
out << baseclass << "(name, info) {\n";
out << " perspective = new Perspective;\n";
out << "}\n\n";
return out.good();
}
boolean CommandCtrlCode::ConstDecls(ostream& out) {
out << "(const char*, ControlInfo*);\n";
return out.good();
}
boolean CommandCtrlCode::ConstInits(ostream& out) {
char coreclass[CHARBUFSIZE];
GetCoreClassName(coreclass);
out << "(\n const char* name, ControlInfo* info";
out << "\n) : ";
out << coreclass << "(name, info) {}\n\n";
return out.good();
}
boolean CommandCtrlCode::EmitIncludeHeaders(ostream& out) {
GrBlockCode::EmitIncludeHeaders(out);
CommandCtrlComp* ctrlComp = GetCommandCtrlComp();
const char* com = ctrlComp->GetToolName()->GetName();
SubclassNameVar* snamer = ctrlComp->GetClassNameVar();
if (!snamer->IsSubclass() && !_namelist->Search("uctrls")) {
_namelist->Append("uctrls");
out << "#include <Unidraw/uctrls.h> \n\n";
}
if (strcmp(snamer->GetName(), _classname) != 0) {
if (!_namelist->Search("ctrlinfo")) {
_namelist->Append("ctrlinfo");
out << "#include <Unidraw/ctrlinfo.h> \n";
}
if (!_namelist->Search("grcomp")) {
_namelist->Append("grcomp");
out << "#include <Unidraw/Components/grcomp.h>\n";
}
if (!_namelist->Search("catcmds")) {
_namelist->Append("catcmds");
out << "#include <Unidraw/Commands/catcmds.h>\n";
}
if (!_namelist->Search("edit")) {
_namelist->Append("edit");
out << "#include <Unidraw/Commands/edit.h>\n";
}
if (!_namelist->Search("transforms")) {
_namelist->Append("transforms");
out << "#include <Unidraw/Commands/transforms.h>\n";
}
if (!_namelist->Search("viewcmds")) {
_namelist->Append("viewcmds");
out << "#include <Unidraw/Commands/viewcmds.h>\n";
}
if (strncmp(com, "ScaleCmd", 8) == 0 || strncmp(com, "RotateCmd", 9)== 0) {
if (!_namelist->Search("struct")) {
_namelist->Append("struct");
out << "#include <Unidraw/Commands/struct.h>\n";
}
}
if (strcmp(com, "ImportCmd") == 0) {
if (!_namelist->Search("import")) {
_namelist->Append("import");
out << "#include <Unidraw/Commands/import.h>\n";
}
}
if (strcmp(com, "FontCmd") == 0) {
if (!_namelist->Search("font")) {
_namelist->Append("font");
out << "#include <Unidraw/Commands/font.h>\n";
}
}
if (strcmp(com, "BrushCmd") == 0) {
if (!_namelist->Search("brushcmd")) {
_namelist->Append("brushcmd");
out << "#include <Unidraw/Commands/brushcmd.h>\n";
}
}
if (strcmp(com, "PatternCmd") == 0) {
if (!_namelist->Search("patcmd")) {
_namelist->Append("patcmd");
out << "#include <Unidraw/Commands/patcmd.h>\n";
}
}
if (strncmp(com, "ColorCmd", 8) == 0) {
if (!_namelist->Search("colorcmd")) {
_namelist->Append("colorcmd");
out << "#include <Unidraw/Commands/colorcmd.h>\n";
}
}
if (strcmp(com, "AlignToGridCmd") == 0 || strncmp(com, "AlignCmd", 8)==0) {
if (!_namelist->Search("align")) {
_namelist->Append("align");
out << "#include <Unidraw/Commands/align.h>\n";
}
}
}
return out.good();
}