/*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2)
- * Copyright (C) 2014 The Jalview Authors
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
*
* This file is part of Jalview.
*
package jalview.fts.core;
import jalview.fts.api.FTSDataColumnI;
-import jalview.fts.api.FTSRestClientI;
+import jalview.fts.api.GFTSPanelI;
import jalview.fts.core.FTSDataColumnPreferences.PreferenceSource;
-import jalview.fts.service.pdb.PDBFTSRestClient;
import jalview.gui.Desktop;
import jalview.gui.IProgressIndicator;
import jalview.gui.JvSwingUtils;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.JTextField;
+import javax.swing.Timer;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
+import javax.swing.table.DefaultTableModel;
+import javax.swing.table.TableColumn;
/**
- * GUI layout for PDB Fetch Panel
+ * This class provides the swing GUI layout for FTS Panel and implements most of
+ * the contracts defined in GFSPanelI
*
* @author tcnofoegbu
*
*/
@SuppressWarnings("serial")
-public abstract class GFTSPanel extends JPanel
+public abstract class GFTSPanel extends JPanel implements GFTSPanelI
{
protected JInternalFrame mainFrame = new JInternalFrame(
getFTSFrameTitle());
protected JButton btn_cancel = new JButton();
- protected JTextField txt_search = new JTextField(20);
+ protected JTextField txt_search = new JTextField(30);
protected SequenceFetcher seqFetcher;
protected Collection<FTSDataColumnI> wantedFields;
- protected JTable tbl_summary = new JTable()
+ private String lastSearchTerm = "";
+
+ protected JButton btn_next_page = new JButton();
+
+ protected JButton btn_prev_page = new JButton();
+
+ protected StringBuilder errorWarning = new StringBuilder();
+
+ protected ImageIcon warningImage = new ImageIcon(getClass().getResource(
+ "/images/warning.gif"));
+
+ protected ImageIcon loadingImage = new ImageIcon(getClass().getResource(
+ "/images/loading.gif"));
+
+ protected ImageIcon balnkPlaceholderImage = new ImageIcon(getClass()
+ .getResource("/images/blank_16x16_placeholder.png"));
+
+ protected JLabel lbl_warning = new JLabel(warningImage);
+
+ protected JLabel lbl_loading = new JLabel(loadingImage);
+
+ protected JLabel lbl_blank = new JLabel(balnkPlaceholderImage);
+
+ private JTabbedPane tabbedPane = new JTabbedPane();
+
+ private JPanel pnl_actions = new JPanel();
+
+ private JPanel pnl_results = new JPanel(new CardLayout());
+
+ private JPanel pnl_inputs = new JPanel();
+
+ private BorderLayout mainLayout = new BorderLayout();
+
+ protected Object[] previousWantedFields;
+
+ protected int resultSetCount;
+
+ protected int totalResultSetCount;
+
+ protected int offSet;
+
+ protected int pageLimit;
+
+ private JTable tbl_summary = new JTable()
{
+ private boolean inLayout;
+
+ @Override
+ public boolean getScrollableTracksViewportWidth()
+ {
+ return hasExcessWidth();
+
+ }
+
+ @Override
+ public void doLayout()
+ {
+ if (hasExcessWidth())
+ {
+ autoResizeMode = AUTO_RESIZE_SUBSEQUENT_COLUMNS;
+ }
+ inLayout = true;
+ super.doLayout();
+ inLayout = false;
+ autoResizeMode = AUTO_RESIZE_OFF;
+ }
+
+ protected boolean hasExcessWidth()
+ {
+ return getPreferredSize().width < getParent().getWidth();
+ }
+
+ @Override
+ public void columnMarginChanged(ChangeEvent e)
+ {
+ if (isEditing())
+ {
+ removeEditor();
+ }
+ TableColumn resizingColumn = getTableHeader().getResizingColumn();
+ // Need to do this here, before the parent's
+ // layout manager calls getPreferredSize().
+ if (resizingColumn != null && autoResizeMode == AUTO_RESIZE_OFF
+ && !inLayout)
+ {
+ resizingColumn.setPreferredWidth(resizingColumn.getWidth());
+ }
+ resizeAndRepaint();
+ }
+
@Override
public String getToolTipText(MouseEvent evt)
{
return toolTipText;
}
};
-
- protected StringBuilder errorWarning = new StringBuilder();
-
protected JScrollPane scrl_searchResult = new JScrollPane(tbl_summary);
- protected ImageIcon warningImage = new ImageIcon(getClass().getResource(
- "/images/warning.gif"));
-
- protected ImageIcon loadingImage = new ImageIcon(getClass().getResource(
- "/images/loading.gif"));
-
- protected JLabel lbl_warning = new JLabel(warningImage);
-
- protected JLabel lbl_loading = new JLabel(loadingImage);
-
- private JTabbedPane tabbedPane = new JTabbedPane();
-
- private JPanel pnl_actions = new JPanel();
-
- private JPanel pnl_results = new JPanel(new CardLayout());
-
- private JPanel pnl_inputs = new JPanel();
-
- private BorderLayout mainLayout = new BorderLayout();
-
- protected Object[] previousWantedFields;
-
public GFTSPanel()
{
try
lbl_warning.setFont(new java.awt.Font("Verdana", 0, 12));
lbl_loading.setVisible(false);
lbl_loading.setFont(new java.awt.Font("Verdana", 0, 12));
+ lbl_blank.setVisible(true);
+ lbl_blank.setFont(new java.awt.Font("Verdana", 0, 12));
- tbl_summary.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
tbl_summary.setAutoCreateRowSorter(true);
tbl_summary.getTableHeader().setReorderingAllowed(false);
tbl_summary.addMouseListener(new MouseAdapter()
case KeyEvent.VK_ENTER: // enter key
if (btn_ok.isEnabled())
{
- btn_ok_ActionPerformed();
+ okAction();
}
evt.consume();
break;
@Override
public void actionPerformed(ActionEvent e)
{
- btn_ok_ActionPerformed();
+ okAction();
}
});
btn_ok.addKeyListener(new KeyAdapter()
{
if (evt.getKeyCode() == KeyEvent.VK_ENTER)
{
- btn_ok_ActionPerformed();
+ okAction();
+ }
+ }
+ });
+
+ btn_next_page.setEnabled(false);
+ btn_next_page.setToolTipText(MessageManager
+ .getString("label.next_page_tooltop"));
+ btn_next_page.setFont(new java.awt.Font("Verdana", 0, 12));
+ btn_next_page.setText(MessageManager.getString("action.next_page"));
+ btn_next_page.addActionListener(new java.awt.event.ActionListener()
+ {
+ @Override
+ public void actionPerformed(ActionEvent e)
+ {
+ nextPageAction();
+ }
+ });
+ btn_next_page.addKeyListener(new KeyAdapter()
+ {
+ @Override
+ public void keyPressed(KeyEvent evt)
+ {
+ if (evt.getKeyCode() == KeyEvent.VK_ENTER)
+ {
+ nextPageAction();
}
}
});
+ btn_prev_page.setEnabled(false);
+ btn_prev_page.setToolTipText(MessageManager
+ .getString("label.prev_page_tooltop"));
+ btn_prev_page.setFont(new java.awt.Font("Verdana", 0, 12));
+ btn_prev_page.setText(MessageManager.getString("action.prev_page"));
+ btn_prev_page.addActionListener(new java.awt.event.ActionListener()
+ {
+ @Override
+ public void actionPerformed(ActionEvent e)
+ {
+ prevPageAction();
+ }
+ });
+ btn_prev_page.addKeyListener(new KeyAdapter()
+ {
+ @Override
+ public void keyPressed(KeyEvent evt)
+ {
+ if (evt.getKeyCode() == KeyEvent.VK_ENTER)
+ {
+ prevPageAction();
+ }
+ }
+ });
+
+ if (isPaginationEnabled())
+ {
+ btn_prev_page.setVisible(true);
+ btn_next_page.setVisible(true);
+ }
+ else
+ {
+ btn_prev_page.setVisible(false);
+ btn_next_page.setVisible(false);
+ }
+
btn_cancel.setFont(new java.awt.Font("Verdana", 0, 12));
btn_cancel.setText(MessageManager.getString("action.cancel"));
btn_cancel.addActionListener(new java.awt.event.ActionListener()
}
}
});
-
- scrl_searchResult.setPreferredSize(new Dimension(500, 300));
- scrl_searchResult
- .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
+ scrl_searchResult.setPreferredSize(new Dimension(800, 400));
cmb_searchTarget.setFont(new java.awt.Font("Verdana", 0, 12));
cmb_searchTarget.addActionListener(new ActionListener()
}
txt_search.setToolTipText(JvSwingUtils.wrapTooltip(true,
tooltipText));
- txt_search_ActionPerformed();
+ searchAction(true);
}
});
{
return;
}
- if ("pdb id".equalsIgnoreCase(getCmbSearchTarget()
+ String primaryKeyName = getFTSRestClient().getPrimaryKeyColumn()
+ .getName();
+ if (primaryKeyName.equalsIgnoreCase(getCmbSearchTarget()
.getSelectedItem().toString()))
{
transferToSequenceFetcher(txt_search.getText());
}
});
- txt_search.getDocument().addDocumentListener(new DocumentListener()
+ final DeferredTextInputListener listener = new DeferredTextInputListener(
+ 1500,
+ new ActionListener()
+ {
+ @Override
+ public void actionPerformed(ActionEvent e)
+ {
+ if (!getTypedText().equalsIgnoreCase(lastSearchTerm))
+ {
+ searchAction(true);
+ lastSearchTerm = getTypedText();
+ }
+ }
+ }, false);
+ txt_search.getDocument().addDocumentListener(listener);
+ txt_search.addFocusListener(new FocusListener()
{
@Override
- public void insertUpdate(DocumentEvent e)
- {
- txt_search_ActionPerformed();
- }
-
- @Override
- public void removeUpdate(DocumentEvent e)
+ public void focusGained(FocusEvent e)
{
- txt_search_ActionPerformed();
+ listener.start();
}
@Override
- public void changedUpdate(DocumentEvent e)
+ public void focusLost(FocusEvent e)
{
- txt_search_ActionPerformed();
+// listener.stop();
}
});
btn_back.setEnabled(false);
btn_cancel.setEnabled(false);
btn_ok.setEnabled(false);
- previousWantedFields = PDBFTSRestClient.getInstance()
+ btn_next_page.setEnabled(false);
+ btn_prev_page.setEnabled(false);
+ txt_search.setEnabled(false);
+ cmb_searchTarget.setEnabled(false);
+ previousWantedFields = getFTSRestClient()
.getAllDefaulDisplayedDataColumns()
.toArray(new Object[0]);
}
{
btn_back.setEnabled(true);
btn_cancel.setEnabled(true);
+ refreshPaginatorState();
+ txt_search.setEnabled(true);
+ cmb_searchTarget.setEnabled(true);
if (wantedFieldsUpdated())
{
- txt_search_ActionPerformed();
+ searchAction(true);
}
else
{
}
};
tabbedPane.addChangeListener(changeListener);
- tabbedPane.setPreferredSize(new Dimension(500, 300));
+ tabbedPane.setPreferredSize(new Dimension(800, 400));
tabbedPane.add(searchTabTitle, scrl_searchResult);
tabbedPane.add(configureCols, new FTSDataColumnPreferences(
PreferenceSource.SEARCH_SUMMARY, getFTSRestClient()));
pnl_inputs.add(txt_search);
pnl_inputs.add(lbl_loading);
pnl_inputs.add(lbl_warning);
+ pnl_inputs.add(lbl_blank);
+ pnl_inputs.add(btn_prev_page);
+ pnl_inputs.add(btn_next_page);
this.setLayout(mainLayout);
this.add(pnl_inputs, java.awt.BorderLayout.NORTH);
mainFrame.setVisible(true);
mainFrame.setContentPane(this);
mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
- Desktop.addInternalFrame(mainFrame, getFTSFrameTitle(), 800, 400);
+ Desktop.addInternalFrame(mainFrame, getFTSFrameTitle(), 900, 500);
+ }
+
+ public class DeferredTextInputListener implements DocumentListener
+ {
+ private final Timer swingTimer;
+
+ public DeferredTextInputListener(int timeOut, ActionListener listener,
+ boolean repeats)
+ {
+ swingTimer = new Timer(timeOut, listener);
+ swingTimer.setRepeats(repeats);
+ }
+
+ public void start()
+ {
+ swingTimer.start();
+ }
+
+ public void stop()
+ {
+ swingTimer.stop();
+ }
+
+ @Override
+ public void insertUpdate(DocumentEvent e)
+ {
+ swingTimer.restart();
+ }
+
+ @Override
+ public void removeUpdate(DocumentEvent e)
+ {
+ swingTimer.restart();
+ }
+
+ @Override
+ public void changedUpdate(DocumentEvent e)
+ {
+ swingTimer.restart();
+ }
+
}
public boolean wantedFieldsUpdated()
return true;
}
- return Arrays.equals(PDBFTSRestClient.getInstance()
+ return Arrays.equals(getFTSRestClient()
.getAllDefaulDisplayedDataColumns()
.toArray(new Object[0]), previousWantedFields) ? false
: true;
protected void checkForErrors()
{
lbl_warning.setVisible(false);
+ lbl_blank.setVisible(true);
if (errorWarning.length() > 0)
{
lbl_loading.setVisible(false);
+ lbl_blank.setVisible(false);
lbl_warning.setToolTipText(JvSwingUtils.wrapTooltip(true,
errorWarning.toString()));
lbl_warning.setVisible(true);
worker.start();
}
- public abstract String getFTSFrameTitle();
+ @Override
+ public String getTypedText()
+ {
+ return txt_search.getText().trim();
+ }
+
+ @Override
+ public JTable getResultTable()
+ {
+ return tbl_summary;
+ }
+
+ public void reset()
+ {
+ lbl_loading.setVisible(false);
+ errorWarning.setLength(0);
+ lbl_warning.setVisible(false);
+ lbl_blank.setVisible(true);
+ btn_ok.setEnabled(false);
+ mainFrame.setTitle(getFTSFrameTitle());
+ referesh();
+ tbl_summary.setModel(new DefaultTableModel());
+ tbl_summary.setVisible(false);
+ }
+
+ @Override
+ public void setPrevPageButtonEnabled(boolean isEnabled)
+ {
+ btn_prev_page.setEnabled(isEnabled);
+ }
+
+ @Override
+ public void setNextPageButtonEnabled(boolean isEnabled)
+ {
+ btn_next_page.setEnabled(isEnabled);
+ }
+
+ @Override
+ public void setErrorMessage(String message)
+ {
+ errorWarning.append(message);
+ }
+
+ @Override
+ public void updateSearchFrameTitle(String title)
+ {
+ mainFrame.setTitle(title);
+ }
+
+ @Override
+ public void setSearchInProgress(Boolean isSearchInProgress)
+ {
+ lbl_blank.setVisible(!isSearchInProgress);
+ lbl_loading.setVisible(isSearchInProgress);
+ }
+
+ @Override
+ public void prevPageAction()
+ {
+ if (offSet >= pageLimit)
+ {
+ offSet = offSet - pageLimit;
+ searchAction(false);
+ }
+ else
+ {
+ refreshPaginatorState();
+ }
+ }
- public abstract FTSRestClientI getFTSRestClient();
+ @Override
+ public void nextPageAction()
+ {
+ offSet = offSet + pageLimit;
+ searchAction(false);
- public abstract void txt_search_ActionPerformed();
+ }
- public abstract void btn_ok_ActionPerformed();
+ public void refreshPaginatorState()
+ {
+ // System.out.println("resultSet count : " + resultSetCount);
+ // System.out.println("offSet : " + offSet);
+ // System.out.println("page limit : " + pageLimit);
+ setPrevPageButtonEnabled(false);
+ setNextPageButtonEnabled(false);
+ if (resultSetCount >= pageLimit)
+ {
+ setNextPageButtonEnabled(true);
+ }
+ if (offSet >= pageLimit)
+ {
+ setPrevPageButtonEnabled(true);
+ }
+ }
+ public void referesh()
+ {
+ mainFrame.setTitle(getFTSFrameTitle());
+ }
}