diff --git a/diylc/diylc-library/src/org/diylc/components/boards/AbstractBoard.java b/diylc/diylc-library/src/org/diylc/components/boards/AbstractBoard.java
index 7888b22e..56906bfc 100644
--- a/diylc/diylc-library/src/org/diylc/components/boards/AbstractBoard.java
+++ b/diylc/diylc-library/src/org/diylc/components/boards/AbstractBoard.java
@@ -19,8 +19,8 @@
along with DIYLC. If not, see .
*/
-package org.diylc.components.boards;
-
+package org.diylc.components.boards;
+
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Composite;
@@ -38,132 +38,167 @@ import org.diylc.core.VisibilityPolicy;
import org.diylc.core.annotations.EditableProperty;
import org.diylc.core.measures.Size;
import org.diylc.core.measures.SizeUnit;
-
-public abstract class AbstractBoard extends AbstractTransparentComponent {
-
- private static final long serialVersionUID = 1L;
-
- public static Color BOARD_COLOR = Color.decode("#F8EBB3");
- public static Color BORDER_COLOR = BOARD_COLOR.darker();
- public static Color COORDINATE_COLOR = Color.gray.brighter();
- public static float COORDINATE_FONT_SIZE = 9f;
- public static Size DEFAULT_WIDTH = new Size(1.5d, SizeUnit.in);
- public static Size DEFAULT_HEIGHT = new Size(1.2d, SizeUnit.in);
-
- protected String value = "";
- protected Point[] controlPoints = new Point[] {new Point(0, 0),
- new Point((int) DEFAULT_WIDTH.convertToPixels(), (int) DEFAULT_HEIGHT.convertToPixels())};
- protected Point firstPoint = new Point();
- protected Point secondPoint = new Point();
-
- protected Color boardColor = BOARD_COLOR;
- protected Color borderColor = BORDER_COLOR;
- protected Color coordinateColor = COORDINATE_COLOR;
+
+public abstract class AbstractBoard extends AbstractTransparentComponent {
+
+ private static final long serialVersionUID = 1L;
+
+ public static Color BOARD_COLOR = Color.decode("#F8EBB3");
+ public static Color BORDER_COLOR = BOARD_COLOR.darker();
+ public static Color COORDINATE_COLOR = Color.gray.brighter();
+ public static float COORDINATE_FONT_SIZE = 9f;
+ public static Size DEFAULT_WIDTH = new Size(1.5d, SizeUnit.in);
+ public static Size DEFAULT_HEIGHT = new Size(1.2d, SizeUnit.in);
+
+ protected String value = "";
+ protected Point[] controlPoints = new Point[] {new Point(0, 0),
+ new Point((int) DEFAULT_WIDTH.convertToPixels(), (int) DEFAULT_HEIGHT.convertToPixels())};
+ protected Point firstPoint = new Point();
+ protected Point secondPoint = new Point();
+
+ protected Color boardColor = BOARD_COLOR;
+ protected Color borderColor = BORDER_COLOR;
+ protected Color coordinateColor = COORDINATE_COLOR;
protected Boolean drawCoordinates = null;
protected CoordinateType xType = CoordinateType.Numbers;
+ protected CoordinateOrigin coordinateOrigin = CoordinateOrigin.Top_Left;
protected CoordinateDisplay coordinateDisplay = CoordinateDisplay.One_Side;
- protected CoordinateType yType = CoordinateType.Letters;
-
- @Override
- public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode, Project project,
- IDrawingObserver drawingObserver) {
- g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1));
-
+ protected CoordinateType yType = CoordinateType.Letters;
+
+ @Override
+ public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode, Project project,
+ IDrawingObserver drawingObserver) {
+ g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1));
+
Composite oldComposite = g2d.getComposite();
// render as transparent when dragging
- int alpha = componentState == ComponentState.DRAGGING ? 0 : this.alpha;
- if (alpha < MAX_ALPHA) {
- g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f * alpha / MAX_ALPHA));
- }
- g2d.setColor(boardColor);
- g2d.fillRect(firstPoint.x, firstPoint.y, secondPoint.x - firstPoint.x, secondPoint.y - firstPoint.y);
- g2d.setComposite(oldComposite);
-
- // Do not track any changes that follow because the whole board has been
- // tracked so far.
- drawingObserver.stopTracking();
- g2d.setColor(componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR
- : borderColor);
- g2d.drawRect(firstPoint.x, firstPoint.y, secondPoint.x - firstPoint.x, secondPoint.y - firstPoint.y);
- }
-
- protected void drawCoordinates(Graphics2D g2d, int spacing, Project project) {
- g2d.setColor(coordinateColor);
- g2d.setFont(project.getFont().deriveFont(COORDINATE_FONT_SIZE));
+ int alpha = componentState == ComponentState.DRAGGING ? 0 : this.alpha;
+ if (alpha < MAX_ALPHA) {
+ g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f * alpha / MAX_ALPHA));
+ }
+ g2d.setColor(boardColor);
+ g2d.fillRect(firstPoint.x, firstPoint.y, secondPoint.x - firstPoint.x, secondPoint.y - firstPoint.y);
+ g2d.setComposite(oldComposite);
+
+ // Do not track any changes that follow because the whole board has been
+ // tracked so far.
+ drawingObserver.stopTracking();
+ g2d.setColor(componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR
+ : borderColor);
+ g2d.drawRect(firstPoint.x, firstPoint.y, secondPoint.x - firstPoint.x, secondPoint.y - firstPoint.y);
+ }
+
+ protected void drawCoordinates(Graphics2D g2d, int spacing, Project project) {
+ g2d.setColor(coordinateColor);
+ g2d.setFont(project.getFont().deriveFont(COORDINATE_FONT_SIZE));
+
+ // The half space is used to do rounding when calculating the range.
+ int halfSpace = spacing / 2;
+ CoordinateOrigin origin = getCoordinateOrigin();
+
+ if (getCoordinateDisplay() != CoordinateDisplay.None) {
+ int range;
+ int yOffset;
+ CoordinateType yType = getyType();
+ Point drawPoint = new Point(firstPoint);
+
+ if (origin == CoordinateOrigin.Top_Left || origin == CoordinateOrigin.Top_Right) {
+ range = (int) ((secondPoint.y - firstPoint.y + halfSpace) / spacing);
+ yOffset = spacing;
+ } else {
+ range = (int) ((secondPoint.y - firstPoint.y + halfSpace) / spacing);
+ yOffset = -spacing;
+ drawPoint.y = secondPoint.y;
+ }
+
+ for (int c = 1; c < range; c++) {
+ int xOffset = (yType == CoordinateType.Numbers && c >= 10) || (yType == CoordinateType.Letters && c >= 27) ? 0 : 2;
+ String label = yType == CoordinateType.Letters ? getCoordinateLabel(c) : Integer.toString(c);
+
+ drawPoint.y += yOffset;
+ drawCenteredText(g2d, label,
+ firstPoint.x + xOffset, drawPoint.y,
+ HorizontalAlignment.LEFT, VerticalAlignment.CENTER);
+ if (getCoordinateDisplay() == CoordinateDisplay.Both_Sides) {
+ drawCenteredText(g2d, label,
+ secondPoint.x - xOffset, drawPoint.y,
+ HorizontalAlignment.RIGHT, VerticalAlignment.CENTER);
+ }
+ }
+ }
if (getCoordinateDisplay() != CoordinateDisplay.None) {
- Point p = new Point(firstPoint);
- int t = 1;
- while (p.y < secondPoint.y - spacing) {
- p.y += spacing;
- int offset = (getyType() == CoordinateType.Numbers && t >= 10) || (getyType() == CoordinateType.Letters && t >= 27) ? 0 : 2;
- drawCenteredText(g2d, getyType() == CoordinateType.Letters ? getCoordinateLabel(t) : Integer.toString(t), p.x + offset, p.y, HorizontalAlignment.LEFT,
- VerticalAlignment.CENTER);
- if (getCoordinateDisplay() == CoordinateDisplay.Both_Sides) {
- drawCenteredText(g2d, getyType() == CoordinateType.Letters ? getCoordinateLabel(t) : Integer.toString(t), secondPoint.x - offset, p.y, HorizontalAlignment.RIGHT,
- VerticalAlignment.CENTER);
- }
- t++;
+ int range;
+ int xOffset;
+ CoordinateType xType = getxType();
+ Point drawPoint = new Point(firstPoint);
+
+ if (origin == CoordinateOrigin.Top_Left || origin == CoordinateOrigin.Bottom_Left) {
+ range = (int) ((secondPoint.x - firstPoint.x + halfSpace) / spacing);
+ xOffset = spacing;
+ } else {
+ range = (int) ((secondPoint.x - firstPoint.x + halfSpace) / spacing);
+ xOffset = -spacing;
+ drawPoint.x = secondPoint.x;
}
- }
+
+ for (int c = 1; c < range; c++) {
+ String label = xType == CoordinateType.Letters ? getCoordinateLabel(c) : Integer.toString(c);
+
+ drawPoint.x += xOffset;
+ drawCenteredText(g2d, label,
+ drawPoint.x, firstPoint.y - 2,
+ HorizontalAlignment.CENTER, VerticalAlignment.TOP);
+ if (getCoordinateDisplay() == CoordinateDisplay.Both_Sides) {
+ drawCenteredText(g2d, label,
+ drawPoint.x, (int) (secondPoint.y - COORDINATE_FONT_SIZE),
+ HorizontalAlignment.CENTER, VerticalAlignment.BOTTOM);
+ }
+ }
+ }
+ }
- if (getCoordinateDisplay() != CoordinateDisplay.None) {
- Point p = new Point(firstPoint);
- int t = 1;
- while (p.x < secondPoint.x - spacing) {
- p.x += spacing;
- drawCenteredText(g2d, getxType() == CoordinateType.Letters ? getCoordinateLabel(t) : Integer.toString(t), p.x, p.y - 2, HorizontalAlignment.CENTER,
- VerticalAlignment.TOP);
- if (getCoordinateDisplay() == CoordinateDisplay.Both_Sides) {
- drawCenteredText(g2d, getxType() == CoordinateType.Letters ? getCoordinateLabel(t) : Integer.toString(t), p.x, (int) (secondPoint.y - COORDINATE_FONT_SIZE), HorizontalAlignment.CENTER,
- VerticalAlignment.BOTTOM);
- }
- t++;
+ private String getCoordinateLabel(int coordinate) {
+ String result = "";
+ while (coordinate > 0) {
+ int digit = coordinate % 26;
+ coordinate /= 26;
+ if (digit == 0) {
+ result = 'Z' + result;
+ coordinate--;
+ } else {
+ result = (char) ((int) 'A' + digit - 1) + result;
}
- }
- }
-
- private String getCoordinateLabel(int coordinate) {
- String result = "";
- while (coordinate > 0) {
- int digit = coordinate % 26;
- coordinate /= 26;
- if (digit == 0) {
- result = 'Z' + result;
- coordinate--;
- } else {
- result = (char) ((int) 'A' + digit - 1) + result;
- }
- }
- return result;
- }
-
- @EditableProperty(name = "Color")
- public Color getBoardColor() {
- return boardColor;
- }
-
- public void setBoardColor(Color boardColor) {
- this.boardColor = boardColor;
- }
-
- @EditableProperty(name = "Coordinate Color")
- public Color getCoordinateColor() {
- // Null protection for older files
- return coordinateColor == null ? COORDINATE_COLOR : coordinateColor;
- }
-
- public void setCoordinateColor(Color coordinateColor) {
- this.coordinateColor = coordinateColor;
- }
-
- @EditableProperty(name = "Border")
- public Color getBorderColor() {
- return borderColor;
- }
-
- public void setBorderColor(Color borderColor) {
- this.borderColor = borderColor;
+ }
+ return result;
+ }
+
+ @EditableProperty(name = "Color")
+ public Color getBoardColor() {
+ return boardColor;
+ }
+
+ public void setBoardColor(Color boardColor) {
+ this.boardColor = boardColor;
+ }
+
+ @EditableProperty(name = "Coordinate Color")
+ public Color getCoordinateColor() {
+ // Null protection for older files
+ return coordinateColor == null ? COORDINATE_COLOR : coordinateColor;
+ }
+
+ public void setCoordinateColor(Color coordinateColor) {
+ this.coordinateColor = coordinateColor;
+ }
+
+ @EditableProperty(name = "Border")
+ public Color getBorderColor() {
+ return borderColor;
+ }
+
+ public void setBorderColor(Color borderColor) {
+ this.borderColor = borderColor;
}
@EditableProperty(name = "X")
@@ -188,6 +223,17 @@ public abstract class AbstractBoard extends AbstractTransparentComponent
this.coordinateDisplay = coordinateDisplay;
}
+ @EditableProperty(name = "Coordinate Origin")
+ public CoordinateOrigin getCoordinateOrigin() {
+ if (coordinateOrigin == null)
+ coordinateOrigin = CoordinateOrigin.Top_Left;
+ return coordinateOrigin;
+ }
+
+ public void setCoordinateOrigin(CoordinateOrigin coordinateOrigin) {
+ this.coordinateOrigin = coordinateOrigin;
+ }
+
@EditableProperty(name = "Y")
public CoordinateType getyType() {
if (yType == null)
@@ -197,46 +243,46 @@ public abstract class AbstractBoard extends AbstractTransparentComponent
public void setyType(CoordinateType yType) {
this.yType = yType;
- }
-
- @Override
- public int getControlPointCount() {
- return controlPoints.length;
- }
-
- @Override
- public Point getControlPoint(int index) {
- return controlPoints[index];
- }
-
- @Override
- public boolean isControlPointSticky(int index) {
- return false;
- }
-
- @Override
- public VisibilityPolicy getControlPointVisibilityPolicy(int index) {
- return VisibilityPolicy.WHEN_SELECTED;
- }
-
- @Override
- public void setControlPoint(Point point, int index) {
- controlPoints[index].setLocation(point);
- firstPoint.setLocation(Math.min(controlPoints[0].x, controlPoints[1].x),
- Math.min(controlPoints[0].y, controlPoints[1].y));
- secondPoint.setLocation(Math.max(controlPoints[0].x, controlPoints[1].x),
- Math.max(controlPoints[0].y, controlPoints[1].y));
- }
-
- @EditableProperty
- @Override
- public String getValue() {
- return value;
- }
-
- @Override
- public void setValue(String value) {
- this.value = value;
+ }
+
+ @Override
+ public int getControlPointCount() {
+ return controlPoints.length;
+ }
+
+ @Override
+ public Point getControlPoint(int index) {
+ return controlPoints[index];
+ }
+
+ @Override
+ public boolean isControlPointSticky(int index) {
+ return false;
+ }
+
+ @Override
+ public VisibilityPolicy getControlPointVisibilityPolicy(int index) {
+ return VisibilityPolicy.WHEN_SELECTED;
+ }
+
+ @Override
+ public void setControlPoint(Point point, int index) {
+ controlPoints[index].setLocation(point);
+ firstPoint.setLocation(Math.min(controlPoints[0].x, controlPoints[1].x),
+ Math.min(controlPoints[0].y, controlPoints[1].y));
+ secondPoint.setLocation(Math.max(controlPoints[0].x, controlPoints[1].x),
+ Math.max(controlPoints[0].y, controlPoints[1].y));
+ }
+
+ @EditableProperty
+ @Override
+ public String getValue() {
+ return value;
+ }
+
+ @Override
+ public void setValue(String value) {
+ this.value = value;
}
public static enum CoordinateType {
@@ -250,5 +296,14 @@ public abstract class AbstractBoard extends AbstractTransparentComponent
public String toString() {
return super.toString().replace('_', ' ');
};
- }
-}
+ }
+
+ public static enum CoordinateOrigin {
+ Top_Left, Top_Right, Bottom_Right, Bottom_Left;
+
+ @Override
+ public String toString() {
+ return super.toString().replace('_', ' ');
+ };
+ }
+}