package org.openstreetmap.josm.plugins.imagery_cachexport; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.GridBagLayout; import java.io.File; import java.util.Set; import javax.swing.JCheckBox; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import org.apache.commons.jcs.access.CacheAccess; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.data.cache.BufferedImageCacheEntry; import org.openstreetmap.josm.gui.ExtendedDialog; import org.openstreetmap.josm.gui.widgets.JosmTextField; import org.openstreetmap.josm.tools.GBC; /** * Dialog to specify the imagery export directory. The entered information is * stored in the JOSM preferences and used as default the next time the dialog * is displayed. */ public class ImageryTileExportDialog extends ExtendedDialog { private final static String EXPORT_DIR_PNAME = "imagery_cachexport.export_directory"; private final static String APPEND_NAME_PNAME = "imagery_cachexport.append_name"; private final JosmTextField exportDir = new JosmTextField(32); private final JCheckBox appendName = new JCheckBox(tr("Append cache name")); private final JLabel summary = new JLabel(); private final String cacheName; public ImageryTileExportDialog(final CacheAccess<String, BufferedImageCacheEntry> cache, final String cacheName, final String cacheKeyPrefix) { super(Main.parent, tr("Export Tiles"), new String[] {tr("Ok"), tr("Cancel")}); this.cacheName = cacheName; setButtonIcons(new String[] {"ok", "cancel"}); final JPanel content = new JPanel(new GridBagLayout()); content.add(new JLabel(tr("Cache name:")), GBC.std().insets(0, 0, 5, 0)); content.add(new JLabel(cacheName), GBC.eol()); content.add(new JLabel(tr("Object count:")), GBC.std().insets(0, 0, 5, 0)); Integer count = getObjectCount(cache, cacheKeyPrefix); content.add(new JLabel(count.toString()), GBC.eol()); exportDir.setHint(tr("file system path")); exportDir.setToolTipText(tr("File system path the tiles are exported to.")); exportDir.setText(Main.pref.get(EXPORT_DIR_PNAME, null)); exportDir.getDocument().addDocumentListener(new DocumentListener() { @Override public void changedUpdate(DocumentEvent e) { updateStatus(); } @Override public void removeUpdate(DocumentEvent e) { updateStatus(); } @Override public void insertUpdate(DocumentEvent e) { updateStatus(); } }); content.add(new JLabel(tr("Export directory:")), GBC.std().insets(0, 0, 5, 0)); content.add(exportDir, GBC.eol().fill(GBC.HORIZONTAL)); appendName.setToolTipText(tr("Append cache name to export directory.")); appendName.setSelected(Main.pref.getBoolean(APPEND_NAME_PNAME)); ChangeListener appendNameChangeListener = new ChangeListener() { @Override public void stateChanged(ChangeEvent changeEvent) { updateSummary(); } }; appendName.addChangeListener(appendNameChangeListener); content.add(appendName, GBC.eol().insets(0, 0, 5, 0)); updateSummary(); content.add(summary, GBC.eol().insets(0, 0, 5, 0)); // The false in the next line makes it a dynamic width, but the // scroll bars are gone... setContent(content, false); // Need to call setupDialog() to create the OK button. setupDialog(); updateOkButton(); showDialog(); } /** * Calculate the number of objects that are stored in the cache. * * @param cache Cache object. * @param cacheKeyPrefix Cache key prefix. * * @return The number of objects in the specified cache. */ public static int getObjectCount(final CacheAccess<String, BufferedImageCacheEntry> cache, final String cacheKeyPrefix) { // Code based on josm/gui/preferences/imagery/CacheContentsPanel.java. Set<String> keySet = cache.getCacheControl().getKeySet(); int counter = 0; for (String key: keySet) { String[] keyParts = key.split(":", 2); if (keyParts.length == 2) { if (cacheKeyPrefix.equals(keyParts[0])) { counter++; } } } return counter; } /** * Construct path of export directory. * * @return Export directory path. Returns {@code null} if no path was * specified in the dialog. */ public String getExportPath() { return getExportPath(null); } /** * Construct path of export directory. * * @param deflt Default path if no path was specified in the dialog. * * @return Export directory path. */ public String getExportPath(String deflt) { String exportDirText = exportDir.getText(); if (exportDirText.isEmpty()) { return deflt; } else if (appendName.isSelected()) { File path = new File(exportDirText, cacheName); return path.getAbsolutePath(); } else { return new File(exportDirText).getAbsolutePath(); } } /** * Construct string for dialog summary. * * @return Dialog summary string. */ private String getSummary() { final String exportPath = getExportPath(); if (exportPath != null) { return tr(// {0} is the directory path, it should be at the end of the message "Tiles will be exported to directory {0}", exportPath); } else { return tr("No export directory set."); } } /** * Update the dialog summary that shows the path the tiles are exported * to. */ private void updateSummary() { summary.setText(getSummary()); } /** * Update the status of the OK button. It will be grayed out if no valid * path is specified. */ private void updateOkButton() { if (exportDir.getText().isEmpty()) { setOkEnabled(false); } else { setOkEnabled(true); } } /** * Update all elements that indicate the dialog status. */ private void updateStatus() { updateSummary(); updateOkButton(); } /** * Enable or disable the OK button. It gets disabled if one of the * dialog fields has an error. * * @param enabled {@code true} if the OK button is enabled, * {@code false} if not. */ private void setOkEnabled(boolean enabled) { if (buttons != null && !buttons.isEmpty()) { buttons.get(0).setEnabled(enabled); } } /** * Store the entered information in the JOSM preferences. */ public void storePrefs() { Main.pref.put(EXPORT_DIR_PNAME, exportDir.getText()); Main.pref.put(APPEND_NAME_PNAME, appendName.isSelected()); } }