/* * To change this template, choose Tools | Templates * and open the template in the editor. */ /* * ProfileManagerDialog.java * * Created on 10 juin 2010, 14:26:23 */ package com.gmail.dpierron.calibre.gui; import com.gmail.dpierron.calibre.configuration.ConfigurationManager; import com.gmail.dpierron.tools.i18n.Localization; import com.gmail.dpierron.tools.Helper; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import javax.swing.*; import java.io.File; /** * @author David Pierron */ public class ProfileManagerDialog extends javax.swing.JDialog { private final Logger logger = LogManager.getLogger(ProfileManagerDialog.class); private guiField[] guiFields; /** * Creates new form ProfileManagerDialog */ public ProfileManagerDialog(java.awt.Frame parent, boolean modal) { super(parent, modal); initComponents(); initGuiFields(); translateTexts(); } /** * Table that defines the GUI fields * Allows standardised handling of GUI fields to be applied with minimal developer effort * * There are a couple of different constructors supported to keep table definition clean. * The fields indicated as Optional are only included for the specific field type they relate to. * * Meaning/Use of the fields is: * * Field 1 Mandatory Field to which the label localisation should be applied * Can be set to null if no label localization required * Field 2 Mandatory Field in which value stored )if relevant). Can be same as field 1. * Also has tooltip localisation applied if .tooltip version of Field 3 found * so set field 1 to null if only tooltip to be set up. * Can be null for fields that do not held stored configuration values * Field 3 Mandatory Key for finding localization string. Any .label/.tooltip suffix is omitted * Can optionally have the .label added to the key in localization file * If key with .tooltip found in localization file this is assumed to be a tooltip * * Field 4 Optional Base name of the methods for loading/storing the the values in Field 2 * If the field only needs localisation, but not storing in the configuration * file then then there will be no method defined so only fields 1 to 3 defined. * * Field 5 Optional For checkboxes only. Indicate is displayed field is negated from config value * * Field 5 Optional Numeric fields. Indicates minimum value allowed * Field 6 Optional Numeric fields: Indicates maximum value allowed * * NOTE: If any new types are introduced for field 1 or field 2 then guiField class will * neeed to be updated to handle this new type in the standard way desired. */ private void initGuiFields() { guiFields = new guiField[] { // Main Windows new guiField(cmdNew, null, "gui.profile.new"), new guiField(cmdRename, null, "gui.profile.rename"), new guiField(cmdDelete, null, "gui.profile.delete"), new guiField(cmdClose, null, "gui.profile.close") }; } /** * Apply localization to this dialog */ private void translateTexts() { // Do translations that are handled by guiFields table for (guiField f : guiFields){ f.translateTexts(); } } /** * Display in a popup the tooltip associated with a label that the user has clicked on * This is for convenience in environments where the tootip is not conveniently displayed. * * @param label */ private void popupExplanation(JLabel label) { if (Helper.isNotNullOrEmpty(label.getToolTipText())) JOptionPane.showMessageDialog(this, label.getToolTipText(), Localization.Main.getText("gui.tooltip"), JOptionPane.INFORMATION_MESSAGE); } private void loadProfiles() { DefaultListModel listOfProfiles = new DefaultListModel(); for (String profile : ConfigurationManager.getExistingConfigurations()) { if ("default".equalsIgnoreCase(profile)) continue; listOfProfiles.addElement(profile); } lstProfiles.setModel(listOfProfiles); } private void renameProfile(int index) { if (index < 0 || index >= lstProfiles.getModel().getSize()) return; String profile = (String) lstProfiles.getModel().getElementAt(index); String newProfile = JOptionPane.showInputDialog(Localization.Main.getText("gui.profile.rename.msg", profile), profile); if ("default".equalsIgnoreCase(newProfile)) return; if (Helper.isNotNullOrEmpty(newProfile) && !newProfile.equals(profile)) { File profileFile = new File(ConfigurationManager.getConfigurationDirectory(), profile + ConfigurationManager.PROFILES_SUFFIX); if (profileFile.exists()) { profileFile.renameTo(new File(ConfigurationManager.getConfigurationDirectory(), newProfile + ConfigurationManager.PROFILES_SUFFIX)); // #c2o-10: If current profile is the one renamed then need to refresh main screen if (ConfigurationManager.getCurrentProfileName().equals(profile)) { ConfigurationManager.setCurrentProfileName(newProfile); } loadProfiles(); } } } private void deleteProfiles(int[] indices) { if (indices == null || indices.length == 0) return; for (int index : indices) { String profile = (String) lstProfiles.getModel().getElementAt(index); int result = JOptionPane .showConfirmDialog(this, Localization.Main.getText("gui.profile.delete.msg", profile), null, JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); if (result != JOptionPane.CANCEL_OPTION) { File profileFile = new File(ConfigurationManager.getConfigurationDirectory(), profile + ConfigurationManager.PROFILES_SUFFIX); if (profileFile.exists()) { profileFile.delete(); } } } loadProfiles(); } /** * This method is called from within the constructor to * reset the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; scrProfiles = new javax.swing.JScrollPane(); lstProfiles = new javax.swing.JList(); loadProfiles(); pnlButtons = new javax.swing.JPanel(); cmdNew = new javax.swing.JButton(); cmdRename = new javax.swing.JButton(); cmdDelete = new javax.swing.JButton(); pnlButtons1 = new javax.swing.JPanel(); cmdClose = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setTitle(Localization.Main.getText("gui.menu.profiles.manage")); // NOI18N getContentPane().setLayout(new java.awt.GridBagLayout()); scrProfiles.setViewportView(lstProfiles); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; getContentPane().add(scrProfiles, gridBagConstraints); cmdNew.setText("cmdNew"); cmdNew.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { cmdNewActionPerformed(evt); } }); pnlButtons.add(cmdNew); cmdRename.setText("cmdRename"); cmdRename.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { cmdRenameActionPerformed(evt); } }); pnlButtons.add(cmdRename); cmdDelete.setText("cmdDelete"); cmdDelete.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { cmdDeleteActionPerformed(evt); } }); pnlButtons.add(cmdDelete); cmdDelete.getAccessibleContext().setAccessibleName(null); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; getContentPane().add(pnlButtons, gridBagConstraints); cmdClose.setText("cmdClose"); cmdClose.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { cmdCloseActionPerformed(evt); } }); pnlButtons1.add(cmdClose); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridy = 5; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; getContentPane().add(pnlButtons1, gridBagConstraints); pack(); }// </editor-fold>//GEN-END:initComponents private void cmdRenameActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cmdRenameActionPerformed int index = lstProfiles.getSelectedIndex(); if (index < 0) { String msg = Localization.Main.getText("gui.profile.rename.select"); JOptionPane.showMessageDialog(this, msg, "", JOptionPane.WARNING_MESSAGE); return; } renameProfile(index); }//GEN-LAST:event_cmdRenameActionPerformed private void cmdDeleteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cmdDeleteActionPerformed int indices[] = lstProfiles.getSelectedIndices(); if (indices.length < 1) { String msg = Localization.Main.getText("gui.profile.delete.select"); JOptionPane.showMessageDialog(this, msg, "", JOptionPane.WARNING_MESSAGE); return; } deleteProfiles(indices); }//GEN-LAST:event_cmdDeleteActionPerformed private void cmdNewActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cmdNewActionPerformed String newProfileName = JOptionPane.showInputDialog(Localization.Main.getText("gui.profile.new.msg")); if ("default".equalsIgnoreCase(newProfileName)) return; ConfigurationManager.copyCurrentProfile(newProfileName); loadProfiles(); }//GEN-LAST:event_cmdNewActionPerformed private void cmdCloseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cmdCloseActionPerformed this.setVisible(false); }//GEN-LAST:event_cmdCloseActionPerformed /** * @param args the command line arguments */ public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { ProfileManagerDialog dialog = new ProfileManagerDialog(new javax.swing.JFrame(), true); dialog.addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent e) { System.exit(0); } }); dialog.setVisible(true); } }); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton cmdClose; private javax.swing.JButton cmdDelete; private javax.swing.JButton cmdNew; private javax.swing.JButton cmdRename; private javax.swing.JList lstProfiles; private javax.swing.JPanel pnlButtons; private javax.swing.JPanel pnlButtons1; private javax.swing.JScrollPane scrProfiles; // End of variables declaration//GEN-END:variables }