<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">/*
    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 &lt; n; i++)
      {
         Element e = Glossaries.getFieldLabelElement(doc, i);
         String tag = e.getName();

	 doc.setOuterHTML(e, String.format("&lt;%s&gt;%s&lt;/%s&gt;",
            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 &lt; 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("&lt;font class=errormess&gt;%s&lt;/font&gt;", err);
            }
            else
            {
               content = String.format(
                 "&lt;font class=error&gt;%s &lt;font class=errormess&gt;%s&lt;/font&gt;&lt;/font&gt;",
                  field, err);
            }
         }

         doc.setOuterHTML(e, String.format("&lt;td id=%s&gt;%s&lt;/td&gt;", 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 &lt; 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("&lt;%s&gt;%s&lt;/%s&gt;",
            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() &lt; gloFile.lastModified() ?
                app.getLabel("main.out_of_date"):
                app.getLabel("main.up_to_date"));
            doc.setOuterHTML(doc.getElement("logview-"+g.label),
                String.format("&lt;a href=\"%s\"&gt;%s&lt;/a&gt;", 
                   transFile.toURI(), viewLabel));
         }
         else
         {
            doc.setInnerHTML(doc.getElement("loginfo-"+g.label),
               String.format("&lt;font class=error&gt;%s&lt;/font&gt;", 
                 app.getLabel("error.no_such_file")));
         }

         e = doc.getElement("glslabel-"+g.label);
         tag = e.getName();

	 doc.setOuterHTML(e, String.format("&lt;%s&gt;%s&lt;/%s&gt;",
            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() &lt; gloFile.lastModified() ?
                app.getLabel("main.out_of_date"):
                app.getLabel("main.up_to_date")));
            doc.setOuterHTML(doc.getElement("glsview-"+g.label),
                String.format("&lt;a href=\"%s\"&gt;%s&lt;/a&gt;",
                   glsFile.toURI(), viewLabel));
         }
         else
         {
            doc.setInnerHTML(doc.getElement("glsinfo-"+g.label),
               String.format("&lt;font class=error&gt;%s&lt;/font&gt;", 
                  app.getLabel("error.no_such_file")));
         }

         e = doc.getElement("glolabel-"+g.label);
         tag = e.getName();

	 doc.setOuterHTML(e, String.format("&lt;%s&gt;%s&lt;/%s&gt;",
            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("&lt;a href=\"%s\"&gt;%s&lt;/a&gt;",
                  gloFile.toURI(), viewLabel));
         }
         else
         {
            doc.setInnerHTML(doc.getElement("gloinfo-"+g.label),
               String.format("&lt;font class=error&gt;%s&lt;/font&gt;",
                  app.getLabel("error.no_such_file")));
         }


         if (glossaries.useXindy())
         {
            e = doc.getElement("langlabel-"+g.label);
            tag = e.getName();

	    doc.setOuterHTML(e, String.format("&lt;%s&gt;%s&lt;/%s&gt;",
               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("&lt;%s&gt;%s&lt;/%s&gt;",
               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("&lt;%s&gt;%s&lt;/%s&gt;",
            tag, app.getLabel("main.num_entries"), tag));

         e = doc.getElement("entriesinfo-"+g.label);
         tag = e.getName();

         String detailsLink = "";

         if (g.getNumEntries() &gt; 0)
         {
            detailsLink = String.format(
              " &lt;a description=\"%s\" href=\"%s\"&gt;%s&lt;/a&gt;",
              g.label, g.label, detailsLabel);
         } 

	 doc.setOuterHTML(e, String.format("&lt;%s&gt;%s%s&lt;/%s&gt;",
            tag, g.getNumEntries(), detailsLink, tag));

         String errMess = g.getErrorMessages();

         if (errMess != null)
         {
            doc.setOuterHTML(doc.getElement("error-"+g.label), 
                String.format("&lt;font class=error&gt;%s&lt;/font&gt;", 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;
}
</pre></body></html>