*/
package jalview.gui;
-import jalview.bin.Cache;
-import jalview.io.JalviewFileChooser;
-import jalview.io.JalviewFileView;
-import jalview.jbgui.GUserDefinedColours;
-import jalview.schemabinding.version2.Colour;
-import jalview.schemabinding.version2.JalviewUserColours;
-import jalview.schemes.ColourSchemeI;
-import jalview.schemes.ColourSchemeLoader;
-import jalview.schemes.ColourSchemes;
-import jalview.schemes.ResidueProperties;
-import jalview.schemes.UserColourScheme;
-import jalview.util.ColorUtils;
-import jalview.util.Format;
-import jalview.util.MessageManager;
-
import java.awt.Color;
import java.awt.Font;
import java.awt.Insets;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
+import java.util.Locale;
import javax.swing.JButton;
import javax.swing.JInternalFrame;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.Marshaller;
+
+import jalview.bin.Cache;
+import jalview.io.JalviewFileChooser;
+import jalview.io.JalviewFileView;
+import jalview.jbgui.GUserDefinedColours;
+import jalview.schemes.ColourSchemeI;
+import jalview.schemes.ColourSchemeLoader;
+import jalview.schemes.ColourSchemes;
+import jalview.schemes.ResidueProperties;
+import jalview.schemes.UserColourScheme;
+import jalview.util.ColorUtils;
+import jalview.util.Format;
+import jalview.util.MessageManager;
+import jalview.util.Platform;
+import jalview.xml.binding.jalview.JalviewUserColours;
+import jalview.xml.binding.jalview.JalviewUserColours.Colour;
+import jalview.xml.binding.jalview.ObjectFactory;
/**
* This panel allows the user to assign colours to Amino Acid residue codes, and
* @author Andrew Waterhouse
* @author Mungo Carstairs
*/
-public class UserDefinedColours extends GUserDefinedColours implements
- ChangeListener
+public class UserDefinedColours extends GUserDefinedColours
+ implements ChangeListener
{
- private static final Font VERDANA_BOLD_10 = new Font("Verdana",
- Font.BOLD, 10);
+ private static final Font VERDANA_BOLD_10 = new Font("Verdana", Font.BOLD,
+ 10);
public static final String USER_DEFINED_COLOURS = "USER_DEFINED_COLOURS";
AlignmentPanel ap;
+ /*
+ * the colour scheme when the dialog was opened, or
+ * the scheme last saved to file
+ */
ColourSchemeI oldColourScheme;
+ /*
+ * flag is true if the colour scheme has been changed since the
+ * dialog was opened, or the changes last saved to file
+ */
+ boolean changedButNotSaved;
+
JInternalFrame frame;
List<JButton> upperCaseButtons;
if (oldColourScheme instanceof UserColourScheme)
{
schemeName.setText(oldColourScheme.getSchemeName());
- if (((UserColourScheme) oldColourScheme).getLowerCaseColours() != null)
+ if (((UserColourScheme) oldColourScheme)
+ .getLowerCaseColours() != null)
{
caseSensitive.setSelected(true);
lcaseColour.setEnabled(true);
UserDefinedColours()
{
super();
- selectedButtons = new ArrayList<JButton>();
+ selectedButtons = new ArrayList<>();
}
void showFrame()
{
colorChooser.getSelectionModel().addChangeListener(this);
frame = new JInternalFrame();
+ frame.setFrameIcon(null);
frame.setContentPane(this);
Desktop.addInternalFrame(frame,
MessageManager.getString("label.user_defined_colours"),
if (upperCaseButtons == null)
{
- upperCaseButtons = new ArrayList<JButton>();
+ upperCaseButtons = new ArrayList<>();
}
for (int i = 0; i < 20; i++)
if (lowerCaseButtons == null)
{
- lowerCaseButtons = new ArrayList<JButton>();
+ lowerCaseButtons = new ArrayList<>();
}
for (int i = 0; i < 20; i++)
{
int row = i / cols + 1;
int index = (row * cols) + i;
- JButton button = makeButton(ResidueProperties.aa[i].toLowerCase(),
- ResidueProperties.aa[i].toLowerCase(), lowerCaseButtons, i);
+ JButton button = makeButton(
+ ResidueProperties.aa[i].toLowerCase(Locale.ROOT),
+ ResidueProperties.aa[i].toLowerCase(Locale.ROOT),
+ lowerCaseButtons, i);
buttonPanel.add(button, index);
}
{
button = lowerCaseButtons.get(i);
button.setBackground(newColour);
- button.setForeground(ColorUtils.brighterThan(button.getBackground()));
+ button.setForeground(
+ ColorUtils.brighterThan(button.getBackground()));
}
}
for (int i = 0; i < selectedButtons.size(); i++)
button.setBackground(newColour);
button.setForeground(ColorUtils.brighterThan(newColour));
}
+
+ changedButNotSaved = true;
}
/**
JButton button = (JButton) buttonPanel.getComponent(b);
if (!selectedButtons.contains(button))
{
- button.setForeground(ColorUtils.brighterThan(button
- .getBackground()));
+ button.setForeground(
+ ColorUtils.brighterThan(button.getBackground()));
selectedButtons.add(button);
}
}
button.setForeground(ColorUtils.darkerThan(button.getBackground()));
}
selectedButtons.clear();
- pressed.setForeground(ColorUtils.brighterThan(pressed.getBackground()));
+ pressed.setForeground(
+ ColorUtils.brighterThan(pressed.getBackground()));
selectedButtons.add(pressed);
}
{
if (selectedButtons.contains(pressed))
{
- pressed.setForeground(ColorUtils.darkerThan(pressed.getBackground()));
+ pressed.setForeground(
+ ColorUtils.darkerThan(pressed.getBackground()));
selectedButtons.remove(pressed);
}
else
{
- pressed.setForeground(ColorUtils.brighterThan(pressed
- .getBackground()));
+ pressed.setForeground(
+ ColorUtils.brighterThan(pressed.getBackground()));
selectedButtons.add(pressed);
}
}
{
if (isNoSelectionMade())
{
- JvOptionPane.showMessageDialog(Desktop.desktop, MessageManager
- .getString("label.no_colour_selection_in_scheme"),
+ JvOptionPane.showMessageDialog(Desktop.desktop,
+ MessageManager
+ .getString("label.no_colour_selection_in_scheme"),
MessageManager.getString("label.no_colour_selection_warn"),
JvOptionPane.WARNING_MESSAGE);
}
else
{
+ /*
+ * OK is treated as 'apply colours and close'
+ */
applyButton_actionPerformed();
+ /*
+ * If editing a named colour scheme, warn if changes
+ * have not been saved
+ */
+ warnIfUnsavedChanges();
+
try
{
frame.setClosed(true);
}
/**
+ * If we have made changes to an existing user defined colour scheme but not
+ * saved them, show a dialog with the option to save. If the user chooses to
+ * save, do so, else clear the colour scheme name to indicate a new colour
+ * scheme.
+ */
+ protected void warnIfUnsavedChanges()
+ {
+ // BH 2018 no warning in JavaScript TODO
+
+ if (!Platform.isJS() && changedButNotSaved)
+ /**
+ * Java only
+ *
+ * @j2sIgnore
+ */
+ {
+ String name = schemeName.getText().trim();
+ if (oldColourScheme != null && !"".equals(name)
+ && name.equals(oldColourScheme.getSchemeName()))
+ {
+ String message = MessageManager
+ .formatMessage("label.scheme_changed", name);
+ String title = MessageManager.getString("label.save_changes");
+ String[] options = new String[] { title,
+ MessageManager.getString("label.dont_save_changes"), };
+ final String question = JvSwingUtils.wrapTooltip(true, message);
+ int response = JvOptionPane.showOptionDialog(Desktop.desktop,
+ question, title, JvOptionPane.DEFAULT_OPTION,
+ JvOptionPane.PLAIN_MESSAGE, null, options, options[0]);
+
+ if (response == 0)
+ {
+ /*
+ * prompt to save changes to file; if done,
+ * resets 'changed' flag to false
+ */
+ savebutton_actionPerformed();
+ }
+
+ /*
+ * if user chooses not to save (either in this dialog or in the
+ * save as dialogs), treat this as a new user defined colour scheme
+ */
+ if (changedButNotSaved)
+ {
+ /*
+ * clear scheme name and re-apply as an anonymous scheme
+ */
+ schemeName.setText("");
+ applyButton_actionPerformed();
+ }
+ }
+ }
+ }
+
+ /**
* Returns true if the user has not made any colour selection (including if
* 'case-sensitive' selected and no lower-case colour chosen).
*
{
if (isNoSelectionMade())
{
- JvOptionPane.showMessageDialog(Desktop.desktop, MessageManager
- .getString("label.no_colour_selection_in_scheme"),
+ JvOptionPane.showMessageDialog(Desktop.desktop,
+ MessageManager
+ .getString("label.no_colour_selection_in_scheme"),
MessageManager.getString("label.no_colour_selection_warn"),
JvOptionPane.WARNING_MESSAGE);
@Override
protected void loadbutton_actionPerformed()
{
- upperCaseButtons = new ArrayList<JButton>();
- lowerCaseButtons = new ArrayList<JButton>();
-
+ upperCaseButtons = new ArrayList<>();
+ lowerCaseButtons = new ArrayList<>();
JalviewFileChooser chooser = new JalviewFileChooser("jc",
"Jalview User Colours");
chooser.setFileView(new JalviewFileView());
- chooser.setDialogTitle(MessageManager
- .getString("label.load_colour_scheme"));
+ chooser.setDialogTitle(
+ MessageManager.getString("label.load_colour_scheme"));
chooser.setToolTipText(MessageManager.getString("action.load"));
+ chooser.setResponseHandler(0, () -> {
+ File choice = chooser.getSelectedFile();
+ Cache.setProperty(LAST_DIRECTORY, choice.getParent());
- int value = chooser.showOpenDialog(this);
-
- if (value != JalviewFileChooser.APPROVE_OPTION)
- {
- return;
- }
- File choice = chooser.getSelectedFile();
- Cache.setProperty(LAST_DIRECTORY, choice.getParent());
+ UserColourScheme ucs = ColourSchemeLoader
+ .loadColourScheme(choice.getAbsolutePath());
+ Color[] colors = ucs.getColours();
+ schemeName.setText(ucs.getSchemeName());
- UserColourScheme ucs = ColourSchemeLoader.loadColourScheme(choice
- .getAbsolutePath());
- Color[] colors = ucs.getColours();
- schemeName.setText(ucs.getSchemeName());
+ if (ucs.getLowerCaseColours() != null)
+ {
+ caseSensitive.setSelected(true);
+ lcaseColour.setEnabled(true);
+ resetButtonPanel(true);
+ for (int i = 0; i < lowerCaseButtons.size(); i++)
+ {
+ JButton button = lowerCaseButtons.get(i);
+ button.setBackground(ucs.getLowerCaseColours()[i]);
+ }
+ }
+ else
+ {
+ caseSensitive.setSelected(false);
+ lcaseColour.setEnabled(false);
+ resetButtonPanel(false);
+ }
- if (ucs.getLowerCaseColours() != null)
- {
- caseSensitive.setSelected(true);
- lcaseColour.setEnabled(true);
- resetButtonPanel(true);
- for (int i = 0; i < lowerCaseButtons.size(); i++)
+ for (int i = 0; i < upperCaseButtons.size(); i++)
{
- JButton button = lowerCaseButtons.get(i);
- button.setBackground(ucs.getLowerCaseColours()[i]);
+ JButton button = upperCaseButtons.get(i);
+ button.setBackground(colors[i]);
}
- }
- else
- {
- caseSensitive.setSelected(false);
- lcaseColour.setEnabled(false);
- resetButtonPanel(false);
- }
- for (int i = 0; i < upperCaseButtons.size(); i++)
- {
- JButton button = upperCaseButtons.get(i);
- button.setBackground(colors[i]);
- }
+ addNewColourScheme(choice.getPath());
+ return null;
+ });
- addNewColourScheme(choice.getPath());
+ chooser.showOpenDialog(this);
}
/**
* name if overwriting</li>
* <li>Do the standard file chooser thing to write with extension .jc</li>
* <li>If saving changes (possibly not yet applied) to the currently selected
- * colour scheme, then apply the changes, as it is too late to back out now</li>
+ * colour scheme, then apply the changes, as it is too late to back out
+ * now</li>
* <li>Don't apply the changes if the currently selected scheme is different,
* to allow a new scheme to be configured and saved but not applied</li>
* </ul>
+ * If the scheme is saved to file, the 'changed' flag field is reset to false.
*/
@Override
protected void savebutton_actionPerformed()
String name = schemeName.getText().trim();
if (name.length() < 1)
{
- JvOptionPane.showInternalMessageDialog(Desktop.desktop, MessageManager
- .getString("label.user_colour_scheme_must_have_name"),
+ JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+ MessageManager
+ .getString("label.user_colour_scheme_must_have_name"),
MessageManager.getString("label.no_name_colour_scheme"),
JvOptionPane.WARNING_MESSAGE);
- return;
}
- if (ColourSchemes.getInstance().nameExists(name))
+ if (!Platform.isJS() && ColourSchemes.getInstance().nameExists(name))
{
- int reply = JvOptionPane.showInternalConfirmDialog(Desktop.desktop,
- MessageManager.formatMessage(
- "label.colour_scheme_exists_overwrite", new Object[] {
- name, name }),
- MessageManager.getString("label.duplicate_scheme_name"),
- JvOptionPane.YES_NO_OPTION);
- if (reply != JvOptionPane.YES_OPTION)
+ /**
+ * java only
+ *
+ * @j2sIgnore
+ */
{
- return;
+ int reply = JvOptionPane.showInternalConfirmDialog(Desktop.desktop,
+ MessageManager.formatMessage(
+ "label.colour_scheme_exists_overwrite", new Object[]
+ { name, name }),
+ MessageManager.getString("label.duplicate_scheme_name"),
+ JvOptionPane.YES_NO_OPTION);
+ if (reply != JvOptionPane.YES_OPTION)
+ {
+ return;
+ }
}
}
+
JalviewFileChooser chooser = new JalviewFileChooser("jc",
"Jalview User Colours");
JalviewFileView fileView = new JalviewFileView();
chooser.setFileView(fileView);
- chooser.setDialogTitle(MessageManager
- .getString("label.save_colour_scheme"));
+ chooser.setDialogTitle(
+ MessageManager.getString("label.save_colour_scheme"));
chooser.setToolTipText(MessageManager.getString("action.save"));
-
- int value = chooser.showSaveDialog(this);
-
- if (value == JalviewFileChooser.APPROVE_OPTION)
+ int option = chooser.showSaveDialog(this);
+ if (option == JalviewFileChooser.APPROVE_OPTION)
{
File file = chooser.getSelectedFile();
- addNewColourScheme(file.getPath());
+ UserColourScheme updatedScheme = addNewColourScheme(file.getPath());
saveToFile(file);
+ changedButNotSaved = false;
/*
* changes saved - apply to alignment if we are changing
- * the currently selected colour scheme
+ * the currently selected colour scheme; also make the updated
+ * colours the 'backout' scheme on Cancel
*/
if (oldColourScheme != null
&& name.equals(oldColourScheme.getSchemeName()))
{
+ oldColourScheme = updatedScheme;
applyButton_actionPerformed();
}
}
* the colour scheme.
*
* @param filePath
+ * @return
*/
- protected void addNewColourScheme(String filePath)
+ protected UserColourScheme addNewColourScheme(String filePath)
{
/*
* update the delimited list of user defined colour files in
* Jalview property USER_DEFINED_COLOURS
*/
- String defaultColours = Cache
- .getDefault(USER_DEFINED_COLOURS, filePath);
+ String defaultColours = Cache.getDefault(USER_DEFINED_COLOURS,
+ filePath);
if (defaultColours.indexOf(filePath) == -1)
{
if (defaultColours.length() > 0)
{
ap.alignFrame.buildColourMenu();
}
+
+ return ucs;
}
/**
Colour col = new Colour();
col.setName(button.getText());
col.setRGB(Format.getHexString(button.getBackground()));
- ucs.addColour(col);
+ ucs.getColour().add(col);
}
- ucs.marshal(out);
+ JAXBContext jaxbContext = JAXBContext
+ .newInstance(JalviewUserColours.class);
+ Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
+ jaxbMarshaller.marshal(
+ new ObjectFactory().createJalviewUserColours(ucs), out);
+ // ucs.marshal(out);
out.close();
} catch (Exception ex)
{
protected void cancelButton_actionPerformed()
{
ap.alignFrame.changeColour(oldColourScheme);
- ap.paintAlignment(true);
+ ap.paintAlignment(true, true);
try
{