* @return
*/
public Map<String, Integer> getTempUserPrefs();
+
}
import jalview.gui.IProgressIndicator;
import jalview.gui.JvSwingUtils;
import jalview.gui.SequenceFetcher;
+import jalview.io.cache.AppCache;
+import jalview.io.cache.Cacheable;
import jalview.util.MessageManager;
import java.awt.BorderLayout;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
+import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
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.InternalFrameEvent;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
+import javax.swing.text.JTextComponent;
/**
* This class provides the swing GUI layout for FTS Panel and implements most of
*/
@SuppressWarnings("serial")
-public abstract class GFTSPanel extends JPanel implements GFTSPanelI
+public abstract class GFTSPanel extends JPanel implements GFTSPanelI, Cacheable
{
protected JInternalFrame mainFrame = new JInternalFrame(
getFTSFrameTitle());
protected JButton btn_cancel = new JButton();
- protected JTextField txt_search = new JTextField(30);
+ protected JComboBox<String> txt_search;
protected SequenceFetcher seqFetcher;
*/
private void jbInit() throws Exception
{
+
+ txt_search = new JComboBox<String>();
+ txt_search.setEditable(true);
+ txt_search
+ .setPrototypeDisplayValue("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
+ populateCmbSearchTargetOptions();
Integer width = getTempUserPrefs().get("FTSPanel.width") == null ? 800
: getTempUserPrefs().get("FTSPanel.width");
Integer height = getTempUserPrefs().get("FTSPanel.height") == null ? 400
scrl_searchResult.setPreferredSize(new Dimension(width, height));
cmb_searchTarget.setFont(new java.awt.Font("Verdana", 0, 12));
- cmb_searchTarget.addActionListener(new ActionListener()
+ cmb_searchTarget.addItemListener(new ItemListener()
{
@Override
- public void actionPerformed(ActionEvent e)
+ public void itemStateChanged(ItemEvent e)
{
- String tooltipText;
- if ("all".equalsIgnoreCase(getCmbSearchTarget().getSelectedItem()
- .toString()))
- {
- tooltipText = MessageManager.getString("label.search_all");
- }
- else if ("pdb id".equalsIgnoreCase(getCmbSearchTarget()
- .getSelectedItem().toString()))
+ if (e.getStateChange() == ItemEvent.SELECTED)
{
- tooltipText = MessageManager
- .getString("label.separate_multiple_accession_ids");
- }
- else
- {
- tooltipText = MessageManager.formatMessage(
- "label.separate_multiple_query_values",
- new Object[] { getCmbSearchTarget().getSelectedItem()
- .toString() });
+ String tooltipText;
+ if ("all".equalsIgnoreCase(getCmbSearchTarget().getSelectedItem()
+ .toString()))
+ {
+ tooltipText = MessageManager.getString("label.search_all");
+ }
+ else if ("pdb id".equalsIgnoreCase(getCmbSearchTarget()
+ .getSelectedItem().toString()))
+ {
+ tooltipText = MessageManager
+ .getString("label.separate_multiple_accession_ids");
+ }
+ else
+ {
+ tooltipText = MessageManager.formatMessage(
+ "label.separate_multiple_query_values",
+ new Object[] { getCmbSearchTarget().getSelectedItem()
+ .toString() });
+ }
+ txt_search.setToolTipText(JvSwingUtils.wrapTooltip(true,
+ tooltipText));
+ searchAction(true);
}
- txt_search.setToolTipText(JvSwingUtils.wrapTooltip(true,
- tooltipText));
- searchAction(true);
}
});
+
- populateCmbSearchTargetOptions();
txt_search.setFont(new java.awt.Font("Verdana", 0, 12));
- txt_search.addKeyListener(new KeyAdapter()
+ txt_search.getEditor().getEditorComponent()
+ .addKeyListener(new KeyAdapter()
{
@Override
public void keyPressed(KeyEvent e)
{
if (e.getKeyCode() == KeyEvent.VK_ENTER)
{
- if (txt_search.getText() == null
- || txt_search.getText().isEmpty())
+ if (getTypedText() == null || getTypedText().isEmpty())
{
return;
}
if (primaryKeyName.equalsIgnoreCase(getCmbSearchTarget()
.getSelectedItem().toString()))
{
- transferToSequenceFetcher(txt_search.getText());
+ transferToSequenceFetcher(getTypedText());
}
}
}
}
}
}, false);
- txt_search.getDocument().addDocumentListener(listener);
+ ((JTextComponent) txt_search.getEditor().getEditorComponent())
+ .getDocument().addDocumentListener(listener);
+
txt_search.addFocusListener(new FocusListener()
{
@Override
protected void closeAction()
{
- // System.out.println(">>>>>>>>>> closing internal frame!!!");
- // System.out.println("width : " + this.getWidth());
- // System.out.println("heigh : " + this.getHeight());
- // System.out.println("x : " + mainFrame.getX());
- // System.out.println("y : " + mainFrame.getY());
getTempUserPrefs().put("FTSPanel.width", this.getWidth());
getTempUserPrefs().put("FTSPanel.height", pnl_results.getHeight());
getTempUserPrefs().put("FTSPanel.x", mainFrame.getX());
{
if (previousWantedFields == null)
{
- return true;
+ return false;
}
return Arrays.equals(getFTSRestClient()
return cmb_searchTarget;
}
- public JTextField getTxtSearch()
+ public JComboBox<String> getTxtSearch()
{
return txt_search;
}
public void transferToSequenceFetcher(String ids)
{
- // mainFrame.dispose();
seqFetcher.getTextArea().setText(ids);
Thread worker = new Thread(seqFetcher);
worker.start();
@Override
public String getTypedText()
{
- return txt_search.getText().trim();
+ return txt_search.getEditor().getItem() == null ? "" : txt_search
+ .getEditor().getItem().toString().trim();
}
@Override
.toString();
paginatorCart.add(idStr);
}
- // System.out.println("Paginator shopping cart size : "
- // + paginatorCart.size());
}
public void updateSummaryTableSelections()
{
e.printStackTrace();
}
- // System.out.println(">>>>>> got here : 1");
int totalRows = resultTable.getRowCount();
- // resultTable.clearSelection();
for (int row = 0; row < totalRows; row++)
{
String id = (String) resultTable.getValueAt(row, primaryKeyColIndex);
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 == 0 && pageLimit == 0)
mainFrame.setTitle(getFTSFrameTitle());
}
+
+ protected void fireCache()
+ {
+ AppCache.getInstance().updateCache(this);
+ }
+
+ @Override
+ public void init()
+ {
+ // reset();
+ }
+
+ @Override
+ public JComponent getNextFocusableElement()
+ {
+ return mainFrame;
+ }
+
+ @Override
+ public String getCacheKey()
+ {
+ return getCacheKey();
+ }
+
+ @Override
+ public JComboBox<String> getCacheComboBox()
+ {
+ return txt_search;
+ }
+
+
}
private static String defaultFTSFrameTitle = MessageManager
.getString("label.pdb_sequence_fetcher");
- private String ftsFrameTitle = defaultFTSFrameTitle;
private static Map<String, Integer> tempUserPrefs = new HashMap<String, Integer>();
+ private static final String PDB_FTS_CACHE_KEY = "PDB_FTS_CACHE_KEY";
+
public PDBFTSPanel(SequenceFetcher seqFetcher)
{
super();
this.seqFetcher = seqFetcher;
this.progressIndicator = (seqFetcher == null) ? null : seqFetcher
.getProgressIndicator();
+ fireCache();
}
@Override
@Override
public void run()
{
- ftsFrameTitle = defaultFTSFrameTitle;
reset();
boolean allowEmptySequence = false;
if (getTypedText().length() > 0)
.getSelectedItem()).getCode();
wantedFields = PDBFTSRestClient.getInstance()
.getAllDefaultDisplayedFTSDataColumns();
- String searchTerm = decodeSearchTerm(txt_search.getText(),
+ String searchTerm = decodeSearchTerm(getTypedText(),
searchTarget);
FTSRestRequest request = new FTSRestRequest();
refreshPaginatorState();
updateSummaryTableSelections();
}
+ fireCache();
}
}.start();
}
e.printStackTrace();
}
int[] selectedRows = getResultTable().getSelectedRows();
- String searchTerm = txt_search.getText();
+ String searchTerm = getTypedText();
for (int summaryRow : selectedRows)
{
String idStr = getResultTable().getValueAt(summaryRow,
@Override
public String getFTSFrameTitle()
{
- return ftsFrameTitle;
+ return defaultFTSFrameTitle;
}
@Override
return tempUserPrefs;
}
+ @Override
+ public String getCacheKey()
+ {
+ return PDB_FTS_CACHE_KEY;
+ }
+
}
private static String defaultFTSFrameTitle = MessageManager
.getString("label.uniprot_sequence_fetcher");
- private String ftsFrameTitle = defaultFTSFrameTitle;
private static Map<String, Integer> tempUserPrefs = new HashMap<String, Integer>();
+ private static final String UNIPROT_FTS_CACHE_KEY = "UNIPROT_FTS_CACHE_KEY";
+
public UniprotFTSPanel(SequenceFetcher seqFetcher)
{
super();
this.seqFetcher = seqFetcher;
this.progressIndicator = (seqFetcher == null) ? null : seqFetcher
.getProgressIndicator();
+ fireCache();
}
@Override
@Override
public void run()
{
- ftsFrameTitle = defaultFTSFrameTitle;
reset();
- if (getTypedText().length() > 0)
+ String searchInput = getTypedText();
+ if (searchInput.length() > 0)
{
setSearchInProgress(true);
long startTime = System.currentTimeMillis();
wantedFields = UniProtFTSRestClient.getInstance()
.getAllDefaultDisplayedFTSDataColumns();
- String searchTerm = decodeSearchTerm(txt_search.getText(),
+ String searchTerm = decodeSearchTerm(getTypedText(),
searchTarget);
FTSRestRequest request = new FTSRestRequest();
refreshPaginatorState();
updateSummaryTableSelections();
}
+ fireCache();
}
}.start();
@Override
public String getFTSFrameTitle()
{
- return ftsFrameTitle;
+ return defaultFTSFrameTitle;
}
@Override
return tempUserPrefs;
}
+ @Override
+ public String getCacheKey()
+ {
+ return UNIPROT_FTS_CACHE_KEY;
+ }
}
import javax.swing.JComponent;
import javax.swing.JInternalFrame;
import javax.swing.JLayeredPane;
-import javax.swing.JOptionPane;
import javax.swing.KeyStroke;
/**
Desktop.addInternalFrame(frame, MessageManager.getString("label.find"),
WIDTH, HEIGHT);
- textfield.requestFocus();
+ searchBox.requestFocus();
}
/**
{
seqs[i] = match.getSequence().getDatasetSequence();
- features[i] = new SequenceFeature(textfield.getText().trim(),
+ features[i] = new SequenceFeature(searchBox.getEditor().getItem()
+ .toString().trim(),
"Search Results", null, match.getStart(), match.getEnd(),
"Search Results");
i++;
{
createNewGroup.setEnabled(false);
- String searchString = textfield.getText().trim();
+ String searchString = searchBox.getEditor().getItem().toString().trim();
if (isInvalidSearchString(searchString))
{
--- /dev/null
+package jalview.io.cache;
+
+
+import java.util.Hashtable;
+import java.util.LinkedHashSet;
+import java.util.Set;
+
+import javax.swing.JComboBox;
+import javax.swing.JComponent;
+
+public class AppCache implements AppCacheI
+{
+ private static AppCache instance = null;
+
+ private Hashtable<String, LinkedHashSet<String>> cacheItems;
+
+ private AppCache()
+ {
+ cacheItems = new Hashtable<String, LinkedHashSet<String>>();
+ }
+
+ @Override
+ public LinkedHashSet<String> getAllCachedItemsFor(String cacheKey)
+ {
+ LinkedHashSet<String> foundCache = cacheItems.get(cacheKey);
+ if (foundCache == null)
+ {
+ foundCache = new LinkedHashSet<String>();
+ cacheItems.put(cacheKey, foundCache);
+ }
+ return foundCache;
+ }
+
+
+ public static AppCache getInstance()
+ {
+ if (instance == null)
+ {
+ instance = new AppCache();
+ }
+ return instance;
+ }
+
+ @Override
+ public void updateCache(Cacheable cacheable)
+ {
+ JComboBox<String> cacheComboBox = cacheable.getCacheComboBox();
+ String cacheKey = cacheable.getCacheKey();
+ JComponent nextFocusableComponent = cacheable.getNextFocusableElement();
+ String userInput = cacheComboBox.getEditor().getItem() == null ? ""
+ : cacheComboBox.getEditor().getItem().toString().trim();
+
+ if (userInput != null && !userInput.isEmpty())
+ {
+ LinkedHashSet<String> foundCache = getAllCachedItemsFor(cacheKey);
+ foundCache.add(userInput);
+ cacheItems.put(cacheKey, foundCache);
+ }
+
+ String lastSearch = userInput;
+ nextFocusableComponent.requestFocusInWindow();
+ if (cacheComboBox.getItemCount() > 0)
+ {
+ cacheComboBox.removeAllItems();
+ }
+
+ Set<String> cacheItems = getAllCachedItemsFor(cacheKey);
+ if (cacheItems != null && !cacheItems.isEmpty())
+ {
+ for (String cacheItem : cacheItems)
+ {
+ cacheComboBox.addItem(cacheItem);
+ }
+ }
+
+ if (!lastSearch.isEmpty())
+ {
+ cacheComboBox.setSelectedItem(lastSearch);
+ cacheComboBox.requestFocus();
+ }
+ else
+ {
+ cacheable.init();
+ cacheComboBox.addItem("");
+ cacheComboBox.setSelectedItem("");
+ }
+ }
+
+}
--- /dev/null
+package jalview.io.cache;
+
+import java.util.Set;
+
+public interface AppCacheI
+{
+
+ public Set<String> getAllCachedItemsFor(String cacheKey);
+
+ public void updateCache(Cacheable cacheable);
+}
--- /dev/null
+package jalview.io.cache;
+
+import javax.swing.JComboBox;
+import javax.swing.JComponent;
+
+public interface Cacheable
+{
+
+ /**
+ * method executed on cache initialisation
+ */
+ public void init();
+
+ /**
+ * Combo-box instance for the cache component
+ *
+ * @return
+ */
+ public JComboBox<String> getCacheComboBox();
+
+ /**
+ * The unique key that will be used for storing user input for this cacheable
+ * in the cache dictionary
+ *
+ * @return
+ */
+ public String getCacheKey();
+
+ /**
+ * Get next focusable component. Required to delegate focus while updating the
+ * cacheable component cache
+ *
+ * @return
+ */
+ public JComponent getNextFocusableElement();
+
+}
import jalview.io.DataSourceType;
import jalview.io.FileFormat;
import jalview.io.FormatAdapter;
+import jalview.io.cache.AppCache;
+import jalview.io.cache.Cacheable;
import jalview.util.MessageManager;
import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTextArea;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
+import javax.swing.text.JTextComponent;
-public class GFinder extends JPanel
+public class GFinder extends JPanel implements Cacheable
{
JLabel jLabelFind = new JLabel();
protected JButton createNewGroup = new JButton();
- JScrollPane jScrollPane1 = new JScrollPane();
- protected JTextArea textfield = new JTextArea();
+ protected JComboBox<String> searchBox = new JComboBox<String>();
BorderLayout mainBorderLayout = new BorderLayout();
GridLayout optionsGridLayout = new GridLayout();
+ private static final String FINDER_CACHE_KEY = "FINDER_CACHE_KEY";
+
public GFinder()
{
try
createNewGroup_actionPerformed(e);
}
});
- textfield.setFont(new java.awt.Font("Verdana", Font.PLAIN, 12));
- textfield.setText("");
- textfield.setLineWrap(true);
- textfield.addCaretListener(new CaretListener()
+ searchBox.setFont(new java.awt.Font("Verdana", Font.PLAIN, 12));
+ searchBox.setEditable(true);
+ searchBox
+.setPrototypeDisplayValue("XXXXXXXXXXXXXXXXXXXXXXXXXXXX");
+ ((JTextComponent) searchBox.getEditor().getEditorComponent())
+ .addCaretListener(new CaretListener()
{
@Override
public void caretUpdate(CaretEvent e)
textfield_caretUpdate(e);
}
});
- textfield.addKeyListener(new java.awt.event.KeyAdapter()
+ searchBox.getEditor().getEditorComponent()
+ .addKeyListener(new java.awt.event.KeyAdapter()
{
@Override
public void keyPressed(KeyEvent e)
this.add(jPanel2, java.awt.BorderLayout.SOUTH);
this.add(jPanel3, java.awt.BorderLayout.NORTH);
this.add(jPanel4, java.awt.BorderLayout.CENTER);
- jPanel4.add(jScrollPane1, java.awt.BorderLayout.NORTH);
- jScrollPane1.getViewport().add(textfield);
+ jPanel4.add(searchBox, java.awt.BorderLayout.NORTH);
JPanel optionsPanel = new JPanel();
optionsPanel.add(searchDescription, null);
jPanel4.add(optionsPanel, java.awt.BorderLayout.WEST);
+ fireCache();
}
protected void findNext_actionPerformed(ActionEvent e)
{
e.consume();
findNext_actionPerformed(null);
+ fireCache();
}
}
public void textfield_caretUpdate(CaretEvent e)
{
- if (textfield.getText().indexOf(">") > -1)
+ if (searchBox.getEditor().getItem().toString().indexOf(">") > -1)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
- String str = textfield.getText();
+ String str = searchBox.getEditor().getItem().toString();
AlignmentI al = null;
try
{
jalview.util.Comparison.GapChars, al.getSequenceAt(0)
.getSequenceAsString());
- textfield.setText(str);
+ searchBox.setSelectedItem(str);
}
}
});
}
}
+
+
+ protected void fireCache()
+ {
+ AppCache.getInstance().updateCache(this);
+ }
+
+ @Override
+ public void init()
+ {
+ // TODO Auto-generated method stub
+ }
+
+ @Override
+ public JComboBox<String> getCacheComboBox()
+ {
+ return searchBox;
+ }
+
+ @Override
+ public String getCacheKey()
+ {
+ return FINDER_CACHE_KEY;
+ }
+
+ @Override
+ public JComponent getNextFocusableElement()
+ {
+ return this;
+ }
}
import jalview.gui.JvOptionPane;
+import javax.swing.JComboBox;
import javax.swing.JInternalFrame;
-import javax.swing.JTextField;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeClass;
assertEquals(expectedString, outcome);
}
- @Test(groups = { "External" }, timeOut = 7000)
+ @Test(groups = { "External" }, timeOut = 8000)
public void txt_search_ActionPerformedTest()
{
PDBFTSPanel searchPanel = new PDBFTSPanel(null);
JInternalFrame mainFrame = searchPanel.getMainFrame();
- JTextField txt_search = searchPanel.getTxtSearch();
+ JComboBox<String> txt_search = searchPanel.getTxtSearch();
assertTrue(mainFrame.getTitle().length() == 20);
assertTrue(mainFrame.getTitle()
.equalsIgnoreCase("PDB Sequence Fetcher"));
- txt_search.setText("ABC");
+ txt_search.setSelectedItem("ABC");
try
{
// wait for web-service to handle response