Compare commits
2 Commits
master
...
43769e82ee
| Author | SHA1 | Date | |
|---|---|---|---|
| 43769e82ee | |||
| e742bbd827 |
@@ -38,6 +38,10 @@ public class Selection implements Streamable<Shape> {
|
|||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isEmpty() {
|
||||||
|
return selectedShapes.isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
public List<Shape> getSelectedShapes() {
|
public List<Shape> getSelectedShapes() {
|
||||||
return List.copyOf(selectedShapes);
|
return List.copyOf(selectedShapes);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,9 +34,48 @@ public abstract class AbstractShape implements Shape {
|
|||||||
getBounds().translate(dx, dy);
|
getBounds().translate(dx, dy);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void resize(ResizeHandle handle, int dx, int dy) {
|
||||||
|
Rectangle bounds = getBounds();
|
||||||
|
switch (handle) {
|
||||||
|
case E -> bounds.width += dx;
|
||||||
|
case W -> {
|
||||||
|
bounds.x += dx;
|
||||||
|
bounds.width -= dx;
|
||||||
|
}
|
||||||
|
case S -> bounds.height += dy;
|
||||||
|
case N -> {
|
||||||
|
bounds.y += dy;
|
||||||
|
bounds.height -= dy;
|
||||||
|
}
|
||||||
|
case SE -> {
|
||||||
|
bounds.width += dx;
|
||||||
|
bounds.height += dy;
|
||||||
|
}
|
||||||
|
case SW -> {
|
||||||
|
bounds.x += dx;
|
||||||
|
bounds.width -= dx;
|
||||||
|
bounds.height += dy;
|
||||||
|
}
|
||||||
|
case NE -> {
|
||||||
|
bounds.width += dx;
|
||||||
|
bounds.y += dy;
|
||||||
|
bounds.height -= dy;
|
||||||
|
}
|
||||||
|
case NW -> {
|
||||||
|
bounds.x += dx;
|
||||||
|
bounds.width -= dx;
|
||||||
|
bounds.y += dy;
|
||||||
|
bounds.height -= dy;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (bounds.width < 1) bounds.width = 1;
|
||||||
|
if (bounds.height < 1) bounds.height = 1;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Rectangle getBounds() {
|
public Rectangle getBounds() {
|
||||||
return this.bounds;
|
return new Rectangle(this.bounds);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
24
src/main/java/ovh/gasser/newshapes/shapes/ResizeHandle.java
Normal file
24
src/main/java/ovh/gasser/newshapes/shapes/ResizeHandle.java
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
package ovh.gasser.newshapes.shapes;
|
||||||
|
|
||||||
|
import java.awt.Cursor;
|
||||||
|
|
||||||
|
public enum ResizeHandle {
|
||||||
|
NW(Cursor.NW_RESIZE_CURSOR),
|
||||||
|
N(Cursor.N_RESIZE_CURSOR),
|
||||||
|
NE(Cursor.NE_RESIZE_CURSOR),
|
||||||
|
E(Cursor.E_RESIZE_CURSOR),
|
||||||
|
SE(Cursor.SE_RESIZE_CURSOR),
|
||||||
|
S(Cursor.S_RESIZE_CURSOR),
|
||||||
|
SW(Cursor.SW_RESIZE_CURSOR),
|
||||||
|
W(Cursor.W_RESIZE_CURSOR);
|
||||||
|
|
||||||
|
private final int cursorType;
|
||||||
|
|
||||||
|
ResizeHandle(int cursorType) {
|
||||||
|
this.cursorType = cursorType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getCursorType() {
|
||||||
|
return cursorType;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,7 +8,7 @@ import java.awt.*;
|
|||||||
|
|
||||||
public class SCircle extends AbstractShape {
|
public class SCircle extends AbstractShape {
|
||||||
|
|
||||||
private final int radius;
|
private int radius;
|
||||||
|
|
||||||
private SCircle(int x, int y, int radius) {
|
private SCircle(int x, int y, int radius) {
|
||||||
super(new Rectangle(x, y, radius * 2, radius * 2));
|
super(new Rectangle(x, y, radius * 2, radius * 2));
|
||||||
@@ -20,10 +20,37 @@ public class SCircle extends AbstractShape {
|
|||||||
visitor.visitCircle(this);
|
visitor.visitCircle(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void resize(ResizeHandle handle, int dx, int dy) {
|
||||||
|
Rectangle bounds = getBounds();
|
||||||
|
int newWidth = bounds.width;
|
||||||
|
int newHeight = bounds.height;
|
||||||
|
|
||||||
|
switch (handle) {
|
||||||
|
case E, W -> newWidth += dx;
|
||||||
|
case N, S -> newHeight += dy;
|
||||||
|
case SE, NW -> {
|
||||||
|
newWidth += dx;
|
||||||
|
newHeight += dy;
|
||||||
|
}
|
||||||
|
case NE, SW -> {
|
||||||
|
newWidth += dx;
|
||||||
|
newHeight += dy;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newWidth < 2) newWidth = 2;
|
||||||
|
if (newHeight < 2) newHeight = 2;
|
||||||
|
|
||||||
|
this.radius = Math.max(newWidth, newHeight) / 2;
|
||||||
|
bounds.setSize(this.radius * 2, this.radius * 2);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Shape clone() {
|
public Shape clone() {
|
||||||
var color = (ColorAttributes) getAttributes(ColorAttributes.ID);
|
var color = (ColorAttributes) getAttributes(ColorAttributes.ID);
|
||||||
return SCircle.create(super.getBounds().x, super.getBounds().y, this.radius, color.strokedColor);
|
Color strokeColor = color != null ? color.strokedColor : Color.BLACK;
|
||||||
|
return SCircle.create(super.getBounds().x, super.getBounds().y, this.radius, strokeColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getRadius() {
|
public int getRadius() {
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ public class SCollection extends AbstractShape implements Streamable<Shape> {
|
|||||||
for (Shape s : children) bounds = bounds.union(s.getBounds());
|
for (Shape s : children) bounds = bounds.union(s.getBounds());
|
||||||
return bounds;
|
return bounds;
|
||||||
} catch (IndexOutOfBoundsException e){
|
} catch (IndexOutOfBoundsException e){
|
||||||
logger.error("getBounds(): {e}", e);
|
logger.error("getBounds(): {}", e);
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,7 +27,8 @@ public class SRectangle extends AbstractShape {
|
|||||||
@Override
|
@Override
|
||||||
public Shape clone() {
|
public Shape clone() {
|
||||||
var color = (ColorAttributes) this.getAttributes(ColorAttributes.ID);
|
var color = (ColorAttributes) this.getAttributes(ColorAttributes.ID);
|
||||||
return SRectangle.create(super.getBounds().x, super.getBounds().y, getBounds().width, getBounds().height, color.strokedColor);
|
Color strokeColor = color != null ? color.strokedColor : Color.BLACK;
|
||||||
|
return SRectangle.create(super.getBounds().x, super.getBounds().y, getBounds().width, getBounds().height, strokeColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static SRectangle create(int x, int y, int width, int height) {
|
public static SRectangle create(int x, int y, int width, int height) {
|
||||||
|
|||||||
@@ -16,10 +16,60 @@ public class STriangle extends AbstractShape {
|
|||||||
visitor.visitTriangle(this);
|
visitor.visitTriangle(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void resize(ResizeHandle handle, int dx, int dy) {
|
||||||
|
Rectangle bounds = getBounds();
|
||||||
|
int delta = Math.max(Math.abs(dx), Math.abs(dy));
|
||||||
|
|
||||||
|
boolean shrink = switch (handle) {
|
||||||
|
case SE -> (dx < 0 || dy < 0);
|
||||||
|
case NW -> (dx > 0 || dy > 0);
|
||||||
|
case NE -> (dx < 0);
|
||||||
|
case SW -> (dx > 0);
|
||||||
|
case E, W -> (dx < 0);
|
||||||
|
case N, S -> (dy < 0);
|
||||||
|
default -> false;
|
||||||
|
};
|
||||||
|
|
||||||
|
int sizeChange = shrink ? -delta : delta;
|
||||||
|
|
||||||
|
switch (handle) {
|
||||||
|
case SE, E, W -> {
|
||||||
|
bounds.width += sizeChange;
|
||||||
|
bounds.height += sizeChange;
|
||||||
|
}
|
||||||
|
case NW -> {
|
||||||
|
bounds.x -= sizeChange;
|
||||||
|
bounds.width += sizeChange;
|
||||||
|
bounds.y -= sizeChange;
|
||||||
|
bounds.height += sizeChange;
|
||||||
|
}
|
||||||
|
case NE -> {
|
||||||
|
bounds.y -= sizeChange;
|
||||||
|
bounds.width += sizeChange;
|
||||||
|
bounds.height += sizeChange;
|
||||||
|
}
|
||||||
|
case SW -> {
|
||||||
|
bounds.x -= sizeChange;
|
||||||
|
bounds.width += sizeChange;
|
||||||
|
bounds.height += sizeChange;
|
||||||
|
}
|
||||||
|
case N, S -> {
|
||||||
|
bounds.width += sizeChange;
|
||||||
|
bounds.height += sizeChange;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bounds.width < 1) bounds.width = 1;
|
||||||
|
if (bounds.height < 1) bounds.height = 1;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Shape clone() {
|
public Shape clone() {
|
||||||
var color = (ColorAttributes) getAttributes(ColorAttributes.ID);
|
var color = (ColorAttributes) getAttributes(ColorAttributes.ID);
|
||||||
return STriangle.create(super.getBounds().x, super.getBounds().y, super.getBounds().height, color.strokedColor, color.filledColor);
|
Color strokeColor = color != null ? color.strokedColor : Color.BLACK;
|
||||||
|
Color fillColor = color != null ? color.filledColor : Color.BLACK;
|
||||||
|
return STriangle.create(super.getBounds().x, super.getBounds().y, super.getBounds().height, fillColor, strokeColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static STriangle create(int x, int y, int size, Color filledColor, Color strokedColor) {
|
public static STriangle create(int x, int y, int size, Color filledColor, Color strokedColor) {
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import java.awt.*;
|
|||||||
public interface Shape {
|
public interface Shape {
|
||||||
void accept(ShapeVisitor visitor);
|
void accept(ShapeVisitor visitor);
|
||||||
void translate(int dx, int dy);
|
void translate(int dx, int dy);
|
||||||
|
void resize(ResizeHandle handle, int dx, int dy);
|
||||||
Attributes getAttributes(String key);
|
Attributes getAttributes(String key);
|
||||||
void addAttributes(Attributes attr);
|
void addAttributes(Attributes attr);
|
||||||
Rectangle getBounds();
|
Rectangle getBounds();
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import org.slf4j.LoggerFactory;
|
|||||||
import ovh.gasser.newshapes.HTMLExporter;
|
import ovh.gasser.newshapes.HTMLExporter;
|
||||||
import ovh.gasser.newshapes.Selection;
|
import ovh.gasser.newshapes.Selection;
|
||||||
import ovh.gasser.newshapes.attributes.ColorAttributes;
|
import ovh.gasser.newshapes.attributes.ColorAttributes;
|
||||||
|
import ovh.gasser.newshapes.shapes.ResizeHandle;
|
||||||
import ovh.gasser.newshapes.shapes.SCollection;
|
import ovh.gasser.newshapes.shapes.SCollection;
|
||||||
import ovh.gasser.newshapes.shapes.Shape;
|
import ovh.gasser.newshapes.shapes.Shape;
|
||||||
import ovh.gasser.newshapes.ui.listeners.SelectionListener;
|
import ovh.gasser.newshapes.ui.listeners.SelectionListener;
|
||||||
@@ -24,6 +25,10 @@ public class Controller {
|
|||||||
private final Selection selection;
|
private final Selection selection;
|
||||||
|
|
||||||
private Point lastMousePos;
|
private Point lastMousePos;
|
||||||
|
private boolean resizing;
|
||||||
|
private ResizeHandle activeHandle;
|
||||||
|
private Point resizeOrigin;
|
||||||
|
private boolean resizeMode;
|
||||||
|
|
||||||
Controller(ShapesView view, SCollection model) {
|
Controller(ShapesView view, SCollection model) {
|
||||||
this.view = view;
|
this.view = view;
|
||||||
@@ -40,6 +45,13 @@ public class Controller {
|
|||||||
public void mouseDragged(MouseEvent evt) {
|
public void mouseDragged(MouseEvent evt) {
|
||||||
handleMouseDragged(evt);
|
handleMouseDragged(evt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mouseReleased(MouseEvent evt) {
|
||||||
|
resizing = false;
|
||||||
|
activeHandle = null;
|
||||||
|
resizeOrigin = null;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
this.view.addMouseMotionListener(adapter);
|
this.view.addMouseMotionListener(adapter);
|
||||||
this.view.addMouseListener(adapter);
|
this.view.addMouseListener(adapter);
|
||||||
@@ -52,16 +64,50 @@ public class Controller {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void handleMouseDragged(MouseEvent evt) {
|
private void handleMouseDragged(MouseEvent evt) {
|
||||||
|
if (resizeMode && resizing && activeHandle != null) {
|
||||||
|
int dx = evt.getX() - resizeOrigin.x;
|
||||||
|
int dy = evt.getY() - resizeOrigin.y;
|
||||||
|
for (Shape shape : selection) {
|
||||||
|
shape.resize(activeHandle, dx, dy);
|
||||||
|
}
|
||||||
|
resizeOrigin = evt.getPoint();
|
||||||
|
} else if (resizeMode && !selection.isEmpty()) {
|
||||||
|
lastMousePos = evt.getPoint();
|
||||||
|
ResizeHandle handle = getHandleAt(evt.getPoint());
|
||||||
|
if (handle != null) {
|
||||||
|
resizing = true;
|
||||||
|
activeHandle = handle;
|
||||||
|
resizeOrigin = evt.getPoint();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
resizing = false;
|
||||||
|
activeHandle = null;
|
||||||
int dx = evt.getX() - lastMousePos.x;
|
int dx = evt.getX() - lastMousePos.x;
|
||||||
int dy = evt.getY() - lastMousePos.y;
|
int dy = evt.getY() - lastMousePos.y;
|
||||||
for (Shape shape : selection) {
|
for (Shape shape : selection) {
|
||||||
shape.translate(dx, dy);
|
shape.translate(dx, dy);
|
||||||
}
|
}
|
||||||
lastMousePos = evt.getPoint();
|
lastMousePos = evt.getPoint();
|
||||||
|
}
|
||||||
view.repaint();
|
view.repaint();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void handleMousePressed(MouseEvent evt) {
|
private void handleMousePressed(MouseEvent evt) {
|
||||||
|
resizing = false;
|
||||||
|
activeHandle = null;
|
||||||
|
resizeOrigin = null;
|
||||||
|
|
||||||
|
if (resizeMode && !selection.isEmpty()) {
|
||||||
|
ResizeHandle handle = getHandleAt(evt.getPoint());
|
||||||
|
if (handle != null) {
|
||||||
|
resizing = true;
|
||||||
|
activeHandle = handle;
|
||||||
|
resizeOrigin = evt.getPoint();
|
||||||
|
view.repaint();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
getTarget(evt, this.model)
|
getTarget(evt, this.model)
|
||||||
.ifPresentOrElse(
|
.ifPresentOrElse(
|
||||||
s -> {
|
s -> {
|
||||||
@@ -77,8 +123,28 @@ public class Controller {
|
|||||||
view.repaint();
|
view.repaint();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private ResizeHandle getHandleAt(Point point) {
|
||||||
|
final int handleSize = 5;
|
||||||
|
for (Shape shape : selection) {
|
||||||
|
Rectangle bounds = shape.getBounds();
|
||||||
|
int cx = bounds.x + bounds.width / 2;
|
||||||
|
int cy = bounds.y + bounds.height / 2;
|
||||||
|
|
||||||
|
if (point.x < cx && point.y < cy) return ResizeHandle.NW;
|
||||||
|
if (point.x > cx && point.y < cy) return ResizeHandle.NE;
|
||||||
|
if (point.x < cx && point.y > cy) return ResizeHandle.SW;
|
||||||
|
if (point.x > cx && point.y > cy) return ResizeHandle.SE;
|
||||||
|
if (point.y < cy) return ResizeHandle.N;
|
||||||
|
if (point.y > cy) return ResizeHandle.S;
|
||||||
|
if (point.x < cx) return ResizeHandle.W;
|
||||||
|
if (point.x > cx) return ResizeHandle.E;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
private void handleKeyPressed(KeyEvent evt) {
|
private void handleKeyPressed(KeyEvent evt) {
|
||||||
switch (evt.getKeyCode()) {
|
switch (evt.getKeyCode()) {
|
||||||
|
case KeyEvent.VK_R -> toggleResizeMode();
|
||||||
case KeyEvent.VK_DELETE -> deleteSelected();
|
case KeyEvent.VK_DELETE -> deleteSelected();
|
||||||
case KeyEvent.VK_C -> copySelection();
|
case KeyEvent.VK_C -> copySelection();
|
||||||
case KeyEvent.VK_A -> changeSelectionColor();
|
case KeyEvent.VK_A -> changeSelectionColor();
|
||||||
@@ -87,6 +153,14 @@ public class Controller {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void toggleResizeMode() {
|
||||||
|
if (!selection.isEmpty()) {
|
||||||
|
resizeMode = !resizeMode;
|
||||||
|
view.setResizeMode(resizeMode);
|
||||||
|
view.repaint();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void exportHtml() {
|
private void exportHtml() {
|
||||||
logger.info("Exporting view to html");
|
logger.info("Exporting view to html");
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -13,12 +13,16 @@ public class ShapeDraftman implements ShapeVisitor {
|
|||||||
private static final ColorAttributes DEFAULT_COLOR_ATTRIBUTES =
|
private static final ColorAttributes DEFAULT_COLOR_ATTRIBUTES =
|
||||||
new ColorAttributes(false, true, Color.BLACK, Color.BLACK);
|
new ColorAttributes(false, true, Color.BLACK, Color.BLACK);
|
||||||
private final Graphics2D g2d;
|
private final Graphics2D g2d;
|
||||||
|
private boolean resizeMode;
|
||||||
|
|
||||||
public ShapeDraftman(Graphics graph) {
|
public ShapeDraftman(Graphics graph) {
|
||||||
this.g2d = (Graphics2D) graph;
|
this.g2d = (Graphics2D) graph;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setResizeMode(boolean resizeMode) {
|
||||||
|
this.resizeMode = resizeMode;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitRectangle(SRectangle rect) {
|
public void visitRectangle(SRectangle rect) {
|
||||||
Rectangle r = rect.getBounds();
|
Rectangle r = rect.getBounds();
|
||||||
@@ -56,8 +60,10 @@ public class ShapeDraftman implements ShapeVisitor {
|
|||||||
this.g2d.setColor(colAttrs.filledColor);
|
this.g2d.setColor(colAttrs.filledColor);
|
||||||
this.g2d.fillOval(bounds.x, bounds.y, 2 * circle.getRadius(), 2 * circle.getRadius());
|
this.g2d.fillOval(bounds.x, bounds.y, 2 * circle.getRadius(), 2 * circle.getRadius());
|
||||||
}
|
}
|
||||||
if (colAttrs.stroked) this.g2d.setColor(colAttrs.strokedColor);
|
if (colAttrs.stroked) {
|
||||||
|
this.g2d.setColor(colAttrs.strokedColor);
|
||||||
this.g2d.drawOval(bounds.x, bounds.y, 2 * circle.getRadius(), 2 * circle.getRadius());
|
this.g2d.drawOval(bounds.x, bounds.y, 2 * circle.getRadius(), 2 * circle.getRadius());
|
||||||
|
}
|
||||||
|
|
||||||
drawHandlerIfSelected(circle);
|
drawHandlerIfSelected(circle);
|
||||||
}
|
}
|
||||||
@@ -93,8 +99,17 @@ public class ShapeDraftman implements ShapeVisitor {
|
|||||||
if ((selAttrs != null) && (selAttrs.selected)){
|
if ((selAttrs != null) && (selAttrs.selected)){
|
||||||
Rectangle bounds = s.getBounds();
|
Rectangle bounds = s.getBounds();
|
||||||
this.g2d.setColor(Color.RED);
|
this.g2d.setColor(Color.RED);
|
||||||
this.g2d.drawRect(bounds.x - 5, bounds.y - 5, 5, 5);
|
int handleSize = 5;
|
||||||
this.g2d.drawRect(bounds.x + bounds.width, bounds.y + bounds.height, 5, 5);
|
this.g2d.drawRect(bounds.x - handleSize, bounds.y - handleSize, handleSize, handleSize);
|
||||||
|
this.g2d.drawRect(bounds.x + bounds.width, bounds.y + bounds.height, handleSize, handleSize);
|
||||||
|
if (resizeMode) {
|
||||||
|
this.g2d.drawRect(bounds.x + bounds.width, bounds.y - handleSize, handleSize, handleSize);
|
||||||
|
this.g2d.drawRect(bounds.x - handleSize, bounds.y + bounds.height, handleSize, handleSize);
|
||||||
|
this.g2d.drawRect(bounds.x + bounds.width / 2 - handleSize / 2, bounds.y - handleSize, handleSize, handleSize);
|
||||||
|
this.g2d.drawRect(bounds.x + bounds.width / 2 - handleSize / 2, bounds.y + bounds.height, handleSize, handleSize);
|
||||||
|
this.g2d.drawRect(bounds.x - handleSize, bounds.y + bounds.height / 2 - handleSize / 2, handleSize, handleSize);
|
||||||
|
this.g2d.drawRect(bounds.x + bounds.width, bounds.y + bounds.height / 2 - handleSize / 2, handleSize, handleSize);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ public class ShapesView extends JPanel {
|
|||||||
private final Shape model;
|
private final Shape model;
|
||||||
private final Controller controller;
|
private final Controller controller;
|
||||||
private ShapeVisitor draftman;
|
private ShapeVisitor draftman;
|
||||||
|
private boolean resizeMode;
|
||||||
|
|
||||||
public ShapesView(SCollection model) {
|
public ShapesView(SCollection model) {
|
||||||
this.model = model;
|
this.model = model;
|
||||||
@@ -22,6 +23,7 @@ public class ShapesView extends JPanel {
|
|||||||
protected void paintComponent(Graphics g) {
|
protected void paintComponent(Graphics g) {
|
||||||
super.paintComponent(g);
|
super.paintComponent(g);
|
||||||
this.draftman = new ShapeDraftman(g);
|
this.draftman = new ShapeDraftman(g);
|
||||||
|
((ShapeDraftman) this.draftman).setResizeMode(resizeMode);
|
||||||
model.accept(draftman);
|
model.accept(draftman);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -32,4 +34,8 @@ public class ShapesView extends JPanel {
|
|||||||
public void addSelectionChangeListener(SelectionListener listener) {
|
public void addSelectionChangeListener(SelectionListener listener) {
|
||||||
controller.addSelectionChangeListener(listener);
|
controller.addSelectionChangeListener(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setResizeMode(boolean resizeMode) {
|
||||||
|
this.resizeMode = resizeMode;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user