mirror of
https://github.com/octoleo/plantuml.git
synced 2024-11-24 13:57:33 +00:00
Import version 1.2020.16
This commit is contained in:
parent
345a1eeb7c
commit
55d1d81055
4
pom.xml
4
pom.xml
@ -36,7 +36,7 @@
|
||||
|
||||
<groupId>net.sourceforge.plantuml</groupId>
|
||||
<artifactId>plantuml</artifactId>
|
||||
<version>1.2020.15-SNAPSHOT</version>
|
||||
<version>1.2020.16-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>PlantUML</name>
|
||||
@ -136,7 +136,7 @@
|
||||
<configuration>
|
||||
<source>1.7</source>
|
||||
<target>1.7</target>
|
||||
<debug>false</debug>
|
||||
<debug>true</debug>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
|
@ -260,3 +260,21 @@ circle {
|
||||
LineColor black
|
||||
Shadowing 3.0
|
||||
}
|
||||
|
||||
|
||||
task {
|
||||
FontSize 11
|
||||
}
|
||||
|
||||
milestone {
|
||||
FontSize 11
|
||||
BackGroundColor black
|
||||
LineColor black
|
||||
}
|
||||
|
||||
ganttDiagram {
|
||||
note {
|
||||
FontSize 9
|
||||
Shadowing 0.0
|
||||
}
|
||||
}
|
||||
|
@ -348,8 +348,10 @@ public class Option {
|
||||
checkMetadata = true;
|
||||
} else if (s.equalsIgnoreCase("-stdrpt:1")) {
|
||||
stdrpt = 1;
|
||||
} else if (s.equalsIgnoreCase("-stdrpt:2")) {
|
||||
stdrpt = 2;
|
||||
} else if (s.equalsIgnoreCase("-stdrpt")) {
|
||||
stdrpt = 1;
|
||||
stdrpt = 2;
|
||||
} else if (s.equalsIgnoreCase("-pipeimageindex")) {
|
||||
i++;
|
||||
if (i == arg.length) {
|
||||
@ -379,6 +381,9 @@ public class Option {
|
||||
if (stdrpt == 1) {
|
||||
return new StdrptV1();
|
||||
}
|
||||
if (stdrpt == 2) {
|
||||
return new StdrptV2();
|
||||
}
|
||||
// Legacy case
|
||||
if (isPipe() || isPipeMap() || isSyntax()) {
|
||||
return new StdrptPipe0();
|
||||
|
@ -164,7 +164,7 @@ public class Pipe {
|
||||
}
|
||||
}
|
||||
String source = sb.toString().trim();
|
||||
if (source.length() == 0) {
|
||||
if (sb.length() == 0) {
|
||||
return null;
|
||||
}
|
||||
if (source.startsWith("@start") == false) {
|
||||
|
@ -199,12 +199,8 @@ public class Run {
|
||||
}
|
||||
|
||||
if (OptionFlags.getInstance().isGui() == false) {
|
||||
if (error.hasError()) {
|
||||
Log.error("Some diagram description contains errors");
|
||||
System.exit(error.getExitCode());
|
||||
}
|
||||
if (error.isNoData()) {
|
||||
Log.error("No diagram found");
|
||||
if (error.hasError() || error.isNoData()) {
|
||||
option.getStdrpt().finalMessage(error);
|
||||
System.exit(error.getExitCode());
|
||||
}
|
||||
|
||||
@ -539,7 +535,7 @@ public class Run {
|
||||
rpt.printInfo(System.err, s.getDiagram());
|
||||
}
|
||||
|
||||
hasErrors(f, result, error);
|
||||
hasErrors(f, result, error, rpt);
|
||||
}
|
||||
|
||||
private static void extractPreproc(Option option, final ISourceFileReader sourceFileReader) throws IOException {
|
||||
@ -570,15 +566,16 @@ public class Run {
|
||||
}
|
||||
}
|
||||
|
||||
private static void hasErrors(File f, final List<GeneratedImage> list, ErrorStatus error) throws IOException {
|
||||
private static void hasErrors(File file, final List<GeneratedImage> list, ErrorStatus error, Stdrpt stdrpt)
|
||||
throws IOException {
|
||||
if (list.size() == 0) {
|
||||
// error.goNoData();
|
||||
return;
|
||||
}
|
||||
for (GeneratedImage i : list) {
|
||||
final int lineError = i.lineErrorRaw();
|
||||
for (GeneratedImage image : list) {
|
||||
final int lineError = image.lineErrorRaw();
|
||||
if (lineError != -1) {
|
||||
Log.error("Error line " + lineError + " in file: " + f.getPath());
|
||||
stdrpt.errorLine(lineError, file);
|
||||
error.goWithError();
|
||||
return;
|
||||
}
|
||||
|
@ -99,6 +99,9 @@ public class SkinParam implements ISkinParam {
|
||||
if (type == UmlDiagramType.WBS) {
|
||||
USE_STYLE2.set(true);
|
||||
}
|
||||
if (type == UmlDiagramType.GANTT) {
|
||||
USE_STYLE2.set(true);
|
||||
}
|
||||
if (type == UmlDiagramType.SEQUENCE) {
|
||||
// skin = "debug.skin";
|
||||
// USE_STYLE2.set(true);
|
||||
|
@ -35,6 +35,7 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.PrintStream;
|
||||
|
||||
import net.sourceforge.plantuml.core.Diagram;
|
||||
@ -43,4 +44,8 @@ public interface Stdrpt {
|
||||
|
||||
public void printInfo(PrintStream output, Diagram sys);
|
||||
|
||||
public void finalMessage(ErrorStatus error);
|
||||
|
||||
public void errorLine(int lineError, File file);
|
||||
|
||||
}
|
||||
|
@ -35,6 +35,7 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.PrintStream;
|
||||
|
||||
import net.sourceforge.plantuml.core.Diagram;
|
||||
@ -44,4 +45,17 @@ public class StdrptNull implements Stdrpt {
|
||||
public void printInfo(final PrintStream output, final Diagram sys) {
|
||||
}
|
||||
|
||||
public void finalMessage(ErrorStatus error) {
|
||||
if (error.hasError()) {
|
||||
Log.error("Some diagram description contains errors");
|
||||
}
|
||||
if (error.isNoData()) {
|
||||
Log.error("No diagram found");
|
||||
}
|
||||
}
|
||||
|
||||
public void errorLine(int lineError, File file) {
|
||||
Log.error("Error line " + lineError + " in file: " + file.getPath());
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -35,6 +35,7 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.PrintStream;
|
||||
|
||||
import net.sourceforge.plantuml.core.Diagram;
|
||||
@ -54,4 +55,17 @@ public class StdrptPipe0 implements Stdrpt {
|
||||
}
|
||||
}
|
||||
|
||||
public void finalMessage(ErrorStatus error) {
|
||||
if (error.hasError()) {
|
||||
Log.error("Some diagram description contains errors");
|
||||
}
|
||||
if (error.isNoData()) {
|
||||
Log.error("No diagram found");
|
||||
}
|
||||
}
|
||||
|
||||
public void errorLine(int lineError, File file) {
|
||||
Log.error("Error line " + lineError + " in file: " + file.getPath());
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -35,6 +35,7 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.PrintStream;
|
||||
|
||||
import net.sourceforge.plantuml.command.PSystemAbstractFactory;
|
||||
@ -53,6 +54,10 @@ public class StdrptV1 implements Stdrpt {
|
||||
}
|
||||
}
|
||||
|
||||
public void errorLine(int lineError, File file) {
|
||||
Log.error("Error line " + lineError + " in file: " + file.getPath());
|
||||
}
|
||||
|
||||
private void out(final PrintStream output, final PSystemError err) {
|
||||
output.println("protocolVersion=1");
|
||||
if (empty(err)) {
|
||||
@ -78,4 +83,13 @@ public class StdrptV1 implements Stdrpt {
|
||||
return false;
|
||||
}
|
||||
|
||||
public void finalMessage(ErrorStatus error) {
|
||||
if (error.hasError()) {
|
||||
Log.error("Some diagram description contains errors");
|
||||
}
|
||||
if (error.isNoData()) {
|
||||
Log.error("No diagram found");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
95
src/net/sourceforge/plantuml/StdrptV2.java
Normal file
95
src/net/sourceforge/plantuml/StdrptV2.java
Normal file
@ -0,0 +1,95 @@
|
||||
/* ========================================================================
|
||||
* PlantUML : a free UML diagram generator
|
||||
* ========================================================================
|
||||
*
|
||||
* (C) Copyright 2009-2020, Arnaud Roques
|
||||
*
|
||||
* Project Info: http://plantuml.com
|
||||
*
|
||||
* If you like this project or if you find it useful, you can support us at:
|
||||
*
|
||||
* http://plantuml.com/patreon (only 1$ per month!)
|
||||
* http://plantuml.com/paypal
|
||||
*
|
||||
* This file is part of PlantUML.
|
||||
*
|
||||
* PlantUML is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* PlantUML distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
* USA.
|
||||
*
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.PrintStream;
|
||||
|
||||
import net.sourceforge.plantuml.command.PSystemAbstractFactory;
|
||||
import net.sourceforge.plantuml.core.Diagram;
|
||||
import net.sourceforge.plantuml.eggs.PSystemWelcome;
|
||||
import net.sourceforge.plantuml.error.PSystemError;
|
||||
|
||||
public class StdrptV2 implements Stdrpt {
|
||||
|
||||
public void finalMessage() {
|
||||
}
|
||||
|
||||
public void finalMessage(ErrorStatus error) {
|
||||
}
|
||||
|
||||
public void errorLine(int lineError, File file) {
|
||||
}
|
||||
|
||||
public void printInfo(final PrintStream output, Diagram sys) {
|
||||
if (sys instanceof PSystemWelcome) {
|
||||
sys = null;
|
||||
}
|
||||
if (sys == null || sys instanceof PSystemError) {
|
||||
out(output, (PSystemError) sys);
|
||||
}
|
||||
}
|
||||
|
||||
private void out(final PrintStream output, final PSystemError err) {
|
||||
final StringBuilder line = new StringBuilder();
|
||||
if (empty(err)) {
|
||||
} else {
|
||||
line.append(err.getLineLocation().getDescription());
|
||||
line.append(":");
|
||||
line.append(err.getLineLocation().getPosition());
|
||||
line.append(":");
|
||||
line.append("error");
|
||||
line.append(":");
|
||||
for (ErrorUml er : err.getErrorsUml()) {
|
||||
line.append(er.getError());
|
||||
}
|
||||
}
|
||||
output.println(line);
|
||||
output.flush();
|
||||
}
|
||||
|
||||
private boolean empty(final PSystemError err) {
|
||||
if (err == null) {
|
||||
return true;
|
||||
}
|
||||
for (ErrorUml er : err.getErrorsUml()) {
|
||||
if (PSystemAbstractFactory.EMPTY_DESCRIPTION.equals(er.getError()))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
@ -35,12 +35,19 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import net.sourceforge.plantuml.command.BlocLines;
|
||||
import net.sourceforge.plantuml.command.CommandControl;
|
||||
import net.sourceforge.plantuml.command.CommandExecutionResult;
|
||||
import net.sourceforge.plantuml.command.CommandSkinParamMultilines;
|
||||
import net.sourceforge.plantuml.core.Diagram;
|
||||
import net.sourceforge.plantuml.cucadiagram.Display;
|
||||
import net.sourceforge.plantuml.cucadiagram.DisplayPositionned;
|
||||
import net.sourceforge.plantuml.cucadiagram.DisplaySection;
|
||||
import net.sourceforge.plantuml.graphic.HorizontalAlignment;
|
||||
import net.sourceforge.plantuml.graphic.VerticalAlignment;
|
||||
import net.sourceforge.plantuml.sprite.Sprite;
|
||||
|
||||
public abstract class TitledDiagram extends AbstractPSystem implements Diagram, Annotated {
|
||||
|
||||
@ -52,7 +59,82 @@ public abstract class TitledDiagram extends AbstractPSystem implements Diagram,
|
||||
private final DisplaySection footer = DisplaySection.none();
|
||||
private Display mainFrame;
|
||||
|
||||
|
||||
private final SkinParam skinParam;
|
||||
|
||||
public TitledDiagram() {
|
||||
this.skinParam = SkinParam.create(getUmlDiagramType());
|
||||
}
|
||||
|
||||
public TitledDiagram(ISkinSimple orig) {
|
||||
this();
|
||||
if (orig != null) {
|
||||
this.skinParam.copyAllFrom(orig);
|
||||
}
|
||||
}
|
||||
|
||||
abstract public UmlDiagramType getUmlDiagramType();
|
||||
|
||||
public final ISkinParam getSkinParam() {
|
||||
return skinParam;
|
||||
}
|
||||
|
||||
public void setParam(String key, String value) {
|
||||
skinParam.setParam(StringUtils.goLowerCase(key), value);
|
||||
}
|
||||
|
||||
public void addSprite(String name, Sprite sprite) {
|
||||
skinParam.addSprite(name, sprite);
|
||||
}
|
||||
|
||||
public CommandExecutionResult loadSkin(String newSkin) throws IOException {
|
||||
getSkinParam().setDefaultSkin(newSkin + ".skin");
|
||||
return CommandExecutionResult.ok();
|
||||
// final String res = "/skin/" + filename + ".skin";
|
||||
// final InputStream internalIs = UmlDiagram.class.getResourceAsStream(res);
|
||||
// if (internalIs != null) {
|
||||
// final BlocLines lines2 = BlocLines.load(internalIs, new
|
||||
// LineLocationImpl(filename, null));
|
||||
// return loadSkinInternal(lines2);
|
||||
// }
|
||||
// if (OptionFlags.ALLOW_INCLUDE == false) {
|
||||
// return CommandExecutionResult.ok();
|
||||
// }
|
||||
// final File f = FileSystem.getInstance().getFile(filename + ".skin");
|
||||
// if (f == null || f.exists() == false || f.canRead() == false) {
|
||||
// return CommandExecutionResult.error("Cannot load skin from " + filename);
|
||||
// }
|
||||
// final BlocLines lines = BlocLines.load(f, new LineLocationImpl(f.getName(),
|
||||
// null));
|
||||
// return loadSkinInternal(lines);
|
||||
}
|
||||
|
||||
// private CommandExecutionResult loadSkinInternal(final BlocLines lines) {
|
||||
// final CommandSkinParam cmd1 = new CommandSkinParam();
|
||||
// final CommandSkinParamMultilines cmd2 = new CommandSkinParamMultilines();
|
||||
// for (int i = 0; i < lines.size(); i++) {
|
||||
// final BlocLines ext1 = lines.subList(i, i + 1);
|
||||
// if (cmd1.isValid(ext1) == CommandControl.OK) {
|
||||
// cmd1.execute(this, ext1);
|
||||
// } else if (cmd2.isValid(ext1) == CommandControl.OK_PARTIAL) {
|
||||
// i = tryMultilines(cmd2, i, lines);
|
||||
// }
|
||||
// }
|
||||
// return CommandExecutionResult.ok();
|
||||
// }
|
||||
|
||||
// private int tryMultilines(CommandSkinParamMultilines cmd2, int i, BlocLines lines) {
|
||||
// for (int j = i + 1; j <= lines.size(); j++) {
|
||||
// final BlocLines ext1 = lines.subList(i, j);
|
||||
// if (cmd2.isValid(ext1) == CommandControl.OK) {
|
||||
// cmd2.execute(this, ext1);
|
||||
// return j;
|
||||
// } else if (cmd2.isValid(ext1) == CommandControl.NOT_OK) {
|
||||
// return j;
|
||||
// }
|
||||
// }
|
||||
// return i;
|
||||
// }
|
||||
|
||||
final public void setTitle(DisplayPositionned title) {
|
||||
if (title.isNull() || title.getDisplay().isWhite()) {
|
||||
return;
|
||||
@ -64,7 +146,7 @@ public abstract class TitledDiagram extends AbstractPSystem implements Diagram,
|
||||
final public DisplayPositionned getTitle() {
|
||||
return title;
|
||||
}
|
||||
|
||||
|
||||
final public void setMainFrame(Display mainFrame) {
|
||||
this.mainFrame = mainFrame;
|
||||
}
|
||||
@ -76,7 +158,7 @@ public abstract class TitledDiagram extends AbstractPSystem implements Diagram,
|
||||
final public DisplayPositionned getCaption() {
|
||||
return caption;
|
||||
}
|
||||
|
||||
|
||||
final public DisplaySection getHeader() {
|
||||
return header;
|
||||
}
|
||||
@ -84,7 +166,7 @@ public abstract class TitledDiagram extends AbstractPSystem implements Diagram,
|
||||
final public DisplaySection getFooter() {
|
||||
return footer;
|
||||
}
|
||||
|
||||
|
||||
final public DisplayPositionned getLegend() {
|
||||
return legend;
|
||||
}
|
||||
@ -97,10 +179,4 @@ public abstract class TitledDiagram extends AbstractPSystem implements Diagram,
|
||||
return mainFrame;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
@ -100,17 +100,12 @@ public abstract class UmlDiagram extends TitledDiagram implements Diagram, Annot
|
||||
private final Pragma pragma = new Pragma();
|
||||
private Animation animation;
|
||||
|
||||
private final SkinParam skinParam;
|
||||
|
||||
public UmlDiagram() {
|
||||
this.skinParam = SkinParam.create(getUmlDiagramType());
|
||||
super();
|
||||
}
|
||||
|
||||
public UmlDiagram(ISkinSimple orig) {
|
||||
this();
|
||||
if (orig != null) {
|
||||
this.skinParam.copyAllFrom(orig);
|
||||
}
|
||||
super(orig);
|
||||
}
|
||||
|
||||
final public int getMinwidth() {
|
||||
@ -129,14 +124,6 @@ public abstract class UmlDiagram extends TitledDiagram implements Diagram, Annot
|
||||
this.rotation = rotation;
|
||||
}
|
||||
|
||||
public final ISkinParam getSkinParam() {
|
||||
return skinParam;
|
||||
}
|
||||
|
||||
public void setParam(String key, String value) {
|
||||
skinParam.setParam(StringUtils.goLowerCase(key), value);
|
||||
}
|
||||
|
||||
public final DisplaySection getFooterOrHeaderTeoz(FontParam param) {
|
||||
if (param == FontParam.FOOTER) {
|
||||
return getFooter();
|
||||
@ -147,8 +134,6 @@ public abstract class UmlDiagram extends TitledDiagram implements Diagram, Annot
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
|
||||
abstract public UmlDiagramType getUmlDiagramType();
|
||||
|
||||
public Pragma getPragma() {
|
||||
return pragma;
|
||||
}
|
||||
@ -399,10 +384,6 @@ public abstract class UmlDiagram extends TitledDiagram implements Diagram, Annot
|
||||
return null;
|
||||
}
|
||||
|
||||
public void addSprite(String name, Sprite sprite) {
|
||||
skinParam.addSprite(name, sprite);
|
||||
}
|
||||
|
||||
private boolean useJDot;
|
||||
|
||||
public void setUseJDot(boolean useJDot) {
|
||||
@ -417,54 +398,6 @@ public abstract class UmlDiagram extends TitledDiagram implements Diagram, Annot
|
||||
return useJDot;
|
||||
}
|
||||
|
||||
public CommandExecutionResult loadSkin(String newSkin) throws IOException {
|
||||
getSkinParam().setDefaultSkin(newSkin + ".skin");
|
||||
return CommandExecutionResult.ok();
|
||||
// final String res = "/skin/" + filename + ".skin";
|
||||
// final InputStream internalIs = UmlDiagram.class.getResourceAsStream(res);
|
||||
// if (internalIs != null) {
|
||||
// final BlocLines lines2 = BlocLines.load(internalIs, new
|
||||
// LineLocationImpl(filename, null));
|
||||
// return loadSkinInternal(lines2);
|
||||
// }
|
||||
// if (OptionFlags.ALLOW_INCLUDE == false) {
|
||||
// return CommandExecutionResult.ok();
|
||||
// }
|
||||
// final File f = FileSystem.getInstance().getFile(filename + ".skin");
|
||||
// if (f == null || f.exists() == false || f.canRead() == false) {
|
||||
// return CommandExecutionResult.error("Cannot load skin from " + filename);
|
||||
// }
|
||||
// final BlocLines lines = BlocLines.load(f, new LineLocationImpl(f.getName(),
|
||||
// null));
|
||||
// return loadSkinInternal(lines);
|
||||
}
|
||||
|
||||
// private CommandExecutionResult loadSkinInternal(final BlocLines lines) {
|
||||
// final CommandSkinParam cmd1 = new CommandSkinParam();
|
||||
// final CommandSkinParamMultilines cmd2 = new CommandSkinParamMultilines();
|
||||
// for (int i = 0; i < lines.size(); i++) {
|
||||
// final BlocLines ext1 = lines.subList(i, i + 1);
|
||||
// if (cmd1.isValid(ext1) == CommandControl.OK) {
|
||||
// cmd1.execute(this, ext1);
|
||||
// } else if (cmd2.isValid(ext1) == CommandControl.OK_PARTIAL) {
|
||||
// i = tryMultilines(cmd2, i, lines);
|
||||
// }
|
||||
// }
|
||||
// return CommandExecutionResult.ok();
|
||||
// }
|
||||
|
||||
private int tryMultilines(CommandSkinParamMultilines cmd2, int i, BlocLines lines) {
|
||||
for (int j = i + 1; j <= lines.size(); j++) {
|
||||
final BlocLines ext1 = lines.subList(i, j);
|
||||
if (cmd2.isValid(ext1) == CommandControl.OK) {
|
||||
cmd2.execute(this, ext1);
|
||||
return j;
|
||||
} else if (cmd2.isValid(ext1) == CommandControl.NOT_OK) {
|
||||
return j;
|
||||
}
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
public void setHideEmptyDescription(boolean hideEmptyDescription) {
|
||||
}
|
||||
|
@ -39,7 +39,7 @@ import net.sourceforge.plantuml.style.SName;
|
||||
|
||||
public enum UmlDiagramType {
|
||||
SEQUENCE, STATE, CLASS, OBJECT, ACTIVITY, DESCRIPTION, COMPOSITE, FLOW, TIMING, BPM, NWDIAG, MINDMAP, WBS, WIRE,
|
||||
HELP;
|
||||
HELP, GANTT;
|
||||
|
||||
public SName getStyleName() {
|
||||
if (this == SEQUENCE) {
|
||||
@ -69,6 +69,9 @@ public enum UmlDiagramType {
|
||||
if (this == WBS) {
|
||||
return SName.wbsDiagram;
|
||||
}
|
||||
if (this == GANTT) {
|
||||
return SName.ganttDiagram;
|
||||
}
|
||||
return SName.activityDiagram;
|
||||
}
|
||||
}
|
||||
|
@ -38,9 +38,8 @@ package net.sourceforge.plantuml;
|
||||
import java.util.Comparator;
|
||||
|
||||
import net.sourceforge.plantuml.cucadiagram.dot.DotMaker2;
|
||||
import net.sourceforge.plantuml.project.lang.Complement;
|
||||
|
||||
public class Url implements EnsureVisible, Complement {
|
||||
public class Url implements EnsureVisible {
|
||||
|
||||
private final String url;
|
||||
private final String tooltip;
|
||||
|
@ -35,6 +35,8 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml.activitydiagram3;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import net.sourceforge.plantuml.activitydiagram3.ftile.BoxStyle;
|
||||
@ -60,6 +62,7 @@ public class InstructionRepeat implements Instruction {
|
||||
private final BoxStyle boxStyleIn;
|
||||
|
||||
private Display backward = Display.NULL;
|
||||
private List<PositionedNote> backwardNotes = new ArrayList<PositionedNote>();
|
||||
private Display test = Display.NULL;
|
||||
private Display yes = Display.NULL;
|
||||
private Display out = Display.NULL;
|
||||
@ -104,8 +107,7 @@ public class InstructionRepeat implements Instruction {
|
||||
}
|
||||
|
||||
public Ftile createFtile(FtileFactory factory) {
|
||||
final Ftile back = Display.isNull(backward) ? null
|
||||
: factory.activity(backward, swimlane, boxStyle, Colors.empty());
|
||||
final Ftile back = getBackward(factory);
|
||||
final Ftile decorateOut = factory.decorateOut(repeatList.createFtile(factory), endRepeatLinkRendering);
|
||||
final Ftile result = factory.repeat(boxStyleIn, swimlane, swimlaneOut, startLabel, decorateOut, test, yes, out,
|
||||
colors, backRepeatLinkRendering, back, isLastOfTheParent());
|
||||
@ -115,6 +117,17 @@ public class InstructionRepeat implements Instruction {
|
||||
return result;
|
||||
}
|
||||
|
||||
private Ftile getBackward(FtileFactory factory) {
|
||||
if (Display.isNull(backward)) {
|
||||
return null;
|
||||
}
|
||||
Ftile result = factory.activity(backward, swimlane, boxStyle, Colors.empty());
|
||||
if (backwardNotes.size() > 0) {
|
||||
result = factory.addNote(result, swimlane, backwardNotes);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public Instruction getParent() {
|
||||
return parent;
|
||||
}
|
||||
@ -152,7 +165,12 @@ public class InstructionRepeat implements Instruction {
|
||||
}
|
||||
|
||||
public boolean addNote(Display note, NotePosition position, NoteType type, Colors colors, Swimlane swimlaneNote) {
|
||||
return repeatList.addNote(note, position, type, colors, swimlaneNote);
|
||||
if (Display.isNull(backward)) {
|
||||
return repeatList.addNote(note, position, type, colors, swimlaneNote);
|
||||
}
|
||||
this.backwardNotes.add(new PositionedNote(note, position, type, colors, swimlaneNote));
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
public Set<Swimlane> getSwimlanes() {
|
||||
|
@ -77,8 +77,7 @@ public class CommandCreateClass extends SingleLineCommand2<ClassDiagram> {
|
||||
}
|
||||
|
||||
private static IRegex getRegexConcat() {
|
||||
return RegexConcat.build(CommandCreateClass.class.getName(),
|
||||
RegexLeaf.start(), //
|
||||
return RegexConcat.build(CommandCreateClass.class.getName(), RegexLeaf.start(), //
|
||||
new RegexLeaf("TYPE", //
|
||||
"(interface|enum|annotation|abstract[%s]+class|abstract|class|entity|circle|diamond)"), //
|
||||
RegexLeaf.spaceOneOrMore(), //
|
||||
@ -97,8 +96,8 @@ public class CommandCreateClass extends SingleLineCommand2<ClassDiagram> {
|
||||
new RegexLeaf("DISPLAY2", DISPLAY_WITH_GENERIC)), //
|
||||
new RegexLeaf("CODE3", "(" + CODE + ")"), //
|
||||
new RegexLeaf("CODE4", "[%g]([^%g]+)[%g]")), //
|
||||
new RegexOptional(new RegexConcat(RegexLeaf.spaceZeroOrMore(), new RegexLeaf("GENERIC", "\\<("
|
||||
+ GenericRegexProducer.PATTERN + ")\\>"))), //
|
||||
new RegexOptional(new RegexConcat(RegexLeaf.spaceZeroOrMore(),
|
||||
new RegexLeaf("GENERIC", "\\<(" + GenericRegexProducer.PATTERN + ")\\>"))), //
|
||||
RegexLeaf.spaceZeroOrMore(), //
|
||||
new RegexLeaf("STEREO", "(\\<{2}.*\\>{2})?"), //
|
||||
RegexLeaf.spaceZeroOrMore(), //
|
||||
@ -108,14 +107,14 @@ public class CommandCreateClass extends SingleLineCommand2<ClassDiagram> {
|
||||
RegexLeaf.spaceZeroOrMore(), //
|
||||
color().getRegex(), //
|
||||
RegexLeaf.spaceZeroOrMore(), //
|
||||
new RegexOptional(new RegexConcat(new RegexLeaf("##"), new RegexLeaf("LINECOLOR",
|
||||
"(?:\\[(dotted|dashed|bold)\\])?(\\w+)?"))), //
|
||||
new RegexOptional(new RegexConcat(RegexLeaf.spaceOneOrMore(), new RegexLeaf("EXTENDS",
|
||||
"(extends)[%s]+(" + CommandCreateClassMultilines.CODES + ")"))), //
|
||||
new RegexOptional(new RegexConcat(RegexLeaf.spaceOneOrMore(), new RegexLeaf("IMPLEMENTS",
|
||||
"(implements)[%s]+(" + CommandCreateClassMultilines.CODES + ")"))), //
|
||||
new RegexOptional(new RegexConcat(RegexLeaf.spaceZeroOrMore(), new RegexLeaf("\\{"), RegexLeaf
|
||||
.spaceZeroOrMore(), new RegexLeaf("\\}"))), //
|
||||
new RegexOptional(new RegexConcat(new RegexLeaf("##"),
|
||||
new RegexLeaf("LINECOLOR", "(?:\\[(dotted|dashed|bold)\\])?(\\w+)?"))), //
|
||||
new RegexOptional(new RegexConcat(RegexLeaf.spaceOneOrMore(),
|
||||
new RegexLeaf("EXTENDS", "(extends)[%s]+(" + CommandCreateClassMultilines.CODES + ")"))), //
|
||||
new RegexOptional(new RegexConcat(RegexLeaf.spaceOneOrMore(),
|
||||
new RegexLeaf("IMPLEMENTS", "(implements)[%s]+(" + CommandCreateClassMultilines.CODES + ")"))), //
|
||||
new RegexOptional(new RegexConcat(RegexLeaf.spaceZeroOrMore(), new RegexLeaf("\\{"),
|
||||
RegexLeaf.spaceZeroOrMore(), new RegexLeaf("\\}"))), //
|
||||
RegexLeaf.end());
|
||||
}
|
||||
|
||||
@ -156,9 +155,9 @@ public class CommandCreateClass extends SingleLineCommand2<ClassDiagram> {
|
||||
}
|
||||
}
|
||||
if (stereotype != null) {
|
||||
entity.setStereotype(new Stereotype(stereotype, diagram.getSkinParam().getCircledCharacterRadius(), diagram
|
||||
.getSkinParam().getFont(null, false, FontParam.CIRCLED_CHARACTER), diagram.getSkinParam()
|
||||
.getIHtmlColorSet()));
|
||||
entity.setStereotype(new Stereotype(stereotype, diagram.getSkinParam().getCircledCharacterRadius(),
|
||||
diagram.getSkinParam().getFont(null, false, FontParam.CIRCLED_CHARACTER),
|
||||
diagram.getSkinParam().getIHtmlColorSet()));
|
||||
}
|
||||
if (generic != null) {
|
||||
entity.setGeneric(generic);
|
||||
@ -170,6 +169,7 @@ public class CommandCreateClass extends SingleLineCommand2<ClassDiagram> {
|
||||
final Url url = urlBuilder.getUrl(urlString);
|
||||
entity.addUrl(url);
|
||||
}
|
||||
entity.setCodeLine(location);
|
||||
|
||||
Colors colors = color().getColor(arg, diagram.getSkinParam().getIHtmlColorSet());
|
||||
|
||||
@ -183,7 +183,8 @@ public class CommandCreateClass extends SingleLineCommand2<ClassDiagram> {
|
||||
entity.setColors(colors);
|
||||
|
||||
// entity.setSpecificColorTOBEREMOVED(ColorType.LINE, lineColor);
|
||||
// entity.setSpecificColorTOBEREMOVED(ColorType.HEADER, colors.getColor(ColorType.HEADER));
|
||||
// entity.setSpecificColorTOBEREMOVED(ColorType.HEADER,
|
||||
// colors.getColor(ColorType.HEADER));
|
||||
//
|
||||
// if (colors.getLineStyle() != null) {
|
||||
// entity.setSpecificLineStroke(LinkStyle.getStroke(colors.getLineStyle()));
|
||||
@ -200,9 +201,11 @@ public class CommandCreateClass extends SingleLineCommand2<ClassDiagram> {
|
||||
|
||||
return CommandExecutionResult.ok();
|
||||
}
|
||||
// public static void manageExtends(ClassDiagram system, RegexResult arg, final IEntity entity) {
|
||||
// public static void manageExtends(ClassDiagram system, RegexResult arg, final
|
||||
// IEntity entity) {
|
||||
// if (arg.get("EXTENDS", 1) != null) {
|
||||
// final Mode mode = arg.get("EXTENDS", 1).equalsIgnoreCase("extends") ? Mode.EXTENDS : Mode.IMPLEMENTS;
|
||||
// final Mode mode = arg.get("EXTENDS", 1).equalsIgnoreCase("extends") ?
|
||||
// Mode.EXTENDS : Mode.IMPLEMENTS;
|
||||
// final Code other = diagram.buildCode(arg.get("EXTENDS", 2));
|
||||
// LeafType type2 = LeafType.CLASS;
|
||||
// if (mode == Mode.IMPLEMENTS) {
|
||||
@ -213,10 +216,12 @@ public class CommandCreateClass extends SingleLineCommand2<ClassDiagram> {
|
||||
// }
|
||||
// final IEntity cl2 = system.getOrCreateLeaf(other, type2, null);
|
||||
// LinkType typeLink = new LinkType(LinkDecor.NONE, LinkDecor.EXTENDS);
|
||||
// if (type2 == LeafType.INTERFACE && entity.getEntityType() != LeafType.INTERFACE) {
|
||||
// if (type2 == LeafType.INTERFACE && entity.getEntityType() !=
|
||||
// LeafType.INTERFACE) {
|
||||
// typeLink = typeLink.getDashed();
|
||||
// }
|
||||
// final Link link = new Link(cl2, entity, typeLink, null, 2, null, null, system.getLabeldistance(),
|
||||
// final Link link = new Link(cl2, entity, typeLink, null, 2, null, null,
|
||||
// system.getLabeldistance(),
|
||||
// system.getLabelangle());
|
||||
// system.addLink(link);
|
||||
// }
|
||||
|
@ -150,6 +150,7 @@ public class CommandCreateClassMultilines extends CommandMultilines2<ClassDiagra
|
||||
return CommandExecutionResult.error("No such entity");
|
||||
}
|
||||
if (lines.size() > 1) {
|
||||
entity.setCodeLine(lines.getAt(0).getLocation());
|
||||
lines = lines.subExtract(1, 1);
|
||||
// final Url url = null;
|
||||
// if (lines.size() > 0) {
|
||||
|
@ -89,7 +89,7 @@ final public class CommandLinkClass extends SingleLineCommand2<AbstractClassOrOb
|
||||
new RegexConcat(
|
||||
//
|
||||
new RegexLeaf("ARROW_HEAD1",
|
||||
"([%s]+[ox]|[)#\\[<*+^}]|\\<\\|[\\:\\|]|[<\\[]\\||\\}o|\\}\\||\\|o|\\|\\|)?"), //
|
||||
"([%s]+[ox]|[)#\\[<*+^}]|\\<_|\\<\\|[\\:\\|]|[<\\[]\\||\\}o|\\}\\||\\|o|\\|\\|)?"), //
|
||||
new RegexLeaf("ARROW_BODY1", "([-=.]+)"), //
|
||||
new RegexLeaf("ARROW_STYLE1", "(?:\\[(" + CommandLinkElement.LINE_STYLE + ")\\])?"), //
|
||||
new RegexLeaf("ARROW_DIRECTION", "(left|right|up|down|le?|ri?|up?|do?)?"), //
|
||||
@ -97,7 +97,7 @@ final public class CommandLinkClass extends SingleLineCommand2<AbstractClassOrOb
|
||||
new RegexLeaf("ARROW_STYLE2", "(?:\\[(" + CommandLinkElement.LINE_STYLE + ")\\])?"), //
|
||||
new RegexLeaf("ARROW_BODY2", "([-=.]*)"), //
|
||||
new RegexLeaf("ARROW_HEAD2",
|
||||
"([ox][%s]+|:\\>\\>?|[(#\\]>*+^\\{]|[\\|\\:]\\|\\>|\\|[>\\]]|o\\{|\\|\\{|o\\||\\|\\|)?")), //
|
||||
"([ox][%s]+|:\\>\\>?|_\\>|[(#\\]>*+^\\{]|[\\|\\:]\\|\\>|\\|[>\\]]|o\\{|\\|\\{|o\\||\\|\\|)?")), //
|
||||
RegexLeaf.spaceZeroOrMore(), new RegexOptional(new RegexLeaf("SECOND_LABEL", "[%g]([^%g]+)[%g]")), //
|
||||
RegexLeaf.spaceZeroOrMore(), //
|
||||
new RegexOr( //
|
||||
@ -213,6 +213,7 @@ final public class CommandLinkClass extends SingleLineCommand2<AbstractClassOrOb
|
||||
link.setLinkArrow(labels.getLinkArrow());
|
||||
link.setColors(color().getColor(arg, diagram.getSkinParam().getIHtmlColorSet()));
|
||||
link.applyStyle(arg.getLazzy("ARROW_STYLE", 0));
|
||||
link.setCodeLine(location);
|
||||
|
||||
addLink(diagram, link, arg.get("HEADER", 0));
|
||||
|
||||
@ -616,8 +617,8 @@ final public class CommandLinkClass extends SingleLineCommand2<AbstractClassOrOb
|
||||
}
|
||||
|
||||
private LinkType getLinkType(RegexResult arg) {
|
||||
final LinkDecor decors1 = getDecors1(arg.get("ARROW_HEAD1", 0));
|
||||
final LinkDecor decors2 = getDecors2(arg.get("ARROW_HEAD2", 0));
|
||||
final LinkDecor decors1 = getDecors1(getArrowHead1(arg));
|
||||
final LinkDecor decors2 = getDecors2(getArrowHead2(arg));
|
||||
|
||||
LinkType result = new LinkType(decors2, decors1);
|
||||
if (arg.get("ARROW_BODY1", 0).contains(".") || arg.get("ARROW_BODY2", 0).contains(".")) {
|
||||
@ -643,8 +644,8 @@ final public class CommandLinkClass extends SingleLineCommand2<AbstractClassOrOb
|
||||
}
|
||||
|
||||
private Direction getDirection(RegexResult arg) {
|
||||
final LinkDecor decors1 = getDecors1(arg.get("ARROW_HEAD1", 0));
|
||||
final LinkDecor decors2 = getDecors2(arg.get("ARROW_HEAD2", 0));
|
||||
final LinkDecor decors1 = getDecors1(getArrowHead1(arg));
|
||||
final LinkDecor decors2 = getDecors2(getArrowHead2(arg));
|
||||
|
||||
String s = getFullArrow(arg);
|
||||
s = s.replaceAll("[^-.=\\w]", "");
|
||||
@ -663,10 +664,21 @@ final public class CommandLinkClass extends SingleLineCommand2<AbstractClassOrOb
|
||||
return result;
|
||||
}
|
||||
|
||||
private String getArrowHead1(RegexResult arg) {
|
||||
return getArrowHead(arg, "ARROW_HEAD1");
|
||||
}
|
||||
|
||||
private String getArrowHead2(RegexResult arg) {
|
||||
return getArrowHead(arg, "ARROW_HEAD2");
|
||||
}
|
||||
|
||||
private String getArrowHead(RegexResult arg, final String key) {
|
||||
return notNull(arg.get(key, 0));
|
||||
}
|
||||
|
||||
private String getFullArrow(RegexResult arg) {
|
||||
return notNull(arg.get("ARROW_HEAD1", 0)) + notNull(arg.get("ARROW_BODY1", 0))
|
||||
+ notNull(arg.get("ARROW_DIRECTION", 0)) + notNull(arg.get("ARROW_BODY2", 0))
|
||||
+ notNull(arg.get("ARROW_HEAD2", 0));
|
||||
return getArrowHead1(arg) + notNull(arg.get("ARROW_BODY1", 0)) + notNull(arg.get("ARROW_DIRECTION", 0))
|
||||
+ notNull(arg.get("ARROW_BODY2", 0)) + getArrowHead2(arg);
|
||||
}
|
||||
|
||||
public static String notNull(String s) {
|
||||
|
@ -44,6 +44,7 @@ import java.util.Set;
|
||||
|
||||
import net.sourceforge.plantuml.FontParam;
|
||||
import net.sourceforge.plantuml.ISkinParam;
|
||||
import net.sourceforge.plantuml.LineLocation;
|
||||
import net.sourceforge.plantuml.Url;
|
||||
import net.sourceforge.plantuml.cucadiagram.entity.EntityFactory;
|
||||
import net.sourceforge.plantuml.graphic.FontConfiguration;
|
||||
@ -75,7 +76,7 @@ public class GroupRoot implements IGroup {
|
||||
return Collections.unmodifiableCollection(result);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "ROOT";
|
||||
@ -295,4 +296,12 @@ public class GroupRoot implements IGroup {
|
||||
public void setThisIsTogether() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
public String getCodeLine() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
public void setCodeLine(LineLocation codeLine) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
}
|
||||
|
@ -30,7 +30,7 @@
|
||||
*
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Contribution: Miguel Esteves
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.cucadiagram;
|
||||
@ -40,6 +40,7 @@ import java.util.Set;
|
||||
|
||||
import net.sourceforge.plantuml.Hideable;
|
||||
import net.sourceforge.plantuml.LineConfigurable;
|
||||
import net.sourceforge.plantuml.LineLocation;
|
||||
import net.sourceforge.plantuml.Removeable;
|
||||
import net.sourceforge.plantuml.SpecificBackcolorable;
|
||||
import net.sourceforge.plantuml.Url;
|
||||
@ -94,10 +95,13 @@ public interface IEntity extends SpecificBackcolorable, Hideable, Removeable, Li
|
||||
public void addStereotag(Stereotag tag);
|
||||
|
||||
public Set<Stereotag> stereotags();
|
||||
|
||||
|
||||
public boolean isAloneAndUnlinked();
|
||||
|
||||
public void setThisIsTogether();
|
||||
|
||||
public String getCodeLine();
|
||||
|
||||
public void setCodeLine(LineLocation codeLine);
|
||||
|
||||
}
|
||||
|
@ -234,15 +234,15 @@ public class Ident implements Code {
|
||||
final String last = parts.get(parts.size() - 1);
|
||||
if (separator == null) {
|
||||
if (code.getName().equals(last) != true && code.getName().equals(toString(separator)) == false) {
|
||||
System.err.println("code1=" + code);
|
||||
System.err.println("this1=" + this);
|
||||
// System.err.println("code1=" + code);
|
||||
// System.err.println("this1=" + this);
|
||||
EntityFactory.bigError();
|
||||
}
|
||||
} else {
|
||||
if (getLastPart(code.getName(), separator).equals(last) != true
|
||||
&& code.getName().equals(toString(separator)) == false) {
|
||||
System.err.println("code2=" + code);
|
||||
System.err.println("this2=" + this);
|
||||
// System.err.println("code2=" + code);
|
||||
// System.err.println("this2=" + this);
|
||||
EntityFactory.bigError();
|
||||
}
|
||||
}
|
||||
|
@ -39,6 +39,7 @@ import java.awt.geom.Dimension2D;
|
||||
|
||||
import net.sourceforge.plantuml.Hideable;
|
||||
import net.sourceforge.plantuml.ISkinSimple;
|
||||
import net.sourceforge.plantuml.LineLocation;
|
||||
import net.sourceforge.plantuml.OptionFlags;
|
||||
import net.sourceforge.plantuml.Removeable;
|
||||
import net.sourceforge.plantuml.UmlDiagramType;
|
||||
@ -102,14 +103,14 @@ public class Link extends WithLinkType implements Hideable, Removeable {
|
||||
|
||||
public String idCommentForSvg() {
|
||||
if (type.looksLikeRevertedForSvg()) {
|
||||
final String comment = getEntity1().getCodeGetName() + "<-" + getEntity2().getCodeGetName();
|
||||
final String comment = getEntity1().getCodeGetName() + "-backto-" + getEntity2().getCodeGetName();
|
||||
return comment;
|
||||
}
|
||||
if (type.looksLikeNoDecorAtAllSvg()) {
|
||||
final String comment = getEntity1().getCodeGetName() + "-" + getEntity2().getCodeGetName();
|
||||
return comment;
|
||||
}
|
||||
final String comment = getEntity1().getCodeGetName() + "->" + getEntity2().getCodeGetName();
|
||||
final String comment = getEntity1().getCodeGetName() + "-to-" + getEntity2().getCodeGetName();
|
||||
return comment;
|
||||
}
|
||||
|
||||
@ -581,4 +582,17 @@ public class Link extends WithLinkType implements Hideable, Removeable {
|
||||
return linkConstraint;
|
||||
}
|
||||
|
||||
private LineLocation codeLine;
|
||||
|
||||
public String getCodeLine() {
|
||||
if (codeLine == null) {
|
||||
return null;
|
||||
}
|
||||
return "" + codeLine.getPosition();
|
||||
}
|
||||
|
||||
public void setCodeLine(LineLocation location) {
|
||||
this.codeLine = location;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -30,7 +30,8 @@
|
||||
*
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
* Contribution : Hisashi Miyashita *
|
||||
* Contribution: Hisashi Miyashita
|
||||
* Contribution: Miguel Esteves
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.cucadiagram.entity;
|
||||
@ -48,6 +49,7 @@ import java.util.Set;
|
||||
import net.sourceforge.plantuml.FontParam;
|
||||
import net.sourceforge.plantuml.Guillemet;
|
||||
import net.sourceforge.plantuml.ISkinParam;
|
||||
import net.sourceforge.plantuml.LineLocation;
|
||||
import net.sourceforge.plantuml.StringUtils;
|
||||
import net.sourceforge.plantuml.Url;
|
||||
import net.sourceforge.plantuml.cucadiagram.Bodier;
|
||||
@ -114,6 +116,7 @@ final public class EntityImpl implements ILeaf, IGroup {
|
||||
private USymbol symbol;
|
||||
private final int rawLayout;
|
||||
private char concurrentSeparator;
|
||||
private LineLocation codeLine;
|
||||
|
||||
private Set<Stereotag> tags = new LinkedHashSet<Stereotag>();
|
||||
|
||||
@ -807,7 +810,17 @@ final public class EntityImpl implements ILeaf, IGroup {
|
||||
|
||||
public void setThisIsTogether() {
|
||||
this.together = true;
|
||||
// System.err.println("setThisIsTogether");
|
||||
}
|
||||
|
||||
public String getCodeLine() {
|
||||
if (this.codeLine == null) {
|
||||
return null;
|
||||
}
|
||||
return "" + this.codeLine.getPosition();
|
||||
}
|
||||
|
||||
public void setCodeLine(LineLocation codeLine) {
|
||||
this.codeLine = codeLine;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -80,14 +80,14 @@ public class CommandLinkElement extends SingleLineCommand2<DescriptionDiagram> {
|
||||
RegexLeaf.spaceZeroOrMore(), //
|
||||
new RegexOptional(new RegexLeaf("FIRST_LABEL", "[%g]([^%g]+)[%g]")), //
|
||||
RegexLeaf.spaceZeroOrMore(), //
|
||||
new RegexLeaf("HEAD2", "(0\\)|<<|[<^*+#0@)]|<\\|[\\|\\:]?|[%s]+o)?"), //
|
||||
new RegexLeaf("HEAD2", "(0\\)|<<|<_|[<^*+#0@)]|<\\|[\\|\\:]?|[%s]+o)?"), //
|
||||
new RegexLeaf("BODY1", "([-=.~]+)"), //
|
||||
new RegexLeaf("ARROW_STYLE1", "(?:\\[(" + LINE_STYLE_MUTILPLES + ")\\])?"), //
|
||||
new RegexOptional(new RegexLeaf("DIRECTION", "(left|right|up|down|le?|ri?|up?|do?)(?=[-=.~0()])")), //
|
||||
new RegexOptional(new RegexLeaf("INSIDE", "(0|\\(0\\)|\\(0|0\\))(?=[-=.~])")), //
|
||||
new RegexLeaf("ARROW_STYLE2", "(?:\\[(" + LINE_STYLE + ")\\])?"), //
|
||||
new RegexLeaf("BODY2", "([-=.~]*)"), //
|
||||
new RegexLeaf("HEAD1", "(\\(0|>>|[>^*+#0@(]|[\\:\\|]?\\|>|\\\\\\\\|o[%s]+)?"), //
|
||||
new RegexLeaf("HEAD1", "(\\(0|>>|_>|[>^*+#0@(]|[\\:\\|]?\\|>|\\\\\\\\|o[%s]+)?"), //
|
||||
RegexLeaf.spaceZeroOrMore(), //
|
||||
new RegexOptional(new RegexLeaf("SECOND_LABEL", "[%g]([^%g]+)[%g]")), //
|
||||
RegexLeaf.spaceZeroOrMore(), //
|
||||
@ -103,9 +103,15 @@ public class CommandLinkElement extends SingleLineCommand2<DescriptionDiagram> {
|
||||
return ColorParser.simpleColor(ColorType.LINE);
|
||||
}
|
||||
|
||||
private String getHead(RegexResult arg, final String key) {
|
||||
String result = arg.get(key, 0);
|
||||
result = trimAndLowerCase(result);
|
||||
return result.replace("_", "");
|
||||
}
|
||||
|
||||
private LinkType getLinkType(RegexResult arg) {
|
||||
final String head1 = trimAndLowerCase(arg.get("HEAD1", 0));
|
||||
final String head2 = trimAndLowerCase(arg.get("HEAD2", 0));
|
||||
final String head1 = getHead(arg, "HEAD1");
|
||||
final String head2 = getHead(arg, "HEAD2");
|
||||
LinkDecor d1 = LinkDecor.NONE;
|
||||
LinkDecor d2 = LinkDecor.NONE;
|
||||
|
||||
|
@ -74,26 +74,26 @@ public class PSystemDonors extends AbstractPSystem {
|
||||
private static final int COLS = 6;
|
||||
private static final int FREE_LINES = 6;
|
||||
|
||||
public static final String DONORS = "6y8B02mFk3cOSJIBSEBLlhdPHgj_M8aA4IpF4uh3m2AUxWR47-3UwN6_aVuYkjAzRveHRVbhZfzd3DL0"
|
||||
+ "qEFnwshOvdzxy6_EaXV1DrE22qW1-V5gD_8XxyXnUgJAa1B4Kj7zbudRqwtZGcMSg4Oe1ufR6zvtnkRP"
|
||||
+ "QNpnwj44RGH-3Eoh_pTrbNLvLHMc1TsjC0QZeX4kOoh6dWhScl-V2gXm2lOT2lJqOpfrSHqELLIYkRcy"
|
||||
+ "LjAS3BZHDSwXmvAg6AE9b5njf90p1pFqv6JqK_gXZzw_j0leq5fTGpndGF6OAJssRdixikzW-hMAWqGw"
|
||||
+ "n8BD0dSevQWyGV5pqus7j0WIkdQHZMquyfidCHXgO8M--KCpET9xI6IN8SL3HWqKvBoD0TBer6C9Psk_"
|
||||
+ "1bJVWor6D0ZLvN7ZxhyEorDkDXfU0HOP7jG2MWZoFzW9dz5NNZ8vvwQ85V8snNFOLipNaW_JDXLzYu-c"
|
||||
+ "G3XjFpIBn5McR3saSUHrpBywEkHTGrPU_MQCKSWZcClBN0hkbnQe7u4UMXEHuckLNnOI4AuZzQ9tdTkl"
|
||||
+ "r2p2AHqg5UlqIsnvpVr3bpBOZ6Zk3XPp7_svt9K8zj2LIJNqXbPzcdK-KP8Qwk-7lBfqlWkkgLUxTvpM"
|
||||
+ "PzgSP_zttTBCK0xGcILcGRS21CBLj1ekDX31OQ7BG-u2j07bq-HMF2qVOeyyGV3cCeEki97I2_4y2Nd8"
|
||||
+ "HGWpqA4xKbG0iwUCUlAGTOE7PXk2RaMLV7gvktw6ISksPMDccRJ1Uhl36CKndT0ySR_C1HvXM6yMpUvk"
|
||||
+ "xIFi4jpcS9fFtRMQLmbjR-6zu2AqVyY0ds7EY4YbwPhxddQ9UwWZC4kmuAakjfVRmJyFtR_W58jMCADD"
|
||||
+ "EsGET2uaewRTelIXmV2t2bd7jkr5VO2juJe_X9cH1i-N9hUqv18FQTjPJe8l05NMuXExLE4y8PfMaCpH"
|
||||
+ "jOJ94Qid8KD-f_e4bgfoOUd6Z-cknZEcHq4UpdjarQs-JIbk2wWbfWdoia9OCwGemjO26RXMqhFS1zZz"
|
||||
+ "r8u5VvkV7DXoABvjekt63HQcm7GNxeq4aMXs92LwYIbHmFV-U4ezCzV1ndVtj68Sf1QI6AZ27Cx_mHXf"
|
||||
+ "l6vJqrYlqVzjhRqiEt_-lOviSkhrUrzT43q7cV4VfG0TvGHcy3RmDUGpoTiBArcX76IuSgtIqq1XmNvw"
|
||||
+ "vqVKrJAZVoUAvPRaebMq3rN_tOzo39oD3IikyYcAsPSOQUsb7bIgxVk_M2no4Folg38dawktRZL6GcUG"
|
||||
+ "nRaRkyrKp7sj3YnO7PC9WZtrsUaQJnbpRv4g3JU0VBz7GvBHGmjRQjeyJmIsg_Fpti8s93BwRp2Ydwgr"
|
||||
+ "UtohX-63z76g23HyXqCQ5ym4mqNoWGAvEUT4Wsw-yP0NrK8DBEsOOPSANkXlvaT48U6ORNmWo6qkbhkz"
|
||||
+ "a4Fsa7rcDOeEAAeB3RIms69d4WjLZWSgae8visKyZzf1ct1rxm0wHS7vVzw6S6wY-GMPLURP6ybSuRaN"
|
||||
+ "Pn3fS7ucYLrJjcwqOTzekMphYjoHjKY7jVzt0000";
|
||||
public static final String DONORS = "6omC02mFkBap0p4nqLYNlhbPJVbOScQJ29Rd2SLXO15FTmFY3t3lzBZVI7yHNUdUDys8jcnDSPung1O4"
|
||||
+ "FPwQQuPjxks1q5RAY-189RY0513Vnibv7ploFdrIPKW9Ogde_il4xUdMSQ4oJbGZb0F5hGtlEsFpx3I-"
|
||||
+ "UFLeWZO2FmRsrVzTqygwUrKLXdHPrPWQTRh28Oo87E7_KRUfMzJ6oTIcqGCwbNC5DzMfYDFX0Gjea1Ku"
|
||||
+ "P6qTvwLPawgOI1Cfdjf8mIC6CxJdPFLvyaCVT7wf5z2bjRg6UEw0uZ5JUdJTDjg_xs3x5H8l4ixW2pOB"
|
||||
+ "pA6Kmtg2ukUc6nqd3n9QTv6DhRxoboSc6FpGGj_yeKYkz1uIsML8qN6fWGAFjp50CYQrQyBPeJy3gkh1"
|
||||
+ "5lqQXEfolt5thSFoL38R3RU0XOi5jO0QWlmFUi9dz9MNJEwvAM89UPh4Sza6rA-Izz4s5NqphoQ1yBRz"
|
||||
+ "qCpWLvcozP36bTSn_-hea7SDMRdwpLYZa4SmbvUv5CmlBL0_0Zqq9oA9hob_B2GWN5VgHUywDvtKBC8f"
|
||||
+ "7L8grkcNsF9QyWzTWSN6HNCwMABFng_BJObW2rsPL4DlQ5MbMUSJ9QcX_dx8ewNpNN1DbTgzGxGUQNEU"
|
||||
+ "_TzrIpD3SO2EJp4BkXOG2AjfrLTi88B3GfU7t0J81fHFarl-j7o8FV83WZUN2Bh2Hae7-FDDo4CEBin0"
|
||||
+ "bsvEKG7CdbBgISVjW8Sw7O9kHPLyUfcxVeP9oxPbOsQPjC5rky4O-J6TK9ouN-O2Zp2iKelcv6xj8-mI"
|
||||
+ "FCxBQLvrhy6yYcvx2-zf5w7zGmRy37D6H2fDL-nxsYNkeOx0BDg2fxhOdcu71m_TjU0KYrOmeqqxP0cO"
|
||||
+ "N4X6JRr5wKE3uUyWP1DsRohg2smDrwd1pOmqUBuqkQKcHtISjhCS6ri0lERY5Rk2mYb2j2qjcQjh2PCZ"
|
||||
+ "Laz2XlnEzGaibNLXQSEExQx6Cr6FWZoSzyYgexvDAMuBg3wc2VBIGfWpfCZ3rW8PM2lfMMu3x7vgnuAw"
|
||||
+ "pKyk77CelcsYxSODCKo1wIdS6maYCJgHbEWb9ea2lklZL-f5SnriV7TFAyP1qa8I0rL4brD_C5OQgbje"
|
||||
+ "6kir-h-jjPTbvy-_rv5DJXr-xsiAekSWBW0HNg2Zd404JmDVR_cYvAs4bQnG3Z9SkLRfQI1XmIvwvrVK"
|
||||
+ "WsL6zOuNoytAHIjl7whgkxjo39pr3IikyYdosPSOQUsb7bH1stUziLZa8FWFKMLI9bUZoMgCXCuWYtCt"
|
||||
+ "TfkfcEV69h1WTamcqFQhpvffF6NCVKTIQNW4oFTxP4WoUcXXJKthuaHWatH-trlOXaH6_mr6z0jgdJmU"
|
||||
+ "rKFxGUvkj0WqVEj36XT4Wk4Y-K21t9npea4ttoZ8YsgX32pjc67d25ReR_n7H27Xc6ry8CWn5yjfB-IG"
|
||||
+ "BMGVdusY5-GrXGQoi5YlPn8BfHmFf4WAvioMyJpI3jg6VRq3w1G5u_zz6y8b4yqloAmopzv8vjBFlJY3"
|
||||
+ "I8VxiqbichAr8Hls8osNRLsHspyNwR1J_vtOSRxp4PMuY55oBX4yeGIViVncv3Wkqt4m-Ka0";
|
||||
|
||||
/*
|
||||
* Special thanks to our sponsors and donors:
|
||||
|
@ -275,7 +275,8 @@ public class QuoteUtils {
|
||||
"Znxr hf nyy fnsr. Tb onpx gb lbhe ohaxre", "Gh z'nf qrph, Ongzna", "Gurerfr, p'rfg har pngnfgebcur",
|
||||
"Vs lbh ner abg rzoneenffrq ol gur svefg irefvba bs lbhe cebqhpg, lbh'ir ynhapurq gbb yngr",
|
||||
"Zvfgnxrf znqr zl fhpprff: V znxr ehoore renfre", "Ovt Oebgure vf Jngpuvat Lbh.",
|
||||
"Ab bar'f gnyxvat nobhg yrnivat gur fvatyr znexrg");
|
||||
"Ab bar'f gnyxvat nobhg yrnivat gur fvatyr znexrg", "...rnfvrfg oht gb svk va uhzna uvfgbel",
|
||||
"Arire nggevohgr gb znyvpr jung pna or rkcynvarq ol fghcvqvgl");
|
||||
|
||||
private QuoteUtils() {
|
||||
}
|
||||
|
@ -77,7 +77,7 @@ class USymbolFrame extends USymbol {
|
||||
|
||||
final UPath polygon = new UPath();
|
||||
polygon.setIgnoreForCompressionOnX();
|
||||
polygon.moveTo(textWidth, 1);
|
||||
polygon.moveTo(textWidth, 0);
|
||||
|
||||
polygon.lineTo(textWidth, textHeight - cornersize);
|
||||
polygon.lineTo(textWidth - cornersize, textHeight);
|
||||
|
@ -80,7 +80,9 @@ class USymbolNode extends USymbol {
|
||||
}
|
||||
ug.draw(shape);
|
||||
|
||||
ug.apply(new UTranslate(width - 10, 10)).draw(new ULine(9, -9));
|
||||
ug.apply(new UTranslate(width - 10, 10)).draw(new ULine(10, -10));
|
||||
|
||||
|
||||
ug.apply(UTranslate.dy(10)).draw(ULine.hline(width - 10));
|
||||
ug.apply(new UTranslate(width - 10, 10)).draw(ULine.vline(height - 10));
|
||||
if (SkinParam.USE_STYLES()) {
|
||||
|
@ -34,9 +34,13 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml.nwdiag;
|
||||
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import net.sourceforge.plantuml.ColorParam;
|
||||
import net.sourceforge.plantuml.ComponentStyle;
|
||||
import net.sourceforge.plantuml.SpriteContainerEmpty;
|
||||
import net.sourceforge.plantuml.ISkinSimple;
|
||||
import net.sourceforge.plantuml.cucadiagram.Display;
|
||||
import net.sourceforge.plantuml.graphic.FontConfiguration;
|
||||
import net.sourceforge.plantuml.graphic.HorizontalAlignment;
|
||||
@ -55,16 +59,18 @@ public class DiagElement {
|
||||
private final String name;
|
||||
private String description;
|
||||
private final Network mainNetwork;
|
||||
private final ISkinSimple spriteContainer;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public DiagElement(String name, Network network) {
|
||||
public DiagElement(String name, Network network, ISkinSimple spriteContainer) {
|
||||
this.description = name;
|
||||
this.mainNetwork = network;
|
||||
this.name = name;
|
||||
this.spriteContainer = spriteContainer;
|
||||
}
|
||||
|
||||
private TextBlock toTextBlock(String s) {
|
||||
@ -75,8 +81,7 @@ public class DiagElement {
|
||||
return TextBlockUtils.empty(0, 0);
|
||||
}
|
||||
s = s.replace(", ", "\\n");
|
||||
return Display.getWithNewlines(s).create(getFontConfiguration(), HorizontalAlignment.LEFT,
|
||||
new SpriteContainerEmpty());
|
||||
return Display.getWithNewlines(s).create(getFontConfiguration(), HorizontalAlignment.LEFT, spriteContainer);
|
||||
}
|
||||
|
||||
private FontConfiguration getFontConfiguration() {
|
||||
@ -84,15 +89,17 @@ public class DiagElement {
|
||||
return new FontConfiguration(font, HColorUtils.BLACK, HColorUtils.BLACK, false);
|
||||
}
|
||||
|
||||
public LinkedElement asTextBlock(final String adress1, final String adress2) {
|
||||
final TextBlock ad1 = toTextBlock(adress1);
|
||||
final TextBlock ad2 = toTextBlock(adress2);
|
||||
public LinkedElement asTextBlock(Map<Network, String> conns, Network next) {
|
||||
final Map<Network, TextBlock> conns2 = new LinkedHashMap<Network, TextBlock>();
|
||||
for (Entry<Network, String> ent : conns.entrySet()) {
|
||||
conns2.put(ent.getKey(), toTextBlock(ent.getValue()));
|
||||
}
|
||||
final SymbolContext symbolContext = new SymbolContext(ColorParam.activityBackground.getDefaultValue(),
|
||||
ColorParam.activityBorder.getDefaultValue()).withShadow(3);
|
||||
final TextBlock desc = toTextBlock(description);
|
||||
final TextBlock box = shape.asSmall(TextBlockUtils.empty(0, 0), desc, TextBlockUtils.empty(0, 0), symbolContext,
|
||||
HorizontalAlignment.CENTER);
|
||||
return new LinkedElement(ad1, box, ad2, mainNetwork, this);
|
||||
return new LinkedElement(this, box, mainNetwork, next, conns2);
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
|
@ -35,6 +35,9 @@
|
||||
package net.sourceforge.plantuml.nwdiag;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import net.sourceforge.plantuml.graphic.StringBounder;
|
||||
import net.sourceforge.plantuml.ugraphic.MinMax;
|
||||
@ -51,18 +54,37 @@ public class GridTextBlockDecorated extends GridTextBlockSimple {
|
||||
public static final int NETWORK_THIN = 5;
|
||||
|
||||
private final Collection<DiagGroup> groups;
|
||||
private final List<Network> networks;
|
||||
|
||||
public GridTextBlockDecorated(int lines, int cols, Collection<DiagGroup> groups) {
|
||||
public GridTextBlockDecorated(int lines, int cols, Collection<DiagGroup> groups, List<Network> networks) {
|
||||
super(lines, cols);
|
||||
this.groups = groups;
|
||||
this.networks = networks;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawGrid(UGraphic ug) {
|
||||
protected void drawGrid(UGraphic ug) {
|
||||
for (DiagGroup group : groups) {
|
||||
drawGroups(ug, group);
|
||||
}
|
||||
drawNetworkTube(ug);
|
||||
final Map<Network, Double> pos = drawNetworkTube(ug);
|
||||
drawLinks(ug, pos);
|
||||
}
|
||||
|
||||
private void drawLinks(UGraphic ug, Map<Network, Double> pos) {
|
||||
final StringBounder stringBounder = ug.getStringBounder();
|
||||
for (int i = 0; i < data.length; i++) {
|
||||
final double lineHeight = lineHeight(stringBounder, i);
|
||||
double x = 0;
|
||||
for (int j = 0; j < data[i].length; j++) {
|
||||
final double colWidth = colWidth(stringBounder, j);
|
||||
if (data[i][j] != null) {
|
||||
data[i][j].drawLinks(ug.apply(UTranslate.dx(x)), colWidth, lineHeight, pos);
|
||||
}
|
||||
x += colWidth;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void drawGroups(UGraphic ug, DiagGroup group) {
|
||||
@ -77,8 +99,8 @@ public class GridTextBlockDecorated extends GridTextBlockSimple {
|
||||
final double colWidth = colWidth(stringBounder, j);
|
||||
final LinkedElement element = data[i][j];
|
||||
if (element != null && group.matches(element)) {
|
||||
final MinMax minMax = element.getMinMax(stringBounder, colWidth, lineHeight).translate(
|
||||
new UTranslate(x, y));
|
||||
final MinMax minMax = element.getMinMax(stringBounder, colWidth, lineHeight)
|
||||
.translate(new UTranslate(x, y));
|
||||
size = size == null ? minMax : size.addMinMax(minMax);
|
||||
}
|
||||
x += colWidth;
|
||||
@ -95,7 +117,18 @@ public class GridTextBlockDecorated extends GridTextBlockSimple {
|
||||
|
||||
}
|
||||
|
||||
private void drawNetworkTube(final UGraphic ug) {
|
||||
private boolean isThereALink(int j, Network network) {
|
||||
for (int i = 0; i < data.length; i++) {
|
||||
final LinkedElement element = data[i][j];
|
||||
if (element != null && element.isLinkedTo(network)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private Map<Network, Double> drawNetworkTube(final UGraphic ug) {
|
||||
final Map<Network, Double> pos = new HashMap<Network, Double>();
|
||||
final StringBounder stringBounder = ug.getStringBounder();
|
||||
double y = 0;
|
||||
for (int i = 0; i < data.length; i++) {
|
||||
@ -104,7 +137,7 @@ public class GridTextBlockDecorated extends GridTextBlockSimple {
|
||||
double xmin = -1;
|
||||
double xmax = 0;
|
||||
for (int j = 0; j < data[i].length; j++) {
|
||||
final boolean hline = isPresent(i, j) || isPresent(i - 1, j);
|
||||
final boolean hline = isThereALink(j, network);
|
||||
if (hline && xmin < 0) {
|
||||
xmin = x;
|
||||
}
|
||||
@ -119,17 +152,16 @@ public class GridTextBlockDecorated extends GridTextBlockSimple {
|
||||
if (network != null && network.getColor() != null) {
|
||||
ug2 = ug2.apply(network.getColor().bg());
|
||||
}
|
||||
if (network != null) {
|
||||
pos.put(network, y);
|
||||
}
|
||||
ug2.draw(rect);
|
||||
y += lineHeight(stringBounder, i);
|
||||
}
|
||||
return pos;
|
||||
}
|
||||
|
||||
private Network getNetwork(int i) {
|
||||
for (int j = 0; j < data[i].length; j++) {
|
||||
if (isPresent(i, j)) {
|
||||
return data[i][j].getNetwork();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
return networks.get(i);
|
||||
}
|
||||
}
|
||||
|
@ -53,14 +53,7 @@ public class GridTextBlockSimple implements TextBlock {
|
||||
this.data = new LinkedElement[lines][cols];
|
||||
}
|
||||
|
||||
protected boolean isPresent(int i, int j) {
|
||||
if (i == -1) {
|
||||
return false;
|
||||
}
|
||||
return data[i][j] != null;
|
||||
}
|
||||
|
||||
public void drawGrid(UGraphic ug) {
|
||||
protected void drawGrid(UGraphic ug) {
|
||||
}
|
||||
|
||||
public void drawU(UGraphic ug) {
|
||||
|
@ -35,6 +35,9 @@
|
||||
package net.sourceforge.plantuml.nwdiag;
|
||||
|
||||
import java.awt.geom.Dimension2D;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.TreeSet;
|
||||
|
||||
import net.sourceforge.plantuml.ColorParam;
|
||||
import net.sourceforge.plantuml.Dimension2DDouble;
|
||||
@ -42,25 +45,29 @@ import net.sourceforge.plantuml.graphic.StringBounder;
|
||||
import net.sourceforge.plantuml.graphic.TextBlock;
|
||||
import net.sourceforge.plantuml.ugraphic.MinMax;
|
||||
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
||||
import net.sourceforge.plantuml.ugraphic.ULine;
|
||||
import net.sourceforge.plantuml.ugraphic.UTranslate;
|
||||
import net.sourceforge.plantuml.ugraphic.color.HColor;
|
||||
import net.sourceforge.plantuml.utils.MathUtils;
|
||||
|
||||
public class LinkedElement {
|
||||
|
||||
private final TextBlock ad1;
|
||||
private final TextBlock box;
|
||||
private final TextBlock ad2;
|
||||
private final Network network;
|
||||
private final Network next;
|
||||
private final DiagElement element;
|
||||
private final Map<Network, TextBlock> conns;
|
||||
|
||||
public LinkedElement(TextBlock ad1, TextBlock box, TextBlock ad2, Network network, DiagElement element) {
|
||||
this.ad1 = ad1;
|
||||
public LinkedElement(DiagElement element, TextBlock box, Network network, Network next,
|
||||
Map<Network, TextBlock> conns) {
|
||||
this.box = box;
|
||||
this.ad2 = ad2;
|
||||
this.network = network;
|
||||
this.element = element;
|
||||
this.conns = conns;
|
||||
this.next = next;
|
||||
}
|
||||
|
||||
public boolean isLinkedTo(Network some) {
|
||||
return conns.containsKey(some);
|
||||
}
|
||||
|
||||
private final double marginAd = 10;
|
||||
@ -81,25 +88,59 @@ public class LinkedElement {
|
||||
public void drawMe(UGraphic ug, double width, double height) {
|
||||
final double xMiddle = width / 2;
|
||||
final double yMiddle = height / 2;
|
||||
drawCenter(ug, box, xMiddle, yMiddle);
|
||||
}
|
||||
|
||||
public void drawLinks(UGraphic ug, double width, double height, Map<Network, Double> pos) {
|
||||
final double ynet1 = pos.get(network);
|
||||
final double yMiddle = height / 2;
|
||||
final StringBounder stringBounder = ug.getStringBounder();
|
||||
final Dimension2D dimBox = box.calculateDimension(stringBounder);
|
||||
|
||||
final double y1 = yMiddle - dimBox.getHeight() / 2;
|
||||
final double y2 = yMiddle + dimBox.getHeight() / 2;
|
||||
|
||||
drawCenter(ug, box, xMiddle, yMiddle);
|
||||
final double alpha = yMiddle - dimBox.getHeight() / 2;
|
||||
|
||||
final HColor color = ColorParam.activityBorder.getDefaultValue();
|
||||
ug = ug.apply(color);
|
||||
drawHLine(ug, xMiddle, GridTextBlockDecorated.NETWORK_THIN, y1);
|
||||
if (ad2 != null) {
|
||||
drawHLine(ug, xMiddle, y2, height);
|
||||
|
||||
final double xMiddle = width / 2;
|
||||
|
||||
final TreeSet<Double> skip = new TreeSet<Double>(pos.values());
|
||||
new VerticalLine(ynet1 + GridTextBlockDecorated.NETWORK_THIN, ynet1 + alpha, skip)
|
||||
.drawU(ug.apply(UTranslate.dx(xMiddle)));
|
||||
drawCenter(ug, link1(), xMiddle, ynet1 + alpha / 2);
|
||||
|
||||
final double seven = 7.0;
|
||||
double x = xMiddle - (conns.size() - 2) * seven / 2;
|
||||
boolean first = true;
|
||||
for (Entry<Network, TextBlock> ent : conns.entrySet()) {
|
||||
if (ent.getKey() == network) {
|
||||
continue;
|
||||
}
|
||||
final Double ynet2 = pos.get(ent.getKey());
|
||||
new VerticalLine(ynet1 + yMiddle + dimBox.getHeight() / 2, ynet2, skip).drawU(ug.apply(UTranslate.dx(x)));
|
||||
final double xtext;
|
||||
if (first && conns.size() > 2) {
|
||||
xtext = x - ent.getValue().calculateDimension(stringBounder).getWidth() / 2;
|
||||
} else {
|
||||
xtext = x;
|
||||
}
|
||||
drawCenter(ug, ent.getValue(), xtext, ynet2 - alpha / 2);
|
||||
x += seven;
|
||||
first = false;
|
||||
|
||||
}
|
||||
|
||||
drawCenter(ug, ad1, xMiddle, (GridTextBlockDecorated.NETWORK_THIN + y1) / 2);
|
||||
if (ad2 != null) {
|
||||
drawCenter(ug, ad2, xMiddle, (y2 + height - GridTextBlockDecorated.NETWORK_THIN) / 2);
|
||||
}
|
||||
|
||||
private TextBlock link1() {
|
||||
return conns.get(network);
|
||||
}
|
||||
|
||||
private TextBlock link2() {
|
||||
if (next == null) {
|
||||
return null;
|
||||
}
|
||||
return conns.get(next);
|
||||
}
|
||||
|
||||
private void drawCenter(UGraphic ug, TextBlock block, double x, double y) {
|
||||
@ -108,15 +149,11 @@ public class LinkedElement {
|
||||
|
||||
}
|
||||
|
||||
private void drawHLine(UGraphic ug, double x, double y1, double y2) {
|
||||
final ULine line = ULine.vline(y2 - y1);
|
||||
ug.apply(new UTranslate(x, y1)).draw(line);
|
||||
}
|
||||
|
||||
public Dimension2D naturalDimension(StringBounder stringBounder) {
|
||||
final Dimension2D dim1 = ad1.calculateDimension(stringBounder);
|
||||
final Dimension2D dim1 = link1().calculateDimension(stringBounder);
|
||||
final Dimension2D dimBox = box.calculateDimension(stringBounder);
|
||||
final Dimension2D dim2 = ad2 == null ? new Dimension2DDouble(0, 0) : ad2.calculateDimension(stringBounder);
|
||||
final Dimension2D dim2 = link2() == null ? new Dimension2DDouble(0, 0)
|
||||
: link2().calculateDimension(stringBounder);
|
||||
final double width = MathUtils.max(dim1.getWidth() + 2 * marginAd, dimBox.getWidth() + 2 * marginBox,
|
||||
dim2.getWidth() + 2 * marginAd);
|
||||
final double height = dim1.getHeight() + 2 * marginAd + dimBox.getHeight() + 2 * marginBox + dim2.getHeight()
|
||||
|
@ -142,7 +142,7 @@ public class NwDiagram extends UmlDiagram {
|
||||
if (currentNetwork() != null) {
|
||||
DiagElement element = elements.get(name);
|
||||
if (element == null) {
|
||||
element = new DiagElement(name, currentNetwork());
|
||||
element = new DiagElement(name, currentNetwork(), this.getSkinParam());
|
||||
elements.put(name, element);
|
||||
}
|
||||
final Map<String, String> props = toSet(definition);
|
||||
@ -256,22 +256,7 @@ public class NwDiagram extends UmlDiagram {
|
||||
ug = ug.apply(new UTranslate(margin, margin));
|
||||
|
||||
final StringBounder stringBounder = ug.getStringBounder();
|
||||
final GridTextBlockDecorated grid = new GridTextBlockDecorated(networks.size(), elements.size(), groups);
|
||||
|
||||
for (int i = 0; i < networks.size(); i++) {
|
||||
final Network current = networks.get(i);
|
||||
final Network next = i + 1 < networks.size() ? networks.get(i + 1) : null;
|
||||
int j = 0;
|
||||
for (Map.Entry<String, DiagElement> ent : elements.entrySet()) {
|
||||
final DiagElement element = ent.getValue();
|
||||
if (element.getMainNetwork() == current && current.constainsLocally(ent.getKey())) {
|
||||
final String ad1 = current.getAdress(element);
|
||||
final String ad2 = next == null ? null : next.getAdress(element);
|
||||
grid.add(i, j, element.asTextBlock(ad1, ad2));
|
||||
}
|
||||
j++;
|
||||
}
|
||||
}
|
||||
final GridTextBlockDecorated grid = buildGrid();
|
||||
|
||||
double deltaX = 0;
|
||||
double deltaY = 0;
|
||||
@ -306,6 +291,36 @@ public class NwDiagram extends UmlDiagram {
|
||||
|
||||
}
|
||||
|
||||
private Map<Network, String> getLinks(DiagElement element) {
|
||||
final Map<Network, String> result = new LinkedHashMap<Network, String>();
|
||||
for (Network network : networks) {
|
||||
final String s = network.getAdress(element);
|
||||
if (s != null) {
|
||||
result.put(network, s);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private GridTextBlockDecorated buildGrid() {
|
||||
final GridTextBlockDecorated grid = new GridTextBlockDecorated(networks.size(), elements.size(), groups, networks);
|
||||
|
||||
for (int i = 0; i < networks.size(); i++) {
|
||||
final Network current = networks.get(i);
|
||||
final Network next = i + 1 < networks.size() ? networks.get(i + 1) : null;
|
||||
int j = 0;
|
||||
for (Map.Entry<String, DiagElement> ent : elements.entrySet()) {
|
||||
final DiagElement element = ent.getValue();
|
||||
if (element.getMainNetwork() == current) {
|
||||
final Map<Network, String> conns = getLinks(element);
|
||||
grid.add(i, j, element.asTextBlock(conns, next));
|
||||
}
|
||||
j++;
|
||||
}
|
||||
}
|
||||
return grid;
|
||||
}
|
||||
|
||||
public CommandExecutionResult setProperty(String property, String value) {
|
||||
if (initDone == false) {
|
||||
return error();
|
||||
|
96
src/net/sourceforge/plantuml/nwdiag/VerticalLine.java
Normal file
96
src/net/sourceforge/plantuml/nwdiag/VerticalLine.java
Normal file
@ -0,0 +1,96 @@
|
||||
/* ========================================================================
|
||||
* PlantUML : a free UML diagram generator
|
||||
* ========================================================================
|
||||
*
|
||||
* (C) Copyright 2009-2020, Arnaud Roques
|
||||
*
|
||||
* Project Info: http://plantuml.com
|
||||
*
|
||||
* If you like this project or if you find it useful, you can support us at:
|
||||
*
|
||||
* http://plantuml.com/patreon (only 1$ per month!)
|
||||
* http://plantuml.com/paypal
|
||||
*
|
||||
* This file is part of PlantUML.
|
||||
*
|
||||
* PlantUML is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* PlantUML distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
* USA.
|
||||
*
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.nwdiag;
|
||||
|
||||
import java.util.TreeSet;
|
||||
|
||||
import net.sourceforge.plantuml.graphic.UDrawable;
|
||||
import net.sourceforge.plantuml.ugraphic.UEllipse;
|
||||
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
||||
import net.sourceforge.plantuml.ugraphic.ULine;
|
||||
import net.sourceforge.plantuml.ugraphic.UTranslate;
|
||||
|
||||
public class VerticalLine implements UDrawable {
|
||||
|
||||
private final double y1;
|
||||
private final double y2;
|
||||
private final TreeSet<Double> skip;
|
||||
|
||||
public VerticalLine(double y1, double y2, TreeSet<Double> skip) {
|
||||
this.y1 = Math.min(y1, y2);
|
||||
this.y2 = Math.max(y1, y2);
|
||||
this.skip = skip;
|
||||
}
|
||||
|
||||
public void drawU(UGraphic ug) {
|
||||
boolean drawn = false;
|
||||
double current = y1;
|
||||
for (Double step : skip) {
|
||||
if (step < y1) {
|
||||
continue;
|
||||
}
|
||||
assert step >= y1;
|
||||
drawn = true;
|
||||
if (step == y2) {
|
||||
drawVLine(ug, current, y2);
|
||||
} else {
|
||||
drawVLine(ug, current, Math.min(y2, step - 3));
|
||||
if (y2 > step) {
|
||||
drawArc(ug, step - 3);
|
||||
}
|
||||
}
|
||||
current = step + 9;
|
||||
if (current >= y2) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (drawn == false) {
|
||||
drawVLine(ug, y1, y2);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void drawArc(UGraphic ug, double y) {
|
||||
final UEllipse arc = new UEllipse(11, 11, 90, -180);
|
||||
ug.apply(new UTranslate(-5, y)).draw(arc);
|
||||
|
||||
}
|
||||
|
||||
private void drawVLine(UGraphic ug, double start, double end) {
|
||||
final ULine line = ULine.vline(end - start);
|
||||
ug.apply(UTranslate.dy(start)).draw(line);
|
||||
}
|
||||
|
||||
}
|
@ -30,6 +30,7 @@
|
||||
*
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
* Contribution: Miguel Esteves
|
||||
*
|
||||
*
|
||||
*/
|
||||
@ -94,6 +95,7 @@ public class DotPath implements UShape, Moveable {
|
||||
|
||||
private final List<CubicCurve2D.Double> beziers = new ArrayList<CubicCurve2D.Double>();
|
||||
private String comment;
|
||||
private String codeLine;
|
||||
|
||||
public DotPath() {
|
||||
this(new ArrayList<CubicCurve2D.Double>());
|
||||
@ -427,7 +429,7 @@ public class DotPath implements UShape, Moveable {
|
||||
}
|
||||
|
||||
public UPath toUPath() {
|
||||
final UPath result = new UPath(comment);
|
||||
final UPath result = new UPath(comment, codeLine);
|
||||
boolean start = true;
|
||||
for (CubicCurve2D.Double bez : beziers) {
|
||||
if (start) {
|
||||
@ -689,8 +691,9 @@ public class DotPath implements UShape, Moveable {
|
||||
return Collections.unmodifiableList(result);
|
||||
}
|
||||
|
||||
public void setComment(String comment) {
|
||||
public void setCommentAndCodeLine(String comment, String codeLine) {
|
||||
this.comment = comment;
|
||||
this.codeLine = codeLine;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -35,9 +35,7 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml.project;
|
||||
|
||||
import net.sourceforge.plantuml.project.lang.Complement;
|
||||
|
||||
public class Completion implements Complement {
|
||||
public class Completion {
|
||||
|
||||
private final int completion;
|
||||
|
||||
|
@ -37,11 +37,9 @@ package net.sourceforge.plantuml.project;
|
||||
|
||||
import java.util.Iterator;
|
||||
|
||||
import net.sourceforge.plantuml.project.lang.Complement;
|
||||
import net.sourceforge.plantuml.project.lang.Subject;
|
||||
import net.sourceforge.plantuml.project.time.Day;
|
||||
|
||||
public class DaysAsDates implements Subject, Complement, Iterable<Day> {
|
||||
public class DaysAsDates implements Iterable<Day> {
|
||||
|
||||
private final Day date1;
|
||||
private final Day date2;
|
||||
|
@ -36,16 +36,18 @@
|
||||
package net.sourceforge.plantuml.project;
|
||||
|
||||
import net.sourceforge.plantuml.Direction;
|
||||
import net.sourceforge.plantuml.cucadiagram.LinkType;
|
||||
import net.sourceforge.plantuml.graphic.UDrawable;
|
||||
import net.sourceforge.plantuml.project.core.Task;
|
||||
import net.sourceforge.plantuml.project.core.TaskAttribute;
|
||||
import net.sourceforge.plantuml.project.core.TaskInstant;
|
||||
import net.sourceforge.plantuml.project.draw.TaskDraw;
|
||||
import net.sourceforge.plantuml.project.timescale.TimeScale;
|
||||
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
||||
import net.sourceforge.plantuml.ugraphic.ULine;
|
||||
import net.sourceforge.plantuml.ugraphic.UStroke;
|
||||
import net.sourceforge.plantuml.ugraphic.UTranslate;
|
||||
import net.sourceforge.plantuml.ugraphic.color.HColorUtils;
|
||||
import net.sourceforge.plantuml.ugraphic.color.HColor;
|
||||
|
||||
public class GanttArrow implements UDrawable {
|
||||
|
||||
@ -54,13 +56,20 @@ public class GanttArrow implements UDrawable {
|
||||
private final TaskInstant source;
|
||||
private final Direction atEnd;
|
||||
private final TaskInstant dest;
|
||||
private final HColor color;
|
||||
private final LinkType style;
|
||||
private final ToTaskDraw toTaskDraw;
|
||||
|
||||
public GanttArrow(TimeScale timeScale, TaskInstant source, TaskInstant dest) {
|
||||
public GanttArrow(TimeScale timeScale, TaskInstant source, TaskInstant dest, HColor color, LinkType style,
|
||||
ToTaskDraw toTaskDraw) {
|
||||
this.toTaskDraw = toTaskDraw;
|
||||
this.style = style;
|
||||
this.color = color;
|
||||
this.timeScale = timeScale;
|
||||
this.source = source;
|
||||
this.dest = dest;
|
||||
if (source.getAttribute() == TaskAttribute.END && dest.getAttribute() == TaskAttribute.START) {
|
||||
this.atStart = Direction.DOWN;
|
||||
this.atStart = source.sameRowAs(dest) ? Direction.LEFT : Direction.DOWN;
|
||||
this.atEnd = Direction.RIGHT;
|
||||
} else if (source.getAttribute() == TaskAttribute.END && dest.getAttribute() == TaskAttribute.END) {
|
||||
this.atStart = Direction.RIGHT;
|
||||
@ -69,28 +78,33 @@ public class GanttArrow implements UDrawable {
|
||||
this.atStart = Direction.LEFT;
|
||||
this.atEnd = Direction.RIGHT;
|
||||
} else if (source.getAttribute() == TaskAttribute.START && dest.getAttribute() == TaskAttribute.END) {
|
||||
this.atStart = Direction.DOWN;
|
||||
this.atStart = source.sameRowAs(dest) ? Direction.RIGHT : Direction.DOWN;
|
||||
this.atEnd = Direction.LEFT;
|
||||
} else {
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
}
|
||||
|
||||
private TaskDraw getSource() {
|
||||
return toTaskDraw.getTaskDraw((Task) source.getMoment());
|
||||
}
|
||||
|
||||
private TaskDraw getDestination() {
|
||||
return toTaskDraw.getTaskDraw((Task) dest.getMoment());
|
||||
}
|
||||
|
||||
public void drawU(UGraphic ug) {
|
||||
ug = ug.apply(HColorUtils.RED_DARK.bg()).apply(HColorUtils.RED_DARK).apply(new UStroke(1.5));
|
||||
|
||||
final Task draw1 = (Task) source.getMoment();
|
||||
final Task draw2 = (Task) dest.getMoment();
|
||||
// ug = ug.apply(color.bg()).apply(color).apply(new UStroke(1.5));
|
||||
ug = ug.apply(color.bg()).apply(color).apply(style.getStroke3(new UStroke(1.5)));
|
||||
|
||||
double x1 = getX(source.withDelta(0), atStart);
|
||||
double y1 = draw1.getY(atStart);
|
||||
double y1 = getSource().getY(atStart);
|
||||
|
||||
final double x2 = getX(dest, atEnd.getInv());
|
||||
final double y2 = draw2.getY(atEnd);
|
||||
final double y2 = getDestination().getY(atEnd);
|
||||
|
||||
if (atStart == Direction.DOWN && y2 < y1) {
|
||||
y1 = draw1.getY(atStart.getInv());
|
||||
y1 = getSource().getY(atStart.getInv());
|
||||
}
|
||||
|
||||
if (this.atStart == Direction.DOWN && this.atEnd == Direction.RIGHT) {
|
||||
@ -101,7 +115,7 @@ public class GanttArrow implements UDrawable {
|
||||
drawLine(ug, x1, y1, x1, y2, x2, y2);
|
||||
} else {
|
||||
x1 = getX(source.withDelta(0), Direction.RIGHT);
|
||||
y1 = draw1.getY(Direction.RIGHT);
|
||||
y1 = getSource().getY(Direction.RIGHT);
|
||||
drawLine(ug, x1, y1, x1 + 6, y1, x1 + 6, y1 + 8, x2 - 8, y1 + 8, x2 - 8, y2, x2, y2);
|
||||
}
|
||||
} else if (this.atStart == Direction.RIGHT && this.atEnd == Direction.LEFT) {
|
||||
@ -116,6 +130,7 @@ public class GanttArrow implements UDrawable {
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
|
||||
ug = ug.apply(new UStroke(1.5));
|
||||
ug.apply(new UTranslate(x2, y2)).draw(Arrows.asTo(atEnd));
|
||||
|
||||
}
|
||||
|
@ -35,20 +35,29 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml.project;
|
||||
|
||||
import net.sourceforge.plantuml.cucadiagram.LinkDecor;
|
||||
import net.sourceforge.plantuml.cucadiagram.LinkType;
|
||||
import net.sourceforge.plantuml.cucadiagram.WithLinkType;
|
||||
import net.sourceforge.plantuml.graphic.UDrawable;
|
||||
import net.sourceforge.plantuml.project.core.TaskInstant;
|
||||
import net.sourceforge.plantuml.project.lang.Complement;
|
||||
import net.sourceforge.plantuml.project.time.Wink;
|
||||
import net.sourceforge.plantuml.project.timescale.TimeScale;
|
||||
import net.sourceforge.plantuml.ugraphic.color.HColor;
|
||||
|
||||
public class GanttConstraint implements Complement {
|
||||
public class GanttConstraint extends WithLinkType {
|
||||
|
||||
private final TaskInstant source;
|
||||
private final TaskInstant dest;
|
||||
|
||||
public GanttConstraint(TaskInstant source, TaskInstant dest) {
|
||||
public GanttConstraint(TaskInstant source, TaskInstant dest, HColor forcedColor) {
|
||||
this.source = source;
|
||||
this.dest = dest;
|
||||
this.type = new LinkType(LinkDecor.NONE, LinkDecor.NONE);
|
||||
this.setSpecificColor(forcedColor);
|
||||
}
|
||||
|
||||
public GanttConstraint(TaskInstant source, TaskInstant dest) {
|
||||
this(source, dest, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -56,8 +65,11 @@ public class GanttConstraint implements Complement {
|
||||
return source.toString() + " --> " + dest.toString();
|
||||
}
|
||||
|
||||
public UDrawable getUDrawable(final TimeScale timeScale) {
|
||||
return new GanttArrow(timeScale, source, dest);
|
||||
public UDrawable getUDrawable(TimeScale timeScale, HColor color, ToTaskDraw toTaskDraw) {
|
||||
if (getSpecificColor() == null) {
|
||||
return new GanttArrow(timeScale, source, dest, color, getType(), toTaskDraw);
|
||||
}
|
||||
return new GanttArrow(timeScale, source, dest, getSpecificColor(), getType(), toTaskDraw);
|
||||
}
|
||||
|
||||
public boolean isHidden(Wink min, Wink max) {
|
||||
@ -79,4 +91,8 @@ public class GanttConstraint implements Complement {
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void goNorank() {
|
||||
}
|
||||
}
|
||||
|
@ -60,6 +60,7 @@ import net.sourceforge.plantuml.UmlDiagramType;
|
||||
import net.sourceforge.plantuml.command.CommandExecutionResult;
|
||||
import net.sourceforge.plantuml.core.DiagramDescription;
|
||||
import net.sourceforge.plantuml.core.ImageData;
|
||||
import net.sourceforge.plantuml.cucadiagram.Display;
|
||||
import net.sourceforge.plantuml.graphic.InnerStrategy;
|
||||
import net.sourceforge.plantuml.graphic.StringBounder;
|
||||
import net.sourceforge.plantuml.graphic.TextBlock;
|
||||
@ -83,8 +84,7 @@ import net.sourceforge.plantuml.project.draw.TimeHeaderDaily;
|
||||
import net.sourceforge.plantuml.project.draw.TimeHeaderMonthly;
|
||||
import net.sourceforge.plantuml.project.draw.TimeHeaderSimple;
|
||||
import net.sourceforge.plantuml.project.draw.TimeHeaderWeekly;
|
||||
import net.sourceforge.plantuml.project.lang.ComplementColors;
|
||||
import net.sourceforge.plantuml.project.lang.Subject;
|
||||
import net.sourceforge.plantuml.project.lang.CenterBorderColor;
|
||||
import net.sourceforge.plantuml.project.time.Day;
|
||||
import net.sourceforge.plantuml.project.time.DayOfWeek;
|
||||
import net.sourceforge.plantuml.project.time.GCalendar;
|
||||
@ -101,7 +101,7 @@ import net.sourceforge.plantuml.ugraphic.color.HColor;
|
||||
import net.sourceforge.plantuml.ugraphic.color.HColorSet;
|
||||
import net.sourceforge.plantuml.ugraphic.color.HColorUtils;
|
||||
|
||||
public class GanttDiagram extends TitledDiagram implements Subject {
|
||||
public class GanttDiagram extends TitledDiagram implements ToTaskDraw {
|
||||
|
||||
private final Map<TaskCode, Task> tasks = new LinkedHashMap<TaskCode, Task>();
|
||||
private final Map<String, Task> byShortName = new HashMap<String, Task>();
|
||||
@ -126,10 +126,17 @@ public class GanttDiagram extends TitledDiagram implements Subject {
|
||||
private Day printStart;
|
||||
private Day printEnd;
|
||||
|
||||
private HColor linksColor = HColorUtils.RED_DARK;
|
||||
|
||||
public DiagramDescription getDescription() {
|
||||
return new DiagramDescription("(Project)");
|
||||
}
|
||||
|
||||
@Override
|
||||
public UmlDiagramType getUmlDiagramType() {
|
||||
return UmlDiagramType.GANTT;
|
||||
}
|
||||
|
||||
private int horizontalPages = 1;
|
||||
private int verticalPages = 1;
|
||||
|
||||
@ -175,10 +182,9 @@ public class GanttDiagram extends TitledDiagram implements Subject {
|
||||
final double dpiFactor = scale == null ? 1 : scale.getScale(100, 100);
|
||||
final ImageBuilder imageBuilder = ImageBuilder.buildB(new ColorMapperIdentity(), false,
|
||||
ClockwiseTopRightBottomLeft.margin1margin2(margin1, margin2), null, getMetadata(), "", dpiFactor, null);
|
||||
final SkinParam skinParam = SkinParam.create(UmlDiagramType.TIMING);
|
||||
|
||||
TextBlock result = getTextBlock();
|
||||
result = new AnnotatedWorker(this, skinParam, fileFormatOption.getDefaultStringBounder()).addAdd(result);
|
||||
result = new AnnotatedWorker(this, getSkinParam(), fileFormatOption.getDefaultStringBounder()).addAdd(result);
|
||||
imageBuilder.setUDrawable(result);
|
||||
|
||||
return imageBuilder.writeImageTOBEMOVED(fileFormatOption, seed, os);
|
||||
@ -264,7 +270,7 @@ public class GanttDiagram extends TitledDiagram implements Subject {
|
||||
if (printStart != null && constraint.isHidden(min, max)) {
|
||||
continue;
|
||||
}
|
||||
constraint.getUDrawable(timeScale).drawU(ug);
|
||||
constraint.getUDrawable(timeScale, linksColor, this).drawU(ug);
|
||||
}
|
||||
}
|
||||
|
||||
@ -326,26 +332,37 @@ public class GanttDiagram extends TitledDiagram implements Subject {
|
||||
|
||||
private void initTaskAndResourceDraws(TimeScale timeScale, double headerHeight) {
|
||||
double y = headerHeight;
|
||||
for (Task task : tasks.values()) {
|
||||
task.setY(y);
|
||||
y += task.getHeight();
|
||||
|
||||
}
|
||||
// for (Task task : tasks.values()) {
|
||||
// if (task instanceof TaskImpl) {
|
||||
// final TaskImpl taskImpl = (TaskImpl) task;
|
||||
// if (taskImpl.getRow() != null) {
|
||||
// continue;
|
||||
// }
|
||||
// }
|
||||
// task.setY5757(y);
|
||||
// y += task.getHeight();
|
||||
//
|
||||
// }
|
||||
// double y2 = headerHeight;
|
||||
for (Task task : tasks.values()) {
|
||||
final TaskDraw draw;
|
||||
if (task instanceof TaskSeparator) {
|
||||
draw = new TaskDrawSeparator(((TaskSeparator) task).getName(), timeScale, task.getY(), min, max);
|
||||
draw = new TaskDrawSeparator(((TaskSeparator) task).getName(), timeScale, y, min, max);
|
||||
} else {
|
||||
final TaskImpl tmp = (TaskImpl) task;
|
||||
if (tmp.isDiamond()) {
|
||||
draw = new TaskDrawDiamond(timeScale, task.getY(), tmp.getPrettyDisplay(), getStart(tmp));
|
||||
draw = new TaskDrawDiamond(timeScale, y, tmp.getPrettyDisplay(), getStart(tmp), getSkinParam(),
|
||||
task, this);
|
||||
} else {
|
||||
final boolean oddStart = printStart != null && min.compareTo(getStart(tmp)) == 0;
|
||||
final boolean oddEnd = printStart != null && max.compareTo(getEnd(tmp)) == 0;
|
||||
draw = new TaskDrawRegular(timeScale, task.getY(), tmp.getPrettyDisplay(), getStart(tmp),
|
||||
getEnd(tmp), oddStart, oddEnd);
|
||||
draw = new TaskDrawRegular(timeScale, y, tmp.getPrettyDisplay(), getStart(tmp), getEnd(tmp),
|
||||
oddStart, oddEnd, getSkinParam(), task, this);
|
||||
}
|
||||
draw.setColorsAndCompletion(tmp.getColors(), tmp.getCompletion(), tmp.getUrl());
|
||||
draw.setColorsAndCompletion(tmp.getColors(), tmp.getCompletion(), tmp.getUrl(), tmp.getNote());
|
||||
}
|
||||
if (task.getRow() == null) {
|
||||
y += draw.getHeight();
|
||||
}
|
||||
draws.put(task, draw);
|
||||
}
|
||||
@ -434,10 +451,12 @@ public class GanttDiagram extends TitledDiagram implements Subject {
|
||||
return tasks.get(code);
|
||||
}
|
||||
|
||||
public void setTaskOrder(final Task task1, final Task task2) {
|
||||
public GanttConstraint forceTaskOrder(Task task1, Task task2) {
|
||||
final TaskInstant end1 = new TaskInstant(task1, TaskAttribute.END);
|
||||
task2.setStart(end1.getInstantPrecise());
|
||||
addContraint(new GanttConstraint(end1, new TaskInstant(task2, TaskAttribute.START)));
|
||||
final GanttConstraint result = new GanttConstraint(end1, new TaskInstant(task2, TaskAttribute.START));
|
||||
addContraint(result);
|
||||
return result;
|
||||
}
|
||||
|
||||
public Task getOrCreateTask(String codeOrShortName, String shortName, boolean linkedToPrevious) {
|
||||
@ -459,13 +478,13 @@ public class GanttDiagram extends TitledDiagram implements Subject {
|
||||
if (linkedToPrevious) {
|
||||
previous = getLastCreatedTask();
|
||||
}
|
||||
result = new TaskImpl(code, getDefaultPlan());
|
||||
result = new TaskImpl(code, getDefaultPlan(), calendar);
|
||||
tasks.put(code, result);
|
||||
if (byShortName != null) {
|
||||
byShortName.put(shortName, result);
|
||||
}
|
||||
if (previous != null) {
|
||||
setTaskOrder(previous, result);
|
||||
forceTaskOrder(previous, result);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
@ -606,7 +625,7 @@ public class GanttDiagram extends TitledDiagram implements Subject {
|
||||
nameDays.put(day, name);
|
||||
}
|
||||
|
||||
public void setTodayColors(ComplementColors colors) {
|
||||
public void setTodayColors(CenterBorderColor colors) {
|
||||
if (today == null) {
|
||||
this.today = Day.today();
|
||||
}
|
||||
@ -619,7 +638,7 @@ public class GanttDiagram extends TitledDiagram implements Subject {
|
||||
}
|
||||
|
||||
public CommandExecutionResult deleteTask(Task task) {
|
||||
task.setColors(new ComplementColors(HColorUtils.WHITE, HColorUtils.BLACK));
|
||||
task.setColors(new CenterBorderColor(HColorUtils.WHITE, HColorUtils.BLACK));
|
||||
return CommandExecutionResult.ok();
|
||||
}
|
||||
|
||||
@ -628,4 +647,23 @@ public class GanttDiagram extends TitledDiagram implements Subject {
|
||||
this.printEnd = end;
|
||||
}
|
||||
|
||||
public void setLinksColor(HColor color) {
|
||||
this.linksColor = color;
|
||||
}
|
||||
|
||||
public TaskDraw getTaskDraw(Task task) {
|
||||
return draws.get(task);
|
||||
}
|
||||
|
||||
public CommandExecutionResult addNote(Display note) {
|
||||
Task last = null;
|
||||
for (Task current : tasks.values())
|
||||
last = current;
|
||||
if (last == null) {
|
||||
return CommandExecutionResult.error("No task defined");
|
||||
}
|
||||
last.setNote(note);
|
||||
return CommandExecutionResult.ok();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -48,29 +48,33 @@ import net.sourceforge.plantuml.core.DiagramType;
|
||||
import net.sourceforge.plantuml.project.command.CommandColorTask;
|
||||
import net.sourceforge.plantuml.project.command.CommandGanttArrow;
|
||||
import net.sourceforge.plantuml.project.command.CommandGanttArrow2;
|
||||
import net.sourceforge.plantuml.project.command.CommandNoteBottom;
|
||||
import net.sourceforge.plantuml.project.command.CommandPage;
|
||||
import net.sourceforge.plantuml.project.command.CommandPrintBetween;
|
||||
import net.sourceforge.plantuml.project.command.CommandPrintScale;
|
||||
import net.sourceforge.plantuml.project.command.CommandSeparator;
|
||||
import net.sourceforge.plantuml.project.command.NaturalCommand;
|
||||
import net.sourceforge.plantuml.project.command.NaturalCommandAnd;
|
||||
import net.sourceforge.plantuml.project.command.NaturalCommandAndAnd;
|
||||
import net.sourceforge.plantuml.project.lang.ComplementPattern;
|
||||
import net.sourceforge.plantuml.project.lang.SentenceAnd;
|
||||
import net.sourceforge.plantuml.project.lang.SentenceAndAnd;
|
||||
import net.sourceforge.plantuml.project.lang.SentenceSimple;
|
||||
import net.sourceforge.plantuml.project.lang.Subject;
|
||||
import net.sourceforge.plantuml.project.lang.SubjectDayAsDate;
|
||||
import net.sourceforge.plantuml.project.lang.SubjectDayOfWeek;
|
||||
import net.sourceforge.plantuml.project.lang.SubjectDaysAsDates;
|
||||
import net.sourceforge.plantuml.project.lang.SubjectPattern;
|
||||
import net.sourceforge.plantuml.project.lang.SubjectLinks;
|
||||
import net.sourceforge.plantuml.project.lang.SubjectProject;
|
||||
import net.sourceforge.plantuml.project.lang.SubjectResource;
|
||||
import net.sourceforge.plantuml.project.lang.SubjectTask;
|
||||
import net.sourceforge.plantuml.project.lang.SubjectToday;
|
||||
import net.sourceforge.plantuml.project.lang.VerbPattern;
|
||||
import net.sourceforge.plantuml.style.CommandStyleImport;
|
||||
import net.sourceforge.plantuml.style.CommandStyleMultilinesCSS;
|
||||
|
||||
public class GanttDiagramFactory extends UmlDiagramFactory {
|
||||
|
||||
static private final List<SubjectPattern> subjects() {
|
||||
return Arrays.<SubjectPattern>asList(new SubjectTask(), new SubjectProject(), new SubjectDayOfWeek(),
|
||||
new SubjectDayAsDate(), new SubjectDaysAsDates(), new SubjectResource(), new SubjectToday());
|
||||
static private final List<Subject> subjects() {
|
||||
return Arrays.<Subject>asList(new SubjectTask(), new SubjectProject(), new SubjectDayOfWeek(),
|
||||
new SubjectDayAsDate(), new SubjectDaysAsDates(), new SubjectResource(), new SubjectToday(),
|
||||
new SubjectLinks());
|
||||
}
|
||||
|
||||
public GanttDiagramFactory(DiagramType type) {
|
||||
@ -81,6 +85,10 @@ public class GanttDiagramFactory extends UmlDiagramFactory {
|
||||
protected List<Command> createCommands() {
|
||||
final List<Command> cmds = new ArrayList<Command>();
|
||||
addTitleCommands(cmds);
|
||||
|
||||
cmds.add(new CommandStyleMultilinesCSS());
|
||||
cmds.add(new CommandStyleImport());
|
||||
|
||||
// addCommonCommands(cmds);
|
||||
cmds.add(new CommandNope());
|
||||
// cmds.add(new CommandComment());
|
||||
@ -95,6 +103,8 @@ public class GanttDiagramFactory extends UmlDiagramFactory {
|
||||
cmds.add(new CommandPrintBetween());
|
||||
cmds.add(new CommandScale());
|
||||
cmds.add(new CommandPage());
|
||||
cmds.add(new CommandNoteBottom());
|
||||
|
||||
// cmds.add(new CommandScaleWidthAndHeight());
|
||||
// cmds.add(new CommandScaleWidthOrHeight());
|
||||
// cmds.add(new CommandScaleMaxWidth());
|
||||
@ -109,44 +119,27 @@ public class GanttDiagramFactory extends UmlDiagramFactory {
|
||||
private static Collection<Command> getLanguageCommands() {
|
||||
synchronized (cache) {
|
||||
if (cache.size() == 0) {
|
||||
for (SubjectPattern subject : subjects()) {
|
||||
for (VerbPattern verb : subject.getVerbs()) {
|
||||
for (ComplementPattern complement : verb.getComplements()) {
|
||||
cache.add(NaturalCommand.create(subject, verb, complement));
|
||||
|
||||
for (Subject subject : subjects()) {
|
||||
for (SentenceSimple sentenceA : subject.getSentences()) {
|
||||
cache.add(NaturalCommand.create(sentenceA));
|
||||
for (SentenceSimple sentenceB : subject.getSentences()) {
|
||||
if (sentenceA.getVerbPattern().equals(sentenceB.getVerbPattern()) == false) {
|
||||
cache.add(NaturalCommand.create(new SentenceAnd(sentenceA, sentenceB)));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for (SubjectPattern subject : subjects()) {
|
||||
final Collection<VerbPattern> verbs = subject.getVerbs();
|
||||
for (VerbPattern verb1 : verbs) {
|
||||
for (VerbPattern verb2 : verbs) {
|
||||
if (verb1 == verb2) {
|
||||
continue;
|
||||
}
|
||||
for (ComplementPattern complement1 : verb1.getComplements()) {
|
||||
for (ComplementPattern complement2 : verb2.getComplements()) {
|
||||
|
||||
for (Subject subject : subjects()) {
|
||||
for (SentenceSimple sentenceA : subject.getSentences()) {
|
||||
for (SentenceSimple sentenceB : subject.getSentences()) {
|
||||
for (SentenceSimple sentenceC : subject.getSentences()) {
|
||||
if (sentenceA.getVerbPattern().equals(sentenceB.getVerbPattern()) == false
|
||||
&& sentenceA.getVerbPattern().equals(sentenceC.getVerbPattern()) == false
|
||||
&& sentenceC.getVerbPattern().equals(sentenceB.getVerbPattern()) == false) {
|
||||
cache.add(
|
||||
NaturalCommandAnd.create(subject, verb1, complement1, verb2, complement2));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for (SubjectPattern subject : subjects()) {
|
||||
final Collection<VerbPattern> verbs = subject.getVerbs();
|
||||
for (VerbPattern verb1 : verbs) {
|
||||
for (VerbPattern verb2 : verbs) {
|
||||
for (VerbPattern verb3 : verbs) {
|
||||
if (verb1 == verb2 || verb1 == verb3 || verb2 == verb3) {
|
||||
continue;
|
||||
}
|
||||
for (ComplementPattern complement1 : verb1.getComplements()) {
|
||||
for (ComplementPattern complement2 : verb2.getComplements()) {
|
||||
for (ComplementPattern complement3 : verb3.getComplements()) {
|
||||
cache.add(NaturalCommandAndAnd.create(subject, verb1, complement1, verb2,
|
||||
complement2, verb3, complement3));
|
||||
}
|
||||
}
|
||||
NaturalCommand.create(new SentenceAndAnd(sentenceA, sentenceB, sentenceC)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -35,9 +35,7 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml.project;
|
||||
|
||||
import net.sourceforge.plantuml.project.lang.Complement;
|
||||
|
||||
public class Load implements Value, Complement {
|
||||
public class Load implements Value {
|
||||
|
||||
private final int winks;
|
||||
|
||||
|
@ -43,13 +43,13 @@ import java.util.Map.Entry;
|
||||
import net.sourceforge.plantuml.project.core.TaskAttribute;
|
||||
import net.sourceforge.plantuml.project.time.Wink;
|
||||
|
||||
public class Solver3 {
|
||||
public class Solver {
|
||||
|
||||
private final Map<TaskAttribute, Value> values = new LinkedHashMap<TaskAttribute, Value>();
|
||||
|
||||
private final LoadPlanable loadPlanable;
|
||||
|
||||
public Solver3(LoadPlanable loadPlanable) {
|
||||
public Solver(LoadPlanable loadPlanable) {
|
||||
this.loadPlanable = loadPlanable;
|
||||
}
|
||||
|
@ -33,9 +33,13 @@
|
||||
*
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.project.lang;
|
||||
package net.sourceforge.plantuml.project;
|
||||
|
||||
import net.sourceforge.plantuml.project.core.Task;
|
||||
import net.sourceforge.plantuml.project.draw.TaskDraw;
|
||||
|
||||
public interface Complement {
|
||||
public interface ToTaskDraw {
|
||||
|
||||
public TaskDraw getTaskDraw(Task task);
|
||||
|
||||
}
|
@ -35,8 +35,6 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml.project;
|
||||
|
||||
import net.sourceforge.plantuml.project.lang.Subject;
|
||||
|
||||
public class Today implements Subject {
|
||||
public class Today {
|
||||
|
||||
}
|
||||
|
@ -44,7 +44,7 @@ import net.sourceforge.plantuml.command.regex.RegexLeaf;
|
||||
import net.sourceforge.plantuml.command.regex.RegexResult;
|
||||
import net.sourceforge.plantuml.project.GanttDiagram;
|
||||
import net.sourceforge.plantuml.project.core.Task;
|
||||
import net.sourceforge.plantuml.project.lang.ComplementColors;
|
||||
import net.sourceforge.plantuml.project.lang.CenterBorderColor;
|
||||
import net.sourceforge.plantuml.ugraphic.color.HColor;
|
||||
|
||||
public class CommandColorTask extends SingleLineCommand2<GanttDiagram> {
|
||||
@ -74,7 +74,7 @@ public class CommandColorTask extends SingleLineCommand2<GanttDiagram> {
|
||||
final String color2 = arg.get("COLORS", 1);
|
||||
final HColor col1 = diagram.getIHtmlColorSet().getColorIfValid(color1);
|
||||
final HColor col2 = diagram.getIHtmlColorSet().getColorIfValid(color2);
|
||||
task.setColors(new ComplementColors(col1, col2));
|
||||
task.setColors(new CenterBorderColor(col1, col2));
|
||||
|
||||
return CommandExecutionResult.ok();
|
||||
}
|
||||
|
@ -42,6 +42,7 @@ import net.sourceforge.plantuml.command.regex.IRegex;
|
||||
import net.sourceforge.plantuml.command.regex.RegexConcat;
|
||||
import net.sourceforge.plantuml.command.regex.RegexLeaf;
|
||||
import net.sourceforge.plantuml.command.regex.RegexResult;
|
||||
import net.sourceforge.plantuml.descdiagram.command.CommandLinkElement;
|
||||
import net.sourceforge.plantuml.project.GanttConstraint;
|
||||
import net.sourceforge.plantuml.project.GanttDiagram;
|
||||
import net.sourceforge.plantuml.project.core.Task;
|
||||
@ -58,7 +59,9 @@ public class CommandGanttArrow extends SingleLineCommand2<GanttDiagram> {
|
||||
return RegexConcat.build(CommandGanttArrow.class.getName(), RegexLeaf.start(), //
|
||||
new RegexLeaf("CODE1", "([\\p{L}0-9_.]+)"), //
|
||||
RegexLeaf.spaceZeroOrMore(), //
|
||||
new RegexLeaf("ARROW", "(-+)"), //
|
||||
new RegexLeaf("(-+)"), //
|
||||
new RegexLeaf("ARROW_STYLE", "(?:\\[(" + CommandLinkElement.LINE_STYLE + ")\\])?"), //
|
||||
new RegexLeaf("(-*)"), //
|
||||
new RegexLeaf("\\>"), //
|
||||
RegexLeaf.spaceZeroOrMore(), //
|
||||
new RegexLeaf("CODE2", "([\\p{L}0-9_.]+)"), //
|
||||
@ -79,10 +82,8 @@ public class CommandGanttArrow extends SingleLineCommand2<GanttDiagram> {
|
||||
return CommandExecutionResult.error("No such task " + code2);
|
||||
}
|
||||
|
||||
final TaskInstant end1 = new TaskInstant(task1, TaskAttribute.END);
|
||||
|
||||
task2.setStart(end1.getInstantPrecise());
|
||||
diagram.addContraint(new GanttConstraint(end1, new TaskInstant(task2, TaskAttribute.START)));
|
||||
final GanttConstraint link = diagram.forceTaskOrder(task1, task2);
|
||||
link.applyStyle(arg.get("ARROW_STYLE", 0));
|
||||
|
||||
return CommandExecutionResult.ok();
|
||||
}
|
||||
|
@ -42,6 +42,8 @@ import net.sourceforge.plantuml.command.regex.IRegex;
|
||||
import net.sourceforge.plantuml.command.regex.RegexConcat;
|
||||
import net.sourceforge.plantuml.command.regex.RegexLeaf;
|
||||
import net.sourceforge.plantuml.command.regex.RegexResult;
|
||||
import net.sourceforge.plantuml.descdiagram.command.CommandLinkElement;
|
||||
import net.sourceforge.plantuml.project.GanttConstraint;
|
||||
import net.sourceforge.plantuml.project.GanttDiagram;
|
||||
import net.sourceforge.plantuml.project.core.Task;
|
||||
|
||||
@ -57,7 +59,9 @@ public class CommandGanttArrow2 extends SingleLineCommand2<GanttDiagram> {
|
||||
new RegexLeaf("TASK1", "([^\\[\\]]+?)"), //
|
||||
new RegexLeaf("\\]"), //
|
||||
RegexLeaf.spaceZeroOrMore(), //
|
||||
new RegexLeaf("ARROW", "(-+)"), //
|
||||
new RegexLeaf("(-+)"), //
|
||||
new RegexLeaf("ARROW_STYLE", "(?:\\[(" + CommandLinkElement.LINE_STYLE + ")\\])?"), //
|
||||
new RegexLeaf("(-*)"), //
|
||||
new RegexLeaf("\\>"), //
|
||||
RegexLeaf.spaceZeroOrMore(), //
|
||||
new RegexLeaf("\\["), //
|
||||
@ -75,7 +79,8 @@ public class CommandGanttArrow2 extends SingleLineCommand2<GanttDiagram> {
|
||||
final Task task1 = diagram.getOrCreateTask(name1, null, false);
|
||||
final Task task2 = diagram.getOrCreateTask(name2, null, false);
|
||||
|
||||
diagram.setTaskOrder(task1, task2);
|
||||
final GanttConstraint link = diagram.forceTaskOrder(task1, task2);
|
||||
link.applyStyle(arg.get("ARROW_STYLE", 0));
|
||||
|
||||
return CommandExecutionResult.ok();
|
||||
}
|
||||
|
@ -0,0 +1,65 @@
|
||||
/* ========================================================================
|
||||
* PlantUML : a free UML diagram generator
|
||||
* ========================================================================
|
||||
*
|
||||
* (C) Copyright 2009-2020, Arnaud Roques
|
||||
*
|
||||
* Project Info: http://plantuml.com
|
||||
*
|
||||
* If you like this project or if you find it useful, you can support us at:
|
||||
*
|
||||
* http://plantuml.com/patreon (only 1$ per month!)
|
||||
* http://plantuml.com/paypal
|
||||
*
|
||||
* This file is part of PlantUML.
|
||||
*
|
||||
* PlantUML is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* PlantUML distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
* USA.
|
||||
*
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.project.command;
|
||||
|
||||
import net.sourceforge.plantuml.command.BlocLines;
|
||||
import net.sourceforge.plantuml.command.CommandExecutionResult;
|
||||
import net.sourceforge.plantuml.command.CommandMultilines;
|
||||
import net.sourceforge.plantuml.cucadiagram.Display;
|
||||
import net.sourceforge.plantuml.project.GanttDiagram;
|
||||
|
||||
public class CommandNoteBottom extends CommandMultilines<GanttDiagram> {
|
||||
|
||||
public CommandNoteBottom() {
|
||||
super("(?i)^note[%s]*bottom$");
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPatternEnd() {
|
||||
return "(?i)^end[%s]*note$";
|
||||
}
|
||||
|
||||
public CommandExecutionResult execute(GanttDiagram diagram, BlocLines lines) {
|
||||
lines = lines.subExtract(1, 1);
|
||||
lines = lines.removeEmptyColumns();
|
||||
final Display strings = lines.toDisplay();
|
||||
if (strings.size() > 0) {
|
||||
return diagram.addNote(strings);
|
||||
}
|
||||
return CommandExecutionResult.error("No note defined");
|
||||
}
|
||||
|
||||
}
|
@ -71,8 +71,8 @@ public class CommandPrintBetween extends SingleLineCommand2<GanttDiagram> {
|
||||
|
||||
@Override
|
||||
protected CommandExecutionResult executeArg(GanttDiagram diagram, LineLocation location, RegexResult arg) {
|
||||
final Day start = (Day) pattern.getComplement(diagram, arg, "START").get();
|
||||
final Day end = (Day) pattern.getComplement(diagram, arg, "END").get();
|
||||
final Day start = (Day) pattern.getMe(diagram, arg, "START").get();
|
||||
final Day end = (Day) pattern.getMe(diagram, arg, "END").get();
|
||||
diagram.setPrintInterval(start, end);
|
||||
return CommandExecutionResult.ok();
|
||||
}
|
||||
|
@ -36,71 +36,29 @@
|
||||
package net.sourceforge.plantuml.project.command;
|
||||
|
||||
import net.sourceforge.plantuml.LineLocation;
|
||||
import net.sourceforge.plantuml.command.Command;
|
||||
import net.sourceforge.plantuml.command.CommandExecutionResult;
|
||||
import net.sourceforge.plantuml.command.SingleLineCommand2;
|
||||
import net.sourceforge.plantuml.command.regex.RegexConcat;
|
||||
import net.sourceforge.plantuml.command.regex.RegexLeaf;
|
||||
import net.sourceforge.plantuml.command.regex.RegexResult;
|
||||
import net.sourceforge.plantuml.project.Failable;
|
||||
import net.sourceforge.plantuml.project.GanttDiagram;
|
||||
import net.sourceforge.plantuml.project.lang.Complement;
|
||||
import net.sourceforge.plantuml.project.lang.ComplementEmpty;
|
||||
import net.sourceforge.plantuml.project.lang.ComplementPattern;
|
||||
import net.sourceforge.plantuml.project.lang.Subject;
|
||||
import net.sourceforge.plantuml.project.lang.SubjectPattern;
|
||||
import net.sourceforge.plantuml.project.lang.Verb;
|
||||
import net.sourceforge.plantuml.project.lang.VerbPattern;
|
||||
import net.sourceforge.plantuml.project.lang.Sentence;
|
||||
|
||||
public class NaturalCommand extends SingleLineCommand2<GanttDiagram> {
|
||||
|
||||
private final SubjectPattern subjectPattern;
|
||||
private final VerbPattern verbPattern;
|
||||
private final ComplementPattern complementPattern;
|
||||
private final Sentence sentence;
|
||||
|
||||
private NaturalCommand(RegexConcat pattern, SubjectPattern subject, VerbPattern verb, ComplementPattern complement) {
|
||||
super(pattern);
|
||||
this.subjectPattern = subject;
|
||||
this.verbPattern = verb;
|
||||
this.complementPattern = complement;
|
||||
public NaturalCommand(Sentence sentence) {
|
||||
super(sentence.toRegex());
|
||||
this.sentence = sentence;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return subjectPattern.toString() + " " + verbPattern.toString() + " " + complementPattern.toString();
|
||||
final protected CommandExecutionResult executeArg(GanttDiagram system, LineLocation location, RegexResult arg) {
|
||||
return sentence.execute(system, arg);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected CommandExecutionResult executeArg(GanttDiagram system, LineLocation location, RegexResult arg) {
|
||||
final Subject subject = subjectPattern.getSubject(system, arg);
|
||||
final Verb verb = verbPattern.getVerb(system, arg);
|
||||
final Failable<Complement> complement = complementPattern.getComplement(system, arg, "0");
|
||||
if (complement.isFail()) {
|
||||
return CommandExecutionResult.error(complement.getError());
|
||||
}
|
||||
return verb.execute(subject, complement.get());
|
||||
public static NaturalCommand create(Sentence sentence) {
|
||||
return new NaturalCommand(sentence);
|
||||
|
||||
}
|
||||
|
||||
public static Command create(SubjectPattern subject, VerbPattern verb, ComplementPattern complement) {
|
||||
final RegexConcat pattern;
|
||||
if (complement instanceof ComplementEmpty) {
|
||||
pattern = new RegexConcat(//
|
||||
RegexLeaf.start(), //
|
||||
subject.toRegex(), //
|
||||
RegexLeaf.spaceOneOrMore(), //
|
||||
verb.toRegex(), //
|
||||
RegexLeaf.end());
|
||||
} else {
|
||||
pattern = new RegexConcat(//
|
||||
RegexLeaf.start(), //
|
||||
subject.toRegex(), //
|
||||
RegexLeaf.spaceOneOrMore(), //
|
||||
verb.toRegex(), //
|
||||
RegexLeaf.spaceOneOrMore(), //
|
||||
complement.toRegex("0"), //
|
||||
RegexLeaf.end());
|
||||
}
|
||||
// System.err.println("NaturalCommand="+pattern.getPattern());
|
||||
return new NaturalCommand(pattern, subject, verb, complement);
|
||||
}
|
||||
}
|
||||
|
@ -1,116 +0,0 @@
|
||||
/* ========================================================================
|
||||
* PlantUML : a free UML diagram generator
|
||||
* ========================================================================
|
||||
*
|
||||
* (C) Copyright 2009-2020, Arnaud Roques
|
||||
*
|
||||
* Project Info: http://plantuml.com
|
||||
*
|
||||
* If you like this project or if you find it useful, you can support us at:
|
||||
*
|
||||
* http://plantuml.com/patreon (only 1$ per month!)
|
||||
* http://plantuml.com/paypal
|
||||
*
|
||||
* This file is part of PlantUML.
|
||||
*
|
||||
* PlantUML is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* PlantUML distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
* USA.
|
||||
*
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.project.command;
|
||||
|
||||
import net.sourceforge.plantuml.LineLocation;
|
||||
import net.sourceforge.plantuml.command.Command;
|
||||
import net.sourceforge.plantuml.command.CommandExecutionResult;
|
||||
import net.sourceforge.plantuml.command.SingleLineCommand2;
|
||||
import net.sourceforge.plantuml.command.regex.RegexConcat;
|
||||
import net.sourceforge.plantuml.command.regex.RegexLeaf;
|
||||
import net.sourceforge.plantuml.command.regex.RegexResult;
|
||||
import net.sourceforge.plantuml.project.Failable;
|
||||
import net.sourceforge.plantuml.project.GanttDiagram;
|
||||
import net.sourceforge.plantuml.project.lang.Complement;
|
||||
import net.sourceforge.plantuml.project.lang.ComplementPattern;
|
||||
import net.sourceforge.plantuml.project.lang.Subject;
|
||||
import net.sourceforge.plantuml.project.lang.SubjectPattern;
|
||||
import net.sourceforge.plantuml.project.lang.Verb;
|
||||
import net.sourceforge.plantuml.project.lang.VerbPattern;
|
||||
|
||||
public class NaturalCommandAnd extends SingleLineCommand2<GanttDiagram> {
|
||||
|
||||
private final SubjectPattern subjectPattern;
|
||||
private final VerbPattern verbPattern1;
|
||||
private final ComplementPattern complementPattern1;
|
||||
private final VerbPattern verbPattern2;
|
||||
private final ComplementPattern complementPattern2;
|
||||
|
||||
private NaturalCommandAnd(RegexConcat pattern, SubjectPattern subject, VerbPattern verb1,
|
||||
ComplementPattern complement1, VerbPattern verb2, ComplementPattern complement2) {
|
||||
super(pattern);
|
||||
this.subjectPattern = subject;
|
||||
this.verbPattern1 = verb1;
|
||||
this.complementPattern1 = complement1;
|
||||
this.verbPattern2 = verb2;
|
||||
this.complementPattern2 = complement2;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return subjectPattern.toString() + " " + verbPattern1.toString() + " " + complementPattern1.toString()
|
||||
+ " and " + verbPattern2.toString() + " " + complementPattern2.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected CommandExecutionResult executeArg(GanttDiagram system, LineLocation location, RegexResult arg) {
|
||||
final Subject subject = subjectPattern.getSubject(system, arg);
|
||||
final Verb verb1 = verbPattern1.getVerb(system, arg);
|
||||
final Failable<Complement> complement1 = complementPattern1.getComplement(system, arg, "1");
|
||||
if (complement1.isFail()) {
|
||||
return CommandExecutionResult.error(complement1.getError());
|
||||
}
|
||||
final CommandExecutionResult result1 = verb1.execute(subject, complement1.get());
|
||||
if (result1.isOk() == false) {
|
||||
return result1;
|
||||
}
|
||||
final Verb verb2 = verbPattern2.getVerb(system, arg);
|
||||
final Failable<Complement> complement2 = complementPattern2.getComplement(system, arg, "2");
|
||||
if (complement2.isFail()) {
|
||||
return CommandExecutionResult.error(complement2.getError());
|
||||
}
|
||||
return verb2.execute(subject, complement2.get());
|
||||
}
|
||||
|
||||
public static Command create(SubjectPattern subject, VerbPattern verb1, ComplementPattern complement1,
|
||||
VerbPattern verb2, ComplementPattern complement2) {
|
||||
final RegexConcat pattern = new RegexConcat(//
|
||||
RegexLeaf.start(), //
|
||||
subject.toRegex(), //
|
||||
RegexLeaf.spaceOneOrMore(), //
|
||||
verb1.toRegex(), //
|
||||
RegexLeaf.spaceOneOrMore(), //
|
||||
complement1.toRegex("1"), //
|
||||
RegexLeaf.spaceOneOrMore(), //
|
||||
new RegexLeaf("and"), //
|
||||
RegexLeaf.spaceOneOrMore(), //
|
||||
verb2.toRegex(), //
|
||||
RegexLeaf.spaceOneOrMore(), //
|
||||
complement2.toRegex("2"), //
|
||||
RegexLeaf.end());
|
||||
return new NaturalCommandAnd(pattern, subject, verb1, complement1, verb2, complement2);
|
||||
}
|
||||
}
|
@ -1,127 +0,0 @@
|
||||
/* ========================================================================
|
||||
* PlantUML : a free UML diagram generator
|
||||
* ========================================================================
|
||||
*
|
||||
* (C) Copyright 2009-2020, Arnaud Roques
|
||||
*
|
||||
* Project Info: http://plantuml.com
|
||||
*
|
||||
* If you like this project or if you find it useful, you can support us at:
|
||||
*
|
||||
* http://plantuml.com/patreon (only 1$ per month!)
|
||||
* http://plantuml.com/paypal
|
||||
*
|
||||
* This file is part of PlantUML.
|
||||
*
|
||||
* PlantUML is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* PlantUML distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
* USA.
|
||||
*
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.project.command;
|
||||
|
||||
import net.sourceforge.plantuml.LineLocation;
|
||||
import net.sourceforge.plantuml.command.Command;
|
||||
import net.sourceforge.plantuml.command.CommandExecutionResult;
|
||||
import net.sourceforge.plantuml.command.SingleLineCommand2;
|
||||
import net.sourceforge.plantuml.command.regex.RegexConcat;
|
||||
import net.sourceforge.plantuml.command.regex.RegexLeaf;
|
||||
import net.sourceforge.plantuml.command.regex.RegexResult;
|
||||
import net.sourceforge.plantuml.project.GanttDiagram;
|
||||
import net.sourceforge.plantuml.project.lang.Complement;
|
||||
import net.sourceforge.plantuml.project.lang.ComplementPattern;
|
||||
import net.sourceforge.plantuml.project.lang.Subject;
|
||||
import net.sourceforge.plantuml.project.lang.SubjectPattern;
|
||||
import net.sourceforge.plantuml.project.lang.Verb;
|
||||
import net.sourceforge.plantuml.project.lang.VerbPattern;
|
||||
|
||||
public class NaturalCommandAndAnd extends SingleLineCommand2<GanttDiagram> {
|
||||
|
||||
private final SubjectPattern subjectPattern;
|
||||
private final VerbPattern verbPattern1;
|
||||
private final ComplementPattern complementPattern1;
|
||||
private final VerbPattern verbPattern2;
|
||||
private final ComplementPattern complementPattern2;
|
||||
private final VerbPattern verbPattern3;
|
||||
private final ComplementPattern complementPattern3;
|
||||
|
||||
private NaturalCommandAndAnd(RegexConcat pattern, SubjectPattern subject, VerbPattern verb1,
|
||||
ComplementPattern complement1, VerbPattern verb2, ComplementPattern complement2, VerbPattern verb3,
|
||||
ComplementPattern complement3) {
|
||||
super(pattern);
|
||||
this.subjectPattern = subject;
|
||||
this.verbPattern1 = verb1;
|
||||
this.complementPattern1 = complement1;
|
||||
this.verbPattern2 = verb2;
|
||||
this.complementPattern2 = complement2;
|
||||
this.verbPattern3 = verb3;
|
||||
this.complementPattern3 = complement3;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return subjectPattern.toString() + " " + verbPattern1.toString() + " " + complementPattern1.toString()
|
||||
+ " and " + verbPattern2.toString() + " " + complementPattern2.toString() + " and "
|
||||
+ verbPattern3.toString() + " " + complementPattern3.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected CommandExecutionResult executeArg(GanttDiagram system, LineLocation location, RegexResult arg) {
|
||||
final Subject subject = subjectPattern.getSubject(system, arg);
|
||||
final Verb verb1 = verbPattern1.getVerb(system, arg);
|
||||
final Complement complement1 = complementPattern1.getComplement(system, arg, "1").get();
|
||||
final CommandExecutionResult result1 = verb1.execute(subject, complement1);
|
||||
if (result1.isOk() == false) {
|
||||
return result1;
|
||||
}
|
||||
final Verb verb2 = verbPattern2.getVerb(system, arg);
|
||||
final Complement complement2 = complementPattern2.getComplement(system, arg, "2").get();
|
||||
final CommandExecutionResult result2 = verb2.execute(subject, complement2);
|
||||
if (result2.isOk() == false) {
|
||||
return result2;
|
||||
}
|
||||
final Verb verb3 = verbPattern3.getVerb(system, arg);
|
||||
final Complement complement3 = complementPattern3.getComplement(system, arg, "3").get();
|
||||
return verb3.execute(subject, complement3);
|
||||
}
|
||||
|
||||
public static Command create(SubjectPattern subject, VerbPattern verb1, ComplementPattern complement1,
|
||||
VerbPattern verb2, ComplementPattern complement2, VerbPattern verb3, ComplementPattern complement3) {
|
||||
final RegexConcat pattern = new RegexConcat(//
|
||||
RegexLeaf.start(), //
|
||||
subject.toRegex(), //
|
||||
RegexLeaf.spaceOneOrMore(), //
|
||||
verb1.toRegex(), //
|
||||
RegexLeaf.spaceOneOrMore(), //
|
||||
complement1.toRegex("1"), //
|
||||
RegexLeaf.spaceOneOrMore(), //
|
||||
new RegexLeaf("and"), //
|
||||
RegexLeaf.spaceOneOrMore(), //
|
||||
verb2.toRegex(), //
|
||||
RegexLeaf.spaceOneOrMore(), //
|
||||
complement2.toRegex("2"), //
|
||||
RegexLeaf.spaceOneOrMore(), //
|
||||
new RegexLeaf("and"), //
|
||||
RegexLeaf.spaceOneOrMore(), //
|
||||
verb3.toRegex(), //
|
||||
RegexLeaf.spaceOneOrMore(), //
|
||||
complement3.toRegex("3"), //
|
||||
RegexLeaf.end());
|
||||
return new NaturalCommandAndAnd(pattern, subject, verb1, complement1, verb2, complement2, verb3, complement3);
|
||||
}
|
||||
}
|
@ -35,39 +35,21 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml.project.core;
|
||||
|
||||
import net.sourceforge.plantuml.Direction;
|
||||
|
||||
public abstract class AbstractTask implements Task {
|
||||
|
||||
public static final double HEIGHT = 16;
|
||||
|
||||
public double getHeight() {
|
||||
return HEIGHT;
|
||||
}
|
||||
|
||||
protected final TaskCode code;
|
||||
private double y;
|
||||
private Task row;
|
||||
|
||||
protected AbstractTask(TaskCode code) {
|
||||
this.code = code;
|
||||
}
|
||||
|
||||
public final double getY() {
|
||||
return y;
|
||||
public void putInSameRowAs(Task row) {
|
||||
this.row = row;
|
||||
}
|
||||
|
||||
public final void setY(double y) {
|
||||
this.y = y;
|
||||
}
|
||||
|
||||
public double getY(Direction direction) {
|
||||
if (direction == Direction.UP) {
|
||||
return y;
|
||||
}
|
||||
if (direction == Direction.DOWN) {
|
||||
return y + getHeight();
|
||||
}
|
||||
return y + getHeight() / 2;
|
||||
public final Task getRow() {
|
||||
return row;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -42,13 +42,12 @@ import java.util.TreeSet;
|
||||
|
||||
import net.sourceforge.plantuml.project.LoadPlanable;
|
||||
import net.sourceforge.plantuml.project.draw.ResourceDraw;
|
||||
import net.sourceforge.plantuml.project.lang.Subject;
|
||||
import net.sourceforge.plantuml.project.time.Day;
|
||||
import net.sourceforge.plantuml.project.time.DayOfWeek;
|
||||
import net.sourceforge.plantuml.project.time.GCalendar;
|
||||
import net.sourceforge.plantuml.project.time.Wink;
|
||||
|
||||
public class Resource implements Subject {
|
||||
public class Resource {
|
||||
|
||||
private final String name;
|
||||
private ResourceDraw draw;
|
||||
|
@ -35,14 +35,14 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml.project.core;
|
||||
|
||||
import net.sourceforge.plantuml.Direction;
|
||||
import net.sourceforge.plantuml.Url;
|
||||
import net.sourceforge.plantuml.cucadiagram.Display;
|
||||
import net.sourceforge.plantuml.project.Load;
|
||||
import net.sourceforge.plantuml.project.lang.ComplementColors;
|
||||
import net.sourceforge.plantuml.project.lang.Subject;
|
||||
import net.sourceforge.plantuml.project.lang.CenterBorderColor;
|
||||
import net.sourceforge.plantuml.project.time.DayOfWeek;
|
||||
import net.sourceforge.plantuml.project.time.Wink;
|
||||
|
||||
public interface Task extends Subject, Moment {
|
||||
public interface Task extends Moment {
|
||||
|
||||
public TaskCode getCode();
|
||||
|
||||
@ -58,7 +58,7 @@ public interface Task extends Subject, Moment {
|
||||
|
||||
public void setEnd(Wink end);
|
||||
|
||||
public void setColors(ComplementColors colors);
|
||||
public void setColors(CenterBorderColor colors);
|
||||
|
||||
public void addResource(Resource resource, int percentage);
|
||||
|
||||
@ -70,12 +70,14 @@ public interface Task extends Subject, Moment {
|
||||
|
||||
public void setUrl(Url url);
|
||||
|
||||
public double getHeight();
|
||||
public void putInSameRowAs(Task row);
|
||||
|
||||
public double getY();
|
||||
public Task getRow();
|
||||
|
||||
public void setY(double y);
|
||||
public void addPause(Wink pause);
|
||||
|
||||
public double getY(Direction direction);
|
||||
public void addPause(DayOfWeek pause);
|
||||
|
||||
public void setNote(Display note);
|
||||
|
||||
}
|
||||
|
@ -35,76 +35,108 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml.project.core;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.SortedSet;
|
||||
import java.util.TreeSet;
|
||||
|
||||
import net.sourceforge.plantuml.Url;
|
||||
import net.sourceforge.plantuml.cucadiagram.Display;
|
||||
import net.sourceforge.plantuml.project.Load;
|
||||
import net.sourceforge.plantuml.project.LoadPlanable;
|
||||
import net.sourceforge.plantuml.project.PlanUtils;
|
||||
import net.sourceforge.plantuml.project.Solver3;
|
||||
import net.sourceforge.plantuml.project.lang.ComplementColors;
|
||||
import net.sourceforge.plantuml.project.Solver;
|
||||
import net.sourceforge.plantuml.project.lang.CenterBorderColor;
|
||||
import net.sourceforge.plantuml.project.time.Day;
|
||||
import net.sourceforge.plantuml.project.time.DayOfWeek;
|
||||
import net.sourceforge.plantuml.project.time.GCalendar;
|
||||
import net.sourceforge.plantuml.project.time.Wink;
|
||||
|
||||
public class TaskImpl extends AbstractTask implements Task, LoadPlanable {
|
||||
|
||||
private final Solver3 solver;
|
||||
private final Map<Resource, Integer> resources2 = new LinkedHashMap<Resource, Integer>();
|
||||
private final SortedSet<Wink> pausedDay = new TreeSet<Wink>();
|
||||
private final Set<DayOfWeek> pausedDayOfWeek = new HashSet<DayOfWeek>();
|
||||
private final Solver solver;
|
||||
private final Map<Resource, Integer> resources = new LinkedHashMap<Resource, Integer>();
|
||||
private final LoadPlanable defaultPlan;
|
||||
private final GCalendar calendar;
|
||||
private boolean diamond;
|
||||
|
||||
private int completion = 100;
|
||||
private Display note;
|
||||
|
||||
private Url url;
|
||||
private ComplementColors colors;
|
||||
private CenterBorderColor colors;
|
||||
|
||||
public void setUrl(Url url) {
|
||||
this.url = url;
|
||||
}
|
||||
|
||||
public TaskImpl(TaskCode code, LoadPlanable defaultPlan) {
|
||||
public TaskImpl(TaskCode code, LoadPlanable defaultPlan, GCalendar calendar) {
|
||||
super(code);
|
||||
this.calendar = calendar;
|
||||
this.defaultPlan = defaultPlan;
|
||||
this.solver = new Solver3(this);
|
||||
this.solver = new Solver(this);
|
||||
setStart(new Wink(0));
|
||||
setLoad(Load.inWinks(1));
|
||||
}
|
||||
|
||||
public int getLoadAt(Wink instant) {
|
||||
if (pausedDay.contains(instant)) {
|
||||
return 0;
|
||||
}
|
||||
if (pausedDayOfWeek(instant)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
LoadPlanable result = defaultPlan;
|
||||
if (resources2.size() > 0) {
|
||||
if (resources.size() > 0) {
|
||||
result = PlanUtils.multiply(defaultPlan, getRessourcePlan());
|
||||
}
|
||||
return result.getLoadAt(instant);
|
||||
// return PlanUtils.minOf(getLoad(), plan1).getLoadAt(instant);
|
||||
}
|
||||
|
||||
private boolean pausedDayOfWeek(Wink instant) {
|
||||
for (DayOfWeek dayOfWeek : pausedDayOfWeek) {
|
||||
if (calendar.toDayAsDate(instant).getDayOfWeek() == dayOfWeek) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public int loadForResource(Resource res, Wink instant) {
|
||||
if (resources2.keySet().contains(res) && instant.compareTo(getStart()) >= 0
|
||||
if (resources.keySet().contains(res) && instant.compareTo(getStart()) >= 0
|
||||
&& instant.compareTo(getEnd()) <= 0) {
|
||||
if (res.isClosedAt(instant)) {
|
||||
return 0;
|
||||
}
|
||||
// int size = 0;
|
||||
return resources2.get(res);
|
||||
// for (Resource r : resources) {
|
||||
// if (r.getLoadAt(i) > 0) {
|
||||
// size++;
|
||||
// }
|
||||
// }
|
||||
// return getLoadAt(instant) / size;
|
||||
return resources.get(res);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public void addPause(Wink pause) {
|
||||
this.pausedDay.add(pause);
|
||||
}
|
||||
|
||||
public void addPause(DayOfWeek pause) {
|
||||
this.pausedDayOfWeek.add(pause);
|
||||
}
|
||||
|
||||
private LoadPlanable getRessourcePlan() {
|
||||
if (resources2.size() == 0) {
|
||||
if (resources.size() == 0) {
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
return new LoadPlanable() {
|
||||
|
||||
public int getLoadAt(Wink instant) {
|
||||
int result = 0;
|
||||
for (Map.Entry<Resource, Integer> ent : resources2.entrySet()) {
|
||||
for (Map.Entry<Resource, Integer> ent : resources.entrySet()) {
|
||||
final Resource res = ent.getKey();
|
||||
if (res.isClosedAt(instant)) {
|
||||
continue;
|
||||
@ -118,10 +150,10 @@ public class TaskImpl extends AbstractTask implements Task, LoadPlanable {
|
||||
}
|
||||
|
||||
public String getPrettyDisplay() {
|
||||
if (resources2.size() > 0) {
|
||||
if (resources.size() > 0) {
|
||||
final StringBuilder result = new StringBuilder(code.getSimpleDisplay());
|
||||
result.append(" ");
|
||||
for (Iterator<Map.Entry<Resource, Integer>> it = resources2.entrySet().iterator(); it.hasNext();) {
|
||||
for (Iterator<Map.Entry<Resource, Integer>> it = resources.entrySet().iterator(); it.hasNext();) {
|
||||
final Map.Entry<Resource, Integer> ent = it.next();
|
||||
result.append("{");
|
||||
result.append(ent.getKey().getName());
|
||||
@ -180,12 +212,12 @@ public class TaskImpl extends AbstractTask implements Task, LoadPlanable {
|
||||
solver.setData(TaskAttribute.END, end);
|
||||
}
|
||||
|
||||
public void setColors(ComplementColors colors) {
|
||||
public void setColors(CenterBorderColor colors) {
|
||||
this.colors = colors;
|
||||
}
|
||||
|
||||
public void addResource(Resource resource, int percentage) {
|
||||
this.resources2.put(resource, percentage);
|
||||
this.resources.put(resource, percentage);
|
||||
}
|
||||
|
||||
public void setDiamond(boolean diamond) {
|
||||
@ -196,8 +228,6 @@ public class TaskImpl extends AbstractTask implements Task, LoadPlanable {
|
||||
return this.diamond;
|
||||
}
|
||||
|
||||
private int completion = 100;
|
||||
|
||||
public void setCompletion(int completion) {
|
||||
this.completion = completion;
|
||||
}
|
||||
@ -206,7 +236,7 @@ public class TaskImpl extends AbstractTask implements Task, LoadPlanable {
|
||||
return url;
|
||||
}
|
||||
|
||||
public final ComplementColors getColors() {
|
||||
public final CenterBorderColor getColors() {
|
||||
return colors;
|
||||
}
|
||||
|
||||
@ -214,4 +244,30 @@ public class TaskImpl extends AbstractTask implements Task, LoadPlanable {
|
||||
return completion;
|
||||
}
|
||||
|
||||
public final Collection<Wink> getAllPaused() {
|
||||
final SortedSet<Wink> result = new TreeSet<Wink>(pausedDay);
|
||||
for (DayOfWeek dayOfWeek : pausedDayOfWeek) {
|
||||
addAll(result, dayOfWeek);
|
||||
}
|
||||
return Collections.unmodifiableCollection(result);
|
||||
}
|
||||
|
||||
private void addAll(SortedSet<Wink> result, DayOfWeek dayOfWeek) {
|
||||
final Day start = calendar.toDayAsDate(getStart());
|
||||
final Day end = calendar.toDayAsDate(getEnd());
|
||||
for (Day current = start; current.compareTo(end) <= 0; current = current.next()) {
|
||||
if (current.getDayOfWeek() == dayOfWeek) {
|
||||
result.add(calendar.fromDayAsDate(current));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void setNote(Display note) {
|
||||
this.note = note;
|
||||
}
|
||||
|
||||
public Display getNote() {
|
||||
return note;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -35,10 +35,9 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml.project.core;
|
||||
|
||||
import net.sourceforge.plantuml.project.lang.Complement;
|
||||
import net.sourceforge.plantuml.project.time.Wink;
|
||||
|
||||
public class TaskInstant implements Complement {
|
||||
public class TaskInstant {
|
||||
|
||||
private final Moment task;
|
||||
private final TaskAttribute attribute;
|
||||
@ -105,11 +104,22 @@ public class TaskInstant implements Complement {
|
||||
}
|
||||
|
||||
public final boolean isTask() {
|
||||
return task instanceof Task;
|
||||
return task instanceof AbstractTask;
|
||||
}
|
||||
|
||||
public final TaskAttribute getAttribute() {
|
||||
return attribute;
|
||||
}
|
||||
|
||||
public boolean sameRowAs(TaskInstant dest) {
|
||||
if (this.isTask() && dest.isTask()) {
|
||||
final AbstractTask t1 = (AbstractTask) this.getMoment();
|
||||
final AbstractTask t2 = (AbstractTask) dest.getMoment();
|
||||
if (t1 == t2.getRow() || t2 == t1.getRow()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -36,8 +36,10 @@
|
||||
package net.sourceforge.plantuml.project.core;
|
||||
|
||||
import net.sourceforge.plantuml.Url;
|
||||
import net.sourceforge.plantuml.cucadiagram.Display;
|
||||
import net.sourceforge.plantuml.project.Load;
|
||||
import net.sourceforge.plantuml.project.lang.ComplementColors;
|
||||
import net.sourceforge.plantuml.project.lang.CenterBorderColor;
|
||||
import net.sourceforge.plantuml.project.time.DayOfWeek;
|
||||
import net.sourceforge.plantuml.project.time.Wink;
|
||||
|
||||
public class TaskSeparator extends AbstractTask implements Task {
|
||||
@ -69,7 +71,7 @@ public class TaskSeparator extends AbstractTask implements Task {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
public void setColors(ComplementColors colors) {
|
||||
public void setColors(CenterBorderColor colors) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@ -105,4 +107,15 @@ public class TaskSeparator extends AbstractTask implements Task {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
public void addPause(Wink pause) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
public void addPause(DayOfWeek pause) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
public void setNote(Display note) {
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -35,39 +35,95 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml.project.draw;
|
||||
|
||||
import net.sourceforge.plantuml.Direction;
|
||||
import net.sourceforge.plantuml.ISkinParam;
|
||||
import net.sourceforge.plantuml.Url;
|
||||
import net.sourceforge.plantuml.cucadiagram.Display;
|
||||
import net.sourceforge.plantuml.graphic.FontConfiguration;
|
||||
import net.sourceforge.plantuml.project.core.AbstractTask;
|
||||
import net.sourceforge.plantuml.project.ToTaskDraw;
|
||||
import net.sourceforge.plantuml.project.core.Task;
|
||||
import net.sourceforge.plantuml.project.lang.CenterBorderColor;
|
||||
import net.sourceforge.plantuml.project.time.Wink;
|
||||
import net.sourceforge.plantuml.project.timescale.TimeScale;
|
||||
import net.sourceforge.plantuml.style.PName;
|
||||
import net.sourceforge.plantuml.style.Style;
|
||||
import net.sourceforge.plantuml.ugraphic.color.HColor;
|
||||
|
||||
public abstract class AbstractTaskDraw implements TaskDraw {
|
||||
|
||||
protected CenterBorderColor colors;
|
||||
protected int completion = 100;
|
||||
protected Url url;
|
||||
protected Display note;
|
||||
protected final TimeScale timeScale;
|
||||
protected final double y;
|
||||
protected final String prettyDisplay;
|
||||
protected final Wink start;
|
||||
protected final ISkinParam skinParam;
|
||||
private final Task task;
|
||||
private final ToTaskDraw toTaskDraw;
|
||||
|
||||
protected final double margin = 2;
|
||||
|
||||
public AbstractTaskDraw(TimeScale timeScale, double y, String prettyDisplay, Wink start) {
|
||||
final public void setColorsAndCompletion(CenterBorderColor colors, int completion, Url url, Display note) {
|
||||
this.colors = colors;
|
||||
this.completion = completion;
|
||||
this.url = url;
|
||||
this.note = note;
|
||||
}
|
||||
|
||||
public AbstractTaskDraw(TimeScale timeScale, double y, String prettyDisplay, Wink start, ISkinParam skinParam,
|
||||
Task task, ToTaskDraw toTaskDraw) {
|
||||
this.y = y;
|
||||
this.toTaskDraw = toTaskDraw;
|
||||
this.start = start;
|
||||
this.prettyDisplay = prettyDisplay;
|
||||
this.timeScale = timeScale;
|
||||
this.skinParam = skinParam;
|
||||
this.task = task;
|
||||
}
|
||||
|
||||
abstract protected FontConfiguration getFontConfiguration();
|
||||
final protected HColor getLineColor() {
|
||||
return getStyle().value(PName.LineColor).asColor(skinParam.getIHtmlColorSet());
|
||||
}
|
||||
|
||||
final protected HColor getBackgroundColor() {
|
||||
return getStyle().value(PName.BackGroundColor).asColor(skinParam.getIHtmlColorSet());
|
||||
}
|
||||
|
||||
final protected FontConfiguration getFontConfiguration() {
|
||||
return getStyle().getFontConfiguration(skinParam.getIHtmlColorSet());
|
||||
}
|
||||
|
||||
abstract protected Style getStyle();
|
||||
|
||||
final protected double getShapeHeight() {
|
||||
return getHeight() - 2 * margin;
|
||||
}
|
||||
|
||||
final public double getHeight() {
|
||||
return AbstractTask.HEIGHT;
|
||||
return getFontConfiguration().getFont().getSize2D() + 5;
|
||||
}
|
||||
|
||||
final public double getY() {
|
||||
return y;
|
||||
if (task.getRow() == null) {
|
||||
return y;
|
||||
}
|
||||
return toTaskDraw.getTaskDraw(task.getRow()).getY();
|
||||
}
|
||||
|
||||
public final Task getTask() {
|
||||
return task;
|
||||
}
|
||||
|
||||
public final double getY(Direction direction) {
|
||||
if (direction == Direction.UP) {
|
||||
return getY();
|
||||
}
|
||||
if (direction == Direction.DOWN) {
|
||||
return getY() + getHeight();
|
||||
}
|
||||
return getY() + getHeight() / 2;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -42,6 +42,7 @@ import net.sourceforge.plantuml.graphic.HorizontalAlignment;
|
||||
import net.sourceforge.plantuml.graphic.TextBlock;
|
||||
import net.sourceforge.plantuml.graphic.UDrawable;
|
||||
import net.sourceforge.plantuml.project.GanttDiagram;
|
||||
import net.sourceforge.plantuml.project.core.PrintScale;
|
||||
import net.sourceforge.plantuml.project.core.Resource;
|
||||
import net.sourceforge.plantuml.project.time.Wink;
|
||||
import net.sourceforge.plantuml.project.timescale.TimeScale;
|
||||
@ -75,20 +76,37 @@ public class ResourceDraw implements UDrawable {
|
||||
HorizontalAlignment.LEFT, new SpriteContainerEmpty());
|
||||
title.drawU(ug);
|
||||
final ULine line = ULine.hline(timeScale.getEndingPosition(max) - timeScale.getStartingPosition(min));
|
||||
ug.apply(HColorUtils.BLACK)
|
||||
.apply(UTranslate.dy(title.calculateDimension(ug.getStringBounder()).getHeight())).draw(line);
|
||||
for (Wink i = min; i.compareTo(max) <= 0; i = i.increment()) {
|
||||
final int load = gantt.getLoadForResource(res, i);
|
||||
if (load > 0) {
|
||||
final FontConfiguration fontConfiguration = getFontConfiguration(9, load > 100 ? HColorUtils.RED
|
||||
: HColorUtils.BLACK);
|
||||
final TextBlock value = Display.getWithNewlines("" + load).create(fontConfiguration,
|
||||
HorizontalAlignment.LEFT, new SpriteContainerEmpty());
|
||||
final double start = (timeScale.getStartingPosition(i) + timeScale.getEndingPosition(i)) / 2
|
||||
- value.calculateDimension(ug.getStringBounder()).getWidth() / 2;
|
||||
value.drawU(ug.apply(new UTranslate(start, 16)));
|
||||
}
|
||||
ug.apply(HColorUtils.BLACK).apply(UTranslate.dy(title.calculateDimension(ug.getStringBounder()).getHeight()))
|
||||
.draw(line);
|
||||
|
||||
double startingPosition = -1;
|
||||
int totalLoad = 0;
|
||||
int totalLimit = 0;
|
||||
for (Wink i = min; i.compareTo(max) <= 0; i = i.increment()) {
|
||||
final boolean isBreaking = timeScale.isBreaking(i);
|
||||
totalLoad += gantt.getLoadForResource(res, i);
|
||||
totalLimit += 100;
|
||||
if (isBreaking) {
|
||||
if (totalLoad > 0) {
|
||||
final boolean over = totalLoad > totalLimit;
|
||||
final FontConfiguration fontConfiguration = getFontConfiguration(9,
|
||||
over ? HColorUtils.RED : HColorUtils.BLACK);
|
||||
final TextBlock value = Display.getWithNewlines("" + totalLoad).create(fontConfiguration,
|
||||
HorizontalAlignment.LEFT, new SpriteContainerEmpty());
|
||||
if (startingPosition == -1)
|
||||
startingPosition = timeScale.getStartingPosition(i);
|
||||
final double endingPosition = timeScale.getEndingPosition(i);
|
||||
final double start = (startingPosition + endingPosition) / 2
|
||||
- value.calculateDimension(ug.getStringBounder()).getWidth() / 2;
|
||||
value.drawU(ug.apply(new UTranslate(start, 16)));
|
||||
}
|
||||
startingPosition = -1;
|
||||
totalLoad = 0;
|
||||
totalLimit = 0;
|
||||
} else {
|
||||
if (startingPosition == -1)
|
||||
startingPosition = timeScale.getStartingPosition(i);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -102,14 +120,6 @@ public class ResourceDraw implements UDrawable {
|
||||
return new FontConfiguration(font, color, color, false);
|
||||
}
|
||||
|
||||
// public void setColors(ComplementColors colors);
|
||||
//
|
||||
// public double getY();
|
||||
//
|
||||
// public double getY(Direction direction);
|
||||
//
|
||||
// public void drawTitle(UGraphic ug);
|
||||
|
||||
public double getHeight() {
|
||||
return 16 * 2;
|
||||
}
|
||||
|
@ -35,19 +35,26 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml.project.draw;
|
||||
|
||||
import net.sourceforge.plantuml.Direction;
|
||||
import net.sourceforge.plantuml.Url;
|
||||
import net.sourceforge.plantuml.cucadiagram.Display;
|
||||
import net.sourceforge.plantuml.graphic.UDrawable;
|
||||
import net.sourceforge.plantuml.project.lang.ComplementColors;
|
||||
import net.sourceforge.plantuml.project.core.Task;
|
||||
import net.sourceforge.plantuml.project.lang.CenterBorderColor;
|
||||
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
||||
|
||||
public interface TaskDraw extends UDrawable {
|
||||
|
||||
public void setColorsAndCompletion(ComplementColors colors, int completion, Url url);
|
||||
public void setColorsAndCompletion(CenterBorderColor colors, int completion, Url url, Display note);
|
||||
|
||||
public double getY();
|
||||
|
||||
public double getY(Direction direction);
|
||||
|
||||
public void drawTitle(UGraphic ug);
|
||||
|
||||
public double getHeight();
|
||||
|
||||
public Task getTask();
|
||||
|
||||
}
|
||||
|
@ -35,36 +35,40 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml.project.draw;
|
||||
|
||||
import net.sourceforge.plantuml.ISkinParam;
|
||||
import net.sourceforge.plantuml.SpriteContainerEmpty;
|
||||
import net.sourceforge.plantuml.Url;
|
||||
import net.sourceforge.plantuml.cucadiagram.Display;
|
||||
import net.sourceforge.plantuml.graphic.FontConfiguration;
|
||||
import net.sourceforge.plantuml.graphic.HorizontalAlignment;
|
||||
import net.sourceforge.plantuml.graphic.TextBlock;
|
||||
import net.sourceforge.plantuml.project.lang.ComplementColors;
|
||||
import net.sourceforge.plantuml.project.ToTaskDraw;
|
||||
import net.sourceforge.plantuml.project.core.Task;
|
||||
import net.sourceforge.plantuml.project.time.Wink;
|
||||
import net.sourceforge.plantuml.project.timescale.TimeScale;
|
||||
import net.sourceforge.plantuml.ugraphic.UFont;
|
||||
import net.sourceforge.plantuml.style.SName;
|
||||
import net.sourceforge.plantuml.style.Style;
|
||||
import net.sourceforge.plantuml.style.StyleSignature;
|
||||
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
||||
import net.sourceforge.plantuml.ugraphic.UPolygon;
|
||||
import net.sourceforge.plantuml.ugraphic.UShape;
|
||||
import net.sourceforge.plantuml.ugraphic.UTranslate;
|
||||
import net.sourceforge.plantuml.ugraphic.color.HColorUtils;
|
||||
|
||||
public class TaskDrawDiamond extends AbstractTaskDraw {
|
||||
|
||||
private ComplementColors colors;
|
||||
|
||||
public TaskDrawDiamond(TimeScale timeScale, double y, String prettyDisplay, Wink start) {
|
||||
super(timeScale, y, prettyDisplay, start);
|
||||
public TaskDrawDiamond(TimeScale timeScale, double y, String prettyDisplay, Wink start, ISkinParam skinParam,
|
||||
Task task, ToTaskDraw toTaskDraw) {
|
||||
super(timeScale, y, prettyDisplay, start, skinParam, task, toTaskDraw);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected FontConfiguration getFontConfiguration() {
|
||||
final UFont font = UFont.serif(11);
|
||||
return new FontConfiguration(font, HColorUtils.BLACK, HColorUtils.BLACK, false);
|
||||
protected Style getStyle() {
|
||||
final Style style = StyleSignature.of(SName.root, SName.element, SName.ganttDiagram, SName.milestone)
|
||||
.getMergedStyle(skinParam.getCurrentStyleBuilder());
|
||||
return style;
|
||||
}
|
||||
|
||||
// final UFont font = UFont.serif(11);
|
||||
// return new FontConfiguration(font, HColorUtils.BLACK, HColorUtils.BLACK, false);
|
||||
|
||||
final public void drawTitle(UGraphic ug) {
|
||||
final TextBlock title = Display.getWithNewlines(prettyDisplay).create(getFontConfiguration(),
|
||||
HorizontalAlignment.LEFT, new SpriteContainerEmpty());
|
||||
@ -85,7 +89,7 @@ public class TaskDrawDiamond extends AbstractTaskDraw {
|
||||
if (colors != null && colors.isOk()) {
|
||||
return colors.apply(ug);
|
||||
}
|
||||
return ug.apply(HColorUtils.BLACK).apply(HColorUtils.BLACK.bg());
|
||||
return ug.apply(getLineColor()).apply(getBackgroundColor().bg());
|
||||
}
|
||||
|
||||
private void drawShape(UGraphic ug) {
|
||||
@ -102,7 +106,4 @@ public class TaskDrawDiamond extends AbstractTaskDraw {
|
||||
return result;
|
||||
}
|
||||
|
||||
public void setColorsAndCompletion(ComplementColors colors, int completion, Url url) {
|
||||
this.colors = colors;
|
||||
}
|
||||
}
|
||||
|
@ -35,44 +35,55 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml.project.draw;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
import net.sourceforge.plantuml.FontParam;
|
||||
import net.sourceforge.plantuml.ISkinParam;
|
||||
import net.sourceforge.plantuml.LineBreakStrategy;
|
||||
import net.sourceforge.plantuml.SpriteContainerEmpty;
|
||||
import net.sourceforge.plantuml.Url;
|
||||
import net.sourceforge.plantuml.creole.CreoleMode;
|
||||
import net.sourceforge.plantuml.creole.Parser;
|
||||
import net.sourceforge.plantuml.creole.Sheet;
|
||||
import net.sourceforge.plantuml.creole.SheetBlock1;
|
||||
import net.sourceforge.plantuml.cucadiagram.Display;
|
||||
import net.sourceforge.plantuml.graphic.FontConfiguration;
|
||||
import net.sourceforge.plantuml.graphic.HorizontalAlignment;
|
||||
import net.sourceforge.plantuml.graphic.TextBlock;
|
||||
import net.sourceforge.plantuml.project.lang.ComplementColors;
|
||||
import net.sourceforge.plantuml.project.ToTaskDraw;
|
||||
import net.sourceforge.plantuml.project.core.Task;
|
||||
import net.sourceforge.plantuml.project.core.TaskImpl;
|
||||
import net.sourceforge.plantuml.project.time.Wink;
|
||||
import net.sourceforge.plantuml.project.timescale.TimeScale;
|
||||
import net.sourceforge.plantuml.ugraphic.UFont;
|
||||
import net.sourceforge.plantuml.style.PName;
|
||||
import net.sourceforge.plantuml.style.SName;
|
||||
import net.sourceforge.plantuml.style.Style;
|
||||
import net.sourceforge.plantuml.style.StyleSignature;
|
||||
import net.sourceforge.plantuml.svek.image.Opale;
|
||||
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
||||
import net.sourceforge.plantuml.ugraphic.ULine;
|
||||
import net.sourceforge.plantuml.ugraphic.URectangle;
|
||||
import net.sourceforge.plantuml.ugraphic.UStroke;
|
||||
import net.sourceforge.plantuml.ugraphic.UTranslate;
|
||||
import net.sourceforge.plantuml.ugraphic.color.HColor;
|
||||
import net.sourceforge.plantuml.ugraphic.color.HColorNone;
|
||||
import net.sourceforge.plantuml.ugraphic.color.HColorSet;
|
||||
import net.sourceforge.plantuml.ugraphic.color.HColorUtils;
|
||||
|
||||
public class TaskDrawRegular extends AbstractTaskDraw {
|
||||
|
||||
private static final HColor defaultColor = HColorSet.instance().getColorIfValid("GreenYellow");
|
||||
|
||||
private ComplementColors colors;
|
||||
private int completion = 100;
|
||||
private Url url;
|
||||
private final Wink end;
|
||||
private final boolean oddStart;
|
||||
private final boolean oddEnd;
|
||||
private final Collection<Wink> paused;
|
||||
|
||||
private final double margin = 2;
|
||||
|
||||
public TaskDrawRegular(TimeScale timeScale, double y, String prettyDisplay, Wink start, Wink end, boolean oddStart,
|
||||
boolean oddEnd) {
|
||||
super(timeScale, y, prettyDisplay, start);
|
||||
boolean oddEnd, ISkinParam skinParam, Task task, ToTaskDraw toTaskDraw) {
|
||||
super(timeScale, y, prettyDisplay, start, skinParam, task, toTaskDraw);
|
||||
this.end = end;
|
||||
this.oddStart = oddStart;
|
||||
this.oddEnd = oddEnd;
|
||||
|
||||
this.paused = ((TaskImpl) task).getAllPaused();
|
||||
}
|
||||
|
||||
public void drawTitle(UGraphic ug) {
|
||||
@ -84,24 +95,53 @@ public class TaskDrawRegular extends AbstractTaskDraw {
|
||||
title.drawU(ug.apply(new UTranslate(endingPosition, h)));
|
||||
}
|
||||
|
||||
// final UFont font = UFont.serif(11);
|
||||
// return new FontConfiguration(font, HColorUtils.BLACK, HColorUtils.BLACK, false);
|
||||
|
||||
@Override
|
||||
protected FontConfiguration getFontConfiguration() {
|
||||
final UFont font = UFont.serif(11);
|
||||
return new FontConfiguration(font, HColorUtils.BLACK, HColorUtils.BLACK, false);
|
||||
protected Style getStyle() {
|
||||
final Style style = StyleSignature.of(SName.root, SName.element, SName.ganttDiagram, SName.task)
|
||||
.getMergedStyle(skinParam.getCurrentStyleBuilder());
|
||||
return style;
|
||||
}
|
||||
|
||||
public void drawU(UGraphic ug1) {
|
||||
public void drawU(UGraphic ug) {
|
||||
drawNote(ug.apply(UTranslate.dy(getShapeHeight() + margin * 3)));
|
||||
|
||||
final double startPos = timeScale.getStartingPosition(start);
|
||||
ug1 = applyColors(ug1);
|
||||
UGraphic ug2 = ug1.apply(new UTranslate(startPos + margin, margin));
|
||||
drawShape(ug2);
|
||||
ug = applyColors(ug);
|
||||
ug = ug.apply(new UTranslate(startPos + margin, margin));
|
||||
drawShape(ug);
|
||||
}
|
||||
|
||||
private void drawNote(UGraphic ug) {
|
||||
if (note == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
final Style style = StyleSignature.of(SName.root, SName.element, SName.ganttDiagram, SName.note)
|
||||
.getMergedStyle(skinParam.getCurrentStyleBuilder());
|
||||
FontConfiguration fc = new FontConfiguration(style, skinParam, null, FontParam.NOTE);
|
||||
|
||||
final Sheet sheet = Parser
|
||||
.build(fc, skinParam.getDefaultTextAlignment(HorizontalAlignment.LEFT), skinParam, CreoleMode.FULL)
|
||||
.createSheet(note);
|
||||
final SheetBlock1 sheet1 = new SheetBlock1(sheet, LineBreakStrategy.NONE, skinParam.getPadding());
|
||||
|
||||
final HColor noteBackgroundColor = style.value(PName.BackGroundColor).asColor(skinParam.getIHtmlColorSet());
|
||||
final HColor borderColor = style.value(PName.LineColor).asColor(skinParam.getIHtmlColorSet());
|
||||
final double shadowing = style.value(PName.Shadowing).asDouble();
|
||||
|
||||
Opale opale = new Opale(shadowing, borderColor, noteBackgroundColor, sheet1, false);
|
||||
opale.drawU(ug);
|
||||
|
||||
}
|
||||
|
||||
private UGraphic applyColors(UGraphic ug) {
|
||||
if (colors != null && colors.isOk()) {
|
||||
return colors.apply(ug);
|
||||
}
|
||||
return ug.apply(HColorUtils.BLUE).apply(defaultColor.bg());
|
||||
return ug.apply(getLineColor()).apply(getBackgroundColor().bg());
|
||||
}
|
||||
|
||||
private void drawShape(UGraphic ug) {
|
||||
@ -117,37 +157,54 @@ public class TaskDrawRegular extends AbstractTaskDraw {
|
||||
}
|
||||
if (oddStart && !oddEnd) {
|
||||
ug.draw(PathUtils.UtoRight(fullLength, getShapeHeight()));
|
||||
return;
|
||||
}
|
||||
if (!oddStart && oddEnd) {
|
||||
} else if (!oddStart && oddEnd) {
|
||||
ug.draw(PathUtils.UtoLeft(fullLength, getShapeHeight()));
|
||||
return;
|
||||
}
|
||||
final URectangle full = new URectangle(fullLength, getShapeHeight()).rounded(8);
|
||||
if (completion == 100) {
|
||||
ug.draw(full);
|
||||
} else {
|
||||
final double partialLength = fullLength * completion / 100.;
|
||||
ug.apply(HColorUtils.WHITE).apply(HColorUtils.WHITE.bg())
|
||||
.draw(full);
|
||||
if (partialLength > 2) {
|
||||
final URectangle partial = new URectangle(partialLength, getShapeHeight()).rounded(8);
|
||||
ug.apply(new HColorNone()).draw(partial);
|
||||
final URectangle full = new URectangle(fullLength, getShapeHeight()).rounded(8);
|
||||
if (completion == 100) {
|
||||
ug.draw(full);
|
||||
} else {
|
||||
final double partialLength = fullLength * completion / 100.;
|
||||
ug.apply(HColorUtils.WHITE).apply(HColorUtils.WHITE.bg()).draw(full);
|
||||
if (partialLength > 2) {
|
||||
final URectangle partial = new URectangle(partialLength, getShapeHeight()).rounded(8);
|
||||
ug.apply(new HColorNone()).draw(partial);
|
||||
}
|
||||
if (partialLength > 10 && partialLength < fullLength - 10) {
|
||||
final URectangle patch = new URectangle(8, getShapeHeight());
|
||||
ug.apply(new HColorNone()).apply(UTranslate.dx(partialLength - 8)).draw(patch);
|
||||
}
|
||||
ug.apply(new HColorNone().bg()).draw(full);
|
||||
}
|
||||
if (partialLength > 10 && partialLength < fullLength - 10) {
|
||||
final URectangle patch = new URectangle(8, getShapeHeight());
|
||||
ug.apply(new HColorNone()).apply(UTranslate.dx(partialLength - 8)).draw(patch);
|
||||
}
|
||||
Wink begin = null;
|
||||
for (Wink pause : paused) {
|
||||
if (paused.contains(pause.increment())) {
|
||||
if (begin == null)
|
||||
begin = pause;
|
||||
} else {
|
||||
if (begin == null)
|
||||
drawPause(ug, pause, pause);
|
||||
else
|
||||
drawPause(ug, begin, pause);
|
||||
begin = null;
|
||||
}
|
||||
ug.apply(new HColorNone().bg()).draw(full);
|
||||
}
|
||||
if (url != null) {
|
||||
ug.closeUrl();
|
||||
}
|
||||
}
|
||||
|
||||
public void setColorsAndCompletion(ComplementColors colors, int completion, Url url) {
|
||||
this.colors = colors;
|
||||
this.completion = completion;
|
||||
this.url = url;
|
||||
private void drawPause(UGraphic ug, Wink start1, Wink end) {
|
||||
final double x1 = timeScale.getStartingPosition(start1);
|
||||
final double x2 = timeScale.getEndingPosition(end);
|
||||
final URectangle small = new URectangle(x2 - x1 - 1, getShapeHeight() + 1);
|
||||
final ULine line = ULine.hline(x2 - x1 - 1);
|
||||
ug = ug.apply(UTranslate.dx(x1 - 1));
|
||||
ug.apply(HColorUtils.WHITE).apply(HColorUtils.WHITE.bg()).draw(small);
|
||||
final UGraphic ugLine = ug.apply(new UStroke(2, 3, 1));
|
||||
ugLine.draw(line);
|
||||
ugLine.apply(UTranslate.dy(getShapeHeight())).draw(line);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -35,6 +35,7 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml.project.draw;
|
||||
|
||||
import net.sourceforge.plantuml.Direction;
|
||||
import net.sourceforge.plantuml.SpriteContainerEmpty;
|
||||
import net.sourceforge.plantuml.Url;
|
||||
import net.sourceforge.plantuml.cucadiagram.Display;
|
||||
@ -43,7 +44,8 @@ import net.sourceforge.plantuml.graphic.HorizontalAlignment;
|
||||
import net.sourceforge.plantuml.graphic.TextBlock;
|
||||
import net.sourceforge.plantuml.graphic.TextBlockUtils;
|
||||
import net.sourceforge.plantuml.project.core.AbstractTask;
|
||||
import net.sourceforge.plantuml.project.lang.ComplementColors;
|
||||
import net.sourceforge.plantuml.project.core.Task;
|
||||
import net.sourceforge.plantuml.project.lang.CenterBorderColor;
|
||||
import net.sourceforge.plantuml.project.time.Wink;
|
||||
import net.sourceforge.plantuml.project.timescale.TimeScale;
|
||||
import net.sourceforge.plantuml.ugraphic.UFont;
|
||||
@ -108,14 +110,22 @@ public class TaskDrawSeparator implements TaskDraw {
|
||||
}
|
||||
|
||||
public double getHeight() {
|
||||
return AbstractTask.HEIGHT;
|
||||
return 16;
|
||||
}
|
||||
|
||||
public double getY() {
|
||||
return y;
|
||||
}
|
||||
|
||||
public void setColorsAndCompletion(ComplementColors colors, int completion, Url url) {
|
||||
public void setColorsAndCompletion(CenterBorderColor colors, int completion, Url url, Display note) {
|
||||
}
|
||||
|
||||
public Task getTask() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
public double getY(Direction direction) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -46,14 +46,14 @@ import net.sourceforge.plantuml.ugraphic.UFont;
|
||||
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
||||
import net.sourceforge.plantuml.ugraphic.ULine;
|
||||
import net.sourceforge.plantuml.ugraphic.UTranslate;
|
||||
import net.sourceforge.plantuml.ugraphic.color.HColor;
|
||||
import net.sourceforge.plantuml.ugraphic.color.HColorUtils;
|
||||
|
||||
public abstract class TimeHeader {
|
||||
|
||||
|
||||
protected static final int Y_POS_ROW16 = 16;
|
||||
protected static final int Y_POS_ROW28 = 28;
|
||||
|
||||
|
||||
private final TimeScale timeScale;
|
||||
protected final Wink min;
|
||||
protected final Wink max;
|
||||
@ -75,20 +75,20 @@ public abstract class TimeHeader {
|
||||
ug.apply(HColorUtils.LIGHT_GRAY).apply(UTranslate.dy(y)).draw(hline);
|
||||
}
|
||||
|
||||
final protected FontConfiguration getFontConfiguration(int size, boolean bold) {
|
||||
final protected FontConfiguration getFontConfiguration(int size, boolean bold, HColor color) {
|
||||
UFont font = UFont.serif(size);
|
||||
if (bold) {
|
||||
font = font.bold();
|
||||
}
|
||||
return new FontConfiguration(font, HColorUtils.BLACK, HColorUtils.BLACK, false);
|
||||
return new FontConfiguration(font, color, color, false);
|
||||
}
|
||||
|
||||
public final TimeScale getTimeScale() {
|
||||
return timeScale;
|
||||
}
|
||||
|
||||
protected final TextBlock getTextBlock(final String text, int size, boolean bold) {
|
||||
return Display.getWithNewlines(text).create(getFontConfiguration(size, bold), HorizontalAlignment.LEFT,
|
||||
protected final TextBlock getTextBlock(String text, int size, boolean bold, HColor color) {
|
||||
return Display.getWithNewlines(text).create(getFontConfiguration(size, bold, color), HorizontalAlignment.LEFT,
|
||||
new SpriteContainerEmpty());
|
||||
}
|
||||
|
||||
|
@ -60,14 +60,15 @@ public class TimeHeaderDaily extends TimeHeader {
|
||||
}
|
||||
|
||||
private final HColor veryLightGray = HColorSet.instance().getColorIfValid("#E0E8E8");
|
||||
private final HColor lightGray = HColorSet.instance().getColorIfValid("#909898");
|
||||
|
||||
private final GCalendar calendar;
|
||||
private final LoadPlanable defaultPlan;
|
||||
private final Map<Day, HColor> colorDays;
|
||||
private final Map<Day, String> nameDays;
|
||||
|
||||
public TimeHeaderDaily(GCalendar calendar, Wink min, Wink max, LoadPlanable defaultPlan,
|
||||
Map<Day, HColor> colorDays, Map<Day, String> nameDays, Day printStart, Day printEnd) {
|
||||
public TimeHeaderDaily(GCalendar calendar, Wink min, Wink max, LoadPlanable defaultPlan, Map<Day, HColor> colorDays,
|
||||
Map<Day, String> nameDays, Day printStart, Day printEnd) {
|
||||
super(min, max, new TimeScaleDaily(calendar, printStart));
|
||||
this.calendar = calendar;
|
||||
this.defaultPlan = defaultPlan;
|
||||
@ -99,16 +100,18 @@ public class TimeHeaderDaily extends TimeHeader {
|
||||
final double x1 = getTimeScale().getStartingPosition(wink);
|
||||
final double x2 = getTimeScale().getEndingPosition(wink);
|
||||
final Day day = calendar.toDayAsDate(wink);
|
||||
if (defaultPlan.getLoadAt(wink) > 0) {
|
||||
final HColor back = colorDays.get(day);
|
||||
if (back != null) {
|
||||
drawRectangle(ug.apply(back.bg()), height, x1, x2);
|
||||
}
|
||||
printCentered(ug.apply(UTranslate.dy(Y_POS_ROW16)),
|
||||
getTextBlock(day.getDayOfWeek().shortName(), 10, false), x1, x2);
|
||||
printCentered(ug.apply(UTranslate.dy(Y_POS_ROW28)), getTextBlock("" + day.getDayOfMonth(), 10, false),
|
||||
x1, x2);
|
||||
HColor textColor = HColorUtils.BLACK;
|
||||
if (defaultPlan.getLoadAt(wink) <= 0) {
|
||||
textColor = lightGray;
|
||||
}
|
||||
final HColor back = colorDays.get(day);
|
||||
if (back != null) {
|
||||
drawRectangle(ug.apply(back.bg()), height, x1, x2);
|
||||
}
|
||||
printCentered(ug.apply(UTranslate.dy(Y_POS_ROW16)),
|
||||
getTextBlock(day.getDayOfWeek().shortName(), 10, false, textColor), x1, x2);
|
||||
printCentered(ug.apply(UTranslate.dy(Y_POS_ROW28)),
|
||||
getTextBlock("" + day.getDayOfMonth(), 10, false, textColor), x1, x2);
|
||||
}
|
||||
}
|
||||
|
||||
@ -166,9 +169,9 @@ public class TimeHeaderDaily extends TimeHeader {
|
||||
}
|
||||
|
||||
private void printMonth(UGraphic ug, MonthYear monthYear, double start, double end) {
|
||||
final TextBlock tiny = getTextBlock(monthYear.shortName(), 12, true);
|
||||
final TextBlock small = getTextBlock(monthYear.longName(), 12, true);
|
||||
final TextBlock big = getTextBlock(monthYear.longNameYYYY(), 12, true);
|
||||
final TextBlock tiny = getTextBlock(monthYear.shortName(), 12, true, HColorUtils.BLACK);
|
||||
final TextBlock small = getTextBlock(monthYear.longName(), 12, true, HColorUtils.BLACK);
|
||||
final TextBlock big = getTextBlock(monthYear.longNameYYYY(), 12, true, HColorUtils.BLACK);
|
||||
printCentered(ug, start, end, tiny, small, big);
|
||||
}
|
||||
|
||||
@ -186,7 +189,7 @@ public class TimeHeaderDaily extends TimeHeader {
|
||||
if (name != null && name.equals(last) == false) {
|
||||
final double x1 = getTimeScale().getStartingPosition(wink);
|
||||
final double x2 = getTimeScale().getEndingPosition(wink);
|
||||
final TextBlock label = getTextBlock(name, 12, false);
|
||||
final TextBlock label = getTextBlock(name, 12, false, HColorUtils.BLACK);
|
||||
final double h = label.calculateDimension(ug.getStringBounder()).getHeight();
|
||||
double y1 = getTimeHeaderHeight();
|
||||
double y2 = getFullHeaderHeight();
|
||||
|
@ -122,13 +122,13 @@ public class TimeHeaderMonthly extends TimeHeader {
|
||||
}
|
||||
|
||||
private void printYear(UGraphic ug, MonthYear monthYear, double start, double end) {
|
||||
final TextBlock small = getTextBlock("" + monthYear.year(), 12, true);
|
||||
final TextBlock small = getTextBlock("" + monthYear.year(), 12, true, HColorUtils.BLACK);
|
||||
printCentered(ug, start, end, small);
|
||||
}
|
||||
|
||||
private void printMonth(UGraphic ug, MonthYear monthYear, double start, double end) {
|
||||
final TextBlock small = getTextBlock(monthYear.shortName(), 10, false);
|
||||
final TextBlock big = getTextBlock(monthYear.longName(), 10, false);
|
||||
final TextBlock small = getTextBlock(monthYear.shortName(), 10, false, HColorUtils.BLACK);
|
||||
final TextBlock big = getTextBlock(monthYear.longName(), 10, false, HColorUtils.BLACK);
|
||||
printCentered(ug, start, end, small, big);
|
||||
}
|
||||
|
||||
|
@ -80,7 +80,7 @@ public class TimeHeaderSimple extends TimeHeader {
|
||||
private void drawSimpleDayCounter(final UGraphic ug, TimeScale timeScale, double totalHeight) {
|
||||
final ULine vbar = ULine.vline(totalHeight);
|
||||
for (Wink i = min; i.compareTo(max.increment()) <= 0; i = i.increment()) {
|
||||
final TextBlock num = Display.getWithNewlines(i.toShortString()).create(getFontConfiguration(10, false),
|
||||
final TextBlock num = Display.getWithNewlines(i.toShortString()).create(getFontConfiguration(10, false, HColorUtils.BLACK),
|
||||
HorizontalAlignment.LEFT, new SpriteContainerEmpty());
|
||||
final double x1 = timeScale.getStartingPosition(i);
|
||||
final double x2 = timeScale.getEndingPosition(i);
|
||||
|
@ -114,15 +114,15 @@ public class TimeHeaderWeekly extends TimeHeader {
|
||||
for (Wink wink = min; wink.compareTo(max) < 0; wink = wink.increment()) {
|
||||
final Day day = calendar.toDayAsDate(wink);
|
||||
if (day.getDayOfWeek() == DayOfWeek.MONDAY) {
|
||||
printLeft(ug.apply(UTranslate.dy(Y_POS_ROW16)), getTextBlock("" + day.getDayOfMonth(), 10, false),
|
||||
printLeft(ug.apply(UTranslate.dy(Y_POS_ROW16)), getTextBlock("" + day.getDayOfMonth(), 10, false, HColorUtils.BLACK),
|
||||
getTimeScale().getStartingPosition(wink) + 5);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void printMonth(UGraphic ug, MonthYear monthYear, double start, double end) {
|
||||
final TextBlock small = getTextBlock(monthYear.shortName(), 12, true);
|
||||
final TextBlock big = getTextBlock(monthYear.shortNameYYYY(), 12, true);
|
||||
final TextBlock small = getTextBlock(monthYear.shortName(), 12, true, HColorUtils.BLACK);
|
||||
final TextBlock big = getTextBlock(monthYear.shortNameYYYY(), 12, true, HColorUtils.BLACK);
|
||||
printCentered(ug, start, end, small, big);
|
||||
}
|
||||
|
||||
|
@ -38,14 +38,20 @@ package net.sourceforge.plantuml.project.lang;
|
||||
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
||||
import net.sourceforge.plantuml.ugraphic.color.HColor;
|
||||
|
||||
public class ComplementColors implements Complement {
|
||||
public class CenterBorderColor {
|
||||
|
||||
private final HColor center;
|
||||
private final HColor border;
|
||||
private final String style;
|
||||
|
||||
public ComplementColors(HColor center, HColor border) {
|
||||
public CenterBorderColor(HColor center, HColor border) {
|
||||
this(center, border, null);
|
||||
}
|
||||
|
||||
public CenterBorderColor(HColor center, HColor border, String style) {
|
||||
this.center = center;
|
||||
this.border = border;
|
||||
this.style = style;
|
||||
}
|
||||
|
||||
public UGraphic apply(UGraphic ug) {
|
||||
@ -65,7 +71,11 @@ public class ComplementColors implements Complement {
|
||||
return center != null;
|
||||
}
|
||||
|
||||
public HColor getCenter() {
|
||||
public final HColor getCenter() {
|
||||
return center;
|
||||
}
|
||||
|
||||
public final String getStyle() {
|
||||
return style;
|
||||
}
|
||||
}
|
@ -44,7 +44,7 @@ import net.sourceforge.plantuml.project.core.Moment;
|
||||
import net.sourceforge.plantuml.project.core.TaskAttribute;
|
||||
import net.sourceforge.plantuml.project.core.TaskInstant;
|
||||
|
||||
public class ComplementBeforeOrAfterOrAtTaskStartOrEnd implements ComplementPattern {
|
||||
public class ComplementBeforeOrAfterOrAtTaskStartOrEnd implements Something {
|
||||
|
||||
private static final int POS_NB1 = 0;
|
||||
private static final int POS_DAY_OR_WEEK1 = 1;
|
||||
@ -61,12 +61,12 @@ public class ComplementBeforeOrAfterOrAtTaskStartOrEnd implements ComplementPatt
|
||||
"[%s]+(before|after))[%s]+\\[([^\\[\\]]+?)\\].?s[%s]+(start|end)");
|
||||
}
|
||||
|
||||
public Failable<Complement> getComplement(GanttDiagram system, RegexResult arg, String suffix) {
|
||||
public Failable<TaskInstant> getMe(GanttDiagram system, RegexResult arg, String suffix) {
|
||||
final String code = arg.get("COMPLEMENT" + suffix, POS_CODE_OTHER);
|
||||
final String startOrEnd = arg.get("COMPLEMENT" + suffix, POS_START_OR_END);
|
||||
final Moment task = system.getExistingMoment(code);
|
||||
if (task == null) {
|
||||
return Failable.<Complement>error("No such task " + code);
|
||||
return Failable.error("No such task " + code);
|
||||
}
|
||||
TaskInstant result = new TaskInstant(task, TaskAttribute.fromString(startOrEnd));
|
||||
final String nb1 = arg.get("COMPLEMENT" + suffix, POS_NB1);
|
||||
@ -90,6 +90,6 @@ public class ComplementBeforeOrAfterOrAtTaskStartOrEnd implements ComplementPatt
|
||||
}
|
||||
result = result.withDelta(delta);
|
||||
}
|
||||
return Failable.<Complement>ok(result);
|
||||
return Failable.ok(result);
|
||||
}
|
||||
}
|
||||
|
@ -41,16 +41,13 @@ import net.sourceforge.plantuml.command.regex.RegexResult;
|
||||
import net.sourceforge.plantuml.project.Failable;
|
||||
import net.sourceforge.plantuml.project.GanttDiagram;
|
||||
|
||||
public class ComplementClose implements ComplementPattern {
|
||||
|
||||
public static final Complement CLOSE = new Complement() {
|
||||
};
|
||||
public class ComplementClose implements Something {
|
||||
|
||||
public IRegex toRegex(String suffix) {
|
||||
return new RegexLeaf("CLOSED" + suffix, "(closed?)");
|
||||
}
|
||||
|
||||
public Failable<Complement> getComplement(GanttDiagram system, RegexResult arg, String suffix) {
|
||||
return Failable.<Complement> ok(CLOSE);
|
||||
public Failable<Object> getMe(GanttDiagram project, RegexResult arg, String suffix) {
|
||||
return Failable.ok(new Object());
|
||||
}
|
||||
}
|
||||
|
@ -42,14 +42,14 @@ import net.sourceforge.plantuml.project.Completion;
|
||||
import net.sourceforge.plantuml.project.Failable;
|
||||
import net.sourceforge.plantuml.project.GanttDiagram;
|
||||
|
||||
public class ComplementCompleted implements ComplementPattern {
|
||||
public class ComplementCompleted implements Something {
|
||||
|
||||
public IRegex toRegex(String suffix) {
|
||||
return new RegexLeaf("COMPLEMENT" + suffix, "(\\d+).*completed?");
|
||||
}
|
||||
|
||||
public Failable<Complement> getComplement(GanttDiagram system, RegexResult arg, String suffix) {
|
||||
public Failable<Completion> getMe(GanttDiagram system, RegexResult arg, String suffix) {
|
||||
final String value = arg.get("COMPLEMENT" + suffix, 0);
|
||||
return Failable.<Complement>ok(new Completion(Integer.parseInt(value)));
|
||||
return Failable.ok(new Completion(Integer.parseInt(value)));
|
||||
}
|
||||
}
|
||||
|
@ -45,7 +45,7 @@ import net.sourceforge.plantuml.project.GanttDiagram;
|
||||
import net.sourceforge.plantuml.project.time.Day;
|
||||
import net.sourceforge.plantuml.project.time.Month;
|
||||
|
||||
public class ComplementDate implements ComplementPattern {
|
||||
public class ComplementDate implements Something {
|
||||
|
||||
public IRegex toRegex(String suffix) {
|
||||
return new RegexOr(toRegexA(suffix), toRegexB(suffix), toRegexC(suffix), toRegexD(suffix));
|
||||
@ -87,45 +87,45 @@ public class ComplementDate implements ComplementPattern {
|
||||
new RegexLeaf("after"), //
|
||||
RegexLeaf.spaceOneOrMore(), //
|
||||
new RegexLeaf("start") //
|
||||
);
|
||||
);
|
||||
}
|
||||
|
||||
public Failable<Complement> getComplement(GanttDiagram system, RegexResult arg, String suffix) {
|
||||
public Failable<Day> getMe(GanttDiagram system, RegexResult arg, String suffix) {
|
||||
if (arg.get("ADAY" + suffix, 0) != null) {
|
||||
return Failable.<Complement> ok(resultA(arg, suffix));
|
||||
return Failable.ok(resultA(arg, suffix));
|
||||
}
|
||||
if (arg.get("BDAY" + suffix, 0) != null) {
|
||||
return Failable.<Complement> ok(resultB(arg, suffix));
|
||||
return Failable.ok(resultB(arg, suffix));
|
||||
}
|
||||
if (arg.get("CDAY" + suffix, 0) != null) {
|
||||
return Failable.<Complement> ok(resultC(arg, suffix));
|
||||
return Failable.ok(resultC(arg, suffix));
|
||||
}
|
||||
if (arg.get("DCOUNT" + suffix, 0) != null) {
|
||||
return Failable.<Complement> ok(resultD(system, arg, suffix));
|
||||
return Failable.ok(resultD(system, arg, suffix));
|
||||
}
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
|
||||
private Complement resultD(GanttDiagram system, RegexResult arg, String suffix) {
|
||||
private Day resultD(GanttDiagram system, RegexResult arg, String suffix) {
|
||||
final int day = Integer.parseInt(arg.get("DCOUNT" + suffix, 0));
|
||||
return system.getStartingDate(day);
|
||||
}
|
||||
|
||||
private Complement resultA(RegexResult arg, String suffix) {
|
||||
private Day resultA(RegexResult arg, String suffix) {
|
||||
final int day = Integer.parseInt(arg.get("ADAY" + suffix, 0));
|
||||
final String month = arg.get("AMONTH" + suffix, 0);
|
||||
final int year = Integer.parseInt(arg.get("AYEAR" + suffix, 0));
|
||||
return Day.create(year, month, day);
|
||||
}
|
||||
|
||||
private Complement resultB(RegexResult arg, String suffix) {
|
||||
private Day resultB(RegexResult arg, String suffix) {
|
||||
final int day = Integer.parseInt(arg.get("BDAY" + suffix, 0));
|
||||
final int month = Integer.parseInt(arg.get("BMONTH" + suffix, 0));
|
||||
final int year = Integer.parseInt(arg.get("BYEAR" + suffix, 0));
|
||||
return Day.create(year, month, day);
|
||||
}
|
||||
|
||||
private Complement resultC(RegexResult arg, String suffix) {
|
||||
private Day resultC(RegexResult arg, String suffix) {
|
||||
final int day = Integer.parseInt(arg.get("CDAY" + suffix, 0));
|
||||
final String month = arg.get("CMONTH" + suffix, 0);
|
||||
final int year = Integer.parseInt(arg.get("CYEAR" + suffix, 0));
|
||||
|
@ -44,7 +44,7 @@ import net.sourceforge.plantuml.project.Failable;
|
||||
import net.sourceforge.plantuml.project.GanttDiagram;
|
||||
import net.sourceforge.plantuml.project.time.Day;
|
||||
|
||||
public class ComplementDates implements ComplementPattern {
|
||||
public class ComplementDates implements Something {
|
||||
|
||||
public IRegex toRegex(String suffix) {
|
||||
return new RegexConcat( //
|
||||
@ -65,20 +65,7 @@ public class ComplementDates implements ComplementPattern {
|
||||
);
|
||||
}
|
||||
|
||||
public Subject getSubject(GanttDiagram project, RegexResult arg) {
|
||||
final Day date1 = getDate(arg, "1");
|
||||
final Day date2 = getDate(arg, "2");
|
||||
return new DaysAsDates(date1, date2);
|
||||
}
|
||||
|
||||
private Day getDate(RegexResult arg, String suffix) {
|
||||
final int day = Integer.parseInt(arg.get("DAY" + suffix, 0));
|
||||
final int month = Integer.parseInt(arg.get("MONTH" + suffix, 0));
|
||||
final int year = Integer.parseInt(arg.get("YEAR" + suffix, 0));
|
||||
return Day.create(year, month, day);
|
||||
}
|
||||
|
||||
public Failable<Complement> getComplement(GanttDiagram system, RegexResult arg, String suffix) {
|
||||
public Failable<DaysAsDates> getMe(GanttDiagram project, RegexResult arg, String suffix) {
|
||||
|
||||
final int day1 = Integer.parseInt(arg.get("DAY1" + suffix, 0));
|
||||
final int month1 = Integer.parseInt(arg.get("MONTH1" + suffix, 0));
|
||||
@ -90,7 +77,7 @@ public class ComplementDates implements ComplementPattern {
|
||||
final int year2 = Integer.parseInt(arg.get("YEAR2" + suffix, 0));
|
||||
final Day date2 = Day.create(year2, month2, day2);
|
||||
|
||||
return Failable.<Complement> ok(new DaysAsDates(date1, date2));
|
||||
return Failable.ok(new DaysAsDates(date1, date2));
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -43,16 +43,16 @@ import net.sourceforge.plantuml.project.Failable;
|
||||
import net.sourceforge.plantuml.project.GanttDiagram;
|
||||
import net.sourceforge.plantuml.project.time.DayOfWeek;
|
||||
|
||||
public class ComplementDayOfWeek implements ComplementPattern {
|
||||
public class ComplementDayOfWeek implements Something {
|
||||
|
||||
public IRegex toRegex(String suffix) {
|
||||
return new RegexConcat( //
|
||||
new RegexLeaf("COMPLEMENT" + suffix, "(" + DayOfWeek.getRegexString() + ")")); //
|
||||
}
|
||||
|
||||
public Failable<Complement> getComplement(GanttDiagram system, RegexResult arg, String suffix) {
|
||||
public Failable<DayOfWeek> getMe(GanttDiagram project, RegexResult arg, String suffix) {
|
||||
final String s = arg.get("COMPLEMENT" + suffix, 0);
|
||||
return Failable.<Complement> ok(DayOfWeek.fromString(s));
|
||||
return Failable.ok(DayOfWeek.fromString(s));
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -41,14 +41,13 @@ import net.sourceforge.plantuml.command.regex.RegexResult;
|
||||
import net.sourceforge.plantuml.project.Failable;
|
||||
import net.sourceforge.plantuml.project.GanttDiagram;
|
||||
|
||||
public class ComplementEmpty implements ComplementPattern {
|
||||
public class ComplementEmpty implements Something {
|
||||
|
||||
public IRegex toRegex(String suffix) {
|
||||
return new RegexLeaf("");
|
||||
}
|
||||
|
||||
public Failable<Complement> getComplement(GanttDiagram system, RegexResult arg, String suffix) {
|
||||
return Failable.<Complement> ok(new Complement() {
|
||||
});
|
||||
public Failable<Object> getMe(GanttDiagram system, RegexResult arg, String suffix) {
|
||||
return Failable.ok(new Object());
|
||||
}
|
||||
}
|
||||
|
@ -35,33 +35,21 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml.project.lang;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
|
||||
import net.sourceforge.plantuml.command.CommandExecutionResult;
|
||||
import net.sourceforge.plantuml.command.regex.IRegex;
|
||||
import net.sourceforge.plantuml.command.regex.RegexLeaf;
|
||||
import net.sourceforge.plantuml.command.regex.RegexResult;
|
||||
import net.sourceforge.plantuml.project.Failable;
|
||||
import net.sourceforge.plantuml.project.GanttDiagram;
|
||||
import net.sourceforge.plantuml.project.core.Task;
|
||||
|
||||
public class VerbIsDeleted implements VerbPattern {
|
||||
public class ComplementFromTo implements Something {
|
||||
|
||||
public Collection<ComplementPattern> getComplements() {
|
||||
return Arrays.<ComplementPattern> asList(new ComplementEmpty());
|
||||
public IRegex toRegex(String suffix) {
|
||||
return new RegexLeaf("COMPLEMENT" + suffix, "from[%s]+\\[([^\\[\\]]+)\\][%s]+to[%s]+\\[([^\\[\\]]+)\\]");
|
||||
}
|
||||
|
||||
public IRegex toRegex() {
|
||||
return new RegexLeaf("is[%s]+deleted");
|
||||
}
|
||||
|
||||
public Verb getVerb(final GanttDiagram project, RegexResult arg) {
|
||||
return new Verb() {
|
||||
public CommandExecutionResult execute(Subject subject, Complement complement) {
|
||||
final Task task = (Task) subject;
|
||||
return project.deleteTask(task);
|
||||
}
|
||||
|
||||
};
|
||||
public Failable<TwoNames> getMe(GanttDiagram system, RegexResult arg, String suffix) {
|
||||
final String name1 = arg.get("COMPLEMENT" + suffix, 0);
|
||||
final String name2 = arg.get("COMPLEMENT" + suffix, 1);
|
||||
return Failable.ok(new TwoNames(name1, name2));
|
||||
}
|
||||
}
|
@ -42,17 +42,17 @@ import net.sourceforge.plantuml.project.Failable;
|
||||
import net.sourceforge.plantuml.project.GanttDiagram;
|
||||
import net.sourceforge.plantuml.ugraphic.color.HColor;
|
||||
|
||||
public class ComplementInColors implements ComplementPattern {
|
||||
public class ComplementInColors implements Something {
|
||||
|
||||
public IRegex toRegex(String suffix) {
|
||||
return new RegexLeaf("COMPLEMENT" + suffix, "in[%s+](#?\\w+)(?:/(#?\\w+))?");
|
||||
return new RegexLeaf("COMPLEMENT" + suffix, "in[%s]+(#?\\w+)(?:/(#?\\w+))?");
|
||||
}
|
||||
|
||||
public Failable<Complement> getComplement(GanttDiagram system, RegexResult arg, String suffix) {
|
||||
public Failable<CenterBorderColor> getMe(GanttDiagram system, RegexResult arg, String suffix) {
|
||||
final String color1 = arg.get("COMPLEMENT" + suffix, 0);
|
||||
final String color2 = arg.get("COMPLEMENT" + suffix, 1);
|
||||
final HColor col1 = system.getIHtmlColorSet().getColorIfValid(color1);
|
||||
final HColor col2 = system.getIHtmlColorSet().getColorIfValid(color2);
|
||||
return Failable.<Complement> ok(new ComplementColors(col1, col2));
|
||||
return Failable.ok(new CenterBorderColor(col1, col2));
|
||||
}
|
||||
}
|
||||
|
@ -42,17 +42,18 @@ import net.sourceforge.plantuml.project.Failable;
|
||||
import net.sourceforge.plantuml.project.GanttDiagram;
|
||||
import net.sourceforge.plantuml.ugraphic.color.HColor;
|
||||
|
||||
public class ComplementInColors2 implements ComplementPattern {
|
||||
public class ComplementInColors2 implements Something {
|
||||
|
||||
public IRegex toRegex(String suffix) {
|
||||
return new RegexLeaf("COMPLEMENT" + suffix, "colou?red[%s]+(?:in[%s+])?(#?\\w+)(?:/(#?\\w+))?");
|
||||
return new RegexLeaf("COMPLEMENT" + suffix, "colou?red[%s]+(?:in[%s]+)?(#?\\w+)(?:/(#?\\w+))?");
|
||||
}
|
||||
|
||||
public Failable<Complement> getComplement(GanttDiagram system, RegexResult arg, String suffix) {
|
||||
public Failable<CenterBorderColor> getMe(GanttDiagram system, RegexResult arg, String suffix) {
|
||||
final String color1 = arg.get("COMPLEMENT" + suffix, 0);
|
||||
final String color2 = arg.get("COMPLEMENT" + suffix, 1);
|
||||
final HColor col1 = system.getIHtmlColorSet().getColorIfValid(color1);
|
||||
final HColor col2 = system.getIHtmlColorSet().getColorIfValid(color2);
|
||||
return Failable.<Complement> ok(new ComplementColors(col1, col2));
|
||||
return Failable.ok(new CenterBorderColor(col1, col2));
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -41,14 +41,14 @@ import net.sourceforge.plantuml.command.regex.RegexResult;
|
||||
import net.sourceforge.plantuml.project.Failable;
|
||||
import net.sourceforge.plantuml.project.GanttDiagram;
|
||||
|
||||
public class ComplementNamed implements ComplementPattern {
|
||||
public class ComplementNamed implements Something {
|
||||
|
||||
public IRegex toRegex(String suffix) {
|
||||
return new RegexLeaf("COMPLEMENT" + suffix, "\\[([^\\[\\]]+)\\]");
|
||||
}
|
||||
|
||||
public Failable<Complement> getComplement(GanttDiagram system, RegexResult arg, String suffix) {
|
||||
public Failable<String> getMe(GanttDiagram system, RegexResult arg, String suffix) {
|
||||
final String name = arg.get("COMPLEMENT" + suffix, 0);
|
||||
return Failable.<Complement> ok(new ComplementName(name));
|
||||
return Failable.ok(name);
|
||||
}
|
||||
}
|
||||
|
@ -41,16 +41,14 @@ import net.sourceforge.plantuml.command.regex.RegexResult;
|
||||
import net.sourceforge.plantuml.project.Failable;
|
||||
import net.sourceforge.plantuml.project.GanttDiagram;
|
||||
|
||||
public class ComplementOpen implements ComplementPattern {
|
||||
|
||||
public static final Complement OPEN = new Complement() {
|
||||
};
|
||||
public class ComplementOpen implements Something {
|
||||
|
||||
public IRegex toRegex(String suffix) {
|
||||
return new RegexLeaf("OPEN" + suffix, "(opene?d?)");
|
||||
}
|
||||
|
||||
public Failable<Complement> getComplement(GanttDiagram system, RegexResult arg, String suffix) {
|
||||
return Failable.<Complement> ok(OPEN);
|
||||
public Failable<Object> getMe(GanttDiagram project, RegexResult arg, String suffix) {
|
||||
return Failable.ok(new Object());
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -43,7 +43,7 @@ import net.sourceforge.plantuml.project.Failable;
|
||||
import net.sourceforge.plantuml.project.GanttDiagram;
|
||||
import net.sourceforge.plantuml.project.Load;
|
||||
|
||||
public class ComplementSeveralDays implements ComplementPattern {
|
||||
public class ComplementSeveralDays implements Something {
|
||||
|
||||
public IRegex toRegex(String suffix) {
|
||||
return new RegexConcat( //
|
||||
@ -52,7 +52,7 @@ public class ComplementSeveralDays implements ComplementPattern {
|
||||
)); //
|
||||
}
|
||||
|
||||
public Failable<Complement> getComplement(GanttDiagram system, RegexResult arg, String suffix) {
|
||||
public Failable<Load> getMe(GanttDiagram system, RegexResult arg, String suffix) {
|
||||
final String nb1 = arg.get("COMPLEMENT" + suffix, 0);
|
||||
final int factor1 = arg.get("COMPLEMENT" + suffix, 1).startsWith("w") ? system.daysInWeek() : 1;
|
||||
final int days1 = Integer.parseInt(nb1) * factor1;
|
||||
@ -64,7 +64,7 @@ public class ComplementSeveralDays implements ComplementPattern {
|
||||
days2 = Integer.parseInt(nb2) * factor2;
|
||||
}
|
||||
|
||||
return Failable.<Complement>ok(Load.inWinks(days1 + days2));
|
||||
return Failable.ok(Load.inWinks(days1 + days2));
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -45,18 +45,18 @@ import net.sourceforge.plantuml.command.regex.RegexResult;
|
||||
import net.sourceforge.plantuml.project.Failable;
|
||||
import net.sourceforge.plantuml.project.GanttDiagram;
|
||||
|
||||
public class ComplementUrl implements ComplementPattern {
|
||||
public class ComplementUrl implements Something {
|
||||
|
||||
public IRegex toRegex(String suffix) {
|
||||
return new RegexConcat( //
|
||||
new RegexLeaf("COMPLEMENT" + suffix, "(" + UrlBuilder.getRegexp() + ")")); //
|
||||
}
|
||||
|
||||
public Failable<Complement> getComplement(GanttDiagram diagram, RegexResult arg, String suffix) {
|
||||
public Failable<Url> getMe(GanttDiagram diagram, RegexResult arg, String suffix) {
|
||||
final String urlString = arg.get("COMPLEMENT" + suffix, 0);
|
||||
final UrlBuilder urlBuilder = new UrlBuilder("", ModeUrl.STRICT);
|
||||
final Url url = urlBuilder.getUrl(urlString);
|
||||
return Failable.<Complement>ok(url);
|
||||
return Failable.ok(url);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -35,33 +35,27 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml.project.lang;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
|
||||
import net.sourceforge.plantuml.command.CommandExecutionResult;
|
||||
import net.sourceforge.plantuml.command.regex.IRegex;
|
||||
import net.sourceforge.plantuml.command.regex.RegexLeaf;
|
||||
import net.sourceforge.plantuml.command.regex.RegexResult;
|
||||
import net.sourceforge.plantuml.project.Failable;
|
||||
import net.sourceforge.plantuml.project.GanttDiagram;
|
||||
import net.sourceforge.plantuml.project.time.DayOfWeek;
|
||||
import net.sourceforge.plantuml.ugraphic.color.HColor;
|
||||
|
||||
public class VerbAre implements VerbPattern {
|
||||
public class ComplementWithColorLink implements Something {
|
||||
|
||||
public Collection<ComplementPattern> getComplements() {
|
||||
return Arrays.<ComplementPattern> asList(new ComplementClose());
|
||||
public IRegex toRegex(String suffix) {
|
||||
final String optionalStyle = "(?:(dotted|bold|dashed)[%s]+)?";
|
||||
return new RegexLeaf("COMPLEMENT" + suffix,
|
||||
"with[%s]+" + optionalStyle + "(#?\\w+)[%s]+" + optionalStyle + "link");
|
||||
}
|
||||
|
||||
public IRegex toRegex() {
|
||||
return new RegexLeaf("are");
|
||||
}
|
||||
|
||||
public Verb getVerb(final GanttDiagram project, RegexResult arg) {
|
||||
return new Verb() {
|
||||
public CommandExecutionResult execute(Subject subject, Complement complement) {
|
||||
final DayOfWeek day = (DayOfWeek) subject;
|
||||
project.closeDayOfWeek(day);
|
||||
return CommandExecutionResult.ok();
|
||||
}
|
||||
};
|
||||
public Failable<CenterBorderColor> getMe(GanttDiagram system, RegexResult arg, String suffix) {
|
||||
final String style0 = arg.get("COMPLEMENT" + suffix, 0);
|
||||
final String color1 = arg.get("COMPLEMENT" + suffix, 1);
|
||||
final String style2 = arg.get("COMPLEMENT" + suffix, 2);
|
||||
final HColor col1 = system.getIHtmlColorSet().getColorIfValid(color1);
|
||||
final String style = style0 == null ? style2 : style0;
|
||||
return Failable.ok(new CenterBorderColor(col1, col1, style));
|
||||
}
|
||||
}
|
@ -35,36 +35,40 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml.project.lang;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
|
||||
import net.sourceforge.plantuml.command.CommandExecutionResult;
|
||||
import net.sourceforge.plantuml.command.regex.IRegex;
|
||||
import net.sourceforge.plantuml.command.regex.RegexConcat;
|
||||
import net.sourceforge.plantuml.command.regex.RegexLeaf;
|
||||
import net.sourceforge.plantuml.command.regex.RegexResult;
|
||||
import net.sourceforge.plantuml.project.Completion;
|
||||
import net.sourceforge.plantuml.project.Failable;
|
||||
import net.sourceforge.plantuml.project.GanttDiagram;
|
||||
import net.sourceforge.plantuml.project.core.Task;
|
||||
|
||||
public class VerbIsForTask implements VerbPattern {
|
||||
public class PairOfSomething implements Something {
|
||||
|
||||
public Collection<ComplementPattern> getComplements() {
|
||||
return Arrays.<ComplementPattern>asList(new ComplementCompleted());
|
||||
private final Something complement1;
|
||||
private final Something complement2;
|
||||
|
||||
public PairOfSomething(Something complement1, Something complement2) {
|
||||
this.complement1 = complement1;
|
||||
this.complement2 = complement2;
|
||||
}
|
||||
|
||||
public IRegex toRegex() {
|
||||
return new RegexLeaf("is");
|
||||
public Failable<? extends Object> getMe(GanttDiagram system, RegexResult arg, String suffix) {
|
||||
final Failable<? extends Object> r1 = complement1.getMe(system, arg, "A" + suffix);
|
||||
final Failable<? extends Object> r2 = complement2.getMe(system, arg, "B" + suffix);
|
||||
if (r1.isFail()) {
|
||||
return r1;
|
||||
}
|
||||
if (r2.isFail()) {
|
||||
return r2;
|
||||
}
|
||||
final Object[] result = new Object[] { r1.get(), r2.get() };
|
||||
return Failable.ok(result);
|
||||
}
|
||||
|
||||
public Verb getVerb(final GanttDiagram project, RegexResult arg) {
|
||||
return new Verb() {
|
||||
public CommandExecutionResult execute(Subject subject, Complement complement) {
|
||||
final Task task = (Task) subject;
|
||||
final Completion completed = (Completion) complement;
|
||||
task.setCompletion(completed.getCompletion());
|
||||
return CommandExecutionResult.ok();
|
||||
}
|
||||
|
||||
};
|
||||
public IRegex toRegex(String suffix) {
|
||||
final IRegex pattern1 = complement1.toRegex("A" + suffix);
|
||||
final IRegex pattern2 = complement2.toRegex("B" + suffix);
|
||||
return new RegexConcat(pattern1, new RegexLeaf("[%s]+"), pattern2);
|
||||
}
|
||||
|
||||
}
|
@ -35,18 +35,15 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml.project.lang;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
import net.sourceforge.plantuml.command.CommandExecutionResult;
|
||||
import net.sourceforge.plantuml.command.regex.IRegex;
|
||||
import net.sourceforge.plantuml.command.regex.RegexResult;
|
||||
import net.sourceforge.plantuml.project.GanttDiagram;
|
||||
|
||||
public interface SubjectPattern {
|
||||
|
||||
public Collection<VerbPattern> getVerbs();
|
||||
|
||||
public Subject getSubject(GanttDiagram project, RegexResult arg);
|
||||
public interface Sentence {
|
||||
|
||||
public IRegex toRegex();
|
||||
|
||||
public CommandExecutionResult execute(GanttDiagram project, RegexResult arg);
|
||||
|
||||
}
|
@ -35,55 +35,60 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml.project.lang;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
|
||||
import net.sourceforge.plantuml.command.CommandExecutionResult;
|
||||
import net.sourceforge.plantuml.command.regex.IRegex;
|
||||
import net.sourceforge.plantuml.command.regex.RegexConcat;
|
||||
import net.sourceforge.plantuml.command.regex.RegexLeaf;
|
||||
import net.sourceforge.plantuml.command.regex.RegexOr;
|
||||
import net.sourceforge.plantuml.command.regex.RegexResult;
|
||||
import net.sourceforge.plantuml.project.DaysAsDates;
|
||||
import net.sourceforge.plantuml.project.Failable;
|
||||
import net.sourceforge.plantuml.project.GanttDiagram;
|
||||
import net.sourceforge.plantuml.project.core.Resource;
|
||||
import net.sourceforge.plantuml.project.time.Day;
|
||||
|
||||
public class VerbIsOn implements VerbPattern {
|
||||
public class SentenceAnd implements Sentence {
|
||||
|
||||
public Collection<ComplementPattern> getComplements() {
|
||||
return Arrays.<ComplementPattern> asList(new ComplementDate(), new ComplementDates());
|
||||
private final SentenceSimple sentence1;
|
||||
private final SentenceSimple sentence2;
|
||||
|
||||
public SentenceAnd(SentenceSimple sentence1, SentenceSimple sentence2) {
|
||||
this.sentence1 = sentence1;
|
||||
this.sentence2 = sentence2;
|
||||
}
|
||||
|
||||
public IRegex toRegex() {
|
||||
return new RegexConcat(new RegexLeaf("is"), //
|
||||
return new RegexConcat(//
|
||||
RegexLeaf.start(), //
|
||||
sentence1.subjectii.toRegex(), //
|
||||
RegexLeaf.spaceOneOrMore(), //
|
||||
new RegexLeaf("on"), //
|
||||
sentence1.getVerbRegex(), //
|
||||
RegexLeaf.spaceOneOrMore(), //
|
||||
new RegexOr(//
|
||||
new RegexLeaf("on"),//
|
||||
new RegexLeaf("for"),//
|
||||
new RegexLeaf("the"),//
|
||||
new RegexLeaf("at") //
|
||||
) //
|
||||
);
|
||||
sentence1.complementii.toRegex("1"), //
|
||||
RegexLeaf.spaceOneOrMore(), //
|
||||
new RegexLeaf("and"), //
|
||||
RegexLeaf.spaceOneOrMore(), //
|
||||
sentence2.getVerbRegex(), //
|
||||
RegexLeaf.spaceOneOrMore(), //
|
||||
sentence2.complementii.toRegex("2"), //
|
||||
RegexLeaf.end());
|
||||
}
|
||||
|
||||
public Verb getVerb(final GanttDiagram project, RegexResult arg) {
|
||||
return new Verb() {
|
||||
public CommandExecutionResult execute(Subject subject, Complement complement) {
|
||||
final Resource resource = (Resource) subject;
|
||||
if (complement instanceof DaysAsDates) {
|
||||
for (Day when : (DaysAsDates) complement) {
|
||||
resource.addForceOnDay(project.convert(when));
|
||||
}
|
||||
} else {
|
||||
final Day when = (Day) complement;
|
||||
resource.addForceOnDay(project.convert(when));
|
||||
}
|
||||
return CommandExecutionResult.ok();
|
||||
}
|
||||
public final CommandExecutionResult execute(GanttDiagram project, RegexResult arg) {
|
||||
final Failable<? extends Object> subject = sentence1.subjectii.getMe(project, arg);
|
||||
if (subject.isFail()) {
|
||||
return CommandExecutionResult.error(subject.getError());
|
||||
}
|
||||
final Failable<? extends Object> complement1 = sentence1.complementii.getMe(project, arg, "1");
|
||||
if (complement1.isFail()) {
|
||||
return CommandExecutionResult.error(complement1.getError());
|
||||
}
|
||||
final CommandExecutionResult result1 = sentence1.execute(project, subject.get(), complement1.get());
|
||||
if (result1.isOk() == false) {
|
||||
return result1;
|
||||
}
|
||||
final Failable<? extends Object> complement2 = sentence2.complementii.getMe(project, arg, "2");
|
||||
if (complement2.isFail()) {
|
||||
return CommandExecutionResult.error(complement2.getError());
|
||||
}
|
||||
return sentence2.execute(project, subject.get(), complement2.get());
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
}
|
111
src/net/sourceforge/plantuml/project/lang/SentenceAndAnd.java
Normal file
111
src/net/sourceforge/plantuml/project/lang/SentenceAndAnd.java
Normal file
@ -0,0 +1,111 @@
|
||||
/* ========================================================================
|
||||
* PlantUML : a free UML diagram generator
|
||||
* ========================================================================
|
||||
*
|
||||
* (C) Copyright 2009-2020, Arnaud Roques
|
||||
*
|
||||
* Project Info: http://plantuml.com
|
||||
*
|
||||
* If you like this project or if you find it useful, you can support us at:
|
||||
*
|
||||
* http://plantuml.com/patreon (only 1$ per month!)
|
||||
* http://plantuml.com/paypal
|
||||
*
|
||||
* This file is part of PlantUML.
|
||||
*
|
||||
* PlantUML is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* PlantUML distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
* USA.
|
||||
*
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.project.lang;
|
||||
|
||||
import net.sourceforge.plantuml.command.CommandExecutionResult;
|
||||
import net.sourceforge.plantuml.command.regex.IRegex;
|
||||
import net.sourceforge.plantuml.command.regex.RegexConcat;
|
||||
import net.sourceforge.plantuml.command.regex.RegexLeaf;
|
||||
import net.sourceforge.plantuml.command.regex.RegexResult;
|
||||
import net.sourceforge.plantuml.project.Failable;
|
||||
import net.sourceforge.plantuml.project.GanttDiagram;
|
||||
|
||||
public class SentenceAndAnd implements Sentence {
|
||||
|
||||
private final SentenceSimple sentence1;
|
||||
private final SentenceSimple sentence2;
|
||||
private final SentenceSimple sentence3;
|
||||
|
||||
public SentenceAndAnd(SentenceSimple sentence1, SentenceSimple sentence2, SentenceSimple sentence3) {
|
||||
this.sentence1 = sentence1;
|
||||
this.sentence2 = sentence2;
|
||||
this.sentence3 = sentence3;
|
||||
}
|
||||
|
||||
public IRegex toRegex() {
|
||||
return new RegexConcat(//
|
||||
RegexLeaf.start(), //
|
||||
sentence1.subjectii.toRegex(), //
|
||||
RegexLeaf.spaceOneOrMore(), //
|
||||
sentence1.getVerbRegex(), //
|
||||
RegexLeaf.spaceOneOrMore(), //
|
||||
sentence1.complementii.toRegex("1"), //
|
||||
RegexLeaf.spaceOneOrMore(), //
|
||||
new RegexLeaf("and"), //
|
||||
RegexLeaf.spaceOneOrMore(), //
|
||||
sentence2.getVerbRegex(), //
|
||||
RegexLeaf.spaceOneOrMore(), //
|
||||
sentence2.complementii.toRegex("2"), //
|
||||
RegexLeaf.spaceOneOrMore(), //
|
||||
new RegexLeaf("and"), //
|
||||
RegexLeaf.spaceOneOrMore(), //
|
||||
sentence3.getVerbRegex(), //
|
||||
RegexLeaf.spaceOneOrMore(), //
|
||||
sentence3.complementii.toRegex("3"), //
|
||||
RegexLeaf.end());
|
||||
}
|
||||
|
||||
public final CommandExecutionResult execute(GanttDiagram project, RegexResult arg) {
|
||||
final Failable<? extends Object> subject = sentence1.subjectii.getMe(project, arg);
|
||||
if (subject.isFail()) {
|
||||
return CommandExecutionResult.error(subject.getError());
|
||||
}
|
||||
final Failable<? extends Object> complement1 = sentence1.complementii.getMe(project, arg, "1");
|
||||
if (complement1.isFail()) {
|
||||
return CommandExecutionResult.error(complement1.getError());
|
||||
}
|
||||
final CommandExecutionResult result1 = sentence1.execute(project, subject.get(), complement1.get());
|
||||
if (result1.isOk() == false) {
|
||||
return result1;
|
||||
}
|
||||
final Failable<? extends Object> complement2 = sentence2.complementii.getMe(project, arg, "2");
|
||||
if (complement2.isFail()) {
|
||||
return CommandExecutionResult.error(complement2.getError());
|
||||
}
|
||||
final CommandExecutionResult result2 = sentence2.execute(project, subject.get(), complement2.get());
|
||||
if (result2.isOk() == false) {
|
||||
return result2;
|
||||
}
|
||||
final Failable<? extends Object> complement3 = sentence3.complementii.getMe(project, arg, "3");
|
||||
if (complement3.isFail()) {
|
||||
return CommandExecutionResult.error(complement3.getError());
|
||||
}
|
||||
final CommandExecutionResult result3 = sentence3.execute(project, subject.get(), complement3.get());
|
||||
return result3;
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,59 @@
|
||||
/* ========================================================================
|
||||
* PlantUML : a free UML diagram generator
|
||||
* ========================================================================
|
||||
*
|
||||
* (C) Copyright 2009-2020, Arnaud Roques
|
||||
*
|
||||
* Project Info: http://plantuml.com
|
||||
*
|
||||
* If you like this project or if you find it useful, you can support us at:
|
||||
*
|
||||
* http://plantuml.com/patreon (only 1$ per month!)
|
||||
* http://plantuml.com/paypal
|
||||
*
|
||||
* This file is part of PlantUML.
|
||||
*
|
||||
* PlantUML is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* PlantUML distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
* USA.
|
||||
*
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.project.lang;
|
||||
|
||||
import net.sourceforge.plantuml.command.CommandExecutionResult;
|
||||
import net.sourceforge.plantuml.project.GanttDiagram;
|
||||
import net.sourceforge.plantuml.project.core.Task;
|
||||
|
||||
public class SentenceDisplayOnSameRowAs extends SentenceSimple {
|
||||
|
||||
public SentenceDisplayOnSameRowAs() {
|
||||
super(new SubjectTask(), Verbs.displayOnSameRowAs(), new ComplementNamed());
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommandExecutionResult execute(GanttDiagram project, Object subject, Object complement) {
|
||||
final Task task1 = (Task) subject;
|
||||
final Task task2 = project.getExistingTask((String) complement);
|
||||
if (task2 == null) {
|
||||
return CommandExecutionResult.error("No such task " + task2);
|
||||
}
|
||||
task1.putInSameRowAs(task2);
|
||||
return CommandExecutionResult.ok();
|
||||
}
|
||||
|
||||
}
|
@ -35,35 +35,26 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml.project.lang;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
|
||||
import net.sourceforge.plantuml.command.CommandExecutionResult;
|
||||
import net.sourceforge.plantuml.command.regex.IRegex;
|
||||
import net.sourceforge.plantuml.command.regex.RegexLeaf;
|
||||
import net.sourceforge.plantuml.command.regex.RegexResult;
|
||||
import net.sourceforge.plantuml.project.GanttConstraint;
|
||||
import net.sourceforge.plantuml.project.GanttDiagram;
|
||||
import net.sourceforge.plantuml.project.core.Task;
|
||||
import net.sourceforge.plantuml.project.core.TaskAttribute;
|
||||
import net.sourceforge.plantuml.project.core.TaskInstant;
|
||||
|
||||
public class VerbIsColored implements VerbPattern {
|
||||
public class SentenceEnds extends SentenceSimple {
|
||||
|
||||
public Collection<ComplementPattern> getComplements() {
|
||||
return Arrays.<ComplementPattern> asList(new ComplementInColors());
|
||||
public SentenceEnds() {
|
||||
super(new SubjectTask(), Verbs.ends(), new ComplementBeforeOrAfterOrAtTaskStartOrEnd());
|
||||
}
|
||||
|
||||
public IRegex toRegex() {
|
||||
return new RegexLeaf("is[%s]+colou?red");
|
||||
@Override
|
||||
public CommandExecutionResult execute(GanttDiagram project, Object subject, Object complement) {
|
||||
final Task task = (Task) subject;
|
||||
final TaskInstant when = (TaskInstant) complement;
|
||||
task.setEnd(when.getInstantPrecise().decrement());
|
||||
project.addContraint(new GanttConstraint(when, new TaskInstant(task, TaskAttribute.END)));
|
||||
return CommandExecutionResult.ok();
|
||||
}
|
||||
|
||||
public Verb getVerb(final GanttDiagram project, RegexResult arg) {
|
||||
return new Verb() {
|
||||
public CommandExecutionResult execute(Subject subject, Complement complement) {
|
||||
final Task task = (Task) subject;
|
||||
final ComplementColors colors = (ComplementColors) complement;
|
||||
task.setColors(colors);
|
||||
return CommandExecutionResult.ok();
|
||||
}
|
||||
|
||||
};
|
||||
}
|
||||
}
|
@ -35,36 +35,26 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml.project.lang;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
|
||||
import net.sourceforge.plantuml.command.CommandExecutionResult;
|
||||
import net.sourceforge.plantuml.command.regex.IRegex;
|
||||
import net.sourceforge.plantuml.command.regex.RegexLeaf;
|
||||
import net.sourceforge.plantuml.command.regex.RegexResult;
|
||||
import net.sourceforge.plantuml.project.GanttDiagram;
|
||||
import net.sourceforge.plantuml.project.Load;
|
||||
import net.sourceforge.plantuml.project.core.Task;
|
||||
import net.sourceforge.plantuml.project.core.TaskInstant;
|
||||
|
||||
public class VerbLasts implements VerbPattern {
|
||||
public class SentenceHappens extends SentenceSimple {
|
||||
|
||||
public Collection<ComplementPattern> getComplements() {
|
||||
return Arrays.<ComplementPattern> asList(new ComplementSeveralDays());
|
||||
public SentenceHappens() {
|
||||
super(new SubjectTask(), Verbs.happens(), new ComplementBeforeOrAfterOrAtTaskStartOrEnd());
|
||||
}
|
||||
|
||||
public IRegex toRegex() {
|
||||
return new RegexLeaf("lasts");
|
||||
@Override
|
||||
public CommandExecutionResult execute(GanttDiagram project, Object subject, Object complement) {
|
||||
final Task task = (Task) subject;
|
||||
task.setLoad(Load.inWinks(1));
|
||||
final TaskInstant when = (TaskInstant) complement;
|
||||
task.setStart(when.getInstantTheorical());
|
||||
task.setDiamond(true);
|
||||
return CommandExecutionResult.ok();
|
||||
}
|
||||
|
||||
public Verb getVerb(GanttDiagram project, RegexResult arg) {
|
||||
return new Verb() {
|
||||
public CommandExecutionResult execute(Subject subject, Complement complement) {
|
||||
final Task task = (Task) subject;
|
||||
final Load duration = (Load) complement;
|
||||
task.setLoad(duration);
|
||||
return CommandExecutionResult.ok();
|
||||
}
|
||||
|
||||
};
|
||||
}
|
||||
}
|
@ -0,0 +1,64 @@
|
||||
/* ========================================================================
|
||||
* PlantUML : a free UML diagram generator
|
||||
* ========================================================================
|
||||
*
|
||||
* (C) Copyright 2009-2020, Arnaud Roques
|
||||
*
|
||||
* Project Info: http://plantuml.com
|
||||
*
|
||||
* If you like this project or if you find it useful, you can support us at:
|
||||
*
|
||||
* http://plantuml.com/patreon (only 1$ per month!)
|
||||
* http://plantuml.com/paypal
|
||||
*
|
||||
* This file is part of PlantUML.
|
||||
*
|
||||
* PlantUML is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* PlantUML distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
* USA.
|
||||
*
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.project.lang;
|
||||
|
||||
import net.sourceforge.plantuml.command.CommandExecutionResult;
|
||||
import net.sourceforge.plantuml.project.GanttDiagram;
|
||||
import net.sourceforge.plantuml.project.Load;
|
||||
import net.sourceforge.plantuml.project.core.Task;
|
||||
import net.sourceforge.plantuml.project.time.Day;
|
||||
|
||||
public class SentenceHappensDate extends SentenceSimple {
|
||||
|
||||
public SentenceHappensDate() {
|
||||
super(new SubjectTask(), Verbs.happens(), new ComplementDate());
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommandExecutionResult execute(GanttDiagram project, Object subject, Object complement) {
|
||||
final Task task = (Task) subject;
|
||||
task.setLoad(Load.inWinks(1));
|
||||
final Day start = (Day) complement;
|
||||
final Day startingDate = project.getStartingDate();
|
||||
if (startingDate == null) {
|
||||
return CommandExecutionResult.error("No starting date for the project");
|
||||
}
|
||||
task.setStart(start.asInstantDay(startingDate));
|
||||
task.setDiamond(true);
|
||||
return CommandExecutionResult.ok();
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,56 @@
|
||||
/* ========================================================================
|
||||
* PlantUML : a free UML diagram generator
|
||||
* ========================================================================
|
||||
*
|
||||
* (C) Copyright 2009-2020, Arnaud Roques
|
||||
*
|
||||
* Project Info: http://plantuml.com
|
||||
*
|
||||
* If you like this project or if you find it useful, you can support us at:
|
||||
*
|
||||
* http://plantuml.com/patreon (only 1$ per month!)
|
||||
* http://plantuml.com/paypal
|
||||
*
|
||||
* This file is part of PlantUML.
|
||||
*
|
||||
* PlantUML is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* PlantUML distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
* USA.
|
||||
*
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.project.lang;
|
||||
|
||||
import net.sourceforge.plantuml.command.CommandExecutionResult;
|
||||
import net.sourceforge.plantuml.project.GanttDiagram;
|
||||
import net.sourceforge.plantuml.project.core.Task;
|
||||
|
||||
public class SentenceIsColored extends SentenceSimple {
|
||||
|
||||
public SentenceIsColored() {
|
||||
super(new SubjectTask(), Verbs.isColored(), new ComplementInColors());
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommandExecutionResult execute(GanttDiagram project, Object subject, Object complement) {
|
||||
final Task task = (Task) subject;
|
||||
final CenterBorderColor colors = (CenterBorderColor) complement;
|
||||
task.setColors(colors);
|
||||
return CommandExecutionResult.ok();
|
||||
}
|
||||
|
||||
}
|
@ -35,18 +35,20 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml.project.lang;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
import net.sourceforge.plantuml.command.regex.IRegex;
|
||||
import net.sourceforge.plantuml.command.regex.RegexResult;
|
||||
import net.sourceforge.plantuml.command.CommandExecutionResult;
|
||||
import net.sourceforge.plantuml.project.GanttDiagram;
|
||||
import net.sourceforge.plantuml.project.core.Task;
|
||||
|
||||
public interface VerbPattern {
|
||||
public class SentenceIsDeleted extends SentenceSimple {
|
||||
|
||||
public Collection<ComplementPattern> getComplements();
|
||||
public SentenceIsDeleted() {
|
||||
super(new SubjectTask(), Verbs.isDeleted(), new ComplementEmpty());
|
||||
}
|
||||
|
||||
public Verb getVerb(GanttDiagram project, RegexResult arg);
|
||||
|
||||
public IRegex toRegex();
|
||||
@Override
|
||||
public CommandExecutionResult execute(GanttDiagram project, Object subject, Object complement) {
|
||||
final Task task = (Task) subject;
|
||||
return project.deleteTask(task);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,57 @@
|
||||
/* ========================================================================
|
||||
* PlantUML : a free UML diagram generator
|
||||
* ========================================================================
|
||||
*
|
||||
* (C) Copyright 2009-2020, Arnaud Roques
|
||||
*
|
||||
* Project Info: http://plantuml.com
|
||||
*
|
||||
* If you like this project or if you find it useful, you can support us at:
|
||||
*
|
||||
* http://plantuml.com/patreon (only 1$ per month!)
|
||||
* http://plantuml.com/paypal
|
||||
*
|
||||
* This file is part of PlantUML.
|
||||
*
|
||||
* PlantUML is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* PlantUML distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
* USA.
|
||||
*
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.project.lang;
|
||||
|
||||
import net.sourceforge.plantuml.command.CommandExecutionResult;
|
||||
import net.sourceforge.plantuml.project.Completion;
|
||||
import net.sourceforge.plantuml.project.GanttDiagram;
|
||||
import net.sourceforge.plantuml.project.core.Task;
|
||||
|
||||
public class SentenceIsForTask extends SentenceSimple {
|
||||
|
||||
public SentenceIsForTask() {
|
||||
super(new SubjectTask(), Verbs.is(), new ComplementCompleted());
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommandExecutionResult execute(GanttDiagram project, Object subject, Object complement) {
|
||||
final Task task = (Task) subject;
|
||||
final Completion completed = (Completion) complement;
|
||||
task.setCompletion(completed.getCompletion());
|
||||
return CommandExecutionResult.ok();
|
||||
}
|
||||
|
||||
}
|
57
src/net/sourceforge/plantuml/project/lang/SentenceLasts.java
Normal file
57
src/net/sourceforge/plantuml/project/lang/SentenceLasts.java
Normal file
@ -0,0 +1,57 @@
|
||||
/* ========================================================================
|
||||
* PlantUML : a free UML diagram generator
|
||||
* ========================================================================
|
||||
*
|
||||
* (C) Copyright 2009-2020, Arnaud Roques
|
||||
*
|
||||
* Project Info: http://plantuml.com
|
||||
*
|
||||
* If you like this project or if you find it useful, you can support us at:
|
||||
*
|
||||
* http://plantuml.com/patreon (only 1$ per month!)
|
||||
* http://plantuml.com/paypal
|
||||
*
|
||||
* This file is part of PlantUML.
|
||||
*
|
||||
* PlantUML is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* PlantUML distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
* USA.
|
||||
*
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.project.lang;
|
||||
|
||||
import net.sourceforge.plantuml.command.CommandExecutionResult;
|
||||
import net.sourceforge.plantuml.project.GanttDiagram;
|
||||
import net.sourceforge.plantuml.project.Load;
|
||||
import net.sourceforge.plantuml.project.core.Task;
|
||||
|
||||
public class SentenceLasts extends SentenceSimple {
|
||||
|
||||
public SentenceLasts() {
|
||||
super(new SubjectTask(), Verbs.lasts(), new ComplementSeveralDays());
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommandExecutionResult execute(GanttDiagram project, Object subject, Object complement) {
|
||||
final Task task = (Task) subject;
|
||||
final Load duration = (Load) complement;
|
||||
task.setLoad(duration);
|
||||
return CommandExecutionResult.ok();
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,57 @@
|
||||
/* ========================================================================
|
||||
* PlantUML : a free UML diagram generator
|
||||
* ========================================================================
|
||||
*
|
||||
* (C) Copyright 2009-2020, Arnaud Roques
|
||||
*
|
||||
* Project Info: http://plantuml.com
|
||||
*
|
||||
* If you like this project or if you find it useful, you can support us at:
|
||||
*
|
||||
* http://plantuml.com/patreon (only 1$ per month!)
|
||||
* http://plantuml.com/paypal
|
||||
*
|
||||
* This file is part of PlantUML.
|
||||
*
|
||||
* PlantUML is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* PlantUML distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
* USA.
|
||||
*
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.project.lang;
|
||||
|
||||
import net.sourceforge.plantuml.Url;
|
||||
import net.sourceforge.plantuml.command.CommandExecutionResult;
|
||||
import net.sourceforge.plantuml.project.GanttDiagram;
|
||||
import net.sourceforge.plantuml.project.core.Task;
|
||||
|
||||
public class SentenceLinksTo extends SentenceSimple {
|
||||
|
||||
public SentenceLinksTo() {
|
||||
super(new SubjectTask(), Verbs.linksTo(), new ComplementUrl());
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommandExecutionResult execute(GanttDiagram project, Object subject, Object complement) {
|
||||
final Task task = (Task) subject;
|
||||
final Url url = (Url) complement;
|
||||
task.setUrl(url);
|
||||
return CommandExecutionResult.ok();
|
||||
}
|
||||
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user