]> gitweb.fperrin.net Git - GpsPrune.git/blobdiff - src/tim/prune/function/DiskCacheConfig.java
Moved source into separate src directory due to popular request
[GpsPrune.git] / src / tim / prune / function / DiskCacheConfig.java
diff --git a/src/tim/prune/function/DiskCacheConfig.java b/src/tim/prune/function/DiskCacheConfig.java
new file mode 100644 (file)
index 0000000..915bed1
--- /dev/null
@@ -0,0 +1,249 @@
+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);
+       }
+}