X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FFeatureSettings.java;h=6d8457412b414866ca8646372e3b40e925993309;hb=a9177efb4097815d9a8031aa22700c61a7d6260a;hp=e6364555db3d9811d52efa2c5eceea6fb9ef7b7c;hpb=4160e6f1fa6aa45849153cce5794faa93e3a19c4;p=jalview.git diff --git a/src/jalview/gui/FeatureSettings.java b/src/jalview/gui/FeatureSettings.java index e636455..6d84574 100644 --- a/src/jalview/gui/FeatureSettings.java +++ b/src/jalview/gui/FeatureSettings.java @@ -45,6 +45,7 @@ import java.io.FileOutputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; +import java.io.Reader; import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; @@ -52,6 +53,7 @@ import java.util.HashSet; import java.util.Hashtable; import java.util.Iterator; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Set; @@ -61,7 +63,6 @@ import javax.swing.BorderFactory; import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JCheckBox; -import javax.swing.JCheckBoxMenuItem; import javax.swing.JInternalFrame; import javax.swing.JLabel; import javax.swing.JLayeredPane; @@ -103,6 +104,8 @@ import jalview.datamodel.features.FeatureMatcherSet; import jalview.datamodel.features.FeatureMatcherSetI; import jalview.gui.Help.HelpId; import jalview.gui.JalviewColourChooser.ColourChooserListener; +import jalview.io.DataSourceType; +import jalview.io.FileParse; import jalview.io.JalviewFileChooser; import jalview.io.JalviewFileView; import jalview.schemes.FeatureColour; @@ -215,6 +218,7 @@ public class FeatureSettings extends JPanel transparency.setValue(100 - transparencyAsPercent); inConstruction = incon; } + /** * Constructor * @@ -410,6 +414,7 @@ public class FeatureSettings extends JPanel { frame = new JInternalFrame(); frame.setContentPane(this); + frame.setFrameIcon(null); Rectangle bounds = af.getFeatureSettingsGeometry(); String title; if (af.getAlignPanels().size() > 1 || Desktop.getAlignmentPanels( @@ -455,8 +460,8 @@ public class FeatureSettings extends JPanel }); frame.setLayer(JLayeredPane.PALETTE_LAYER); } - inConstruction = false; - } + inConstruction = false; + } /** * Sets the state of buttons to show complement features from viewport @@ -482,95 +487,21 @@ public class FeatureSettings extends JPanel change = null; } - /** - * Constructs and shows a popup menu of possible actions on the selected row and - * feature type - * - * @param rowSelected - * @param type - * @param typeCol - * @param pt - */ - protected void showPopupMenu(final int rowSelected, final String type, final Object typeCol, final Point pt) + /** + * Constructs and shows a popup menu of possible actions on the selected row + * and feature type + * + * @param rowSelected + * @param type + * @param typeCol + * @param pt + */ + protected void showPopupMenu(final int rowSelected, final String type, + final Object typeCol, final Point pt) { JPopupMenu men = new JPopupMenu(MessageManager .formatMessage("label.settings_for_param", new String[] { type })); - final FeatureColourI featureColour = (FeatureColourI) typeCol; - - /* - * menu option to select (or deselect) variable colour - */ - final JCheckBoxMenuItem variableColourCB = new JCheckBoxMenuItem( - MessageManager.getString("label.variable_colour")); - variableColourCB.setSelected(!featureColour.isSimpleColour()); - men.add(variableColourCB); - - /* - * checkbox action listener doubles up as listener to OK - * from the variable colour / filters dialog - */ - variableColourCB.addActionListener(new ActionListener() - { - @Override - public void actionPerformed(ActionEvent e) - { - if (e.getSource() == variableColourCB) - { - // BH 2018 for JavaScript because this is a checkbox - men.setVisible(true); - men.setVisible(false); - if (featureColour.isSimpleColour()) - { - /* - * toggle simple colour to variable colour - show dialog - */ - FeatureTypeSettings fc = new FeatureTypeSettings(fr, type); - fc.addActionListener(this); - } - else - { - /* - * toggle variable to simple colour - show colour chooser - */ - String title = MessageManager - .formatMessage("label.select_colour_for", type); - ColourChooserListener listener = new ColourChooserListener() - { - @Override - public void colourSelected(Color c) - { - table.setValueAt(new FeatureColour(c), rowSelected, - COLOUR_COLUMN); - table.validate(); - updateFeatureRenderer( - ((FeatureTableModel) table.getModel()).getData(), - false); - } - }; - JalviewColourChooser.showColourChooser(FeatureSettings.this, - title, featureColour.getMaxColour(), listener); - } - } - 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, COLOUR_COLUMN); - // BH 2018 setting a table value does not invalidate it. - // System.out.println("FeatureSettings is valied" + - // table.validate(); - } - } - } - }); - - men.addSeparator(); JMenuItem scr = new JMenuItem( MessageManager.getString("label.sort_by_score")); @@ -1020,16 +951,70 @@ public class FeatureSettings extends JPanel chooser.setDialogTitle( MessageManager.getString("label.load_feature_colours")); chooser.setToolTipText(MessageManager.getString("action.load")); - chooser.setResponseHandler(0, new Runnable() + chooser.setResponseHandler(0, () -> { + File file = chooser.getSelectedFile(); + load(file); + }); + chooser.showOpenDialog(this); + } + + public static boolean loadFeatureSettingsFile(FeatureRenderer fr, + File file) throws Exception + { + InputStreamReader in = new InputStreamReader(new FileInputStream(file), + "UTF-8"); + return loadFeatureSettingsFile(fr, in); + } + + public static void loadFeatureSettingsFile( + FeatureRenderer featureRenderer, Object fileObject, + DataSourceType sourceType) throws Exception + { + FileParse fp = new FileParse(fileObject, sourceType); + loadFeatureSettingsFile(featureRenderer, fp.getReader()); + } + + private static boolean loadFeatureSettingsFile(FeatureRenderer fr, + Reader in) throws Exception + { + 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(); + + // JalviewUserColours jucs = JalviewUserColours.unmarshal(in); + + /* + * load feature colours + */ + for (int i = jucs.getColour().size() - 1; i >= 0; i--) { - @Override - public void run() + 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()) { - File file = chooser.getSelectedFile(); - load(file); + fr.setFeatureFilter(featureType, filter); } - }); - chooser.showOpenDialog(this); + } + return true; } /** @@ -1039,50 +1024,21 @@ public class FeatureSettings extends JPanel */ void load(File file) { + load(file, DataSourceType.FILE); + } + + /** + * Loads feature colours and filters from XML at a specified source + * + * @param file + * - string or file or other object that allows FileParse to be + * created + */ + void load(Object file, DataSourceType sourceType) + { try { - InputStreamReader in = new InputStreamReader( - new FileInputStream(file), "UTF-8"); - - 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(); - - // JalviewUserColours jucs = JalviewUserColours.unmarshal(in); - - /* - * 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()) - { - fr.setFeatureFilter(featureType, filter); - } - } - + loadFeatureSettingsFile(fr, file, sourceType); /* * update feature settings table */ @@ -1096,7 +1052,8 @@ public class FeatureSettings extends JPanel } } catch (Exception ex) { - System.out.println("Error loading User Colour File\n" + ex); + jalview.bin.Console + .outPrintln("Error loading User Colour File\n" + ex); } } @@ -1274,8 +1231,8 @@ public class FeatureSettings extends JPanel } /** - * close ourselves but leave any existing UI handlers (e.g a CDS/Protein tabbed - * feature settings dialog) intact + * close ourselves but leave any existing UI handlers (e.g a CDS/Protein + * tabbed feature settings dialog) intact */ public void closeOldSettings() { @@ -1391,7 +1348,8 @@ public class FeatureSettings extends JPanel } }); - final String byScoreLabel = MessageManager.getString("label.seq_sort_by_score"); + final String byScoreLabel = MessageManager + .getString("label.seq_sort_by_score"); JButton sortByScore = new JButton(byScoreLabel); sortByScore.setFont(JvSwingUtils.getLabelFont()); sortByScore.addActionListener(new ActionListener() @@ -1405,7 +1363,8 @@ public class FeatureSettings extends JPanel } } }); - final String byDensityLabel = MessageManager.getString("label.sequence_sort_by_density"); + final String byDensityLabel = MessageManager + .getString("label.sequence_sort_by_density"); JButton sortByDens = new JButton(byDensityLabel); sortByDens.setFont(JvSwingUtils.getLabelFont()); sortByDens.addActionListener(new ActionListener() @@ -1436,7 +1395,8 @@ public class FeatureSettings extends JPanel } } }); - // Cancel for a SplitFrame should just revert changes to the currently displayed + // Cancel for a SplitFrame should just revert changes to the currently + // displayed // settings. May want to do this for either or both - so need a splitview // feature settings cancel/OK. JButton cancel = new JButton(MessageManager @@ -1526,11 +1486,12 @@ public class FeatureSettings extends JPanel MessageManager.getString("label.transparency_tip")); boolean nucleotide = af.getViewport().getAlignment().isNucleotide(); - String text = MessageManager.formatMessage("label.show_linked_features", - nucleotide - ? MessageManager.getString("label.protein") - .toLowerCase() - : "CDS"); + String text = MessageManager + .formatMessage("label.show_linked_features", + nucleotide + ? MessageManager.getString("label.protein") + .toLowerCase(Locale.ROOT) + : "CDS"); showComplement = new JCheckBox(text); showComplement.addActionListener(new ActionListener() { @@ -1614,7 +1575,7 @@ public class FeatureSettings extends JPanel * * @param fcol * @param withHint - * if true include 'click to edit' and similar text + * if true include 'click to edit' and similar text * @return */ public static String getColorTooltip(FeatureColourI fcol, @@ -1681,7 +1642,7 @@ public class FeatureSettings extends JPanel { Color newColor = gcol.getMaxColour(); comp.setBackground(newColor); - // System.err.println("Width is " + w / 2); + // jalview.bin.Console.errPrintln("Width is " + w / 2); Icon ficon = new FeatureIcon(gcol, comp.getBackground(), w, h, thr); comp.setIcon(ficon); // tt+="RGB value: Max (" + newColor.getRed() + ", " @@ -1860,11 +1821,15 @@ public class FeatureSettings extends JPanel { FeatureMatcherSetI theFilter = (FeatureMatcherSetI) filter; setOpaque(true); - String asText = theFilter.toString(); setBackground(tbl.getBackground()); - this.setText(asText); this.setIcon(null); + if (theFilter != null) + { + String asText = theFilter.toString(); + this.setText(asText); + } + if (isSelected) { if (selectedBorder == null) @@ -1954,6 +1919,9 @@ public class FeatureSettings extends JPanel */ String ttl = MessageManager .formatMessage("label.select_colour_for", type); + Object last = (Boolean) table.getValueAt(selectedRow, + SHOW_COLUMN); + table.setValueAt(Boolean.TRUE, selectedRow, SHOW_COLUMN); ColourChooserListener listener = new ColourChooserListener() { @Override @@ -1961,12 +1929,14 @@ public class FeatureSettings extends JPanel { currentColor = new FeatureColour(c); table.setValueAt(currentColor, rowSelected, COLOUR_COLUMN); + table.setValueAt(Boolean.TRUE, selectedRow, SHOW_COLUMN); fireEditingStopped(); } @Override public void cancel() { + table.setValueAt(last, selectedRow, SHOW_COLUMN); fireEditingStopped(); } }; @@ -1978,7 +1948,10 @@ public class FeatureSettings extends JPanel /* * variable colour and filters dialog */ - chooser = new FeatureTypeSettings(fr, type); + boolean last = (Boolean) table.getValueAt(selectedRow, + SHOW_COLUMN); + table.setValueAt(Boolean.TRUE, selectedRow, SHOW_COLUMN); + chooser = new FeatureTypeSettings(fr, type, last); if (!Platform.isJS()) /** * Java only @@ -2104,7 +2077,11 @@ public class FeatureSettings extends JPanel { if (button == e.getSource()) { - FeatureTypeSettings chooser = new FeatureTypeSettings(fr, type); + boolean last = fr.getFeaturesDisplayed().isVisible(type); + ((FeatureTableModel) table.getModel()).setValueAt(Boolean.TRUE, + rowSelected, SHOW_COLUMN); + FeatureTypeSettings chooser = new FeatureTypeSettings(fr, type, + last); chooser.addActionListener(this); chooser.setRequestFocusEnabled(true); chooser.requestFocus(); @@ -2136,6 +2113,8 @@ public class FeatureSettings extends JPanel .getData()[rowSelected]; data[COLOUR_COLUMN] = currentColor; data[FILTER_COLUMN] = currentFilter; + data[SHOW_COLUMN] = fr.getFeaturesDisplayed().isVisible(type); + fireEditingStopped(); // SwingJS needs an explicit repaint() here, // rather than relying upon no validation having