X-Git-Url: http://source.jalview.org/gitweb/?p=jalview.git;a=blobdiff_plain;f=src%2Fjalview%2Ffts%2Fcore%2FGFTSPanel.java;h=f73d43050666ff2dc27deeca64f1850523f8c64a;hp=a33840026707ad17cebc8a31267273083298fd56;hb=679d96501d13df061a2bc1b6cb9757256253d267;hpb=75415606931bbe145f471ff2e13abefc431dbd2c diff --git a/src/jalview/fts/core/GFTSPanel.java b/src/jalview/fts/core/GFTSPanel.java index a338400..f73d430 100644 --- a/src/jalview/fts/core/GFTSPanel.java +++ b/src/jalview/fts/core/GFTSPanel.java @@ -21,21 +21,10 @@ package jalview.fts.core; -import jalview.fts.api.FTSDataColumnI; -import jalview.fts.api.GFTSPanelI; -import jalview.fts.core.FTSDataColumnPreferences.PreferenceSource; -import jalview.gui.Desktop; -import jalview.gui.IProgressIndicator; -import jalview.gui.JvSwingUtils; -import jalview.gui.SequenceFetcher; -import jalview.io.cache.AppCache; -import jalview.io.cache.CacheBoxI; -import jalview.io.cache.Cacheable; -import jalview.util.MessageManager; - import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Dimension; +import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusAdapter; @@ -58,6 +47,7 @@ import java.util.List; import javax.swing.ImageIcon; import javax.swing.JButton; +import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JInternalFrame; @@ -74,7 +64,18 @@ import javax.swing.event.DocumentListener; import javax.swing.event.InternalFrameEvent; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableColumn; -import javax.swing.text.JTextComponent; + +import jalview.bin.Cache; +import jalview.fts.api.FTSDataColumnI; +import jalview.fts.api.GFTSPanelI; +import jalview.fts.core.FTSDataColumnPreferences.PreferenceSource; +import jalview.gui.Desktop; +import jalview.gui.IProgressIndicator; +import jalview.gui.JvSwingUtils; +import jalview.gui.SequenceFetcher; +import jalview.io.cache.JvCacheableInputBox; +import jalview.util.MessageManager; +import jalview.util.Platform; /** * This class provides the swing GUI layout for FTS Panel and implements most of @@ -85,14 +86,18 @@ import javax.swing.text.JTextComponent; */ @SuppressWarnings("serial") -public abstract class GFTSPanel extends JPanel implements GFTSPanelI, Cacheable +public abstract class GFTSPanel extends JPanel implements GFTSPanelI { + private static final Font VERDANA_12 = new Font("Verdana", 0, 12); + protected JInternalFrame mainFrame = new JInternalFrame( getFTSFrameTitle()); + protected JTabbedPane tabs = new JTabbedPane(); + protected IProgressIndicator progressIndicator; - protected JComboBox cmb_searchTarget = new JComboBox(); + protected JComboBox cmb_searchTarget = new JComboBox<>(); protected JButton btn_ok = new JButton(); @@ -100,7 +105,9 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI, Cacheable protected JButton btn_cancel = new JButton(); - protected JComboBox txt_search; + protected JCheckBox btn_autosearch = new JCheckBox(); + + protected JvCacheableInputBox txt_search; protected SequenceFetcher seqFetcher; @@ -114,14 +121,14 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI, Cacheable protected StringBuilder errorWarning = new StringBuilder(); - protected ImageIcon warningImage = new ImageIcon(getClass().getResource( - "/images/warning.gif")); + protected ImageIcon warningImage = new ImageIcon( + getClass().getResource("/images/warning.gif")); - protected ImageIcon loadingImage = new ImageIcon(getClass().getResource( - "/images/loading.gif")); + protected ImageIcon loadingImage = new ImageIcon( + getClass().getResource("/images/loading.gif")); - protected ImageIcon balnkPlaceholderImage = new ImageIcon(getClass() - .getResource("/images/blank_16x16_placeholder.png")); + protected ImageIcon balnkPlaceholderImage = new ImageIcon( + getClass().getResource("/images/blank_16x16_placeholder.png")); protected JLabel lbl_warning = new JLabel(warningImage); @@ -129,7 +136,7 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI, Cacheable protected JLabel lbl_blank = new JLabel(balnkPlaceholderImage); - private JTabbedPane tabbedPane = new JTabbedPane(); + JTabbedPane tabbedPane = new JTabbedPane(); private JPanel pnl_actions = new JPanel(); @@ -149,7 +156,11 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI, Cacheable protected int pageLimit; - protected HashSet paginatorCart = new HashSet(); + protected HashSet paginatorCart = new HashSet<>(); + + private static final int MIN_WIDTH = 670; + + private static final int MIN_HEIGHT = 300; protected static final DecimalFormat totalNumberformatter = new DecimalFormat( "###,###"); @@ -224,8 +235,9 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI, Cacheable e.printStackTrace(); } toolTipText = (toolTipText == null ? null - : (toolTipText.length() > 500 ? JvSwingUtils.wrapTooltip( - true, toolTipText.subSequence(0, 500) + "...") + : (toolTipText.length() > 500 + ? JvSwingUtils.wrapTooltip(true, + toolTipText.subSequence(0, 500) + "...") : JvSwingUtils.wrapTooltip(true, toolTipText))); return toolTipText; @@ -236,15 +248,36 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI, Cacheable public GFTSPanel() { + this(null); + } + + public GFTSPanel(SequenceFetcher fetcher) + { try { + if (fetcher == null) + { + tabs = null; + } jbInit(); + if (fetcher != null) + { + tabs.addTab(MessageManager.getString("label.retrieve_ids"), + fetcher); + fetcher.embedIn(this); + } + mainFrame.setMinimumSize(new Dimension(MIN_WIDTH, MIN_HEIGHT)); + final JPanel ftsPanel = this; mainFrame.addFocusListener(new FocusAdapter() { @Override public void focusGained(FocusEvent e) { - txt_search.requestFocusInWindow(); + // TODO: make selected tab gain focus in correct widget + if (tabs != null && tabs.getSelectedComponent() == ftsPanel) + { + txt_search.getComponent().requestFocusInWindow(); + } } }); mainFrame.invalidate(); @@ -263,21 +296,18 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI, Cacheable private void jbInit() throws Exception { - txt_search = new JComboBox(); - txt_search.setEditable(true); - txt_search - .setPrototypeDisplayValue("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"); + txt_search = new JvCacheableInputBox<>(getCacheKey(), 45); populateCmbSearchTargetOptions(); Integer width = getTempUserPrefs().get("FTSPanel.width") == null ? 800 : getTempUserPrefs().get("FTSPanel.width"); Integer height = getTempUserPrefs().get("FTSPanel.height") == null ? 400 : getTempUserPrefs().get("FTSPanel.height"); lbl_warning.setVisible(false); - lbl_warning.setFont(new java.awt.Font("Verdana", 0, 12)); + lbl_warning.setFont(VERDANA_12); lbl_loading.setVisible(false); - lbl_loading.setFont(new java.awt.Font("Verdana", 0, 12)); + lbl_loading.setFont(VERDANA_12); lbl_blank.setVisible(true); - lbl_blank.setFont(new java.awt.Font("Verdana", 0, 12)); + lbl_blank.setFont(VERDANA_12); tbl_summary.setAutoCreateRowSorter(true); tbl_summary.getTableHeader().setReorderingAllowed(false); @@ -330,7 +360,35 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI, Cacheable } }); - btn_back.setFont(new java.awt.Font("Verdana", 0, 12)); + JButton txt_help = new JButton("?"); + txt_help.setFont(VERDANA_12); + txt_help.setPreferredSize(new Dimension(15, 15)); + txt_help.setToolTipText(MessageManager.getString("action.help")); + txt_help.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + showHelp(); + } + }); + + btn_autosearch.setText(MessageManager.getString("option.autosearch")); + btn_autosearch.setToolTipText( + MessageManager.getString("option.enable_disable_autosearch")); + // disable autosearch by default + btn_autosearch.setSelected(!Platform.isJS() + && Cache.getDefault(getAutosearchPreference(), false)); + btn_autosearch.addActionListener(new java.awt.event.ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + Cache.setProperty(getAutosearchPreference(), + Boolean.toString(btn_autosearch.isSelected())); + } + }); + btn_back.setFont(VERDANA_12); btn_back.setText(MessageManager.getString("action.back")); btn_back.addActionListener(new java.awt.event.ActionListener() { @@ -353,7 +411,7 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI, Cacheable }); btn_ok.setEnabled(false); - btn_ok.setFont(new java.awt.Font("Verdana", 0, 12)); + btn_ok.setFont(VERDANA_12); btn_ok.setText(MessageManager.getString("action.ok")); btn_ok.addActionListener(new java.awt.event.ActionListener() { @@ -375,9 +433,9 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI, Cacheable } }); btn_next_page.setEnabled(false); - btn_next_page.setToolTipText(MessageManager - .getString("label.next_page_tooltip")); - btn_next_page.setFont(new java.awt.Font("Verdana", 0, 12)); + btn_next_page.setToolTipText( + MessageManager.getString("label.next_page_tooltip")); + btn_next_page.setFont(VERDANA_12); btn_next_page.setText(MessageManager.getString("action.next_page")); btn_next_page.addActionListener(new java.awt.event.ActionListener() { @@ -400,9 +458,9 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI, Cacheable }); btn_prev_page.setEnabled(false); - btn_prev_page.setToolTipText(MessageManager - .getString("label.prev_page_tooltip")); - btn_prev_page.setFont(new java.awt.Font("Verdana", 0, 12)); + btn_prev_page.setToolTipText( + MessageManager.getString("label.prev_page_tooltip")); + btn_prev_page.setFont(VERDANA_12); btn_prev_page.setText(MessageManager.getString("action.prev_page")); btn_prev_page.addActionListener(new java.awt.event.ActionListener() { @@ -435,7 +493,7 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI, Cacheable btn_next_page.setVisible(false); } - btn_cancel.setFont(new java.awt.Font("Verdana", 0, 12)); + btn_cancel.setFont(VERDANA_12); btn_cancel.setText(MessageManager.getString("action.cancel")); btn_cancel.addActionListener(new java.awt.event.ActionListener() { @@ -458,7 +516,7 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI, Cacheable }); scrl_searchResult.setPreferredSize(new Dimension(width, height)); - cmb_searchTarget.setFont(new java.awt.Font("Verdana", 0, 12)); + cmb_searchTarget.setFont(VERDANA_12); cmb_searchTarget.addItemListener(new ItemListener() { @Override @@ -467,13 +525,13 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI, Cacheable if (e.getStateChange() == ItemEvent.SELECTED) { String tooltipText; - if ("all".equalsIgnoreCase(getCmbSearchTarget().getSelectedItem() - .toString())) + if ("all".equalsIgnoreCase( + getCmbSearchTarget().getSelectedItem().toString())) { tooltipText = MessageManager.getString("label.search_all"); } - else if ("pdb id".equalsIgnoreCase(getCmbSearchTarget() - .getSelectedItem().toString())) + else if ("pdb id".equalsIgnoreCase( + getCmbSearchTarget().getSelectedItem().toString())) { tooltipText = MessageManager .getString("label.separate_multiple_accession_ids"); @@ -481,22 +539,20 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI, Cacheable else { tooltipText = MessageManager.formatMessage( - "label.separate_multiple_query_values", - new Object[] { getCmbSearchTarget().getSelectedItem() - .toString() }); + "label.separate_multiple_query_values", new Object[] + { getCmbSearchTarget().getSelectedItem().toString() }); } - txt_search.setToolTipText(JvSwingUtils.wrapTooltip(true, - tooltipText)); - searchAction(true); + txt_search.getComponent().setToolTipText( + JvSwingUtils.wrapTooltip(true, tooltipText)); + if (btn_autosearch.isSelected()) + searchAction(true); } } }); - - txt_search.setFont(new java.awt.Font("Verdana", 0, 12)); + txt_search.getComponent().setFont(VERDANA_12); - txt_search.getEditor().getEditorComponent() - .addKeyListener(new KeyAdapter() + txt_search.addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) @@ -509,32 +565,34 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI, Cacheable } String primaryKeyName = getFTSRestClient().getPrimaryKeyColumn() .getName(); - if (primaryKeyName.equalsIgnoreCase(getCmbSearchTarget() - .getSelectedItem().toString())) + if (primaryKeyName.equalsIgnoreCase( + getCmbSearchTarget().getSelectedItem().toString())) { + // TODO: nicer to show the list in the result set before + // viewing in Jalview perhaps ? transferToSequenceFetcher(getTypedText()); } + else + { + performSearchAction(); + } } } }); - final DeferredTextInputListener listener = new DeferredTextInputListener( 1500, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - String typed = getTypedText(); - if (!typed.equalsIgnoreCase(lastSearchTerm)) + if (btn_autosearch.isSelected() + || txt_search.wasEnterPressed()) { - searchAction(true); - paginatorCart.clear(); - lastSearchTerm = typed; + performSearchAction(); } } }, false); - ((JTextComponent) txt_search.getEditor().getEditorComponent()) - .getDocument().addDocumentListener(listener); + txt_search.addDocumentListener(listener); txt_search.addFocusListener(new FocusListener() { @@ -551,6 +609,14 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI, Cacheable } }); + txt_search.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + performSearchAction(); + } + }); final String searchTabTitle = MessageManager .getString("label.search_result"); final String configureCols = MessageManager @@ -577,18 +643,18 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI, Cacheable btn_ok.setEnabled(false); btn_next_page.setEnabled(false); btn_prev_page.setEnabled(false); - txt_search.setEnabled(false); + txt_search.getComponent().setEnabled(false); cmb_searchTarget.setEnabled(false); previousWantedFields = getFTSRestClient() - .getAllDefaultDisplayedFTSDataColumns().toArray( - new Object[0]); + .getAllDefaultDisplayedFTSDataColumns() + .toArray(new Object[0]); } if (sourceTabbedPane.getTitleAt(index).equals(searchTabTitle)) { btn_back.setEnabled(true); btn_cancel.setEnabled(true); refreshPaginatorState(); - txt_search.setEnabled(true); + txt_search.getComponent().setEnabled(true); cmb_searchTarget.setEnabled(true); if (wantedFieldsUpdated()) { @@ -614,7 +680,9 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI, Cacheable pnl_results.add(tabbedPane); pnl_inputs.add(cmb_searchTarget); - pnl_inputs.add(txt_search); + pnl_inputs.add(txt_search.getComponent()); + pnl_inputs.add(txt_help); + pnl_inputs.add(btn_autosearch); pnl_inputs.add(lbl_loading); pnl_inputs.add(lbl_warning); pnl_inputs.add(lbl_blank); @@ -626,10 +694,21 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI, Cacheable this.add(pnl_results, java.awt.BorderLayout.CENTER); this.add(pnl_actions, java.awt.BorderLayout.SOUTH); mainFrame.setVisible(true); - mainFrame.setContentPane(this); + if (tabs != null) + { + tabs.setOpaque(true); + tabs.insertTab(MessageManager.getString("label.free_text_search"), + null, this, "", 0); + mainFrame.setContentPane(tabs); + tabs.setVisible(true); + } + else + { + mainFrame.setContentPane(this); + } mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); - mainFrame - .addInternalFrameListener(new javax.swing.event.InternalFrameAdapter() + mainFrame.addInternalFrameListener( + new javax.swing.event.InternalFrameAdapter() { @Override public void internalFrameClosing(InternalFrameEvent e) @@ -637,8 +716,6 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI, Cacheable closeAction(); } }); - mainFrame.setVisible(true); - mainFrame.setContentPane(this); mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); Integer x = getTempUserPrefs().get("FTSPanel.x"); Integer y = getTempUserPrefs().get("FTSPanel.y"); @@ -649,6 +726,8 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI, Cacheable Desktop.addInternalFrame(mainFrame, getFTSFrameTitle(), width, height); } + abstract protected void showHelp(); + protected void closeAction() { getTempUserPrefs().put("FTSPanel.width", this.getWidth()); @@ -656,7 +735,7 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI, Cacheable getTempUserPrefs().put("FTSPanel.x", mainFrame.getX()); getTempUserPrefs().put("FTSPanel.y", mainFrame.getY()); mainFrame.dispose(); - AppCache.getInstance().persistCache(this); + txt_search.persistCache(); } public class DeferredTextInputListener implements DocumentListener @@ -700,6 +779,18 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI, Cacheable } + void performSearchAction() + { + String typed = getTypedText(); + if (typed != null && typed.length() > 0 + && !typed.equalsIgnoreCase(lastSearchTerm)) + { + searchAction(true); + paginatorCart.clear(); + lastSearchTerm = typed; + } + } + public boolean wantedFieldsUpdated() { if (previousWantedFields == null) @@ -731,11 +822,6 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI, Cacheable return cmb_searchTarget; } - public JComboBox getTxtSearch() - { - return txt_search; - } - public JInternalFrame getMainFrame() { return mainFrame; @@ -770,13 +856,17 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI, Cacheable { lbl_loading.setVisible(false); lbl_blank.setVisible(false); - lbl_warning.setToolTipText(JvSwingUtils.wrapTooltip(true, - errorWarning.toString())); + lbl_warning.setToolTipText( + JvSwingUtils.wrapTooltip(true, errorWarning.toString())); lbl_warning.setVisible(true); } } - protected void btn_back_ActionPerformed() + /** + * Action on Back button is to close this panel and open a new Sequence + * Fetcher panel + */ + public void btn_back_ActionPerformed() { closeAction(); new SequenceFetcher(progressIndicator); @@ -789,7 +879,7 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI, Cacheable btn_cancel.setEnabled(false); } - protected void btn_cancel_ActionPerformed() + public void btn_cancel_ActionPerformed() { closeAction(); } @@ -799,7 +889,7 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI, Cacheable */ public void populateCmbSearchTargetOptions() { - List searchableTargets = new ArrayList(); + List searchableTargets = new ArrayList<>(); try { Collection foundFTSTargets = getFTSRestClient() @@ -827,7 +917,7 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI, Cacheable public void transferToSequenceFetcher(String ids) { - seqFetcher.getTextArea().setText(ids); + seqFetcher.setQuery(ids); Thread worker = new Thread(seqFetcher); worker.start(); } @@ -835,10 +925,7 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI, Cacheable @Override public String getTypedText() { - String typed = txt_search.getEditor().getItem() == null ? "" - : txt_search - .getEditor().getItem().toString().trim(); - return typed; + return txt_search.getUserInput(); } @Override @@ -855,7 +942,7 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI, Cacheable lbl_blank.setVisible(true); btn_ok.setEnabled(false); mainFrame.setTitle(getFTSFrameTitle()); - referesh(); + refresh(); tbl_summary.setModel(new DefaultTableModel()); tbl_summary.setVisible(false); } @@ -922,8 +1009,8 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI, Cacheable int totalRows = resultTable.getRowCount(); try { - primaryKeyColIndex = getFTSRestClient().getPrimaryKeyColumIndex( - wantedFields, false); + primaryKeyColIndex = getFTSRestClient() + .getPrimaryKeyColumIndex(wantedFields, false); } catch (Exception e) { e.printStackTrace(); @@ -956,8 +1043,8 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI, Cacheable int primaryKeyColIndex = 0; try { - primaryKeyColIndex = getFTSRestClient().getPrimaryKeyColumIndex( - wantedFields, false); + primaryKeyColIndex = getFTSRestClient() + .getPrimaryKeyColumIndex(wantedFields, false); } catch (Exception e) { e.printStackTrace(); @@ -992,82 +1079,11 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI, Cacheable } } - public void referesh() + public void refresh() { mainFrame.setTitle(getFTSFrameTitle()); } @Override - public void initCache() - { - AppCache.getInstance().initCache(this); - } - - @Override - public void updateCache() - { - AppCache.getInstance().updateCache(this); - } - - - - @Override - public String getCacheKey() - { - return getCacheKey(); - } - - @Override - public CacheBoxI getCacheComboBox() - { - return new CacheBoxI() - { - - @Override - public void setSelectedItem(Object anObject) - { - txt_search.setSelectedItem(anObject); - } - - @Override - public void requestFocus() - { - txt_search.requestFocusInWindow(); - } - - @Override - public void looseFocus() - { - mainFrame.requestFocusInWindow(); - } - - @Override - public void addItem(String item) - { - txt_search.addItem(item); - } - - @Override - public void removeAllItems() - { - txt_search.removeAllItems(); - } - - @Override - public int getItemCount() - { - return txt_search.getItemCount(); - } - - @Override - public String getUserInput() - { - return txt_search.getEditor().getItem() == null ? "" : txt_search - .getEditor().getItem().toString().trim(); - } - }; - } - - - + public abstract void okAction(); }