--- /dev/null
+package tim.prune.function;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.FlowLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyAdapter;
+import java.awt.event.KeyEvent;
+import java.io.File;
+
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JDialog;
+import javax.swing.JFileChooser;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+
+import tim.prune.App;
+import tim.prune.DataSubscriber;
+import tim.prune.GenericFunction;
+import tim.prune.I18nManager;
+import tim.prune.UpdateMessageBroker;
+import tim.prune.config.Config;
+import tim.prune.function.cache.ManageCacheFunction;
+
+/**
+ * Class to show the popup window for setting the path to disk cache
+ */
+public class DiskCacheConfig extends GenericFunction
+{
+ private JDialog _dialog = null;
+ private JCheckBox _cacheCheckbox = null;
+ private JTextField _cacheDirBox = null;
+ private JButton _browseButton = null;
+ private JButton _okButton = null, _manageButton = null;
+ private boolean _initialCheckState = false;
+ private String _initialCacheDir = null;
+
+ /**
+ * Constructor
+ * @param inApp app object
+ */
+ public DiskCacheConfig(App inApp)
+ {
+ super(inApp);
+ }
+
+ /**
+ * Return the name key for this function
+ */
+ public String getNameKey()
+ {
+ return "function.diskcache";
+ }
+
+ /**
+ * @return the contents of the window as a Component
+ */
+ private Component makeContents()
+ {
+ JPanel dialogPanel = new JPanel();
+ dialogPanel.setLayout(new BorderLayout(0, 5));
+ // top panel
+ JPanel topPanel = new JPanel();
+ _cacheCheckbox = new JCheckBox(I18nManager.getText("dialog.diskcache.save"));
+ _cacheCheckbox.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent arg0) {
+ enableButtons();
+ }
+ });
+ topPanel.add(_cacheCheckbox);
+ dialogPanel.add(topPanel, BorderLayout.NORTH);
+ // dir panel
+ JPanel dirPanel = new JPanel();
+ dirPanel.setLayout(new BorderLayout());
+ dirPanel.add(new JLabel(I18nManager.getText("dialog.diskcache.dir") + " : "), BorderLayout.WEST);
+ _cacheDirBox = new JTextField(24);
+ _cacheDirBox.addKeyListener(new KeyAdapter() {
+ public void keyReleased(KeyEvent arg0) {
+ super.keyReleased(arg0);
+ enableButtons();
+ }
+ });
+ dirPanel.add(_cacheDirBox, BorderLayout.CENTER);
+ _browseButton = new JButton(I18nManager.getText("button.browse"));
+ _browseButton.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent arg0) {
+ chooseDir();
+ }
+ });
+ dirPanel.add(_browseButton, BorderLayout.EAST);
+ // holder panel so it doesn't expand vertically
+ JPanel dirHolderPanel = new JPanel();
+ dirHolderPanel.setLayout(new BorderLayout());
+ dirHolderPanel.add(dirPanel, BorderLayout.NORTH);
+ dialogPanel.add(dirHolderPanel, BorderLayout.CENTER);
+
+ // OK, Cancel buttons at the bottom right
+ JPanel buttonPanelr = new JPanel();
+ buttonPanelr.setLayout(new FlowLayout(FlowLayout.RIGHT));
+ _okButton = new JButton(I18nManager.getText("button.ok"));
+ _okButton.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e)
+ {
+ finish();
+ _dialog.dispose();
+ }
+ });
+ buttonPanelr.add(_okButton);
+ JButton cancelButton = new JButton(I18nManager.getText("button.cancel"));
+ cancelButton.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e)
+ {
+ _dialog.dispose();
+ }
+ });
+ buttonPanelr.add(cancelButton);
+
+ // Manage button at the bottom left
+ JPanel buttonPanell = new JPanel();
+ buttonPanell.setLayout(new FlowLayout(FlowLayout.LEFT));
+ _manageButton = new JButton(I18nManager.getText("button.manage"));
+ _manageButton.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e)
+ {
+ finish();
+ new ManageCacheFunction(_app).begin();
+ }
+ });
+ buttonPanell.add(_manageButton);
+ // Put them together
+ JPanel buttonPanel = new JPanel();
+ buttonPanel.setLayout(new BorderLayout());
+ buttonPanel.add(buttonPanelr, BorderLayout.EAST);
+ buttonPanel.add(buttonPanell, BorderLayout.WEST);
+ dialogPanel.add(buttonPanel, BorderLayout.SOUTH);
+ return dialogPanel;
+ }
+
+ /**
+ * Enable or disable the buttons according to what's changed
+ */
+ private void enableButtons()
+ {
+ final boolean checkState = _cacheCheckbox.isSelected();
+ final String path = _cacheDirBox.getText();
+ _cacheDirBox.setEditable(checkState);
+ _browseButton.setEnabled(checkState);
+ boolean ok = false;
+ // If checkbox has stayed off then disable ok
+ if (!_initialCheckState && !checkState) {ok = false;}
+ else {
+ // If checkbox has been switched off then enable
+ if (!checkState) {ok = true;}
+ else
+ {
+ // checkbox is on, check value
+ if (path.equals("") || (_initialCacheDir != null && path.equals(_initialCacheDir))) {
+ // Value blank or same as before
+ ok = false;
+ }
+ else {
+ ok = true;
+ }
+ }
+ }
+ _okButton.setEnabled(ok);
+ // Manage button needs a valid cache
+ boolean cacheDirGood = false;
+ if (checkState && !path.equals(""))
+ {
+ File dir = new File(path);
+ cacheDirGood = dir.exists() && dir.canRead() && dir.isDirectory();
+ }
+ _manageButton.setEnabled(cacheDirGood);
+ }
+
+ /**
+ * Show window
+ */
+ public void begin()
+ {
+ if (_dialog == null)
+ {
+ _dialog = new JDialog(_parentFrame, I18nManager.getText(getNameKey()));
+ _dialog.setLocationRelativeTo(_parentFrame);
+ _dialog.getContentPane().add(makeContents());
+ _dialog.pack();
+ }
+ // Set controls according to current config
+ String currPath = Config.getConfigString(Config.KEY_DISK_CACHE);
+ _cacheCheckbox.setSelected(currPath != null);
+ _cacheDirBox.setText(currPath==null?"":currPath);
+ enableButtons();
+ // Remember current state
+ _initialCheckState = _cacheCheckbox.isSelected();
+ _dialog.setVisible(true);
+ }
+
+ /**
+ * Function activated by the "Browse..." button to select a directory for the cache
+ */
+ private void chooseDir()
+ {
+ JFileChooser chooser = new JFileChooser();
+ chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
+ // Set start path from currently selected dir
+ String path = _cacheDirBox.getText();
+ if (path.length() > 1) {chooser.setCurrentDirectory(new File(path));}
+ if (chooser.showOpenDialog(_parentFrame) == JFileChooser.APPROVE_OPTION)
+ {
+ _cacheDirBox.setText(chooser.getSelectedFile().getAbsolutePath());
+ }
+ enableButtons();
+ }
+
+ /**
+ * OK pressed, save selected settings in Config
+ */
+ private void finish()
+ {
+ String cachePath = (_cacheCheckbox.isSelected()?_cacheDirBox.getText():null);
+ // Create dir if it doesn't exist already and creation confirmed
+ if (cachePath != null)
+ {
+ File cacheDir = new File(cachePath);
+ if ((!cacheDir.exists() || !cacheDir.isDirectory()) && (JOptionPane.showConfirmDialog(_dialog,
+ I18nManager.getText("dialog.diskcache.createdir") + ": " + cacheDir.getAbsolutePath() + " ?",
+ I18nManager.getText(getNameKey()), JOptionPane.OK_CANCEL_OPTION) == JOptionPane.CANCEL_OPTION || !cacheDir.mkdir()))
+ {
+ JOptionPane.showMessageDialog(_dialog, I18nManager.getText("dialog.diskcache.nocreate"),
+ I18nManager.getText(getNameKey()), JOptionPane.WARNING_MESSAGE);
+ return;
+ }
+ // Check that the cache path is writable too, and give warning if not
+ if (cacheDir.exists() && cacheDir.isDirectory() && !cacheDir.canWrite())
+ {
+ JOptionPane.showMessageDialog(_dialog, I18nManager.getText("dialog.diskcache.cannotwrite"),
+ I18nManager.getText(getNameKey()), JOptionPane.WARNING_MESSAGE);
+ }
+ }
+ Config.setConfigString(Config.KEY_DISK_CACHE, cachePath);
+ // inform subscribers so that tiles are wiped from memory and refetched
+ UpdateMessageBroker.informSubscribers(DataSubscriber.MAPSERVER_CHANGED);
+ }
+}