X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fjbgui%2FGPreferences.java;h=dfe08edd68b37fe19781da67e0602b7251d7326b;hb=d043ce47fc710d3eb2629ba926a8a7417bd67d8c;hp=a4c03bed0bb70473b8431b779349076042f3284b;hpb=49db0dff1da16c3355b43a41498c1fc93ef47e91;p=jalview.git diff --git a/src/jalview/jbgui/GPreferences.java b/src/jalview/jbgui/GPreferences.java index a4c03be..dfe08ed 100755 --- a/src/jalview/jbgui/GPreferences.java +++ b/src/jalview/jbgui/GPreferences.java @@ -21,6 +21,8 @@ package jalview.jbgui; 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; @@ -35,6 +37,7 @@ import jalview.io.BackupFilesPresetEntry; import jalview.io.IntKeyStringValueEntry; import jalview.util.MessageManager; import jalview.util.Platform; +import jalview.util.StringUtils; import java.awt.BorderLayout; import java.awt.Color; @@ -73,6 +76,7 @@ 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; @@ -93,6 +97,8 @@ import javax.swing.event.DocumentListener; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; +import net.miginfocom.swing.MigLayout; + /** * Base class for the Preferences panel. * @@ -181,7 +187,6 @@ public class GPreferences extends JPanel protected JCheckBox structFromPdb = new JCheckBox(); - protected JCheckBox addSecondaryStructure = new JCheckBox(); protected JCheckBox addTempFactor = new JCheckBox(); @@ -403,6 +408,30 @@ public class GPreferences extends JPanel 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. */ @@ -426,8 +455,10 @@ public class GPreferences extends JPanel { // 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); @@ -462,12 +493,14 @@ public class GPreferences extends JPanel tabbedPane.add(initEditingTab(), MessageManager.getString("label.editing")); - tabbedPane.add(initHMMERTab(), MessageManager.getString("label.hmmer")); /* * See WsPreferences for the real work of configuring this tab. */ if (!Platform.isJS()) { + tabbedPane.add(initHMMERTab(), MessageManager.getString("label.hmmer")); + tabbedPane.add(initStartupTab(), + MessageManager.getString("label.startup")); wsTab.setLayout(new BorderLayout()); tabbedPane.add(wsTab, MessageManager.getString("label.web_services")); } @@ -497,6 +530,7 @@ public class GPreferences extends JPanel } } lastTab = tabbedPane.getSelectedComponent(); + clearMessage(); } @@ -861,44 +895,10 @@ public class GPreferences extends 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")); - 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 - public void mouseClicked(MouseEvent e) - { - if (e.getClickCount() > 1) - { - defaultBrowser_mouseClicked(e); - } - } - }); JPanel proxyPanel = initConnTabProxyPanel(); initConnTabCheckboxes(); - // Add default Browser text box - 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); - defaultBrowser.setText(""); - - 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, 1, 2, 1, 1.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, @@ -1273,6 +1273,7 @@ public class GPreferences extends JPanel proxyAuth_actionPerformed(); } }); + setCustomProxyEnabled(); // Make proxy server panel @@ -1809,7 +1810,6 @@ public class GPreferences extends JPanel structureTab.add(structFromPdb); // indent checkboxes that are conditional on the first one - ypos += lineSpacing; addSecondaryStructure.setFont(LABEL_FONT); addSecondaryStructure @@ -1878,35 +1878,7 @@ public class GPreferences extends JPanel { if (structureViewerPath.isEnabled() && e.getClickCount() == 2) { - structureViewer_actionPerformed( - (String) structViewer.getSelectedItem()); - } - }); - structureTab.add(structViewer); - ypos += lineSpacing; - 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.viewer_path_tip")); - structureViewerPath.setToolTipText(tooltip); - structureViewerPath.setBounds(new Rectangle(190, ypos, 290, height)); - structureViewerPath.addMouseListener(new MouseAdapter() - { - if (structureViewerPath.isEnabled() && e.getClickCount() == 2) - { - String chosen = openFileChooser(); + String chosen = openFileChooser(false); if (chosen != null) { structureViewerPath.setText(chosen); @@ -1953,6 +1925,7 @@ public class GPreferences extends JPanel viewerLabel.setVisible(false); structViewer.setVisible(false); } + return structureTab; } @@ -1988,7 +1961,6 @@ public class GPreferences extends JPanel { chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); } - // chooser.setFileView(new JalviewFileView()); chooser.setDialogTitle( MessageManager.getString("label.open_local_file")); @@ -2342,12 +2314,14 @@ public class GPreferences extends JPanel visualTab.add(fontNameCB); visualTab.add(fontSizeCB); visualTab.add(fontStyleCB); + if (Platform.isJS()) { startupCheckbox.setVisible(false); startupFileTextfield.setVisible(false); } + return visualTab; } @@ -2385,6 +2359,18 @@ public class GPreferences extends JPanel updateBackupFilesExampleLabel(); } + /* + * Load the saved Memory settings + */ + 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")); + } private boolean warnAboutSuffixReverseChange() { BackupFilesPresetEntry bfpe = BackupFilesPresetEntry @@ -2402,6 +2388,285 @@ public class GPreferences extends JPanel && nowSuffixTemplate.equals(savedSuffixTemplate); } + /* Initialises the Startup tabbed panel. + * + * @return + * */ + + private JPanel initStartupTab() + { + JPanel startupTab = new JPanel(); + startupTab.setBorder( + new TitledBorder(MessageManager.getString("label.memory"))); + startupTab.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; + + initMemoryPanel(); + + 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); + + 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); + + 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; + } + + 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(); + } + + private void initMemoryMaxTextField() + { + jvmMemoryMaxTextField.setToolTipText( + MessageManager.getString("label.maximum_memory_tooltip")); + jvmMemoryMaxTextField.addActionListener(new ActionListener() + { + @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. * @@ -2438,7 +2703,6 @@ public class GPreferences extends JPanel } }); - // enable checkbox 1 col gbc.gridwidth = 1; gbc.gridheight = 1; @@ -2624,7 +2888,6 @@ public class GPreferences extends JPanel exampleFilesPanel.setBorder(tb); exampleFilesPanel.setLayout(new GridBagLayout()); - backupfilesExampleLabel.setEditable(false); backupfilesExampleLabel .setBackground(exampleFilesPanel.getBackground()); @@ -2657,7 +2920,7 @@ public class GPreferences extends JPanel } else { - Cache.log.error( + Console.error( "Preset '" + value + "' [key:" + key + "] not implemented"); } @@ -2677,7 +2940,7 @@ public class GPreferences extends JPanel .getSelectedItem(); } catch (Exception ex) { - Cache.log.error( + Console.error( "Problem casting Combo entry to IntKeyStringValueEntry."); e = null; } @@ -2696,7 +2959,7 @@ public class GPreferences extends JPanel e = (IntKeyStringValueEntry) backupfilesPresetsCombo2.getItemAt(i); } catch (Exception ex) { - Cache.log.error( + Console.error( "Problem casting Combo entry to IntKeyStringValueEntry. Skipping item. "); continue; } @@ -3144,7 +3407,7 @@ public class GPreferences extends JPanel i = ((Integer) s.getValue()).intValue(); } catch (Exception e) { - Cache.log.error( + Console.error( "Exception casting the initial value of s.getValue()"); } } @@ -3180,7 +3443,7 @@ public class GPreferences extends JPanel i = (Integer) s.getValue(); } catch (Exception e) { - Cache.log.error("Failed casting (Integer) JSpinner s.getValue()"); + Console.error("Failed casting (Integer) JSpinner s.getValue()"); } return i; } @@ -3559,4 +3822,3 @@ public class GPreferences extends JPanel panel.validate(); } } -