/*
Copyright (C) 2013-2020 Nicola L.C. Talbot
www.dickimaw-books.com
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
package com.dickimawbooks.makeglossariesgui;
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.geom.*;
import java.awt.font.*;
import java.awt.event.*;
import java.util.*;
import java.text.*;
import java.awt.datatransfer.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;
import javax.swing.text.html.*;
public class GlossariesPanel extends JEditorPane
implements HyperlinkListener
{
public GlossariesPanel(MakeGlossariesGUI application)
throws IOException,BadLocationException
{
super();
app = application;
setContentType("text/html");
setEditable(false);
addHyperlinkListener(this);
addMouseListener(app);
HTMLDocument doc = (HTMLDocument)getDocument();
}
public void updateInfo()
throws BadLocationException,IOException
{
StyleSheet stylesheet = ((HTMLDocument)getDocument()).getStyleSheet();
Font font = app.getFont();
stylesheet.addRule(String.format("body { font-size: %dpt; }",
font.getSize()));
stylesheet.addRule(String.format("body { font-family: %s; }",
font.getName()));
stylesheet.addRule(String.format("body { font-weight: %s; }",
(font.isBold()?"bold":"normal")));
stylesheet.addRule(String.format("body { font-style: %s; }",
(font.isItalic()?"italic":"normal")));
setText(app.getMainInfoTemplate());
updateHeaders();
updateFields();
updateGlossaries();
}
private void updateHeaders()
throws BadLocationException,IOException
{
HTMLDocument doc = (HTMLDocument)getDocument();
Glossaries glossaries = app.getGlossaries();
if (glossaries == null)
{
return;
}
for (int i = 0, n = Glossaries.getNumFields(); i < n; i++)
{
Element e = Glossaries.getFieldLabelElement(doc, i);
String tag = e.getName();
doc.setOuterHTML(e, String.format("<%s>%s%s>",
tag, glossaries.getFieldLabel(i), tag));
}
}
private void updateFields()
throws BadLocationException,IOException
{
HTMLDocument doc = (HTMLDocument)getDocument();
Glossaries glossaries = app.getGlossaries();
if (glossaries == null) return;
for (int i = 0, n = glossaries.getNumFields(); i < n; i++)
{
Element e = glossaries.getFieldElement(doc, i);
String field = glossaries.getField(i);
String err = glossaries.getFieldError(i);
String tag = glossaries.getFieldTag(i);
String content = "";
if (err == null)
{
if (field != null)
{
content = field;
}
}
else
{
if (field == null)
{
content = String.format("%s", err);
}
else
{
content = String.format(
"%s %s",
field, err);
}
}
doc.setOuterHTML(e, String.format("
%s | ", tag, content));
}
}
private void updateGlossaries()
throws BadLocationException,IOException
{
HTMLDocument doc = (HTMLDocument)getDocument();
Glossaries glossaries = app.getGlossaries();
if (glossaries == null) return;
if (glossaries.getIstName() == null) return;
DateFormat df = DateFormat.getDateTimeInstance();
File file = app.getFile();
File dir = file.getParentFile();
String baseName = file.getName();
int idx = baseName.lastIndexOf(".");
if (idx != -1)
{
baseName = baseName.substring(0, idx);
}
String viewLabel = app.getLabel("main.view");
String detailsLabel = app.getLabel("main.details");
for (int i = 0, n = glossaries.getNumGlossaries(); i < n; i++)
{
Glossary g = glossaries.getGlossary(i);
String glossaryInfoTemplate = app.getGlossaryInfoTemplate(g.label);
doc.insertBeforeEnd(doc.getElement("glossaries"),
glossaryInfoTemplate);
doc.setInnerHTML(doc.getElement("glossaryheader-"+g.label),
app.getLabelWithValues("main.glossary", g.label));
File transFile = new File(dir, baseName+"."+g.transExt);
File gloFile = new File(dir, baseName+"."+g.gloExt);
File glsFile = new File(dir, baseName+"."+g.glsExt);
Element e = doc.getElement("loglabel-"+g.label);
String tag = e.getName();
doc.setOuterHTML(e, String.format("<%s>%s%s>",
tag, app.getLabel("main.glossary.log"), tag));
if (transFile.exists())
{
doc.setOuterHTML(doc.getElement("logname-"+g.label),
transFile.getName());
doc.setOuterHTML(doc.getElement("logmod-"+g.label),
transFile.lastModified() < gloFile.lastModified() ?
app.getLabel("main.out_of_date"):
app.getLabel("main.up_to_date"));
doc.setOuterHTML(doc.getElement("logview-"+g.label),
String.format("%s",
transFile.toURI(), viewLabel));
}
else
{
doc.setInnerHTML(doc.getElement("loginfo-"+g.label),
String.format("%s",
app.getLabel("error.no_such_file")));
}
e = doc.getElement("glslabel-"+g.label);
tag = e.getName();
doc.setOuterHTML(e, String.format("<%s>%s%s>",
tag, app.getLabel("main.glossary.gls"), tag));
if (glsFile.exists())
{
doc.setOuterHTML(doc.getElement("glsname-"+g.label),
glsFile.getName());
doc.setOuterHTML(doc.getElement("glsmod-"+g.label),
glsFile.length() == 0 ?
app.getLabel("main.empty") :
(glsFile.lastModified() < gloFile.lastModified() ?
app.getLabel("main.out_of_date"):
app.getLabel("main.up_to_date")));
doc.setOuterHTML(doc.getElement("glsview-"+g.label),
String.format("%s",
glsFile.toURI(), viewLabel));
}
else
{
doc.setInnerHTML(doc.getElement("glsinfo-"+g.label),
String.format("%s",
app.getLabel("error.no_such_file")));
}
e = doc.getElement("glolabel-"+g.label);
tag = e.getName();
doc.setOuterHTML(e, String.format("<%s>%s%s>",
tag, app.getLabel("main.glossary.glo"), tag));
if (gloFile.exists())
{
doc.setOuterHTML(doc.getElement("gloname-"+g.label),
gloFile.getName());
doc.setOuterHTML(doc.getElement("glomod-"+g.label),
df.format(new Date(gloFile.lastModified())));
doc.setOuterHTML(doc.getElement("gloview-"+g.label),
String.format("%s",
gloFile.toURI(), viewLabel));
}
else
{
doc.setInnerHTML(doc.getElement("gloinfo-"+g.label),
String.format("%s",
app.getLabel("error.no_such_file")));
}
if (glossaries.useXindy())
{
e = doc.getElement("langlabel-"+g.label);
tag = e.getName();
doc.setOuterHTML(e, String.format("<%s>%s%s>",
tag, app.getLabel("main.glossary.language"), tag));
doc.setInnerHTML(doc.getElement("langinfo-"+g.label),
g.displayLanguage());
e = doc.getElement("codelabel-"+g.label);
tag = e.getName();
doc.setOuterHTML(e, String.format("<%s>%s%s>",
tag, app.getLabel("main.glossary.codepage"), tag));
doc.setInnerHTML(doc.getElement("codeinfo-"+g.label),
g.displayCodePage());
}
else
{
doc.setOuterHTML(doc.getElement("xindy"), "");
}
e = doc.getElement("entrieslabel-"+g.label);
tag = e.getName();
doc.setOuterHTML(e, String.format("<%s>%s%s>",
tag, app.getLabel("main.num_entries"), tag));
e = doc.getElement("entriesinfo-"+g.label);
tag = e.getName();
String detailsLink = "";
if (g.getNumEntries() > 0)
{
detailsLink = String.format(
" %s",
g.label, g.label, detailsLabel);
}
doc.setOuterHTML(e, String.format("<%s>%s%s%s>",
tag, g.getNumEntries(), detailsLink, tag));
String errMess = g.getErrorMessages();
if (errMess != null)
{
doc.setOuterHTML(doc.getElement("error-"+g.label),
String.format("%s", errMess));
}
}
}
public void hyperlinkUpdate(HyperlinkEvent evt)
{
HyperlinkEvent.EventType type = evt.getEventType();
URL url = evt.getURL();
if (type == HyperlinkEvent.EventType.ACTIVATED)
{
if (url == null)
{
Glossary g = app.getGlossaries().getGlossary(evt.getDescription());
if (g != null)
{
new ViewEntries(app, g, app.getFont()).setVisible(true);
}
}
else
{
try
{
new ViewFile(url, app.getFont(), app).setVisible(true);
}
catch (Exception e)
{
app.error(e);
}
}
}
}
private MakeGlossariesGUI app;
}