Import menu items from original project
This commit is contained in:
parent
75bd5997df
commit
5f0bcda8ba
@ -1,15 +1,20 @@
|
|||||||
package ovh.gasser.newshapes;
|
package ovh.gasser.newshapes;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
import ovh.gasser.newshapes.shapes.SCircle;
|
import ovh.gasser.newshapes.shapes.SCircle;
|
||||||
import ovh.gasser.newshapes.shapes.SCollection;
|
import ovh.gasser.newshapes.shapes.SCollection;
|
||||||
import ovh.gasser.newshapes.shapes.SRectangle;
|
import ovh.gasser.newshapes.shapes.SRectangle;
|
||||||
import ovh.gasser.newshapes.ui.ShapesView;
|
import ovh.gasser.newshapes.ui.ShapesView;
|
||||||
|
import ovh.gasser.newshapes.ui.menu.MenuAddListener;
|
||||||
|
import ovh.gasser.newshapes.ui.menu.MenuEditListener;
|
||||||
|
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
|
||||||
public class App {
|
public class App {
|
||||||
|
private final static Logger logger = LoggerFactory.getLogger(App.class);
|
||||||
public static final Dimension WIN_SIZE = new Dimension(800, 600);
|
public static final Dimension WIN_SIZE = new Dimension(800, 600);
|
||||||
private SCollection model;
|
private SCollection model;
|
||||||
|
|
||||||
@ -29,7 +34,7 @@ public class App {
|
|||||||
frame.pack();
|
frame.pack();
|
||||||
frame.setVisible(true);
|
frame.setVisible(true);
|
||||||
|
|
||||||
this.buildMenuBar(frame);
|
this.buildMenuBar(frame, view);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void buildModel() {
|
private void buildModel() {
|
||||||
@ -44,20 +49,68 @@ public class App {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void buildMenuBar(JFrame frame) {
|
private void buildMenuBar(JFrame frame, ShapesView sview) {
|
||||||
var menubar = new JMenuBar();
|
var menubar = new JMenuBar();
|
||||||
|
|
||||||
var helpMenu = new JMenu("Help");
|
// About
|
||||||
var aboutItem = new JMenuItem("About");
|
JMenu helpMenu = new JMenu("Help");
|
||||||
aboutItem.addActionListener(actionEvent -> {
|
JMenuItem aboutItem = new JMenuItem("About");
|
||||||
JOptionPane.showMessageDialog(frame, "New shapes");
|
aboutItem.addActionListener(evt -> JOptionPane.showMessageDialog(frame, "This project was created by Alexandre Colicchio and Thibaud Gasser", "About this project", JOptionPane.INFORMATION_MESSAGE));
|
||||||
});
|
|
||||||
helpMenu.add(aboutItem);
|
helpMenu.add(aboutItem);
|
||||||
|
|
||||||
|
menubar.add(buildFileMenu(sview));
|
||||||
|
menubar.add(buildEditMenu(sview));
|
||||||
menubar.add(helpMenu);
|
menubar.add(helpMenu);
|
||||||
frame.setJMenuBar(menubar);
|
frame.setJMenuBar(menubar);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private JMenu buildFileMenu(ShapesView sview) {
|
||||||
|
JMenu menuFile = new JMenu("File");
|
||||||
|
JMenuItem addRectItem = new JMenuItem("Add SRectangle");
|
||||||
|
JMenuItem addCircleItem = new JMenuItem("Add SCircle");
|
||||||
|
JMenuItem htmlExportItem = new JMenuItem("Export to HTML");
|
||||||
|
JMenuItem exitItem = new JMenuItem("Exit");
|
||||||
|
addRectItem.addActionListener(new MenuAddListener("SRectangle", model, sview));
|
||||||
|
addCircleItem.addActionListener(new MenuAddListener("SCircle", model, sview));
|
||||||
|
htmlExportItem.addActionListener(evt -> {
|
||||||
|
try {
|
||||||
|
new HTMLExporter(model).export();
|
||||||
|
} catch (FileNotFoundException e) {
|
||||||
|
logger.error("Could not export as html: {}", e.getMessage());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
exitItem.addActionListener(evt -> System.exit(0));
|
||||||
|
menuFile.add(addRectItem);
|
||||||
|
menuFile.add(addCircleItem);
|
||||||
|
menuFile.addSeparator();
|
||||||
|
menuFile.add(htmlExportItem);
|
||||||
|
menuFile.add(exitItem);
|
||||||
|
return menuFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
private JMenu buildEditMenu(ShapesView sview) {
|
||||||
|
MenuEditListener editListener = new MenuEditListener(model, sview, sview.getController());
|
||||||
|
JMenu menuEdit = new JMenu("Edit");
|
||||||
|
JMenuItem editColor = new JMenuItem("Change color");
|
||||||
|
JMenuItem editBorderColor = new JMenuItem("Change border color");
|
||||||
|
JMenuItem deleteItem = new JMenuItem("Delete");
|
||||||
|
JCheckBoxMenuItem editFill = new JCheckBoxMenuItem("Fill Shape");
|
||||||
|
JCheckBoxMenuItem editBorder = new JCheckBoxMenuItem("Draw border");
|
||||||
|
editColor.addActionListener(editListener);
|
||||||
|
editBorderColor.addActionListener(editListener);
|
||||||
|
deleteItem.addActionListener(editListener);
|
||||||
|
editFill.addActionListener(editListener);
|
||||||
|
editBorder.addActionListener(editListener);
|
||||||
|
|
||||||
|
menuEdit.add(editColor);
|
||||||
|
menuEdit.add(editBorderColor);
|
||||||
|
menuEdit.add(deleteItem);
|
||||||
|
menuEdit.addSeparator();
|
||||||
|
menuEdit.add(editBorder);
|
||||||
|
menuEdit.add(editFill);
|
||||||
|
return menuEdit;
|
||||||
|
}
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
SwingUtilities.invokeLater(App::new);
|
SwingUtilities.invokeLater(App::new);
|
||||||
}
|
}
|
||||||
|
@ -108,7 +108,7 @@ public class Controller {
|
|||||||
view.repaint();
|
view.repaint();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void deleteSelected() {
|
public void deleteSelected() {
|
||||||
if (selection == null) return;
|
if (selection == null) return;
|
||||||
logger.debug("Deleting selected shape(s)");
|
logger.debug("Deleting selected shape(s)");
|
||||||
this.model.remove(selection.shape);
|
this.model.remove(selection.shape);
|
||||||
|
@ -27,4 +27,8 @@ public class ShapesView extends JPanel {
|
|||||||
this.draftman = new ShapeDraftman(g);
|
this.draftman = new ShapeDraftman(g);
|
||||||
model.accept(draftman);
|
model.accept(draftman);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Controller getController() {
|
||||||
|
return controller;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,50 @@
|
|||||||
|
package ovh.gasser.newshapes.ui.menu;
|
||||||
|
|
||||||
|
import ovh.gasser.newshapes.attributes.ColorAttributes;
|
||||||
|
import ovh.gasser.newshapes.attributes.SelectionAttributes;
|
||||||
|
import ovh.gasser.newshapes.shapes.SCircle;
|
||||||
|
import ovh.gasser.newshapes.shapes.SCollection;
|
||||||
|
import ovh.gasser.newshapes.shapes.SRectangle;
|
||||||
|
import ovh.gasser.newshapes.shapes.Shape;
|
||||||
|
import ovh.gasser.newshapes.ui.ShapesView;
|
||||||
|
|
||||||
|
import java.awt.Color;
|
||||||
|
import java.awt.Point;
|
||||||
|
import java.awt.Rectangle;
|
||||||
|
import java.awt.event.ActionEvent;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
|
|
||||||
|
|
||||||
|
public class MenuAddListener implements ActionListener {
|
||||||
|
private final String shape;
|
||||||
|
private final ShapesView view;
|
||||||
|
private final SCollection model;
|
||||||
|
|
||||||
|
public MenuAddListener(String shape, SCollection model, ShapesView view) {
|
||||||
|
this.shape = shape;
|
||||||
|
this.model = model;
|
||||||
|
this.view = view;
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
Shape s;
|
||||||
|
Rectangle bounds = model.getBounds();
|
||||||
|
// All new shapes will be in the center of the panel.
|
||||||
|
Point loc = new Point((int)bounds.getCenterX(), (int)bounds.getCenterY());
|
||||||
|
|
||||||
|
if (this.shape.equals("SRectangle")){
|
||||||
|
s = SRectangle.create(loc.x, loc.y, 50, 50);
|
||||||
|
} else if (this.shape.equals("SCircle")){
|
||||||
|
s = SCircle.create(loc.x, loc.y, 50);
|
||||||
|
} else return;
|
||||||
|
|
||||||
|
s.addAttributes(new SelectionAttributes());
|
||||||
|
s.addAttributes(new ColorAttributes(true, false, randomColor(), Color.BLACK));
|
||||||
|
model.add(s);
|
||||||
|
view.repaint();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Color randomColor(){
|
||||||
|
return new Color((int)(Math.random() * 0x1000000));
|
||||||
|
}
|
||||||
|
}
|
113
src/main/java/ovh/gasser/newshapes/ui/menu/MenuEditListener.java
Normal file
113
src/main/java/ovh/gasser/newshapes/ui/menu/MenuEditListener.java
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
package ovh.gasser.newshapes.ui.menu;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import ovh.gasser.newshapes.attributes.ColorAttributes;
|
||||||
|
import ovh.gasser.newshapes.attributes.SelectionAttributes;
|
||||||
|
import ovh.gasser.newshapes.shapes.SCollection;
|
||||||
|
import ovh.gasser.newshapes.shapes.Shape;
|
||||||
|
import ovh.gasser.newshapes.ui.Controller;
|
||||||
|
import ovh.gasser.newshapes.ui.ShapesView;
|
||||||
|
|
||||||
|
import java.awt.Color;
|
||||||
|
import java.awt.event.ActionEvent;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
|
|
||||||
|
import javax.swing.JCheckBoxMenuItem;
|
||||||
|
import javax.swing.JColorChooser;
|
||||||
|
|
||||||
|
|
||||||
|
public class MenuEditListener implements ActionListener {
|
||||||
|
private final static Logger logger = LoggerFactory.getLogger(MenuEditListener.class);
|
||||||
|
|
||||||
|
private final SCollection model;
|
||||||
|
private final ShapesView view;
|
||||||
|
private final Controller controller;
|
||||||
|
|
||||||
|
public MenuEditListener(SCollection model, ShapesView view, Controller controller) {
|
||||||
|
this.model = model;
|
||||||
|
this.view = view;
|
||||||
|
this.controller = controller;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
Object source = e.getSource();
|
||||||
|
if (source instanceof JCheckBoxMenuItem item) {
|
||||||
|
if (item.getText().equals("Draw border")) setBorder(item.isSelected());
|
||||||
|
if (item.getText().equals("Fill Shape")) setShapeFilled(item.getState());
|
||||||
|
} else {
|
||||||
|
switch (e.getActionCommand()) {
|
||||||
|
case "Change color" -> {
|
||||||
|
Color newColor = JColorChooser.showDialog(null, "Choose a color", Color.RED);
|
||||||
|
changeColor(newColor);
|
||||||
|
}
|
||||||
|
case "Change border color" -> {
|
||||||
|
Color newColor = JColorChooser.showDialog(null, "Choose a color", Color.RED);
|
||||||
|
changeBorderColor(newColor);
|
||||||
|
}
|
||||||
|
case "Delete" -> this.controller.deleteSelected();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
view.repaint();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void changeColor(Color filledColor) {
|
||||||
|
for (Shape s : model) {
|
||||||
|
SelectionAttributes selAttrs = (SelectionAttributes) s.getAttributes(SelectionAttributes.ID);
|
||||||
|
if ((selAttrs == null) || (! selAttrs.selected)) continue;
|
||||||
|
ColorAttributes currentColAttrs = (ColorAttributes) s.getAttributes(ColorAttributes.ID);
|
||||||
|
if (currentColAttrs == null) {
|
||||||
|
logger.warn("No color attributes: {}", s);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
s.addAttributes(new ColorAttributes(true, currentColAttrs.stroked, filledColor, currentColAttrs.strokedColor));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void changeBorderColor(Color strockedColor) {
|
||||||
|
for (Shape s : model) {
|
||||||
|
SelectionAttributes selAttrs = (SelectionAttributes) s.getAttributes(SelectionAttributes.ID);
|
||||||
|
if ((selAttrs == null) || (! selAttrs.selected)) continue;
|
||||||
|
ColorAttributes currentColAttrs = (ColorAttributes) s.getAttributes(ColorAttributes.ID);
|
||||||
|
if (currentColAttrs == null) {
|
||||||
|
logger.warn("No color attributes: {}", s);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
s.addAttributes(new ColorAttributes(currentColAttrs.filled, true, currentColAttrs.filledColor, strockedColor));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Change the state of the border of all selected shapes.
|
||||||
|
*/
|
||||||
|
private void setBorder(boolean state){
|
||||||
|
for (Shape s : model) {
|
||||||
|
SelectionAttributes selAttrs = (SelectionAttributes) s.getAttributes(SelectionAttributes.ID);
|
||||||
|
if ((selAttrs == null) || (!selAttrs.selected)) continue;
|
||||||
|
ColorAttributes colAttrs = (ColorAttributes) s.getAttributes(ColorAttributes.ID);
|
||||||
|
if (colAttrs == null) {
|
||||||
|
logger.warn("No color attributes: {}", s);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
s.addAttributes(new ColorAttributes(colAttrs.filled, state, colAttrs.filledColor, colAttrs.strokedColor));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Change the filled state for all selected shapes.
|
||||||
|
*/
|
||||||
|
private void setShapeFilled(boolean state){
|
||||||
|
logger.info("setShapeFilled(" + state + ")");
|
||||||
|
for (Shape s : model) {
|
||||||
|
SelectionAttributes selAttrs = (SelectionAttributes) s.getAttributes(SelectionAttributes.ID);
|
||||||
|
if ((selAttrs == null) || (!selAttrs.selected)) continue;
|
||||||
|
ColorAttributes colAttrs = (ColorAttributes) s.getAttributes(ColorAttributes.ID);
|
||||||
|
if (colAttrs == null) {
|
||||||
|
logger.warn("No color attributes: {}", s);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
s.addAttributes(new ColorAttributes(state, colAttrs.stroked, colAttrs.filledColor, colAttrs.strokedColor));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user