X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FFeatureSettings.java;h=390427a35aaef48545719ee883057e1b314d81c2;hb=ed1529065c002bb837ea2572b00d1dfdceaa6050;hp=2b3688fdc75895996ea72b3cf795bd0f459f3175;hpb=1a34e43f7fb8e6d4f559026c6f0a207893124c6d;p=jalview.git diff --git a/src/jalview/gui/FeatureSettings.java b/src/jalview/gui/FeatureSettings.java index 2b3688f..390427a 100644 --- a/src/jalview/gui/FeatureSettings.java +++ b/src/jalview/gui/FeatureSettings.java @@ -20,31 +20,25 @@ */ package jalview.gui; -import static jalview.gui.FeatureSettings.FeatureTableModel.COLOUR_COLUMN; -import static jalview.gui.FeatureSettings.FeatureTableModel.FILTER_COLUMN; -import static jalview.gui.FeatureSettings.FeatureTableModel.SHOW_COLUMN; -import static jalview.gui.FeatureSettings.FeatureTableModel.TYPE_COLUMN; - import jalview.api.FeatureColourI; import jalview.api.FeatureSettingsControllerI; -import jalview.bin.Cache; import jalview.datamodel.AlignmentI; import jalview.datamodel.SequenceI; +import jalview.datamodel.features.FeatureMatcher; +import jalview.datamodel.features.FeatureMatcherI; +import jalview.datamodel.features.FeatureMatcherSet; +import jalview.datamodel.features.FeatureMatcherSetI; import jalview.gui.Help.HelpId; import jalview.io.JalviewFileChooser; import jalview.io.JalviewFileView; -import jalview.schemabinding.version2.JalviewUserColours; import jalview.schemes.FeatureColour; -import jalview.util.Format; import jalview.util.MessageManager; import jalview.util.Platform; -import jalview.util.QuickSort; -import jalview.util.matcher.KeyedMatcherSet; -import jalview.util.matcher.KeyedMatcherSetI; -import jalview.viewmodel.AlignmentViewport; import jalview.viewmodel.seqfeatures.FeatureRendererModel.FeatureSettingsBean; -import jalview.ws.DasSequenceFeatureFetcher; -import jalview.ws.dbsources.das.api.jalviewSourceI; +import jalview.xml.binding.jalview.JalviewUserColours; +import jalview.xml.binding.jalview.JalviewUserColours.Colour; +import jalview.xml.binding.jalview.JalviewUserColours.Filter; +import jalview.xml.binding.jalview.ObjectFactory; import java.awt.BorderLayout; import java.awt.Color; @@ -71,13 +65,14 @@ import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; import java.util.HashSet; import java.util.Hashtable; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.Vector; import javax.help.HelpSetException; import javax.swing.AbstractCellEditor; @@ -85,7 +80,6 @@ import javax.swing.BorderFactory; import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JCheckBox; -import javax.swing.JCheckBoxMenuItem; import javax.swing.JColorChooser; import javax.swing.JDialog; import javax.swing.JInternalFrame; @@ -99,28 +93,44 @@ import javax.swing.JSlider; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.SwingConstants; -import javax.swing.SwingUtilities; +import javax.swing.border.Border; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.table.AbstractTableModel; +import javax.swing.table.JTableHeader; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBElement; +import javax.xml.bind.Marshaller; +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamReader; public class FeatureSettings extends JPanel implements FeatureSettingsControllerI { + private static final String SEQUENCE_FEATURE_COLOURS = MessageManager + .getString("label.sequence_feature_colours"); + + /* + * column indices of fields in Feature Settings table + */ + static final int TYPE_COLUMN = 0; + + static final int COLOUR_COLUMN = 1; + + static final int FILTER_COLUMN = 2; + + static final int SHOW_COLUMN = 3; + private static final int COLUMN_COUNT = 4; private static final int MIN_WIDTH = 400; private static final int MIN_HEIGHT = 400; - DasSourceBrowser dassourceBrowser; - - DasSequenceFeatureFetcher dasFeatureFetcher; - - JPanel dasSettingsPane = new JPanel(); + private final static String BASE_TOOLTIP = "Click to edit, right-click for menu"; final FeatureRenderer fr; @@ -133,7 +143,7 @@ public class FeatureSettings extends JPanel private float originalTransparency; - private Map originalFilters; + private Map originalFilters; final JInternalFrame frame; @@ -152,12 +162,6 @@ public class FeatureSettings extends JPanel int selectedRow = -1; - JButton fetchDAS = new JButton(); - - JButton saveDAS = new JButton(); - - JButton cancelDAS = new JButton(); - boolean resettingTable = false; /* @@ -185,7 +189,7 @@ public class FeatureSettings extends JPanel int originalTransparencyAsPercent = (int) (originalTransparency * 100); transparency.setMaximum(100 - originalTransparencyAsPercent); - originalFilters = fr.getFeatureFilters(); + originalFilters = new HashMap<>(fr.getFeatureFilters()); // shallow copy try { @@ -197,23 +201,32 @@ public class FeatureSettings extends JPanel table = new JTable() { + static final String tt = "Click to edit, right-click for menu"; // todo i18n + @Override public String getToolTipText(MouseEvent e) { String tip = null; int column = table.columnAtPoint(e.getPoint()); + int row = table.rowAtPoint(e.getPoint()); + switch (column) { case TYPE_COLUMN: tip = JvSwingUtils.wrapTooltip(true, MessageManager .getString("label.feature_settings_click_drag")); break; + case COLOUR_COLUMN: + FeatureColourI colour = (FeatureColourI) table.getValueAt(row, + column); + tip = getColorTooltip(colour, true); + break; case FILTER_COLUMN: - int row = table.rowAtPoint(e.getPoint()); - KeyedMatcherSet o = (KeyedMatcherSet) table.getValueAt(row, + FeatureMatcherSet o = (FeatureMatcherSet) table.getValueAt(row, column); tip = o.isEmpty() - ? MessageManager.getString("label.filters_tooltip") + ? MessageManager + .getString("label.configure_feature_tooltip") : o.toString(); break; default: @@ -221,8 +234,25 @@ public class FeatureSettings extends JPanel } return tip; } + + /** + * Position the tooltip near the bottom edge of, and half way across, the + * current cell + */ + @Override + public Point getToolTipLocation(MouseEvent e) + { + Point point = e.getPoint(); + int column = table.columnAtPoint(point); + int row = table.rowAtPoint(point); + Rectangle r = getCellRect(row, column, false); + Point loc = new Point(r.x + r.width / 2, r.y + r.height - 3); + return loc; + } }; - table.getTableHeader().setFont(new Font("Verdana", Font.PLAIN, 12)); + JTableHeader tableHeader = table.getTableHeader(); + tableHeader.setFont(new Font("Verdana", Font.PLAIN, 12)); + tableHeader.setReorderingAllowed(false); table.setFont(new Font("Verdana", Font.PLAIN, 12)); // table.setDefaultRenderer(Color.class, new ColorRenderer()); @@ -231,8 +261,8 @@ public class FeatureSettings extends JPanel table.setDefaultEditor(FeatureColour.class, new ColorEditor(this)); table.setDefaultRenderer(FeatureColour.class, new ColorRenderer()); - table.setDefaultEditor(KeyedMatcherSet.class, new FilterEditor(this)); - table.setDefaultRenderer(KeyedMatcherSet.class, new FilterRenderer()); + table.setDefaultEditor(FeatureMatcherSet.class, new FilterEditor(this)); + table.setDefaultRenderer(FeatureMatcherSet.class, new FilterRenderer()); TableColumn colourColumn = new TableColumn(COLOUR_COLUMN, 75, new ColorRenderer(), new ColorEditor(this)); @@ -314,9 +344,6 @@ public class FeatureSettings extends JPanel // MessageManager.getString("label.feature_settings_click_drag"))); scrollPane.setViewportView(table); - dassourceBrowser = new DasSourceBrowser(this); - dasSettingsPane.add(dassourceBrowser, BorderLayout.CENTER); - if (af.getViewport().isShowSequenceFeatures() || !fr.hasRenderOrder()) { fr.findAllFeatures(true); // display everything! @@ -365,7 +392,6 @@ public class FeatureSettings extends JPanel javax.swing.event.InternalFrameEvent evt) { fr.removePropertyChangeListener(change); - dassourceBrowser.fs = null; }; }); frame.setLayer(JLayeredPane.PALETTE_LAYER); @@ -413,69 +439,6 @@ public class FeatureSettings extends JPanel }); men.add(dens); - /* - * variable colour options include colour by label, by score, - * by selected attribute text, or attribute value - */ - final JCheckBoxMenuItem mxcol = new JCheckBoxMenuItem( - MessageManager.getString("label.variable_colour")); - mxcol.setSelected(!featureColour.isSimpleColour()); - men.add(mxcol); - mxcol.addActionListener(new ActionListener() - { - JColorChooser colorChooser; - - @Override - public void actionPerformed(ActionEvent e) - { - if (e.getSource() == mxcol) - { - if (featureColour.isSimpleColour()) - { - FeatureTypeSettings fc = new FeatureTypeSettings(me.fr, type); - fc.addActionListener(this); - } - else - { - // bring up simple color chooser - colorChooser = new JColorChooser(); - String title = MessageManager - .getString("label.select_colour"); - JDialog dialog = JColorChooser.createDialog(me, - title, true, // modal - colorChooser, this, // OK button handler - null); // no CANCEL button handler - colorChooser.setColor(featureColour.getMaxColour()); - dialog.setVisible(true); - } - } - else - { - if (e.getSource() instanceof FeatureTypeSettings) - { - /* - * update after OK in feature colour dialog; the updated - * colour will have already been set in the FeatureRenderer - */ - FeatureColourI fci = fr.getFeatureColours().get(type); - table.setValueAt(fci, rowSelected, 1); - table.validate(); - } - else - { - // probably the color chooser! - table.setValueAt(new FeatureColour(colorChooser.getColor()), - rowSelected, 1); - table.validate(); - me.updateFeatureRenderer( - ((FeatureTableModel) table.getModel()).getData(), - false); - } - } - } - - }); - JMenuItem selCols = new JMenuItem( MessageManager.getString("label.select_columns_containing")); selCols.addActionListener(new ActionListener() @@ -648,8 +611,7 @@ public class FeatureSettings extends JPanel } } - int columnCount = COLUMN_COUNT; - Object[][] data = new Object[displayableTypes.size()][columnCount]; + Object[][] data = new Object[displayableTypes.size()][COLUMN_COUNT]; int dataIndex = 0; if (fr.hasRenderOrder()) @@ -674,9 +636,9 @@ public class FeatureSettings extends JPanel data[dataIndex][TYPE_COLUMN] = type; data[dataIndex][COLOUR_COLUMN] = fr.getFeatureStyle(type); - KeyedMatcherSetI featureFilter = fr.getFeatureFilter(type); + FeatureMatcherSetI featureFilter = fr.getFeatureFilter(type); data[dataIndex][FILTER_COLUMN] = featureFilter == null - ? new KeyedMatcherSet() + ? new FeatureMatcherSet() : featureFilter; data[dataIndex][SHOW_COLUMN] = new Boolean( af.getViewport().getFeaturesDisplayed().isVisible(type)); @@ -701,9 +663,9 @@ public class FeatureSettings extends JPanel fr.clearRenderOrder(); return; } - KeyedMatcherSetI featureFilter = fr.getFeatureFilter(type); + FeatureMatcherSetI featureFilter = fr.getFeatureFilter(type); data[dataIndex][FILTER_COLUMN] = featureFilter == null - ? new KeyedMatcherSet() + ? new FeatureMatcherSet() : featureFilter; data[dataIndex][SHOW_COLUMN] = new Boolean(true); dataIndex++; @@ -712,11 +674,10 @@ public class FeatureSettings extends JPanel if (originalData == null) { - int size = data[0].length; - originalData = new Object[data.length][size]; + originalData = new Object[data.length][COLUMN_COUNT]; for (int i = 0; i < data.length; i++) { - System.arraycopy(data[i], 0, originalData[i], 0, size); + System.arraycopy(data[i], 0, originalData[i], 0, COLUMN_COUNT); } } else @@ -787,11 +748,12 @@ public class FeatureSettings extends JPanel /* * new feature detected - add to original data (on top) */ - int size = currentData[0].length; - Object[][] newData = new Object[originalData.length + 1][size]; + Object[][] newData = new Object[originalData.length + + 1][COLUMN_COUNT]; for (int i = 0; i < originalData.length; i++) { - System.arraycopy(originalData[i], 0, newData[i + 1], 0, size); + System.arraycopy(originalData[i], 0, newData[i + 1], 0, + COLUMN_COUNT); } newData[0] = row; originalData = newData; @@ -845,10 +807,14 @@ public class FeatureSettings extends JPanel } } + /** + * Offers a file chooser dialog, and then loads the feature colours and + * filters from file in XML format and unmarshals to Jalview feature settings + */ void load() { JalviewFileChooser chooser = new JalviewFileChooser("fc", - "Sequence Feature Colours"); + SEQUENCE_FEATURE_COLOURS); chooser.setFileView(new JalviewFileView()); chooser.setDialogTitle( MessageManager.getString("label.load_feature_colours")); @@ -859,88 +825,87 @@ public class FeatureSettings extends JPanel if (value == JalviewFileChooser.APPROVE_OPTION) { File file = chooser.getSelectedFile(); + load(file); + } + } - try - { - InputStreamReader in = new InputStreamReader( - new FileInputStream(file), "UTF-8"); + /** + * Loads feature colours and filters from XML stored in the given file + * + * @param file + */ + void load(File file) + { + try + { + InputStreamReader in = new InputStreamReader( + new FileInputStream(file), "UTF-8"); - JalviewUserColours jucs = JalviewUserColours.unmarshal(in); + JAXBContext jc = JAXBContext + .newInstance("jalview.xml.binding.jalview"); + javax.xml.bind.Unmarshaller um = jc.createUnmarshaller(); + XMLStreamReader streamReader = XMLInputFactory.newInstance() + .createXMLStreamReader(in); + JAXBElement jbe = um.unmarshal(streamReader, + JalviewUserColours.class); + JalviewUserColours jucs = jbe.getValue(); - for (int i = jucs.getColourCount() - 1; i >= 0; i--) - { - String name; - jalview.schemabinding.version2.Colour newcol = jucs.getColour(i); - if (newcol.hasMax()) - { - Color mincol = null, maxcol = null; - try - { - mincol = new Color(Integer.parseInt(newcol.getMinRGB(), 16)); - maxcol = new Color(Integer.parseInt(newcol.getRGB(), 16)); + // JalviewUserColours jucs = JalviewUserColours.unmarshal(in); - } catch (Exception e) - { - Cache.log.warn("Couldn't parse out graduated feature color.", - e); - } - FeatureColourI gcol = new FeatureColour(mincol, maxcol, - newcol.getMin(), newcol.getMax()); - if (newcol.hasAutoScale()) - { - gcol.setAutoScaled(newcol.getAutoScale()); - } - if (newcol.hasColourByLabel()) - { - gcol.setColourByLabel(newcol.getColourByLabel()); - } - if (newcol.hasThreshold()) - { - gcol.setThreshold(newcol.getThreshold()); - } - if (newcol.getThreshType().length() > 0) - { - String ttyp = newcol.getThreshType(); - if (ttyp.equalsIgnoreCase("ABOVE")) - { - gcol.setAboveThreshold(true); - } - if (ttyp.equalsIgnoreCase("BELOW")) - { - gcol.setBelowThreshold(true); - } - } - fr.setColour(name = newcol.getName(), gcol); - } - else - { - Color color = new Color( - Integer.parseInt(jucs.getColour(i).getRGB(), 16)); - fr.setColour(name = jucs.getColour(i).getName(), - new FeatureColour(color)); - } - fr.setOrder(name, (i == 0) ? 0 : i / jucs.getColourCount()); - } - if (table != null) + /* + * load feature colours + */ + for (int i = jucs.getColour().size() - 1; i >= 0; i--) + { + Colour newcol = jucs.getColour().get(i); + FeatureColourI colour = jalview.project.Jalview2XML + .parseColour(newcol); + fr.setColour(newcol.getName(), colour); + fr.setOrder(newcol.getName(), i / (float) jucs.getColour().size()); + } + + /* + * load feature filters; loaded filters will replace any that are + * currently defined, other defined filters are left unchanged + */ + for (int i = 0; i < jucs.getFilter().size(); i++) + { + Filter filterModel = jucs.getFilter().get(i); + String featureType = filterModel.getFeatureType(); + FeatureMatcherSetI filter = jalview.project.Jalview2XML + .parseFilter(featureType, filterModel.getMatcherSet()); + if (!filter.isEmpty()) { - resetTable(null); - Object[][] data = ((FeatureTableModel) table.getModel()) - .getData(); - ensureOrder(data); - updateFeatureRenderer(data, false); - table.repaint(); + fr.setFeatureFilter(featureType, filter); } - } catch (Exception ex) + } + + /* + * update feature settings table + */ + if (table != null) { - System.out.println("Error loading User Colour File\n" + ex); + resetTable(null); + Object[][] data = ((FeatureTableModel) table.getModel()) + .getData(); + ensureOrder(data); + updateFeatureRenderer(data, false); + table.repaint(); } + } catch (Exception ex) + { + System.out.println("Error loading User Colour File\n" + ex); } } + /** + * Offers a file chooser dialog, and then saves the current feature colours + * and any filters to the selected file in XML format + */ void save() { JalviewFileChooser chooser = new JalviewFileChooser("fc", - "Sequence Feature Colours"); + SEQUENCE_FEATURE_COLOURS); chooser.setFileView(new JalviewFileView()); chooser.setDialogTitle( MessageManager.getString("label.save_feature_colours")); @@ -950,68 +915,97 @@ public class FeatureSettings extends JPanel if (value == JalviewFileChooser.APPROVE_OPTION) { - String choice = chooser.getSelectedFile().getPath(); - jalview.schemabinding.version2.JalviewUserColours ucs = new jalview.schemabinding.version2.JalviewUserColours(); - ucs.setSchemeName("Sequence Features"); - try - { - PrintWriter out = new PrintWriter(new OutputStreamWriter( - new FileOutputStream(choice), "UTF-8")); + save(chooser.getSelectedFile()); + } + } + + /** + * Saves feature colours and filters to the given file + * + * @param file + */ + void save(File file) + { + JalviewUserColours ucs = new JalviewUserColours(); + ucs.setSchemeName("Sequence Features"); + try + { + PrintWriter out = new PrintWriter(new OutputStreamWriter( + new FileOutputStream(file), "UTF-8")); - Set fr_colours = fr.getAllFeatureColours(); - Iterator e = fr_colours.iterator(); - float[] sortOrder = new float[fr_colours.size()]; - String[] sortTypes = new String[fr_colours.size()]; - int i = 0; - while (e.hasNext()) + /* + * sort feature types by colour order, from 0 (highest) + * to 1 (lowest) + */ + Set fr_colours = fr.getAllFeatureColours(); + String[] sortedTypes = fr_colours + .toArray(new String[fr_colours.size()]); + Arrays.sort(sortedTypes, new Comparator() + { + @Override + public int compare(String type1, String type2) { - sortTypes[i] = e.next(); - sortOrder[i] = fr.getOrder(sortTypes[i]); - i++; + return Float.compare(fr.getOrder(type1), fr.getOrder(type2)); } - QuickSort.sort(sortOrder, sortTypes); - sortOrder = null; - for (i = 0; i < sortTypes.length; i++) + }); + + /* + * save feature colours + */ + for (String featureType : sortedTypes) + { + FeatureColourI fcol = fr.getFeatureStyle(featureType); + Colour col = jalview.project.Jalview2XML.marshalColour(featureType, + fcol); + ucs.getColour().add(col); + } + + /* + * save any feature filters + */ + for (String featureType : sortedTypes) + { + FeatureMatcherSetI filter = fr.getFeatureFilter(featureType); + if (filter != null && !filter.isEmpty()) { - jalview.schemabinding.version2.Colour col = new jalview.schemabinding.version2.Colour(); - col.setName(sortTypes[i]); - FeatureColourI fcol = fr.getFeatureStyle(sortTypes[i]); - if (fcol.isSimpleColour()) - { - col.setRGB(Format.getHexString(fcol.getColour())); - } - else - { - col.setRGB(Format.getHexString(fcol.getMaxColour())); - col.setMin(fcol.getMin()); - col.setMax(fcol.getMax()); - col.setMinRGB( - jalview.util.Format.getHexString(fcol.getMinColour())); - col.setAutoScale(fcol.isAutoScaled()); - col.setThreshold(fcol.getThreshold()); - col.setColourByLabel(fcol.isColourByLabel()); - col.setThreshType(fcol.isAboveThreshold() ? "ABOVE" - : (fcol.isBelowThreshold() ? "BELOW" : "NONE")); - } - ucs.addColour(col); + Iterator iterator = filter.getMatchers().iterator(); + FeatureMatcherI firstMatcher = iterator.next(); + jalview.xml.binding.jalview.FeatureMatcherSet ms = jalview.project.Jalview2XML + .marshalFilter(firstMatcher, iterator, + filter.isAnded()); + Filter filterModel = new Filter(); + filterModel.setFeatureType(featureType); + filterModel.setMatcherSet(ms); + ucs.getFilter().add(filterModel); } - ucs.marshal(out); - out.close(); - } catch (Exception ex) - { - ex.printStackTrace(); } + JAXBContext jaxbContext = JAXBContext + .newInstance(JalviewUserColours.class); + Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); + jaxbMarshaller.marshal( + new ObjectFactory().createJalviewUserColours(ucs), out); + + // jaxbMarshaller.marshal(object, pout); + // marshaller.marshal(object); + out.flush(); + + // ucs.marshal(out); + out.close(); + } catch (Exception ex) + { + ex.printStackTrace(); } } public void invertSelection() { - for (int i = 0; i < table.getRowCount(); i++) + Object[][] data = ((FeatureTableModel) table.getModel()).getData(); + for (int i = 0; i < data.length; i++) { - Boolean value = (Boolean) table.getValueAt(i, SHOW_COLUMN); - - table.setValueAt(new Boolean(!value.booleanValue()), i, SHOW_COLUMN); + data[i][SHOW_COLUMN] = !(Boolean) data[i][SHOW_COLUMN]; } + updateFeatureRenderer(data, true); + table.repaint(); } public void orderByAvWidth() @@ -1120,7 +1114,7 @@ public class FeatureSettings extends JPanel { String type = (String) data[i][TYPE_COLUMN]; FeatureColourI colour = (FeatureColourI) data[i][COLOUR_COLUMN]; - KeyedMatcherSetI theFilter = (KeyedMatcherSetI) data[i][FILTER_COLUMN]; + FeatureMatcherSetI theFilter = (FeatureMatcherSetI) data[i][FILTER_COLUMN]; Boolean isShown = (Boolean) data[i][SHOW_COLUMN]; rowData[i] = new FeatureSettingsBean(type, colour, theFilter, isShown); @@ -1135,8 +1129,6 @@ public class FeatureSettings extends JPanel JPanel settingsPane = new JPanel(); settingsPane.setLayout(new BorderLayout()); - dasSettingsPane.setLayout(new BorderLayout()); - JPanel bigPanel = new JPanel(); bigPanel.setLayout(new BorderLayout()); @@ -1251,6 +1243,8 @@ public class FeatureSettings extends JPanel JButton loadColours = new JButton( MessageManager.getString("label.load_colours")); loadColours.setFont(JvSwingUtils.getLabelFont()); + loadColours.setToolTipText( + MessageManager.getString("label.load_colours_tooltip")); loadColours.addActionListener(new ActionListener() { @Override @@ -1263,6 +1257,8 @@ public class FeatureSettings extends JPanel JButton saveColours = new JButton( MessageManager.getString("label.save_colours")); saveColours.setFont(JvSwingUtils.getLabelFont()); + saveColours.setToolTipText( + MessageManager.getString("label.save_colours_tooltip")); saveColours.addActionListener(new ActionListener() { @Override @@ -1287,38 +1283,6 @@ public class FeatureSettings extends JPanel transparency.setMaximum(70); transparency.setToolTipText( MessageManager.getString("label.transparency_tip")); - fetchDAS.setText(MessageManager.getString("label.fetch_das_features")); - fetchDAS.addActionListener(new ActionListener() - { - @Override - public void actionPerformed(ActionEvent e) - { - fetchDAS_actionPerformed(e); - } - }); - saveDAS.setText(MessageManager.getString("action.save_as_default")); - saveDAS.addActionListener(new ActionListener() - { - @Override - public void actionPerformed(ActionEvent e) - { - saveDAS_actionPerformed(e); - } - }); - - JPanel dasButtonPanel = new JPanel(); - dasButtonPanel.setBorder(BorderFactory.createEtchedBorder()); - dasSettingsPane.setBorder(null); - cancelDAS.setEnabled(false); - cancelDAS.setText(MessageManager.getString("action.cancel_fetch")); - cancelDAS.addActionListener(new ActionListener() - { - @Override - public void actionPerformed(ActionEvent e) - { - cancelDAS_actionPerformed(e); - } - }); JPanel transPanel = new JPanel(new GridLayout(1, 2)); bigPanel.add(transPanel, BorderLayout.SOUTH); @@ -1338,170 +1302,93 @@ public class FeatureSettings extends JPanel buttonPanel.add(loadColours); buttonPanel.add(saveColours); bigPanel.add(scrollPane, BorderLayout.CENTER); - dasSettingsPane.add(dasButtonPanel, BorderLayout.SOUTH); - dasButtonPanel.add(fetchDAS); - dasButtonPanel.add(cancelDAS); - dasButtonPanel.add(saveDAS); settingsPane.add(bigPanel, BorderLayout.CENTER); settingsPane.add(buttonPanel, BorderLayout.SOUTH); this.add(settingsPane); } - public void fetchDAS_actionPerformed(ActionEvent e) - { - fetchDAS.setEnabled(false); - cancelDAS.setEnabled(true); - dassourceBrowser.setGuiEnabled(false); - Vector selectedSources = dassourceBrowser - .getSelectedSources(); - doDasFeatureFetch(selectedSources, true, true); - } - /** - * get the features from selectedSources for all or the current selection + * Answers a suitable tooltip to show on the colour cell of the table * - * @param selectedSources - * @param checkDbRefs - * @param promptFetchDbRefs + * @param fcol + * @param withHint + * if true include 'click to edit' and similar text + * @return */ - private void doDasFeatureFetch(List selectedSources, - boolean checkDbRefs, boolean promptFetchDbRefs) + public static String getColorTooltip(FeatureColourI fcol, + boolean withHint) { - SequenceI[] dataset, seqs; - int iSize; - AlignmentViewport vp = af.getViewport(); - if (vp.getSelectionGroup() != null - && vp.getSelectionGroup().getSize() > 0) + if (fcol == null) { - iSize = vp.getSelectionGroup().getSize(); - dataset = new SequenceI[iSize]; - seqs = vp.getSelectionGroup().getSequencesInOrder(vp.getAlignment()); + return null; } - else + if (fcol.isSimpleColour()) { - iSize = vp.getAlignment().getHeight(); - seqs = vp.getAlignment().getSequencesArray(); + return withHint ? BASE_TOOLTIP : null; } - - dataset = new SequenceI[iSize]; - for (int i = 0; i < iSize; i++) + String description = fcol.getDescription(); + description = description.replaceAll("<", "<"); + description = description.replaceAll(">", ">"); + StringBuilder tt = new StringBuilder(description); + if (withHint) { - dataset[i] = seqs[i].getDatasetSequence(); + tt.append("
").append(BASE_TOOLTIP).append("
"); } - - cancelDAS.setEnabled(true); - dasFeatureFetcher = new jalview.ws.DasSequenceFeatureFetcher(dataset, - this, selectedSources, checkDbRefs, promptFetchDbRefs); - af.getViewport().setShowSequenceFeatures(true); - af.showSeqFeatures.setSelected(true); - } - - /** - * blocking call to initialise the das source browser - */ - public void initDasSources() - { - dassourceBrowser.initDasSources(); - } - - /** - * examine the current list of das sources and return any matching the given - * nicknames in sources - * - * @param sources - * Vector of Strings to resolve to DAS source nicknames. - * @return sources that are present in source list. - */ - public List resolveSourceNicknames(Vector sources) - { - return dassourceBrowser.sourceRegistry.resolveSourceNicknames(sources); - } - - /** - * get currently selected das sources. ensure you have called initDasSources - * before calling this. - * - * @return vector of selected das source nicknames - */ - public Vector getSelectedSources() - { - return dassourceBrowser.getSelectedSources(); + return JvSwingUtils.wrapTooltip(true, tt.toString()); } - /** - * properly initialise DAS fetcher and then initiate a new thread to fetch - * features from the named sources (rather than any turned on by default) - * - * @param sources - * @param block - * if true then runs in same thread, otherwise passes to the Swing - * executor - */ - public void fetchDasFeatures(Vector sources, boolean block) + public static void renderGraduatedColor(JLabel comp, FeatureColourI gcol, + int w, int h) { - initDasSources(); - List resolved = dassourceBrowser.sourceRegistry - .resolveSourceNicknames(sources); - if (resolved.size() == 0) + boolean thr = false; + StringBuilder tx = new StringBuilder(); + + if (gcol.isColourByAttribute()) { - resolved = dassourceBrowser.getSelectedSources(); + tx.append(FeatureMatcher + .toAttributeDisplayName(gcol.getAttributeName())); } - if (resolved.size() > 0) + else if (!gcol.isColourByLabel()) { - final List dassources = resolved; - fetchDAS.setEnabled(false); - // cancelDAS.setEnabled(true); doDasFetch does this. - Runnable fetcher = new Runnable() - { - - @Override - public void run() - { - doDasFeatureFetch(dassources, true, false); - - } - }; - if (block) + tx.append(MessageManager.getString("label.score")); + } + tx.append(" "); + if (gcol.isAboveThreshold()) + { + thr = true; + tx.append(">"); + } + if (gcol.isBelowThreshold()) + { + thr = true; + tx.append("<"); + } + if (gcol.isColourByLabel()) + { + if (thr) { - fetcher.run(); + tx.append(" "); } - else + if (!gcol.isColourByAttribute()) { - SwingUtilities.invokeLater(fetcher); + tx.append("Label"); } + comp.setIcon(null); } - } - - public void saveDAS_actionPerformed(ActionEvent e) - { - dassourceBrowser - .saveProperties(jalview.bin.Cache.applicationProperties); - } - - public void complete() - { - fetchDAS.setEnabled(true); - cancelDAS.setEnabled(false); - dassourceBrowser.setGuiEnabled(true); - - } - - public void cancelDAS_actionPerformed(ActionEvent e) - { - if (dasFeatureFetcher != null) + else { - dasFeatureFetcher.cancel(); + Color newColor = gcol.getMaxColour(); + comp.setBackground(newColor); + // System.err.println("Width is " + w / 2); + Icon ficon = new FeatureIcon(gcol, comp.getBackground(), w, h, thr); + comp.setIcon(ficon); + // tt+="RGB value: Max (" + newColor.getRed() + ", " + // + newColor.getGreen() + ", " + newColor.getBlue() + // + ")\nMin (" + minCol.getRed() + ", " + minCol.getGreen() + // + ", " + minCol.getBlue() + ")"); } - complete(); - } - - public void noDasSourceActive() - { - complete(); - JvOptionPane.showInternalConfirmDialog(Desktop.desktop, - MessageManager.getString("label.no_das_sources_selected_warn"), - MessageManager.getString("label.no_das_sources_selected_title"), - JvOptionPane.DEFAULT_OPTION, JvOptionPane.INFORMATION_MESSAGE); + comp.setHorizontalAlignment(SwingConstants.CENTER); + comp.setText(tx.toString()); } // /////////////////////////////////////////////////////////////////////// @@ -1509,21 +1396,10 @@ public class FeatureSettings extends JPanel // /////////////////////////////////////////////////////////////////////// class FeatureTableModel extends AbstractTableModel { - /* - * column indices of fields in Feature Settings table - */ - static final int TYPE_COLUMN = 0; - - static final int COLOUR_COLUMN = 1; - - static final int FILTER_COLUMN = 2; - - static final int SHOW_COLUMN = 3; - private String[] columnNames = { MessageManager.getString("label.feature_type"), MessageManager.getString("action.colour"), - MessageManager.getString("label.filter"), + MessageManager.getString("label.configuration"), MessageManager.getString("label.show") }; private Object[][] data; @@ -1600,11 +1476,9 @@ public class FeatureSettings extends JPanel class ColorRenderer extends JLabel implements TableCellRenderer { - javax.swing.border.Border unselectedBorder = null; + Border unselectedBorder = null; - javax.swing.border.Border selectedBorder = null; - - final String baseTT = "Click to edit, right/apple click for menu."; + Border selectedBorder = null; public ColorRenderer() { @@ -1619,7 +1493,6 @@ public class FeatureSettings extends JPanel { FeatureColourI cellColour = (FeatureColourI) color; setOpaque(true); - setToolTipText(baseTT); setBackground(tbl.getBackground()); if (!cellColour.isSimpleColour()) { @@ -1674,7 +1547,7 @@ public class FeatureSettings extends JPanel Object filter, boolean isSelected, boolean hasFocus, int row, int column) { - KeyedMatcherSetI theFilter = (KeyedMatcherSetI) filter; + FeatureMatcherSetI theFilter = (FeatureMatcherSetI) filter; setOpaque(true); String asText = theFilter.toString(); setBackground(tbl.getBackground()); @@ -1726,77 +1599,6 @@ public class FeatureSettings extends JPanel renderGraduatedColor(comp, gcol, w, h); } - public static void renderGraduatedColor(JLabel comp, FeatureColourI gcol, - int w, int h) - { - boolean thr = false; - StringBuilder tt = new StringBuilder(); - StringBuilder tx = new StringBuilder(); - - if (gcol.isColourByAttribute()) - { - tx.append(String.join(":", gcol.getAttributeName())); - } - else if (!gcol.isColourByLabel()) - { - tx.append(MessageManager.getString("label.score")); - } - tx.append(" "); - if (gcol.isAboveThreshold()) - { - thr = true; - tx.append(">"); - tt.append("Thresholded (Above ").append(gcol.getThreshold()) - .append(") "); - } - if (gcol.isBelowThreshold()) - { - thr = true; - tx.append("<"); - tt.append("Thresholded (Below ").append(gcol.getThreshold()) - .append(") "); - } - if (gcol.isColourByLabel()) - { - tt.append("Coloured by label text. ").append(tt); - if (thr) - { - tx.append(" "); - } - if (!gcol.isColourByAttribute()) - { - tx.append("Label"); - } - comp.setIcon(null); - } - else - { - Color newColor = gcol.getMaxColour(); - comp.setBackground(newColor); - // System.err.println("Width is " + w / 2); - Icon ficon = new FeatureIcon(gcol, comp.getBackground(), w, h, thr); - comp.setIcon(ficon); - // tt+="RGB value: Max (" + newColor.getRed() + ", " - // + newColor.getGreen() + ", " + newColor.getBlue() - // + ")\nMin (" + minCol.getRed() + ", " + minCol.getGreen() - // + ", " + minCol.getBlue() + ")"); - } - comp.setHorizontalAlignment(SwingConstants.CENTER); - comp.setText(tx.toString()); - if (tt.length() > 0) - { - if (comp.getToolTipText() == null) - { - comp.setToolTipText(tt.toString()); - } - else - { - comp.setToolTipText( - tt.append(" ").append(comp.getToolTipText()).toString()); - } - } - } - class ColorEditor extends AbstractCellEditor implements TableCellEditor, ActionListener { @@ -1859,14 +1661,17 @@ public class FeatureSettings extends JPanel { // bring up graduated chooser. chooser = new FeatureTypeSettings(me.fr, type); - chooser.setRequestFocusEnabled(true); - chooser.requestFocus(); + /** + * @j2sNative + */ + { + chooser.setRequestFocusEnabled(true); + chooser.requestFocus(); + } chooser.addActionListener(this); - chooser.showTab(true); + // Make the renderer reappear. + fireEditingStopped(); } - // Make the renderer reappear. - fireEditingStopped(); - } else { @@ -1886,10 +1691,10 @@ public class FeatureSettings extends JPanel * update table data without triggering updateFeatureRenderer */ currentColor = fr.getFeatureColours().get(type); - KeyedMatcherSetI currentFilter = me.fr.getFeatureFilter(type); + FeatureMatcherSetI currentFilter = me.fr.getFeatureFilter(type); if (currentFilter == null) { - currentFilter = new KeyedMatcherSet(); + currentFilter = new FeatureMatcherSet(); } Object[] data = ((FeatureTableModel) table.getModel()) .getData()[rowSelected]; @@ -1948,7 +1753,7 @@ public class FeatureSettings extends JPanel { FeatureSettings me; - KeyedMatcherSetI currentFilter; + FeatureMatcherSetI currentFilter; Point lastLocation; @@ -1988,7 +1793,6 @@ public class FeatureSettings extends JPanel chooser.getWidth(), chooser.getHeight()); chooser.validate(); } - chooser.showTab(false); fireEditingStopped(); } else if (e.getSource() instanceof Component) @@ -2003,7 +1807,7 @@ public class FeatureSettings extends JPanel currentFilter = me.fr.getFeatureFilter(type); if (currentFilter == null) { - currentFilter = new KeyedMatcherSet(); + currentFilter = new FeatureMatcherSet(); } Object[] data = ((FeatureTableModel) table.getModel()) .getData()[rowSelected]; @@ -2024,13 +1828,12 @@ public class FeatureSettings extends JPanel public Component getTableCellEditorComponent(JTable theTable, Object value, boolean isSelected, int row, int column) { - currentFilter = (KeyedMatcherSetI) value; + currentFilter = (FeatureMatcherSetI) value; this.rowSelected = row; type = me.table.getValueAt(row, TYPE_COLUMN).toString(); button.setOpaque(true); button.setBackground(me.getBackground()); button.setText(currentFilter.toString()); - button.setToolTipText(currentFilter.toString()); button.setIcon(null); return button; }