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); } }