package org.geopublishing.geopublisher.gui; import java.awt.Component; import java.awt.Font; import java.awt.event.ActionEvent; import java.io.File; import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Timer; import java.util.TimerTask; import javax.swing.AbstractAction; import javax.swing.DefaultListCellRenderer; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JScrollPane; import net.miginfocom.swing.MigLayout; import org.apache.commons.io.FileUtils; import org.geopublishing.atlasStyler.AtlasStylerVector; import org.geopublishing.geopublisher.AtlasConfigEditable; import org.geopublishing.geopublisher.GpUtil; import org.geopublishing.geopublisher.swing.GpSwingUtil; import org.opengis.filter.expression.Literal; import de.schmitzm.io.FilterUtil; import de.schmitzm.io.IOUtil; import de.schmitzm.lang.LangUtil; import de.schmitzm.swing.AtlasDialog; import de.schmitzm.swing.SwingUtil; /** * This dialog allows to manage the additional fonts usde in the atlas. */ public class ManageFontsDialog extends AtlasDialog { private final AtlasConfigEditable ace; private JList userFontsList; private final Timer scanFontFolderTimer; /** * This dialog is initialized modal and visible */ public ManageFontsDialog(Component owner, AtlasConfigEditable ace) { super(owner, GpUtil.R("ManageFontsDialog.title")); this.ace = ace; scanFontFolderTimer = new Timer(); scanFontFolderTimer.schedule(new TimerTask() { @Override public void run() { updateUserFontsList(); } }, 0, 1100); initGui(); pack(); setModal(true); // setVisible(true); } private void initGui() { setLayout(new MigLayout("wrap 1", "[,,400]")); add(new JLabel(GpSwingUtil.R("ManageFontsDialog.explanation.html", AtlasStylerVector.getDefaultFontFamilies().length, IOUtil.escapePath(ace.getFontsDir())))); add(new JLabel(GpSwingUtil.R("ManageFontsDialog.defaults.explanation"))); add(new JScrollPane(getDefaultFontsList()), "grow"); add(new JLabel(GpSwingUtil.R("ManageFontsDialog.userfonts.explanation"))); add(new JScrollPane(getUserFontsList()), "grow"); add(new JButton(new AbstractAction( GpSwingUtil.R("ManageFontsDialog.reloadFontFolder.label")) { @Override public void actionPerformed(ActionEvent arg0) { SwingUtil.openOSFolder(ace.getFontsDir()); } }), "span 2, split 2"); add(getOkButton(), "tag ok"); } @Override public boolean close() { scanFontFolderTimer.cancel(); ace.getFonts().clear(); ace.getFonts().addAll(Arrays.asList(fontsInFolder)); ace.registerFonts(); return super.close(); } private JList getDefaultFontsList() { JList defaultFontsList = new JList(AtlasStylerVector.getDefaultFontFamilies()); defaultFontsList.setCellRenderer(new DefaultListCellRenderer() { @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { Component listCellRendererComponent = super .getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); if (listCellRendererComponent instanceof JLabel) { JLabel jlabel = (JLabel) listCellRendererComponent; List<Literal> literals = (List<Literal>) value; String text = LangUtil.stringConcatWithSep(" => ", literals.toArray()); jlabel.setText(text); } return listCellRendererComponent; } }); return defaultFontsList; } private JList getUserFontsList() { if (userFontsList == null) { userFontsList = new JList(fontNamesInFolder); } return userFontsList; } public void updateUserFontsList() { scanFolderForFonts(); getUserFontsList().setListData(fontNamesInFolder); } // List of only the successfully read fonts in font folder Font[] fontsInFolder = new Font[0]; // One entry for every .ttf file in fonts folder, even if it could not be // read String[] fontNamesInFolder = new String[0]; private void scanFolderForFonts() { fontsInFolder = new Font[0]; fontNamesInFolder = new String[0]; Collection<File> listTtfFiles = FileUtils.listFiles(ace.getFontsDir(), GpUtil.FontsFilesFilter, FilterUtil.BlacklistedFoldersFilter); for (File f : listTtfFiles) { String relPath = f.getAbsolutePath().substring( ace.getFontsDir().getAbsolutePath().length() + 1); try { Font font = Font.createFont(Font.TRUETYPE_FONT, f); fontNamesInFolder = LangUtil.extendArray(fontNamesInFolder, font.getName()); fontsInFolder = LangUtil.extendArray(fontsInFolder, font); } catch (Exception e) { String errorLine = relPath + ", ERROR: " + e.getLocalizedMessage(); fontNamesInFolder = LangUtil.extendArray(fontNamesInFolder, errorLine); } } } }