// Copyright (c) 2006 - 2008, Markus Strauch.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
// THE POSSIBILITY OF SUCH DAMAGE.
package net.sf.sdedit.editor;
import java.awt.event.ActionEvent;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import javax.swing.AbstractAction;
import javax.swing.Action;
import net.sf.sdedit.config.ConfigurationManager;
import net.sf.sdedit.diagram.Diagram;
import net.sf.sdedit.diagram.Lifeline;
import net.sf.sdedit.drawable.Drawable;
import net.sf.sdedit.icons.Icons;
import net.sf.sdedit.text.TextHandler;
import net.sf.sdedit.util.Grep;
/**
* This action generates an HTML map file from the diagram currently being
* displayed.
* <p>
* The name/id of the map is equal to the name of the diagram file (so there
* must be a file associated to the diagram). The map contains a
* "hot-spot" resp. <tt>AREA</tt> tag for each head of a lifeline
* that occurs in the diagram. By default, the <tt>href</tt> attribute
* contains the name of the object/lifeline. If you add an active comment,
* starting with <tt>#!</tt>, behind the object declaration, the content of
* the comment is used for the <tt>href</tt> attribute.
*
* @author Markus Strauch
*/
@SuppressWarnings("serial")
class ExportMapAction extends AbstractAction {
private Editor editor;
private File directory;
/**
* Constructor.
*
* @param editor
*/
ExportMapAction(Editor editor) {
this.editor = editor;
putValue(Action.NAME, "Export &HTML map file");
putValue(Action.SHORT_DESCRIPTION, "Create an HTML file with"
+ " an image map for the diagram currently being displayed");
putValue(Action.SMALL_ICON, Icons.getIcon("map"));
}
/**
* See {@linkplain ExportMapAction}.
*
* @param e
*/
public void actionPerformed(ActionEvent e) {
Diagram diagram = editor.getUI().getDiagram();
if (diagram == null || diagram.getLifelines().isEmpty()) {
return;
}
TextHandler textHandler = (TextHandler) diagram.getDataProvider();
File currentFile = editor.getUI().getCurrentFile();
if (currentFile == null) {
editor.getUI().message("Please save the diagram as a file first.");
return;
}
String name = currentFile.getName();
int dot = Math.min(name.length(), name.lastIndexOf('.'));
name = currentFile.getName().substring(0, dot);
if (directory == null) {
directory = currentFile.getParentFile();
}
File[] target = editor.getUI().getFiles(false, false,
"Export HTML map file", name + ".html", directory, "HTML files", "html");
if (target != null && target.length > 0) {
directory = target[0].getParentFile();
if (!target[0].exists()
|| 1 == editor.getUI().confirmOrCancel(
"Overwrite existing file:\n"
+ target[0].getAbsolutePath() + "?")) {
try {
generateMapFile(diagram, textHandler, name, target[0]);
} catch (IOException ex) {
editor.getUI().errorMessage(
"The map file could not be saved due to an exception of type\n"
+ ex.getClass().getSimpleName()
+ " with the message: " + ex.getMessage());
}
}
}
}
private void generateMapFile(Diagram diagram, TextHandler textHandler,
String mapName, File target) throws IOException {
String encoding = ConfigurationManager.getGlobalConfiguration().getFileEncoding();
FileOutputStream fos = new FileOutputStream(target);
OutputStreamWriter osw = new OutputStreamWriter(fos, encoding);
PrintWriter pw = new PrintWriter(osw);
pw.println("<!-- Generated by Quick Sequence Diagram Editor -->");
pw.println("<!-- encoding: " + encoding + " -->");
pw
.println("<!-- You may append '#!href=\"<url>\"' to an object declaration\nin order to set"
+ " the 'href' attribute of an AREA tag -->");
pw.println("<map id=\"" + mapName + "\" name=\"" + mapName + "\">");
for (Lifeline lifeline : diagram.getAllLifelines()) {
String annotation = textHandler.getAnnotation(lifeline);
String file = lifeline.getName();
if (annotation != null) {
String href[] = Grep.parse("^.*?href=\"(.*?)\".*$", annotation);
if (href != null) {
file = href[0];
}
}
Drawable drawable = lifeline.getHead();
int x1 = drawable.getLeft();
int y1 = drawable.getTop();
int x2 = drawable.getRight();
int y2 = drawable.getBottom();
String coords = x1 + "," + y1 + "," + x2 + "," + y2;
pw.println(" <area shape=\"rect\" coords=\"" + coords + "\""
+ " href=\"" + file + "\"/>");
}
pw.println("</map>");
pw.flush();
pw.close();
}
}