X-Git-Url: http://source.jalview.org/gitweb/?p=jalview.git;a=blobdiff_plain;f=src%2Fjalview%2Fjbgui%2FGPreferences.java;h=61b2f24f4ae36b19eee8028cd73bd78eda8db363;hp=3fe1939c4d8d9cb2ad9b5c3df54db49132414d51;hb=f4b18ae31d37e694b59875f26e0863179de248f1;hpb=c25a5c7301fa43bec8da032f93898d6133391f8a diff --git a/src/jalview/jbgui/GPreferences.java b/src/jalview/jbgui/GPreferences.java index 3fe1939..61b2f24 100755 --- a/src/jalview/jbgui/GPreferences.java +++ b/src/jalview/jbgui/GPreferences.java @@ -20,13 +20,6 @@ */ package jalview.jbgui; -import jalview.fts.core.FTSDataColumnPreferences; -import jalview.fts.core.FTSDataColumnPreferences.PreferenceSource; -import jalview.fts.service.pdb.PDBFTSRestClient; -import jalview.gui.JvSwingUtils; -import jalview.gui.StructureViewer.ViewerType; -import jalview.util.MessageManager; - import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; @@ -42,12 +35,18 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import java.util.Arrays; +import java.util.List; import javax.swing.AbstractCellEditor; import javax.swing.BorderFactory; +import javax.swing.BoxLayout; import javax.swing.ButtonGroup; +import javax.swing.ComboBoxModel; +import javax.swing.DefaultComboBoxModel; import javax.swing.DefaultListCellRenderer; import javax.swing.JButton; import javax.swing.JCheckBox; @@ -55,12 +54,18 @@ import javax.swing.JComboBox; import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JPanel; +import javax.swing.JPasswordField; import javax.swing.JRadioButton; import javax.swing.JScrollPane; +import javax.swing.JSlider; +import javax.swing.JSpinner; import javax.swing.JTabbedPane; import javax.swing.JTable; +import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.ListSelectionModel; +import javax.swing.SpinnerModel; +import javax.swing.SpinnerNumberModel; import javax.swing.SwingConstants; import javax.swing.border.Border; import javax.swing.border.EmptyBorder; @@ -68,9 +73,31 @@ import javax.swing.border.EtchedBorder; import javax.swing.border.TitledBorder; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; +import jalview.bin.Cache; +import jalview.bin.Console; +import jalview.bin.MemorySetting; +import jalview.fts.core.FTSDataColumnPreferences; +import jalview.fts.core.FTSDataColumnPreferences.PreferenceSource; +import jalview.fts.service.pdb.PDBFTSRestClient; +import jalview.gui.Desktop; +import jalview.gui.JalviewBooleanRadioButtons; +import jalview.gui.JvOptionPane; +import jalview.gui.JvSwingUtils; +import jalview.gui.StructureViewer.ViewerType; +import jalview.io.BackupFilenameParts; +import jalview.io.BackupFiles; +import jalview.io.BackupFilesPresetEntry; +import jalview.io.IntKeyStringValueEntry; +import jalview.util.BrowserLauncher; +import jalview.util.MessageManager; +import jalview.util.Platform; +import jalview.util.StringUtils; + /** * Base class for the Preferences panel. * @@ -81,8 +108,11 @@ public class GPreferences extends JPanel { private static final Font LABEL_FONT = JvSwingUtils.getLabelFont(); - private static final Font LABEL_FONT_ITALIC = JvSwingUtils.getLabelFont( - false, true); + private static final Font LABEL_FONT_ITALIC = JvSwingUtils + .getLabelFont(false, true); + + private static final Font LABEL_FONT_BOLD = JvSwingUtils + .getLabelFont(true, false); /* * Visual tab components @@ -95,11 +125,13 @@ public class GPreferences extends JPanel protected JCheckBox rightAlign = new JCheckBox(); - protected JComboBox fontSizeCB = new JComboBox(); + protected JComboBox fontSizeCB = new JComboBox<>(); + + protected JComboBox fontStyleCB = new JComboBox<>(); - protected JComboBox fontStyleCB = new JComboBox(); + protected JComboBox fontNameCB = new JComboBox<>(); - protected JComboBox fontNameCB = new JComboBox(); + protected JCheckBox showOccupancy = new JCheckBox(); protected JCheckBox showUnconserved = new JCheckBox(); @@ -109,15 +141,15 @@ public class GPreferences extends JPanel protected JCheckBox scaleProteinToCdna = new JCheckBox(); - protected JComboBox gapSymbolCB = new JComboBox(); + protected JComboBox gapSymbolCB = new JComboBox<>(); protected JCheckBox wrap = new JCheckBox(); - protected JComboBox sortby = new JComboBox(); + protected JComboBox sortby = new JComboBox<>(); - protected JComboBox sortAnnBy = new JComboBox(); + protected JComboBox sortAnnBy = new JComboBox<>(); - protected JComboBox sortAutocalc = new JComboBox(); + protected JComboBox sortAutocalc = new JComboBox<>(); protected JCheckBox startupCheckbox = new JCheckBox(); @@ -151,15 +183,15 @@ public class GPreferences extends JPanel protected JCheckBox structFromPdb = new JCheckBox(); - protected JCheckBox useRnaView = new JCheckBox(); - protected JCheckBox addSecondaryStructure = new JCheckBox(); protected JCheckBox addTempFactor = new JCheckBox(); - protected JComboBox structViewer = new JComboBox(); + protected JComboBox structViewer = new JComboBox<>(); + + protected JLabel structureViewerPathLabel; - protected JTextField chimeraPath = new JTextField(); + protected JTextField structureViewerPath = new JTextField(); protected ButtonGroup mappingMethod = new ButtonGroup(); @@ -174,13 +206,28 @@ public class GPreferences extends JPanel protected JPanel maxColour = new JPanel(); - protected JComboBox protColour = new JComboBox(); + protected JComboBox protColour = new JComboBox<>(); + + protected JComboBox nucColour = new JComboBox<>(); + + /* + * Overview tab components + */ + protected JPanel gapColour = new JPanel(); + + protected JPanel hiddenColour = new JPanel(); + + protected JCheckBox useLegacyGap; - protected JComboBox nucColour = new JComboBox(); + protected JCheckBox showHiddenAtStart; + + protected JLabel gapLabel; /* * Connections tab components */ + protected JPanel connectTab; + protected JTable linkUrlTable = new JTable(); protected JButton editLink = new JButton(); @@ -193,17 +240,49 @@ public class GPreferences extends JPanel protected JButton userOnly = new JButton(); + protected JLabel httpLabel = new JLabel(); + + protected JLabel httpsLabel = new JLabel(); + protected JLabel portLabel = new JLabel(); protected JLabel serverLabel = new JLabel(); - protected JTextField proxyServerTB = new JTextField(); + protected JLabel portLabel2 = new JLabel(); + + protected JLabel serverLabel2 = new JLabel(); + + protected JLabel proxyAuthUsernameLabel = new JLabel(); + + protected JLabel proxyAuthPasswordLabel = new JLabel(); + + protected JLabel passwordNotStoredLabel = new JLabel(); - protected JTextField proxyPortTB = new JTextField(); + protected JTextField proxyServerHttpTB = new JTextField(); - protected JTextField defaultBrowser = new JTextField(); + protected JTextField proxyPortHttpTB = new JTextField(); - protected JCheckBox useProxy = new JCheckBox(); + protected JTextField proxyServerHttpsTB = new JTextField(); + + protected JTextField proxyPortHttpsTB = new JTextField(); + + protected JCheckBox proxyAuth = new JCheckBox(); + + protected JTextField proxyAuthUsernameTB = new JTextField(); + + protected JPasswordField proxyAuthPasswordPB = new JPasswordField(); + + protected JComboBox defaultBrowser = new JComboBox(); + + protected ButtonGroup proxyType = new ButtonGroup(); + + protected JRadioButton noProxy = new JRadioButton(); + + protected JRadioButton systemProxy = new JRadioButton(); + + protected JRadioButton customProxy = new JRadioButton(); + + protected JButton applyProxyButton = new JButton(); protected JCheckBox usagestats = new JCheckBox(); @@ -214,7 +293,11 @@ public class GPreferences extends JPanel /* * Output tab components */ - protected JComboBox epsRendering = new JComboBox(); + protected JComboBox epsRendering = new JComboBox<>(); + + protected JComboBox htmlRendering = new JComboBox<>(); + + protected JComboBox svgRendering = new JComboBox<>(); protected JLabel userIdWidthlabel = new JLabel(); @@ -250,14 +333,83 @@ public class GPreferences extends JPanel protected JCheckBox sortByTree = new JCheckBox(); /* - * DAS Settings tab + * Web Services tab */ - protected JPanel dasTab = new JPanel(); + protected JPanel wsTab = new JPanel(); /* - * Web Services tab + * Backups tab components + * a lot of these are member variables instead of local variables only so that they + * can be enabled/disabled easily in one go */ - protected JPanel wsTab = new JPanel(); + + protected JCheckBox enableBackupFiles = new JCheckBox(); + + protected JPanel presetsPanel = new JPanel(); + + protected JLabel presetsComboLabel = new JLabel(); + + protected JCheckBox customiseCheckbox = new JCheckBox(); + + protected JButton revertButton = new JButton(); + + protected JComboBox backupfilesPresetsCombo = new JComboBox<>(); + + private int backupfilesPresetsComboLastSelected = 0; + + protected JPanel suffixPanel = new JPanel(); + + protected JPanel keepfilesPanel = new JPanel(); + + protected JPanel exampleFilesPanel = new JPanel(); + + protected JTextField suffixTemplate = new JTextField(null, 8); + + protected JLabel suffixTemplateLabel = new JLabel(); + + protected JLabel suffixDigitsLabel = new JLabel(); + + protected JSpinner suffixDigitsSpinner = new JSpinner(); + + protected JalviewBooleanRadioButtons suffixReverse = new JalviewBooleanRadioButtons(); + + protected JalviewBooleanRadioButtons backupfilesKeepAll = new JalviewBooleanRadioButtons(); + + public JSpinner backupfilesRollMaxSpinner = new JSpinner(); + + protected JLabel oldBackupFilesLabel = new JLabel(); + + protected JalviewBooleanRadioButtons backupfilesConfirmDelete = new JalviewBooleanRadioButtons(); + + protected JTextArea backupfilesExampleLabel = new JTextArea(); + + private final JTabbedPane tabbedPane = new JTabbedPane(); + + private JLabel messageLabel = new JLabel("", JLabel.CENTER); + + /* + * Startup tab components + */ + + protected JCheckBox customiseMemorySetting = new JCheckBox(); + + protected JLabel exampleMemoryLabel = new JLabel(); + + protected JTextArea exampleMemoryMessageTextArea = new JTextArea(); + + protected JLabel maxMemoryLabel = new JLabel(); + + protected JLabel jvmMemoryPercentLabel = new JLabel(); + + protected JSlider jvmMemoryPercentSlider = new JSlider(); + + protected JLabel jvmMemoryPercentDisplay = new JLabel(); + + protected JLabel jvmMemoryMaxLabel = new JLabel(); + + protected JTextField jvmMemoryMaxTextField = new JTextField(null, 8); + + protected JComboBox lafCombo = new JComboBox<>(); /** * Creates a new GPreferences object. @@ -280,8 +432,12 @@ public class GPreferences extends JPanel */ private void jbInit() throws Exception { - final JTabbedPane tabbedPane = new JTabbedPane(); + // final JTabbedPane tabbedPane = new JTabbedPane(); this.setLayout(new BorderLayout()); + + // message label at top + this.add(messageLabel, BorderLayout.NORTH); + JPanel okCancelPanel = initOkCancelPanel(); this.add(tabbedPane, BorderLayout.CENTER); this.add(okCancelPanel, BorderLayout.SOUTH); @@ -292,33 +448,46 @@ public class GPreferences extends JPanel tabbedPane.add(initColoursTab(), MessageManager.getString("label.colours")); + tabbedPane.add(initOverviewTab(), + MessageManager.getString("label.overview")); + tabbedPane.add(initStructureTab(), MessageManager.getString("label.structure")); tabbedPane.add(initConnectionsTab(), MessageManager.getString("label.connections")); + if (!Platform.isJS()) + { + tabbedPane.add(initBackupsTab(), + MessageManager.getString("label.backups")); + } + + tabbedPane.add(initLinksTab(), + MessageManager.getString("label.urllinks")); + tabbedPane.add(initOutputTab(), MessageManager.getString("label.output")); tabbedPane.add(initEditingTab(), MessageManager.getString("label.editing")); - /* - * See DasSourceBrowser for the real work of configuring this tab. - */ - dasTab.setLayout(new BorderLayout()); - tabbedPane.add(dasTab, MessageManager.getString("label.das_settings")); + tabbedPane.add(initStartupTab(), + MessageManager.getString("label.startup")); /* * See WsPreferences for the real work of configuring this tab. */ - wsTab.setLayout(new BorderLayout()); - tabbedPane.add(wsTab, MessageManager.getString("label.web_services")); + if (!Platform.isJS()) + { + wsTab.setLayout(new BorderLayout()); + tabbedPane.add(wsTab, MessageManager.getString("label.web_services")); + } /* * Handler to validate a tab before leaving it - currently only for * Structure. + * Adding a clearMessage() so messages are cleared when changing tabs. */ tabbedPane.addChangeListener(new ChangeListener() { @@ -337,11 +506,63 @@ public class GPreferences extends JPanel } } lastTab = tabbedPane.getSelectedComponent(); + + clearMessage(); } }); } + public void setMessage(String message) + { + if (message != null) + { + messageLabel.setText(message); + messageLabel.setFont(LABEL_FONT_BOLD); + messageLabel.setForeground(Color.RED.darker()); + messageLabel.revalidate(); + messageLabel.repaint(); + } + // note message not cleared if message is null. call clearMessage() + // directly. + this.revalidate(); + this.repaint(); + } + + public void clearMessage() + { + // only repaint if message exists + if (messageLabel.getText() != null + && messageLabel.getText().length() > 0) + { + messageLabel.setText(""); + messageLabel.revalidate(); + messageLabel.repaint(); + this.revalidate(); + this.repaint(); + } + } + + public static enum TabRef + { + CONNECTIONS_TAB, STRUCTURE_TAB + }; + + public void selectTab(TabRef selectTab) + { + // select a given tab - currently only for Connections + switch (selectTab) + { + case CONNECTIONS_TAB: + tabbedPane.setSelectedComponent(connectTab); + break; + case STRUCTURE_TAB: + tabbedPane.setSelectedComponent(structureTab); + break; + default: + } + } + /** * Initialises the Editing tabbed panel. * @@ -352,18 +573,18 @@ public class GPreferences extends JPanel JPanel editingTab = new JPanel(); editingTab.setLayout(null); autoCalculateConsCheck.setFont(LABEL_FONT); - autoCalculateConsCheck.setText(MessageManager - .getString("label.autocalculate_consensus")); + autoCalculateConsCheck.setText( + MessageManager.getString("label.autocalculate_consensus")); autoCalculateConsCheck.setBounds(new Rectangle(21, 52, 209, 23)); padGaps.setFont(LABEL_FONT); - padGaps.setText(MessageManager.getString("label.pad_gaps_when_editing")); + padGaps.setText( + MessageManager.getString("label.pad_gaps_when_editing")); padGaps.setBounds(new Rectangle(22, 94, 168, 23)); sortByTree.setFont(LABEL_FONT); sortByTree .setText(MessageManager.getString("label.sort_with_new_tree")); - sortByTree - .setToolTipText(MessageManager - .getString("label.any_trees_calculated_or_loaded_alignment_automatically_sort")); + sortByTree.setToolTipText(MessageManager.getString( + "label.any_trees_calculated_or_loaded_alignment_automatically_sort")); sortByTree.setBounds(new Rectangle(22, 136, 168, 23)); editingTab.add(autoCalculateConsCheck); editingTab.add(padGaps); @@ -372,7 +593,7 @@ public class GPreferences extends JPanel } /** - * Initialises the Output tabbed panel. + * Initialises the Output tab * * @return */ @@ -380,18 +601,35 @@ public class GPreferences extends JPanel { JPanel outputTab = new JPanel(); outputTab.setLayout(null); - JLabel epsLabel = new JLabel(); + + JLabel epsLabel = new JLabel( + MessageManager.formatMessage("label.rendering_style", "EPS")); epsLabel.setFont(LABEL_FONT); epsLabel.setHorizontalAlignment(SwingConstants.RIGHT); - epsLabel.setText(MessageManager.getString("label.eps_rendering_style")); - epsLabel.setBounds(new Rectangle(9, 31, 140, 24)); + epsLabel.setBounds(new Rectangle(9, 31, 160, 24)); epsRendering.setFont(LABEL_FONT); - epsRendering.setBounds(new Rectangle(154, 34, 187, 21)); + epsRendering.setBounds(new Rectangle(174, 34, 187, 21)); + JLabel htmlLabel = new JLabel( + MessageManager.formatMessage("label.rendering_style", "HTML")); + htmlLabel.setFont(LABEL_FONT); + htmlLabel.setHorizontalAlignment(SwingConstants.RIGHT); + htmlLabel.setBounds(new Rectangle(9, 55, 160, 24)); + htmlRendering.setFont(LABEL_FONT); + htmlRendering.setBounds(new Rectangle(174, 58, 187, 21)); + JLabel svgLabel = new JLabel( + MessageManager.formatMessage("label.rendering_style", "SVG")); + svgLabel.setFont(LABEL_FONT); + svgLabel.setHorizontalAlignment(SwingConstants.RIGHT); + svgLabel.setBounds(new Rectangle(9, 79, 160, 24)); + svgRendering.setFont(LABEL_FONT); + svgRendering.setBounds(new Rectangle(174, 82, 187, 21)); + JLabel jLabel1 = new JLabel(); jLabel1.setFont(LABEL_FONT); jLabel1.setHorizontalAlignment(SwingConstants.CENTER); jLabel1.setText(MessageManager.getString("label.append_start_end")); jLabel1.setFont(LABEL_FONT); + fastajv.setFont(LABEL_FONT); fastajv.setHorizontalAlignment(SwingConstants.LEFT); clustaljv.setText(MessageManager.getString("label.clustal") + " "); @@ -408,7 +646,7 @@ public class GPreferences extends JPanel TitledBorder titledBorder2 = new TitledBorder( MessageManager.getString("label.file_output")); jPanel11.setBorder(titledBorder2); - jPanel11.setBounds(new Rectangle(30, 72, 196, 182)); + jPanel11.setBounds(new Rectangle(30, 120, 196, 182)); GridLayout gridLayout3 = new GridLayout(); jPanel11.setLayout(gridLayout3); gridLayout3.setRows(8); @@ -423,12 +661,11 @@ public class GPreferences extends JPanel pirjv.setFont(LABEL_FONT); pirjv.setHorizontalAlignment(SwingConstants.LEFT); autoIdWidth.setFont(LABEL_FONT); - autoIdWidth.setText(MessageManager - .getString("label.automatically_set_id_width")); - autoIdWidth.setToolTipText(JvSwingUtils.wrapTooltip(true, - MessageManager - .getString("label.adjusts_width_generated_eps_png"))); - autoIdWidth.setBounds(new Rectangle(228, 96, 188, 23)); + autoIdWidth.setText( + MessageManager.getString("label.automatically_set_id_width")); + autoIdWidth.setToolTipText(JvSwingUtils.wrapTooltip(true, MessageManager + .getString("label.adjusts_width_generated_eps_png"))); + autoIdWidth.setBounds(new Rectangle(228, 144, 320, 23)); autoIdWidth.addActionListener(new ActionListener() { @@ -439,18 +676,17 @@ public class GPreferences extends JPanel } }); userIdWidthlabel.setFont(LABEL_FONT); - userIdWidthlabel.setText(MessageManager - .getString("label.figure_id_column_width")); - userIdWidth - .setToolTipText(JvSwingUtils.wrapTooltip(true, MessageManager - .getString("label.manually_specify_width_left_column"))); - userIdWidthlabel - .setToolTipText(JvSwingUtils.wrapTooltip(true, MessageManager - .getString("label.manually_specify_width_left_column"))); - userIdWidthlabel.setBounds(new Rectangle(236, 120, 168, 23)); + userIdWidthlabel.setText( + MessageManager.getString("label.figure_id_column_width")); + userIdWidth.setToolTipText(JvSwingUtils.wrapTooltip(true, MessageManager + .getString("label.manually_specify_width_left_column"))); + userIdWidthlabel.setToolTipText( + JvSwingUtils.wrapTooltip(true, MessageManager.getString( + "label.manually_specify_width_left_column"))); + userIdWidthlabel.setBounds(new Rectangle(236, 168, 320, 23)); userIdWidth.setFont(JvSwingUtils.getTextAreaFont()); userIdWidth.setText(""); - userIdWidth.setBounds(new Rectangle(232, 144, 84, 23)); + userIdWidth.setBounds(new Rectangle(232, 192, 84, 23)); userIdWidth.addActionListener(new ActionListener() { @@ -461,12 +697,12 @@ public class GPreferences extends JPanel } }); modellerOutput.setFont(LABEL_FONT); - modellerOutput.setText(MessageManager - .getString("label.use_modeller_output")); - modellerOutput.setBounds(new Rectangle(228, 226, 168, 23)); + modellerOutput + .setText(MessageManager.getString("label.use_modeller_output")); + modellerOutput.setBounds(new Rectangle(228, 274, 320, 23)); embbedBioJSON.setFont(LABEL_FONT); embbedBioJSON.setText(MessageManager.getString("label.embbed_biojson")); - embbedBioJSON.setBounds(new Rectangle(228, 200, 250, 23)); + embbedBioJSON.setBounds(new Rectangle(228, 248, 250, 23)); jPanel11.add(jLabel1); jPanel11.add(blcjv); @@ -480,9 +716,19 @@ public class GPreferences extends JPanel outputTab.add(userIdWidth); outputTab.add(userIdWidthlabel); outputTab.add(modellerOutput); - outputTab.add(embbedBioJSON); - outputTab.add(epsLabel); - outputTab.add(epsRendering); + if (!Platform.isJS()) + { + /* + * JalviewJS doesn't support Lineart option or SVG output + */ + outputTab.add(embbedBioJSON); + outputTab.add(epsLabel); + outputTab.add(epsRendering); + outputTab.add(htmlLabel); + outputTab.add(htmlRendering); + outputTab.add(svgLabel); + outputTab.add(svgRendering); + } outputTab.add(jPanel11); return outputTab; } @@ -494,18 +740,20 @@ public class GPreferences extends JPanel */ private JPanel initConnectionsTab() { - JPanel connectTab = new JPanel(); + connectTab = new JPanel(); connectTab.setLayout(new GridBagLayout()); // Label for browser text box JLabel browserLabel = new JLabel(); browserLabel.setFont(LABEL_FONT); browserLabel.setHorizontalAlignment(SwingConstants.TRAILING); - browserLabel.setText(MessageManager - .getString("label.default_browser_unix")); + browserLabel.setText( + MessageManager.getString("label.default_browser_unix_windows")); defaultBrowser.setFont(LABEL_FONT); - defaultBrowser.setText(""); - + final String tooltip = JvSwingUtils.wrapTooltip(true, + MessageManager.getString("label.double_click_to_browse")); + defaultBrowser.setToolTipText(tooltip); + /* defaultBrowser.addMouseListener(new MouseAdapter() { @Override @@ -517,184 +765,130 @@ public class GPreferences extends JPanel } } }); + */ JPanel proxyPanel = initConnTabProxyPanel(); - JPanel linkPanel = initConnTabUrlLinks(); initConnTabCheckboxes(); - // Add URL link panel - connectTab.add(linkPanel, new GridBagConstraints(0, 0, 2, 1, 2.0, 2.0, - GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets( - 16, 0, 0, 12), 359, 32)); - // Add default Browser text box - connectTab.add(browserLabel, new GridBagConstraints(0, 1, 1, 1, 0.0, - 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, - new Insets(10, 0, 0, 0), 5, 1)); + connectTab.add(browserLabel, + new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, + GridBagConstraints.WEST, GridBagConstraints.NONE, + new Insets(10, 0, 5, 5), 5, 1)); + defaultBrowser.setFont(LABEL_FONT); - connectTab.add(defaultBrowser, new GridBagConstraints(1, 1, 1, 1, 1.0, - 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, - new Insets(10, 0, 0, 10), 307, 1)); + ComboBoxModel cbModel = new DefaultComboBoxModel( + BrowserLauncher.getInstance().getBrowserList().toArray()); + String browserPref = Cache.getProperty("DEFAULT_BROWSER"); + if (browserPref != null) + { + cbModel.setSelectedItem(browserPref); + } + defaultBrowser.setModel(cbModel); + + connectTab.add(defaultBrowser, new GridBagConstraints(1, 0, 1, 1, 1.0, + 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, + new Insets(10, 0, 5, 10), 30, 1)); // Add proxy server panel - connectTab.add(proxyPanel, new GridBagConstraints(0, 2, 2, 1, 1.0, 0.0, + connectTab.add(proxyPanel, new GridBagConstraints(0, 1, 2, 1, 1.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, - new Insets(10, 0, 0, 12), 4, 10)); + new Insets(10, 0, 5, 12), 4, 10)); // Add usage stats, version check and questionnaire checkboxes - connectTab.add(usagestats, new GridBagConstraints(0, 3, 1, 1, 1.0, 0.0, - GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, - new Insets(0, 2, 4, 2), 70, 1)); - connectTab.add(questionnaire, new GridBagConstraints(1, 3, 1, 1, 1.0, - 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, - new Insets(0, 2, 4, 10), 70, 1)); - connectTab.add(versioncheck, new GridBagConstraints(0, 4, 1, 1, 1.0, - 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, - new Insets(0, 2, 4, 2), 70, 1)); + connectTab.add(usagestats, + new GridBagConstraints(0, 2, 1, 1, 1.0, 0.0, + GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, + new Insets(0, 2, 5, 5), 70, 1)); + connectTab.add(questionnaire, + new GridBagConstraints(1, 2, 1, 1, 1.0, 0.0, + GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, + new Insets(0, 2, 5, 10), 70, 1)); + connectTab.add(versioncheck, + new GridBagConstraints(0, 3, 1, 1, 1.0, 0.0, + GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, + new Insets(0, 2, 5, 5), 70, 1)); + + versioncheck.setVisible(false); + + // Add padding so the panel doesn't look ridiculous + JPanel spacePanel = new JPanel(); + connectTab.add(spacePanel, + new GridBagConstraints(0, 4, 1, 1, 1.0, 1.0, + GridBagConstraints.WEST, GridBagConstraints.BOTH, + new Insets(0, 0, 0, 5), 70, 1)); + return connectTab; } /** - * Initialises the proxy server panel in the Connections tab + * Initialises the Links tabbed panel. * - * @return the proxy server panel - */ - private JPanel initConnTabProxyPanel() - { - // Label for server text box - serverLabel.setText(MessageManager.getString("label.address")); - serverLabel.setHorizontalAlignment(SwingConstants.RIGHT); - serverLabel.setFont(LABEL_FONT); - - // Proxy server and port text boxes - proxyServerTB.setFont(LABEL_FONT); - proxyPortTB.setFont(LABEL_FONT); - - // Label for Port text box - portLabel.setFont(LABEL_FONT); - portLabel.setHorizontalAlignment(SwingConstants.RIGHT); - portLabel.setText(MessageManager.getString("label.port")); - - // Use proxy server checkbox - useProxy.setFont(LABEL_FONT); - useProxy.setHorizontalAlignment(SwingConstants.RIGHT); - useProxy.setHorizontalTextPosition(SwingConstants.LEADING); - useProxy.setText(MessageManager.getString("label.use_proxy_server")); - useProxy.addActionListener(new ActionListener() - { - @Override - public void actionPerformed(ActionEvent e) - { - useProxy_actionPerformed(); - } - }); - - // Make proxy server panel - JPanel proxyPanel = new JPanel(); - TitledBorder titledBorder1 = new TitledBorder( - MessageManager.getString("label.proxy_server")); - proxyPanel.setBorder(titledBorder1); - proxyPanel.setLayout(new GridBagLayout()); - proxyPanel.add(serverLabel, new GridBagConstraints(0, 1, 1, 1, 0.0, - 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, - new Insets(0, 2, 2, 0), 5, 0)); - proxyPanel.add(portLabel, new GridBagConstraints(2, 1, 1, 1, 0.0, 0.0, - GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, - 0, 2, 0), 11, 0)); - proxyPanel.add(useProxy, new GridBagConstraints(0, 0, 2, 1, 0.0, 0.0, - GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, - 2, 5, 185), 2, -4)); - proxyPanel.add(proxyPortTB, new GridBagConstraints(3, 1, 1, 1, 1.0, - 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, - new Insets(0, 2, 2, 2), 54, 1)); - proxyPanel.add(proxyServerTB, new GridBagConstraints(1, 1, 1, 1, 1.0, - 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, - new Insets(0, 2, 2, 0), 263, 1)); - - return proxyPanel; - } - - /** - * Initialises the checkboxes in the Connections tab + * @return */ - private void initConnTabCheckboxes() + private JPanel initLinksTab() { - // Usage stats checkbox label - usagestats.setText(MessageManager - .getString("label.send_usage_statistics")); - usagestats.setFont(LABEL_FONT); - usagestats.setHorizontalAlignment(SwingConstants.RIGHT); - usagestats.setHorizontalTextPosition(SwingConstants.LEADING); - - // Questionnaire checkbox label - questionnaire.setText(MessageManager - .getString("label.check_for_questionnaires")); - questionnaire.setFont(LABEL_FONT); - questionnaire.setHorizontalAlignment(SwingConstants.RIGHT); - questionnaire.setHorizontalTextPosition(SwingConstants.LEADING); - - // Check for latest version checkbox label - versioncheck.setText(MessageManager - .getString("label.check_for_latest_version")); - versioncheck.setFont(LABEL_FONT); - versioncheck.setHorizontalAlignment(SwingConstants.RIGHT); - versioncheck.setHorizontalTextPosition(SwingConstants.LEADING); - } + JPanel linkTab = new JPanel(); + linkTab.setLayout(new GridBagLayout()); - /** - * Initialises the URL links panel in the Connection tab - * - * @return the URL links panel - */ - private JPanel initConnTabUrlLinks() - { // Set up table for Url links + linkUrlTable.getTableHeader().setReorderingAllowed(false); linkUrlTable.setFillsViewportHeight(true); linkUrlTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); linkUrlTable.setAutoCreateRowSorter(true); linkUrlTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + // adjust row height so radio buttons actually fit + // don't do this in the renderer, it causes the awt thread to activate + // constantly + JRadioButton temp = new JRadioButton(); + linkUrlTable.setRowHeight(temp.getMinimumSize().height); + // Table in scrollpane so that the table is given a scrollbar JScrollPane linkScrollPane = new JScrollPane(linkUrlTable); linkScrollPane.setBorder(null); // Panel for links functionality JPanel linkPanel = new JPanel(new GridBagLayout()); - linkPanel.setBorder(new TitledBorder(MessageManager - .getString("label.url_linkfrom_sequence_id"))); + linkPanel.setBorder(new TitledBorder( + MessageManager.getString("label.url_linkfrom_sequence_id"))); // Put the Url links panel together // Buttons go at top right, resizing only resizes the blank space vertically - JPanel buttonPanel = initConnTabUrlButtons(); + JPanel buttonPanel = initLinkTabUrlButtons(); GridBagConstraints linkConstraints1 = new GridBagConstraints(); - linkConstraints1.gridx = 1; + linkConstraints1.insets = new Insets(0, 0, 5, 0); + linkConstraints1.gridx = 0; linkConstraints1.gridy = 0; - linkConstraints1.fill = GridBagConstraints.VERTICAL; - linkPanel.add(buttonPanel, linkConstraints1); + linkConstraints1.weightx = 1.0; + linkConstraints1.fill = GridBagConstraints.HORIZONTAL; + linkTab.add(buttonPanel, linkConstraints1); // Links table goes at top left, resizing resizes the table GridBagConstraints linkConstraints2 = new GridBagConstraints(); + linkConstraints2.insets = new Insets(0, 0, 5, 5); linkConstraints2.gridx = 0; - linkConstraints2.gridy = 0; + linkConstraints2.gridy = 1; linkConstraints2.weightx = 1.0; linkConstraints2.weighty = 1.0; linkConstraints2.fill = GridBagConstraints.BOTH; - linkPanel.add(linkScrollPane, linkConstraints2); + linkTab.add(linkScrollPane, linkConstraints2); // Filter box and buttons goes at bottom left, resizing resizes the text box - JPanel filterPanel = initConnTabFilterPanel(); + JPanel filterPanel = initLinkTabFilterPanel(); GridBagConstraints linkConstraints3 = new GridBagConstraints(); + linkConstraints3.insets = new Insets(0, 0, 0, 5); linkConstraints3.gridx = 0; - linkConstraints3.gridy = 1; + linkConstraints3.gridy = 2; linkConstraints3.weightx = 1.0; linkConstraints3.fill = GridBagConstraints.HORIZONTAL; - linkPanel.add(filterPanel, linkConstraints3); + linkTab.add(filterPanel, linkConstraints3); - return linkPanel; + return linkTab; } - private JPanel initConnTabFilterPanel() + private JPanel initLinkTabFilterPanel() { // Filter textbox and reset button JLabel filterLabel = new JLabel( @@ -706,11 +900,12 @@ public class GPreferences extends JPanel filterTB.setFont(LABEL_FONT); filterTB.setText(""); - doReset.setText(MessageManager.getString("action.reset")); + doReset.setText(MessageManager.getString("action.showall")); userOnly.setText(MessageManager.getString("action.customfilter")); // Panel for filter functionality JPanel filterPanel = new JPanel(new GridBagLayout()); + filterPanel.setBorder(new TitledBorder("Filter")); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; @@ -720,21 +915,21 @@ public class GPreferences extends JPanel filterPanel.add(filterLabel, gbc); GridBagConstraints gbc1 = new GridBagConstraints(); - gbc1.gridx = 0; gbc1.gridx = 1; + gbc1.gridwidth = 2; gbc1.fill = GridBagConstraints.HORIZONTAL; gbc1.anchor = GridBagConstraints.WEST; gbc1.weightx = 1.0; filterPanel.add(filterTB, gbc1); GridBagConstraints gbc2 = new GridBagConstraints(); - gbc2.gridx = 2; + gbc2.gridx = 3; gbc2.fill = GridBagConstraints.NONE; gbc2.anchor = GridBagConstraints.WEST; filterPanel.add(doReset, gbc2); GridBagConstraints gbc3 = new GridBagConstraints(); - gbc3.gridx = 3; + gbc3.gridx = 4; gbc3.fill = GridBagConstraints.NONE; gbc3.anchor = GridBagConstraints.WEST; filterPanel.add(userOnly, gbc3); @@ -742,11 +937,20 @@ public class GPreferences extends JPanel return filterPanel; } - private JPanel initConnTabUrlButtons() + private JPanel initLinkTabUrlButtons() { // Buttons for new / edit / delete Url links JButton newLink = new JButton(); newLink.setText(MessageManager.getString("action.new")); + + editLink.setText(MessageManager.getString("action.edit")); + + deleteLink.setText(MessageManager.getString("action.delete")); + + // no current selection, so initially disable delete/edit buttons + editLink.setEnabled(false); + deleteLink.setEnabled(false); + newLink.addActionListener(new java.awt.event.ActionListener() { @Override @@ -776,66 +980,476 @@ public class GPreferences extends JPanel } }); - // no current selection, so initially disable delete/edit buttons - editLink.setEnabled(false); - deleteLink.setEnabled(false); + JPanel buttonPanel = new JPanel(new GridBagLayout()); + buttonPanel.setBorder(new TitledBorder("Edit links")); + GridBagConstraints gbc = new GridBagConstraints(); + gbc.gridx = 0; + gbc.gridy = 0; + gbc.fill = GridBagConstraints.NONE; + buttonPanel.add(newLink, gbc); + + GridBagConstraints gbc1 = new GridBagConstraints(); + gbc1.gridx = 1; + gbc1.gridy = 0; + gbc1.fill = GridBagConstraints.NONE; + buttonPanel.add(editLink, gbc1); - // Panels for new/edit/delete link buttons - // buttonContent prevents the buttons from being resized when the window is - JPanel buttonContent = new JPanel(new GridLayout(0, 1, 0, 0)); - JPanel buttonPanel = new JPanel(new BorderLayout()); + GridBagConstraints gbc2 = new GridBagConstraints(); + gbc2.gridx = 2; + gbc2.gridy = 0; + gbc2.fill = GridBagConstraints.NONE; + buttonPanel.add(deleteLink, gbc2); - buttonContent.add(newLink, null); - buttonContent.add(editLink, null); - buttonContent.add(deleteLink, null); - buttonPanel.add(buttonContent, BorderLayout.NORTH); + GridBagConstraints gbc3 = new GridBagConstraints(); + gbc3.gridx = 3; + gbc3.gridy = 0; + gbc3.fill = GridBagConstraints.HORIZONTAL; + gbc3.weightx = 1.0; + JPanel spacePanel = new JPanel(); + spacePanel.setBorder(null); + buttonPanel.add(spacePanel, gbc3); return buttonPanel; } /** - * Initialises the parent panel which contains the tabbed sections. + * Initialises the proxy server panel in the Connections tab * - * @return + * @return the proxy server panel */ - private JPanel initOkCancelPanel() + private JPanel initConnTabProxyPanel() { - JButton ok = new JButton(); - ok.setText(MessageManager.getString("action.ok")); - ok.addActionListener(new ActionListener() + // Label for server text box + serverLabel.setText(MessageManager.getString("label.host") + ": "); + serverLabel.setHorizontalAlignment(SwingConstants.RIGHT); + serverLabel.setFont(LABEL_FONT); + serverLabel2.setText(MessageManager.getString("label.host") + ": "); + serverLabel2.setHorizontalAlignment(SwingConstants.RIGHT); + serverLabel2.setFont(LABEL_FONT); + + // Proxy server and port text boxes + proxyServerHttpTB.setFont(LABEL_FONT); + proxyServerHttpTB.setColumns(40); + proxyPortHttpTB.setFont(LABEL_FONT); + proxyPortHttpTB.setColumns(4); + proxyServerHttpsTB.setFont(LABEL_FONT); + proxyServerHttpsTB.setColumns(40); + proxyPortHttpsTB.setFont(LABEL_FONT); + proxyPortHttpsTB.setColumns(4); + proxyAuthUsernameTB.setFont(LABEL_FONT); + proxyAuthUsernameTB.setColumns(30); + + // check for any change to enable applyProxyButton + DocumentListener d = new DocumentListener() + { + @Override + public void changedUpdate(DocumentEvent e) + { + applyProxyButtonEnabled(true); + } + + @Override + public void insertUpdate(DocumentEvent e) + { + applyProxyButtonEnabled(true); + } + + @Override + public void removeUpdate(DocumentEvent e) + { + applyProxyButtonEnabled(true); + } + }; + proxyServerHttpTB.getDocument().addDocumentListener(d); + proxyPortHttpTB.getDocument().addDocumentListener(d); + proxyServerHttpsTB.getDocument().addDocumentListener(d); + proxyPortHttpsTB.getDocument().addDocumentListener(d); + proxyAuthUsernameTB.getDocument().addDocumentListener(d); + proxyAuthPasswordPB.setFont(LABEL_FONT); + proxyAuthPasswordPB.setColumns(30); + proxyAuthPasswordPB.getDocument() + .addDocumentListener(new DocumentListener() + { + @Override + public void changedUpdate(DocumentEvent e) + { + proxyAuthPasswordCheckHighlight(true); + applyProxyButtonEnabled(true); + } + + @Override + public void insertUpdate(DocumentEvent e) + { + proxyAuthPasswordCheckHighlight(true); + applyProxyButtonEnabled(true); + } + + @Override + public void removeUpdate(DocumentEvent e) + { + proxyAuthPasswordCheckHighlight(true); + applyProxyButtonEnabled(true); + } + + }); + + // Label for Port text box + portLabel.setFont(LABEL_FONT); + portLabel.setHorizontalAlignment(SwingConstants.RIGHT); + portLabel.setText(MessageManager.getString("label.port") + ": "); + portLabel2.setFont(LABEL_FONT); + portLabel2.setHorizontalAlignment(SwingConstants.RIGHT); + portLabel2.setText(MessageManager.getString("label.port") + ": "); + + httpLabel.setText("HTTP"); + httpLabel.setFont(LABEL_FONT_BOLD); + httpLabel.setHorizontalAlignment(SwingConstants.LEFT); + httpsLabel.setText("HTTPS"); + httpsLabel.setFont(LABEL_FONT_BOLD); + httpsLabel.setHorizontalAlignment(SwingConstants.LEFT); + + proxyAuthUsernameLabel + .setText(MessageManager.getString("label.username") + ": "); + proxyAuthUsernameLabel.setFont(LABEL_FONT); + proxyAuthUsernameLabel.setHorizontalAlignment(SwingConstants.RIGHT); + proxyAuthPasswordLabel + .setText(MessageManager.getString("label.password") + ": "); + proxyAuthPasswordLabel.setFont(LABEL_FONT); + proxyAuthPasswordLabel.setHorizontalAlignment(SwingConstants.RIGHT); + passwordNotStoredLabel.setText( + "(" + MessageManager.getString("label.not_stored") + ")"); + passwordNotStoredLabel.setFont(LABEL_FONT_ITALIC); + passwordNotStoredLabel.setHorizontalAlignment(SwingConstants.LEFT); + + // Proxy type radio buttons + noProxy.setFont(LABEL_FONT); + noProxy.setHorizontalAlignment(SwingConstants.LEFT); + noProxy.setText(MessageManager.getString("label.no_proxy")); + systemProxy.setFont(LABEL_FONT); + systemProxy.setHorizontalAlignment(SwingConstants.LEFT); + systemProxy.setText(MessageManager.formatMessage("label.system_proxy", + displayUserHostPort(Cache.startupProxyProperties[4], + Cache.startupProxyProperties[0], + Cache.startupProxyProperties[1]), + displayUserHostPort(Cache.startupProxyProperties[6], + Cache.startupProxyProperties[2], + Cache.startupProxyProperties[3]))); + customProxy.setFont(LABEL_FONT); + customProxy.setHorizontalAlignment(SwingConstants.LEFT); + customProxy.setText( + MessageManager.getString("label.use_proxy_server") + ":"); + ActionListener al = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - ok_actionPerformed(e); + proxyType_actionPerformed(); } - }); - JButton cancel = new JButton(); - cancel.setText(MessageManager.getString("action.cancel")); - cancel.addActionListener(new ActionListener() + }; + noProxy.addActionListener(al); + systemProxy.addActionListener(al); + customProxy.addActionListener(al); + proxyType.add(noProxy); + proxyType.add(systemProxy); + proxyType.add(customProxy); + + proxyAuth.setFont(LABEL_FONT); + proxyAuth.setHorizontalAlignment(SwingConstants.LEFT); + proxyAuth.setText(MessageManager.getString("label.auth_required")); + proxyAuth.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - cancel_actionPerformed(e); + proxyAuth_actionPerformed(); } }); - JPanel okCancelPanel = new JPanel(); - okCancelPanel.add(ok); - okCancelPanel.add(cancel); - return okCancelPanel; - } - /** - * Initialises the Colours tabbed panel. - * - * @return - */ - private JPanel initColoursTab() + setCustomProxyEnabled(); + + // Make proxy server panel + JPanel proxyPanel = new JPanel(); + TitledBorder titledBorder1 = new TitledBorder( + MessageManager.getString("label.proxy_servers")); + proxyPanel.setBorder(titledBorder1); + proxyPanel.setLayout(new GridBagLayout()); + GridBagConstraints gbc = new GridBagConstraints(); + gbc.fill = GridBagConstraints.HORIZONTAL; + gbc.weightx = 1.0; + + GridBagConstraints c = new GridBagConstraints(); + // Proxy type radio buttons (3) + JPanel ptPanel = new JPanel(); + ptPanel.setLayout(new GridBagLayout()); + c.weightx = 1.0; + c.gridy = 0; + c.gridx = 0; + c.gridwidth = 1; + c.fill = GridBagConstraints.HORIZONTAL; + ptPanel.add(noProxy, c); + c.gridy++; + ptPanel.add(systemProxy, c); + c.gridy++; + ptPanel.add(customProxy, c); + + gbc.gridy = 0; + proxyPanel.add(ptPanel, gbc); + + // host and port text boxes + JPanel hpPanel = new JPanel(); + hpPanel.setLayout(new GridBagLayout()); + // HTTP host port row + c.gridy = 0; + c.gridx = 0; + + c.weightx = 0.1; + c.anchor = GridBagConstraints.LINE_START; + hpPanel.add(httpLabel, c); + + c.gridx++; + c.weightx = 0.1; + c.anchor = GridBagConstraints.LINE_END; + hpPanel.add(serverLabel, c); + + c.gridx++; + c.weightx = 1.0; + c.anchor = GridBagConstraints.LINE_START; + hpPanel.add(proxyServerHttpTB, c); + + c.gridx++; + c.weightx = 0.1; + c.anchor = GridBagConstraints.LINE_END; + hpPanel.add(portLabel, c); + + c.gridx++; + c.weightx = 0.2; + c.anchor = GridBagConstraints.LINE_START; + hpPanel.add(proxyPortHttpTB, c); + + // HTTPS host port row + c.gridy++; + c.gridx = 0; + c.gridwidth = 1; + + c.anchor = GridBagConstraints.LINE_START; + hpPanel.add(httpsLabel, c); + + c.gridx++; + c.anchor = GridBagConstraints.LINE_END; + hpPanel.add(serverLabel2, c); + + c.gridx++; + c.anchor = GridBagConstraints.LINE_START; + hpPanel.add(proxyServerHttpsTB, c); + + c.gridx++; + c.anchor = GridBagConstraints.LINE_END; + hpPanel.add(portLabel2, c); + + c.gridx++; + c.anchor = GridBagConstraints.LINE_START; + hpPanel.add(proxyPortHttpsTB, c); + + gbc.gridy++; + proxyPanel.add(hpPanel, gbc); + + if (!Platform.isJS()) + /** + * java.net.Authenticator is not implemented in SwingJS. Not displaying the + * Authentication options in Preferences. + * + * @j2sIgnore + * + */ + { + // Require authentication checkbox + gbc.gridy++; + proxyPanel.add(proxyAuth, gbc); + + // username and password + JPanel upPanel = new JPanel(); + upPanel.setLayout(new GridBagLayout()); + // username row + c.gridy = 0; + c.gridx = 0; + c.gridwidth = 1; + c.weightx = 0.4; + c.anchor = GridBagConstraints.LINE_END; + upPanel.add(proxyAuthUsernameLabel, c); + + c.gridx++; + c.weightx = 1.0; + c.anchor = GridBagConstraints.LINE_START; + upPanel.add(proxyAuthUsernameTB, c); + + // password row + c.gridy++; + c.gridx = 0; + c.weightx = 0.4; + c.anchor = GridBagConstraints.LINE_END; + upPanel.add(proxyAuthPasswordLabel, c); + + c.gridx++; + c.weightx = 1.0; + c.anchor = GridBagConstraints.LINE_START; + upPanel.add(proxyAuthPasswordPB, c); + + c.gridx++; + c.weightx = 0.4; + c.anchor = GridBagConstraints.LINE_START; + upPanel.add(passwordNotStoredLabel, c); + + gbc.gridy++; + proxyPanel.add(upPanel, gbc); + + } // end j2sIgnore + + applyProxyButton.setText(MessageManager.getString("action.apply")); + applyProxyButton.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + saveProxySettings(); + applyProxyButton.setEnabled(false); + } + }); + gbc.gridy++; + gbc.fill = GridBagConstraints.NONE; + gbc.anchor = GridBagConstraints.LINE_END; + proxyPanel.add(applyProxyButton, gbc); + + return proxyPanel; + } + + public void proxyAuthPasswordCheckHighlight(boolean enabled) + { + proxyAuthPasswordCheckHighlight(enabled, false); + } + + public void proxyAuthPasswordCheckHighlight(boolean enabled, + boolean grabFocus) + { + if (enabled && proxyType.isSelected(customProxy.getModel()) + && proxyAuth.isSelected() + && !proxyAuthUsernameTB.getText().isEmpty() + && proxyAuthPasswordPB.getDocument().getLength() == 0) + { + if (grabFocus) + proxyAuthPasswordPB.grabFocus(); + proxyAuthPasswordPB.setBackground(Color.PINK); + } + else + { + proxyAuthPasswordPB.setBackground(Color.WHITE); + } + } + + public void applyProxyButtonEnabled(boolean enabled) + { + applyProxyButton.setEnabled(enabled); + } + + public void saveProxySettings() + { + // overridden in Preferences + } + + private String displayUserHostPort(String user, String host, String port) + { + boolean hostBlank = (host == null || host.isEmpty()); + boolean portBlank = (port == null || port.isEmpty()); + if (hostBlank && portBlank) + { + return MessageManager.getString("label.none"); + } + + StringBuilder sb = new StringBuilder(); + if (user != null) + { + sb.append(user.isEmpty() || user.indexOf(" ") > -1 ? '"' + user + '"' + : user); + sb.append("@"); + } + sb.append(hostBlank ? "" : host); + if (!portBlank) + { + sb.append(":"); + sb.append(port); + } + return sb.toString(); + } + + /** + * Initialises the checkboxes in the Connections tab + */ + private void initConnTabCheckboxes() + { + // Usage stats checkbox label + usagestats.setText( + MessageManager.getString("label.send_usage_statistics")); + usagestats.setFont(LABEL_FONT); + usagestats.setHorizontalAlignment(SwingConstants.RIGHT); + usagestats.setHorizontalTextPosition(SwingConstants.LEADING); + + // Questionnaire checkbox label + questionnaire.setText( + MessageManager.getString("label.check_for_questionnaires")); + questionnaire.setFont(LABEL_FONT); + questionnaire.setHorizontalAlignment(SwingConstants.RIGHT); + questionnaire.setHorizontalTextPosition(SwingConstants.LEADING); + + // Check for latest version checkbox label + versioncheck.setText( + MessageManager.getString("label.check_for_latest_version")); + versioncheck.setFont(LABEL_FONT); + versioncheck.setHorizontalAlignment(SwingConstants.RIGHT); + versioncheck.setHorizontalTextPosition(SwingConstants.LEADING); + } + + /** + * Initialises the parent panel which contains the tabbed sections. + * + * @return + */ + private JPanel initOkCancelPanel() + { + JButton ok = new JButton(); + ok.setText(MessageManager.getString("action.ok")); + ok.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + ok_actionPerformed(e); + } + }); + JButton cancel = new JButton(); + cancel.setText(MessageManager.getString("action.cancel")); + cancel.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + cancel_actionPerformed(e); + } + }); + JPanel okCancelPanel = new JPanel(); + okCancelPanel.add(ok); + okCancelPanel.add(cancel); + return okCancelPanel; + } + + /** + * Initialises the Colours tabbed panel. + * + * @return + */ + private JPanel initColoursTab() { JPanel coloursTab = new JPanel(); - coloursTab.setBorder(new TitledBorder(MessageManager - .getString("action.open_new_alignment"))); + coloursTab.setBorder(new TitledBorder( + MessageManager.getString("action.open_new_alignment"))); coloursTab.setLayout(new FlowLayout()); JLabel mincolourLabel = new JLabel(); mincolourLabel.setFont(LABEL_FONT); @@ -873,10 +1487,11 @@ public class GPreferences extends JPanel JLabel protColourLabel = new JLabel(); protColourLabel.setFont(LABEL_FONT); protColourLabel.setHorizontalAlignment(SwingConstants.LEFT); - protColourLabel.setText(MessageManager - .getString("label.prot_alignment_colour") + " "); - JvSwingUtils.addtoLayout(coloursTab, MessageManager - .getString("label.default_colour_scheme_for_alignment"), + protColourLabel.setText( + MessageManager.getString("label.prot_alignment_colour") + " "); + JvSwingUtils.addtoLayout(coloursTab, + MessageManager + .getString("label.default_colour_scheme_for_alignment"), protColourLabel, protColour); nucColour.setFont(LABEL_FONT); @@ -884,27 +1499,174 @@ public class GPreferences extends JPanel JLabel nucColourLabel = new JLabel(); nucColourLabel.setFont(LABEL_FONT); nucColourLabel.setHorizontalAlignment(SwingConstants.LEFT); - nucColourLabel.setText(MessageManager - .getString("label.nuc_alignment_colour") + " "); - JvSwingUtils.addtoLayout(coloursTab, MessageManager - .getString("label.default_colour_scheme_for_alignment"), + nucColourLabel.setText( + MessageManager.getString("label.nuc_alignment_colour") + " "); + JvSwingUtils.addtoLayout(coloursTab, + MessageManager + .getString("label.default_colour_scheme_for_alignment"), nucColourLabel, nucColour); JPanel annotationShding = new JPanel(); - annotationShding.setBorder(new TitledBorder(MessageManager - .getString("label.annotation_shading_default"))); + annotationShding.setBorder(new TitledBorder( + MessageManager.getString("label.annotation_shading_default"))); annotationShding.setLayout(new GridLayout(1, 2)); - JvSwingUtils.addtoLayout(annotationShding, MessageManager - .getString("label.default_minimum_colour_annotation_shading"), + JvSwingUtils.addtoLayout(annotationShding, + MessageManager.getString( + "label.default_minimum_colour_annotation_shading"), mincolourLabel, minColour); - JvSwingUtils.addtoLayout(annotationShding, MessageManager - .getString("label.default_maximum_colour_annotation_shading"), + JvSwingUtils.addtoLayout(annotationShding, + MessageManager.getString( + "label.default_maximum_colour_annotation_shading"), maxcolourLabel, maxColour); coloursTab.add(annotationShding); // , FlowLayout.LEFT); return coloursTab; } /** + * Initialises the Overview tabbed panel. + * + * @return + */ + private JPanel initOverviewTab() + { + JPanel overviewPanel = new JPanel(); + overviewPanel.setBorder(new TitledBorder( + MessageManager.getString("label.overview_settings"))); + + gapColour.setFont(LABEL_FONT); + // fixing the border colours stops apparent colour bleed from the panel + gapColour.setBorder( + BorderFactory.createEtchedBorder(Color.white, Color.lightGray)); + gapColour.setPreferredSize(new Dimension(40, 20)); + gapColour.addMouseListener(new MouseAdapter() + { + @Override + public void mousePressed(MouseEvent e) + { + gapColour_actionPerformed(gapColour); + } + }); + + hiddenColour.setFont(LABEL_FONT); + // fixing the border colours stops apparent colour bleed from the panel + hiddenColour.setBorder( + BorderFactory.createEtchedBorder(Color.white, Color.lightGray)); + hiddenColour.setPreferredSize(new Dimension(40, 20)); + hiddenColour.addMouseListener(new MouseAdapter() + { + @Override + public void mousePressed(MouseEvent e) + { + hiddenColour_actionPerformed(hiddenColour); + } + }); + + useLegacyGap = new JCheckBox( + MessageManager.getString("label.ov_legacy_gap")); + useLegacyGap.setFont(LABEL_FONT); + useLegacyGap.setHorizontalAlignment(SwingConstants.LEFT); + useLegacyGap.setVerticalTextPosition(SwingConstants.TOP); + gapLabel = new JLabel(MessageManager.getString("label.gap_colour")); + gapLabel.setFont(LABEL_FONT); + gapLabel.setHorizontalAlignment(SwingConstants.LEFT); + gapLabel.setVerticalTextPosition(SwingConstants.TOP); + showHiddenAtStart = new JCheckBox( + MessageManager.getString("label.ov_show_hide_default")); + showHiddenAtStart.setFont(LABEL_FONT); + showHiddenAtStart.setHorizontalAlignment(SwingConstants.LEFT); + showHiddenAtStart.setVerticalTextPosition(SwingConstants.TOP); + JLabel hiddenLabel = new JLabel( + MessageManager.getString("label.hidden_colour")); + hiddenLabel.setFont(LABEL_FONT); + hiddenLabel.setHorizontalAlignment(SwingConstants.LEFT); + hiddenLabel.setVerticalTextPosition(SwingConstants.TOP); + + useLegacyGap.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + useLegacyGaps_actionPerformed(e); + } + }); + + overviewPanel.setLayout(new GridBagLayout()); + GridBagConstraints c1 = new GridBagConstraints(); + + c1.fill = GridBagConstraints.HORIZONTAL; + c1.gridx = 0; + c1.gridy = 0; + c1.weightx = 1; + c1.ipady = 20; + c1.anchor = GridBagConstraints.FIRST_LINE_START; + overviewPanel.add(useLegacyGap, c1); + + GridBagConstraints c2 = new GridBagConstraints(); + c2.fill = GridBagConstraints.HORIZONTAL; + c2.gridx = 1; + c2.gridy = 0; + c2.insets = new Insets(0, 15, 0, 10); + overviewPanel.add(gapLabel, c2); + + GridBagConstraints c3 = new GridBagConstraints(); + c3.fill = GridBagConstraints.HORIZONTAL; + c3.gridx = 2; + c3.gridy = 0; + c3.insets = new Insets(0, 0, 0, 15); + overviewPanel.add(gapColour, c3); + + GridBagConstraints c4 = new GridBagConstraints(); + c4.fill = GridBagConstraints.HORIZONTAL; + c4.gridx = 0; + c4.gridy = 1; + c4.weightx = 1; + overviewPanel.add(showHiddenAtStart, c4); + + GridBagConstraints c5 = new GridBagConstraints(); + c5.fill = GridBagConstraints.HORIZONTAL; + c5.gridx = 1; + c5.gridy = 1; + c5.insets = new Insets(0, 15, 0, 10); + overviewPanel.add(hiddenLabel, c5); + + GridBagConstraints c6 = new GridBagConstraints(); + c6.fill = GridBagConstraints.HORIZONTAL; + c6.gridx = 2; + c6.gridy = 1; + c6.insets = new Insets(0, 0, 0, 15); + overviewPanel.add(hiddenColour, c6); + + JButton resetButton = new JButton( + MessageManager.getString("label.reset_to_defaults")); + + resetButton.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + resetOvDefaults_actionPerformed(e); + } + }); + + GridBagConstraints c7 = new GridBagConstraints(); + c7.fill = GridBagConstraints.NONE; + c7.gridx = 0; + c7.gridy = 2; + c7.insets = new Insets(10, 0, 0, 0); + c7.anchor = GridBagConstraints.WEST; + overviewPanel.add(resetButton, c7); + + // Add padding so the panel doesn't look ridiculous + JPanel spacePanel = new JPanel(); + overviewPanel.add(spacePanel, + new GridBagConstraints(0, 3, 1, 1, 1.0, 1.0, + GridBagConstraints.WEST, GridBagConstraints.BOTH, + new Insets(0, 0, 0, 5), 0, 0)); + + return overviewPanel; + } + + /** * Initialises the Structure tabbed panel. * * @return @@ -913,10 +1675,10 @@ public class GPreferences extends JPanel { structureTab = new JPanel(); - structureTab.setBorder(new TitledBorder(MessageManager - .getString("label.structure_options"))); + structureTab.setBorder(new TitledBorder( + MessageManager.getString("label.structure_options"))); structureTab.setLayout(null); - final int width = 400; + final int width = 420; final int height = 22; final int lineSpacing = 25; int ypos = 15; @@ -932,7 +1694,6 @@ public class GPreferences extends JPanel { boolean selected = structFromPdb.isSelected(); // enable other options only when the first is checked - useRnaView.setEnabled(selected); addSecondaryStructure.setEnabled(selected); addTempFactor.setEnabled(selected); } @@ -941,15 +1702,9 @@ public class GPreferences extends JPanel // indent checkboxes that are conditional on the first one ypos += lineSpacing; - useRnaView.setFont(LABEL_FONT); - useRnaView.setText(MessageManager.getString("label.use_rnaview")); - useRnaView.setBounds(new Rectangle(25, ypos, width, height)); - structureTab.add(useRnaView); - - ypos += lineSpacing; addSecondaryStructure.setFont(LABEL_FONT); - addSecondaryStructure.setText(MessageManager - .getString("label.autoadd_secstr")); + addSecondaryStructure + .setText(MessageManager.getString("label.autoadd_secstr")); addSecondaryStructure.setBounds(new Rectangle(25, ypos, width, height)); structureTab.add(addSecondaryStructure); @@ -964,54 +1719,65 @@ public class GPreferences extends JPanel viewerLabel.setFont(LABEL_FONT); viewerLabel.setHorizontalAlignment(SwingConstants.LEFT); viewerLabel.setText(MessageManager.getString("label.structure_viewer")); - viewerLabel.setBounds(new Rectangle(10, ypos, 200, height)); + viewerLabel.setBounds(new Rectangle(10, ypos, 220, height)); structureTab.add(viewerLabel); + /* + * add all external viewers as options here - check + * when selected whether the program is installed + */ structViewer.setFont(LABEL_FONT); - structViewer.setBounds(new Rectangle(160, ypos, 120, height)); + structViewer.setBounds(new Rectangle(190, ypos, 120, height)); structViewer.addItem(ViewerType.JMOL.name()); structViewer.addItem(ViewerType.CHIMERA.name()); + structViewer.addItem(ViewerType.CHIMERAX.name()); + structViewer.addItem(ViewerType.PYMOL.name()); structViewer.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - structureViewer_actionPerformed((String) structViewer - .getSelectedItem()); + structureViewer_actionPerformed( + (String) structViewer.getSelectedItem()); } }); structureTab.add(structViewer); ypos += lineSpacing; - JLabel pathLabel = new JLabel(); - pathLabel.setFont(new java.awt.Font("SansSerif", 0, 11)); - pathLabel.setHorizontalAlignment(SwingConstants.LEFT); - pathLabel.setText(MessageManager.getString("label.chimera_path")); + structureViewerPathLabel = new JLabel(); + structureViewerPathLabel.setFont(LABEL_FONT);// new Font("SansSerif", 0, + // 11)); + structureViewerPathLabel.setHorizontalAlignment(SwingConstants.LEFT); + structureViewerPathLabel.setText(MessageManager + .formatMessage("label.viewer_path", "Chimera(X)")); + structureViewerPathLabel + .setBounds(new Rectangle(10, ypos, 170, height)); + structureViewerPathLabel.setEnabled(false); + structureTab.add(structureViewerPathLabel); + + structureViewerPath.setFont(LABEL_FONT); + structureViewerPath.setText(""); + structureViewerPath.setEnabled(false); final String tooltip = JvSwingUtils.wrapTooltip(true, - MessageManager.getString("label.chimera_path_tip")); - pathLabel.setToolTipText(tooltip); - pathLabel.setBounds(new Rectangle(10, ypos, 140, height)); - structureTab.add(pathLabel); - - chimeraPath.setFont(LABEL_FONT); - chimeraPath.setText(""); - chimeraPath.setBounds(new Rectangle(160, ypos, 300, height)); - chimeraPath.addMouseListener(new MouseAdapter() + MessageManager.getString("label.viewer_path_tip")); + structureViewerPath.setToolTipText(tooltip); + structureViewerPath.setBounds(new Rectangle(190, ypos, 290, height)); + structureViewerPath.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { - if (e.getClickCount() == 2) + if (structureViewerPath.isEnabled() && e.getClickCount() == 2) { String chosen = openFileChooser(); if (chosen != null) { - chimeraPath.setText(chosen); + structureViewerPath.setText(chosen); } } } }); - structureTab.add(chimeraPath); + structureTab.add(structureViewerPath); ypos += lineSpacing; nwMapping.setFont(LABEL_FONT); @@ -1026,7 +1792,7 @@ public class GPreferences extends JPanel MessageManager.getString("label.mapping_method")); mmTitledBorder.setTitleFont(LABEL_FONT); mappingPanel.setBorder(mmTitledBorder); - mappingPanel.setBounds(new Rectangle(10, ypos, 452, 45)); + mappingPanel.setBounds(new Rectangle(10, ypos, 472, 45)); // GridLayout mappingLayout = new GridLayout(); mappingPanel.setLayout(new GridLayout()); mappingPanel.add(nwMapping); @@ -1037,9 +1803,20 @@ public class GPreferences extends JPanel ypos += lineSpacing; FTSDataColumnPreferences docFieldPref = new FTSDataColumnPreferences( PreferenceSource.PREFERENCES, PDBFTSRestClient.getInstance()); - docFieldPref.setBounds(new Rectangle(10, ypos, 450, 120)); + docFieldPref.setBounds(new Rectangle(10, ypos, 470, 120)); structureTab.add(docFieldPref); + /* + * hide Chimera options in JalviewJS + */ + if (Platform.isJS()) + { + structureViewerPathLabel.setVisible(false); + structureViewerPath.setVisible(false); + viewerLabel.setVisible(false); + structViewer.setVisible(false); + } + return structureTab; } @@ -1063,9 +1840,17 @@ public class GPreferences extends JPanel String choice = null; JFileChooser chooser = new JFileChooser(); + // Enable appBundleIsTraversable in macOS FileChooser to allow selecting + // hidden executables within .app dirs + if (Platform.isMac()) + { + chooser.putClientProperty("JFileChooser.appBundleIsTraversable", + true); + } + // chooser.setFileView(new JalviewFileView()); - chooser.setDialogTitle(MessageManager - .getString("label.open_local_file")); + chooser.setDialogTitle( + MessageManager.getString("label.open_local_file")); chooser.setToolTipText(MessageManager.getString("action.open")); int value = chooser.showOpenDialog(this); @@ -1105,8 +1890,8 @@ public class GPreferences extends JPanel private JPanel initVisualTab() { JPanel visualTab = new JPanel(); - visualTab.setBorder(new TitledBorder(MessageManager - .getString("action.open_new_alignment"))); + visualTab.setBorder(new TitledBorder( + MessageManager.getString("action.open_new_alignment"))); visualTab.setLayout(null); fullScreen.setFont(LABEL_FONT); fullScreen.setHorizontalAlignment(SwingConstants.RIGHT); @@ -1130,25 +1915,32 @@ public class GPreferences extends JPanel identity.setHorizontalTextPosition(SwingConstants.LEFT); identity.setSelected(true); identity.setText(MessageManager.getString("label.consensus")); + showOccupancy.setFont(LABEL_FONT); + showOccupancy.setEnabled(false); + showOccupancy.setHorizontalAlignment(SwingConstants.RIGHT); + showOccupancy.setHorizontalTextPosition(SwingConstants.LEFT); + showOccupancy.setSelected(true); + showOccupancy.setText(MessageManager.getString("label.occupancy")); + JLabel showGroupbits = new JLabel(); showGroupbits.setFont(LABEL_FONT); showGroupbits.setHorizontalAlignment(SwingConstants.RIGHT); showGroupbits.setHorizontalTextPosition(SwingConstants.LEFT); - showGroupbits.setText(MessageManager.getString("action.show_group") - + ":"); + showGroupbits + .setText(MessageManager.getString("action.show_group") + ":"); JLabel showConsensbits = new JLabel(); showConsensbits.setFont(LABEL_FONT); showConsensbits.setHorizontalAlignment(SwingConstants.RIGHT); showConsensbits.setHorizontalTextPosition(SwingConstants.LEFT); - showConsensbits.setText(MessageManager.getString("label.consensus") - + ":"); + showConsensbits + .setText(MessageManager.getString("label.consensus") + ":"); showConsensHistogram.setEnabled(false); showConsensHistogram.setFont(LABEL_FONT); showConsensHistogram.setHorizontalAlignment(SwingConstants.RIGHT); showConsensHistogram.setHorizontalTextPosition(SwingConstants.LEFT); showConsensHistogram.setSelected(true); - showConsensHistogram.setText(MessageManager - .getString("label.histogram")); + showConsensHistogram + .setText(MessageManager.getString("label.histogram")); showConsensLogo.setEnabled(false); showConsensLogo.setFont(LABEL_FONT); showConsensLogo.setHorizontalAlignment(SwingConstants.RIGHT); @@ -1166,28 +1958,28 @@ public class GPreferences extends JPanel showGroupConservation.setHorizontalAlignment(SwingConstants.RIGHT); showGroupConservation.setHorizontalTextPosition(SwingConstants.LEFT); showGroupConservation.setSelected(true); - showGroupConservation.setText(MessageManager - .getString("label.conservation")); + showGroupConservation + .setText(MessageManager.getString("label.conservation")); showNpTooltip.setEnabled(true); showNpTooltip.setFont(LABEL_FONT); showNpTooltip.setHorizontalAlignment(SwingConstants.RIGHT); showNpTooltip.setHorizontalTextPosition(SwingConstants.LEFT); showNpTooltip.setSelected(true); - showNpTooltip.setText(MessageManager - .getString("label.non_positional_features")); + showNpTooltip.setText( + MessageManager.getString("label.non_positional_features")); showDbRefTooltip.setEnabled(true); showDbRefTooltip.setFont(LABEL_FONT); showDbRefTooltip.setHorizontalAlignment(SwingConstants.RIGHT); showDbRefTooltip.setHorizontalTextPosition(SwingConstants.LEFT); showDbRefTooltip.setSelected(true); - showDbRefTooltip.setText(MessageManager - .getString("label.database_references")); + showDbRefTooltip + .setText(MessageManager.getString("label.database_references")); annotations.setFont(LABEL_FONT); annotations.setHorizontalAlignment(SwingConstants.RIGHT); - annotations.setHorizontalTextPosition(SwingConstants.LEADING); + annotations.setHorizontalTextPosition(SwingConstants.LEFT); annotations.setSelected(true); annotations.setText(MessageManager.getString("label.show_annotations")); - annotations.setBounds(new Rectangle(169, 12, 200, 23)); + // annotations.setBounds(new Rectangle(169, 12, 200, 23)); annotations.addActionListener(new ActionListener() { @Override @@ -1216,8 +2008,8 @@ public class GPreferences extends JPanel showUnconserved.setHorizontalAlignment(SwingConstants.RIGHT); showUnconserved.setHorizontalTextPosition(SwingConstants.LEFT); showUnconserved.setSelected(true); - showUnconserved.setText(MessageManager - .getString("action.show_unconserved")); + showUnconserved + .setText(MessageManager.getString("action.show_unconserved")); showUnconserved.addActionListener(new ActionListener() { @Override @@ -1255,10 +2047,10 @@ public class GPreferences extends JPanel scaleProteinToCdna.setFont(LABEL_FONT); scaleProteinToCdna.setHorizontalAlignment(SwingConstants.RIGHT); scaleProteinToCdna.setHorizontalTextPosition(SwingConstants.LEADING); - scaleProteinToCdna.setText(MessageManager - .getString("label.scale_protein_to_cdna")); - scaleProteinToCdna.setToolTipText(MessageManager - .getString("label.scale_protein_to_cdna_tip")); + scaleProteinToCdna.setText( + MessageManager.getString("label.scale_protein_to_cdna")); + scaleProteinToCdna.setToolTipText( + MessageManager.getString("label.scale_protein_to_cdna_tip")); JLabel gapLabel = new JLabel(); gapLabel.setFont(LABEL_FONT); gapLabel.setHorizontalAlignment(SwingConstants.RIGHT); @@ -1286,6 +2078,9 @@ public class GPreferences extends JPanel startupCheckbox.setSelected(true); startupFileTextfield.setFont(LABEL_FONT); startupFileTextfield.setBounds(new Rectangle(172, 310, 330, 20)); + final String tooltip = JvSwingUtils.wrapTooltip(true, + MessageManager.getString("label.double_click_to_browse")); + startupFileTextfield.setToolTipText(tooltip); startupFileTextfield.addMouseListener(new MouseAdapter() { @Override @@ -1314,11 +2109,13 @@ public class GPreferences extends JPanel sortAutocalc.setBounds(new Rectangle(290, 285, 165, 21)); JPanel annsettingsPanel = new JPanel(); - annsettingsPanel.setBounds(new Rectangle(173, 34, 320, 75)); + annsettingsPanel.setBounds(new Rectangle(173, 13, 320, 96)); annsettingsPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0)); annsettingsPanel.setBorder(new EtchedBorder()); visualTab.add(annsettingsPanel); Border jb = new EmptyBorder(1, 1, 4, 5); + annotations.setBorder(jb); + showOccupancy.setBorder(jb); quality.setBorder(jb); conservation.setBorder(jb); identity.setBorder(jb); @@ -1330,11 +2127,18 @@ public class GPreferences extends JPanel showConsensLogo.setBorder(jb); JPanel autoAnnotSettings = new JPanel(); - autoAnnotSettings.setLayout(new GridLayout(3, 3)); annsettingsPanel.add(autoAnnotSettings); + autoAnnotSettings.setLayout(new GridLayout(0, 2)); + autoAnnotSettings.add(annotations); autoAnnotSettings.add(quality); + // second row of autoannotation box + autoAnnotSettings = new JPanel(); + annsettingsPanel.add(autoAnnotSettings); + + autoAnnotSettings.setLayout(new GridLayout(0, 3)); autoAnnotSettings.add(conservation); autoAnnotSettings.add(identity); + autoAnnotSettings.add(showOccupancy); autoAnnotSettings.add(showGroupbits); autoAnnotSettings.add(showGroupConservation); autoAnnotSettings.add(showGroupConsensus); @@ -1343,8 +2147,8 @@ public class GPreferences extends JPanel autoAnnotSettings.add(showConsensLogo); JPanel tooltipSettings = new JPanel(); - tooltipSettings.setBorder(new TitledBorder(MessageManager - .getString("label.sequence_id_tooltip"))); + tooltipSettings.setBorder(new TitledBorder( + MessageManager.getString("label.sequence_id_tooltip"))); tooltipSettings.setBounds(173, 140, 220, 62); tooltipSettings.setLayout(new GridLayout(2, 1)); tooltipSettings.add(showDbRefTooltip); @@ -1363,11 +2167,11 @@ public class GPreferences extends JPanel idItalics.setFont(LABEL_FONT_ITALIC); idItalics.setHorizontalAlignment(SwingConstants.RIGHT); idItalics.setHorizontalTextPosition(SwingConstants.LEADING); - idItalics.setText(MessageManager - .getString("label.sequence_name_italics")); + idItalics.setText( + MessageManager.getString("label.sequence_name_italics")); openoverv.setFont(LABEL_FONT); - openoverv.setActionCommand(MessageManager - .getString("label.open_overview")); + openoverv.setActionCommand( + MessageManager.getString("label.open_overview")); openoverv.setHorizontalAlignment(SwingConstants.RIGHT); openoverv.setHorizontalTextPosition(SwingConstants.LEFT); openoverv.setText(MessageManager.getString("label.open_overview")); @@ -1389,7 +2193,6 @@ public class GPreferences extends JPanel jPanel2.add(sortAnnLabel); jPanel2.add(startupCheckbox); visualTab.add(jPanel2); - visualTab.add(annotations); visualTab.add(startupFileTextfield); visualTab.add(sortby); visualTab.add(sortAnnBy); @@ -1398,112 +2201,1413 @@ public class GPreferences extends JPanel visualTab.add(fontNameCB); visualTab.add(fontSizeCB); visualTab.add(fontStyleCB); - return visualTab; - } - protected void autoIdWidth_actionPerformed() - { - // TODO Auto-generated method stub + if (Platform.isJS()) + { + startupCheckbox.setVisible(false); + startupFileTextfield.setVisible(false); + } + return visualTab; } - protected void userIdWidth_actionPerformed() - { - // TODO Auto-generated method stub - - } + /** + * Load the saved Backups options EXCEPT "Enabled" and "Scheme" + */ - protected void maxColour_actionPerformed(JPanel panel) + protected void loadLastSavedBackupsOptions() { - } + BackupFilesPresetEntry savedPreset = BackupFilesPresetEntry + .getSavedBackupEntry(); + enableBackupFiles.setSelected( + Cache.getDefault(BackupFiles.ENABLED, !Platform.isJS())); + + BackupFilesPresetEntry backupfilesCustomEntry = BackupFilesPresetEntry + .createBackupFilesPresetEntry(Cache + .getDefault(BackupFilesPresetEntry.CUSTOMCONFIG, null)); + if (backupfilesCustomEntry == null) + { + backupfilesCustomEntry = BackupFilesPresetEntry.backupfilesPresetEntriesValues + .get(BackupFilesPresetEntry.BACKUPFILESSCHEMEDEFAULT); + } + BackupFilesPresetEntry.backupfilesPresetEntriesValues.put( + BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM, + backupfilesCustomEntry); - protected void minColour_actionPerformed(JPanel panel) - { - } + setComboIntStringKey(backupfilesPresetsCombo, + Cache.getDefault(BackupFiles.NS + "_PRESET", + BackupFilesPresetEntry.BACKUPFILESSCHEMEDEFAULT)); - protected void showunconserved_actionPerformed(ActionEvent e) - { - // TODO Auto-generated method stub + backupsSetOptions(savedPreset); + backupsOptionsSetEnabled(); + updateBackupFilesExampleLabel(); } - /** - * DOCUMENT ME! - * - * @param e - * DOCUMENT ME! + /* + * Load the saved Memory settings */ - public void ok_actionPerformed(ActionEvent e) + protected void loadLastSavedMemorySettings() { + customiseMemorySetting.setSelected( + Cache.getDefault(MemorySetting.CUSTOMISED_SETTINGS, false)); + jvmMemoryPercentSlider + .setValue(Cache.getDefault(MemorySetting.MEMORY_JVMMEMPC, 90)); + jvmMemoryMaxTextField.setText( + Cache.getDefault(MemorySetting.MEMORY_JVMMEMMAX, "32g")); } - /** - * DOCUMENT ME! - * - * @param e - * DOCUMENT ME! - */ - public void cancel_actionPerformed(ActionEvent e) + private boolean warnAboutSuffixReverseChange() { + BackupFilesPresetEntry bfpe = BackupFilesPresetEntry + .getSavedBackupEntry(); + boolean savedSuffixReverse = bfpe.reverse; + int savedSuffixDigits = bfpe.digits; + String savedSuffixTemplate = bfpe.suffix; + + boolean nowSuffixReverse = suffixReverse.isSelected(); + int nowSuffixDigits = getSpinnerInt(suffixDigitsSpinner, 3); + String nowSuffixTemplate = suffixTemplate.getText(); + return nowSuffixReverse != savedSuffixReverse + && nowSuffixDigits == savedSuffixDigits + && nowSuffixTemplate != null + && nowSuffixTemplate.equals(savedSuffixTemplate); } - /** - * DOCUMENT ME! + /* Initialises the Startup tabbed panel. * - * @param e - * DOCUMENT ME! - */ - public void annotations_actionPerformed(ActionEvent e) - { - } + * @return + * */ - /** - * DOCUMENT ME! - */ - public void startupFileTextfield_mouseClicked() + private JPanel initStartupTab() { - } + JPanel startupTab = new JPanel(); + startupTab.setBorder( + new TitledBorder(MessageManager.getString("label.memory"))); + startupTab.setLayout(new GridBagLayout()); - public void newLink_actionPerformed(ActionEvent e) - { + GridBagConstraints gbc = new GridBagConstraints(); + gbc.weightx = 0.0; + gbc.weighty = 0.0; + gbc.anchor = GridBagConstraints.FIRST_LINE_START; + gbc.fill = GridBagConstraints.NONE; - } + initMemoryPanel(); - public void editLink_actionPerformed(ActionEvent e) - { + gbc.gridheight = 1; + gbc.gridwidth = 3; - } + gbc.gridy = 0; // row 1 + gbc.gridx = 0; + JLabel memoryText = new JLabel(); + memoryText.setFont(LABEL_FONT_ITALIC); + memoryText + .setText(MessageManager.getString("label.memory_setting_text")); + startupTab.add(memoryText, gbc); - public void deleteLink_actionPerformed(ActionEvent e) - { + gbc.gridy++; // row 2 + gbc.gridx = 0; + JPanel exampleMemoryPanel = new JPanel(); + exampleMemoryPanel + .setLayout(new BoxLayout(exampleMemoryPanel, BoxLayout.Y_AXIS)); + exampleMemoryPanel.setToolTipText(JvSwingUtils.wrapTooltip(true, + MessageManager.getString("label.memory_example_tooltip"))); + JLabel exampleTextLabel = new JLabel(); + exampleTextLabel + .setText(MessageManager.getString("label.memory_example_text")); + exampleTextLabel.setForeground(Color.GRAY); + exampleTextLabel.setFont(LABEL_FONT); + exampleMemoryPanel.add(exampleTextLabel); + exampleMemoryPanel.add(exampleMemoryLabel); + exampleMemoryPanel.setBackground(Color.WHITE); + exampleMemoryPanel.setBorder(BorderFactory.createEtchedBorder()); + startupTab.add(exampleMemoryPanel, gbc); + + gbc.gridy++; // row 3 + gbc.gridx = 0; + startupTab.add(customiseMemorySetting, gbc); - } + gbc.gridy += 2; // row 4 with a gap + gbc.gridx = 0; + startupTab.add(maxMemoryLabel, gbc); - public void defaultBrowser_mouseClicked(MouseEvent e) - { + gbc.gridy += 2; // row 5 + gbc.gridx = 0; + gbc.gridwidth = 1; + startupTab.add(jvmMemoryPercentLabel, gbc); + gbc.gridx++; + startupTab.add(jvmMemoryPercentSlider, gbc); + gbc.gridx++; + // gbc.weightx = 0.1; + startupTab.add(jvmMemoryPercentDisplay, gbc); + // gbc.weightx = 1.0; + gbc.gridwidth = 3; + + gbc.gridy++; // row 6 + gbc.gridx = 0; + startupTab.add(jvmMemoryMaxLabel, gbc); + gbc.gridx++; + startupTab.add(jvmMemoryMaxTextField, gbc); + gbc.gridy++; // row 7 + gbc.gridx = 0; + gbc.gridwidth = 4; + exampleMemoryMessageTextArea.setBackground(startupTab.getBackground()); + JScrollPane sp = new JScrollPane(exampleMemoryMessageTextArea); + sp.setBorder(BorderFactory.createEmptyBorder()); + sp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); + sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); + startupTab.add(sp, gbc); + + // fill empty space to push widget to top left + gbc.gridy++; + gbc.weighty = 1.0; + gbc.gridx = 100; + gbc.gridwidth = 1; + gbc.weightx = 1.0; + startupTab.add(new JPanel(), gbc); + + setMemoryPercentDisplay(); + memoryOptionsSetEnabled(); + return startupTab; } - public void linkURLList_keyTyped(KeyEvent e) + private void initMemoryPanel() { + // Enable memory settings checkbox + customiseMemorySetting.setFont(LABEL_FONT_BOLD); + customiseMemorySetting.setText( + MessageManager.getString("label.customise_memory_settings")); + customiseMemorySetting.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + memoryOptionsSetEnabled(); + } + }); + loadLastSavedMemorySettings(); + + exampleMemoryLabel.setFont(LABEL_FONT_BOLD); + exampleMemoryLabel.setBackground(Color.WHITE); + + maxMemoryLabel = new JLabel( + MessageManager.getString("label.maximum_memory_used")); + maxMemoryLabel.setFont(LABEL_FONT_BOLD); + + // Maximum memory percentage slider + jvmMemoryPercentLabel.setFont(LABEL_FONT); + jvmMemoryPercentLabel.setText( + MessageManager.getString("label.percent_of_physical_memory")); + jvmMemoryPercentSlider.setPaintLabels(true); + jvmMemoryPercentSlider.setPaintTicks(true); + jvmMemoryPercentSlider.setPaintTrack(true); + jvmMemoryPercentSlider.setMajorTickSpacing(50); + jvmMemoryPercentSlider.setMinorTickSpacing(10); + jvmMemoryPercentSlider.addChangeListener(new ChangeListener() + { + @Override + public void stateChanged(ChangeEvent e) + { + setMemoryPercentDisplay(); + } + }); + jvmMemoryPercentDisplay.setFont(LABEL_FONT); + setMemoryPercentDisplay(); + + // Maximum memory cap textbox + jvmMemoryMaxLabel.setFont(LABEL_FONT); + jvmMemoryMaxLabel + .setText(MessageManager.getString("label.maximum_memory")); + initMemoryMaxTextField(); + + exampleMemoryMessageTextArea.setFont(LABEL_FONT_ITALIC); + exampleMemoryMessageTextArea.setForeground(Color.GRAY); + exampleMemoryMessageTextArea.setEditable(false); + exampleMemoryMessageTextArea.setLineWrap(true); + exampleMemoryMessageTextArea.setWrapStyleWord(true); + exampleMemoryMessageTextArea.setText(" "); + exampleMemoryMessageTextArea.setRows(2); + exampleMemoryMessageTextArea.setColumns(40); + + setExampleMemoryLabel(); } - public void useProxy_actionPerformed() - { - boolean enabled = useProxy.isSelected(); - portLabel.setEnabled(enabled); - serverLabel.setEnabled(enabled); - proxyServerTB.setEnabled(enabled); - proxyPortTB.setEnabled(enabled); - } - - public class RadioButtonRenderer extends JRadioButton implements - TableCellRenderer + private void initMemoryMaxTextField() { - public RadioButtonRenderer() + jvmMemoryMaxTextField.setToolTipText( + MessageManager.getString("label.maximum_memory_tooltip")); + jvmMemoryMaxTextField.addActionListener(new ActionListener() { - setHorizontalAlignment(CENTER); + @Override + public void actionPerformed(ActionEvent arg0) + { + validateMemoryMaxTextField(); + setExampleMemoryLabel(); + } + }); + + jvmMemoryMaxTextField.addKeyListener(new KeyListener() + { + @Override + public void keyReleased(KeyEvent e) + { + validateMemoryMaxTextField(); + setExampleMemoryLabel(); + } + + @Override + public void keyPressed(KeyEvent e) + { + } + + // try and stop invalid typing + @Override + public void keyTyped(KeyEvent e) + { + char c = Character.toLowerCase(e.getKeyChar()); + String text = jvmMemoryMaxTextField.getText(); + String suffixes = "tgmkb"; + int pos = jvmMemoryMaxTextField.getCaretPosition(); + int suffixPos = StringUtils.firstCharPosIgnoreCase(text, suffixes); + if (!((('0' <= c && c <= '9') + && (suffixPos == -1 || pos <= suffixPos)) // digits only allowed + // before suffix + || (suffixes.indexOf(Character.toLowerCase(c)) >= 0 // valid + // suffix + && pos == text.length() // at end of text and + && suffixPos == -1) // there isn't already one + )) + { + // don't process + e.consume(); + } + } + }); + } + + private boolean isMemoryMaxTextFieldValid() + { + return MemorySetting + .isValidMemoryString(jvmMemoryMaxTextField.getText()); + } + + private void validateMemoryMaxTextField() + { + if (isMemoryMaxTextFieldValid()) + { + jvmMemoryMaxTextField.setBackground(Color.WHITE); + } + else + { + jvmMemoryMaxTextField.setBackground(Color.PINK); + } + } + + private void setMemoryPercentDisplay() + { + jvmMemoryPercentDisplay + .setText(jvmMemoryPercentSlider.getValue() + "%"); + setExampleMemoryLabel(); + } + + private void setExampleMemoryLabel() + { + boolean selected = customiseMemorySetting.isSelected(); + int jvmmempc = jvmMemoryPercentSlider.getValue(); + String jvmmemmax = jvmMemoryMaxTextField.getText(); + + long mem; + if (selected && (0 <= jvmmempc && jvmmempc <= 100) + && MemorySetting.isValidMemoryString(jvmmemmax)) + { + mem = MemorySetting.getMemorySetting(jvmmemmax, + String.valueOf(jvmmempc), false, true); + } + else + { + mem = MemorySetting.getMemorySetting(null, null, false, true); + } + exampleMemoryLabel.setText(MemorySetting.memoryLongToString(mem)); + String message = MemorySetting.getAdjustmentMessage(); + exampleMemoryMessageTextArea.setText( + MessageManager.getString("label.adjustments_for_this_computer") + + ": " + + (message == null + ? MessageManager.getString("label.none") + : message)); + } + + private void memoryOptionsSetEnabled() + { + boolean enabled = customiseMemorySetting.isSelected(); + // leave exampleMemoryLabel enabled always + maxMemoryLabel.setEnabled(enabled); + jvmMemoryPercentLabel.setEnabled(enabled); + jvmMemoryPercentSlider.setEnabled(enabled); + jvmMemoryPercentDisplay.setEnabled(enabled); + jvmMemoryMaxLabel.setEnabled(enabled); + jvmMemoryMaxTextField.setEnabled(enabled); + exampleMemoryMessageTextArea.setEnabled(enabled); + setExampleMemoryLabel(); + } + + /** + * Initialises the Backups tabbed panel. + * + * @return + */ + private JPanel initBackupsTab() + { + JPanel backupsTab = new JPanel(); + backupsTab.setBorder(new TitledBorder( + MessageManager.getString("label.backup_files"))); + backupsTab.setLayout(new GridBagLayout()); + + GridBagConstraints gbc = new GridBagConstraints(); + gbc.weightx = 0.0; + gbc.weighty = 0.0; + gbc.anchor = GridBagConstraints.FIRST_LINE_START; + gbc.fill = GridBagConstraints.NONE; + + initBackupsTabPresetsPanel(); + initBackupsTabSuffixPanel(); + initBackupsTabKeepFilesPanel(); + initBackupsTabFilenameExamplesPanel(); + + enableBackupFiles.setFont(LABEL_FONT_BOLD); + enableBackupFiles + .setText(MessageManager.getString("label.enable_backupfiles")); + enableBackupFiles.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + // enable other options only when the first is checked + backupsOptionsSetEnabled(); + } + }); + + // enable checkbox 1 col + gbc.gridwidth = 1; + gbc.gridheight = 1; + gbc.gridx = 0; + gbc.gridy = 0; // row 0 + backupsTab.add(enableBackupFiles, gbc); + + // summary of scheme box (over two rows) + gbc.gridx = 1; + gbc.weightx = 0.0; + gbc.gridheight = 2; + gbc.anchor = GridBagConstraints.FIRST_LINE_END; + gbc.fill = GridBagConstraints.BOTH; + backupsTab.add(exampleFilesPanel, gbc); + gbc.gridheight = 1; + gbc.anchor = GridBagConstraints.FIRST_LINE_START; + gbc.fill = GridBagConstraints.NONE; + + // fill empty space on right + gbc.gridx++; + gbc.weightx = 1.0; + backupsTab.add(new JPanel(), gbc); + + // schemes box + gbc.weightx = 0.0; + gbc.gridx = 0; + gbc.gridy++; // row 1 + backupsTab.add(presetsPanel, gbc); + + // now using whole row + gbc.gridwidth = 2; + gbc.gridheight = 1; + // keep files box + gbc.gridx = 0; + gbc.gridy++; // row 2 + backupsTab.add(keepfilesPanel, gbc); + + // filename strategy box + gbc.gridy++; // row 3 + backupsTab.add(suffixPanel, gbc); + + // fill empty space + gbc.gridy++; // row 4 + gbc.weighty = 1.0; + backupsTab.add(new JPanel(), gbc); + + backupsOptionsSetEnabled(); + return backupsTab; + } + + private JPanel initBackupsTabPresetsPanel() + { + + String title = MessageManager.getString("label.schemes"); + + presetsPanel.setLayout(new GridBagLayout()); + + GridBagConstraints gbc = new GridBagConstraints(); + gbc.weightx = 0.0; + gbc.weighty = 0.0; + gbc.anchor = GridBagConstraints.BASELINE_LEADING; + gbc.fill = GridBagConstraints.NONE; + gbc.gridwidth = 1; + gbc.gridheight = 1; + + // "Scheme: " + gbc.gridx = 0; + gbc.gridy = 0; + + presetsComboLabel = new JLabel(title + ":"); + presetsPanel.add(presetsComboLabel, gbc); + + List entries = Arrays.asList( + (Object[]) BackupFilesPresetEntry.backupfilesPresetEntries); + List tooltips = Arrays.asList( + BackupFilesPresetEntry.backupfilesPresetEntryDescriptions); + backupfilesPresetsCombo = JvSwingUtils.buildComboWithTooltips(entries, + tooltips); + /* + for (int i = 0; i < BackupFilesPresetEntry.backupfilesPresetEntries.length; i++) + { + backupfilesPresetsCombo + .addItem(BackupFilesPresetEntry.backupfilesPresetEntries[i]); + } + */ + + backupfilesPresetsCombo.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + int key = getComboIntStringKey(backupfilesPresetsCombo); + if (!customiseCheckbox.isSelected()) + { + backupfilesPresetsComboLastSelected = key; + } + if (key == BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM) + { + if (customiseCheckbox.isSelected()) + { + // got here by clicking on customiseCheckbox so don't change the + // values + backupfilesCustomOptionsSetEnabled(); + } + else + { + backupsTabUpdatePresets(); + backupfilesCustomOptionsSetEnabled(); + } + } + else + { + customiseCheckbox.setSelected(false); + backupsTabUpdatePresets(); + backupfilesCustomOptionsSetEnabled(); + } + } + }); + + // dropdown list of preset schemes + gbc.gridx = 1; + presetsPanel.add(backupfilesPresetsCombo, gbc); + + revertButton.setText(MessageManager.getString("label.cancel_changes")); + revertButton.setToolTipText( + MessageManager.getString("label.cancel_changes_description")); + revertButton.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + backupsSetOptions( + BackupFilesPresetEntry.backupfilesPresetEntriesValues.get( + BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM)); + backupfilesCustomOptionsSetEnabled(); + } + + }); + revertButton.setFont(LABEL_FONT); + + customiseCheckbox.setFont(LABEL_FONT); + customiseCheckbox.setText(MessageManager.getString("label.customise")); + customiseCheckbox.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + int currently = getComboIntStringKey(backupfilesPresetsCombo); + if (customiseCheckbox.isSelected()) + { + backupfilesPresetsComboLastSelected = currently; + setComboIntStringKey(backupfilesPresetsCombo, + BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM); + } + else + { + setComboIntStringKey(backupfilesPresetsCombo, + backupfilesPresetsComboLastSelected); + + } + backupfilesCustomOptionsSetEnabled(); + } + }); + customiseCheckbox.setToolTipText( + MessageManager.getString("label.customise_description")); + + // customise checkbox + gbc.gridx = 0; + gbc.gridy++; + presetsPanel.add(customiseCheckbox, gbc); + + // "Cancel changes" button (aligned with combo box above) + gbc.gridx = 1; + presetsPanel.add(revertButton, gbc); + + return presetsPanel; + } + + private JPanel initBackupsTabFilenameExamplesPanel() + { + String title = MessageManager.getString("label.scheme_examples"); + TitledBorder tb = new TitledBorder(title); + exampleFilesPanel.setBorder(tb); + exampleFilesPanel.setLayout(new GridBagLayout()); + + backupfilesExampleLabel.setEditable(false); + backupfilesExampleLabel + .setBackground(exampleFilesPanel.getBackground()); + + updateBackupFilesExampleLabel(); + + GridBagConstraints gbc = new GridBagConstraints(); + gbc.weightx = 1.0; + gbc.weighty = 1.0; + gbc.fill = GridBagConstraints.NONE; + gbc.anchor = GridBagConstraints.FIRST_LINE_START; + + exampleFilesPanel.add(backupfilesExampleLabel, gbc); + return exampleFilesPanel; + } + + private void backupsTabUpdatePresets() + { + IntKeyStringValueEntry entry = (IntKeyStringValueEntry) backupfilesPresetsCombo + .getSelectedItem(); + int key = entry.k; + String value = entry.v; + + if (BackupFilesPresetEntry.backupfilesPresetEntriesValues + .containsKey(key)) + { + backupsSetOptions( + BackupFilesPresetEntry.backupfilesPresetEntriesValues + .get(key)); + } + else + { + Console.error( + "Preset '" + value + "' [key:" + key + "] not implemented"); + } + + // Custom options will now be enabled when the customiseCheckbox is checked + // (performed above) + // backupfilesCustomOptionsSetEnabled(); + updateBackupFilesExampleLabel(); + } + + protected int getComboIntStringKey( + JComboBox backupfilesPresetsCombo2) + { + IntKeyStringValueEntry e; + try + { + e = (IntKeyStringValueEntry) backupfilesPresetsCombo2 + .getSelectedItem(); + } catch (Exception ex) + { + Console.error( + "Problem casting Combo entry to IntKeyStringValueEntry."); + e = null; + } + return e != null ? e.k : 0; + } + + protected void setComboIntStringKey( + JComboBox backupfilesPresetsCombo2, int key) + { + for (int i = 0; i < backupfilesPresetsCombo2.getItemCount(); i++) + { + IntKeyStringValueEntry e; + try + { + e = (IntKeyStringValueEntry) backupfilesPresetsCombo2.getItemAt(i); + } catch (Exception ex) + { + Console.error( + "Problem casting Combo entry to IntKeyStringValueEntry. Skipping item. "); + continue; + } + if (e.k == key) + { + backupfilesPresetsCombo2.setSelectedIndex(i); + break; + } + } + // backupsTabUpdatePresets(); + } + + private JPanel initBackupsTabSuffixPanel() + { + suffixPanel.setBorder(new TitledBorder( + MessageManager.getString("label.backup_filename_strategy"))); + suffixPanel.setLayout(new GridBagLayout()); + + suffixTemplateLabel + .setText(MessageManager.getString("label.append_to_filename")); + suffixTemplateLabel.setHorizontalAlignment(SwingConstants.LEFT); + suffixTemplateLabel.setFont(LABEL_FONT); + + final String tooltip = JvSwingUtils.wrapTooltip(true, + MessageManager.getString("label.append_to_filename_tooltip")); + suffixTemplate.setToolTipText(tooltip); + suffixTemplate.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + updateBackupFilesExampleLabel(); + backupfilesCustomOptionsSetEnabled(); + backupfilesRevertButtonSetEnabled(true); + } + + }); + suffixTemplate.addKeyListener(new KeyListener() + { + @Override + public void keyReleased(KeyEvent e) + { + updateBackupFilesExampleLabel(); + backupfilesCustomOptionsSetEnabled(); + backupfilesRevertButtonSetEnabled(true); + } + + @Override + public void keyPressed(KeyEvent e) + { + } + + // disable use of ':' or '/' or '\' + @Override + public void keyTyped(KeyEvent e) + { + char c = e.getKeyChar(); + if (c == ':' || c == '/' || c == '\\') + { + // don't process ':' or '/' or '\' + e.consume(); + } + } + + }); + + // digits spinner + suffixDigitsLabel + .setText(MessageManager.getString("label.index_digits")); + suffixDigitsLabel.setHorizontalAlignment(SwingConstants.LEFT); + suffixDigitsLabel.setFont(LABEL_FONT); + ChangeListener c = new ChangeListener() + { + @Override + public void stateChanged(ChangeEvent e) + { + backupfilesRevertButtonSetEnabled(true); + updateBackupFilesExampleLabel(); + } + + }; + setIntegerSpinner(suffixDigitsSpinner, BackupFilesPresetEntry.DIGITSMIN, + BackupFilesPresetEntry.DIGITSMAX, 3, c); + + suffixReverse.setLabels(MessageManager.getString("label.reverse_roll"), + MessageManager.getString("label.increment_index")); + suffixReverse.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + boolean okay = true; + if (warnAboutSuffixReverseChange()) + { + // Warning popup + okay = confirmSuffixReverseChange(); + } + if (okay) + { + backupfilesRevertButtonSetEnabled(true); + updateBackupFilesExampleLabel(); + } + else + { + boolean savedSuffixReverse = BackupFilesPresetEntry + .getSavedBackupEntry().reverse; + suffixReverse.setSelected(savedSuffixReverse); + } + } + }); + + GridBagConstraints sgbc = new GridBagConstraints(); + + // first row (template text box) + sgbc.anchor = GridBagConstraints.WEST; + sgbc.gridx = 0; + sgbc.gridy = 0; + sgbc.gridwidth = 1; + sgbc.gridheight = 1; + sgbc.weightx = 1.0; + sgbc.weighty = 0.0; + sgbc.fill = GridBagConstraints.NONE; + suffixPanel.add(suffixTemplateLabel, sgbc); + + sgbc.gridx = 1; + sgbc.fill = GridBagConstraints.HORIZONTAL; + suffixPanel.add(suffixTemplate, sgbc); + + // second row (number of digits spinner) + sgbc.gridy = 1; + + sgbc.gridx = 0; + sgbc.fill = GridBagConstraints.NONE; + suffixPanel.add(suffixDigitsLabel, sgbc); + + sgbc.gridx = 1; + sgbc.fill = GridBagConstraints.HORIZONTAL; + suffixPanel.add(suffixDigitsSpinner, sgbc); + + // third row (forward order radio selection) + sgbc.gridx = 0; + sgbc.gridy = 2; + sgbc.gridwidth = GridBagConstraints.REMAINDER; + sgbc.fill = GridBagConstraints.HORIZONTAL; + suffixPanel.add(suffixReverse.getFalseButton(), sgbc); + + // fourth row (reverse order radio selection) + sgbc.gridy = 3; + suffixPanel.add(suffixReverse.getTrueButton(), sgbc); + return suffixPanel; + } + + private boolean confirmSuffixReverseChange() + { + boolean ret = false; + String warningMessage = MessageManager + .getString("label.warning_confirm_change_reverse"); + int confirm = JvOptionPane.showConfirmDialog(Desktop.desktop, + warningMessage, + MessageManager.getString("label.change_increment_decrement"), + JvOptionPane.YES_NO_OPTION, JvOptionPane.WARNING_MESSAGE); + + ret = (confirm == JvOptionPane.YES_OPTION); + return ret; + } + + private JPanel initBackupsTabKeepFilesPanel() + { + keepfilesPanel.setBorder( + new TitledBorder(MessageManager.getString("label.keep_files"))); + keepfilesPanel.setLayout(new GridBagLayout()); + + backupfilesKeepAll.setLabels( + MessageManager.getString("label.keep_all_backup_files"), + MessageManager.getString( + "label.keep_only_this_number_of_backup_files")); + backupfilesKeepAll.addTrueActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + backupfilesRevertButtonSetEnabled(true); + updateBackupFilesExampleLabel(); + } + }); + backupfilesKeepAll.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + backupfilesRevertButtonSetEnabled(true); + keepRollMaxOptionsEnabled(); + updateBackupFilesExampleLabel(); + } + }); + + ChangeListener c = new ChangeListener() + { + @Override + public void stateChanged(ChangeEvent e) + { + backupfilesRevertButtonSetEnabled(true); + updateBackupFilesExampleLabel(); + } + + }; + setIntegerSpinner(backupfilesRollMaxSpinner, + BackupFilesPresetEntry.ROLLMAXMIN, + BackupFilesPresetEntry.ROLLMAXMAX, 4, true, c); + + backupfilesConfirmDelete.setLabels( + MessageManager.getString("label.always_ask"), + MessageManager.getString("label.auto_delete")); + backupfilesConfirmDelete.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + backupfilesRevertButtonSetEnabled(true); + } + }); + // update the enabled section + keepRollMaxOptionsEnabled(); + + GridBagConstraints kgbc = new GridBagConstraints(); + + // first row (template text box) + kgbc.anchor = GridBagConstraints.WEST; + kgbc.gridx = 0; + kgbc.gridy = 0; + kgbc.gridwidth = GridBagConstraints.REMAINDER; + kgbc.gridheight = 1; + kgbc.weightx = 1.0; + kgbc.weighty = 0.0; + kgbc.fill = GridBagConstraints.HORIZONTAL; + keepfilesPanel.add(backupfilesKeepAll.getTrueButton(), kgbc); + + // second row + kgbc.gridy = 1; + + kgbc.gridx = 0; + kgbc.gridwidth = GridBagConstraints.RELATIVE; + keepfilesPanel.add(backupfilesKeepAll.getFalseButton(), kgbc); + + kgbc.gridx = 1; + kgbc.gridwidth = GridBagConstraints.REMAINDER; + keepfilesPanel.add(backupfilesRollMaxSpinner, kgbc); + + // third row (indented) + kgbc.gridy = 2; + kgbc.insets = new Insets(0, 20, 0, 0); + + kgbc.gridx = 0; + kgbc.gridwidth = GridBagConstraints.REMAINDER; + kgbc.fill = GridBagConstraints.HORIZONTAL; + kgbc.weightx = 1.0; + + JPanel jp = new JPanel(); + jp.setLayout(new FlowLayout()); + oldBackupFilesLabel.setText( + MessageManager.getString("label.autodelete_old_backup_files")); + oldBackupFilesLabel.setFont(LABEL_FONT); + oldBackupFilesLabel.setHorizontalAlignment(SwingConstants.LEFT); + jp.add(oldBackupFilesLabel); + jp.add(backupfilesConfirmDelete.getTrueButton()); + jp.add(backupfilesConfirmDelete.getFalseButton()); + keepfilesPanel.add(jp, kgbc); + + return keepfilesPanel; + } + + protected void updateBackupFilesExampleLabel() + { + int exampleindex = 12; + String base = MessageManager.getString("label.filename") + ".fa"; + if (base == null || base.length() == 0) + { + base = "file_name.fa"; + } + + boolean reverse = suffixReverse.isSelected(); + boolean keepAll = backupfilesKeepAll.isSelected(); + int rollMax = 4; + String suffix = suffixTemplate.getText(); + int digits = 3; + + backupfilesExampleLabel.setFont(LABEL_FONT_ITALIC); + if (suffix == null || suffix.length() == 0) + { + backupfilesExampleLabel + .setText(MessageManager.getString("label.no_backup_files")); + backupfilesExampleLabel.setFont(LABEL_FONT_BOLD); + return; + } + + rollMax = getSpinnerInt(backupfilesRollMaxSpinner, 4); + rollMax = rollMax < 1 ? 1 : rollMax; + + if (suffix.indexOf(BackupFiles.NUM_PLACEHOLDER) == -1) + { + rollMax = 1; + } + + digits = getSpinnerInt(suffixDigitsSpinner, 3); + digits = digits < 1 ? 1 : digits; + + int lowersurround = 2; + int uppersurround = 0; + StringBuilder exampleSB = new StringBuilder(); + boolean firstLine = true; + int lineNumber = 0; + if (reverse) + { + + int min = 1; + int max = keepAll ? exampleindex : rollMax; + for (int index = min; index <= max; index++) + { + if (index == min + lowersurround && index < max - uppersurround - 1) + { + exampleSB.append("\n..."); + lineNumber++; + } + else if (index > min + lowersurround && index < max - uppersurround) + { + // nothing + } + else + { + if (firstLine) + { + firstLine = false; + } + else + { + exampleSB.append("\n"); + lineNumber++; + } + exampleSB.append(BackupFilenameParts.getBackupFilename(index, + base, suffix, digits)); + if (min == max) + { + // no extra text needed + } + else if (index == min) + { + String newest = MessageManager.getString("label.braced_newest"); + if (newest != null && newest.length() > 0) + { + exampleSB.append(" " + newest); + } + } + else if (index == max) + { + String oldest = MessageManager.getString("label.braced_oldest"); + if (oldest != null && oldest.length() > 0) + { + exampleSB.append(" " + oldest); + } + } + } + } + } + else + { + + int min = (keepAll || exampleindex - rollMax < 0) ? 1 + : exampleindex - rollMax + 1; + int max = exampleindex; + + for (int index = min; index <= max; index++) + { + + if (index == min + lowersurround && index < max - uppersurround - 1) + { + exampleSB.append("\n..."); + lineNumber++; + } + else if (index > min + lowersurround && index < max - uppersurround) + { + // nothing + } + else + { + if (firstLine) + { + firstLine = false; + } + else + { + exampleSB.append("\n"); + lineNumber++; + } + exampleSB.append(BackupFilenameParts.getBackupFilename(index, + base, suffix, digits)); + if (min == max) + { + // no extra text needed + } + else if (index == min) + { + String oldest = MessageManager.getString("label.braced_oldest"); + if (oldest != null && oldest.length() > 0) + { + exampleSB.append(" " + oldest); + } + } + else if (index == max) + { + String newest = MessageManager.getString("label.braced_newest"); + if (newest != null && newest.length() > 0) + { + exampleSB.append(" " + newest); + } + } + } + } + + } + + // add some extra empty lines to pad out the example files box. ugh, please + // tell + // me how to do this better + int remainingLines = lowersurround + uppersurround + 1 - lineNumber; + if (remainingLines > 0) + { + for (int i = 0; i < remainingLines; i++) + { + exampleSB.append("\n "); + lineNumber++; + } + } + + backupfilesExampleLabel.setText(exampleSB.toString()); + } + + protected void setIntegerSpinner(JSpinner s, int min, int max, int def, + boolean useExistingVal, ChangeListener c) + { + int i = def; + if (useExistingVal) + { + try + { + i = ((Integer) s.getValue()).intValue(); + } catch (Exception e) + { + Console.error( + "Exception casting the initial value of s.getValue()"); + } + } + + setIntegerSpinner(s, min, max, i, c); + } + + protected void setIntegerSpinner(JSpinner s, int min, int max, int def, + ChangeListener c) + { + // integer spinner for number of digits + if (def > max) + { + max = def; + } + if (def < min) + { + def = min; + } + SpinnerModel sModel = new SpinnerNumberModel(def, min, max, 1); + s.setModel(sModel); + + s.addChangeListener(c); + + } + + protected static int getSpinnerInt(JSpinner s, int def) + { + int i = def; + try + { + s.commitEdit(); + i = (Integer) s.getValue(); + } catch (Exception e) + { + Console.error("Failed casting (Integer) JSpinner s.getValue()"); + } + return i; + } + + private void keepRollMaxOptionsEnabled() + { + boolean enabled = backupfilesKeepAll.isEnabled() + && !backupfilesKeepAll.isSelected(); + oldBackupFilesLabel.setEnabled(enabled); + backupfilesRollMaxSpinner.setEnabled(enabled); + backupfilesConfirmDelete.setEnabled(enabled); + } + + private void backupfilesKeepAllSetEnabled(boolean tryEnabled) + { + boolean enabled = tryEnabled && enableBackupFiles.isSelected() + && customiseCheckbox.isSelected() && suffixTemplate.getText() + .indexOf(BackupFiles.NUM_PLACEHOLDER) > -1; + keepfilesPanel.setEnabled(enabled); + backupfilesKeepAll.setEnabled(enabled); + oldBackupFilesLabel.setEnabled(enabled); + keepRollMaxOptionsEnabled(); + } + + private void backupfilesSuffixTemplateDigitsSetEnabled() + { + boolean enabled = suffixTemplate.isEnabled() && suffixTemplate.getText() + .indexOf(BackupFiles.NUM_PLACEHOLDER) > -1; + suffixDigitsLabel.setEnabled(enabled); + suffixDigitsSpinner.setEnabled(enabled); + suffixReverse.setEnabled(enabled); + } + + private void backupfilesSuffixTemplateSetEnabled(boolean tryEnabled) + { + boolean enabled = tryEnabled && enableBackupFiles.isSelected() + && customiseCheckbox.isSelected(); + suffixPanel.setEnabled(enabled); + suffixTemplateLabel.setEnabled(enabled); + suffixTemplate.setEnabled(enabled); + backupfilesSuffixTemplateDigitsSetEnabled(); + } + + private void backupfilesRevertButtonSetEnabled(boolean tryEnabled) + { + boolean enabled = tryEnabled && enableBackupFiles.isSelected() + && customiseCheckbox.isSelected() && backupfilesCustomChanged(); + revertButton.setEnabled(enabled); + } + + private boolean backupfilesCustomChanged() + { + BackupFilesPresetEntry custom = BackupFilesPresetEntry.backupfilesPresetEntriesValues + .get(BackupFilesPresetEntry.BACKUPFILESSCHEMECUSTOM); + BackupFilesPresetEntry current = getBackupfilesCurrentEntry(); + return !custom.equals(current); + } + + protected BackupFilesPresetEntry getBackupfilesCurrentEntry() + { + String suffix = suffixTemplate.getText(); + int digits = getSpinnerInt(suffixDigitsSpinner, 3); + boolean reverse = suffixReverse.isSelected(); + boolean keepAll = backupfilesKeepAll.isSelected(); + int rollMax = getSpinnerInt(backupfilesRollMaxSpinner, 3); + boolean confirmDelete = backupfilesConfirmDelete.isSelected(); + + BackupFilesPresetEntry bfpe = new BackupFilesPresetEntry(suffix, digits, + reverse, keepAll, rollMax, confirmDelete); + + return bfpe; + } + + protected void backupfilesCustomOptionsSetEnabled() + { + boolean enabled = customiseCheckbox.isSelected(); + + backupfilesRevertButtonSetEnabled(enabled); + backupfilesSuffixTemplateSetEnabled(enabled); + backupfilesKeepAllSetEnabled(enabled); + } + + private void backupfilesSummarySetEnabled() + { + boolean enabled = enableBackupFiles.isSelected(); + backupfilesExampleLabel.setEnabled(enabled); + exampleFilesPanel.setEnabled(enabled); + } + + private void backupfilesPresetsSetEnabled() + { + boolean enabled = enableBackupFiles.isSelected(); + presetsPanel.setEnabled(enabled); + presetsComboLabel.setEnabled(enabled); + backupfilesPresetsCombo.setEnabled(enabled); + customiseCheckbox.setEnabled(enabled); + revertButton.setEnabled(enabled); + } + + protected void backupsOptionsSetEnabled() + { + backupfilesPresetsSetEnabled(); + backupfilesSummarySetEnabled(); + backupfilesCustomOptionsSetEnabled(); + } + + protected void backupsSetOptions(String suffix, int digits, + boolean reverse, boolean keepAll, int rollMax, + boolean confirmDelete) + { + suffixTemplate.setText(suffix); + suffixDigitsSpinner.setValue(digits); + suffixReverse.setSelected(reverse); + backupfilesKeepAll.setSelected(keepAll); + backupfilesRollMaxSpinner.setValue(rollMax); + backupfilesConfirmDelete.setSelected(confirmDelete); + } + + protected void backupsSetOptions(BackupFilesPresetEntry p) + { + backupsSetOptions(p.suffix, p.digits, p.reverse, p.keepAll, p.rollMax, + p.confirmDelete); + } + + protected void autoIdWidth_actionPerformed() + { + // TODO Auto-generated method stub + + } + + protected void userIdWidth_actionPerformed() + { + // TODO Auto-generated method stub + + } + + protected void maxColour_actionPerformed(JPanel panel) + { + } + + protected void minColour_actionPerformed(JPanel panel) + { + } + + protected void gapColour_actionPerformed(JPanel panel) + { + } + + protected void hiddenColour_actionPerformed(JPanel panel) + { + } + + protected void showunconserved_actionPerformed(ActionEvent e) + { + // TODO Auto-generated method stub + + } + + protected void useLegacyGaps_actionPerformed(ActionEvent e) + { + } + + protected void resetOvDefaults_actionPerformed(ActionEvent e) + { + } + + /** + * DOCUMENT ME! + * + * @param e + * DOCUMENT ME! + */ + public void ok_actionPerformed(ActionEvent e) + { + } + + /** + * DOCUMENT ME! + * + * @param e + * DOCUMENT ME! + */ + public void cancel_actionPerformed(ActionEvent e) + { + } + + /** + * DOCUMENT ME! + * + * @param e + * DOCUMENT ME! + */ + public void annotations_actionPerformed(ActionEvent e) + { + } + + /** + * DOCUMENT ME! + */ + public void startupFileTextfield_mouseClicked() + { + } + + public void newLink_actionPerformed(ActionEvent e) + { + + } + + public void editLink_actionPerformed(ActionEvent e) + { + + } + + public void deleteLink_actionPerformed(ActionEvent e) + { + + } + + public void defaultBrowser_mouseClicked(MouseEvent e) + { + + } + + public void linkURLList_keyTyped(KeyEvent e) + { + + } + + public void setProxyAuthEnabled() + { + boolean enabled = proxyAuth.isSelected() && proxyAuth.isEnabled(); + proxyAuthUsernameLabel.setEnabled(enabled); + proxyAuthPasswordLabel.setEnabled(enabled); + passwordNotStoredLabel.setEnabled(enabled); + proxyAuthUsernameTB.setEnabled(enabled); + proxyAuthPasswordPB.setEnabled(enabled); + } + + public void setCustomProxyEnabled() + { + boolean enabled = customProxy.isSelected(); + portLabel.setEnabled(enabled); + serverLabel.setEnabled(enabled); + portLabel2.setEnabled(enabled); + serverLabel2.setEnabled(enabled); + httpLabel.setEnabled(enabled); + httpsLabel.setEnabled(enabled); + proxyServerHttpTB.setEnabled(enabled); + proxyPortHttpTB.setEnabled(enabled); + proxyServerHttpsTB.setEnabled(enabled); + proxyPortHttpsTB.setEnabled(enabled); + proxyAuth.setEnabled(enabled); + setProxyAuthEnabled(); + } + + public void proxyType_actionPerformed() + { + setCustomProxyEnabled(); + proxyAuthPasswordCheckHighlight(true); + applyProxyButtonEnabled(true); + } + + public void proxyAuth_actionPerformed() + { + setProxyAuthEnabled(); + proxyAuthPasswordCheckHighlight(true); + applyProxyButtonEnabled(true); + } + + /** + * Customer renderer for JTable: supports column of radio buttons + */ + public class RadioButtonRenderer extends JRadioButton + implements TableCellRenderer + { + public RadioButtonRenderer() + { + setHorizontalAlignment(CENTER); + setToolTipText(MessageManager.getString("label.urltooltip")); } @Override @@ -1524,22 +3628,22 @@ public class GPreferences extends JPanel setBackground(table.getBackground()); setForeground(table.getForeground()); } - - // adjust row height so radio buttons actually fit - table.setRowHeight(row, getMinimumSize().height); - return this; } } - public class RadioButtonEditor extends AbstractCellEditor implements - TableCellEditor + /** + * Customer cell editor for JTable: supports column of radio buttons in + * conjunction with renderer + */ + public class RadioButtonEditor extends AbstractCellEditor + implements TableCellEditor { private JRadioButton button = new JRadioButton(); public RadioButtonEditor() { - this.button.setHorizontalAlignment(SwingConstants.CENTER); + button.setHorizontalAlignment(SwingConstants.CENTER); this.button.addActionListener(new ActionListener() { @Override @@ -1551,8 +3655,8 @@ public class GPreferences extends JPanel } @Override - public Component getTableCellEditorComponent(JTable table, - Object value, boolean isSelected, int row, int column) + public Component getTableCellEditorComponent(JTable table, Object value, + boolean isSelected, int row, int column) { button.setSelected((boolean) value); return button;