Added instructions.

This commit is contained in:
Andrew Lalis 2021-02-08 19:19:15 +01:00
parent f541a994b9
commit e606b8f9f4
4 changed files with 177 additions and 26 deletions

View File

@ -0,0 +1,36 @@
package nl.andrewlalis.erme.control.actions;
import nl.andrewlalis.erme.EntityRelationMappingEditor;
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;
}
public AboutAction() {
super("About");
this.putValue(SHORT_DESCRIPTION, "Show some information about this program.");
}
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(
(Component) e.getSource(),
"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
);
}
}

View File

@ -0,0 +1,83 @@
package nl.andrewlalis.erme.control.actions;
import javax.swing.*;
import javax.swing.event.HyperlinkEvent;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.io.*;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.file.Files;
public class InstructionsAction extends AbstractAction {
private static InstructionsAction instance;
public static InstructionsAction getInstance() {
if (instance == null) instance = new InstructionsAction();
return instance;
}
public InstructionsAction() {
super("Instructions");
this.putValue(SHORT_DESCRIPTION, "Instructions for how to use this program.");
}
@Override
public void actionPerformed(ActionEvent e) {
JDialog dialog = new JDialog(SwingUtilities.getWindowAncestor((Component) e.getSource()), "Instructions", Dialog.ModalityType.APPLICATION_MODAL);
JTextPane textPane = new JTextPane();
textPane.setEditable(false);
textPane.setContentType("text/html");
try {
textPane.setText(this.readFile());
textPane.addHyperlinkListener(event -> {
if (event.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
if (!Desktop.isDesktopSupported()) {
JOptionPane.showMessageDialog(dialog, "Desktop API not supported. You may still visit the link manually:\n" + event.getURL(), "Desktop API Not Supported", JOptionPane.WARNING_MESSAGE);
} else {
Desktop desktop = Desktop.getDesktop();
try {
desktop.browse(event.getURL().toURI());
} catch (IOException | URISyntaxException ex) {
ex.printStackTrace();
JOptionPane.showMessageDialog(dialog, "An error occurred and the URL could not be opened:\n" + event.getURL(), "URL Could Not Open", JOptionPane.ERROR_MESSAGE);
}
}
}
});
} catch (IOException ex) {
ex.printStackTrace();
JOptionPane.showMessageDialog(
(Component) e.getSource(),
"An error occured:\n" + ex.getMessage(),
"Error",
JOptionPane.ERROR_MESSAGE
);
textPane.setContentType("text/plain");
textPane.setText("Unable to load content.");
}
JScrollPane scrollPane = new JScrollPane(textPane, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
dialog.setContentPane(scrollPane);
dialog.setMaximumSize(new Dimension(600, 800));
dialog.setPreferredSize(new Dimension(600, 800));
dialog.pack();
dialog.setLocationRelativeTo(null);
dialog.setVisible(true);
}
private String readFile() throws IOException {
InputStream is = getClass().getClassLoader().getResourceAsStream("html/instructions.html");
if (is == null) {
throw new IOException("Could not get stream for instructions.html.");
}
StringBuilder sb = new StringBuilder();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(is))) {
String line = reader.readLine();
while (line != null) {
sb.append(line).append('\n');
line = reader.readLine();
}
}
return sb.toString();
}
}

View File

@ -1,6 +1,5 @@
package nl.andrewlalis.erme.view; package nl.andrewlalis.erme.view;
import nl.andrewlalis.erme.EntityRelationMappingEditor;
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;
@ -8,9 +7,6 @@ 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.*;
import java.awt.*;
import java.io.IOException;
import java.net.URI;
/** /**
* The menu bar that's visible atop the application. * The menu bar that's visible atop the application.
@ -48,28 +44,8 @@ public class EditorMenuBar extends JMenuBar {
private JMenu buildHelpMenu() { private JMenu buildHelpMenu() {
JMenu menu = new JMenu("Help"); JMenu menu = new JMenu("Help");
JMenuItem instructionsItem = new JMenuItem("GitHub (Instructions)"); menu.add(InstructionsAction.getInstance());
instructionsItem.addActionListener(e -> { menu.add(AboutAction.getInstance());
try {
Desktop.getDesktop().browse(URI.create("https://github.com/andrewlalis/EntityRelationMappingEditor"));
} catch (IOException ioException) {
ioException.printStackTrace();
}
});
menu.add(instructionsItem);
JMenuItem aboutItem = new JMenuItem("About");
aboutItem.addActionListener(e -> JOptionPane.showMessageDialog(
(Component) e.getSource(),
"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
));
menu.add(aboutItem);
return menu; return menu;
} }
} }

View File

@ -0,0 +1,56 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Instructions</title>
</head>
<body>
<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>
Have you noticed any unexpected behavior? Is there something you thing would make a good addition to this application?
<a href="https://github.com/andrewlalis/EntityRelationMappingEditor/issues">Create a new issue on GitHub!</a>
</p>
<h3>Instructions for Use</h3>
<p>
The interface and menus should be pretty self-explanatory, so they'll just be covered here in light detail.
</p>
<ul>
<li>
The <em>File</em> menu contains options for creating a new model, saving, loading or exporting a model, and finally an option to quit the program.
</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.
</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.
</li>
</ul>
<p>
The main focus of the application is the <em>Diagram Panel</em> where all of the editing actually takes place. This is where any relations you create, or attributes you create, appear; this is what is rendered when you select the option to export your model to an image.
</p>
<ul>
<li>
Click on a relation to select it.
</li>
<li>
CTRL+Click to select multiple relations at once.
</li>
<li>
Drag relations to move them around the workspace.
</li>
<li>
Right-click on different areas to access a context menu with some helpful actions.
</li>
<li>
When exporting the model to an image, be sure to add the desired image file extension (.png, .jpg, .bmp, etc.), or the application will default to .png.
</li>
</ul>
</body>
</html>