|
|
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: 23540 (0x5bf4)
Types: TextFile
Names: »idarrow.c«
└─⟦8648bda34⟧ Bits:30007244 EUUGD5_II: X11R5
└─⟦87c3ac0e0⟧ »./contrib-3/contrib-3.00«
└─⟦de8ce1454⟧
└─⟦this⟧ »contrib/lib/iv/src/bin/idraw/idarrow.c«
/*
* Copyright (c) 1990, 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 ArrowLineComp, ArrowLineView, PSArrowLine
*/
#include "idarrow.h"
#include "idarrows.h"
#include "idvars.h"
#include "idclasses.h"
#include "idcmds.h"
#include <Unidraw/clipboard.h>
#include <Unidraw/editor.h>
#include <Unidraw/manips.h>
#include <Unidraw/statevars.h>
#include <Unidraw/viewer.h>
#include <Unidraw/Commands/datas.h>
#include <Unidraw/Commands/edit.h>
#include <Unidraw/Commands/transforms.h>
#include <Unidraw/Components/line.h>
#include <Unidraw/Graphic/lines.h>
#include <Unidraw/Graphic/picture.h>
#include <Unidraw/Graphic/util.h>
#include <Unidraw/Tools/tool.h>
#include <InterViews/rubcurve.h>
#include <InterViews/rubline.h>
#include <InterViews/rubverts.h>
#include <InterViews/transformer.h>
#include <math.h>
#include <stdio.h>
#include <stream.h>
/*****************************************************************************/
class _ArrowData : public Data {
public:
_ArrowData(boolean, boolean);
public:
boolean _head : 16;
boolean _tail : 16;
};
_ArrowData::_ArrowData (boolean head, boolean tail) {
_head = head;
_tail = tail;
}
/****************************************************************************/
ArrowLineComp::ArrowLineComp (ArrowLine* graphic) : LineComp(graphic) { }
ArrowLine* ArrowLineComp::GetArrowLine () { return (ArrowLine*) GetGraphic(); }
ClassId ArrowLineComp::GetClassId() { return ARROWLINE_COMP; }
ClassId ArrowLineComp::GetSubstId (const char*& delim) {
delim = "%END_ARROWLINE_COMP%";
return LineComp::GetClassId();
}
boolean ArrowLineComp::IsA (ClassId id) {
return ARROWLINE_COMP == id || LineComp::IsA(id);
}
Component* ArrowLineComp::Copy () {
return new ArrowLineComp((ArrowLine*) GetGraphic()->Copy());
}
void ArrowLineComp::Interpret (Command* cmd) {
if (cmd->IsA(ARROW_CMD)) {
ArrowLine* line = GetArrowLine();
if (line != nil) {
ArrowCmd* arrowCmd = (ArrowCmd*) cmd;
cmd->Store(this, new _ArrowData(line->Head(), line->Tail()));
line->SetArrows(arrowCmd->Head(), arrowCmd->Tail());
Notify();
}
} else if (cmd->IsA(PATTERN_CMD)) {
GraphicComp::Interpret(cmd);
} else {
LineComp::Interpret(cmd);
}
}
void ArrowLineComp::Uninterpret (Command* cmd) {
if (cmd->IsA(ARROW_CMD)) {
ArrowLine* line = GetArrowLine();
if (line != nil) {
_ArrowData* ad = (_ArrowData*) cmd->Recall(this);
if (ad != nil) {
line->SetArrows(ad->_head, ad->_tail);
Notify();
}
}
} else {
LineComp::Uninterpret(cmd);
}
}
void ArrowLineComp::Read (istream& in) {
LineComp::Read(in);
Line* line = GetLine();
Coord x0, y0, x1, y1;
int h, t;
float scale;
line->GetOriginal(x0, y0, x1, y1);
in >> h >> t >> scale;
ArrowLine* arrow = new ArrowLine(x0, y0, x1, y1, h, t, scale, line);
arrow->SetPattern(ReadPattern(in));
SetGraphic(arrow);
delete line;
}
void ArrowLineComp::Write (ostream& out) {
LineComp::Write(out);
ArrowLine* arrow = GetArrowLine();
out << arrow->Head() << " " << arrow->Tail() << " ";
out << arrow->ArrowScale() << " ";
WritePattern(arrow->GetPattern(), out);
}
/****************************************************************************/
ArrowLineComp* ArrowLineView::GetArrowLineComp () {
return (ArrowLineComp*) GetSubject();
}
ArrowLineView::ArrowLineView (ArrowLineComp* subj) : LineView(subj) { }
ClassId ArrowLineView::GetClassId () { return ARROWLINE_VIEW; }
boolean ArrowLineView::IsA (ClassId id) {
return ARROWLINE_VIEW == id || LineView::IsA(id);
}
void ArrowLineView::Update () {
ArrowLine* line = (ArrowLine*) GetGraphic();
ArrowLine* subj = GetArrowLineComp()->GetArrowLine();
IncurDamage(line);
*line = *subj;
IncurDamage(line);
EraseHandles();
}
Command* ArrowLineView::InterpretManipulator (Manipulator* m) {
DragManip* dm = (DragManip*) m;
Editor* ed = dm->GetViewer()->GetEditor();
Tool* tool = dm->GetTool();
Transformer* rel = dm->GetTransformer();
Command* cmd = nil;
ArrowVar* aVar = (ArrowVar*) ed->GetState("ArrowVar");
if (tool->IsA(GRAPHIC_COMP_TOOL)) {
RubberLine* rl = (RubberLine*) dm->GetRubberband();
Coord x0, y0, x1, y1;
rl->GetCurrent(x0, y0, x1, y1);
if (x0 != x1 || y0 != y1) {
BrushVar* brVar = (BrushVar*) ed->GetState("BrushVar");
ColorVar* colVar = (ColorVar*) ed->GetState("ColorVar");
PatternVar* patVar = (PatternVar*) ed->GetState("PatternVar");
if (rel != nil) {
rel = new Transformer(rel);
rel->Invert();
}
ArrowLine* aline = new ArrowLine(
x0, y0, x1, y1, aVar->Head(), aVar->Tail(),
dm->GetViewer()->GetMagnification(), stdgraphic
);
if (brVar != nil) aline->SetBrush(brVar->GetBrush());
if (patVar != nil) { aline->SetPattern(patVar->GetPattern()); }
if (colVar != nil) {
aline->SetColors(colVar->GetFgColor(), colVar->GetBgColor());
}
aline->SetTransformer(rel);
Unref(rel);
cmd = new PasteCmd(ed, new Clipboard(new ArrowLineComp(aline)));
}
} else if (tool->IsA(RESHAPE_TOOL)) {
RubberLine* rl = (RubberLine*) dm->GetRubberband();
Coord epx0, epy0, epx1, epy1;
GetEndpoints(epx0, epy0, epx1, epy1);
Coord x0, y0, x1, y1;
rl->GetCurrent(x0, y0, x1, y1);
if (x0 == epx1 && y0 == epy1) {
x0 = x1; y0 = y1;
x1 = epx1; y1 = epy1;
}
if (rel != nil) {
rel = new Transformer(rel);
rel->Invert();
}
ArrowLine* orig = GetArrowLineComp()->GetArrowLine();
ArrowLine* aline = new ArrowLine(
x0, y0, x1, y1, orig->Head(), orig->Tail(),
dm->GetViewer()->GetMagnification(), GetGraphic()
);
aline->SetTransformer(rel);
Unref(rel);
cmd = new ReplaceCmd(ed, new ArrowLineComp(aline));
} else {
cmd = LineView::InterpretManipulator(m);
}
return cmd;
}
/****************************************************************************/
PSArrowLine::PSArrowLine (ArrowLineComp* subj) : PSLine (subj) { }
ClassId PSArrowLine::GetClassId () { return PS_ARROWLINE; }
boolean PSArrowLine::IsA (ClassId id) {
return PS_ARROWLINE == id || PSLine::IsA(id);
}
boolean PSArrowLine::Definition (ostream& out) {
ArrowLineComp* comp = (ArrowLineComp*) GetSubject();
ArrowLine* aline = comp->GetArrowLine();
Coord x0, y0, x1, y1;
aline->GetOriginal(x0, y0, x1, y1);
float arrow_scale = aline->ArrowScale();
out << "Begin " << MARK << " Line\n";
MinGS(out);
out << MARK << "\n";
out << x0 << " " << y0 << " " << x1 << " " << y1 << " Line\n";
out << MARK << " " << arrow_scale << "\n";
out << "End\n\n";
return out.good();
}
// this code is entirely for compatibility with older versions of idraw
void PSArrowLine::Brush (ostream& out) {
ArrowLineComp* comp = (ArrowLineComp*) GetSubject();
PSBrush* brush = (PSBrush*) GetGraphicComp()->GetGraphic()->GetBrush();
boolean head, tail;
head = comp->GetArrowLine()->Head();
tail = comp->GetArrowLine()->Tail();
if (brush == nil) {
out << MARK << " b u\n";
} else if (brush->None()) {
out << "none SetB " << MARK << " b n\n";
} else {
int p = brush->GetLinePattern();
out << MARK << " b " << p << "\n";
int w = brush->Width();
out << w << " " << head << " " << tail << " ";
const int* dashpat = brush->GetDashPattern();
int dashpatsize = brush->GetDashPatternSize();
int dashoffset = brush->GetDashOffset();
if (dashpatsize <= 0) {
out << "[] " << dashoffset << " ";
} else {
out << "[";
for (int i = 0; i < dashpatsize - 1; i++) {
out << dashpat[i] << " ";
}
out << dashpat[i] << "] " << dashoffset << " ";
}
out << "SetB\n";
}
}
/****************************************************************************/
ArrowMultiLineComp::ArrowMultiLineComp (ArrowMultiLine* g) : MultiLineComp(g){}
ArrowMultiLine* ArrowMultiLineComp::GetArrowMultiLine () {
return (ArrowMultiLine*) GetGraphic();
}
ClassId ArrowMultiLineComp::GetClassId() { return ARROWMULTILINE_COMP; }
ClassId ArrowMultiLineComp::GetSubstId (const char*& delim) {
delim = "%END_ARROWMULTILINE_COMP%";
return MultiLineComp::GetClassId();
}
boolean ArrowMultiLineComp::IsA (ClassId id) {
return ARROWMULTILINE_COMP == id || MultiLineComp::IsA(id);
}
Component* ArrowMultiLineComp::Copy () {
return new ArrowMultiLineComp((ArrowMultiLine*) GetGraphic()->Copy());
}
void ArrowMultiLineComp::Interpret (Command* cmd) {
if (cmd->IsA(ARROW_CMD)) {
ArrowMultiLine* amline = GetArrowMultiLine();
if (amline != nil) {
ArrowCmd* arrowCmd = (ArrowCmd*) cmd;
cmd->Store(this, new _ArrowData(amline->Head(), amline->Tail()));
amline->SetArrows(arrowCmd->Head(), arrowCmd->Tail());
Notify();
}
} else if (cmd->IsA(PATTERN_CMD)) {
GraphicComp::Interpret(cmd);
} else {
MultiLineComp::Interpret(cmd);
}
}
void ArrowMultiLineComp::Uninterpret (Command* cmd) {
if (cmd->IsA(ARROW_CMD)) {
ArrowMultiLine* amline = GetArrowMultiLine();
if (amline != nil) {
_ArrowData* ad = (_ArrowData*) cmd->Recall(this);
if (ad != nil) {
amline->SetArrows(ad->_head, ad->_tail);
Notify();
}
}
} else {
MultiLineComp::Uninterpret(cmd);
}
}
void ArrowMultiLineComp::Read (istream& in) {
MultiLineComp::Read(in);
SF_MultiLine* ml = GetMultiLine();
Coord* x, *y;
int count, h, t;
float scale;
count = ml->GetOriginal(x, y);
in >> h >> t >> scale;
ArrowMultiLine* aml = new ArrowMultiLine(x, y, count, h, t, scale, ml);
SetGraphic(aml);
delete ml;
}
void ArrowMultiLineComp::Write (ostream& out) {
MultiLineComp::Write(out);
ArrowMultiLine* aml = GetArrowMultiLine();
out << aml->Head() << " " << aml->Tail() << " " <<aml->ArrowScale() << " ";
}
/****************************************************************************/
ArrowMultiLineComp* ArrowMultiLineView::GetArrowMultiLineComp () {
return (ArrowMultiLineComp*) GetSubject();
}
ArrowMultiLineView::ArrowMultiLineView (
ArrowMultiLineComp* s
) : MultiLineView(s) { }
ClassId ArrowMultiLineView::GetClassId () { return ARROWMULTILINE_VIEW; }
boolean ArrowMultiLineView::IsA (ClassId id) {
return ARROWMULTILINE_VIEW == id || MultiLineView::IsA(id);
}
void ArrowMultiLineView::Update () {
ArrowMultiLine* amline = (ArrowMultiLine*) GetGraphic();
ArrowMultiLine* subj = GetArrowMultiLineComp()->GetArrowMultiLine();
IncurDamage(amline);
*amline = *subj;
IncurDamage(amline);
EraseHandles();
}
Command* ArrowMultiLineView::InterpretManipulator (Manipulator* m) {
DragManip* dm = (DragManip*) m;
Editor* ed = dm->GetViewer()->GetEditor();
Tool* tool = dm->GetTool();
Transformer* rel = dm->GetTransformer();
Command* cmd = nil;
ArrowVar* aVar = (ArrowVar*) ed->GetState("ArrowVar");
if (tool->IsA(GRAPHIC_COMP_TOOL)) {
GrowingVertices* gv = (GrowingVertices*) dm->GetRubberband();
Coord* x, *y;
int n;
gv->GetCurrent(x, y, n);
if (n > 2 || x[0] != x[1] || y[0] != y[1]) {
BrushVar* brVar = (BrushVar*) ed->GetState("BrushVar");
PatternVar* patVar = (PatternVar*) ed->GetState("PatternVar");
ColorVar* colVar = (ColorVar*) ed->GetState("ColorVar");
if (rel != nil) {
rel = new Transformer(rel);
rel->Invert();
}
ArrowMultiLine* aml = new ArrowMultiLine(
x, y, n, aVar->Head(), aVar->Tail(),
dm->GetViewer()->GetMagnification(), stdgraphic
);
if (brVar != nil) aml->SetBrush(brVar->GetBrush());
if (patVar != nil) aml->SetPattern(patVar->GetPattern());
if (colVar != nil) {
aml->SetColors(colVar->GetFgColor(), colVar->GetBgColor());
}
aml->SetTransformer(rel);
Unref(rel);
cmd = new PasteCmd(ed, new Clipboard(new ArrowMultiLineComp(aml)));
}
delete x;
delete y;
} else if (tool->IsA(RESHAPE_TOOL)) {
GrowingVertices* gv = (GrowingVertices*) dm->GetRubberband();
Coord* x, *y;
int n, pt;
gv->RemoveVertex();
gv->GetCurrent(x, y, n, pt);
if (rel != nil) {
rel = new Transformer(rel);
rel->Invert();
}
ArrowMultiLine* orig = GetArrowMultiLineComp()->GetArrowMultiLine();
ArrowMultiLine* aml = new ArrowMultiLine(
x, y, n, orig->Head(), orig->Tail(),
dm->GetViewer()->GetMagnification(), GetGraphic()
);
delete x;
delete y;
aml->SetTransformer(rel);
Unref(rel);
cmd = new ReplaceCmd(ed, new ArrowMultiLineComp(aml));
} else {
cmd = MultiLineView::InterpretManipulator(m);
}
return cmd;
}
/****************************************************************************/
PSArrowMultiLine::PSArrowMultiLine (ArrowMultiLineComp* s) : PSMultiLine(s) { }
ClassId PSArrowMultiLine::GetClassId () { return PS_ARROWLINE; }
boolean PSArrowMultiLine::IsA (ClassId id) {
return PS_ARROWMULTILINE == id || PSMultiLine::IsA(id);
}
boolean PSArrowMultiLine::Definition (ostream& out) {
ArrowMultiLineComp* comp = (ArrowMultiLineComp*) GetSubject();
ArrowMultiLine* aml = comp->GetArrowMultiLine();
const Coord* x, *y;
int n = aml->GetOriginal(x, y);
float arrow_scale = aml->ArrowScale();
out << "Begin " << MARK << " " << Name() << "\n";
MinGS(out);
out << MARK << " " << n << "\n";
for (int i = 0; i < n; i++) {
out << x[i] << " " << y[i] << "\n";
}
out << n << " " << Name() << "\n";
out << MARK << " " << arrow_scale << "\n";
out << "End\n\n";
return out.good();
}
// this code is entirely for compatibility with older versions of idraw
void PSArrowMultiLine::Brush (ostream& out) {
ArrowMultiLineComp* comp = (ArrowMultiLineComp*) GetSubject();
PSBrush* brush = (PSBrush*) GetGraphicComp()->GetGraphic()->GetBrush();
boolean head, tail;
head = comp->GetArrowMultiLine()->Head();
tail = comp->GetArrowMultiLine()->Tail();
if (brush == nil) {
out << MARK << " b u\n";
} else if (brush->None()) {
out << "none SetB " << MARK << " b n\n";
} else {
int p = brush->GetLinePattern();
out << MARK << " b " << p << "\n";
int w = brush->Width();
out << w << " " << head << " " << tail << " ";
const int* dashpat = brush->GetDashPattern();
int dashpatsize = brush->GetDashPatternSize();
int dashoffset = brush->GetDashOffset();
if (dashpatsize <= 0) {
out << "[] " << dashoffset << " ";
} else {
out << "[";
for (int i = 0; i < dashpatsize - 1; i++) {
out << dashpat[i] << " ";
}
out << dashpat[i] << "] " << dashoffset << " ";
}
out << "SetB\n";
}
}
/****************************************************************************/
ArrowSplineComp::ArrowSplineComp (ArrowOpenBSpline* g) : SplineComp(g) {}
ArrowOpenBSpline* ArrowSplineComp::GetArrowOpenBSpline () {
return (ArrowOpenBSpline*) GetGraphic();
}
ClassId ArrowSplineComp::GetClassId() { return ARROWSPLINE_COMP; }
ClassId ArrowSplineComp::GetSubstId (const char*& delim) {
delim = "%END_ARROWSPLINE_COMP%";
return SplineComp::GetClassId();
}
boolean ArrowSplineComp::IsA (ClassId id) {
return ARROWSPLINE_COMP == id || SplineComp::IsA(id);
}
Component* ArrowSplineComp::Copy () {
return new ArrowSplineComp((ArrowOpenBSpline*) GetGraphic()->Copy());
}
void ArrowSplineComp::Interpret (Command* cmd) {
if (cmd->IsA(ARROW_CMD)) {
ArrowOpenBSpline* amline = GetArrowOpenBSpline();
if (amline != nil) {
ArrowCmd* arrowCmd = (ArrowCmd*) cmd;
cmd->Store(this, new _ArrowData(amline->Head(), amline->Tail()));
amline->SetArrows(arrowCmd->Head(), arrowCmd->Tail());
Notify();
}
} else if (cmd->IsA(PATTERN_CMD)) {
GraphicComp::Interpret(cmd);
} else {
SplineComp::Interpret(cmd);
}
}
void ArrowSplineComp::Uninterpret (Command* cmd) {
if (cmd->IsA(ARROW_CMD)) {
ArrowOpenBSpline* amline = GetArrowOpenBSpline();
if (amline != nil) {
_ArrowData* ad = (_ArrowData*) cmd->Recall(this);
if (ad != nil) {
amline->SetArrows(ad->_head, ad->_tail);
Notify();
}
}
} else {
SplineComp::Uninterpret(cmd);
}
}
void ArrowSplineComp::Read (istream& in) {
SplineComp::Read(in);
SFH_OpenBSpline* spl = GetSpline();
Coord* x, *y;
int count, h, t;
float scale;
count = spl->GetOriginal(x, y);
in >> h >> t >> scale;
ArrowOpenBSpline* as = new ArrowOpenBSpline(x, y, count, h, t, scale, spl);
SetGraphic(as);
delete spl;
}
void ArrowSplineComp::Write (ostream& out) {
SplineComp::Write(out);
ArrowOpenBSpline* as = GetArrowOpenBSpline();
out << as->Head() << " " << as->Tail() << " " << as->ArrowScale() << " ";
}
/****************************************************************************/
ArrowSplineComp* ArrowSplineView::GetArrowSplineComp () {
return (ArrowSplineComp*) GetSubject();
}
ArrowSplineView::ArrowSplineView (ArrowSplineComp* s) : SplineView(s) { }
ClassId ArrowSplineView::GetClassId () { return ARROWSPLINE_VIEW; }
boolean ArrowSplineView::IsA (ClassId id) {
return ARROWSPLINE_VIEW == id || SplineView::IsA(id);
}
void ArrowSplineView::Update () {
ArrowOpenBSpline* amline = (ArrowOpenBSpline*) GetGraphic();
ArrowOpenBSpline* subj = GetArrowSplineComp()->GetArrowOpenBSpline();
IncurDamage(amline);
*amline = *subj;
IncurDamage(amline);
EraseHandles();
}
Command* ArrowSplineView::InterpretManipulator (Manipulator* m) {
DragManip* dm = (DragManip*) m;
Editor* ed = dm->GetViewer()->GetEditor();
Tool* tool = dm->GetTool();
Transformer* rel = dm->GetTransformer();
Command* cmd = nil;
ArrowVar* aVar = (ArrowVar*) ed->GetState("ArrowVar");
if (tool->IsA(GRAPHIC_COMP_TOOL)) {
GrowingVertices* gv = (GrowingVertices*) dm->GetRubberband();
Coord* x, *y;
int n;
gv->GetCurrent(x, y, n);
if (n > 2 || x[0] != x[1] || y[0] != y[1]) {
BrushVar* brVar = (BrushVar*) ed->GetState("BrushVar");
PatternVar* patVar = (PatternVar*) ed->GetState("PatternVar");
ColorVar* colVar = (ColorVar*) ed->GetState("ColorVar");
if (rel != nil) {
rel = new Transformer(rel);
rel->Invert();
}
ArrowOpenBSpline* aml = new ArrowOpenBSpline(
x, y, n, aVar->Head(), aVar->Tail(),
dm->GetViewer()->GetMagnification(), stdgraphic
);
if (brVar != nil) aml->SetBrush(brVar->GetBrush());
if (patVar != nil) aml->SetPattern(patVar->GetPattern());
if (colVar != nil) {
aml->SetColors(colVar->GetFgColor(), colVar->GetBgColor());
}
aml->SetTransformer(rel);
Unref(rel);
cmd = new PasteCmd(ed, new Clipboard(new ArrowSplineComp(aml)));
}
delete x;
delete y;
} else if (tool->IsA(RESHAPE_TOOL)) {
GrowingVertices* gv = (GrowingVertices*) dm->GetRubberband();
Coord* x, *y;
int n, pt;
gv->RemoveVertex();
gv->GetCurrent(x, y, n, pt);
if (rel != nil) {
rel = new Transformer(rel);
rel->Invert();
}
ArrowOpenBSpline* orig = GetArrowSplineComp()->GetArrowOpenBSpline();
ArrowOpenBSpline* aml = new ArrowOpenBSpline(
x, y, n, orig->Head(), orig->Tail(),
dm->GetViewer()->GetMagnification(), GetGraphic()
);
delete x;
delete y;
aml->SetTransformer(rel);
Unref(rel);
cmd = new ReplaceCmd(ed, new ArrowSplineComp(aml));
} else {
cmd = SplineView::InterpretManipulator(m);
}
return cmd;
}
/****************************************************************************/
PSArrowSpline::PSArrowSpline (ArrowSplineComp* s) : PSSpline(s) { }
ClassId PSArrowSpline::GetClassId () { return PS_ARROWLINE; }
boolean PSArrowSpline::IsA (ClassId id) {
return PS_ARROWSPLINE == id || PSSpline::IsA(id);
}
boolean PSArrowSpline::Definition (ostream& out) {
ArrowSplineComp* comp = (ArrowSplineComp*) GetSubject();
ArrowOpenBSpline* aml = comp->GetArrowOpenBSpline();
const Coord* x, *y;
int n = aml->GetOriginal(x, y);
float arrow_scale = aml->ArrowScale();
out << "Begin " << MARK << " " << Name() << "\n";
MinGS(out);
out << MARK << " " << n << "\n";
for (int i = 0; i < n; i++) {
out << x[i] << " " << y[i] << "\n";
}
out << n << " " << Name() << "\n";
out << MARK << " " << arrow_scale << "\n";
out << "End\n\n";
return out.good();
}
// this code is entirely for compatibility with older versions of idraw
void PSArrowSpline::Brush (ostream& out) {
ArrowSplineComp* comp = (ArrowSplineComp*) GetSubject();
PSBrush* brush = (PSBrush*) GetGraphicComp()->GetGraphic()->GetBrush();
boolean head, tail;
head = comp->GetArrowOpenBSpline()->Head();
tail = comp->GetArrowOpenBSpline()->Tail();
if (brush == nil) {
out << MARK << " b u\n";
} else if (brush->None()) {
out << "none SetB " << MARK << " b n\n";
} else {
int p = brush->GetLinePattern();
out << MARK << " b " << p << "\n";
int w = brush->Width();
out << w << " " << head << " " << tail << " ";
const int* dashpat = brush->GetDashPattern();
int dashpatsize = brush->GetDashPatternSize();
int dashoffset = brush->GetDashOffset();
if (dashpatsize <= 0) {
out << "[] " << dashoffset << " ";
} else {
out << "[";
for (int i = 0; i < dashpatsize - 1; i++) {
out << dashpat[i] << " ";
}
out << dashpat[i] << "] " << dashoffset << " ";
}
out << "SetB\n";
}
}