X-Git-Url: http://gitweb.fperrin.net/?p=GpsPrune.git;a=blobdiff_plain;f=src%2Ftim%2Fprune%2Ffunction%2FDiskCacheConfig.java;fp=src%2Ftim%2Fprune%2Ffunction%2FDiskCacheConfig.java;h=915bed1041bd6fdc7342c390ed70ab4575d4868c;hp=0000000000000000000000000000000000000000;hb=ce6f2161b8596f7018d6a76bff79bc9e571f35fd;hpb=2d8cb72e84d5cc1089ce77baf1e34ea3ea2f8465 diff --git a/src/tim/prune/function/DiskCacheConfig.java b/src/tim/prune/function/DiskCacheConfig.java new file mode 100644 index 0000000..915bed1 --- /dev/null +++ b/src/tim/prune/function/DiskCacheConfig.java @@ -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); + } +}