Cleaned up singleton actions, updated instructions, etc.
This commit is contained in:
parent
0be31c84ac
commit
1019654e76
2
pom.xml
2
pom.xml
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
<groupId>nl.andrewlalis</groupId>
|
<groupId>nl.andrewlalis</groupId>
|
||||||
<artifactId>EntityRelationMappingEditor</artifactId>
|
<artifactId>EntityRelationMappingEditor</artifactId>
|
||||||
<version>1.6.1</version>
|
<version>1.6.2</version>
|
||||||
<build>
|
<build>
|
||||||
<plugins>
|
<plugins>
|
||||||
<plugin>
|
<plugin>
|
||||||
|
|
|
@ -1,41 +0,0 @@
|
||||||
package nl.andrewlalis.erme.control.actions;
|
|
||||||
|
|
||||||
import lombok.Setter;
|
|
||||||
import nl.andrewlalis.erme.EntityRelationMappingEditor;
|
|
||||||
import nl.andrewlalis.erme.view.DiagramPanel;
|
|
||||||
|
|
||||||
import javax.swing.*;
|
|
||||||
import java.awt.*;
|
|
||||||
import java.awt.event.ActionEvent;
|
|
||||||
|
|
||||||
public class AboutAction extends AbstractAction {
|
|
||||||
private static AboutAction instance;
|
|
||||||
|
|
||||||
public static AboutAction getInstance() {
|
|
||||||
if (instance == null) instance = new AboutAction();
|
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Setter
|
|
||||||
private DiagramPanel diagramPanel;
|
|
||||||
|
|
||||||
public AboutAction() {
|
|
||||||
super("About");
|
|
||||||
this.putValue(SHORT_DESCRIPTION, "Show some information about this program.");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void actionPerformed(ActionEvent e) {
|
|
||||||
JOptionPane.showMessageDialog(
|
|
||||||
this.diagramPanel,
|
|
||||||
"Entity-Relation Mapping Editor\n" +
|
|
||||||
"by Andrew Lalis\n" +
|
|
||||||
"Version " + EntityRelationMappingEditor.VERSION + "\n" +
|
|
||||||
"To report bugs or make suggestions, please visit the GitHub\n" +
|
|
||||||
"repository for this application and create a new issue.\n\n" +
|
|
||||||
"Thank you for using the ERME!",
|
|
||||||
"About ERME",
|
|
||||||
JOptionPane.INFORMATION_MESSAGE
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,7 +1,5 @@
|
||||||
package nl.andrewlalis.erme.control.actions;
|
package nl.andrewlalis.erme.control.actions;
|
||||||
|
|
||||||
import lombok.Setter;
|
|
||||||
import nl.andrewlalis.erme.model.MappingModel;
|
|
||||||
import nl.andrewlalis.erme.model.Relation;
|
import nl.andrewlalis.erme.model.Relation;
|
||||||
import nl.andrewlalis.erme.view.DiagramPanel;
|
import nl.andrewlalis.erme.view.DiagramPanel;
|
||||||
import nl.andrewlalis.erme.view.OrderableListPanel;
|
import nl.andrewlalis.erme.view.OrderableListPanel;
|
||||||
|
@ -17,31 +15,20 @@ import java.util.concurrent.atomic.AtomicInteger;
|
||||||
* A class that implements an AutoPositionAction. This automatically (vertically) positions all relations in the model
|
* A class that implements an AutoPositionAction. This automatically (vertically) positions all relations in the model
|
||||||
* based either on alphabetic ordering (by name) or an order that's set by the user
|
* based either on alphabetic ordering (by name) or an order that's set by the user
|
||||||
*/
|
*/
|
||||||
public class AutoPositionAction extends AbstractAction {
|
public class AutoPositionAction extends DiagramPanelAction {
|
||||||
private final static int MARGIN = 10;
|
private final static int MARGIN = 10;
|
||||||
private final static int PADDING = 10;
|
private final static int PADDING = 10;
|
||||||
private static AutoPositionAction instance;
|
|
||||||
@Setter
|
|
||||||
private DiagramPanel diagramPanel;
|
|
||||||
@Setter
|
|
||||||
private MappingModel model;
|
|
||||||
public AutoPositionAction() {
|
|
||||||
super("Align Relations");
|
|
||||||
this.putValue(SHORT_DESCRIPTION, "Automatically Align Relations");
|
|
||||||
}
|
|
||||||
|
|
||||||
public static AutoPositionAction getInstance() {
|
public AutoPositionAction(DiagramPanel diagramPanel) {
|
||||||
if (instance == null) {
|
super("Align Relations", diagramPanel);
|
||||||
instance = new AutoPositionAction();
|
this.putValue(SHORT_DESCRIPTION, "Automatically Align Relations");
|
||||||
}
|
|
||||||
return instance;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent actionEvent) {
|
public void actionPerformed(ActionEvent actionEvent) {
|
||||||
if (model.getRelations().size() == 0) {
|
if (getDiagramPanel().getModel().getRelations().size() == 0) {
|
||||||
JOptionPane.showMessageDialog(
|
JOptionPane.showMessageDialog(
|
||||||
this.diagramPanel,
|
getDiagramPanel(),
|
||||||
"Cannot position all relations when there are no relations present",
|
"Cannot position all relations when there are no relations present",
|
||||||
"Relations Required",
|
"Relations Required",
|
||||||
JOptionPane.WARNING_MESSAGE
|
JOptionPane.WARNING_MESSAGE
|
||||||
|
@ -50,7 +37,7 @@ public class AutoPositionAction extends AbstractAction {
|
||||||
}
|
}
|
||||||
String[] choices = new String[]{"Alphabeticaly", "Custom Order"};
|
String[] choices = new String[]{"Alphabeticaly", "Custom Order"};
|
||||||
String choice = (String) JOptionPane.showInputDialog(
|
String choice = (String) JOptionPane.showInputDialog(
|
||||||
this.diagramPanel,
|
getDiagramPanel(),
|
||||||
"Select how to sort the relations",
|
"Select how to sort the relations",
|
||||||
"Position Relations",
|
"Position Relations",
|
||||||
JOptionPane.PLAIN_MESSAGE,
|
JOptionPane.PLAIN_MESSAGE,
|
||||||
|
@ -62,14 +49,14 @@ public class AutoPositionAction extends AbstractAction {
|
||||||
positionRelations(getAlphabeticRelationList());
|
positionRelations(getAlphabeticRelationList());
|
||||||
} else if (choice.equals(choices[1])) {
|
} else if (choice.equals(choices[1])) {
|
||||||
JOptionPane.showConfirmDialog(
|
JOptionPane.showConfirmDialog(
|
||||||
this.diagramPanel,
|
getDiagramPanel(),
|
||||||
OrderableListPanel.getInstance(),
|
OrderableListPanel.getInstance(),
|
||||||
"teststring",
|
"teststring",
|
||||||
JOptionPane.OK_CANCEL_OPTION,
|
JOptionPane.OK_CANCEL_OPTION,
|
||||||
JOptionPane.PLAIN_MESSAGE);
|
JOptionPane.PLAIN_MESSAGE);
|
||||||
this.positionRelations(OrderableListPanel.getInstance().getOrderList());
|
this.positionRelations(OrderableListPanel.getInstance().getOrderList());
|
||||||
}
|
}
|
||||||
diagramPanel.repaint();
|
getDiagramPanel().repaint();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -80,23 +67,20 @@ public class AutoPositionAction extends AbstractAction {
|
||||||
if (orderList.isEmpty()) return;
|
if (orderList.isEmpty()) return;
|
||||||
AtomicInteger vertSpace = new AtomicInteger(0);
|
AtomicInteger vertSpace = new AtomicInteger(0);
|
||||||
orderList.forEach(r -> {
|
orderList.forEach(r -> {
|
||||||
int height = (int) r.getViewModel().getBounds(diagramPanel.getGraphics2D()).getHeight();
|
int height = (int) r.getViewModel().getBounds(getDiagramPanel().getGraphics2D()).getHeight();
|
||||||
vertSpace.set(Math.max(vertSpace.get(), height));
|
vertSpace.set(Math.max(vertSpace.get(), height));
|
||||||
});
|
});
|
||||||
vertSpace.addAndGet(PADDING);
|
vertSpace.addAndGet(PADDING);
|
||||||
AtomicInteger vertPos = new AtomicInteger(MARGIN);
|
AtomicInteger vertPos = new AtomicInteger(MARGIN);
|
||||||
orderList.forEach(r -> {
|
orderList.forEach(r -> r.setPosition(new Point(MARGIN, vertPos.getAndAdd(vertSpace.get()))));
|
||||||
r.setPosition(new Point(MARGIN, vertPos.getAndAdd(vertSpace.get())));
|
getDiagramPanel().centerModel();
|
||||||
});
|
|
||||||
|
|
||||||
diagramPanel.centerModel();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates an orderList by grabbing all relations and sorting them
|
* Creates an orderList by grabbing all relations and sorting them
|
||||||
*/
|
*/
|
||||||
private ArrayList<Relation> getAlphabeticRelationList() {
|
private ArrayList<Relation> getAlphabeticRelationList() {
|
||||||
ArrayList<Relation> relationList = new ArrayList<>(model.getRelations());
|
ArrayList<Relation> relationList = new ArrayList<>(getDiagramPanel().getModel().getRelations());
|
||||||
Collections.sort(relationList);
|
Collections.sort(relationList);
|
||||||
return relationList;
|
return relationList;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
package nl.andrewlalis.erme.control.actions;
|
||||||
|
|
||||||
|
import lombok.AccessLevel;
|
||||||
|
import lombok.Getter;
|
||||||
|
import nl.andrewlalis.erme.view.DiagramPanel;
|
||||||
|
|
||||||
|
import javax.swing.*;
|
||||||
|
|
||||||
|
public abstract class DiagramPanelAction extends AbstractAction {
|
||||||
|
@Getter(AccessLevel.PROTECTED)
|
||||||
|
private final DiagramPanel diagramPanel;
|
||||||
|
|
||||||
|
public DiagramPanelAction(String name, DiagramPanel diagramPanel) {
|
||||||
|
super(name);
|
||||||
|
this.diagramPanel = diagramPanel;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,29 +1,15 @@
|
||||||
package nl.andrewlalis.erme.control.actions;
|
package nl.andrewlalis.erme.control.actions;
|
||||||
|
|
||||||
import lombok.Setter;
|
|
||||||
import nl.andrewlalis.erme.view.DiagramPanel;
|
import nl.andrewlalis.erme.view.DiagramPanel;
|
||||||
|
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
import java.awt.*;
|
|
||||||
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionEvent;
|
||||||
import java.awt.event.InputEvent;
|
import java.awt.event.InputEvent;
|
||||||
import java.awt.event.KeyEvent;
|
import java.awt.event.KeyEvent;
|
||||||
|
|
||||||
public class ExitAction extends AbstractAction {
|
public class ExitAction extends DiagramPanelAction {
|
||||||
private static ExitAction instance;
|
public ExitAction(DiagramPanel diagramPanel) {
|
||||||
|
super("Exit", diagramPanel);
|
||||||
public static ExitAction getInstance() {
|
|
||||||
if (instance == null) {
|
|
||||||
instance = new ExitAction();
|
|
||||||
}
|
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Setter
|
|
||||||
private DiagramPanel diagramPanel;
|
|
||||||
|
|
||||||
public ExitAction() {
|
|
||||||
super("Exit");
|
|
||||||
this.putValue(Action.SHORT_DESCRIPTION, "Exit the program.");
|
this.putValue(Action.SHORT_DESCRIPTION, "Exit the program.");
|
||||||
this.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_Q, InputEvent.SHIFT_DOWN_MASK | InputEvent.CTRL_DOWN_MASK));
|
this.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_Q, InputEvent.SHIFT_DOWN_MASK | InputEvent.CTRL_DOWN_MASK));
|
||||||
}
|
}
|
||||||
|
@ -31,7 +17,7 @@ public class ExitAction extends AbstractAction {
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
int choice = JOptionPane.showConfirmDialog(
|
int choice = JOptionPane.showConfirmDialog(
|
||||||
this.diagramPanel,
|
getDiagramPanel(),
|
||||||
"Are you sure you want to quit?\nAll unsaved data will be lost.",
|
"Are you sure you want to quit?\nAll unsaved data will be lost.",
|
||||||
"Confirm Exit",
|
"Confirm Exit",
|
||||||
JOptionPane.OK_CANCEL_OPTION,
|
JOptionPane.OK_CANCEL_OPTION,
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
package nl.andrewlalis.erme.control.actions;
|
package nl.andrewlalis.erme.control.actions;
|
||||||
|
|
||||||
import lombok.Setter;
|
|
||||||
import nl.andrewlalis.erme.model.MappingModel;
|
import nl.andrewlalis.erme.model.MappingModel;
|
||||||
import nl.andrewlalis.erme.model.Relation;
|
import nl.andrewlalis.erme.model.Relation;
|
||||||
import nl.andrewlalis.erme.view.DiagramPanel;
|
import nl.andrewlalis.erme.view.DiagramPanel;
|
||||||
|
@ -20,33 +19,21 @@ import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.prefs.Preferences;
|
import java.util.prefs.Preferences;
|
||||||
|
|
||||||
public class ExportToImageAction extends AbstractAction {
|
public class ExportToImageAction extends DiagramPanelAction {
|
||||||
private static final String LAST_EXPORT_LOCATION_KEY = "lastExportLocation";
|
private static final String LAST_EXPORT_LOCATION_KEY = "lastExportLocation";
|
||||||
|
|
||||||
private static ExportToImageAction instance;
|
public ExportToImageAction(DiagramPanel diagramPanel) {
|
||||||
public static ExportToImageAction getInstance() {
|
super("Export to Image", diagramPanel);
|
||||||
if (instance == null) {
|
|
||||||
instance = new ExportToImageAction();
|
|
||||||
}
|
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Setter
|
|
||||||
private MappingModel model;
|
|
||||||
@Setter
|
|
||||||
private DiagramPanel diagramPanel;
|
|
||||||
|
|
||||||
public ExportToImageAction() {
|
|
||||||
super("Export to Image");
|
|
||||||
this.putValue(Action.SHORT_DESCRIPTION, "Export the current diagram to an image.");
|
this.putValue(Action.SHORT_DESCRIPTION, "Export the current diagram to an image.");
|
||||||
this.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_E, InputEvent.CTRL_DOWN_MASK));
|
this.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_E, InputEvent.CTRL_DOWN_MASK));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
if (this.model.getRelations().isEmpty()) {
|
DiagramPanel dp = getDiagramPanel();
|
||||||
|
if (dp.getModel().getRelations().isEmpty()) {
|
||||||
JOptionPane.showMessageDialog(
|
JOptionPane.showMessageDialog(
|
||||||
this.diagramPanel,
|
dp,
|
||||||
"Model is empty. Add some relations before exporting to an image.",
|
"Model is empty. Add some relations before exporting to an image.",
|
||||||
"Model Empty",
|
"Model Empty",
|
||||||
JOptionPane.WARNING_MESSAGE
|
JOptionPane.WARNING_MESSAGE
|
||||||
|
@ -62,11 +49,11 @@ public class ExportToImageAction extends AbstractAction {
|
||||||
if (path != null) {
|
if (path != null) {
|
||||||
fileChooser.setSelectedFile(new File(path));
|
fileChooser.setSelectedFile(new File(path));
|
||||||
}
|
}
|
||||||
int choice = fileChooser.showSaveDialog(this.diagramPanel);
|
int choice = fileChooser.showSaveDialog(dp);
|
||||||
if (choice == JFileChooser.APPROVE_OPTION) {
|
if (choice == JFileChooser.APPROVE_OPTION) {
|
||||||
File chosenFile = fileChooser.getSelectedFile();
|
File chosenFile = fileChooser.getSelectedFile();
|
||||||
if (chosenFile == null || chosenFile.isDirectory()) {
|
if (chosenFile == null || chosenFile.isDirectory()) {
|
||||||
JOptionPane.showMessageDialog(fileChooser, "The selected file cannot be written to.", "Invalid File", JOptionPane.WARNING_MESSAGE);
|
JOptionPane.showMessageDialog(dp, "The selected file cannot be written to.", "Invalid File", JOptionPane.WARNING_MESSAGE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int i = chosenFile.getName().lastIndexOf('.');
|
int i = chosenFile.getName().lastIndexOf('.');
|
||||||
|
@ -76,13 +63,13 @@ public class ExportToImageAction extends AbstractAction {
|
||||||
} else {
|
} else {
|
||||||
chosenFile = new File(chosenFile.getParent(), chosenFile.getName() + '.' + extension);
|
chosenFile = new File(chosenFile.getParent(), chosenFile.getName() + '.' + extension);
|
||||||
}
|
}
|
||||||
String input = JOptionPane.showInputDialog(this.diagramPanel, "Choose a scale for the image.", "3.0");
|
String input = JOptionPane.showInputDialog(dp, "Choose a scale for the image.", "3.0");
|
||||||
float scale;
|
float scale;
|
||||||
try {
|
try {
|
||||||
scale = Float.parseFloat(input);
|
scale = Float.parseFloat(input);
|
||||||
if (scale <= 0.0f || scale > 64.0f) throw new IllegalArgumentException();
|
if (scale <= 0.0f || scale > 64.0f) throw new IllegalArgumentException();
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
JOptionPane.showMessageDialog(this.diagramPanel, "Invalid scale value. Should be a positive number less than 64.", "Invalid Scale", JOptionPane.WARNING_MESSAGE);
|
JOptionPane.showMessageDialog(dp, "Invalid scale value. Should be a positive number less than 64.", "Invalid Scale", JOptionPane.WARNING_MESSAGE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
|
@ -92,7 +79,7 @@ public class ExportToImageAction extends AbstractAction {
|
||||||
ImageIO.write(render, extension, chosenFile);
|
ImageIO.write(render, extension, chosenFile);
|
||||||
prefs.put(LAST_EXPORT_LOCATION_KEY, chosenFile.getAbsolutePath());
|
prefs.put(LAST_EXPORT_LOCATION_KEY, chosenFile.getAbsolutePath());
|
||||||
JOptionPane.showMessageDialog(
|
JOptionPane.showMessageDialog(
|
||||||
this.diagramPanel,
|
dp,
|
||||||
"Image export completed in " + String.format("%.4f", durationSeconds) + " seconds.\n" +
|
"Image export completed in " + String.format("%.4f", durationSeconds) + " seconds.\n" +
|
||||||
"Resolution: " + render.getWidth() + "x" + render.getHeight(),
|
"Resolution: " + render.getWidth() + "x" + render.getHeight(),
|
||||||
"Image Export Complete",
|
"Image Export Complete",
|
||||||
|
@ -111,11 +98,12 @@ public class ExportToImageAction extends AbstractAction {
|
||||||
* @return The image which was rendered.
|
* @return The image which was rendered.
|
||||||
*/
|
*/
|
||||||
private BufferedImage renderModel(float scale) {
|
private BufferedImage renderModel(float scale) {
|
||||||
|
MappingModel model = getDiagramPanel().getModel();
|
||||||
// Prepare a tiny sample image that we can use to determine the bounds of the model in a graphics context.
|
// Prepare a tiny sample image that we can use to determine the bounds of the model in a graphics context.
|
||||||
BufferedImage bufferedImage = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB);
|
BufferedImage bufferedImage = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB);
|
||||||
Graphics2D g2d = bufferedImage.createGraphics();
|
Graphics2D g2d = bufferedImage.createGraphics();
|
||||||
DiagramPanel.prepareGraphics(g2d);
|
DiagramPanel.prepareGraphics(g2d);
|
||||||
final Rectangle bounds = this.model.getViewModel().getBounds(g2d);
|
final Rectangle bounds = model.getViewModel().getBounds(g2d);
|
||||||
bounds.width *= scale;
|
bounds.width *= scale;
|
||||||
bounds.height *= scale;
|
bounds.height *= scale;
|
||||||
|
|
||||||
|
@ -134,13 +122,13 @@ public class ExportToImageAction extends AbstractAction {
|
||||||
DiagramPanel.prepareGraphics(g2d);
|
DiagramPanel.prepareGraphics(g2d);
|
||||||
|
|
||||||
// Render the model.
|
// Render the model.
|
||||||
boolean lolcat = LolcatAction.getInstance().isLolcatEnabled(); // save previous lolcat mode
|
boolean lolcat = model.isLolcatEnabled(); // save previous lolcat mode
|
||||||
LolcatAction.getInstance().setLolcatEnabled(false);
|
model.setLolcatEnabled(false);
|
||||||
List<Relation> selectedRelations = this.model.getSelectedRelations();
|
List<Relation> selectedRelations = model.getSelectedRelations();
|
||||||
this.model.getSelectedRelations().forEach(r -> r.setSelected(false));
|
model.getSelectedRelations().forEach(r -> r.setSelected(false));
|
||||||
new MappingModelViewModel(this.model).draw(g2d);
|
new MappingModelViewModel(model).draw(g2d);
|
||||||
this.model.getRelations().forEach(r -> r.setSelected(selectedRelations.contains(r)));
|
model.getRelations().forEach(r -> r.setSelected(selectedRelations.contains(r)));
|
||||||
LolcatAction.getInstance().setLolcatEnabled(lolcat); // revert previous lolcat mode
|
model.setLolcatEnabled(lolcat); // revert previous lolcat mode
|
||||||
|
|
||||||
// Revert to the normal image space, and render a watermark.
|
// Revert to the normal image space, and render a watermark.
|
||||||
g2d.setTransform(originalTransform);
|
g2d.setTransform(originalTransform);
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
package nl.andrewlalis.erme.control.actions;
|
package nl.andrewlalis.erme.control.actions;
|
||||||
|
|
||||||
import lombok.Setter;
|
|
||||||
import nl.andrewlalis.erme.view.DiagramPanel;
|
import nl.andrewlalis.erme.view.DiagramPanel;
|
||||||
|
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
|
@ -16,27 +15,24 @@ import java.net.URISyntaxException;
|
||||||
/**
|
/**
|
||||||
* An action which, when performed, opens a view that displays an HTML document.
|
* An action which, when performed, opens a view that displays an HTML document.
|
||||||
*/
|
*/
|
||||||
public abstract class HtmlDocumentViewerAction extends AbstractAction {
|
public abstract class HtmlDocumentViewerAction extends DiagramPanelAction {
|
||||||
private final String resourceFileName;
|
private final String resourceFileName;
|
||||||
private final Dialog.ModalityType modalityType;
|
private final Dialog.ModalityType modalityType;
|
||||||
|
|
||||||
public HtmlDocumentViewerAction(String name, String resourceFileName) {
|
public HtmlDocumentViewerAction(String name, String resourceFileName, DiagramPanel diagramPanel) {
|
||||||
this(name, resourceFileName, Dialog.ModalityType.APPLICATION_MODAL);
|
this(name, resourceFileName, Dialog.ModalityType.APPLICATION_MODAL, diagramPanel);
|
||||||
}
|
}
|
||||||
|
|
||||||
public HtmlDocumentViewerAction(String name, String resourceFileName, Dialog.ModalityType modalityType) {
|
public HtmlDocumentViewerAction(String name, String resourceFileName, Dialog.ModalityType modalityType, DiagramPanel diagramPanel) {
|
||||||
super(name);
|
super(name, diagramPanel);
|
||||||
this.resourceFileName = resourceFileName;
|
this.resourceFileName = resourceFileName;
|
||||||
this.modalityType = modalityType;
|
this.modalityType = modalityType;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Setter
|
|
||||||
private DiagramPanel diagramPanel;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
JDialog dialog = new JDialog(
|
JDialog dialog = new JDialog(
|
||||||
SwingUtilities.getWindowAncestor(this.diagramPanel),
|
SwingUtilities.getWindowAncestor(getDiagramPanel()),
|
||||||
(String) this.getValue(NAME),
|
(String) this.getValue(NAME),
|
||||||
this.modalityType
|
this.modalityType
|
||||||
);
|
);
|
||||||
|
@ -63,7 +59,7 @@ public abstract class HtmlDocumentViewerAction extends AbstractAction {
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
JOptionPane.showMessageDialog(
|
JOptionPane.showMessageDialog(
|
||||||
this.diagramPanel,
|
getDiagramPanel(),
|
||||||
"An error occured:\n" + ex.getMessage(),
|
"An error occured:\n" + ex.getMessage(),
|
||||||
"Error",
|
"Error",
|
||||||
JOptionPane.ERROR_MESSAGE
|
JOptionPane.ERROR_MESSAGE
|
||||||
|
@ -77,7 +73,7 @@ public abstract class HtmlDocumentViewerAction extends AbstractAction {
|
||||||
dialog.setMaximumSize(new Dimension(600, 800));
|
dialog.setMaximumSize(new Dimension(600, 800));
|
||||||
dialog.setPreferredSize(new Dimension(600, 800));
|
dialog.setPreferredSize(new Dimension(600, 800));
|
||||||
dialog.pack();
|
dialog.pack();
|
||||||
dialog.setLocationRelativeTo(this.diagramPanel);
|
dialog.setLocationRelativeTo(getDiagramPanel());
|
||||||
dialog.setVisible(true);
|
dialog.setVisible(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,15 +1,10 @@
|
||||||
package nl.andrewlalis.erme.control.actions;
|
package nl.andrewlalis.erme.control.actions;
|
||||||
|
|
||||||
|
import nl.andrewlalis.erme.view.DiagramPanel;
|
||||||
|
|
||||||
public class InstructionsAction extends HtmlDocumentViewerAction {
|
public class InstructionsAction extends HtmlDocumentViewerAction {
|
||||||
private static InstructionsAction instance;
|
public InstructionsAction(DiagramPanel diagramPanel) {
|
||||||
|
super("Instructions", "html/instructions.html", diagramPanel);
|
||||||
public static InstructionsAction getInstance() {
|
|
||||||
if (instance == null) instance = new InstructionsAction();
|
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
public InstructionsAction() {
|
|
||||||
super("Instructions", "html/instructions.html");
|
|
||||||
this.putValue(SHORT_DESCRIPTION, "Instructions for how to use this program.");
|
this.putValue(SHORT_DESCRIPTION, "Instructions for how to use this program.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,6 @@ import com.fasterxml.jackson.databind.MapperFeature;
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import com.fasterxml.jackson.databind.json.JsonMapper;
|
import com.fasterxml.jackson.databind.json.JsonMapper;
|
||||||
import com.fasterxml.jackson.databind.node.ObjectNode;
|
import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||||
import lombok.Setter;
|
|
||||||
import nl.andrewlalis.erme.model.MappingModel;
|
import nl.andrewlalis.erme.model.MappingModel;
|
||||||
import nl.andrewlalis.erme.view.DiagramPanel;
|
import nl.andrewlalis.erme.view.DiagramPanel;
|
||||||
|
|
||||||
|
@ -19,22 +18,11 @@ import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.util.prefs.Preferences;
|
import java.util.prefs.Preferences;
|
||||||
|
|
||||||
public class LoadAction extends AbstractAction {
|
public class LoadAction extends DiagramPanelAction {
|
||||||
private static final String LAST_LOAD_LOCATION_KEY = "lastLoadLocation";
|
private static final String LAST_LOAD_LOCATION_KEY = "lastLoadLocation";
|
||||||
|
|
||||||
private static LoadAction instance;
|
public LoadAction(DiagramPanel diagramPanel) {
|
||||||
public static LoadAction getInstance() {
|
super("Load", diagramPanel);
|
||||||
if (instance == null) {
|
|
||||||
instance = new LoadAction();
|
|
||||||
}
|
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Setter
|
|
||||||
private DiagramPanel diagramPanel;
|
|
||||||
|
|
||||||
public LoadAction() {
|
|
||||||
super("Load");
|
|
||||||
this.putValue(SHORT_DESCRIPTION, "Load a saved diagram.");
|
this.putValue(SHORT_DESCRIPTION, "Load a saved diagram.");
|
||||||
this.putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_DOWN_MASK));
|
this.putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_DOWN_MASK));
|
||||||
}
|
}
|
||||||
|
@ -52,7 +40,7 @@ public class LoadAction extends AbstractAction {
|
||||||
if (path != null) {
|
if (path != null) {
|
||||||
fileChooser.setSelectedFile(new File(path));
|
fileChooser.setSelectedFile(new File(path));
|
||||||
}
|
}
|
||||||
int choice = fileChooser.showOpenDialog(this.diagramPanel);
|
int choice = fileChooser.showOpenDialog(getDiagramPanel());
|
||||||
if (choice == JFileChooser.APPROVE_OPTION) {
|
if (choice == JFileChooser.APPROVE_OPTION) {
|
||||||
File chosenFile = fileChooser.getSelectedFile();
|
File chosenFile = fileChooser.getSelectedFile();
|
||||||
if (chosenFile == null || chosenFile.isDirectory() || !chosenFile.exists() || !chosenFile.canRead()) {
|
if (chosenFile == null || chosenFile.isDirectory() || !chosenFile.exists() || !chosenFile.canRead()) {
|
||||||
|
@ -65,7 +53,7 @@ public class LoadAction extends AbstractAction {
|
||||||
.configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, true)
|
.configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, true)
|
||||||
.build();
|
.build();
|
||||||
JsonNode data = mapper.readValue(fis, JsonNode.class);
|
JsonNode data = mapper.readValue(fis, JsonNode.class);
|
||||||
this.diagramPanel.setModel(MappingModel.fromJson((ObjectNode) data));
|
getDiagramPanel().setModel(MappingModel.fromJson((ObjectNode) data));
|
||||||
prefs.put(LAST_LOAD_LOCATION_KEY, chosenFile.getAbsolutePath());
|
prefs.put(LAST_LOAD_LOCATION_KEY, chosenFile.getAbsolutePath());
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
|
|
|
@ -1,28 +1,14 @@
|
||||||
package nl.andrewlalis.erme.control.actions;
|
package nl.andrewlalis.erme.control.actions;
|
||||||
|
|
||||||
import lombok.Setter;
|
|
||||||
import nl.andrewlalis.erme.model.*;
|
import nl.andrewlalis.erme.model.*;
|
||||||
import nl.andrewlalis.erme.view.DiagramPanel;
|
import nl.andrewlalis.erme.view.DiagramPanel;
|
||||||
|
|
||||||
import javax.swing.*;
|
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionEvent;
|
||||||
|
|
||||||
public class LoadSampleModelAction extends AbstractAction {
|
public class LoadSampleModelAction extends DiagramPanelAction {
|
||||||
private static LoadSampleModelAction instance;
|
public LoadSampleModelAction(DiagramPanel diagramPanel) {
|
||||||
|
super("Load Sample Model", diagramPanel);
|
||||||
public static LoadSampleModelAction getInstance() {
|
|
||||||
if (instance == null) {
|
|
||||||
instance = new LoadSampleModelAction();
|
|
||||||
}
|
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Setter
|
|
||||||
private DiagramPanel diagramPanel;
|
|
||||||
|
|
||||||
public LoadSampleModelAction() {
|
|
||||||
super("Load Sample Model");
|
|
||||||
this.putValue(SHORT_DESCRIPTION, "Loads a sample ER-mapping model.");
|
this.putValue(SHORT_DESCRIPTION, "Loads a sample ER-mapping model.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,6 +24,6 @@ public class LoadSampleModelAction extends AbstractAction {
|
||||||
r1.addAttribute(new Attribute(r1, AttributeType.PLAIN, "purchasedAt"));
|
r1.addAttribute(new Attribute(r1, AttributeType.PLAIN, "purchasedAt"));
|
||||||
r1.addAttribute(new ForeignKeyAttribute(r1, AttributeType.PLAIN, "typeName", "AirplaneType", "name"));
|
r1.addAttribute(new ForeignKeyAttribute(r1, AttributeType.PLAIN, "typeName", "AirplaneType", "name"));
|
||||||
model.addRelation(r1);
|
model.addRelation(r1);
|
||||||
this.diagramPanel.setModel(model);
|
getDiagramPanel().setModel(model);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,26 +0,0 @@
|
||||||
package nl.andrewlalis.erme.control.actions;
|
|
||||||
|
|
||||||
import lombok.Getter;
|
|
||||||
import lombok.Setter;
|
|
||||||
|
|
||||||
import javax.swing.*;
|
|
||||||
import java.awt.*;
|
|
||||||
|
|
||||||
public abstract class LocalAction extends AbstractAction {
|
|
||||||
@Setter
|
|
||||||
@Getter
|
|
||||||
private Point location;
|
|
||||||
|
|
||||||
public LocalAction(String name, Point location) {
|
|
||||||
super(name);
|
|
||||||
this.location = location;
|
|
||||||
}
|
|
||||||
|
|
||||||
public LocalAction(String name) {
|
|
||||||
this(name, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean hasLocation() {
|
|
||||||
return this.location != null;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,37 +1,20 @@
|
||||||
package nl.andrewlalis.erme.control.actions;
|
package nl.andrewlalis.erme.control.actions;
|
||||||
|
|
||||||
import lombok.Getter;
|
|
||||||
import lombok.Setter;
|
|
||||||
import nl.andrewlalis.erme.view.DiagramPanel;
|
import nl.andrewlalis.erme.view.DiagramPanel;
|
||||||
|
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionEvent;
|
||||||
|
|
||||||
public class LolcatAction extends AbstractAction {
|
public class LolcatAction extends DiagramPanelAction {
|
||||||
private static LolcatAction instance;
|
public LolcatAction(DiagramPanel diagramPanel) {
|
||||||
|
super("Toggle Lolcat Mode", diagramPanel);
|
||||||
@Getter
|
|
||||||
@Setter
|
|
||||||
private boolean lolcatEnabled = false;
|
|
||||||
|
|
||||||
public static LolcatAction getInstance() {
|
|
||||||
if (instance == null) {
|
|
||||||
instance = new LolcatAction();
|
|
||||||
}
|
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Setter
|
|
||||||
private DiagramPanel diagramPanel;
|
|
||||||
|
|
||||||
public LolcatAction() {
|
|
||||||
super("Toggle Lolcat Mode");
|
|
||||||
this.putValue(SHORT_DESCRIPTION, "Does some wacky color stuff.");
|
this.putValue(SHORT_DESCRIPTION, "Does some wacky color stuff.");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent actionEvent) {
|
public void actionPerformed(ActionEvent actionEvent) {
|
||||||
lolcatEnabled = ((AbstractButton)actionEvent.getSource()).getModel().isSelected();
|
boolean lolcatEnabled = ((AbstractButton)actionEvent.getSource()).getModel().isSelected();
|
||||||
diagramPanel.repaint();
|
getDiagramPanel().getModel().setLolcatEnabled(lolcatEnabled);
|
||||||
|
getDiagramPanel().repaint();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,19 +1,12 @@
|
||||||
package nl.andrewlalis.erme.control.actions;
|
package nl.andrewlalis.erme.control.actions;
|
||||||
|
|
||||||
|
import nl.andrewlalis.erme.view.DiagramPanel;
|
||||||
|
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
|
|
||||||
public class MappingAlgorithmHelpAction extends HtmlDocumentViewerAction {
|
public class MappingAlgorithmHelpAction extends HtmlDocumentViewerAction {
|
||||||
private static MappingAlgorithmHelpAction instance;
|
public MappingAlgorithmHelpAction(DiagramPanel diagramPanel) {
|
||||||
|
super("Mapping Algorithm Help", "html/er_mapping_algorithm.html", Dialog.ModalityType.DOCUMENT_MODAL, diagramPanel);
|
||||||
public static MappingAlgorithmHelpAction getInstance() {
|
|
||||||
if (instance == null) {
|
|
||||||
instance = new MappingAlgorithmHelpAction();
|
|
||||||
}
|
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
public MappingAlgorithmHelpAction() {
|
|
||||||
super("Mapping Algorithm Help", "html/er_mapping_algorithm.html", Dialog.ModalityType.DOCUMENT_MODAL);
|
|
||||||
this.putValue(SHORT_DESCRIPTION, "Shows a quick guide on how to map from an ER model to a schema.");
|
this.putValue(SHORT_DESCRIPTION, "Shows a quick guide on how to map from an ER model to a schema.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
package nl.andrewlalis.erme.control.actions;
|
package nl.andrewlalis.erme.control.actions;
|
||||||
|
|
||||||
import lombok.Setter;
|
|
||||||
import nl.andrewlalis.erme.model.MappingModel;
|
import nl.andrewlalis.erme.model.MappingModel;
|
||||||
import nl.andrewlalis.erme.view.DiagramPanel;
|
import nl.andrewlalis.erme.view.DiagramPanel;
|
||||||
|
|
||||||
|
@ -9,27 +8,15 @@ import java.awt.event.ActionEvent;
|
||||||
import java.awt.event.InputEvent;
|
import java.awt.event.InputEvent;
|
||||||
import java.awt.event.KeyEvent;
|
import java.awt.event.KeyEvent;
|
||||||
|
|
||||||
public class NewModelAction extends AbstractAction {
|
public class NewModelAction extends DiagramPanelAction {
|
||||||
private static NewModelAction instance;
|
public NewModelAction(DiagramPanel diagramPanel) {
|
||||||
|
super("New Model", diagramPanel);
|
||||||
public static NewModelAction getInstance() {
|
|
||||||
if (instance == null) {
|
|
||||||
instance = new NewModelAction();
|
|
||||||
}
|
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Setter
|
|
||||||
private DiagramPanel diagramPanel;
|
|
||||||
|
|
||||||
public NewModelAction() {
|
|
||||||
super("New Model");
|
|
||||||
this.putValue(SHORT_DESCRIPTION, "Create a new model.");
|
this.putValue(SHORT_DESCRIPTION, "Create a new model.");
|
||||||
this.putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_N, InputEvent.CTRL_DOWN_MASK));
|
this.putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_N, InputEvent.CTRL_DOWN_MASK));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
this.diagramPanel.setModel(new MappingModel());
|
getDiagramPanel().setModel(new MappingModel());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,8 +4,6 @@ import com.fasterxml.jackson.databind.MapperFeature;
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import com.fasterxml.jackson.databind.SerializationFeature;
|
import com.fasterxml.jackson.databind.SerializationFeature;
|
||||||
import com.fasterxml.jackson.databind.json.JsonMapper;
|
import com.fasterxml.jackson.databind.json.JsonMapper;
|
||||||
import lombok.Setter;
|
|
||||||
import nl.andrewlalis.erme.model.MappingModel;
|
|
||||||
import nl.andrewlalis.erme.view.DiagramPanel;
|
import nl.andrewlalis.erme.view.DiagramPanel;
|
||||||
|
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
|
@ -18,25 +16,11 @@ import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.prefs.Preferences;
|
import java.util.prefs.Preferences;
|
||||||
|
|
||||||
public class SaveAction extends AbstractAction {
|
public class SaveAction extends DiagramPanelAction {
|
||||||
private static final String LAST_SAVE_LOCATION_KEY = "lastSaveLocation";
|
private static final String LAST_SAVE_LOCATION_KEY = "lastSaveLocation";
|
||||||
|
|
||||||
private static SaveAction instance;
|
public SaveAction(DiagramPanel diagramPanel) {
|
||||||
public static SaveAction getInstance() {
|
super("Save", diagramPanel);
|
||||||
if (instance == null) {
|
|
||||||
instance = new SaveAction();
|
|
||||||
}
|
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Setter
|
|
||||||
private MappingModel model;
|
|
||||||
|
|
||||||
@Setter
|
|
||||||
private DiagramPanel diagramPanel;
|
|
||||||
|
|
||||||
public SaveAction() {
|
|
||||||
super("Save");
|
|
||||||
this.putValue(SHORT_DESCRIPTION, "Save the current diagram to a file.");
|
this.putValue(SHORT_DESCRIPTION, "Save the current diagram to a file.");
|
||||||
this.putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_DOWN_MASK));
|
this.putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_DOWN_MASK));
|
||||||
}
|
}
|
||||||
|
@ -54,17 +38,18 @@ public class SaveAction extends AbstractAction {
|
||||||
if (path != null) {
|
if (path != null) {
|
||||||
fileChooser.setSelectedFile(new File(path));
|
fileChooser.setSelectedFile(new File(path));
|
||||||
}
|
}
|
||||||
int choice = fileChooser.showSaveDialog(this.diagramPanel);
|
DiagramPanel dp = getDiagramPanel();
|
||||||
|
int choice = fileChooser.showSaveDialog(dp);
|
||||||
if (choice == JFileChooser.APPROVE_OPTION) {
|
if (choice == JFileChooser.APPROVE_OPTION) {
|
||||||
File chosenFile = fileChooser.getSelectedFile();
|
File chosenFile = fileChooser.getSelectedFile();
|
||||||
if (chosenFile == null || chosenFile.isDirectory()) {
|
if (chosenFile == null || chosenFile.isDirectory()) {
|
||||||
JOptionPane.showMessageDialog(this.diagramPanel, "The selected file cannot be written to.", "Invalid File", JOptionPane.WARNING_MESSAGE);
|
JOptionPane.showMessageDialog(dp, "The selected file cannot be written to.", "Invalid File", JOptionPane.WARNING_MESSAGE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!chosenFile.exists() && !chosenFile.getName().endsWith(".json")) {
|
if (!chosenFile.exists() && !chosenFile.getName().endsWith(".json")) {
|
||||||
chosenFile = new File(chosenFile.getParent(), chosenFile.getName() + ".json");
|
chosenFile = new File(chosenFile.getParent(), chosenFile.getName() + ".json");
|
||||||
} else if (chosenFile.exists()) {
|
} else if (chosenFile.exists()) {
|
||||||
int result = JOptionPane.showConfirmDialog(this.diagramPanel, "Are you sure you want overwrite this file?", "Overwrite", JOptionPane.YES_NO_OPTION);
|
int result = JOptionPane.showConfirmDialog(dp, "Are you sure you want overwrite this file?", "Overwrite", JOptionPane.YES_NO_OPTION);
|
||||||
if (result == JOptionPane.NO_OPTION) {
|
if (result == JOptionPane.NO_OPTION) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -74,12 +59,12 @@ public class SaveAction extends AbstractAction {
|
||||||
.configure(SerializationFeature.INDENT_OUTPUT, true)
|
.configure(SerializationFeature.INDENT_OUTPUT, true)
|
||||||
.configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, true)
|
.configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, true)
|
||||||
.build();
|
.build();
|
||||||
mapper.writeValue(fos, this.model.toJson(mapper));
|
mapper.writeValue(fos, dp.getModel().toJson(mapper));
|
||||||
prefs.put(LAST_SAVE_LOCATION_KEY, chosenFile.getAbsolutePath());
|
prefs.put(LAST_SAVE_LOCATION_KEY, chosenFile.getAbsolutePath());
|
||||||
JOptionPane.showMessageDialog(fileChooser, "File saved successfully.", "Success", JOptionPane.INFORMATION_MESSAGE);
|
JOptionPane.showMessageDialog(dp, "File saved successfully.", "Success", JOptionPane.INFORMATION_MESSAGE);
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
JOptionPane.showMessageDialog(fileChooser, "An error occurred and the file could not be saved:\n" + ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
|
JOptionPane.showMessageDialog(dp, "An error occurred and the file could not be saved:\n" + ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,37 +1,19 @@
|
||||||
package nl.andrewlalis.erme.control.actions;
|
package nl.andrewlalis.erme.control.actions;
|
||||||
|
|
||||||
import lombok.Getter;
|
|
||||||
import lombok.Setter;
|
|
||||||
import nl.andrewlalis.erme.view.DiagramPanel;
|
import nl.andrewlalis.erme.view.DiagramPanel;
|
||||||
|
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionEvent;
|
||||||
|
|
||||||
public class VisualizeReferencesAction extends AbstractAction {
|
public class VisualizeReferencesAction extends DiagramPanelAction {
|
||||||
private static VisualizeReferencesAction instance;
|
public VisualizeReferencesAction(DiagramPanel diagramPanel) {
|
||||||
|
super("Toggle Reference Visualization", diagramPanel);
|
||||||
public static VisualizeReferencesAction getInstance() {
|
|
||||||
if (instance == null) {
|
|
||||||
instance = new VisualizeReferencesAction();
|
|
||||||
}
|
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
@Setter
|
|
||||||
private boolean referenceVisualizationEnabled = false;
|
|
||||||
|
|
||||||
@Setter
|
|
||||||
private DiagramPanel diagramPanel;
|
|
||||||
|
|
||||||
public VisualizeReferencesAction() {
|
|
||||||
super("Toggle Reference Visualization");
|
|
||||||
this.putValue(SHORT_DESCRIPTION, "Shows/hides visualization of the references between attributes.");
|
this.putValue(SHORT_DESCRIPTION, "Shows/hides visualization of the references between attributes.");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
referenceVisualizationEnabled = ((AbstractButton)e.getSource()).getModel().isSelected();
|
getDiagramPanel().getModel().setReferenceVisualizationEnabled(((AbstractButton)e.getSource()).getModel().isSelected());
|
||||||
diagramPanel.repaint();
|
getDiagramPanel().repaint();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
package nl.andrewlalis.erme.control.actions.edits;
|
package nl.andrewlalis.erme.control.actions.edits;
|
||||||
|
|
||||||
import lombok.Setter;
|
import nl.andrewlalis.erme.control.actions.DiagramPanelAction;
|
||||||
import nl.andrewlalis.erme.model.*;
|
import nl.andrewlalis.erme.model.*;
|
||||||
import nl.andrewlalis.erme.view.DiagramPanel;
|
import nl.andrewlalis.erme.view.DiagramPanel;
|
||||||
|
|
||||||
|
@ -10,36 +10,23 @@ import java.awt.event.ActionEvent;
|
||||||
import java.awt.event.InputEvent;
|
import java.awt.event.InputEvent;
|
||||||
import java.awt.event.KeyEvent;
|
import java.awt.event.KeyEvent;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
public class AddAttributeAction extends AbstractAction {
|
public class AddAttributeAction extends DiagramPanelAction {
|
||||||
private static AddAttributeAction instance;
|
public AddAttributeAction(DiagramPanel diagramPanel) {
|
||||||
|
super("Add Attribute", diagramPanel);
|
||||||
public static AddAttributeAction getInstance() {
|
|
||||||
if (instance == null) {
|
|
||||||
instance = new AddAttributeAction();
|
|
||||||
}
|
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Setter
|
|
||||||
private MappingModel model;
|
|
||||||
@Setter
|
|
||||||
private DiagramPanel diagramPanel;
|
|
||||||
|
|
||||||
public AddAttributeAction() {
|
|
||||||
super("Add Attribute");
|
|
||||||
this.putValue(SHORT_DESCRIPTION, "Add an attribute to the selected relation.");
|
this.putValue(SHORT_DESCRIPTION, "Add an attribute to the selected relation.");
|
||||||
this.putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_T, InputEvent.CTRL_DOWN_MASK));
|
this.putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_T, InputEvent.CTRL_DOWN_MASK));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
List<Relation> selectedRelations = this.model.getSelectedRelations();
|
DiagramPanel dp = getDiagramPanel();
|
||||||
|
MappingModel model = dp.getModel();
|
||||||
|
List<Relation> selectedRelations = model.getSelectedRelations();
|
||||||
if (selectedRelations.size() != 1) {
|
if (selectedRelations.size() != 1) {
|
||||||
JOptionPane.showMessageDialog(
|
JOptionPane.showMessageDialog(
|
||||||
this.diagramPanel,
|
dp,
|
||||||
"A single relation must be selected to add an attribute.",
|
"A single relation must be selected to add an attribute.",
|
||||||
"Single Relation Required",
|
"Single Relation Required",
|
||||||
JOptionPane.WARNING_MESSAGE
|
JOptionPane.WARNING_MESSAGE
|
||||||
|
@ -48,11 +35,10 @@ public class AddAttributeAction extends AbstractAction {
|
||||||
}
|
}
|
||||||
Relation r = selectedRelations.get(0);
|
Relation r = selectedRelations.get(0);
|
||||||
Attribute createdAttribute;
|
Attribute createdAttribute;
|
||||||
Component source = this.diagramPanel;
|
String name = JOptionPane.showInputDialog(dp, "Enter the name of the attribute.", "Attribute Name", JOptionPane.PLAIN_MESSAGE);
|
||||||
String name = JOptionPane.showInputDialog(source, "Enter the name of the attribute.", "Attribute Name", JOptionPane.PLAIN_MESSAGE);
|
|
||||||
if (name == null) return;
|
if (name == null) return;
|
||||||
Integer index = (Integer) JOptionPane.showInputDialog(
|
Integer index = (Integer) JOptionPane.showInputDialog(
|
||||||
source,
|
dp,
|
||||||
"Select the index to insert this attribute at.",
|
"Select the index to insert this attribute at.",
|
||||||
"Attribute Index",
|
"Attribute Index",
|
||||||
JOptionPane.PLAIN_MESSAGE,
|
JOptionPane.PLAIN_MESSAGE,
|
||||||
|
@ -62,7 +48,7 @@ public class AddAttributeAction extends AbstractAction {
|
||||||
);
|
);
|
||||||
if (index == null) return;
|
if (index == null) return;
|
||||||
AttributeType type = (AttributeType) JOptionPane.showInputDialog(
|
AttributeType type = (AttributeType) JOptionPane.showInputDialog(
|
||||||
source,
|
dp,
|
||||||
"Select the type this attribute is.",
|
"Select the type this attribute is.",
|
||||||
"Attribute Type",
|
"Attribute Type",
|
||||||
JOptionPane.PLAIN_MESSAGE,
|
JOptionPane.PLAIN_MESSAGE,
|
||||||
|
@ -72,7 +58,7 @@ public class AddAttributeAction extends AbstractAction {
|
||||||
);
|
);
|
||||||
if (type == null) return;
|
if (type == null) return;
|
||||||
boolean shouldUseForeignKey = ((String) JOptionPane.showInputDialog(
|
boolean shouldUseForeignKey = ((String) JOptionPane.showInputDialog(
|
||||||
source,
|
dp,
|
||||||
"Is this attribute a foreign key?",
|
"Is this attribute a foreign key?",
|
||||||
"Foreign Key",
|
"Foreign Key",
|
||||||
JOptionPane.PLAIN_MESSAGE,
|
JOptionPane.PLAIN_MESSAGE,
|
||||||
|
@ -81,27 +67,27 @@ public class AddAttributeAction extends AbstractAction {
|
||||||
"No"
|
"No"
|
||||||
)).equalsIgnoreCase("yes");
|
)).equalsIgnoreCase("yes");
|
||||||
if (shouldUseForeignKey) {
|
if (shouldUseForeignKey) {
|
||||||
if (this.model.getRelations().size() < 2) {
|
if (model.getRelations().size() < 2) {
|
||||||
JOptionPane.showMessageDialog(source, "There should be at least 2 relations present in the model.", "Not Enough Relations", JOptionPane.WARNING_MESSAGE);
|
JOptionPane.showMessageDialog(dp, "There should be at least 2 relations present in the model.", "Not Enough Relations", JOptionPane.WARNING_MESSAGE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Relation fkRelation = (Relation) JOptionPane.showInputDialog(
|
Relation fkRelation = (Relation) JOptionPane.showInputDialog(
|
||||||
source,
|
dp,
|
||||||
"Select the relation that this foreign key references.",
|
"Select the relation that this foreign key references.",
|
||||||
"Foreign Key Relation Reference",
|
"Foreign Key Relation Reference",
|
||||||
JOptionPane.PLAIN_MESSAGE,
|
JOptionPane.PLAIN_MESSAGE,
|
||||||
null,
|
null,
|
||||||
this.model.getRelations().toArray(new Relation[0]),
|
model.getRelations().toArray(new Relation[0]),
|
||||||
this.model.getRelations().stream().findFirst().orElse(null)
|
model.getRelations().stream().findFirst().orElse(null)
|
||||||
);
|
);
|
||||||
if (fkRelation == null) return;
|
if (fkRelation == null) return;
|
||||||
List<Attribute> eligibleAttributes = fkRelation.getAttributes();
|
List<Attribute> eligibleAttributes = fkRelation.getAttributes();
|
||||||
if (eligibleAttributes.isEmpty()) {
|
if (eligibleAttributes.isEmpty()) {
|
||||||
JOptionPane.showMessageDialog(source, "There are no referencable attributes in the selected relation.", "No Referencable Attributes", JOptionPane.WARNING_MESSAGE);
|
JOptionPane.showMessageDialog(dp, "There are no referencable attributes in the selected relation.", "No Referencable Attributes", JOptionPane.WARNING_MESSAGE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Attribute fkAttribute = (Attribute) JOptionPane.showInputDialog(
|
Attribute fkAttribute = (Attribute) JOptionPane.showInputDialog(
|
||||||
source,
|
dp,
|
||||||
"Select the attribute that this foreign key references.",
|
"Select the attribute that this foreign key references.",
|
||||||
"Foreign Key Attribute Reference",
|
"Foreign Key Attribute Reference",
|
||||||
JOptionPane.PLAIN_MESSAGE,
|
JOptionPane.PLAIN_MESSAGE,
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package nl.andrewlalis.erme.control.actions.edits;
|
package nl.andrewlalis.erme.control.actions.edits;
|
||||||
|
|
||||||
import lombok.Setter;
|
import nl.andrewlalis.erme.control.actions.DiagramPanelAction;
|
||||||
import nl.andrewlalis.erme.control.actions.LocalAction;
|
|
||||||
import nl.andrewlalis.erme.model.MappingModel;
|
import nl.andrewlalis.erme.model.MappingModel;
|
||||||
import nl.andrewlalis.erme.model.Relation;
|
import nl.andrewlalis.erme.model.Relation;
|
||||||
import nl.andrewlalis.erme.view.DiagramPanel;
|
import nl.andrewlalis.erme.view.DiagramPanel;
|
||||||
|
@ -12,57 +11,45 @@ import java.awt.event.ActionEvent;
|
||||||
import java.awt.event.InputEvent;
|
import java.awt.event.InputEvent;
|
||||||
import java.awt.event.KeyEvent;
|
import java.awt.event.KeyEvent;
|
||||||
|
|
||||||
public class AddRelationAction extends LocalAction {
|
public class AddRelationAction extends DiagramPanelAction {
|
||||||
private static AddRelationAction instance;
|
public AddRelationAction(DiagramPanel diagramPanel) {
|
||||||
public static AddRelationAction getInstance() {
|
super("Add Relation", diagramPanel);
|
||||||
if (instance == null) {
|
|
||||||
instance = new AddRelationAction();
|
|
||||||
}
|
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Setter
|
|
||||||
private MappingModel model;
|
|
||||||
|
|
||||||
@Setter
|
|
||||||
private DiagramPanel diagramPanel;
|
|
||||||
|
|
||||||
public AddRelationAction() {
|
|
||||||
super("Add Relation");
|
|
||||||
this.putValue(SHORT_DESCRIPTION, "Add a new relation to the diagram.");
|
this.putValue(SHORT_DESCRIPTION, "Add a new relation to the diagram.");
|
||||||
this.putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_R, InputEvent.CTRL_DOWN_MASK));
|
this.putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_R, InputEvent.CTRL_DOWN_MASK));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
DiagramPanel dp = getDiagramPanel();
|
||||||
|
MappingModel model = dp.getModel();
|
||||||
String name = JOptionPane.showInputDialog(
|
String name = JOptionPane.showInputDialog(
|
||||||
this.diagramPanel,
|
dp,
|
||||||
"Enter the name of the relation.",
|
"Enter the name of the relation.",
|
||||||
"Add Relation",
|
"Add Relation",
|
||||||
JOptionPane.PLAIN_MESSAGE
|
JOptionPane.PLAIN_MESSAGE
|
||||||
);
|
);
|
||||||
if (name != null) {
|
if (name != null) {
|
||||||
final boolean isFirstRelation = this.model.getRelations().isEmpty();
|
final boolean isFirstRelation = model.getRelations().isEmpty();
|
||||||
Point p;
|
Point p;
|
||||||
if (this.hasLocation()) {
|
if (model.getLastInteractionPoint() != null) {
|
||||||
p = new Point(
|
p = new Point(
|
||||||
this.getLocation().x - this.diagramPanel.getPanningTranslation().x,
|
model.getLastInteractionPoint().x - dp.getPanningTranslation().x,
|
||||||
this.getLocation().y - this.diagramPanel.getPanningTranslation().y
|
model.getLastInteractionPoint().y - dp.getPanningTranslation().y
|
||||||
);
|
);
|
||||||
} else if (isFirstRelation) {
|
} else if (isFirstRelation) {
|
||||||
p = new Point(100, 100);
|
p = new Point(100, 100);
|
||||||
} else {
|
} else {
|
||||||
Rectangle bounds = this.model.getRelationBounds();
|
Rectangle bounds = model.getRelationBounds();
|
||||||
p = new Point(bounds.x + bounds.width / 2, bounds.y + bounds.height / 2);
|
p = new Point(bounds.x + bounds.width / 2, bounds.y + bounds.height / 2);
|
||||||
}
|
}
|
||||||
Relation r = new Relation(this.model, p, name);
|
Relation r = new Relation(model, p, name);
|
||||||
this.model.getSelectedRelations().forEach(rl -> rl.setSelected(false));
|
model.getSelectedRelations().forEach(rl -> rl.setSelected(false));
|
||||||
r.setSelected(true);
|
r.setSelected(true);
|
||||||
this.model.addRelation(r);
|
model.addRelation(r);
|
||||||
if (isFirstRelation) {
|
if (isFirstRelation) {
|
||||||
this.model.normalizeRelationPositions();
|
model.normalizeRelationPositions();
|
||||||
this.diagramPanel.centerModel();
|
dp.centerModel();
|
||||||
this.diagramPanel.repaint();
|
dp.repaint();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
package nl.andrewlalis.erme.control.actions.edits;
|
package nl.andrewlalis.erme.control.actions.edits;
|
||||||
|
|
||||||
import lombok.Setter;
|
import nl.andrewlalis.erme.control.actions.DiagramPanelAction;
|
||||||
import nl.andrewlalis.erme.model.Attribute;
|
import nl.andrewlalis.erme.model.Attribute;
|
||||||
import nl.andrewlalis.erme.model.MappingModel;
|
|
||||||
import nl.andrewlalis.erme.model.Relation;
|
import nl.andrewlalis.erme.model.Relation;
|
||||||
import nl.andrewlalis.erme.view.DiagramPanel;
|
import nl.andrewlalis.erme.view.DiagramPanel;
|
||||||
|
|
||||||
|
@ -12,33 +11,19 @@ import java.awt.event.InputEvent;
|
||||||
import java.awt.event.KeyEvent;
|
import java.awt.event.KeyEvent;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class RemoveAttributeAction extends AbstractAction {
|
public class RemoveAttributeAction extends DiagramPanelAction {
|
||||||
private static RemoveAttributeAction instance;
|
public RemoveAttributeAction(DiagramPanel diagramPanel) {
|
||||||
|
super("Remove Attribute", diagramPanel);
|
||||||
public static RemoveAttributeAction getInstance() {
|
|
||||||
if (instance == null) {
|
|
||||||
instance = new RemoveAttributeAction();
|
|
||||||
}
|
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Setter
|
|
||||||
private MappingModel model;
|
|
||||||
@Setter
|
|
||||||
private DiagramPanel diagramPanel;
|
|
||||||
|
|
||||||
public RemoveAttributeAction() {
|
|
||||||
super("Remove Attribute");
|
|
||||||
this.putValue(SHORT_DESCRIPTION, "Remove an attribute from a relation.");
|
this.putValue(SHORT_DESCRIPTION, "Remove an attribute from a relation.");
|
||||||
this.putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_T, InputEvent.CTRL_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK));
|
this.putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_T, InputEvent.CTRL_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
List<Relation> selectedRelations = this.model.getSelectedRelations();
|
List<Relation> selectedRelations = getDiagramPanel().getModel().getSelectedRelations();
|
||||||
if (selectedRelations.size() != 1 || selectedRelations.get(0).getAttributes().isEmpty()) {
|
if (selectedRelations.size() != 1 || selectedRelations.get(0).getAttributes().isEmpty()) {
|
||||||
JOptionPane.showMessageDialog(
|
JOptionPane.showMessageDialog(
|
||||||
this.diagramPanel,
|
getDiagramPanel(),
|
||||||
"A single relation with at least one attribute must be selected to remove an attribute.",
|
"A single relation with at least one attribute must be selected to remove an attribute.",
|
||||||
"Single Relation With Attribute Required",
|
"Single Relation With Attribute Required",
|
||||||
JOptionPane.WARNING_MESSAGE
|
JOptionPane.WARNING_MESSAGE
|
||||||
|
@ -47,7 +32,7 @@ public class RemoveAttributeAction extends AbstractAction {
|
||||||
}
|
}
|
||||||
Relation r = selectedRelations.get(0);
|
Relation r = selectedRelations.get(0);
|
||||||
Attribute attribute = (Attribute) JOptionPane.showInputDialog(
|
Attribute attribute = (Attribute) JOptionPane.showInputDialog(
|
||||||
this.diagramPanel,
|
getDiagramPanel(),
|
||||||
"Select the attribute to remove.",
|
"Select the attribute to remove.",
|
||||||
"Select Attribute",
|
"Select Attribute",
|
||||||
JOptionPane.PLAIN_MESSAGE,
|
JOptionPane.PLAIN_MESSAGE,
|
||||||
|
|
|
@ -1,50 +1,36 @@
|
||||||
package nl.andrewlalis.erme.control.actions.edits;
|
package nl.andrewlalis.erme.control.actions.edits;
|
||||||
|
|
||||||
import lombok.Setter;
|
import nl.andrewlalis.erme.control.actions.DiagramPanelAction;
|
||||||
import nl.andrewlalis.erme.model.MappingModel;
|
import nl.andrewlalis.erme.model.MappingModel;
|
||||||
import nl.andrewlalis.erme.model.Relation;
|
import nl.andrewlalis.erme.model.Relation;
|
||||||
import nl.andrewlalis.erme.view.DiagramPanel;
|
import nl.andrewlalis.erme.view.DiagramPanel;
|
||||||
|
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
import java.awt.*;
|
|
||||||
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionEvent;
|
||||||
import java.awt.event.InputEvent;
|
import java.awt.event.InputEvent;
|
||||||
import java.awt.event.KeyEvent;
|
import java.awt.event.KeyEvent;
|
||||||
|
|
||||||
public class RemoveRelationAction extends AbstractAction {
|
public class RemoveRelationAction extends DiagramPanelAction {
|
||||||
private static RemoveRelationAction instance;
|
public RemoveRelationAction(DiagramPanel diagramPanel) {
|
||||||
|
super("Remove Relation", diagramPanel);
|
||||||
public static RemoveRelationAction getInstance() {
|
|
||||||
if (instance == null) {
|
|
||||||
instance = new RemoveRelationAction();
|
|
||||||
}
|
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Setter
|
|
||||||
private MappingModel model;
|
|
||||||
@Setter
|
|
||||||
private DiagramPanel diagramPanel;
|
|
||||||
|
|
||||||
public RemoveRelationAction() {
|
|
||||||
super("Remove Relation");
|
|
||||||
this.putValue(SHORT_DESCRIPTION, "Remove a relation from the diagram.");
|
this.putValue(SHORT_DESCRIPTION, "Remove a relation from the diagram.");
|
||||||
this.putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_R, InputEvent.CTRL_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK));
|
this.putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_R, InputEvent.CTRL_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
if (this.model.getSelectedRelations().isEmpty()) {
|
MappingModel model = getDiagramPanel().getModel();
|
||||||
|
if (model.getSelectedRelations().isEmpty()) {
|
||||||
JOptionPane.showMessageDialog(
|
JOptionPane.showMessageDialog(
|
||||||
this.diagramPanel,
|
getDiagramPanel(),
|
||||||
"No relations selected. Select at least one relation to remove.",
|
"No relations selected. Select at least one relation to remove.",
|
||||||
"No Relations Selected",
|
"No Relations Selected",
|
||||||
JOptionPane.WARNING_MESSAGE
|
JOptionPane.WARNING_MESSAGE
|
||||||
);
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
for (Relation r : this.model.getSelectedRelations()) {
|
for (Relation r : model.getSelectedRelations()) {
|
||||||
this.model.removeRelation(r);
|
model.removeRelation(r);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,11 +11,11 @@ import java.awt.event.MouseAdapter;
|
||||||
import java.awt.event.MouseEvent;
|
import java.awt.event.MouseEvent;
|
||||||
|
|
||||||
public class DiagramMouseListener extends MouseAdapter {
|
public class DiagramMouseListener extends MouseAdapter {
|
||||||
private final MappingModel model;
|
private final DiagramPanel diagramPanel;
|
||||||
private Point mouseDragStart;
|
private Point mouseDragStart;
|
||||||
|
|
||||||
public DiagramMouseListener(MappingModel model) {
|
public DiagramMouseListener(DiagramPanel diagramPanel) {
|
||||||
this.model = model;
|
this.diagramPanel = diagramPanel;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -38,13 +38,14 @@ public class DiagramMouseListener extends MouseAdapter {
|
||||||
|
|
||||||
final boolean isCtrlDown = (e.getModifiers() & ActionEvent.CTRL_MASK) == ActionEvent.CTRL_MASK;
|
final boolean isCtrlDown = (e.getModifiers() & ActionEvent.CTRL_MASK) == ActionEvent.CTRL_MASK;
|
||||||
final boolean isShiftDown = (e.getModifiers() & ActionEvent.SHIFT_MASK) == ActionEvent.SHIFT_MASK;
|
final boolean isShiftDown = (e.getModifiers() & ActionEvent.SHIFT_MASK) == ActionEvent.SHIFT_MASK;
|
||||||
|
MappingModel model = this.diagramPanel.getModel();
|
||||||
|
|
||||||
if (!isShiftDown && !isCtrlDown) {// A simple click anywhere should reset selection.
|
if (!isShiftDown && !isCtrlDown) {// A simple click anywhere should reset selection.
|
||||||
this.model.getRelations().forEach(r -> r.setSelected(false));
|
model.getRelations().forEach(r -> r.setSelected(false));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isShiftDown) {// If the user clicked or CTRL+clicked, try and select the relation they clicked on.
|
if (!isShiftDown) {// If the user clicked or CTRL+clicked, try and select the relation they clicked on.
|
||||||
for (Relation r : this.model.getRelations()) {
|
for (Relation r : model.getRelations()) {
|
||||||
if (r.getViewModel().getBounds(g).contains(modelX, modelY)) {
|
if (r.getViewModel().getBounds(g).contains(modelX, modelY)) {
|
||||||
r.setSelected(!r.isSelected());
|
r.setSelected(!r.isSelected());
|
||||||
break;
|
break;
|
||||||
|
@ -54,11 +55,12 @@ public class DiagramMouseListener extends MouseAdapter {
|
||||||
|
|
||||||
// If the user right-clicked, show a popup menu.
|
// If the user right-clicked, show a popup menu.
|
||||||
if (e.getButton() == MouseEvent.BUTTON3) {
|
if (e.getButton() == MouseEvent.BUTTON3) {
|
||||||
DiagramPopupMenu popupMenu = new DiagramPopupMenu(this.model, e);
|
model.setLastInteractionPoint(e.getPoint());
|
||||||
|
DiagramPopupMenu popupMenu = new DiagramPopupMenu(this.diagramPanel);
|
||||||
popupMenu.show(panel, e.getX(), e.getY());
|
popupMenu.show(panel, e.getX(), e.getY());
|
||||||
}
|
}
|
||||||
|
|
||||||
this.model.fireChangedEvent();
|
model.fireChangedEvent();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -72,13 +74,14 @@ public class DiagramMouseListener extends MouseAdapter {
|
||||||
final int dy = this.mouseDragStart.y - e.getY();
|
final int dy = this.mouseDragStart.y - e.getY();
|
||||||
final boolean isShiftDown = (e.getModifiers() & ActionEvent.SHIFT_MASK) == ActionEvent.SHIFT_MASK;
|
final boolean isShiftDown = (e.getModifiers() & ActionEvent.SHIFT_MASK) == ActionEvent.SHIFT_MASK;
|
||||||
boolean changed = false;
|
boolean changed = false;
|
||||||
|
MappingModel model = this.diagramPanel.getModel();
|
||||||
|
|
||||||
if (isShiftDown) {
|
if (isShiftDown) {
|
||||||
final DiagramPanel panel = (DiagramPanel) e.getSource();
|
System.out.println(e);
|
||||||
panel.translate(-dx, -dy);
|
this.diagramPanel.translate(-dx, -dy);
|
||||||
panel.repaint();
|
this.diagramPanel.repaint();
|
||||||
} else {
|
} else {
|
||||||
for (Relation r : this.model.getRelations()) {
|
for (Relation r : model.getRelations()) {
|
||||||
if (r.isSelected()) {
|
if (r.isSelected()) {
|
||||||
r.setPosition(new Point(r.getPosition().x - dx, r.getPosition().y - dy));
|
r.setPosition(new Point(r.getPosition().x - dx, r.getPosition().y - dy));
|
||||||
changed = true;
|
changed = true;
|
||||||
|
@ -87,7 +90,7 @@ public class DiagramMouseListener extends MouseAdapter {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (changed) {
|
if (changed) {
|
||||||
this.model.fireChangedEvent();
|
model.fireChangedEvent();
|
||||||
}
|
}
|
||||||
this.mouseDragStart = e.getPoint();
|
this.mouseDragStart = e.getPoint();
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import com.fasterxml.jackson.databind.node.ArrayNode;
|
import com.fasterxml.jackson.databind.node.ArrayNode;
|
||||||
import com.fasterxml.jackson.databind.node.ObjectNode;
|
import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
import nl.andrewlalis.erme.view.view_models.MappingModelViewModel;
|
import nl.andrewlalis.erme.view.view_models.MappingModelViewModel;
|
||||||
import nl.andrewlalis.erme.view.view_models.ViewModel;
|
import nl.andrewlalis.erme.view.view_models.ViewModel;
|
||||||
|
|
||||||
|
@ -23,6 +24,16 @@ public class MappingModel implements Viewable {
|
||||||
|
|
||||||
private transient final Set<ModelChangeListener> changeListeners;
|
private transient final Set<ModelChangeListener> changeListeners;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
private transient Point lastInteractionPoint = null;
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
private transient boolean lolcatEnabled = false;
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
private transient boolean referenceVisualizationEnabled = false;
|
||||||
|
|
||||||
public MappingModel() {
|
public MappingModel() {
|
||||||
this.relations = new HashSet<>();
|
this.relations = new HashSet<>();
|
||||||
this.changeListeners = new HashSet<>();
|
this.changeListeners = new HashSet<>();
|
||||||
|
|
|
@ -1,11 +1,6 @@
|
||||||
package nl.andrewlalis.erme.view;
|
package nl.andrewlalis.erme.view;
|
||||||
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import nl.andrewlalis.erme.control.actions.*;
|
|
||||||
import nl.andrewlalis.erme.control.actions.edits.AddAttributeAction;
|
|
||||||
import nl.andrewlalis.erme.control.actions.edits.AddRelationAction;
|
|
||||||
import nl.andrewlalis.erme.control.actions.edits.RemoveAttributeAction;
|
|
||||||
import nl.andrewlalis.erme.control.actions.edits.RemoveRelationAction;
|
|
||||||
import nl.andrewlalis.erme.control.diagram.DiagramMouseListener;
|
import nl.andrewlalis.erme.control.diagram.DiagramMouseListener;
|
||||||
import nl.andrewlalis.erme.model.MappingModel;
|
import nl.andrewlalis.erme.model.MappingModel;
|
||||||
import nl.andrewlalis.erme.model.ModelChangeListener;
|
import nl.andrewlalis.erme.model.ModelChangeListener;
|
||||||
|
@ -21,6 +16,10 @@ import java.awt.event.MouseMotionListener;
|
||||||
* The main panel in which the ER Mapping diagram is displayed.
|
* The main panel in which the ER Mapping diagram is displayed.
|
||||||
*/
|
*/
|
||||||
public class DiagramPanel extends JPanel implements ModelChangeListener {
|
public class DiagramPanel extends JPanel implements ModelChangeListener {
|
||||||
|
/**
|
||||||
|
* The model for the application. This is the main location from which to
|
||||||
|
* obtain the model for use in actions.
|
||||||
|
*/
|
||||||
@Getter
|
@Getter
|
||||||
private MappingModel model;
|
private MappingModel model;
|
||||||
|
|
||||||
|
@ -60,10 +59,10 @@ public class DiagramPanel extends JPanel implements ModelChangeListener {
|
||||||
for (MouseMotionListener listener : this.getMouseMotionListeners()) {
|
for (MouseMotionListener listener : this.getMouseMotionListeners()) {
|
||||||
this.removeMouseMotionListener(listener);
|
this.removeMouseMotionListener(listener);
|
||||||
}
|
}
|
||||||
DiagramMouseListener listener = new DiagramMouseListener(newModel);
|
DiagramMouseListener listener = new DiagramMouseListener(this);
|
||||||
this.addMouseListener(listener);
|
this.addMouseListener(listener);
|
||||||
this.addMouseMotionListener(listener);
|
this.addMouseMotionListener(listener);
|
||||||
this.updateActionModels();
|
this.updateActionModels(); // TODO: remove this once OrderableListPanel is cleaned up.
|
||||||
newModel.addChangeListener(OrderableListPanel.getInstance());
|
newModel.addChangeListener(OrderableListPanel.getInstance());
|
||||||
this.centerModel();
|
this.centerModel();
|
||||||
this.repaint();
|
this.repaint();
|
||||||
|
@ -79,6 +78,9 @@ public class DiagramPanel extends JPanel implements ModelChangeListener {
|
||||||
this.panningTranslation.y = 0;
|
this.panningTranslation.y = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Centers the model in the panel, by adjusting the panning translation.
|
||||||
|
*/
|
||||||
public void centerModel() {
|
public void centerModel() {
|
||||||
if (this.getGraphics() == null) {
|
if (this.getGraphics() == null) {
|
||||||
return;
|
return;
|
||||||
|
@ -120,30 +122,7 @@ public class DiagramPanel extends JPanel implements ModelChangeListener {
|
||||||
* TODO: Clean this up somehow!
|
* TODO: Clean this up somehow!
|
||||||
*/
|
*/
|
||||||
private void updateActionModels() {
|
private void updateActionModels() {
|
||||||
NewModelAction.getInstance().setDiagramPanel(this);
|
|
||||||
SaveAction.getInstance().setModel(this.model);
|
|
||||||
LoadAction.getInstance().setDiagramPanel(this);
|
|
||||||
ExportToImageAction.getInstance().setModel(this.model);
|
|
||||||
ExportToImageAction.getInstance().setDiagramPanel(this);
|
|
||||||
AddRelationAction.getInstance().setModel(this.model);
|
|
||||||
AddRelationAction.getInstance().setDiagramPanel(this);
|
|
||||||
RemoveRelationAction.getInstance().setModel(this.model);
|
|
||||||
RemoveRelationAction.getInstance().setDiagramPanel(this);
|
|
||||||
AddAttributeAction.getInstance().setModel(this.model);
|
|
||||||
AddAttributeAction.getInstance().setDiagramPanel(this);
|
|
||||||
RemoveAttributeAction.getInstance().setModel(this.model);
|
|
||||||
RemoveAttributeAction.getInstance().setDiagramPanel(this);
|
|
||||||
LoadSampleModelAction.getInstance().setDiagramPanel(this);
|
|
||||||
LolcatAction.getInstance().setDiagramPanel(this);
|
|
||||||
VisualizeReferencesAction.getInstance().setDiagramPanel(this);
|
|
||||||
AutoPositionAction.getInstance().setDiagramPanel(this);
|
|
||||||
AutoPositionAction.getInstance().setModel(this.model);
|
|
||||||
OrderableListPanel.getInstance().setModel(this.model);
|
OrderableListPanel.getInstance().setModel(this.model);
|
||||||
AboutAction.getInstance().setDiagramPanel(this);
|
|
||||||
ExitAction.getInstance().setDiagramPanel(this);
|
|
||||||
InstructionsAction.getInstance().setDiagramPanel(this);
|
|
||||||
MappingAlgorithmHelpAction.getInstance().setDiagramPanel(this);
|
|
||||||
SaveAction.getInstance().setDiagramPanel(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void prepareGraphics(Graphics2D g) {
|
public static void prepareGraphics(Graphics2D g) {
|
||||||
|
|
|
@ -2,28 +2,27 @@ package nl.andrewlalis.erme.view;
|
||||||
|
|
||||||
import nl.andrewlalis.erme.control.actions.edits.AddAttributeAction;
|
import nl.andrewlalis.erme.control.actions.edits.AddAttributeAction;
|
||||||
import nl.andrewlalis.erme.control.actions.edits.AddRelationAction;
|
import nl.andrewlalis.erme.control.actions.edits.AddRelationAction;
|
||||||
import nl.andrewlalis.erme.control.actions.edits.RemoveAttributeAction;
|
|
||||||
import nl.andrewlalis.erme.control.actions.edits.RemoveRelationAction;
|
import nl.andrewlalis.erme.control.actions.edits.RemoveRelationAction;
|
||||||
import nl.andrewlalis.erme.model.MappingModel;
|
|
||||||
import nl.andrewlalis.erme.model.Relation;
|
import nl.andrewlalis.erme.model.Relation;
|
||||||
|
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
import java.awt.event.MouseEvent;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class DiagramPopupMenu extends JPopupMenu {
|
public class DiagramPopupMenu extends JPopupMenu {
|
||||||
public DiagramPopupMenu(MappingModel model, MouseEvent e) {
|
public DiagramPopupMenu(DiagramPanel diagramPanel) {
|
||||||
List<Relation> selectedRelations = model.getSelectedRelations();
|
List<Relation> selectedRelations = diagramPanel.getModel().getSelectedRelations();
|
||||||
AddRelationAction.getInstance().setLocation(e.getPoint());
|
|
||||||
if (selectedRelations.size() == 0) {
|
if (selectedRelations.size() == 0) {
|
||||||
this.add(AddRelationAction.getInstance());
|
this.add(new AddRelationAction(diagramPanel));
|
||||||
}
|
}
|
||||||
if (selectedRelations.size() > 0) {
|
if (selectedRelations.size() > 0) {
|
||||||
this.add(RemoveRelationAction.getInstance());
|
this.add(new RemoveRelationAction(diagramPanel));
|
||||||
}
|
}
|
||||||
if (selectedRelations.size() == 1) {
|
if (selectedRelations.size() == 1) {
|
||||||
this.add(AddAttributeAction.getInstance());
|
Relation relation = selectedRelations.get(0);
|
||||||
this.add(RemoveAttributeAction.getInstance());
|
this.add(new AddAttributeAction(diagramPanel));
|
||||||
|
if (!relation.getAttributes().isEmpty()) {
|
||||||
|
this.add(new RemoveRelationAction(diagramPanel));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,8 +14,9 @@ import java.io.InputStream;
|
||||||
public class EditorFrame extends JFrame {
|
public class EditorFrame extends JFrame {
|
||||||
public EditorFrame() {
|
public EditorFrame() {
|
||||||
super("ER-Mapping Editor");
|
super("ER-Mapping Editor");
|
||||||
this.setContentPane(new DiagramPanel(new MappingModel()));
|
DiagramPanel diagramPanel = new DiagramPanel(new MappingModel());
|
||||||
this.setJMenuBar(new EditorMenuBar());
|
this.setContentPane(diagramPanel);
|
||||||
|
this.setJMenuBar(new EditorMenuBar(diagramPanel));
|
||||||
try {
|
try {
|
||||||
InputStream is = getClass().getClassLoader().getResourceAsStream("icon.png");
|
InputStream is = getClass().getClassLoader().getResourceAsStream("icon.png");
|
||||||
if (is == null) {
|
if (is == null) {
|
||||||
|
@ -26,7 +27,7 @@ public class EditorFrame extends JFrame {
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
this.setMinimumSize(new Dimension(400, 400));
|
this.setMinimumSize(new Dimension(300, 300));
|
||||||
this.setPreferredSize(new Dimension(800, 800));
|
this.setPreferredSize(new Dimension(800, 800));
|
||||||
this.pack();
|
this.pack();
|
||||||
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
|
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
|
||||||
|
|
|
@ -3,7 +3,6 @@ package nl.andrewlalis.erme.view;
|
||||||
import nl.andrewlalis.erme.control.actions.*;
|
import nl.andrewlalis.erme.control.actions.*;
|
||||||
import nl.andrewlalis.erme.control.actions.edits.AddAttributeAction;
|
import nl.andrewlalis.erme.control.actions.edits.AddAttributeAction;
|
||||||
import nl.andrewlalis.erme.control.actions.edits.AddRelationAction;
|
import nl.andrewlalis.erme.control.actions.edits.AddRelationAction;
|
||||||
import nl.andrewlalis.erme.control.actions.edits.RemoveAttributeAction;
|
|
||||||
import nl.andrewlalis.erme.control.actions.edits.RemoveRelationAction;
|
import nl.andrewlalis.erme.control.actions.edits.RemoveRelationAction;
|
||||||
|
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
|
@ -12,51 +11,47 @@ import javax.swing.*;
|
||||||
* The menu bar that's visible atop the application.
|
* The menu bar that's visible atop the application.
|
||||||
*/
|
*/
|
||||||
public class EditorMenuBar extends JMenuBar {
|
public class EditorMenuBar extends JMenuBar {
|
||||||
public EditorMenuBar() {
|
public EditorMenuBar(DiagramPanel diagramPanel) {
|
||||||
this.add(this.buildFileMenu());
|
this.add(this.buildFileMenu(diagramPanel));
|
||||||
this.add(this.buildEditMenu());
|
this.add(this.buildEditMenu(diagramPanel));
|
||||||
this.add(this.buildViewMenu());
|
this.add(this.buildViewMenu(diagramPanel));
|
||||||
this.add(this.buildHelpMenu());
|
this.add(this.buildHelpMenu(diagramPanel));
|
||||||
}
|
}
|
||||||
|
|
||||||
private JMenu buildFileMenu() {
|
private JMenu buildFileMenu(DiagramPanel diagramPanel) {
|
||||||
JMenu menu = new JMenu("File");
|
JMenu menu = new JMenu("File");
|
||||||
menu.add(NewModelAction.getInstance());
|
menu.add(new NewModelAction(diagramPanel));
|
||||||
menu.add(SaveAction.getInstance());
|
menu.add(new SaveAction(diagramPanel));
|
||||||
menu.add(LoadAction.getInstance());
|
menu.add(new LoadAction(diagramPanel));
|
||||||
menu.addSeparator();
|
menu.addSeparator();
|
||||||
menu.add(ExportToImageAction.getInstance());
|
menu.add(new ExportToImageAction(diagramPanel));
|
||||||
menu.addSeparator();
|
menu.addSeparator();
|
||||||
menu.add(ExitAction.getInstance());
|
menu.add(new ExitAction(diagramPanel));
|
||||||
return menu;
|
return menu;
|
||||||
}
|
}
|
||||||
|
|
||||||
private JMenu buildEditMenu() {
|
private JMenu buildEditMenu(DiagramPanel diagramPanel) {
|
||||||
JMenu menu = new JMenu("Edit");
|
JMenu menu = new JMenu("Edit");
|
||||||
menu.add(AddRelationAction.getInstance());
|
menu.add(new AddRelationAction(diagramPanel));
|
||||||
menu.add(RemoveRelationAction.getInstance());
|
menu.add(new RemoveRelationAction(diagramPanel));
|
||||||
menu.add(AddAttributeAction.getInstance());
|
menu.add(new AddAttributeAction(diagramPanel));
|
||||||
menu.add(RemoveAttributeAction.getInstance());
|
menu.add(new RemoveRelationAction(diagramPanel));
|
||||||
menu.add(AutoPositionAction.getInstance());
|
menu.add(new AutoPositionAction(diagramPanel));
|
||||||
menu.addSeparator();
|
|
||||||
menu.add(UndoAction.getInstance());
|
|
||||||
menu.add(RedoAction.getInstance());
|
|
||||||
return menu;
|
return menu;
|
||||||
}
|
}
|
||||||
|
|
||||||
private JMenu buildViewMenu() {
|
private JMenu buildViewMenu(DiagramPanel diagramPanel) {
|
||||||
JMenu menu = new JMenu("View");
|
JMenu menu = new JMenu("View");
|
||||||
menu.add(new JCheckBoxMenuItem(LolcatAction.getInstance()));
|
menu.add(new JCheckBoxMenuItem(new LolcatAction(diagramPanel)));
|
||||||
menu.add(new JCheckBoxMenuItem(VisualizeReferencesAction.getInstance()));
|
menu.add(new JCheckBoxMenuItem(new VisualizeReferencesAction(diagramPanel)));
|
||||||
return menu;
|
return menu;
|
||||||
}
|
}
|
||||||
|
|
||||||
private JMenu buildHelpMenu() {
|
private JMenu buildHelpMenu(DiagramPanel diagramPanel) {
|
||||||
JMenu menu = new JMenu("Help");
|
JMenu menu = new JMenu("Help");
|
||||||
menu.add(InstructionsAction.getInstance());
|
menu.add(new InstructionsAction(diagramPanel));
|
||||||
menu.add(MappingAlgorithmHelpAction.getInstance());
|
menu.add(new MappingAlgorithmHelpAction(diagramPanel));
|
||||||
menu.add(LoadSampleModelAction.getInstance());
|
menu.add(new LoadSampleModelAction(diagramPanel));
|
||||||
menu.add(AboutAction.getInstance());
|
|
||||||
return menu;
|
return menu;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,7 @@ import java.util.Set;
|
||||||
/**
|
/**
|
||||||
* A panel to be used in a popup that has a OrderableListModel implemented. Implements ModelChangeListener to be able
|
* A panel to be used in a popup that has a OrderableListModel implemented. Implements ModelChangeListener to be able
|
||||||
* to update the list of relations when new ones are added or ones are removed.
|
* to update the list of relations when new ones are added or ones are removed.
|
||||||
|
* TODO: Refactor this to not use static singleton instance.
|
||||||
*/
|
*/
|
||||||
public class OrderableListPanel extends JPanel implements ModelChangeListener {
|
public class OrderableListPanel extends JPanel implements ModelChangeListener {
|
||||||
private static OrderableListPanel instance;
|
private static OrderableListPanel instance;
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
package nl.andrewlalis.erme.view.view_models;
|
package nl.andrewlalis.erme.view.view_models;
|
||||||
|
|
||||||
import nl.andrewlalis.erme.control.actions.LolcatAction;
|
|
||||||
import nl.andrewlalis.erme.model.Attribute;
|
import nl.andrewlalis.erme.model.Attribute;
|
||||||
import nl.andrewlalis.erme.model.AttributeType;
|
import nl.andrewlalis.erme.model.AttributeType;
|
||||||
import nl.andrewlalis.erme.model.ForeignKeyAttribute;
|
import nl.andrewlalis.erme.model.ForeignKeyAttribute;
|
||||||
|
@ -46,7 +45,7 @@ public class AttributeViewModel implements ViewModel {
|
||||||
}
|
}
|
||||||
|
|
||||||
private Color getBackgroundColor(int x, int y, Graphics2D g) {
|
private Color getBackgroundColor(int x, int y, Graphics2D g) {
|
||||||
if (!LolcatAction.getInstance().isLolcatEnabled()) return BACKGROUND_COLOR;
|
if (!attribute.getRelation().getModel().isLolcatEnabled()) return BACKGROUND_COLOR;
|
||||||
Point offset = g.getClipBounds().getLocation();
|
Point offset = g.getClipBounds().getLocation();
|
||||||
g.translate(offset.x, offset.y);
|
g.translate(offset.x, offset.y);
|
||||||
Dimension viewportSize = g.getClipBounds().getSize();
|
Dimension viewportSize = g.getClipBounds().getSize();
|
||||||
|
|
|
@ -1,13 +1,11 @@
|
||||||
package nl.andrewlalis.erme.view.view_models;
|
package nl.andrewlalis.erme.view.view_models;
|
||||||
|
|
||||||
import nl.andrewlalis.erme.control.actions.VisualizeReferencesAction;
|
|
||||||
import nl.andrewlalis.erme.model.Attribute;
|
import nl.andrewlalis.erme.model.Attribute;
|
||||||
import nl.andrewlalis.erme.model.ForeignKeyAttribute;
|
import nl.andrewlalis.erme.model.ForeignKeyAttribute;
|
||||||
import nl.andrewlalis.erme.model.MappingModel;
|
import nl.andrewlalis.erme.model.MappingModel;
|
||||||
import nl.andrewlalis.erme.model.Relation;
|
import nl.andrewlalis.erme.model.Relation;
|
||||||
|
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import java.awt.color.ColorSpace;
|
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -22,9 +20,7 @@ public class MappingModelViewModel implements ViewModel {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void draw(Graphics2D g) {
|
public void draw(Graphics2D g) {
|
||||||
if (VisualizeReferencesAction.getInstance().isReferenceVisualizationEnabled()) {
|
if (model.isReferenceVisualizationEnabled()) visualizeReferences(g);
|
||||||
visualizeReferences(g);
|
|
||||||
}
|
|
||||||
for (Relation r : this.model.getRelations()) {
|
for (Relation r : this.model.getRelations()) {
|
||||||
r.getViewModel().draw(g);
|
r.getViewModel().draw(g);
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,9 +7,13 @@
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
<h1>Entity-Relation Mapping Editor</h1>
|
<h1>Entity-Relation Mapping Editor</h1>
|
||||||
<p>Created by <a href="https://github.com/andrewlalis">@andrewlalis</a></p>
|
|
||||||
|
|
||||||
<p><em>A simple UI for editing entity-relation mapping diagrams.</em></p>
|
<p><em>A simple UI for editing entity-relation mapping diagrams.</em></p>
|
||||||
|
<p>Created by <a href="https://github.com/andrewlalis">Andrew Lalis</a></p>
|
||||||
|
<p>And with generous contributions by</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="https://github.com/bjornpijnacker">Bjorn Pijnacker</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Have you noticed any unexpected behavior? Is there something you think would make a good addition to this application?
|
Have you noticed any unexpected behavior? Is there something you think would make a good addition to this application?
|
||||||
|
@ -27,6 +31,9 @@
|
||||||
<li>
|
<li>
|
||||||
The <em>Edit</em> menu contains options for making changes to the current model, such as adding or removing relations and attributes, or undoing/redoing actions.
|
The <em>Edit</em> menu contains options for making changes to the current model, such as adding or removing relations and attributes, or undoing/redoing actions.
|
||||||
</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
The <em>View</em> menu contains options for changing how the model is viewed.
|
||||||
|
</li>
|
||||||
<li>
|
<li>
|
||||||
The <em>Help</em> menu contains some items with additional information about the application, like this help page and a simple <em>About</em> popup with version information. There's also a <em>Load Sample Model</em> option, which will load a very basic sample model into the application that you are free to mess around with.
|
The <em>Help</em> menu contains some items with additional information about the application, like this help page and a simple <em>About</em> popup with version information. There's also a <em>Load Sample Model</em> option, which will load a very basic sample model into the application that you are free to mess around with.
|
||||||
</li>
|
</li>
|
||||||
|
|
Loading…
Reference in New Issue