/*
* Copyright 2008-2014 by Emeric Vernat
*
* This file is part of Java Melody.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.bull.javamelody.swing.print;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.text.DateFormat;
import java.util.Date;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.ListSelectionModel;
import net.bull.javamelody.I18NAdapter;
import net.bull.javamelody.swing.table.MBasicTable;
/**
* Writer HTML.
*
* @author Emeric Vernat
*/
public class MHtmlWriter extends MPrinter {
/**
* Icône MS IE.
*/
public static final ImageIcon MSIE_ICON = new ImageIcon(
MHtmlWriter.class.getResource("/icons/ms ie.png"));
/** {@inheritDoc} */
@Override
public void print(final MBasicTable table, final OutputStream out) throws IOException {
writeHtml(table, out, false);
}
/** {@inheritDoc} */
@Override
public String getName() {
return I18NAdapter.getString("export_html");
}
/** {@inheritDoc} */
@Override
public String getFileExtension() {
return "html";
}
/** {@inheritDoc} */
@Override
public Icon getIcon() {
return MSIE_ICON;
}
/**
* Encode un texte au format html.
*
* @return String
* @param text
* String
*/
protected String formatHtml(final String text) {
return MHtmlEncoder.encodeString(text);
}
/**
* Exporte une JTable dans un fichier au format html.
*
* @param table
* MBasicTable
* @param outputStream
* OutputStream
* @param isSelection
* boolean
* @throws IOException
* Erreur disque
*/
protected void writeHtml(final MBasicTable table, final OutputStream outputStream,
final boolean isSelection) throws IOException {
final Writer out = new OutputStreamWriter(outputStream, "UTF-8");
final String eol = isSelection ? "\n" : System.getProperty("line.separator");
// eol = "\n" si sélection, "\r\n" sinon pour un fichier windows et "\n" pour un fichier unix
out.write("<!-- Fichier genere par ");
out.write(System.getProperty("user.name"));
out.write(" le ");
out.write(DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG).format(
new Date()));
out.write(" -->");
out.write(eol);
out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.write("<html>");
out.write(eol);
final String title = buildTitle(table);
writeHtmlHead(title, out, eol);
out.write("<body>");
out.write(eol);
if (title != null) {
out.write("<h3>");
out.write(title);
out.write("</h3>");
}
out.write(eol);
writeHtmlTable(table, isSelection, out, eol);
out.write("</body>");
out.write(eol);
out.write("</html>");
out.flush();
}
private void writeHtmlTable(final MBasicTable table, final boolean isSelection,
final Writer out, final String eol) throws IOException {
out.write("<table width=\"100%\" border=\"1\" cellspacing=\"0\" bordercolor=\"#000000\" cellpadding=\"2\">");
out.write(eol);
out.write(eol);
out.write(" <tr align=\"center\" class=\"smallFont\">");
out.write(eol);
final int rowCount = table.getRowCount();
final int columnCount = table.getColumnCount();
// titres des colonnes
for (int i = 0; i < columnCount; i++) {
out.write(" <th id=");
out.write(String.valueOf(i));
out.write("> ");
final Object value = table.getColumnModel().getColumn(i).getHeaderValue();
String text = value != null ? value.toString() : "";
text = formatHtml(text);
out.write(text);
out.write(" </th>");
out.write(eol);
}
out.write(" </tr>");
out.write(eol);
// les données proprement dites (ligne par ligne puis colonne par colonne)
final ListSelectionModel selectionModel = table.getSelectionModel();
for (int k = 0; k < rowCount; k++) {
if (isSelection && !selectionModel.isSelectedIndex(k)) {
continue;
}
out.write(eol);
out.write(" <tr id=");
out.write(String.valueOf(k));
out.write(" class=\"smallFont\">");
out.write(eol);
for (int i = 0; i < columnCount; i++) {
writeHtmlTd(table, out, eol, k, i);
}
out.write(" </tr>");
out.write(eol);
}
out.write(eol);
out.write("</table>");
out.write(eol);
}
private void writeHtmlTd(final MBasicTable table, final Writer out, final String eol, int k,
int i) throws IOException {
final Object value = getValueAt(table, k, i);
out.write(" <td");
if (value instanceof Number || value instanceof Date) {
out.write(" align=\"right\"");
} else if (value instanceof Boolean) {
out.write(" align=\"center\"");
}
out.write("> ");
String text = getTextAt(table, k, i);
text = formatHtml(text);
out.write(text != null && text.trim().length() != 0 ? text : " "); // NOPMD
out.write(" </td>");
out.write(eol);
}
private void writeHtmlHead(final String title, final Writer out, final String eol)
throws IOException {
out.write("<head>");
out.write(eol);
out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">");
out.write(eol);
out.write("<title>");
if (title != null) {
out.write(title);
}
out.write("</title>");
out.write(eol);
out.write("<style type=\"text/css\"><!--.smallFont { font-size: smaller}--></style>");
out.write(eol);
out.write("</head>");
out.write(eol);
}
}