Merge branch 'Release_2_8_1_Branch_i18n' into try_r20b1_merge
authorJim Procter <jprocter@compbio.dundee.ac.uk>
Mon, 3 Feb 2014 17:46:31 +0000 (17:46 +0000)
committerJim Procter <jprocter@compbio.dundee.ac.uk>
Mon, 3 Feb 2014 17:48:32 +0000 (17:48 +0000)
Conflicts:
src/jalview/gui/AlignFrame.java
src/jalview/gui/AppJmol.java
src/jalview/gui/PopupMenu.java
src/jalview/gui/UserDefinedColours.java
JAL-1354 merge in with some exceptions for non i18n bare strings and fix compilation errors from missing import of MessageManager

67 files changed:
1  2 
resources/lang/Messages.properties
src/MCview/PDBViewer.java
src/jalview/appletgui/APopupMenu.java
src/jalview/appletgui/AnnotationColourChooser.java
src/jalview/appletgui/CutAndPasteTransfer.java
src/jalview/appletgui/FeatureColourChooser.java
src/jalview/appletgui/FontChooser.java
src/jalview/gui/AlignFrame.java
src/jalview/gui/AnnotationColourChooser.java
src/jalview/gui/AnnotationExporter.java
src/jalview/gui/AnnotationLabels.java
src/jalview/gui/AnnotationPanel.java
src/jalview/gui/AppJmol.java
src/jalview/gui/AppVarna.java
src/jalview/gui/CutAndPasteHtmlTransfer.java
src/jalview/gui/CutAndPasteTransfer.java
src/jalview/gui/Desktop.java
src/jalview/gui/FeatureColourChooser.java
src/jalview/gui/FeatureRenderer.java
src/jalview/gui/FeatureSettings.java
src/jalview/gui/FontChooser.java
src/jalview/gui/JvSwingUtils.java
src/jalview/gui/OptsAndParamsPage.java
src/jalview/gui/PCAPanel.java
src/jalview/gui/PairwiseAlignPanel.java
src/jalview/gui/PopupMenu.java
src/jalview/gui/Preferences.java
src/jalview/gui/RedundancyPanel.java
src/jalview/gui/RestServiceEditorPane.java
src/jalview/gui/ScalePanel.java
src/jalview/gui/SequenceFetcher.java
src/jalview/gui/SliderPanel.java
src/jalview/gui/TextColourChooser.java
src/jalview/gui/TreeCanvas.java
src/jalview/gui/TreePanel.java
src/jalview/gui/UserDefinedColours.java
src/jalview/gui/ViewSelectionMenu.java
src/jalview/gui/WsJobParameters.java
src/jalview/gui/WsParamSetManager.java
src/jalview/io/FileLoader.java
src/jalview/io/HTMLOutput.java
src/jalview/io/JalviewFileChooser.java
src/jalview/io/WSWUBlastClient.java
src/jalview/jbgui/GAlignFrame.java
src/jalview/jbgui/GCutAndPasteHtmlTransfer.java
src/jalview/jbgui/GCutAndPasteTransfer.java
src/jalview/jbgui/GDasSourceBrowser.java
src/jalview/jbgui/GDesktop.java
src/jalview/jbgui/GFinder.java
src/jalview/jbgui/GFontChooser.java
src/jalview/jbgui/GPCAPanel.java
src/jalview/jbgui/GPairwiseAlignPanel.java
src/jalview/jbgui/GPreferences.java
src/jalview/jbgui/GRestInputParamEditDialog.java
src/jalview/jbgui/GRestServiceEditorPane.java
src/jalview/jbgui/GSequenceLink.java
src/jalview/jbgui/GSliderPanel.java
src/jalview/jbgui/GStructureViewer.java
src/jalview/jbgui/GTreePanel.java
src/jalview/jbgui/GUserDefinedColours.java
src/jalview/jbgui/GWebserviceInfo.java
src/jalview/jbgui/GWsPreferences.java
src/jalview/util/ImageMaker.java
src/jalview/ws/DBRefFetcher.java
src/jalview/ws/jws2/Jws2Client.java
src/jalview/ws/jws2/MsaWSClient.java
src/jalview/ws/jws2/SequenceAnnotationWSClient.java

@@@ -383,7 -457,266 +457,266 @@@ label.edit_sequences = Edit Sequence
  label.sequence_details = Sequence Details\r
  label.jmol_help = Jmol Help\r
  label.all = All\r
+ label.sort_by = Sort by\r
  label.sort_by_score = Sort by Score\r
  label.sort_by_density = Sort by Density\r
+ label.sequence_sort_by_density = Sequence sort by Density\r
  label.reveal = Reveal\r
  label.hide_columns = Hide Columns\r
+ label.load_jalview_annotations = Load Jalview Annotations or Features File\r
+ label.load_tree_file = Load a tree file\r
+ label.retrieve_parse_sequence_database_records_alignment_or_selected_sequences = Retrieve and parse sequence database records for the alignment or the currently selected sequences\r
+ label.standard_databases = Standard Databases\r
+ label.fetch_embl_uniprot = Fetch from EMBL/EMBLCDS or Uniprot/PDB and any selected DAS sources\r
+ label.reset_min_max_colours_to_defaults = Reset min and max colours to defaults from user preferences.\r
+ label.align_structures_using_linked_alignment_views = Align structures using {0} linked alignment views\r
+ label.connect_to_session = Connect to session {0}\r
+ label.threshold_feature_display_by_score = Threshold the feature display by score.\r
+ label.threshold_feature_no_thereshold = No Threshold\r
+ label.threshold_feature_above_thereshold = Above Threshold\r
+ label.threshold_feature_below_thereshold = Below Threshold\r
+ label.adjust_thereshold = Adjust threshold\r
+ label.toggle_absolute_relative_display_threshold = Toggle between absolute and relative display threshold.\r
+ label.display_features_same_type_different_label_using_different_colour = Display features of the same type with a different label using a different colour. (e.g. domain features)\r
+ label.select_colour_minimum_value = Select Colour for Minimum Value\r
+ label.select_colour_maximum_value = Select Colour for Maximum Value\r
+ label.open_new_jmol_view_with_all_structures_associated_current_selection_superimpose_using_alignment = Open a new Jmol view with all structures associated with the current selection and superimpose them using the alignment.\r
+ label.open_url_param = Open URL {0}\r
+ label.open_url_seqs_param = Open URL ({0}..) ({1} seqs)\r
+ label.load_pdb_file_associate_with_sequence = Load a PDB file and associate it with sequence '{0}'\r
+ label.reveal_hidden_columns = Reveal Hidden Columns with Right Mouse Button\r
+ label.dark_colour = Dark Colour\r
+ label.light_colour = Light Colour\r
+ label.highlightnode = Left click to select leaves.<br>Double-click to invert leaves.<br>Right click to change colour.\r
+ label.load_colour_scheme = Load colour scheme\r
+ label.toggle_enabled_views = When enabled, allows many views to be selected.\r
+ label.edit_notes_parameter_set = Click to edit the notes for this parameter set.\r
+ label.open_local_file = Open local file\r
+ label.enable_automatically_sort_alignment_when_open_new_tree = Enable this to automatically sort<br>the alignment when you open<br> a new tree.\r
+ label.listen_for_selections = Listen for selections\r
+ label.selections_mirror_selections_made_same_sequences_other_views = When selected, selections in this view will mirror<br>selections made on the same sequences in other views.\r
+ label.toggle_sequence_visibility = Shift+H toggles sequence visiblity\r
+ label.toggle_columns_visibility = Ctrl+H toggles column visiblity.\r
+ label.toggles_visibility_hidden_selected_regions = H toggles visibility of hidden or selected regions\r
+ label.rename_tab_eXpand_reGroup=  Right-click to rename tab <br> Press X to eXpand tabs, G to reGroup.\r
+ label.right_align_sequence_id = Right Align Sequence Id\r
+ label.sequence_id_tooltip = Sequence ID Tooltip\r
+ label.no_services = <No Services>\r
+ label.select_copy_raw_html = Select this if you want to copy raw html\r
+ label.share_data_vamsas_applications = Share data with other vamsas applications\r
+ label.connect_to = Connect to\r
+ label.join_existing_vamsas_session = Join an existing vamsas session\r
+ label.from_url = from URL\r
+ label.any_trees_calculated_or_loaded_alignment_automatically_sort = When selected, any trees calculated or loaded onto the alignment will automatically sort the alignment\r
+ label.sort_with_new_tree = Sort With New Tree\r
+ label.from_textbox = from Textbox\r
+ label.window = Window\r
+ label.preferences = Preferences\r
+ label.tools = Tools\r
+ label.fetch_sequences = Fetch Sequence(s)\r
+ label.stop_vamsas_session = Stop Vamsas Session\r
+ label.collect_garbage = Collect Garbage\r
+ label.show_memory_usage = Show Memory Usage\r
+ label.show_java_console = Show Java Console\r
+ label.show_jalview_news = Show Jalview News\r
+ label.monospaced_fonts_faster_to_render = Monospaced fonts are faster to render\r
+ label.anti_alias_fonts = Anti-alias Fonts (Slower to render)\r
+ label.monospaced_font= Monospaced\r
+ label.quality = Quality\r
+ label.maximize_window = Maximize Window\r
+ label.conservation = Conservation\r
+ label.consensus = Consensus\r
+ label.histogram = Histogram\r
+ label.logo = Logo\r
+ label.non_positional_features = Non-positional Features\r
+ label.database_references = Database References\r
+ label.share_selection_across_views = Share selection across views\r
+ label.scroll_highlighted_regions = Scroll to highlighted regions\r
+ label.gap_symbol = Gap Symbol\r
+ label.alignment_colour = Alignment Colour\r
+ label.address = Address\r
+ label.port = Port\r
+ label.default_browser_unix = Default Browser (Unix)\r
+ label.send_usage_statistics = Send usage statistics\r
+ label.check_for_questionnaires = Check for questionnaires\r
+ label.check_for_latest_version = Check for latest version\r
+ label.url_linkfrom_sequence_id = URL link from Sequence ID\r
+ label.use_proxy_server = Use a proxy server\r
+ label.eps_rendering_style = EPS rendering style\r
+ label.append_start_end = Append /start-end (/15-380)\r
+ label.full_sequence_id = Full Sequence Id\r
+ label.smooth_font = Smooth Font\r
+ label.autocalculate_consensus = AutoCalculate Consensus\r
+ label.pad_gaps = Pad Gaps\r
+ label.pad_gaps_when_editing = Pad Gaps When Editing\r
+ label.automatically_set_id_width = Automatically set ID width\r
+ label.figure_id_column_width = Figure ID column width\r
+ label.use_modeller_output = Use Modeller Output\r
+ label.wrap_alignment = Wrap Alignment\r
+ label.right_align_ids = Right Align Ids\r
+ label.sequence_name_italics = Sequence Name Italics\r
+ label.open_overview = Open Overview\r
+ label.default_colour_scheme_for_alignment = Default Colour Scheme for alignment\r
+ label.annotation_shading_default = Annotation Shading Default\r
+ label.default_minimum_colour_annotation_shading = Default Minimum Colour for annotation shading\r
+ label.default_maximum_colour_annotation_shading = Default Maximum Colour for annotation shading\r
+ label.visual = Visual\r
+ label.connections = Connections\r
+ label.output = Output\r
+ label.editing = Editing\r
+ label.das_settings = DAS Settings\r
+ label.web_services = Web Services\r
+ label.right_click_to_edit_currently_selected_parameter = Right click to edit currently selected parameter.\r
+ label.let_jmol_manage_structure_colours = Let Jmol manage structure colours\r
+ label.marks_leaves_tree_not_associated_with_sequence = Marks leaves of tree not associated with a sequence\r
+ label.index_web_services_menu_by_host_site = Index web services in menu by the host site\r
+ label.option_want_informed_web_service_URL_cannot_be_accessed_jalview_when_starts_up = Check this option if you want to be informed<br>when a web service URL cannot be accessed by Jalview<br>when it starts up\r
+ label.new_service_url = New Service URL\r
+ label.edit_service_url = Edit Service URL\r
+ label.delete_service_url = Delete Service URL\r
+ label.details = Details\r
+ label.options = Options\r
+ label.parameters = Parameters\r
+ label.available_das_sources = Available DAS Sources\r
+ label.full_details = Full Details\r
+ label.authority = Authority\r
+ label.type = Type\r
+ label.proxy_server = Proxy Server\r
+ label.file_output = File Output\r
+ label.select_input_type = Select input type\r
+ label.set_options_for_type = Set options for type\r
+ label.data_input_parameters = Data input parameters\r
+ label.data_returned_by_service = Data returned by service\r
+ label.rsbs_encoded_service = RSBS Encoded Service\r
+ label.parsing_errors = Parsing errors\r
+ label.simple_bioinformatics_rest_services = Simple Bioinformatics Rest Services\r
+ label.web_service_discovery_urls = Web Service Discovery URLS\r
+ label.input_parameter_name = Input Parameter name\r
+ label.short_descriptive_name_for_service = Short descriptive name for service\r
+ label.function_service_performs = What kind of function the service performs (e.g. alignment, analysis, search, etc).\r
+ label.brief_description_service = Brief description of service\r
+ label.url_post_data_service = URL to post data to service. Include any special parameters needed here\r
+ label.optional_suffix = Optional suffix added to URL when retrieving results from service\r
+ label.preferred_gap_character = Which gap character does this service prefer?\r
+ label.gap_character = Gap character\r
+ label.move_return_type_up_order= Move return type up order\r
+ label.move_return_type_down_order= Move return type down order\r
+ label.update_user_parameter_set = Update this existing user parameter set\r
+ label.delete_user_parameter_set = Delete the currently selected user parameter set\r
+ label.create_user_parameter_set = Create a new parameter set with the current settings.\r
+ label.revert_changes_user_parameter_set = Undo all changes to the current parameter set\r
+ label.start_job_current_settings = Start Job with current settings\r
+ label.cancel_job_close_dialog = Close this dialog and cancel job\r
+ label.input_output = Input/Output\r
+ label.cut_paste = Cut'n'Paste\r
+ label.adjusting_parameters_for_calculation = Adjusting parameters for existing Calculation\r
+ label.2d_rna_structure_line = 2D RNA {0}\r
+ label.2d_rna_sequence_name = 2D RNA - {0}\r
+ label.edit_name_and_description_current_group = Edit name and description of current group.\r
+ label.view_structure_for = View structure for {0}\r
+ label.view_all_structures = View all {0} structures.\r
+ label.associate_structure_with_sequence = Associate Structure with Sequence\r
+ label.from_file = from file\r
+ label.enter_pdb_id = Enter PDB Id\r
+ label.discover_pdb_ids = Discover PDB ids\r
+ label.text_colour = Text Colour\r
+ label.structure = Structure\r
+ label.view_structure = View Structure\r
+ label.clustalx_colours = Clustalx colours\r
+ label.above_identity_percentage = Above % Identity\r
+ label.create_sequence_details_report_annotation_for = Annotation for {0}\r
+ label.sequece_details_for = Sequece Details for {0}\r
+ label.sequence_name = Sequence Name\r
+ label.sequence_description = Sequence Description\r
+ label.edit_sequence_name_description = Edit Sequence Name/Description\r
+ label.spaces_converted_to_backslashes = Spaces have been converted to _\r
+ label.no_spaces_allowed_sequence_name = No spaces allowed in Sequence Name\r
+ label.select_outline_colour = Select Outline Colour\r
+ label.web_browser_not_found_unix = Unixers\: Couldn't find default web browser.\nAdd the full path to your browser in Preferences."\r
+ label.web_browser_not_found = Web browser not found\r
+ label.select_pdb_file_for = Select a PDB file for {0}\r
+ label.html = HTML\r
+ label.wrap = Wrap\r
+ label.show_database_refs = Show Database Refs\r
+ label.show_non_positional_features = Show Non-Positional Features\r
+ label.save_png_image = Save As PNG Image\r
+ label.load_tree_for_sequence_set = Load a tree for this sequence set\r
+ label.export_image = Export Image\r
+ label.vamsas_store = VAMSAS store\r
+ label.translate_cDNA = Translate cDNA\r
+ label.extract_scores = Extract Scores\r
+ label.get_cross_refs = Get Cross References\r
+ label.sort_alignment_new_tree = Sort Alignment With New Tree\r
+ label.add_sequences = Add Sequences\r
+ label.new_window = New Window\r
+ label.refresh_available_sources = Refresh Available Sources\r
+ label.use_registry = Use Registry\r
+ label.add_local_source = Add Local Source\r
+ label.set_as_default = Set as Default\r
+ label.show_labels = Show labels\r
+ label.background_colour = Background Colour\r
+ label.associate_nodes_with = Associate Nodes With\r
+ label.jalview_pca_calculation = Jalview PCA Calculation\r
+ label.link_name = Link Name\r
+ label.pdb_file = PDB file\r
+ label.colour_with_jmol = Colour with Jmol\r
+ label.align_structures = Align structures\r
+ label.jmol = Jmol\r
+ label.sort_alignment_by_tree = Sort Alignment By Tree\r
+ label.mark_unlinked_leaves = Mark Unlinked Leaves\r
+ label.associate_leaves_with = Associate Leaves With\r
+ label.save_colour_scheme_with_unique_name_added_to_colour_menu = Save your colour scheme with a unique name and it will be added to the Colour menu\r
+ label.case_sensitive = Case Sensitive\r
+ label.lower_case_colour = Lower Case Colour\r
+ label.index_by_host = Index by host\r
+ label.index_by_type = Index by type\r
+ label.enable_enfin_services = Enable Enfin Services\r
+ label.enable_jabaws_services = Enable JABAWS Services\r
+ label.display_warnings = Display warnings\r
+ label.move_url_up = Move URL up\r
+ label.move_url_down = Move URL down\r
+ label.add_sbrs_definition = Add a SBRS definition\r
+ label.edit_sbrs_definition = Edit SBRS definition\r
+ label.delete_sbrs_definition = Delete SBRS definition\r
+ label.your_sequences_have_been_verified = Your sequences have been verified against known sequence databases. Some of the ids have been\n altered, most likely the start/end residue will have been updated.\n Save your alignment to maintain the updated id.\n\n\r
+ label.sequence_names_updated = Sequence names updated\r
+ label.dbref_search_completed = DBRef search completed\r
+ label.show_all_chains = Show all chains\r
+ label.fetch_all_param = Fetch all '{0}'\r
+ label.paste_new_window = Paste To New Window\r
+ label.settings_for_param = Settings for {0}\r
+ label.view_params = View {0}\r
+ label.select_all_views = Select all views\r
+ label.align_sequences_to_existing_alignment = Align sequences to an existing alignment\r
+ label.realign_with_params = Realign with {0}\r
+ label.calcname_with_default_settings = {0} with Defaults\r
+ label.action_with_default_settings = {0} with default settings\r
+ label.edit_settings_and_run = Edit settings and run...\r
+ label.view_and_change_parameters_before_alignment = View and change the parameters before alignment\r
+ label.run_with_preset_params = Run {0} with preset\r
+ label.view_and_change_parameters_before_running_calculation = View and change parameters before running calculation\r
+ label.view_documentation = View documentation\r
+ label.select_return_type = Select return type\r
+ label.translation_of_params = Translation of {0}\r
+ label.features_for_params = Features for - {0}\r
+ label.annotations_for_params = Annotations for - {0}\r
+ label.generating_features_for_params = Generating features for - {0}\r
+ label.generating_annotations_for_params = Generating annotations for - {0}\r
+ label.varna_params = VARNA - {0}\r
+ label.sequence_feature_settings = Sequence Feature Settings\r
+ label.pairwise_aligned_sequences = Pairwise Aligned Sequences\r
+ label.original_data_for_params = Original Data for {0}\r
+ label.points_for_params = Points for {0}\r
+ label.transformed_points_for_params = Transformed points for {0}\r
+ label.graduated_color_for_params = Graduated Feature Colour for {0}\r
+ label.select_backgroud_colour = Select Background Colour\r
+ label.invalid_font = Invalid Font\r
+ label.separate_multiple_accession_ids = Separate multiple accession ids with semi colon ";"\r
+ label.replace_commas_semicolons = Replace commas with semi-colons\r
+ label.parsing_failed_syntax_errors_shown_below_param = Parsing failed. Syntax errors shown below {0}\r
+ label.parsing_failed_unrecoverable_exception_thrown_param = \nParsing failed. An unrecoverable exception was thrown:\n {0}\r
+ label.example_query_param = Example query: {0}\r
+ label.enter_value_increase_conservation_visibility = Enter value to increase conservation visibility\r
+ label.enter_percentage_identity_above_which_colour_residues = Enter % identity above which to colour residues\r
+ label.wswublast_client_credits = To display sequence features an exact Uniprot id with 100% sequence identity match must be entered.\nIn order to display these features, try changing the names of your sequences to the ids suggested below.\n\nRunning WSWUBlast at EBI.\nPlease quote Pillai S., Silventoinen V., Kallio K., Senger M., Sobhany S., Tate J., Velankar S., Golovin A., Henrick K., Rice P., Stoehr P., Lopez R.\nSOAP-based services provided by the European Bioinformatics Institute.\nNucleic Acids Res. 33(1):W25-W28 (2005));\r
 -label.blasting_for_unidentified_sequence = BLASTing for unidentified sequences
++label.blasting_for_unidentified_sequence = BLASTing for unidentified sequences
Simple merge
Simple merge
 -/*\r
 - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8)\r
 - * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle\r
 - * \r
 - * This file is part of Jalview.\r
 - * \r
 - * Jalview is free software: you can redistribute it and/or\r
 - * modify it under the terms of the GNU General Public License \r
 - * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\r
 - *  \r
 - * Jalview is distributed in the hope that it will be useful, but \r
 - * WITHOUT ANY WARRANTY; without even the implied warranty \r
 - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR \r
 - * PURPOSE.  See the GNU General Public License for more details.\r
 - * \r
 - * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.\r
 - */\r
 -package jalview.gui;\r
 -\r
 -import jalview.analysis.AAFrequency;\r
 -import jalview.analysis.AlignmentSorter;\r
 -import jalview.analysis.Conservation;\r
 -import jalview.analysis.CrossRef;\r
 -import jalview.analysis.NJTree;\r
 -import jalview.analysis.ParseProperties;\r
 -import jalview.analysis.SequenceIdMatcher;\r
 -import jalview.api.AlignViewControllerI;\r
 -import jalview.bin.Cache;\r
 -import jalview.commands.CommandI;\r
 -import jalview.commands.EditCommand;\r
 -import jalview.commands.OrderCommand;\r
 -import jalview.commands.RemoveGapColCommand;\r
 -import jalview.commands.RemoveGapsCommand;\r
 -import jalview.commands.SlideSequencesCommand;\r
 -import jalview.commands.TrimRegionCommand;\r
 -import jalview.datamodel.AlignedCodonFrame;\r
 -import jalview.datamodel.Alignment;\r
 -import jalview.datamodel.AlignmentAnnotation;\r
 -import jalview.datamodel.AlignmentI;\r
 -import jalview.datamodel.AlignmentOrder;\r
 -import jalview.datamodel.AlignmentView;\r
 -import jalview.datamodel.ColumnSelection;\r
 -import jalview.datamodel.PDBEntry;\r
 -import jalview.datamodel.SeqCigar;\r
 -import jalview.datamodel.Sequence;\r
 -import jalview.datamodel.SequenceGroup;\r
 -import jalview.datamodel.SequenceI;\r
 -import jalview.io.AlignmentProperties;\r
 -import jalview.io.AnnotationFile;\r
 -import jalview.io.FeaturesFile;\r
 -import jalview.io.FileLoader;\r
 -import jalview.io.FormatAdapter;\r
 -import jalview.io.HTMLOutput;\r
 -import jalview.io.IdentifyFile;\r
 -import jalview.io.JalviewFileChooser;\r
 -import jalview.io.JalviewFileView;\r
 -import jalview.io.JnetAnnotationMaker;\r
 -import jalview.io.NewickFile;\r
 -import jalview.io.TCoffeeScoreFile;\r
 -import jalview.jbgui.GAlignFrame;\r
 -import jalview.schemes.Blosum62ColourScheme;\r
 -import jalview.schemes.BuriedColourScheme;\r
 -import jalview.schemes.ClustalxColourScheme;\r
 -import jalview.schemes.ColourSchemeI;\r
 -import jalview.schemes.ColourSchemeProperty;\r
 -import jalview.schemes.HelixColourScheme;\r
 -import jalview.schemes.HydrophobicColourScheme;\r
 -import jalview.schemes.NucleotideColourScheme;\r
 -import jalview.schemes.PIDColourScheme;\r
 -import jalview.schemes.PurinePyrimidineColourScheme;\r
 -import jalview.schemes.RNAHelicesColourChooser;\r
 -import jalview.schemes.ResidueProperties;\r
 -import jalview.schemes.StrandColourScheme;\r
 -import jalview.schemes.TCoffeeColourScheme;\r
 -import jalview.schemes.TaylorColourScheme;\r
 -import jalview.schemes.TurnColourScheme;\r
 -import jalview.schemes.UserColourScheme;\r
 -import jalview.schemes.ZappoColourScheme;\r
 -import jalview.util.MessageManager;\r
 -import jalview.ws.jws1.Discoverer;\r
 -import jalview.ws.jws2.Jws2Discoverer;\r
 -import jalview.ws.jws2.jabaws2.Jws2Instance;\r
 -import jalview.ws.seqfetcher.DbSourceProxy;\r
 -\r
 -import java.awt.BorderLayout;\r
 -import java.awt.Color;\r
 -import java.awt.Component;\r
 -import java.awt.GridLayout;\r
 -import java.awt.Rectangle;\r
 -import java.awt.Toolkit;\r
 -import java.awt.datatransfer.Clipboard;\r
 -import java.awt.datatransfer.DataFlavor;\r
 -import java.awt.datatransfer.StringSelection;\r
 -import java.awt.datatransfer.Transferable;\r
 -import java.awt.dnd.DnDConstants;\r
 -import java.awt.dnd.DropTargetDragEvent;\r
 -import java.awt.dnd.DropTargetDropEvent;\r
 -import java.awt.dnd.DropTargetEvent;\r
 -import java.awt.dnd.DropTargetListener;\r
 -import java.awt.event.ActionEvent;\r
 -import java.awt.event.ActionListener;\r
 -import java.awt.event.KeyAdapter;\r
 -import java.awt.event.KeyEvent;\r
 -import java.awt.event.MouseAdapter;\r
 -import java.awt.event.MouseEvent;\r
 -import java.awt.print.PageFormat;\r
 -import java.awt.print.PrinterJob;\r
 -import java.beans.PropertyChangeEvent;\r
 -import java.io.File;\r
 -import java.net.URL;\r
 -import java.util.ArrayList;\r
 -import java.util.Enumeration;\r
 -import java.util.Hashtable;\r
 -import java.util.List;\r
 -import java.util.Vector;\r
 -\r
 -import javax.swing.JButton;\r
 -import javax.swing.JEditorPane;\r
 -import javax.swing.JInternalFrame;\r
 -import javax.swing.JLabel;\r
 -import javax.swing.JLayeredPane;\r
 -import javax.swing.JMenu;\r
 -import javax.swing.JMenuItem;\r
 -import javax.swing.JOptionPane;\r
 -import javax.swing.JPanel;\r
 -import javax.swing.JProgressBar;\r
 -import javax.swing.JRadioButtonMenuItem;\r
 -import javax.swing.JScrollPane;\r
 -import javax.swing.SwingUtilities;\r
 -\r
 -/**\r
 - * DOCUMENT ME!\r
 - * \r
 - * @author $author$\r
 - * @version $Revision$\r
 - */\r
 -public class AlignFrame extends GAlignFrame implements DropTargetListener,\r
 -        IProgressIndicator\r
 -{\r
 -\r
 -  /** DOCUMENT ME!! */\r
 -  public static final int DEFAULT_WIDTH = 700;\r
 -\r
 -  /** DOCUMENT ME!! */\r
 -  public static final int DEFAULT_HEIGHT = 500;\r
 -\r
 -  public AlignmentPanel alignPanel;\r
 -\r
 -  AlignViewport viewport;\r
 - \r
 -  public AlignViewControllerI avc;\r
 - \r
 -\r
 -  Vector alignPanels = new Vector();\r
 -\r
 -  /**\r
 -   * Last format used to load or save alignments in this window\r
 -   */\r
 -  String currentFileFormat = null;\r
 -\r
 -  /**\r
 -   * Current filename for this alignment\r
 -   */\r
 -  String fileName = null;\r
 -\r
 -  /**\r
 -   * Creates a new AlignFrame object with specific width and height.\r
 -   * \r
 -   * @param al\r
 -   * @param width\r
 -   * @param height\r
 -   */\r
 -  public AlignFrame(AlignmentI al, int width, int height)\r
 -  {\r
 -    this(al, null, width, height);\r
 -  }\r
 -\r
 -  /**\r
 -   * Creates a new AlignFrame object with specific width, height and\r
 -   * sequenceSetId\r
 -   * \r
 -   * @param al\r
 -   * @param width\r
 -   * @param height\r
 -   * @param sequenceSetId\r
 -   */\r
 -  public AlignFrame(AlignmentI al, int width, int height,\r
 -          String sequenceSetId)\r
 -  {\r
 -    this(al, null, width, height, sequenceSetId);\r
 -  }\r
 -\r
 -  /**\r
 -   * Creates a new AlignFrame object with specific width, height and\r
 -   * sequenceSetId\r
 -   * \r
 -   * @param al\r
 -   * @param width\r
 -   * @param height\r
 -   * @param sequenceSetId\r
 -   * @param viewId\r
 -   */\r
 -  public AlignFrame(AlignmentI al, int width, int height,\r
 -          String sequenceSetId, String viewId)\r
 -  {\r
 -    this(al, null, width, height, sequenceSetId, viewId);\r
 -  }\r
 -\r
 -  /**\r
 -   * new alignment window with hidden columns\r
 -   * \r
 -   * @param al\r
 -   *          AlignmentI\r
 -   * @param hiddenColumns\r
 -   *          ColumnSelection or null\r
 -   * @param width\r
 -   *          Width of alignment frame\r
 -   * @param height\r
 -   *          height of frame.\r
 -   */\r
 -  public AlignFrame(AlignmentI al, ColumnSelection hiddenColumns,\r
 -          int width, int height)\r
 -  {\r
 -    this(al, hiddenColumns, width, height, null);\r
 -  }\r
 -\r
 -  /**\r
 -   * Create alignment frame for al with hiddenColumns, a specific width and\r
 -   * height, and specific sequenceId\r
 -   * \r
 -   * @param al\r
 -   * @param hiddenColumns\r
 -   * @param width\r
 -   * @param height\r
 -   * @param sequenceSetId\r
 -   *          (may be null)\r
 -   */\r
 -  public AlignFrame(AlignmentI al, ColumnSelection hiddenColumns,\r
 -          int width, int height, String sequenceSetId)\r
 -  {\r
 -    this(al, hiddenColumns, width, height, sequenceSetId, null);\r
 -  }\r
 -\r
 -  /**\r
 -   * Create alignment frame for al with hiddenColumns, a specific width and\r
 -   * height, and specific sequenceId\r
 -   * \r
 -   * @param al\r
 -   * @param hiddenColumns\r
 -   * @param width\r
 -   * @param height\r
 -   * @param sequenceSetId\r
 -   *          (may be null)\r
 -   * @param viewId\r
 -   *          (may be null)\r
 -   */\r
 -  public AlignFrame(AlignmentI al, ColumnSelection hiddenColumns,\r
 -          int width, int height, String sequenceSetId, String viewId)\r
 -  {\r
 -    setSize(width, height);\r
 -    viewport = new AlignViewport(al, hiddenColumns, sequenceSetId, viewId);\r
 -\r
 -    alignPanel = new AlignmentPanel(this, viewport);\r
 -\r
 -    if (al.getDataset() == null)\r
 -    {\r
 -      al.setDataset(null);\r
 -    }\r
 -\r
 -    addAlignmentPanel(alignPanel, true);\r
 -    init();\r
 -  }\r
 -\r
 -  /**\r
 -   * Make a new AlignFrame from exisiting alignmentPanels\r
 -   * \r
 -   * @param ap\r
 -   *          AlignmentPanel\r
 -   * @param av\r
 -   *          AlignViewport\r
 -   */\r
 -  public AlignFrame(AlignmentPanel ap)\r
 -  {\r
 -    viewport = ap.av;\r
 -    alignPanel = ap;\r
 -    addAlignmentPanel(ap, false);\r
 -    init();\r
 -  }\r
 -\r
 -  /**\r
 -   * initalise the alignframe from the underlying viewport data and the\r
 -   * configurations\r
 -   */\r
 -  void init()\r
 -  {\r
 -    avc = new jalview.controller.AlignViewController(viewport, alignPanel);\r
 -    if (viewport.getAlignmentConservationAnnotation() == null)\r
 -    {\r
 -      BLOSUM62Colour.setEnabled(false);\r
 -      conservationMenuItem.setEnabled(false);\r
 -      modifyConservation.setEnabled(false);\r
 -      // PIDColour.setEnabled(false);\r
 -      // abovePIDThreshold.setEnabled(false);\r
 -      // modifyPID.setEnabled(false);\r
 -    }\r
 -\r
 -    String sortby = jalview.bin.Cache.getDefault("SORT_ALIGNMENT",\r
 -            "No sort");\r
 -\r
 -    if (sortby.equals("Id"))\r
 -    {\r
 -      sortIDMenuItem_actionPerformed(null);\r
 -    }\r
 -    else if (sortby.equals("Pairwise Identity"))\r
 -    {\r
 -      sortPairwiseMenuItem_actionPerformed(null);\r
 -    }\r
 -\r
 -    if (Desktop.desktop != null)\r
 -    {\r
 -      this.setDropTarget(new java.awt.dnd.DropTarget(this, this));\r
 -      addServiceListeners();\r
 -      setGUINucleotide(viewport.getAlignment().isNucleotide());\r
 -    }\r
 -\r
 -    setMenusFromViewport(viewport);\r
 -    buildSortByAnnotationScoresMenu();\r
 -    if (viewport.wrapAlignment)\r
 -    {\r
 -      wrapMenuItem_actionPerformed(null);\r
 -    }\r
 -\r
 -    if (jalview.bin.Cache.getDefault("SHOW_OVERVIEW", false))\r
 -    {\r
 -      this.overviewMenuItem_actionPerformed(null);\r
 -    }\r
 -\r
 -    addKeyListener();\r
 -    \r
 -  }\r
 -\r
 -  /**\r
 -   * Change the filename and format for the alignment, and enable the 'reload'\r
 -   * button functionality.\r
 -   * \r
 -   * @param file\r
 -   *          valid filename\r
 -   * @param format\r
 -   *          format of file\r
 -   */\r
 -  public void setFileName(String file, String format)\r
 -  {\r
 -    fileName = file;\r
 -    currentFileFormat = format;\r
 -    reload.setEnabled(true);\r
 -  }\r
 -\r
 -  void addKeyListener()\r
 -  {\r
 -    addKeyListener(new KeyAdapter()\r
 -    {\r
 -      @Override\r
 -      public void keyPressed(KeyEvent evt)\r
 -      {\r
 -        if (viewport.cursorMode\r
 -                && ((evt.getKeyCode() >= KeyEvent.VK_0 && evt.getKeyCode() <= KeyEvent.VK_9) || (evt\r
 -                        .getKeyCode() >= KeyEvent.VK_NUMPAD0 && evt\r
 -                        .getKeyCode() <= KeyEvent.VK_NUMPAD9))\r
 -                && Character.isDigit(evt.getKeyChar()))\r
 -          alignPanel.seqPanel.numberPressed(evt.getKeyChar());\r
 -\r
 -        switch (evt.getKeyCode())\r
 -        {\r
 -\r
 -        case 27: // escape key\r
 -          deselectAllSequenceMenuItem_actionPerformed(null);\r
 -\r
 -          break;\r
 -\r
 -        case KeyEvent.VK_DOWN:\r
 -          if (evt.isAltDown() || !viewport.cursorMode)\r
 -            moveSelectedSequences(false);\r
 -          if (viewport.cursorMode)\r
 -            alignPanel.seqPanel.moveCursor(0, 1);\r
 -          break;\r
 -\r
 -        case KeyEvent.VK_UP:\r
 -          if (evt.isAltDown() || !viewport.cursorMode)\r
 -            moveSelectedSequences(true);\r
 -          if (viewport.cursorMode)\r
 -            alignPanel.seqPanel.moveCursor(0, -1);\r
 -\r
 -          break;\r
 -\r
 -        case KeyEvent.VK_LEFT:\r
 -          if (evt.isAltDown() || !viewport.cursorMode)\r
 -            slideSequences(false, alignPanel.seqPanel.getKeyboardNo1());\r
 -          else\r
 -            alignPanel.seqPanel.moveCursor(-1, 0);\r
 -\r
 -          break;\r
 -\r
 -        case KeyEvent.VK_RIGHT:\r
 -          if (evt.isAltDown() || !viewport.cursorMode)\r
 -            slideSequences(true, alignPanel.seqPanel.getKeyboardNo1());\r
 -          else\r
 -            alignPanel.seqPanel.moveCursor(1, 0);\r
 -          break;\r
 -\r
 -        case KeyEvent.VK_SPACE:\r
 -          if (viewport.cursorMode)\r
 -          {\r
 -            alignPanel.seqPanel.insertGapAtCursor(evt.isControlDown()\r
 -                    || evt.isShiftDown() || evt.isAltDown());\r
 -          }\r
 -          break;\r
 -\r
 -        // case KeyEvent.VK_A:\r
 -        // if (viewport.cursorMode)\r
 -        // {\r
 -        // alignPanel.seqPanel.insertNucAtCursor(false,"A");\r
 -        // //System.out.println("A");\r
 -        // }\r
 -        // break;\r
 -        /*\r
 -         * case KeyEvent.VK_CLOSE_BRACKET: if (viewport.cursorMode) {\r
 -         * System.out.println("closing bracket"); } break;\r
 -         */\r
 -        case KeyEvent.VK_DELETE:\r
 -        case KeyEvent.VK_BACK_SPACE:\r
 -          if (!viewport.cursorMode)\r
 -          {\r
 -            cut_actionPerformed(null);\r
 -          }\r
 -          else\r
 -          {\r
 -            alignPanel.seqPanel.deleteGapAtCursor(evt.isControlDown()\r
 -                    || evt.isShiftDown() || evt.isAltDown());\r
 -          }\r
 -\r
 -          break;\r
 -\r
 -        case KeyEvent.VK_S:\r
 -          if (viewport.cursorMode)\r
 -          {\r
 -            alignPanel.seqPanel.setCursorRow();\r
 -          }\r
 -          break;\r
 -        case KeyEvent.VK_C:\r
 -          if (viewport.cursorMode && !evt.isControlDown())\r
 -          {\r
 -            alignPanel.seqPanel.setCursorColumn();\r
 -          }\r
 -          break;\r
 -        case KeyEvent.VK_P:\r
 -          if (viewport.cursorMode)\r
 -          {\r
 -            alignPanel.seqPanel.setCursorPosition();\r
 -          }\r
 -          break;\r
 -\r
 -        case KeyEvent.VK_ENTER:\r
 -        case KeyEvent.VK_COMMA:\r
 -          if (viewport.cursorMode)\r
 -          {\r
 -            alignPanel.seqPanel.setCursorRowAndColumn();\r
 -          }\r
 -          break;\r
 -\r
 -        case KeyEvent.VK_Q:\r
 -          if (viewport.cursorMode)\r
 -          {\r
 -            alignPanel.seqPanel.setSelectionAreaAtCursor(true);\r
 -          }\r
 -          break;\r
 -        case KeyEvent.VK_M:\r
 -          if (viewport.cursorMode)\r
 -          {\r
 -            alignPanel.seqPanel.setSelectionAreaAtCursor(false);\r
 -          }\r
 -          break;\r
 -\r
 -        case KeyEvent.VK_F2:\r
 -          viewport.cursorMode = !viewport.cursorMode;\r
 -          statusBar.setText(MessageManager.formatMessage("label.keyboard_editing_mode", new String[]{(viewport.cursorMode ? "on" : "off")}));\r
 -          if (viewport.cursorMode)\r
 -          {\r
 -            alignPanel.seqPanel.seqCanvas.cursorX = viewport.startRes;\r
 -            alignPanel.seqPanel.seqCanvas.cursorY = viewport.startSeq;\r
 -          }\r
 -          alignPanel.seqPanel.seqCanvas.repaint();\r
 -          break;\r
 -\r
 -        case KeyEvent.VK_F1:\r
 -          try\r
 -          {\r
 -            ClassLoader cl = jalview.gui.Desktop.class.getClassLoader();\r
 -            java.net.URL url = javax.help.HelpSet.findHelpSet(cl,\r
 -                    "help/help");\r
 -            javax.help.HelpSet hs = new javax.help.HelpSet(cl, url);\r
 -\r
 -            javax.help.HelpBroker hb = hs.createHelpBroker();\r
 -            hb.setCurrentID("home");\r
 -            hb.setDisplayed(true);\r
 -          } catch (Exception ex)\r
 -          {\r
 -            ex.printStackTrace();\r
 -          }\r
 -          break;\r
 -        case KeyEvent.VK_H:\r
 -        {\r
 -          boolean toggleSeqs = !evt.isControlDown();\r
 -          boolean toggleCols = !evt.isShiftDown();\r
 -          toggleHiddenRegions(toggleSeqs, toggleCols);\r
 -          break;\r
 -        }\r
 -        case KeyEvent.VK_PAGE_UP:\r
 -          if (viewport.wrapAlignment)\r
 -          {\r
 -            alignPanel.scrollUp(true);\r
 -          }\r
 -          else\r
 -          {\r
 -            alignPanel.setScrollValues(viewport.startRes, viewport.startSeq\r
 -                    - viewport.endSeq + viewport.startSeq);\r
 -          }\r
 -          break;\r
 -        case KeyEvent.VK_PAGE_DOWN:\r
 -          if (viewport.wrapAlignment)\r
 -          {\r
 -            alignPanel.scrollUp(false);\r
 -          }\r
 -          else\r
 -          {\r
 -            alignPanel.setScrollValues(viewport.startRes, viewport.startSeq\r
 -                    + viewport.endSeq - viewport.startSeq);\r
 -          }\r
 -          break;\r
 -        }\r
 -      }\r
 -\r
 -      @Override\r
 -      public void keyReleased(KeyEvent evt)\r
 -      {\r
 -        switch (evt.getKeyCode())\r
 -        {\r
 -        case KeyEvent.VK_LEFT:\r
 -          if (evt.isAltDown() || !viewport.cursorMode)\r
 -            viewport.firePropertyChange("alignment", null, viewport\r
 -                    .getAlignment().getSequences());\r
 -          break;\r
 -\r
 -        case KeyEvent.VK_RIGHT:\r
 -          if (evt.isAltDown() || !viewport.cursorMode)\r
 -            viewport.firePropertyChange("alignment", null, viewport\r
 -                    .getAlignment().getSequences());\r
 -          break;\r
 -        }\r
 -      }\r
 -    });\r
 -  }\r
 -\r
 -  public void addAlignmentPanel(final AlignmentPanel ap, boolean newPanel)\r
 -  {\r
 -    ap.alignFrame = this;\r
 -    avc = new jalview.controller.AlignViewController(viewport, alignPanel);\r
 -\r
 -    alignPanels.addElement(ap);\r
 -\r
 -    PaintRefresher.Register(ap, ap.av.getSequenceSetId());\r
 -\r
 -    int aSize = alignPanels.size();\r
 -\r
 -    tabbedPane.setVisible(aSize > 1 || ap.av.viewName != null);\r
 -\r
 -    if (aSize == 1 && ap.av.viewName == null)\r
 -    {\r
 -      this.getContentPane().add(ap, BorderLayout.CENTER);\r
 -    }\r
 -    else\r
 -    {\r
 -      if (aSize == 2)\r
 -      {\r
 -        setInitialTabVisible();\r
 -      }\r
 -\r
 -      expandViews.setEnabled(true);\r
 -      gatherViews.setEnabled(true);\r
 -      tabbedPane.addTab(ap.av.viewName, ap);\r
 -\r
 -      ap.setVisible(false);\r
 -    }\r
 -\r
 -    if (newPanel)\r
 -    {\r
 -      if (ap.av.isPadGaps())\r
 -      {\r
 -        ap.av.getAlignment().padGaps();\r
 -      }\r
 -      ap.av.updateConservation(ap);\r
 -      ap.av.updateConsensus(ap);\r
 -      ap.av.updateStrucConsensus(ap);\r
 -    }\r
 -  }\r
 -\r
 -  public void setInitialTabVisible()\r
 -  {\r
 -    expandViews.setEnabled(true);\r
 -    gatherViews.setEnabled(true);\r
 -    tabbedPane.setVisible(true);\r
 -    AlignmentPanel first = (AlignmentPanel) alignPanels.firstElement();\r
 -    tabbedPane.addTab(first.av.viewName, first);\r
 -    this.getContentPane().add(tabbedPane, BorderLayout.CENTER);\r
 -  }\r
 -\r
 -  public AlignViewport getViewport()\r
 -  {\r
 -    return viewport;\r
 -  }\r
 -\r
 -  /* Set up intrinsic listeners for dynamically generated GUI bits. */\r
 -  private void addServiceListeners()\r
 -  {\r
 -    final java.beans.PropertyChangeListener thisListener;\r
 -    Desktop.instance.addJalviewPropertyChangeListener("services",\r
 -            thisListener = new java.beans.PropertyChangeListener()\r
 -            {\r
 -              @Override\r
 -              public void propertyChange(PropertyChangeEvent evt)\r
 -              {\r
 -                // // System.out.println("Discoverer property change.");\r
 -                // if (evt.getPropertyName().equals("services"))\r
 -                {\r
 -                  SwingUtilities.invokeLater(new Runnable()\r
 -                  {\r
 -\r
 -                    @Override\r
 -                    public void run()\r
 -                    {\r
 -                      System.err\r
 -                              .println("Rebuild WS Menu for service change");\r
 -                      BuildWebServiceMenu();\r
 -                    }\r
 -\r
 -                  });\r
 -                }\r
 -              }\r
 -            });\r
 -    addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()\r
 -    {\r
 -      @Override\r
 -      public void internalFrameClosed(\r
 -              javax.swing.event.InternalFrameEvent evt)\r
 -      {\r
 -        System.out.println("deregistering discoverer listener");\r
 -        Desktop.instance.removeJalviewPropertyChangeListener("services",\r
 -                thisListener);\r
 -        closeMenuItem_actionPerformed(true);\r
 -      };\r
 -    });\r
 -    // Finally, build the menu once to get current service state\r
 -    new Thread(new Runnable()\r
 -    {\r
 -      @Override\r
 -      public void run()\r
 -      {\r
 -        BuildWebServiceMenu();\r
 -      }\r
 -    }).start();\r
 -  }\r
 -\r
 -  public void setGUINucleotide(boolean nucleotide)\r
 -  {\r
 -    showTranslation.setVisible(nucleotide);\r
 -    conservationMenuItem.setEnabled(!nucleotide);\r
 -    modifyConservation.setEnabled(!nucleotide);\r
 -    showGroupConservation.setEnabled(!nucleotide);\r
 -    rnahelicesColour.setEnabled(nucleotide);\r
 -    purinePyrimidineColour.setEnabled(nucleotide);\r
 -    // Remember AlignFrame always starts as protein\r
 -    // if (!nucleotide)\r
 -    // {\r
 -    // showTr\r
 -    // calculateMenu.remove(calculateMenu.getItemCount() - 2);\r
 -    // }\r
 -  }\r
 -\r
 -  /**\r
 -   * set up menus for the currently viewport. This may be called after any\r
 -   * operation that affects the data in the current view (selection changed,\r
 -   * etc) to update the menus to reflect the new state.\r
 -   */\r
 -  public void setMenusForViewport()\r
 -  {\r
 -    setMenusFromViewport(viewport);\r
 -  }\r
 -\r
 -  /**\r
 -   * Need to call this method when tabs are selected for multiple views, or when\r
 -   * loading from Jalview2XML.java\r
 -   * \r
 -   * @param av\r
 -   *          AlignViewport\r
 -   */\r
 -  void setMenusFromViewport(AlignViewport av)\r
 -  {\r
 -    padGapsMenuitem.setSelected(av.isPadGaps());\r
 -    colourTextMenuItem.setSelected(av.showColourText);\r
 -    abovePIDThreshold.setSelected(av.getAbovePIDThreshold());\r
 -    conservationMenuItem.setSelected(av.getConservationSelected());\r
 -    seqLimits.setSelected(av.getShowJVSuffix());\r
 -    idRightAlign.setSelected(av.rightAlignIds);\r
 -    centreColumnLabelsMenuItem.setState(av.centreColumnLabels);\r
 -    renderGapsMenuItem.setSelected(av.renderGaps);\r
 -    wrapMenuItem.setSelected(av.wrapAlignment);\r
 -    scaleAbove.setVisible(av.wrapAlignment);\r
 -    scaleLeft.setVisible(av.wrapAlignment);\r
 -    scaleRight.setVisible(av.wrapAlignment);\r
 -    annotationPanelMenuItem.setState(av.showAnnotation);\r
 -    viewBoxesMenuItem.setSelected(av.showBoxes);\r
 -    viewTextMenuItem.setSelected(av.showText);\r
 -    showNonconservedMenuItem.setSelected(av.getShowUnconserved());\r
 -    showGroupConsensus.setSelected(av.isShowGroupConsensus());\r
 -    showGroupConservation.setSelected(av.isShowGroupConservation());\r
 -    showConsensusHistogram.setSelected(av.isShowConsensusHistogram());\r
 -    showSequenceLogo.setSelected(av.isShowSequenceLogo());\r
 -    normaliseSequenceLogo.setSelected(av.isNormaliseSequenceLogo());\r
 -\r
 -    setColourSelected(ColourSchemeProperty.getColourName(av\r
 -            .getGlobalColourScheme()));\r
 -\r
 -    showSeqFeatures.setSelected(av.showSequenceFeatures);\r
 -    hiddenMarkers.setState(av.showHiddenMarkers);\r
 -    applyToAllGroups.setState(av.getColourAppliesToAllGroups());\r
 -    showNpFeatsMenuitem.setSelected(av.isShowNpFeats());\r
 -    showDbRefsMenuitem.setSelected(av.isShowDbRefs());\r
 -    autoCalculate.setSelected(av.autoCalculateConsensus);\r
 -    sortByTree.setSelected(av.sortByTree);\r
 -    listenToViewSelections.setSelected(av.followSelection);\r
 -    rnahelicesColour.setEnabled(av.getAlignment().hasRNAStructure());\r
 -    rnahelicesColour\r
 -            .setSelected(av.getGlobalColourScheme() instanceof jalview.schemes.RNAHelicesColour);\r
 -    setShowProductsEnabled();\r
 -    updateEditMenuBar();\r
 -  }\r
 -\r
 -  // methods for implementing IProgressIndicator\r
 -  // need to refactor to a reusable stub class\r
 -  Hashtable progressBars, progressBarHandlers;\r
 -\r
 -  /*\r
 -   * (non-Javadoc)\r
 -   * \r
 -   * @see jalview.gui.IProgressIndicator#setProgressBar(java.lang.String, long)\r
 -   */\r
 -  @Override\r
 -  public void setProgressBar(String message, long id)\r
 -  {\r
 -    if (progressBars == null)\r
 -    {\r
 -      progressBars = new Hashtable();\r
 -      progressBarHandlers = new Hashtable();\r
 -    }\r
 -\r
 -    JPanel progressPanel;\r
 -    Long lId = new Long(id);\r
 -    GridLayout layout = (GridLayout) statusPanel.getLayout();\r
 -    if (progressBars.get(lId) != null)\r
 -    {\r
 -      progressPanel = (JPanel) progressBars.get(new Long(id));\r
 -      statusPanel.remove(progressPanel);\r
 -      progressBars.remove(lId);\r
 -      progressPanel = null;\r
 -      if (message != null)\r
 -      {\r
 -        statusBar.setText(message);\r
 -      }\r
 -      if (progressBarHandlers.contains(lId))\r
 -      {\r
 -        progressBarHandlers.remove(lId);\r
 -      }\r
 -      layout.setRows(layout.getRows() - 1);\r
 -    }\r
 -    else\r
 -    {\r
 -      progressPanel = new JPanel(new BorderLayout(10, 5));\r
 -\r
 -      JProgressBar progressBar = new JProgressBar();\r
 -      progressBar.setIndeterminate(true);\r
 -\r
 -      progressPanel.add(new JLabel(message), BorderLayout.WEST);\r
 -      progressPanel.add(progressBar, BorderLayout.CENTER);\r
 -\r
 -      layout.setRows(layout.getRows() + 1);\r
 -      statusPanel.add(progressPanel);\r
 -\r
 -      progressBars.put(lId, progressPanel);\r
 -    }\r
 -    // update GUI\r
 -    // setMenusForViewport();\r
 -    validate();\r
 -  }\r
 -\r
 -  @Override\r
 -  public void registerHandler(final long id,\r
 -          final IProgressIndicatorHandler handler)\r
 -  {\r
 -    if (progressBarHandlers == null || !progressBars.contains(new Long(id)))\r
 -    {\r
 -      throw new Error(\r
 -              "call setProgressBar before registering the progress bar's handler.");\r
 -    }\r
 -    progressBarHandlers.put(new Long(id), handler);\r
 -    final JPanel progressPanel = (JPanel) progressBars.get(new Long(id));\r
 -    if (handler.canCancel())\r
 -    {\r
 -      JButton cancel = new JButton(MessageManager.getString("action.cancel"));\r
 -      final IProgressIndicator us = this;\r
 -      cancel.addActionListener(new ActionListener()\r
 -      {\r
 -\r
 -        @Override\r
 -        public void actionPerformed(ActionEvent e)\r
 -        {\r
 -          handler.cancelActivity(id);\r
 -          us.setProgressBar(\r
 -                  "Cancelled "\r
 -                          + ((JLabel) progressPanel.getComponent(0))\r
 -                                  .getText(), id);\r
 -        }\r
 -      });\r
 -      progressPanel.add(cancel, BorderLayout.EAST);\r
 -    }\r
 -  }\r
 -\r
 -  /**\r
 -   * \r
 -   * @return true if any progress bars are still active\r
 -   */\r
 -  @Override\r
 -  public boolean operationInProgress()\r
 -  {\r
 -    if (progressBars != null && progressBars.size() > 0)\r
 -    {\r
 -      return true;\r
 -    }\r
 -    return false;\r
 -  }\r
 -\r
 -  /*\r
 -   * Added so Castor Mapping file can obtain Jalview Version\r
 -   */\r
 -  public String getVersion()\r
 -  {\r
 -    return jalview.bin.Cache.getProperty("VERSION");\r
 -  }\r
 -\r
 -  public FeatureRenderer getFeatureRenderer()\r
 -  {\r
 -    return alignPanel.seqPanel.seqCanvas.getFeatureRenderer();\r
 -  }\r
 -\r
 -  @Override\r
 -  public void fetchSequence_actionPerformed(ActionEvent e)\r
 -  {\r
 -    new SequenceFetcher(this);\r
 -  }\r
 -\r
 -  @Override\r
 -  public void addFromFile_actionPerformed(ActionEvent e)\r
 -  {\r
 -    Desktop.instance.inputLocalFileMenuItem_actionPerformed(viewport);\r
 -  }\r
 -\r
 -  @Override\r
 -  public void reload_actionPerformed(ActionEvent e)\r
 -  {\r
 -    if (fileName != null)\r
 -    {\r
 -      // TODO: JAL-1108 - ensure all associated frames are closed regardless of\r
 -      // originating file's format\r
 -      // TODO: work out how to recover feature settings for correct view(s) when\r
 -      // file is reloaded.\r
 -      if (currentFileFormat.equals("Jalview"))\r
 -      {\r
 -        JInternalFrame[] frames = Desktop.desktop.getAllFrames();\r
 -        for (int i = 0; i < frames.length; i++)\r
 -        {\r
 -          if (frames[i] instanceof AlignFrame && frames[i] != this\r
 -                  && ((AlignFrame) frames[i]).fileName != null\r
 -                  && ((AlignFrame) frames[i]).fileName.equals(fileName))\r
 -          {\r
 -            try\r
 -            {\r
 -              frames[i].setSelected(true);\r
 -              Desktop.instance.closeAssociatedWindows();\r
 -            } catch (java.beans.PropertyVetoException ex)\r
 -            {\r
 -            }\r
 -          }\r
 -\r
 -        }\r
 -        Desktop.instance.closeAssociatedWindows();\r
 -\r
 -        FileLoader loader = new FileLoader();\r
 -        String protocol = fileName.startsWith("http:") ? "URL" : "File";\r
 -        loader.LoadFile(viewport, fileName, protocol, currentFileFormat);\r
 -      }\r
 -      else\r
 -      {\r
 -        Rectangle bounds = this.getBounds();\r
 -\r
 -        FileLoader loader = new FileLoader();\r
 -        String protocol = fileName.startsWith("http:") ? "URL" : "File";\r
 -        AlignFrame newframe = loader.LoadFileWaitTillLoaded(fileName,\r
 -                protocol, currentFileFormat);\r
 -\r
 -        newframe.setBounds(bounds);\r
 -        if (featureSettings != null && featureSettings.isShowing())\r
 -        {\r
 -          final Rectangle fspos = featureSettings.frame.getBounds();\r
 -          // TODO: need a 'show feature settings' function that takes bounds -\r
 -          // need to refactor Desktop.addFrame\r
 -          newframe.featureSettings_actionPerformed(null);\r
 -          final FeatureSettings nfs = newframe.featureSettings;\r
 -          SwingUtilities.invokeLater(new Runnable()\r
 -          {\r
 -            @Override\r
 -            public void run()\r
 -            {\r
 -              nfs.frame.setBounds(fspos);\r
 -            }\r
 -          });\r
 -          this.featureSettings.close();\r
 -          this.featureSettings = null;\r
 -        }\r
 -        this.closeMenuItem_actionPerformed(true);\r
 -      }\r
 -    }\r
 -  }\r
 -\r
 -  @Override\r
 -  public void addFromText_actionPerformed(ActionEvent e)\r
 -  {\r
 -    Desktop.instance.inputTextboxMenuItem_actionPerformed(viewport);\r
 -  }\r
 -\r
 -  @Override\r
 -  public void addFromURL_actionPerformed(ActionEvent e)\r
 -  {\r
 -    Desktop.instance.inputURLMenuItem_actionPerformed(viewport);\r
 -  }\r
 -\r
 -  @Override\r
 -  public void save_actionPerformed(ActionEvent e)\r
 -  {\r
 -    if (fileName == null\r
 -            || (currentFileFormat == null || !jalview.io.FormatAdapter\r
 -                    .isValidIOFormat(currentFileFormat, true))\r
 -            || fileName.startsWith("http"))\r
 -    {\r
 -      saveAs_actionPerformed(null);\r
 -    }\r
 -    else\r
 -    {\r
 -      saveAlignment(fileName, currentFileFormat);\r
 -    }\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  public void saveAs_actionPerformed(ActionEvent e)\r
 -  {\r
 -    JalviewFileChooser chooser = new JalviewFileChooser(\r
 -            jalview.bin.Cache.getProperty("LAST_DIRECTORY"),\r
 -            jalview.io.AppletFormatAdapter.WRITABLE_EXTENSIONS,\r
 -            jalview.io.AppletFormatAdapter.WRITABLE_FNAMES,\r
 -            currentFileFormat, false);\r
 -\r
 -    chooser.setFileView(new JalviewFileView());\r
 -    chooser.setDialogTitle("Save Alignment to file");\r
 +/*
 + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
 + * Copyright (C) 2014 The Jalview Authors
 + * 
 + * This file is part of Jalview.
 + * 
 + * Jalview is free software: you can redistribute it and/or
 + * modify it under the terms of the GNU General Public License 
 + * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
 + *  
 + * Jalview is distributed in the hope that it will be useful, but 
 + * WITHOUT ANY WARRANTY; without even the implied warranty 
 + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
 + * PURPOSE.  See the GNU General Public License for more details.
 + * 
 + * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
 + * The Jalview Authors are detailed in the 'AUTHORS' file.
 + */
 +package jalview.gui;
 +
 +import jalview.analysis.AAFrequency;
 +import jalview.analysis.AlignmentSorter;
 +import jalview.analysis.Conservation;
 +import jalview.analysis.CrossRef;
 +import jalview.analysis.NJTree;
 +import jalview.analysis.ParseProperties;
 +import jalview.analysis.SequenceIdMatcher;
 +import jalview.api.AlignViewControllerI;
 +import jalview.bin.Cache;
 +import jalview.commands.CommandI;
 +import jalview.commands.EditCommand;
 +import jalview.commands.OrderCommand;
 +import jalview.commands.RemoveGapColCommand;
 +import jalview.commands.RemoveGapsCommand;
 +import jalview.commands.SlideSequencesCommand;
 +import jalview.commands.TrimRegionCommand;
 +import jalview.datamodel.AlignedCodonFrame;
 +import jalview.datamodel.Alignment;
 +import jalview.datamodel.AlignmentAnnotation;
 +import jalview.datamodel.AlignmentI;
 +import jalview.datamodel.AlignmentOrder;
 +import jalview.datamodel.AlignmentView;
 +import jalview.datamodel.ColumnSelection;
 +import jalview.datamodel.PDBEntry;
 +import jalview.datamodel.SeqCigar;
 +import jalview.datamodel.Sequence;
 +import jalview.datamodel.SequenceGroup;
 +import jalview.datamodel.SequenceI;
 +import jalview.io.AlignmentProperties;
 +import jalview.io.AnnotationFile;
 +import jalview.io.FeaturesFile;
 +import jalview.io.FileLoader;
 +import jalview.io.FormatAdapter;
 +import jalview.io.HTMLOutput;
 +import jalview.io.IdentifyFile;
 +import jalview.io.JalviewFileChooser;
 +import jalview.io.JalviewFileView;
 +import jalview.io.JnetAnnotationMaker;
 +import jalview.io.NewickFile;
 +import jalview.io.TCoffeeScoreFile;
 +import jalview.jbgui.GAlignFrame;
 +import jalview.schemes.Blosum62ColourScheme;
 +import jalview.schemes.BuriedColourScheme;
 +import jalview.schemes.ClustalxColourScheme;
 +import jalview.schemes.ColourSchemeI;
 +import jalview.schemes.ColourSchemeProperty;
 +import jalview.schemes.HelixColourScheme;
 +import jalview.schemes.HydrophobicColourScheme;
 +import jalview.schemes.NucleotideColourScheme;
 +import jalview.schemes.PIDColourScheme;
 +import jalview.schemes.PurinePyrimidineColourScheme;
 +import jalview.schemes.RNAHelicesColourChooser;
 +import jalview.schemes.ResidueProperties;
 +import jalview.schemes.StrandColourScheme;
 +import jalview.schemes.TCoffeeColourScheme;
 +import jalview.schemes.TaylorColourScheme;
 +import jalview.schemes.TurnColourScheme;
 +import jalview.schemes.UserColourScheme;
 +import jalview.schemes.ZappoColourScheme;
 +import jalview.util.MessageManager;
 +import jalview.ws.jws1.Discoverer;
 +import jalview.ws.jws2.Jws2Discoverer;
 +import jalview.ws.jws2.jabaws2.Jws2Instance;
 +import jalview.ws.seqfetcher.DbSourceProxy;
 +
 +import java.awt.BorderLayout;
 +import java.awt.Color;
 +import java.awt.Component;
 +import java.awt.GridLayout;
 +import java.awt.Rectangle;
 +import java.awt.Toolkit;
 +import java.awt.datatransfer.Clipboard;
 +import java.awt.datatransfer.DataFlavor;
 +import java.awt.datatransfer.StringSelection;
 +import java.awt.datatransfer.Transferable;
 +import java.awt.dnd.DnDConstants;
 +import java.awt.dnd.DropTargetDragEvent;
 +import java.awt.dnd.DropTargetDropEvent;
 +import java.awt.dnd.DropTargetEvent;
 +import java.awt.dnd.DropTargetListener;
 +import java.awt.event.ActionEvent;
 +import java.awt.event.ActionListener;
 +import java.awt.event.KeyAdapter;
 +import java.awt.event.KeyEvent;
 +import java.awt.event.MouseAdapter;
 +import java.awt.event.MouseEvent;
 +import java.awt.print.PageFormat;
 +import java.awt.print.PrinterJob;
 +import java.beans.PropertyChangeEvent;
 +import java.io.File;
 +import java.net.URL;
 +import java.util.ArrayList;
 +import java.util.Enumeration;
 +import java.util.Hashtable;
 +import java.util.List;
 +import java.util.Vector;
 +
 +import javax.swing.JButton;
 +import javax.swing.JEditorPane;
 +import javax.swing.JInternalFrame;
 +import javax.swing.JLabel;
 +import javax.swing.JLayeredPane;
 +import javax.swing.JMenu;
 +import javax.swing.JMenuItem;
 +import javax.swing.JOptionPane;
 +import javax.swing.JPanel;
 +import javax.swing.JProgressBar;
 +import javax.swing.JRadioButtonMenuItem;
 +import javax.swing.JScrollPane;
 +import javax.swing.SwingUtilities;
 +
 +/**
 + * DOCUMENT ME!
 + * 
 + * @author $author$
 + * @version $Revision$
 + */
 +public class AlignFrame extends GAlignFrame implements DropTargetListener,
 +        IProgressIndicator
 +{
 +
 +  /** DOCUMENT ME!! */
 +  public static final int DEFAULT_WIDTH = 700;
 +
 +  /** DOCUMENT ME!! */
 +  public static final int DEFAULT_HEIGHT = 500;
 +
 +  public AlignmentPanel alignPanel;
 +
 +  AlignViewport viewport;
 + 
 +  public AlignViewControllerI avc;
 + 
 +
 +  Vector alignPanels = new Vector();
 +
 +  /**
 +   * Last format used to load or save alignments in this window
 +   */
 +  String currentFileFormat = null;
 +
 +  /**
 +   * Current filename for this alignment
 +   */
 +  String fileName = null;
 +
 +  /**
 +   * Creates a new AlignFrame object with specific width and height.
 +   * 
 +   * @param al
 +   * @param width
 +   * @param height
 +   */
 +  public AlignFrame(AlignmentI al, int width, int height)
 +  {
 +    this(al, null, width, height);
 +  }
 +
 +  /**
 +   * Creates a new AlignFrame object with specific width, height and
 +   * sequenceSetId
 +   * 
 +   * @param al
 +   * @param width
 +   * @param height
 +   * @param sequenceSetId
 +   */
 +  public AlignFrame(AlignmentI al, int width, int height,
 +          String sequenceSetId)
 +  {
 +    this(al, null, width, height, sequenceSetId);
 +  }
 +
 +  /**
 +   * Creates a new AlignFrame object with specific width, height and
 +   * sequenceSetId
 +   * 
 +   * @param al
 +   * @param width
 +   * @param height
 +   * @param sequenceSetId
 +   * @param viewId
 +   */
 +  public AlignFrame(AlignmentI al, int width, int height,
 +          String sequenceSetId, String viewId)
 +  {
 +    this(al, null, width, height, sequenceSetId, viewId);
 +  }
 +
 +  /**
 +   * new alignment window with hidden columns
 +   * 
 +   * @param al
 +   *          AlignmentI
 +   * @param hiddenColumns
 +   *          ColumnSelection or null
 +   * @param width
 +   *          Width of alignment frame
 +   * @param height
 +   *          height of frame.
 +   */
 +  public AlignFrame(AlignmentI al, ColumnSelection hiddenColumns,
 +          int width, int height)
 +  {
 +    this(al, hiddenColumns, width, height, null);
 +  }
 +
 +  /**
 +   * Create alignment frame for al with hiddenColumns, a specific width and
 +   * height, and specific sequenceId
 +   * 
 +   * @param al
 +   * @param hiddenColumns
 +   * @param width
 +   * @param height
 +   * @param sequenceSetId
 +   *          (may be null)
 +   */
 +  public AlignFrame(AlignmentI al, ColumnSelection hiddenColumns,
 +          int width, int height, String sequenceSetId)
 +  {
 +    this(al, hiddenColumns, width, height, sequenceSetId, null);
 +  }
 +
 +  /**
 +   * Create alignment frame for al with hiddenColumns, a specific width and
 +   * height, and specific sequenceId
 +   * 
 +   * @param al
 +   * @param hiddenColumns
 +   * @param width
 +   * @param height
 +   * @param sequenceSetId
 +   *          (may be null)
 +   * @param viewId
 +   *          (may be null)
 +   */
 +  public AlignFrame(AlignmentI al, ColumnSelection hiddenColumns,
 +          int width, int height, String sequenceSetId, String viewId)
 +  {
 +    setSize(width, height);
 +    viewport = new AlignViewport(al, hiddenColumns, sequenceSetId, viewId);
 +
 +    alignPanel = new AlignmentPanel(this, viewport);
 +
 +    if (al.getDataset() == null)
 +    {
 +      al.setDataset(null);
 +    }
 +
 +    addAlignmentPanel(alignPanel, true);
 +    init();
 +  }
 +
 +  /**
 +   * Make a new AlignFrame from exisiting alignmentPanels
 +   * 
 +   * @param ap
 +   *          AlignmentPanel
 +   * @param av
 +   *          AlignViewport
 +   */
 +  public AlignFrame(AlignmentPanel ap)
 +  {
 +    viewport = ap.av;
 +    alignPanel = ap;
 +    addAlignmentPanel(ap, false);
 +    init();
 +  }
 +
 +  /**
 +   * initalise the alignframe from the underlying viewport data and the
 +   * configurations
 +   */
 +  void init()
 +  {
 +    avc = new jalview.controller.AlignViewController(viewport, alignPanel);
 +    if (viewport.getAlignmentConservationAnnotation() == null)
 +    {
 +      BLOSUM62Colour.setEnabled(false);
 +      conservationMenuItem.setEnabled(false);
 +      modifyConservation.setEnabled(false);
 +      // PIDColour.setEnabled(false);
 +      // abovePIDThreshold.setEnabled(false);
 +      // modifyPID.setEnabled(false);
 +    }
 +
 +    String sortby = jalview.bin.Cache.getDefault("SORT_ALIGNMENT",
 +            "No sort");
 +
 +    if (sortby.equals("Id"))
 +    {
 +      sortIDMenuItem_actionPerformed(null);
 +    }
 +    else if (sortby.equals("Pairwise Identity"))
 +    {
 +      sortPairwiseMenuItem_actionPerformed(null);
 +    }
 +
 +    if (Desktop.desktop != null)
 +    {
 +      this.setDropTarget(new java.awt.dnd.DropTarget(this, this));
 +      addServiceListeners();
 +      setGUINucleotide(viewport.getAlignment().isNucleotide());
 +    }
 +
 +    setMenusFromViewport(viewport);
 +    buildSortByAnnotationScoresMenu();
 +    if (viewport.wrapAlignment)
 +    {
 +      wrapMenuItem_actionPerformed(null);
 +    }
 +
 +    if (jalview.bin.Cache.getDefault("SHOW_OVERVIEW", false))
 +    {
 +      this.overviewMenuItem_actionPerformed(null);
 +    }
 +
 +    addKeyListener();
 +    
 +  }
 +
 +  /**
 +   * Change the filename and format for the alignment, and enable the 'reload'
 +   * button functionality.
 +   * 
 +   * @param file
 +   *          valid filename
 +   * @param format
 +   *          format of file
 +   */
 +  public void setFileName(String file, String format)
 +  {
 +    fileName = file;
 +    currentFileFormat = format;
 +    reload.setEnabled(true);
 +  }
 +
 +  void addKeyListener()
 +  {
 +    addKeyListener(new KeyAdapter()
 +    {
 +      @Override
 +      public void keyPressed(KeyEvent evt)
 +      {
 +        if (viewport.cursorMode
 +                && ((evt.getKeyCode() >= KeyEvent.VK_0 && evt.getKeyCode() <= KeyEvent.VK_9) || (evt
 +                        .getKeyCode() >= KeyEvent.VK_NUMPAD0 && evt
 +                        .getKeyCode() <= KeyEvent.VK_NUMPAD9))
 +                && Character.isDigit(evt.getKeyChar()))
 +          alignPanel.seqPanel.numberPressed(evt.getKeyChar());
 +
 +        switch (evt.getKeyCode())
 +        {
 +
 +        case 27: // escape key
 +          deselectAllSequenceMenuItem_actionPerformed(null);
 +
 +          break;
 +
 +        case KeyEvent.VK_DOWN:
 +          if (evt.isAltDown() || !viewport.cursorMode)
 +            moveSelectedSequences(false);
 +          if (viewport.cursorMode)
 +            alignPanel.seqPanel.moveCursor(0, 1);
 +          break;
 +
 +        case KeyEvent.VK_UP:
 +          if (evt.isAltDown() || !viewport.cursorMode)
 +            moveSelectedSequences(true);
 +          if (viewport.cursorMode)
 +            alignPanel.seqPanel.moveCursor(0, -1);
 +
 +          break;
 +
 +        case KeyEvent.VK_LEFT:
 +          if (evt.isAltDown() || !viewport.cursorMode)
 +            slideSequences(false, alignPanel.seqPanel.getKeyboardNo1());
 +          else
 +            alignPanel.seqPanel.moveCursor(-1, 0);
 +
 +          break;
 +
 +        case KeyEvent.VK_RIGHT:
 +          if (evt.isAltDown() || !viewport.cursorMode)
 +            slideSequences(true, alignPanel.seqPanel.getKeyboardNo1());
 +          else
 +            alignPanel.seqPanel.moveCursor(1, 0);
 +          break;
 +
 +        case KeyEvent.VK_SPACE:
 +          if (viewport.cursorMode)
 +          {
 +            alignPanel.seqPanel.insertGapAtCursor(evt.isControlDown()
 +                    || evt.isShiftDown() || evt.isAltDown());
 +          }
 +          break;
 +
 +        // case KeyEvent.VK_A:
 +        // if (viewport.cursorMode)
 +        // {
 +        // alignPanel.seqPanel.insertNucAtCursor(false,"A");
 +        // //System.out.println("A");
 +        // }
 +        // break;
 +        /*
 +         * case KeyEvent.VK_CLOSE_BRACKET: if (viewport.cursorMode) {
 +         * System.out.println("closing bracket"); } break;
 +         */
 +        case KeyEvent.VK_DELETE:
 +        case KeyEvent.VK_BACK_SPACE:
 +          if (!viewport.cursorMode)
 +          {
 +            cut_actionPerformed(null);
 +          }
 +          else
 +          {
 +            alignPanel.seqPanel.deleteGapAtCursor(evt.isControlDown()
 +                    || evt.isShiftDown() || evt.isAltDown());
 +          }
 +
 +          break;
 +
 +        case KeyEvent.VK_S:
 +          if (viewport.cursorMode)
 +          {
 +            alignPanel.seqPanel.setCursorRow();
 +          }
 +          break;
 +        case KeyEvent.VK_C:
 +          if (viewport.cursorMode && !evt.isControlDown())
 +          {
 +            alignPanel.seqPanel.setCursorColumn();
 +          }
 +          break;
 +        case KeyEvent.VK_P:
 +          if (viewport.cursorMode)
 +          {
 +            alignPanel.seqPanel.setCursorPosition();
 +          }
 +          break;
 +
 +        case KeyEvent.VK_ENTER:
 +        case KeyEvent.VK_COMMA:
 +          if (viewport.cursorMode)
 +          {
 +            alignPanel.seqPanel.setCursorRowAndColumn();
 +          }
 +          break;
 +
 +        case KeyEvent.VK_Q:
 +          if (viewport.cursorMode)
 +          {
 +            alignPanel.seqPanel.setSelectionAreaAtCursor(true);
 +          }
 +          break;
 +        case KeyEvent.VK_M:
 +          if (viewport.cursorMode)
 +          {
 +            alignPanel.seqPanel.setSelectionAreaAtCursor(false);
 +          }
 +          break;
 +
 +        case KeyEvent.VK_F2:
 +          viewport.cursorMode = !viewport.cursorMode;
 +          statusBar.setText(MessageManager.formatMessage("label.keyboard_editing_mode", new String[]{(viewport.cursorMode ? "on" : "off")}));
 +          if (viewport.cursorMode)
 +          {
 +            alignPanel.seqPanel.seqCanvas.cursorX = viewport.startRes;
 +            alignPanel.seqPanel.seqCanvas.cursorY = viewport.startSeq;
 +          }
 +          alignPanel.seqPanel.seqCanvas.repaint();
 +          break;
 +
 +        case KeyEvent.VK_F1:
 +          try
 +          {
 +            ClassLoader cl = jalview.gui.Desktop.class.getClassLoader();
 +            java.net.URL url = javax.help.HelpSet.findHelpSet(cl,
 +                    "help/help");
 +            javax.help.HelpSet hs = new javax.help.HelpSet(cl, url);
 +
 +            javax.help.HelpBroker hb = hs.createHelpBroker();
 +            hb.setCurrentID("home");
 +            hb.setDisplayed(true);
 +          } catch (Exception ex)
 +          {
 +            ex.printStackTrace();
 +          }
 +          break;
 +        case KeyEvent.VK_H:
 +        {
 +          boolean toggleSeqs = !evt.isControlDown();
 +          boolean toggleCols = !evt.isShiftDown();
 +          toggleHiddenRegions(toggleSeqs, toggleCols);
 +          break;
 +        }
 +        case KeyEvent.VK_PAGE_UP:
 +          if (viewport.wrapAlignment)
 +          {
 +            alignPanel.scrollUp(true);
 +          }
 +          else
 +          {
 +            alignPanel.setScrollValues(viewport.startRes, viewport.startSeq
 +                    - viewport.endSeq + viewport.startSeq);
 +          }
 +          break;
 +        case KeyEvent.VK_PAGE_DOWN:
 +          if (viewport.wrapAlignment)
 +          {
 +            alignPanel.scrollUp(false);
 +          }
 +          else
 +          {
 +            alignPanel.setScrollValues(viewport.startRes, viewport.startSeq
 +                    + viewport.endSeq - viewport.startSeq);
 +          }
 +          break;
 +        }
 +      }
 +
 +      @Override
 +      public void keyReleased(KeyEvent evt)
 +      {
 +        switch (evt.getKeyCode())
 +        {
 +        case KeyEvent.VK_LEFT:
 +          if (evt.isAltDown() || !viewport.cursorMode)
 +            viewport.firePropertyChange("alignment", null, viewport
 +                    .getAlignment().getSequences());
 +          break;
 +
 +        case KeyEvent.VK_RIGHT:
 +          if (evt.isAltDown() || !viewport.cursorMode)
 +            viewport.firePropertyChange("alignment", null, viewport
 +                    .getAlignment().getSequences());
 +          break;
 +        }
 +      }
 +    });
 +  }
 +
 +  public void addAlignmentPanel(final AlignmentPanel ap, boolean newPanel)
 +  {
 +    ap.alignFrame = this;
 +    avc = new jalview.controller.AlignViewController(viewport, alignPanel);
 +
 +    alignPanels.addElement(ap);
 +
 +    PaintRefresher.Register(ap, ap.av.getSequenceSetId());
 +
 +    int aSize = alignPanels.size();
 +
 +    tabbedPane.setVisible(aSize > 1 || ap.av.viewName != null);
 +
 +    if (aSize == 1 && ap.av.viewName == null)
 +    {
 +      this.getContentPane().add(ap, BorderLayout.CENTER);
 +    }
 +    else
 +    {
 +      if (aSize == 2)
 +      {
 +        setInitialTabVisible();
 +      }
 +
 +      expandViews.setEnabled(true);
 +      gatherViews.setEnabled(true);
 +      tabbedPane.addTab(ap.av.viewName, ap);
 +
 +      ap.setVisible(false);
 +    }
 +
 +    if (newPanel)
 +    {
 +      if (ap.av.isPadGaps())
 +      {
 +        ap.av.getAlignment().padGaps();
 +      }
 +      ap.av.updateConservation(ap);
 +      ap.av.updateConsensus(ap);
 +      ap.av.updateStrucConsensus(ap);
 +    }
 +  }
 +
 +  public void setInitialTabVisible()
 +  {
 +    expandViews.setEnabled(true);
 +    gatherViews.setEnabled(true);
 +    tabbedPane.setVisible(true);
 +    AlignmentPanel first = (AlignmentPanel) alignPanels.firstElement();
 +    tabbedPane.addTab(first.av.viewName, first);
 +    this.getContentPane().add(tabbedPane, BorderLayout.CENTER);
 +  }
 +
 +  public AlignViewport getViewport()
 +  {
 +    return viewport;
 +  }
 +
 +  /* Set up intrinsic listeners for dynamically generated GUI bits. */
 +  private void addServiceListeners()
 +  {
 +    final java.beans.PropertyChangeListener thisListener;
 +    Desktop.instance.addJalviewPropertyChangeListener("services",
 +            thisListener = new java.beans.PropertyChangeListener()
 +            {
 +              @Override
 +              public void propertyChange(PropertyChangeEvent evt)
 +              {
 +                // // System.out.println("Discoverer property change.");
 +                // if (evt.getPropertyName().equals("services"))
 +                {
 +                  SwingUtilities.invokeLater(new Runnable()
 +                  {
 +
 +                    @Override
 +                    public void run()
 +                    {
 +                      System.err
 +                              .println("Rebuild WS Menu for service change");
 +                      BuildWebServiceMenu();
 +                    }
 +
 +                  });
 +                }
 +              }
 +            });
 +    addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
 +    {
 +      @Override
 +      public void internalFrameClosed(
 +              javax.swing.event.InternalFrameEvent evt)
 +      {
 +        System.out.println("deregistering discoverer listener");
 +        Desktop.instance.removeJalviewPropertyChangeListener("services",
 +                thisListener);
 +        closeMenuItem_actionPerformed(true);
 +      };
 +    });
 +    // Finally, build the menu once to get current service state
 +    new Thread(new Runnable()
 +    {
 +      @Override
 +      public void run()
 +      {
 +        BuildWebServiceMenu();
 +      }
 +    }).start();
 +  }
 +
 +  public void setGUINucleotide(boolean nucleotide)
 +  {
 +    showTranslation.setVisible(nucleotide);
 +    conservationMenuItem.setEnabled(!nucleotide);
 +    modifyConservation.setEnabled(!nucleotide);
 +    showGroupConservation.setEnabled(!nucleotide);
 +    rnahelicesColour.setEnabled(nucleotide);
 +    purinePyrimidineColour.setEnabled(nucleotide);
 +    // Remember AlignFrame always starts as protein
 +    // if (!nucleotide)
 +    // {
 +    // showTr
 +    // calculateMenu.remove(calculateMenu.getItemCount() - 2);
 +    // }
 +  }
 +
 +  /**
 +   * set up menus for the currently viewport. This may be called after any
 +   * operation that affects the data in the current view (selection changed,
 +   * etc) to update the menus to reflect the new state.
 +   */
 +  public void setMenusForViewport()
 +  {
 +    setMenusFromViewport(viewport);
 +  }
 +
 +  /**
 +   * Need to call this method when tabs are selected for multiple views, or when
 +   * loading from Jalview2XML.java
 +   * 
 +   * @param av
 +   *          AlignViewport
 +   */
 +  void setMenusFromViewport(AlignViewport av)
 +  {
 +    padGapsMenuitem.setSelected(av.isPadGaps());
 +    colourTextMenuItem.setSelected(av.showColourText);
 +    abovePIDThreshold.setSelected(av.getAbovePIDThreshold());
 +    conservationMenuItem.setSelected(av.getConservationSelected());
 +    seqLimits.setSelected(av.getShowJVSuffix());
 +    idRightAlign.setSelected(av.rightAlignIds);
 +    centreColumnLabelsMenuItem.setState(av.centreColumnLabels);
 +    renderGapsMenuItem.setSelected(av.renderGaps);
 +    wrapMenuItem.setSelected(av.wrapAlignment);
 +    scaleAbove.setVisible(av.wrapAlignment);
 +    scaleLeft.setVisible(av.wrapAlignment);
 +    scaleRight.setVisible(av.wrapAlignment);
 +    annotationPanelMenuItem.setState(av.showAnnotation);
 +    viewBoxesMenuItem.setSelected(av.showBoxes);
 +    viewTextMenuItem.setSelected(av.showText);
 +    showNonconservedMenuItem.setSelected(av.getShowUnconserved());
 +    showGroupConsensus.setSelected(av.isShowGroupConsensus());
 +    showGroupConservation.setSelected(av.isShowGroupConservation());
 +    showConsensusHistogram.setSelected(av.isShowConsensusHistogram());
 +    showSequenceLogo.setSelected(av.isShowSequenceLogo());
 +    normaliseSequenceLogo.setSelected(av.isNormaliseSequenceLogo());
 +
 +    setColourSelected(ColourSchemeProperty.getColourName(av
 +            .getGlobalColourScheme()));
 +
 +    showSeqFeatures.setSelected(av.showSequenceFeatures);
 +    hiddenMarkers.setState(av.showHiddenMarkers);
 +    applyToAllGroups.setState(av.getColourAppliesToAllGroups());
 +    showNpFeatsMenuitem.setSelected(av.isShowNpFeats());
 +    showDbRefsMenuitem.setSelected(av.isShowDbRefs());
 +    autoCalculate.setSelected(av.autoCalculateConsensus);
 +    sortByTree.setSelected(av.sortByTree);
 +    listenToViewSelections.setSelected(av.followSelection);
 +    rnahelicesColour.setEnabled(av.getAlignment().hasRNAStructure());
 +    rnahelicesColour
 +            .setSelected(av.getGlobalColourScheme() instanceof jalview.schemes.RNAHelicesColour);
 +    setShowProductsEnabled();
 +    updateEditMenuBar();
 +  }
 +
 +  // methods for implementing IProgressIndicator
 +  // need to refactor to a reusable stub class
 +  Hashtable progressBars, progressBarHandlers;
 +
 +  /*
 +   * (non-Javadoc)
 +   * 
 +   * @see jalview.gui.IProgressIndicator#setProgressBar(java.lang.String, long)
 +   */
 +  @Override
 +  public void setProgressBar(String message, long id)
 +  {
 +    if (progressBars == null)
 +    {
 +      progressBars = new Hashtable();
 +      progressBarHandlers = new Hashtable();
 +    }
 +
 +    JPanel progressPanel;
 +    Long lId = new Long(id);
 +    GridLayout layout = (GridLayout) statusPanel.getLayout();
 +    if (progressBars.get(lId) != null)
 +    {
 +      progressPanel = (JPanel) progressBars.get(new Long(id));
 +      statusPanel.remove(progressPanel);
 +      progressBars.remove(lId);
 +      progressPanel = null;
 +      if (message != null)
 +      {
 +        statusBar.setText(message);
 +      }
 +      if (progressBarHandlers.contains(lId))
 +      {
 +        progressBarHandlers.remove(lId);
 +      }
 +      layout.setRows(layout.getRows() - 1);
 +    }
 +    else
 +    {
 +      progressPanel = new JPanel(new BorderLayout(10, 5));
 +
 +      JProgressBar progressBar = new JProgressBar();
 +      progressBar.setIndeterminate(true);
 +
 +      progressPanel.add(new JLabel(message), BorderLayout.WEST);
 +      progressPanel.add(progressBar, BorderLayout.CENTER);
 +
 +      layout.setRows(layout.getRows() + 1);
 +      statusPanel.add(progressPanel);
 +
 +      progressBars.put(lId, progressPanel);
 +    }
 +    // update GUI
 +    // setMenusForViewport();
 +    validate();
 +  }
 +
 +  @Override
 +  public void registerHandler(final long id,
 +          final IProgressIndicatorHandler handler)
 +  {
 +    if (progressBarHandlers == null || !progressBars.contains(new Long(id)))
 +    {
 +      throw new Error(
 +              "call setProgressBar before registering the progress bar's handler.");
 +    }
 +    progressBarHandlers.put(new Long(id), handler);
 +    final JPanel progressPanel = (JPanel) progressBars.get(new Long(id));
 +    if (handler.canCancel())
 +    {
 +      JButton cancel = new JButton(MessageManager.getString("action.cancel"));
 +      final IProgressIndicator us = this;
 +      cancel.addActionListener(new ActionListener()
 +      {
 +
 +        @Override
 +        public void actionPerformed(ActionEvent e)
 +        {
 +          handler.cancelActivity(id);
 +          us.setProgressBar(
 +                  "Cancelled "
 +                          + ((JLabel) progressPanel.getComponent(0))
 +                                  .getText(), id);
 +        }
 +      });
 +      progressPanel.add(cancel, BorderLayout.EAST);
 +    }
 +  }
 +
 +  /**
 +   * 
 +   * @return true if any progress bars are still active
 +   */
 +  @Override
 +  public boolean operationInProgress()
 +  {
 +    if (progressBars != null && progressBars.size() > 0)
 +    {
 +      return true;
 +    }
 +    return false;
 +  }
 +
 +  /*
 +   * Added so Castor Mapping file can obtain Jalview Version
 +   */
 +  public String getVersion()
 +  {
 +    return jalview.bin.Cache.getProperty("VERSION");
 +  }
 +
 +  public FeatureRenderer getFeatureRenderer()
 +  {
 +    return alignPanel.seqPanel.seqCanvas.getFeatureRenderer();
 +  }
 +
 +  @Override
 +  public void fetchSequence_actionPerformed(ActionEvent e)
 +  {
 +    new SequenceFetcher(this);
 +  }
 +
 +  @Override
 +  public void addFromFile_actionPerformed(ActionEvent e)
 +  {
 +    Desktop.instance.inputLocalFileMenuItem_actionPerformed(viewport);
 +  }
 +
 +  @Override
 +  public void reload_actionPerformed(ActionEvent e)
 +  {
 +    if (fileName != null)
 +    {
 +      // TODO: JAL-1108 - ensure all associated frames are closed regardless of
 +      // originating file's format
 +      // TODO: work out how to recover feature settings for correct view(s) when
 +      // file is reloaded.
 +      if (currentFileFormat.equals("Jalview"))
 +      {
 +        JInternalFrame[] frames = Desktop.desktop.getAllFrames();
 +        for (int i = 0; i < frames.length; i++)
 +        {
 +          if (frames[i] instanceof AlignFrame && frames[i] != this
 +                  && ((AlignFrame) frames[i]).fileName != null
 +                  && ((AlignFrame) frames[i]).fileName.equals(fileName))
 +          {
 +            try
 +            {
 +              frames[i].setSelected(true);
 +              Desktop.instance.closeAssociatedWindows();
 +            } catch (java.beans.PropertyVetoException ex)
 +            {
 +            }
 +          }
 +
 +        }
 +        Desktop.instance.closeAssociatedWindows();
 +
 +        FileLoader loader = new FileLoader();
 +        String protocol = fileName.startsWith("http:") ? "URL" : "File";
 +        loader.LoadFile(viewport, fileName, protocol, currentFileFormat);
 +      }
 +      else
 +      {
 +        Rectangle bounds = this.getBounds();
 +
 +        FileLoader loader = new FileLoader();
 +        String protocol = fileName.startsWith("http:") ? "URL" : "File";
 +        AlignFrame newframe = loader.LoadFileWaitTillLoaded(fileName,
 +                protocol, currentFileFormat);
 +
 +        newframe.setBounds(bounds);
 +        if (featureSettings != null && featureSettings.isShowing())
 +        {
 +          final Rectangle fspos = featureSettings.frame.getBounds();
 +          // TODO: need a 'show feature settings' function that takes bounds -
 +          // need to refactor Desktop.addFrame
 +          newframe.featureSettings_actionPerformed(null);
 +          final FeatureSettings nfs = newframe.featureSettings;
 +          SwingUtilities.invokeLater(new Runnable()
 +          {
 +            @Override
 +            public void run()
 +            {
 +              nfs.frame.setBounds(fspos);
 +            }
 +          });
 +          this.featureSettings.close();
 +          this.featureSettings = null;
 +        }
 +        this.closeMenuItem_actionPerformed(true);
 +      }
 +    }
 +  }
 +
 +  @Override
 +  public void addFromText_actionPerformed(ActionEvent e)
 +  {
 +    Desktop.instance.inputTextboxMenuItem_actionPerformed(viewport);
 +  }
 +
 +  @Override
 +  public void addFromURL_actionPerformed(ActionEvent e)
 +  {
 +    Desktop.instance.inputURLMenuItem_actionPerformed(viewport);
 +  }
 +
 +  @Override
 +  public void save_actionPerformed(ActionEvent e)
 +  {
 +    if (fileName == null
 +            || (currentFileFormat == null || !jalview.io.FormatAdapter
 +                    .isValidIOFormat(currentFileFormat, true))
 +            || fileName.startsWith("http"))
 +    {
 +      saveAs_actionPerformed(null);
 +    }
 +    else
 +    {
 +      saveAlignment(fileName, currentFileFormat);
 +    }
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  public void saveAs_actionPerformed(ActionEvent e)
 +  {
 +    JalviewFileChooser chooser = new JalviewFileChooser(
 +            jalview.bin.Cache.getProperty("LAST_DIRECTORY"),
 +            jalview.io.AppletFormatAdapter.WRITABLE_EXTENSIONS,
 +            jalview.io.AppletFormatAdapter.WRITABLE_FNAMES,
 +            currentFileFormat, false);
 +
 +    chooser.setFileView(new JalviewFileView());
 +    chooser.setDialogTitle("Save Alignment to file");
-     chooser.setToolTipText("Save");
+     chooser.setToolTipText(MessageManager.getString("action.save"));\r
 -\r
 -    int value = chooser.showSaveDialog(this);\r
 -\r
 -    if (value == JalviewFileChooser.APPROVE_OPTION)\r
 -    {\r
 -      currentFileFormat = chooser.getSelectedFormat();\r
 -      if (currentFileFormat == null)\r
 -      {\r
 -        JOptionPane.showInternalMessageDialog(Desktop.desktop,\r
 -                MessageManager.getString("label.select_file_format_before_saving"),\r
 -                MessageManager.getString("label.file_format_not_specified"), JOptionPane.WARNING_MESSAGE);\r
 -        value = chooser.showSaveDialog(this);\r
 -        return;\r
 -      }\r
 -\r
 -      fileName = chooser.getSelectedFile().getPath();\r
 -\r
 -      jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT",\r
 -              currentFileFormat);\r
 -\r
 -      jalview.bin.Cache.setProperty("LAST_DIRECTORY", fileName);\r
 -      if (currentFileFormat.indexOf(" ") > -1)\r
 -      {\r
 -        currentFileFormat = currentFileFormat.substring(0,\r
 -                currentFileFormat.indexOf(" "));\r
 -      }\r
 -      saveAlignment(fileName, currentFileFormat);\r
 -    }\r
 -  }\r
 -\r
 -  public boolean saveAlignment(String file, String format)\r
 -  {\r
 -    boolean success = true;\r
 -\r
 -    if (format.equalsIgnoreCase("Jalview"))\r
 -    {\r
 -      String shortName = title;\r
 -\r
 -      if (shortName.indexOf(java.io.File.separatorChar) > -1)\r
 -      {\r
 -        shortName = shortName.substring(shortName\r
 -                .lastIndexOf(java.io.File.separatorChar) + 1);\r
 -      }\r
 -\r
 -      success = new Jalview2XML().SaveAlignment(this, file, shortName);\r
 -\r
 -      statusBar.setText(MessageManager.formatMessage("label.successfully_saved_to_file_in_format",new String[]{fileName, format}));\r
 -\r
 -\r
 -    }\r
 -    else\r
 -    {\r
 -      if (!jalview.io.AppletFormatAdapter.isValidFormat(format, true))\r
 -      {\r
 -        warningMessage("Cannot save file " + fileName + " using format "\r
 -                + format, "Alignment output format not supported");\r
 -        saveAs_actionPerformed(null);\r
 -        // JBPNote need to have a raise_gui flag here\r
 -        return false;\r
 -      }\r
 -\r
 -      String[] omitHidden = null;\r
 -\r
 -      if (viewport.hasHiddenColumns())\r
 -      {\r
 -        int reply = JOptionPane\r
 -                .showInternalConfirmDialog(\r
 -                        Desktop.desktop,\r
 -                        MessageManager.getString("label.alignment_contains_hidden_columns"),\r
 -                        MessageManager.getString("action.save_omit_hidden_columns"),\r
 -                        JOptionPane.YES_NO_OPTION,\r
 -                        JOptionPane.QUESTION_MESSAGE);\r
 -\r
 -        if (reply == JOptionPane.YES_OPTION)\r
 -        {\r
 -          omitHidden = viewport.getViewAsString(false);\r
 -        }\r
 -      }\r
 -      FormatAdapter f = new FormatAdapter();\r
 -      String output = f.formatSequences(format,\r
 -              viewport.getAlignment(), // class cast exceptions will\r
 -              // occur in the distant future\r
 -              omitHidden, f.getCacheSuffixDefault(format),\r
 -              viewport.getColumnSelection());\r
 -\r
 -      if (output == null)\r
 -      {\r
 -        success = false;\r
 -      }\r
 -      else\r
 -      {\r
 -        try\r
 -        {\r
 -          java.io.PrintWriter out = new java.io.PrintWriter(\r
 -                  new java.io.FileWriter(file));\r
 -\r
 -          out.print(output);\r
 -          out.close();\r
 -          this.setTitle(file);\r
 -          statusBar.setText(MessageManager.formatMessage("label.successfully_saved_to_file_in_format",new String[]{fileName, format}));\r
 -        } catch (Exception ex)\r
 -        {\r
 -          success = false;\r
 -          ex.printStackTrace();\r
 -        }\r
 -      }\r
 -    }\r
 -\r
 -    if (!success)\r
 -    {\r
 -      JOptionPane.showInternalMessageDialog(this, MessageManager.formatMessage("label.couldnt_save_file", new String[]{fileName}),\r
 -              MessageManager.getString("label.error_saving_file"), JOptionPane.WARNING_MESSAGE);\r
 -    }\r
 -\r
 -    return success;\r
 -  }\r
 -\r
 -  private void warningMessage(String warning, String title)\r
 -  {\r
 -    if (new jalview.util.Platform().isHeadless())\r
 -    {\r
 -      System.err.println("Warning: " + title + "\nWarning: " + warning);\r
 -\r
 -    }\r
 -    else\r
 -    {\r
 -      JOptionPane.showInternalMessageDialog(this, warning, title,\r
 -              JOptionPane.WARNING_MESSAGE);\r
 -    }\r
 -    return;\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  protected void outputText_actionPerformed(ActionEvent e)\r
 -  {\r
 -    String[] omitHidden = null;\r
 -\r
 -    if (viewport.hasHiddenColumns())\r
 -    {\r
 -      int reply = JOptionPane\r
 -              .showInternalConfirmDialog(\r
 -                      Desktop.desktop,\r
 -                      MessageManager.getString("label.alignment_contains_hidden_columns"),\r
 -                      MessageManager.getString("action.save_omit_hidden_columns"),\r
 -                      JOptionPane.YES_NO_OPTION,\r
 -                      JOptionPane.QUESTION_MESSAGE);\r
 -\r
 -      if (reply == JOptionPane.YES_OPTION)\r
 -      {\r
 -        omitHidden = viewport.getViewAsString(false);\r
 -      }\r
 -    }\r
 -\r
 -    CutAndPasteTransfer cap = new CutAndPasteTransfer();\r
 -    cap.setForInput(null);\r
 -\r
 -    try\r
 -    {\r
 -      cap.setText(new FormatAdapter().formatSequences(e.getActionCommand(),\r
 -              viewport.getAlignment(), omitHidden,\r
 -              viewport.getColumnSelection()));\r
 -      Desktop.addInternalFrame(cap,\r
 +
 +    int value = chooser.showSaveDialog(this);
 +
 +    if (value == JalviewFileChooser.APPROVE_OPTION)
 +    {
 +      currentFileFormat = chooser.getSelectedFormat();
 +      if (currentFileFormat == null)
 +      {
 +        JOptionPane.showInternalMessageDialog(Desktop.desktop,
 +                MessageManager.getString("label.select_file_format_before_saving"),
 +                MessageManager.getString("label.file_format_not_specified"), JOptionPane.WARNING_MESSAGE);
 +        value = chooser.showSaveDialog(this);
 +        return;
 +      }
 +
 +      fileName = chooser.getSelectedFile().getPath();
 +
 +      jalview.bin.Cache.setProperty("DEFAULT_FILE_FORMAT",
 +              currentFileFormat);
 +
 +      jalview.bin.Cache.setProperty("LAST_DIRECTORY", fileName);
 +      if (currentFileFormat.indexOf(" ") > -1)
 +      {
 +        currentFileFormat = currentFileFormat.substring(0,
 +                currentFileFormat.indexOf(" "));
 +      }
 +      saveAlignment(fileName, currentFileFormat);
 +    }
 +  }
 +
 +  public boolean saveAlignment(String file, String format)
 +  {
 +    boolean success = true;
 +
 +    if (format.equalsIgnoreCase("Jalview"))
 +    {
 +      String shortName = title;
 +
 +      if (shortName.indexOf(java.io.File.separatorChar) > -1)
 +      {
 +        shortName = shortName.substring(shortName
 +                .lastIndexOf(java.io.File.separatorChar) + 1);
 +      }
 +
 +      success = new Jalview2XML().SaveAlignment(this, file, shortName);
 +
 +      statusBar.setText(MessageManager.formatMessage("label.successfully_saved_to_file_in_format",new String[]{fileName, format}));
 +
 +
 +    }
 +    else
 +    {
 +      if (!jalview.io.AppletFormatAdapter.isValidFormat(format, true))
 +      {
 +        warningMessage("Cannot save file " + fileName + " using format "
 +                + format, "Alignment output format not supported");
 +        saveAs_actionPerformed(null);
 +        // JBPNote need to have a raise_gui flag here
 +        return false;
 +      }
 +
 +      String[] omitHidden = null;
 +
 +      if (viewport.hasHiddenColumns())
 +      {
 +        int reply = JOptionPane
 +                .showInternalConfirmDialog(
 +                        Desktop.desktop,
 +                        MessageManager.getString("label.alignment_contains_hidden_columns"),
 +                        MessageManager.getString("action.save_omit_hidden_columns"),
 +                        JOptionPane.YES_NO_OPTION,
 +                        JOptionPane.QUESTION_MESSAGE);
 +
 +        if (reply == JOptionPane.YES_OPTION)
 +        {
 +          omitHidden = viewport.getViewAsString(false);
 +        }
 +      }
 +      FormatAdapter f = new FormatAdapter();
 +      String output = f.formatSequences(format,
 +              viewport.getAlignment(), // class cast exceptions will
 +              // occur in the distant future
 +              omitHidden, f.getCacheSuffixDefault(format),
 +              viewport.getColumnSelection());
 +
 +      if (output == null)
 +      {
 +        success = false;
 +      }
 +      else
 +      {
 +        try
 +        {
 +          java.io.PrintWriter out = new java.io.PrintWriter(
 +                  new java.io.FileWriter(file));
 +
 +          out.print(output);
 +          out.close();
 +          this.setTitle(file);
 +          statusBar.setText(MessageManager.formatMessage("label.successfully_saved_to_file_in_format",new String[]{fileName, format}));
 +        } catch (Exception ex)
 +        {
 +          success = false;
 +          ex.printStackTrace();
 +        }
 +      }
 +    }
 +
 +    if (!success)
 +    {
 +      JOptionPane.showInternalMessageDialog(this, MessageManager.formatMessage("label.couldnt_save_file", new String[]{fileName}),
 +              MessageManager.getString("label.error_saving_file"), JOptionPane.WARNING_MESSAGE);
 +    }
 +
 +    return success;
 +  }
 +
 +  private void warningMessage(String warning, String title)
 +  {
 +    if (new jalview.util.Platform().isHeadless())
 +    {
 +      System.err.println("Warning: " + title + "\nWarning: " + warning);
 +
 +    }
 +    else
 +    {
 +      JOptionPane.showInternalMessageDialog(this, warning, title,
 +              JOptionPane.WARNING_MESSAGE);
 +    }
 +    return;
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  protected void outputText_actionPerformed(ActionEvent e)
 +  {
 +    String[] omitHidden = null;
 +
 +    if (viewport.hasHiddenColumns())
 +    {
 +      int reply = JOptionPane
 +              .showInternalConfirmDialog(
 +                      Desktop.desktop,
 +                      MessageManager.getString("label.alignment_contains_hidden_columns"),
 +                      MessageManager.getString("action.save_omit_hidden_columns"),
 +                      JOptionPane.YES_NO_OPTION,
 +                      JOptionPane.QUESTION_MESSAGE);
 +
 +      if (reply == JOptionPane.YES_OPTION)
 +      {
 +        omitHidden = viewport.getViewAsString(false);
 +      }
 +    }
 +
 +    CutAndPasteTransfer cap = new CutAndPasteTransfer();
 +    cap.setForInput(null);
 +
 +    try
 +    {
 +      cap.setText(new FormatAdapter().formatSequences(e.getActionCommand(),
 +              viewport.getAlignment(), omitHidden,
 +              viewport.getColumnSelection()));
 +      Desktop.addInternalFrame(cap,
-               "Alignment output - " + e.getActionCommand(), 600, 500);
+               MessageManager.formatMessage("label.alignment_output_command", new String[]{e.getActionCommand()}), 600, 500);\r
 -    } catch (OutOfMemoryError oom)\r
 -    {\r
 -      new OOMWarning("Outputting alignment as " + e.getActionCommand(), oom);\r
 -      cap.dispose();\r
 -    }\r
 -\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  protected void htmlMenuItem_actionPerformed(ActionEvent e)\r
 -  {\r
 -    new HTMLOutput(alignPanel,\r
 -            alignPanel.seqPanel.seqCanvas.getSequenceRenderer(),\r
 -            alignPanel.seqPanel.seqCanvas.getFeatureRenderer());\r
 -  }\r
 -\r
 -  public void createImageMap(File file, String image)\r
 -  {\r
 -    alignPanel.makePNGImageMap(file, image);\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  public void createPNG(File f)\r
 -  {\r
 -    alignPanel.makePNG(f);\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  public void createEPS(File f)\r
 -  {\r
 -    alignPanel.makeEPS(f);\r
 -  }\r
 -\r
 -  @Override\r
 -  public void pageSetup_actionPerformed(ActionEvent e)\r
 -  {\r
 -    PrinterJob printJob = PrinterJob.getPrinterJob();\r
 -    PrintThread.pf = printJob.pageDialog(printJob.defaultPage());\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  public void printMenuItem_actionPerformed(ActionEvent e)\r
 -  {\r
 -    // Putting in a thread avoids Swing painting problems\r
 -    PrintThread thread = new PrintThread(alignPanel);\r
 -    thread.start();\r
 -  }\r
 -\r
 -  @Override\r
 -  public void exportFeatures_actionPerformed(ActionEvent e)\r
 -  {\r
 -    new AnnotationExporter().exportFeatures(alignPanel);\r
 -  }\r
 -\r
 -  @Override\r
 -  public void exportAnnotations_actionPerformed(ActionEvent e)\r
 -  {\r
 -    new AnnotationExporter().exportAnnotations(alignPanel,\r
 -            viewport.showAnnotation ? viewport.getAlignment()\r
 -                    .getAlignmentAnnotation() : null, viewport\r
 -                    .getAlignment().getGroups(), ((Alignment) viewport\r
 -                    .getAlignment()).alignmentProperties);\r
 -  }\r
 -\r
 -  @Override\r
 -  public void associatedData_actionPerformed(ActionEvent e)\r
 -  {\r
 -    // Pick the tree file\r
 -    JalviewFileChooser chooser = new JalviewFileChooser(\r
 -            jalview.bin.Cache.getProperty("LAST_DIRECTORY"));\r
 -    chooser.setFileView(new JalviewFileView());\r
 +    } catch (OutOfMemoryError oom)
 +    {
 +      new OOMWarning("Outputting alignment as " + e.getActionCommand(), oom);
 +      cap.dispose();
 +    }
 +
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  protected void htmlMenuItem_actionPerformed(ActionEvent e)
 +  {
 +    new HTMLOutput(alignPanel,
 +            alignPanel.seqPanel.seqCanvas.getSequenceRenderer(),
 +            alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
 +  }
 +
 +  public void createImageMap(File file, String image)
 +  {
 +    alignPanel.makePNGImageMap(file, image);
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  public void createPNG(File f)
 +  {
 +    alignPanel.makePNG(f);
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  public void createEPS(File f)
 +  {
 +    alignPanel.makeEPS(f);
 +  }
 +
 +  @Override
 +  public void pageSetup_actionPerformed(ActionEvent e)
 +  {
 +    PrinterJob printJob = PrinterJob.getPrinterJob();
 +    PrintThread.pf = printJob.pageDialog(printJob.defaultPage());
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  public void printMenuItem_actionPerformed(ActionEvent e)
 +  {
 +    // Putting in a thread avoids Swing painting problems
 +    PrintThread thread = new PrintThread(alignPanel);
 +    thread.start();
 +  }
 +
 +  @Override
 +  public void exportFeatures_actionPerformed(ActionEvent e)
 +  {
 +    new AnnotationExporter().exportFeatures(alignPanel);
 +  }
 +
 +  @Override
 +  public void exportAnnotations_actionPerformed(ActionEvent e)
 +  {
 +    new AnnotationExporter().exportAnnotations(alignPanel,
 +            viewport.showAnnotation ? viewport.getAlignment()
 +                    .getAlignmentAnnotation() : null, viewport
 +                    .getAlignment().getGroups(), ((Alignment) viewport
 +                    .getAlignment()).alignmentProperties);
 +  }
 +
 +  @Override
 +  public void associatedData_actionPerformed(ActionEvent e)
 +  {
 +    // Pick the tree file
 +    JalviewFileChooser chooser = new JalviewFileChooser(
 +            jalview.bin.Cache.getProperty("LAST_DIRECTORY"));
 +    chooser.setFileView(new JalviewFileView());
-     chooser.setDialogTitle("Load Jalview Annotations or Features File");
-     chooser.setToolTipText("Load Jalview Annotations / Features file");
+     chooser.setDialogTitle(MessageManager.getString("label.load_jalview_annotations"));\r
+     chooser.setToolTipText(MessageManager.getString("label.load_jalview_annotations"));\r
 -\r
 -    int value = chooser.showOpenDialog(null);\r
 -\r
 -    if (value == JalviewFileChooser.APPROVE_OPTION)\r
 -    {\r
 -      String choice = chooser.getSelectedFile().getPath();\r
 -      jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);\r
 -      loadJalviewDataFile(choice, null, null, null);\r
 -    }\r
 -\r
 -  }\r
 -\r
 -  /**\r
 -   * Close the current view or all views in the alignment frame. If the frame\r
 -   * only contains one view then the alignment will be removed from memory.\r
 -   * \r
 -   * @param closeAllTabs\r
 -   */\r
 -  @Override\r
 -  public void closeMenuItem_actionPerformed(boolean closeAllTabs)\r
 -  {\r
 -    if (alignPanels != null && alignPanels.size() < 2)\r
 -    {\r
 -      closeAllTabs = true;\r
 -    }\r
 -\r
 -    try\r
 -    {\r
 -      if (alignPanels != null)\r
 -      {\r
 -        if (closeAllTabs)\r
 -        {\r
 -          if (this.isClosed())\r
 -          {\r
 -            // really close all the windows - otherwise wait till\r
 -            // setClosed(true) is called\r
 -            for (int i = 0; i < alignPanels.size(); i++)\r
 -            {\r
 -              AlignmentPanel ap = (AlignmentPanel) alignPanels.elementAt(i);\r
 -              ap.closePanel();\r
 -            }\r
 -          }\r
 -        }\r
 -        else\r
 -        {\r
 -          closeView(alignPanel);\r
 -        }\r
 -      }\r
 -\r
 -      if (closeAllTabs)\r
 -      {\r
 -        this.setClosed(true);\r
 -      }\r
 -    } catch (Exception ex)\r
 -    {\r
 -      ex.printStackTrace();\r
 -    }\r
 -  }\r
 -\r
 -  /**\r
 -   * close alignPanel2 and shuffle tabs appropriately.\r
 -   * \r
 -   * @param alignPanel2\r
 -   */\r
 -  public void closeView(AlignmentPanel alignPanel2)\r
 -  {\r
 -    int index = tabbedPane.getSelectedIndex();\r
 -    int closedindex = tabbedPane.indexOfComponent(alignPanel2);\r
 -    alignPanels.removeElement(alignPanel2);\r
 -    // Unnecessary\r
 -    // if (viewport == alignPanel2.av)\r
 -    // {\r
 -    // viewport = null;\r
 -    // }\r
 -    alignPanel2.closePanel();\r
 -    alignPanel2 = null;\r
 -\r
 -    tabbedPane.removeTabAt(closedindex);\r
 -    tabbedPane.validate();\r
 -\r
 -    if (index > closedindex || index == tabbedPane.getTabCount())\r
 -    {\r
 -      // modify currently selected tab index if necessary.\r
 -      index--;\r
 -    }\r
 -\r
 -    this.tabSelectionChanged(index);\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   */\r
 -  void updateEditMenuBar()\r
 -  {\r
 -\r
 -    if (viewport.historyList.size() > 0)\r
 -    {\r
 -      undoMenuItem.setEnabled(true);\r
 -      CommandI command = (CommandI) viewport.historyList.peek();\r
 -      undoMenuItem.setText(MessageManager.formatMessage("label.undo_command", new String[]{command.getDescription()}));\r
 -    }\r
 -    else\r
 -    {\r
 -      undoMenuItem.setEnabled(false);\r
 -      undoMenuItem.setText(MessageManager.getString("action.undo"));\r
 -    }\r
 -\r
 -    if (viewport.redoList.size() > 0)\r
 -    {\r
 -      redoMenuItem.setEnabled(true);\r
 -\r
 -      CommandI command = (CommandI) viewport.redoList.peek();\r
 -      redoMenuItem.setText(MessageManager.formatMessage("label.redo_command", new String[]{command.getDescription()}));\r
 -    }\r
 -    else\r
 -    {\r
 -      redoMenuItem.setEnabled(false);\r
 -      redoMenuItem.setText(MessageManager.getString("action.redo"));\r
 -    }\r
 -  }\r
 -\r
 -  public void addHistoryItem(CommandI command)\r
 -  {\r
 -    if (command.getSize() > 0)\r
 -    {\r
 -      viewport.historyList.push(command);\r
 -      viewport.redoList.clear();\r
 -      updateEditMenuBar();\r
 -      viewport.updateHiddenColumns();\r
 -      // viewport.hasHiddenColumns = (viewport.getColumnSelection() != null\r
 -      // && viewport.getColumnSelection().getHiddenColumns() != null &&\r
 -      // viewport.getColumnSelection()\r
 -      // .getHiddenColumns().size() > 0);\r
 -    }\r
 -  }\r
 -\r
 -  /**\r
 -   * \r
 -   * @return alignment objects for all views\r
 -   */\r
 -  AlignmentI[] getViewAlignments()\r
 -  {\r
 -    if (alignPanels != null)\r
 -    {\r
 -      Enumeration e = alignPanels.elements();\r
 -      AlignmentI[] als = new AlignmentI[alignPanels.size()];\r
 -      for (int i = 0; e.hasMoreElements(); i++)\r
 -      {\r
 -        als[i] = ((AlignmentPanel) e.nextElement()).av.getAlignment();\r
 -      }\r
 -      return als;\r
 -    }\r
 -    if (viewport != null)\r
 -    {\r
 -      return new AlignmentI[]\r
 -      { viewport.getAlignment() };\r
 -    }\r
 -    return null;\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  protected void undoMenuItem_actionPerformed(ActionEvent e)\r
 -  {\r
 -    if (viewport.historyList.empty())\r
 -      return;\r
 -    CommandI command = (CommandI) viewport.historyList.pop();\r
 -    viewport.redoList.push(command);\r
 -    command.undoCommand(getViewAlignments());\r
 -\r
 -    AlignViewport originalSource = getOriginatingSource(command);\r
 -    updateEditMenuBar();\r
 -\r
 -    if (originalSource != null)\r
 -    {\r
 -      if (originalSource != viewport)\r
 -      {\r
 -        Cache.log\r
 -                .warn("Implementation worry: mismatch of viewport origin for undo");\r
 -      }\r
 -      originalSource.updateHiddenColumns();\r
 -      // originalSource.hasHiddenColumns = (viewport.getColumnSelection() !=\r
 -      // null\r
 -      // && viewport.getColumnSelection().getHiddenColumns() != null &&\r
 -      // viewport.getColumnSelection()\r
 -      // .getHiddenColumns().size() > 0);\r
 -      originalSource.firePropertyChange("alignment", null, originalSource\r
 -              .getAlignment().getSequences());\r
 -    }\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  protected void redoMenuItem_actionPerformed(ActionEvent e)\r
 -  {\r
 -    if (viewport.redoList.size() < 1)\r
 -    {\r
 -      return;\r
 -    }\r
 -\r
 -    CommandI command = (CommandI) viewport.redoList.pop();\r
 -    viewport.historyList.push(command);\r
 -    command.doCommand(getViewAlignments());\r
 -\r
 -    AlignViewport originalSource = getOriginatingSource(command);\r
 -    updateEditMenuBar();\r
 -\r
 -    if (originalSource != null)\r
 -    {\r
 -\r
 -      if (originalSource != viewport)\r
 -      {\r
 -        Cache.log\r
 -                .warn("Implementation worry: mismatch of viewport origin for redo");\r
 -      }\r
 -      originalSource.updateHiddenColumns();\r
 -      // originalSource.hasHiddenColumns = (viewport.getColumnSelection() !=\r
 -      // null\r
 -      // && viewport.getColumnSelection().getHiddenColumns() != null &&\r
 -      // viewport.getColumnSelection()\r
 -      // .getHiddenColumns().size() > 0);\r
 -      originalSource.firePropertyChange("alignment", null, originalSource\r
 -              .getAlignment().getSequences());\r
 -    }\r
 -  }\r
 -\r
 -  AlignViewport getOriginatingSource(CommandI command)\r
 -  {\r
 -    AlignViewport originalSource = null;\r
 -    // For sequence removal and addition, we need to fire\r
 -    // the property change event FROM the viewport where the\r
 -    // original alignment was altered\r
 -    AlignmentI al = null;\r
 -    if (command instanceof EditCommand)\r
 -    {\r
 -      EditCommand editCommand = (EditCommand) command;\r
 -      al = editCommand.getAlignment();\r
 -      Vector comps = (Vector) PaintRefresher.components.get(viewport\r
 -              .getSequenceSetId());\r
 -\r
 -      for (int i = 0; i < comps.size(); i++)\r
 -      {\r
 -        if (comps.elementAt(i) instanceof AlignmentPanel)\r
 -        {\r
 -          if (al == ((AlignmentPanel) comps.elementAt(i)).av.getAlignment())\r
 -          {\r
 -            originalSource = ((AlignmentPanel) comps.elementAt(i)).av;\r
 -            break;\r
 -          }\r
 -        }\r
 -      }\r
 -    }\r
 -\r
 -    if (originalSource == null)\r
 -    {\r
 -      // The original view is closed, we must validate\r
 -      // the current view against the closed view first\r
 -      if (al != null)\r
 -      {\r
 -        PaintRefresher.validateSequences(al, viewport.getAlignment());\r
 -      }\r
 -\r
 -      originalSource = viewport;\r
 -    }\r
 -\r
 -    return originalSource;\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param up\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  public void moveSelectedSequences(boolean up)\r
 -  {\r
 -    SequenceGroup sg = viewport.getSelectionGroup();\r
 -\r
 -    if (sg == null)\r
 -    {\r
 -      return;\r
 -    }\r
 -    viewport.getAlignment().moveSelectedSequencesByOne(sg,\r
 -            viewport.getHiddenRepSequences(), up);\r
 -    alignPanel.paintAlignment(true);\r
 -  }\r
 -\r
 -  synchronized void slideSequences(boolean right, int size)\r
 -  {\r
 -    List<SequenceI> sg = new Vector();\r
 -    if (viewport.cursorMode)\r
 -    {\r
 -      sg.add(viewport.getAlignment().getSequenceAt(\r
 -              alignPanel.seqPanel.seqCanvas.cursorY));\r
 -    }\r
 -    else if (viewport.getSelectionGroup() != null\r
 -            && viewport.getSelectionGroup().getSize() != viewport\r
 -                    .getAlignment().getHeight())\r
 -    {\r
 -      sg = viewport.getSelectionGroup().getSequences(\r
 -              viewport.getHiddenRepSequences());\r
 -    }\r
 -\r
 -    if (sg.size() < 1)\r
 -    {\r
 -      return;\r
 -    }\r
 -\r
 -    Vector invertGroup = new Vector();\r
 -\r
 -    for (int i = 0; i < viewport.getAlignment().getHeight(); i++)\r
 -    {\r
 -      if (!sg.contains(viewport.getAlignment().getSequenceAt(i)))\r
 -        invertGroup.add(viewport.getAlignment().getSequenceAt(i));\r
 -    }\r
 -\r
 -    SequenceI[] seqs1 = sg.toArray(new SequenceI[0]);\r
 -\r
 -    SequenceI[] seqs2 = new SequenceI[invertGroup.size()];\r
 -    for (int i = 0; i < invertGroup.size(); i++)\r
 -      seqs2[i] = (SequenceI) invertGroup.elementAt(i);\r
 -\r
 -    SlideSequencesCommand ssc;\r
 -    if (right)\r
 -      ssc = new SlideSequencesCommand("Slide Sequences", seqs2, seqs1,\r
 -              size, viewport.getGapCharacter());\r
 -    else\r
 -      ssc = new SlideSequencesCommand("Slide Sequences", seqs1, seqs2,\r
 -              size, viewport.getGapCharacter());\r
 -\r
 -    int groupAdjustment = 0;\r
 -    if (ssc.getGapsInsertedBegin() && right)\r
 -    {\r
 -      if (viewport.cursorMode)\r
 -        alignPanel.seqPanel.moveCursor(size, 0);\r
 -      else\r
 -        groupAdjustment = size;\r
 -    }\r
 -    else if (!ssc.getGapsInsertedBegin() && !right)\r
 -    {\r
 -      if (viewport.cursorMode)\r
 -        alignPanel.seqPanel.moveCursor(-size, 0);\r
 -      else\r
 -        groupAdjustment = -size;\r
 -    }\r
 -\r
 -    if (groupAdjustment != 0)\r
 -    {\r
 -      viewport.getSelectionGroup().setStartRes(\r
 -              viewport.getSelectionGroup().getStartRes() + groupAdjustment);\r
 -      viewport.getSelectionGroup().setEndRes(\r
 -              viewport.getSelectionGroup().getEndRes() + groupAdjustment);\r
 -    }\r
 -\r
 -    boolean appendHistoryItem = false;\r
 -    if (viewport.historyList != null && viewport.historyList.size() > 0\r
 -            && viewport.historyList.peek() instanceof SlideSequencesCommand)\r
 -    {\r
 -      appendHistoryItem = ssc\r
 -              .appendSlideCommand((SlideSequencesCommand) viewport.historyList\r
 -                      .peek());\r
 -    }\r
 -\r
 -    if (!appendHistoryItem)\r
 -      addHistoryItem(ssc);\r
 -\r
 -    repaint();\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  protected void copy_actionPerformed(ActionEvent e)\r
 -  {\r
 -    System.gc();\r
 -    if (viewport.getSelectionGroup() == null)\r
 -    {\r
 -      return;\r
 -    }\r
 -    // TODO: preserve the ordering of displayed alignment annotation in any\r
 -    // internal paste (particularly sequence associated annotation)\r
 -    SequenceI[] seqs = viewport.getSelectionAsNewSequence();\r
 -    String[] omitHidden = null;\r
 -\r
 -    if (viewport.hasHiddenColumns())\r
 -    {\r
 -      omitHidden = viewport.getViewAsString(true);\r
 -    }\r
 -\r
 -    String output = new FormatAdapter().formatSequences("Fasta", seqs,\r
 -            omitHidden);\r
 -\r
 -    StringSelection ss = new StringSelection(output);\r
 -\r
 -    try\r
 -    {\r
 -      jalview.gui.Desktop.internalCopy = true;\r
 -      // Its really worth setting the clipboard contents\r
 -      // to empty before setting the large StringSelection!!\r
 -      Toolkit.getDefaultToolkit().getSystemClipboard()\r
 -              .setContents(new StringSelection(""), null);\r
 -\r
 -      Toolkit.getDefaultToolkit().getSystemClipboard()\r
 -              .setContents(ss, Desktop.instance);\r
 -    } catch (OutOfMemoryError er)\r
 -    {\r
 -      new OOMWarning("copying region", er);\r
 -      return;\r
 -    }\r
 -\r
 -    Vector hiddenColumns = null;\r
 -    if (viewport.hasHiddenColumns())\r
 -    {\r
 -      hiddenColumns = new Vector();\r
 -      int hiddenOffset = viewport.getSelectionGroup().getStartRes(), hiddenCutoff = viewport\r
 -              .getSelectionGroup().getEndRes();\r
 -      for (int i = 0; i < viewport.getColumnSelection().getHiddenColumns()\r
 -              .size(); i++)\r
 -      {\r
 -        int[] region = (int[]) viewport.getColumnSelection()\r
 -                .getHiddenColumns().elementAt(i);\r
 -        if (region[0] >= hiddenOffset && region[1] <= hiddenCutoff)\r
 -        {\r
 -          hiddenColumns.addElement(new int[]\r
 -          { region[0] - hiddenOffset, region[1] - hiddenOffset });\r
 -        }\r
 -      }\r
 -    }\r
 -\r
 -    Desktop.jalviewClipboard = new Object[]\r
 -    { seqs, viewport.getAlignment().getDataset(), hiddenColumns };\r
 -    statusBar.setText(MessageManager.formatMessage("label.copied_sequences_to_clipboard", new String[]{Integer.valueOf(seqs.length).toString()}));\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  protected void pasteNew_actionPerformed(ActionEvent e)\r
 -  {\r
 -    paste(true);\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  protected void pasteThis_actionPerformed(ActionEvent e)\r
 -  {\r
 -    paste(false);\r
 -  }\r
 -\r
 -  /**\r
 -   * Paste contents of Jalview clipboard\r
 -   * \r
 -   * @param newAlignment\r
 -   *          true to paste to a new alignment, otherwise add to this.\r
 -   */\r
 -  void paste(boolean newAlignment)\r
 -  {\r
 -    boolean externalPaste = true;\r
 -    try\r
 -    {\r
 -      Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();\r
 -      Transferable contents = c.getContents(this);\r
 -\r
 -      if (contents == null)\r
 -      {\r
 -        return;\r
 -      }\r
 -\r
 -      String str, format;\r
 -      try\r
 -      {\r
 -        str = (String) contents.getTransferData(DataFlavor.stringFlavor);\r
 -        if (str.length() < 1)\r
 -        {\r
 -          return;\r
 -        }\r
 -\r
 -        format = new IdentifyFile().Identify(str, "Paste");\r
 -\r
 -      } catch (OutOfMemoryError er)\r
 -      {\r
 -        new OOMWarning("Out of memory pasting sequences!!", er);\r
 -        return;\r
 -      }\r
 -\r
 -      SequenceI[] sequences;\r
 -      boolean annotationAdded = false;\r
 -      AlignmentI alignment = null;\r
 -\r
 -      if (Desktop.jalviewClipboard != null)\r
 -      {\r
 -        // The clipboard was filled from within Jalview, we must use the\r
 -        // sequences\r
 -        // And dataset from the copied alignment\r
 -        SequenceI[] newseq = (SequenceI[]) Desktop.jalviewClipboard[0];\r
 -        // be doubly sure that we create *new* sequence objects.\r
 -        sequences = new SequenceI[newseq.length];\r
 -        for (int i = 0; i < newseq.length; i++)\r
 -        {\r
 -          sequences[i] = new Sequence(newseq[i]);\r
 -        }\r
 -        alignment = new Alignment(sequences);\r
 -        externalPaste = false;\r
 -      }\r
 -      else\r
 -      {\r
 -        // parse the clipboard as an alignment.\r
 -        alignment = new FormatAdapter().readFile(str, "Paste", format);\r
 -        sequences = alignment.getSequencesArray();\r
 -      }\r
 -\r
 -      int alwidth = 0;\r
 -      ArrayList<Integer> newGraphGroups = new ArrayList<Integer>();\r
 -      int fgroup = -1;\r
 -\r
 -      if (newAlignment)\r
 -      {\r
 -\r
 -        if (Desktop.jalviewClipboard != null)\r
 -        {\r
 -          // dataset is inherited\r
 -          alignment.setDataset((Alignment) Desktop.jalviewClipboard[1]);\r
 -        }\r
 -        else\r
 -        {\r
 -          // new dataset is constructed\r
 -          alignment.setDataset(null);\r
 -        }\r
 -        alwidth = alignment.getWidth() + 1;\r
 -      }\r
 -      else\r
 -      {\r
 -        AlignmentI pastedal = alignment; // preserve pasted alignment object\r
 -        // Add pasted sequences and dataset into existing alignment.\r
 -        alignment = viewport.getAlignment();\r
 -        alwidth = alignment.getWidth() + 1;\r
 -        // decide if we need to import sequences from an existing dataset\r
 -        boolean importDs = Desktop.jalviewClipboard != null\r
 -                && Desktop.jalviewClipboard[1] != alignment.getDataset();\r
 -        // importDs==true instructs us to copy over new dataset sequences from\r
 -        // an existing alignment\r
 -        Vector newDs = (importDs) ? new Vector() : null; // used to create\r
 -        // minimum dataset set\r
 -\r
 -        for (int i = 0; i < sequences.length; i++)\r
 -        {\r
 -          if (importDs)\r
 -          {\r
 -            newDs.addElement(null);\r
 -          }\r
 -          SequenceI ds = sequences[i].getDatasetSequence(); // null for a simple\r
 -          // paste\r
 -          if (importDs && ds != null)\r
 -          {\r
 -            if (!newDs.contains(ds))\r
 -            {\r
 -              newDs.setElementAt(ds, i);\r
 -              ds = new Sequence(ds);\r
 -              // update with new dataset sequence\r
 -              sequences[i].setDatasetSequence(ds);\r
 -            }\r
 -            else\r
 -            {\r
 -              ds = sequences[newDs.indexOf(ds)].getDatasetSequence();\r
 -            }\r
 -          }\r
 -          else\r
 -          {\r
 -            // copy and derive new dataset sequence\r
 -            sequences[i] = sequences[i].deriveSequence();\r
 -            alignment.getDataset().addSequence(\r
 -                    sequences[i].getDatasetSequence());\r
 -            // TODO: avoid creation of duplicate dataset sequences with a\r
 -            // 'contains' method using SequenceI.equals()/SequenceI.contains()\r
 -          }\r
 -          alignment.addSequence(sequences[i]); // merges dataset\r
 -        }\r
 -        if (newDs != null)\r
 -        {\r
 -          newDs.clear(); // tidy up\r
 -        }\r
 -        if (alignment.getAlignmentAnnotation() != null)\r
 -        {\r
 -          for (AlignmentAnnotation alan : alignment\r
 -                  .getAlignmentAnnotation())\r
 -          {\r
 -            if (alan.graphGroup > fgroup)\r
 -            {\r
 -              fgroup = alan.graphGroup;\r
 -            }\r
 -          }\r
 -        }\r
 -        if (pastedal.getAlignmentAnnotation() != null)\r
 -        {\r
 -          // Add any annotation attached to alignment.\r
 -          AlignmentAnnotation[] alann = pastedal.getAlignmentAnnotation();\r
 -          for (int i = 0; i < alann.length; i++)\r
 -          {\r
 -            annotationAdded = true;\r
 -            if (alann[i].sequenceRef == null && !alann[i].autoCalculated)\r
 -            {\r
 -              AlignmentAnnotation newann = new AlignmentAnnotation(alann[i]);\r
 -              if (newann.graphGroup > -1)\r
 -              {\r
 -                if (newGraphGroups.size() <= newann.graphGroup\r
 -                        || newGraphGroups.get(newann.graphGroup) == null)\r
 -                {\r
 -                  for (int q = newGraphGroups.size(); q <= newann.graphGroup; q++)\r
 -                  {\r
 -                    newGraphGroups.add(q, null);\r
 -                  }\r
 -                  newGraphGroups.set(newann.graphGroup, new Integer(\r
 -                          ++fgroup));\r
 -                }\r
 -                newann.graphGroup = newGraphGroups.get(newann.graphGroup)\r
 -                        .intValue();\r
 -              }\r
 -\r
 -              newann.padAnnotation(alwidth);\r
 -              alignment.addAnnotation(newann);\r
 -            }\r
 -          }\r
 -        }\r
 -      }\r
 -      if (!newAlignment)\r
 -      {\r
 -        // /////\r
 -        // ADD HISTORY ITEM\r
 -        //\r
 -        addHistoryItem(new EditCommand("Add sequences", EditCommand.PASTE,\r
 -                sequences, 0, alignment.getWidth(), alignment));\r
 -      }\r
 -      // Add any annotations attached to sequences\r
 -      for (int i = 0; i < sequences.length; i++)\r
 -      {\r
 -        if (sequences[i].getAnnotation() != null)\r
 -        {\r
 -          AlignmentAnnotation newann;\r
 -          for (int a = 0; a < sequences[i].getAnnotation().length; a++)\r
 -          {\r
 -            annotationAdded = true;\r
 -            newann = sequences[i].getAnnotation()[a];\r
 -            newann.adjustForAlignment();\r
 -            newann.padAnnotation(alwidth);\r
 -            if (newann.graphGroup > -1)\r
 -            {\r
 -              if (newann.graphGroup > -1)\r
 -              {\r
 -                if (newGraphGroups.size() <= newann.graphGroup\r
 -                        || newGraphGroups.get(newann.graphGroup) == null)\r
 -                {\r
 -                  for (int q = newGraphGroups.size(); q <= newann.graphGroup; q++)\r
 -                  {\r
 -                    newGraphGroups.add(q, null);\r
 -                  }\r
 -                  newGraphGroups.set(newann.graphGroup, new Integer(\r
 -                          ++fgroup));\r
 -                }\r
 -                newann.graphGroup = newGraphGroups.get(newann.graphGroup)\r
 -                        .intValue();\r
 -              }\r
 -            }\r
 -            alignment.addAnnotation(sequences[i].getAnnotation()[a]); // annotation\r
 -            // was\r
 -            // duplicated\r
 -            // earlier\r
 -            alignment\r
 -                    .setAnnotationIndex(sequences[i].getAnnotation()[a], a);\r
 -          }\r
 -        }\r
 -      }\r
 -      if (!newAlignment)\r
 -      {\r
 -\r
 -        // propagate alignment changed.\r
 -        viewport.setEndSeq(alignment.getHeight());\r
 -        if (annotationAdded)\r
 -        {\r
 -          // Duplicate sequence annotation in all views.\r
 -          AlignmentI[] alview = this.getViewAlignments();\r
 -          for (int i = 0; i < sequences.length; i++)\r
 -          {\r
 -            AlignmentAnnotation sann[] = sequences[i].getAnnotation();\r
 -            if (sann == null)\r
 -              continue;\r
 -            for (int avnum = 0; avnum < alview.length; avnum++)\r
 -            {\r
 -              if (alview[avnum] != alignment)\r
 -              {\r
 -                // duplicate in a view other than the one with input focus\r
 -                int avwidth = alview[avnum].getWidth() + 1;\r
 -                // this relies on sann being preserved after we\r
 -                // modify the sequence's annotation array for each duplication\r
 -                for (int a = 0; a < sann.length; a++)\r
 -                {\r
 -                  AlignmentAnnotation newann = new AlignmentAnnotation(\r
 -                          sann[a]);\r
 -                  sequences[i].addAlignmentAnnotation(newann);\r
 -                  newann.padAnnotation(avwidth);\r
 -                  alview[avnum].addAnnotation(newann); // annotation was\r
 -                  // duplicated earlier\r
 -                  // TODO JAL-1145 graphGroups are not updated for sequence\r
 -                  // annotation added to several views. This may cause\r
 -                  // strangeness\r
 -                  alview[avnum].setAnnotationIndex(newann, a);\r
 -                }\r
 -              }\r
 -            }\r
 -          }\r
 -          buildSortByAnnotationScoresMenu();\r
 -        }\r
 -        viewport.firePropertyChange("alignment", null,\r
 -                alignment.getSequences());\r
 -        if (alignPanels != null)\r
 -        {\r
 -          for (AlignmentPanel ap : ((Vector<AlignmentPanel>) alignPanels))\r
 -          {\r
 -            ap.validateAnnotationDimensions(false);\r
 -          }\r
 -        }\r
 -        else\r
 -        {\r
 -          alignPanel.validateAnnotationDimensions(false);\r
 -        }\r
 -\r
 -      }\r
 -      else\r
 -      {\r
 -        AlignFrame af = new AlignFrame(alignment, DEFAULT_WIDTH,\r
 -                DEFAULT_HEIGHT);\r
 -        String newtitle = new String("Copied sequences");\r
 -\r
 -        if (Desktop.jalviewClipboard != null\r
 -                && Desktop.jalviewClipboard[2] != null)\r
 -        {\r
 -          Vector hc = (Vector) Desktop.jalviewClipboard[2];\r
 -          for (int i = 0; i < hc.size(); i++)\r
 -          {\r
 -            int[] region = (int[]) hc.elementAt(i);\r
 -            af.viewport.hideColumns(region[0], region[1]);\r
 -          }\r
 -        }\r
 -\r
 -        // >>>This is a fix for the moment, until a better solution is\r
 -        // found!!<<<\r
 -        af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer()\r
 -                .transferSettings(\r
 -                        alignPanel.seqPanel.seqCanvas.getFeatureRenderer());\r
 -\r
 -        // TODO: maintain provenance of an alignment, rather than just make the\r
 -        // title a concatenation of operations.\r
 -        if (!externalPaste)\r
 -        {\r
 -          if (title.startsWith("Copied sequences"))\r
 -          {\r
 -            newtitle = title;\r
 -          }\r
 -          else\r
 -          {\r
 -            newtitle = newtitle.concat("- from " + title);\r
 -          }\r
 -        }\r
 -        else\r
 -        {\r
 -          newtitle = new String("Pasted sequences");\r
 -        }\r
 -\r
 -        Desktop.addInternalFrame(af, newtitle, DEFAULT_WIDTH,\r
 -                DEFAULT_HEIGHT);\r
 -\r
 -      }\r
 -\r
 -    } catch (Exception ex)\r
 -    {\r
 -      ex.printStackTrace();\r
 -      System.out.println("Exception whilst pasting: " + ex);\r
 -      // could be anything being pasted in here\r
 -    }\r
 -\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  protected void cut_actionPerformed(ActionEvent e)\r
 -  {\r
 -    copy_actionPerformed(null);\r
 -    delete_actionPerformed(null);\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  protected void delete_actionPerformed(ActionEvent evt)\r
 -  {\r
 -\r
 -    SequenceGroup sg = viewport.getSelectionGroup();\r
 -    if (sg == null)\r
 -    {\r
 -      return;\r
 -    }\r
 -\r
 -    Vector seqs = new Vector();\r
 -    SequenceI seq;\r
 -    for (int i = 0; i < sg.getSize(); i++)\r
 -    {\r
 -      seq = sg.getSequenceAt(i);\r
 -      seqs.addElement(seq);\r
 -    }\r
 -\r
 -    // If the cut affects all sequences, remove highlighted columns\r
 -    if (sg.getSize() == viewport.getAlignment().getHeight())\r
 -    {\r
 -      viewport.getColumnSelection().removeElements(sg.getStartRes(),\r
 -              sg.getEndRes() + 1);\r
 -    }\r
 -\r
 -    SequenceI[] cut = new SequenceI[seqs.size()];\r
 -    for (int i = 0; i < seqs.size(); i++)\r
 -    {\r
 -      cut[i] = (SequenceI) seqs.elementAt(i);\r
 -    }\r
 -\r
 -    /*\r
 -     * //ADD HISTORY ITEM\r
 -     */\r
 -    addHistoryItem(new EditCommand("Cut Sequences", EditCommand.CUT, cut,\r
 -            sg.getStartRes(), sg.getEndRes() - sg.getStartRes() + 1,\r
 -            viewport.getAlignment()));\r
 -\r
 -    viewport.setSelectionGroup(null);\r
 -    viewport.sendSelection();\r
 -    viewport.getAlignment().deleteGroup(sg);\r
 -\r
 -    viewport.firePropertyChange("alignment", null, viewport.getAlignment()\r
 -            .getSequences());\r
 -    if (viewport.getAlignment().getHeight() < 1)\r
 -    {\r
 -      try\r
 -      {\r
 -        this.setClosed(true);\r
 -      } catch (Exception ex)\r
 -      {\r
 -      }\r
 -    }\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  protected void deleteGroups_actionPerformed(ActionEvent e)\r
 -  {\r
 -    if (avc.deleteGroups()) {\r
 -      PaintRefresher.Refresh(this, viewport.getSequenceSetId());\r
 -      alignPanel.updateAnnotation();\r
 -      alignPanel.paintAlignment(true);\r
 -    }\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)\r
 -  {\r
 -    SequenceGroup sg = new SequenceGroup();\r
 -\r
 -    for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)\r
 -    {\r
 -      sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);\r
 -    }\r
 -\r
 -    sg.setEndRes(viewport.getAlignment().getWidth() - 1);\r
 -    viewport.setSelectionGroup(sg);\r
 -    viewport.sendSelection();\r
 -    alignPanel.paintAlignment(true);\r
 -    PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)\r
 -  {\r
 -    if (viewport.cursorMode)\r
 -    {\r
 -      alignPanel.seqPanel.keyboardNo1 = null;\r
 -      alignPanel.seqPanel.keyboardNo2 = null;\r
 -    }\r
 -    viewport.setSelectionGroup(null);\r
 -    viewport.getColumnSelection().clear();\r
 -    viewport.setSelectionGroup(null);\r
 -    alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);\r
 -    alignPanel.idPanel.idCanvas.searchResults = null;\r
 -    alignPanel.paintAlignment(true);\r
 -    PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());\r
 -    viewport.sendSelection();\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  public void invertSequenceMenuItem_actionPerformed(ActionEvent e)\r
 -  {\r
 -    SequenceGroup sg = viewport.getSelectionGroup();\r
 -\r
 -    if (sg == null)\r
 -    {\r
 -      selectAllSequenceMenuItem_actionPerformed(null);\r
 -\r
 -      return;\r
 -    }\r
 -\r
 -    for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)\r
 -    {\r
 -      sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);\r
 -    }\r
 -\r
 -    alignPanel.paintAlignment(true);\r
 -    PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());\r
 -    viewport.sendSelection();\r
 -  }\r
 -\r
 -  @Override\r
 -  public void invertColSel_actionPerformed(ActionEvent e)\r
 -  {\r
 -    viewport.invertColumnSelection();\r
 -    alignPanel.paintAlignment(true);\r
 -    viewport.sendSelection();\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  public void remove2LeftMenuItem_actionPerformed(ActionEvent e)\r
 -  {\r
 -    trimAlignment(true);\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  public void remove2RightMenuItem_actionPerformed(ActionEvent e)\r
 -  {\r
 -    trimAlignment(false);\r
 -  }\r
 -\r
 -  void trimAlignment(boolean trimLeft)\r
 -  {\r
 -    ColumnSelection colSel = viewport.getColumnSelection();\r
 -    int column;\r
 -\r
 -    if (colSel.size() > 0)\r
 -    {\r
 -      if (trimLeft)\r
 -      {\r
 -        column = colSel.getMin();\r
 -      }\r
 -      else\r
 -      {\r
 -        column = colSel.getMax();\r
 -      }\r
 -\r
 -      SequenceI[] seqs;\r
 -      if (viewport.getSelectionGroup() != null)\r
 -      {\r
 -        seqs = viewport.getSelectionGroup().getSequencesAsArray(\r
 -                viewport.getHiddenRepSequences());\r
 -      }\r
 -      else\r
 -      {\r
 -        seqs = viewport.getAlignment().getSequencesArray();\r
 -      }\r
 -\r
 -      TrimRegionCommand trimRegion;\r
 -      if (trimLeft)\r
 -      {\r
 -        trimRegion = new TrimRegionCommand("Remove Left",\r
 -                TrimRegionCommand.TRIM_LEFT, seqs, column,\r
 -                viewport.getAlignment(), viewport.getColumnSelection(),\r
 -                viewport.getSelectionGroup());\r
 -        viewport.setStartRes(0);\r
 -      }\r
 -      else\r
 -      {\r
 -        trimRegion = new TrimRegionCommand("Remove Right",\r
 -                TrimRegionCommand.TRIM_RIGHT, seqs, column,\r
 -                viewport.getAlignment(), viewport.getColumnSelection(),\r
 -                viewport.getSelectionGroup());\r
 -      }\r
 -\r
 -      statusBar.setText(MessageManager.formatMessage("label.removed_columns", new String[]{Integer.valueOf(trimRegion.getSize()).toString()}));\r
 -\r
 -      addHistoryItem(trimRegion);\r
 -\r
 -      for (SequenceGroup sg : viewport.getAlignment().getGroups())\r
 -      {\r
 -        if ((trimLeft && !sg.adjustForRemoveLeft(column))\r
 -                || (!trimLeft && !sg.adjustForRemoveRight(column)))\r
 -        {\r
 -          viewport.getAlignment().deleteGroup(sg);\r
 -        }\r
 -      }\r
 -\r
 -      viewport.firePropertyChange("alignment", null, viewport\r
 -              .getAlignment().getSequences());\r
 -    }\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)\r
 -  {\r
 -    int start = 0, end = viewport.getAlignment().getWidth() - 1;\r
 -\r
 -    SequenceI[] seqs;\r
 -    if (viewport.getSelectionGroup() != null)\r
 -    {\r
 -      seqs = viewport.getSelectionGroup().getSequencesAsArray(\r
 -              viewport.getHiddenRepSequences());\r
 -      start = viewport.getSelectionGroup().getStartRes();\r
 -      end = viewport.getSelectionGroup().getEndRes();\r
 -    }\r
 -    else\r
 -    {\r
 -      seqs = viewport.getAlignment().getSequencesArray();\r
 -    }\r
 -\r
 -    RemoveGapColCommand removeGapCols = new RemoveGapColCommand(\r
 -            "Remove Gapped Columns", seqs, start, end,\r
 -            viewport.getAlignment());\r
 -\r
 -    addHistoryItem(removeGapCols);\r
 -\r
 -    statusBar.setText(MessageManager.formatMessage("label.removed_empty_columns", new String[]{Integer.valueOf(removeGapCols.getSize()).toString()}));\r
 -\r
 -    // This is to maintain viewport position on first residue\r
 -    // of first sequence\r
 -    SequenceI seq = viewport.getAlignment().getSequenceAt(0);\r
 -    int startRes = seq.findPosition(viewport.startRes);\r
 -    // ShiftList shifts;\r
 -    // viewport.getAlignment().removeGaps(shifts=new ShiftList());\r
 -    // edit.alColumnChanges=shifts.getInverse();\r
 -    // if (viewport.hasHiddenColumns)\r
 -    // viewport.getColumnSelection().compensateForEdits(shifts);\r
 -    viewport.setStartRes(seq.findIndex(startRes) - 1);\r
 -    viewport.firePropertyChange("alignment", null, viewport.getAlignment()\r
 -            .getSequences());\r
 -\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)\r
 -  {\r
 -    int start = 0, end = viewport.getAlignment().getWidth() - 1;\r
 -\r
 -    SequenceI[] seqs;\r
 -    if (viewport.getSelectionGroup() != null)\r
 -    {\r
 -      seqs = viewport.getSelectionGroup().getSequencesAsArray(\r
 -              viewport.getHiddenRepSequences());\r
 -      start = viewport.getSelectionGroup().getStartRes();\r
 -      end = viewport.getSelectionGroup().getEndRes();\r
 -    }\r
 -    else\r
 -    {\r
 -      seqs = viewport.getAlignment().getSequencesArray();\r
 -    }\r
 -\r
 -    // This is to maintain viewport position on first residue\r
 -    // of first sequence\r
 -    SequenceI seq = viewport.getAlignment().getSequenceAt(0);\r
 -    int startRes = seq.findPosition(viewport.startRes);\r
 -\r
 -    addHistoryItem(new RemoveGapsCommand("Remove Gaps", seqs, start, end,\r
 -            viewport.getAlignment()));\r
 -\r
 -    viewport.setStartRes(seq.findIndex(startRes) - 1);\r
 -\r
 -    viewport.firePropertyChange("alignment", null, viewport.getAlignment()\r
 -            .getSequences());\r
 -\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  public void padGapsMenuitem_actionPerformed(ActionEvent e)\r
 -  {\r
 -    viewport.setPadGaps(padGapsMenuitem.isSelected());\r
 -    viewport.firePropertyChange("alignment", null, viewport.getAlignment()\r
 -            .getSequences());\r
 -  }\r
 -\r
 -  // else\r
 -  {\r
 -    // if (justifySeqs>0)\r
 -    {\r
 -      // alignment.justify(justifySeqs!=RIGHT_JUSTIFY);\r
 -    }\r
 -  }\r
 -\r
 -  // }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  public void findMenuItem_actionPerformed(ActionEvent e)\r
 -  {\r
 -    new Finder();\r
 -  }\r
 -\r
 -  @Override\r
 -  public void newView_actionPerformed(ActionEvent e)\r
 -  {\r
 -    newView(true);\r
 -  }\r
 -\r
 -  /**\r
 -   * \r
 -   * @param copyAnnotation\r
 -   *          if true then duplicate all annnotation, groups and settings\r
 -   * @return new alignment panel, already displayed.\r
 -   */\r
 -  public AlignmentPanel newView(boolean copyAnnotation)\r
 -  {\r
 -    return newView(null, copyAnnotation);\r
 -  }\r
 -\r
 -  /**\r
 -   * \r
 -   * @param viewTitle\r
 -   *          title of newly created view\r
 -   * @return new alignment panel, already displayed.\r
 -   */\r
 -  public AlignmentPanel newView(String viewTitle)\r
 -  {\r
 -    return newView(viewTitle, true);\r
 -  }\r
 -\r
 -  /**\r
 -   * \r
 -   * @param viewTitle\r
 -   *          title of newly created view\r
 -   * @param copyAnnotation\r
 -   *          if true then duplicate all annnotation, groups and settings\r
 -   * @return new alignment panel, already displayed.\r
 -   */\r
 -  public AlignmentPanel newView(String viewTitle, boolean copyAnnotation)\r
 -  {\r
 -    AlignmentPanel newap = new Jalview2XML().copyAlignPanel(alignPanel,\r
 -            true);\r
 -    if (!copyAnnotation)\r
 -    {\r
 -      // just remove all the current annotation except for the automatic stuff\r
 -      newap.av.getAlignment().deleteAllGroups();\r
 -      for (AlignmentAnnotation alan : newap.av.getAlignment()\r
 -              .getAlignmentAnnotation())\r
 -      {\r
 -        if (!alan.autoCalculated)\r
 -        {\r
 -          newap.av.getAlignment().deleteAnnotation(alan);\r
 -        }\r
 -        ;\r
 -      }\r
 -    }\r
 -\r
 -    newap.av.gatherViewsHere = false;\r
 -\r
 -    if (viewport.viewName == null)\r
 -    {\r
 -      viewport.viewName = "Original";\r
 -    }\r
 -\r
 -    newap.av.historyList = viewport.historyList;\r
 -    newap.av.redoList = viewport.redoList;\r
 -\r
 -    int index = Desktop.getViewCount(viewport.getSequenceSetId());\r
 -    // make sure the new view has a unique name - this is essential for Jalview\r
 -    // 2 archives\r
 -    boolean addFirstIndex = false;\r
 -    if (viewTitle == null || viewTitle.trim().length() == 0)\r
 -    {\r
 -      viewTitle = "View";\r
 -      addFirstIndex = true;\r
 -    }\r
 -    else\r
 -    {\r
 -      index = 1;// we count from 1 if given a specific name\r
 -    }\r
 -    String newViewName = viewTitle + ((addFirstIndex) ? " " + index : "");\r
 -    Vector comps = (Vector) PaintRefresher.components.get(viewport\r
 -            .getSequenceSetId());\r
 -    Vector existingNames = new Vector();\r
 -    for (int i = 0; i < comps.size(); i++)\r
 -    {\r
 -      if (comps.elementAt(i) instanceof AlignmentPanel)\r
 -      {\r
 -        AlignmentPanel ap = (AlignmentPanel) comps.elementAt(i);\r
 -        if (!existingNames.contains(ap.av.viewName))\r
 -        {\r
 -          existingNames.addElement(ap.av.viewName);\r
 -        }\r
 -      }\r
 -    }\r
 -\r
 -    while (existingNames.contains(newViewName))\r
 -    {\r
 -      newViewName = viewTitle + " " + (++index);\r
 -    }\r
 -\r
 -    newap.av.viewName = newViewName;\r
 -\r
 -    addAlignmentPanel(newap, true);\r
 -    newap.alignmentChanged();\r
 -    \r
 -    if (alignPanels.size() == 2)\r
 -    {\r
 -      viewport.gatherViewsHere = true;\r
 -    }\r
 -    tabbedPane.setSelectedIndex(tabbedPane.getTabCount() - 1);\r
 -    return newap;\r
 -  }\r
 -\r
 -  @Override\r
 -  public void expandViews_actionPerformed(ActionEvent e)\r
 -  {\r
 -    Desktop.instance.explodeViews(this);\r
 -  }\r
 -\r
 -  @Override\r
 -  public void gatherViews_actionPerformed(ActionEvent e)\r
 -  {\r
 -    Desktop.instance.gatherViews(this);\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  public void font_actionPerformed(ActionEvent e)\r
 -  {\r
 -    new FontChooser(alignPanel);\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  protected void seqLimit_actionPerformed(ActionEvent e)\r
 -  {\r
 -    viewport.setShowJVSuffix(seqLimits.isSelected());\r
 -\r
 -    alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel\r
 -            .calculateIdWidth());\r
 -    alignPanel.paintAlignment(true);\r
 -  }\r
 -\r
 -  @Override\r
 -  public void idRightAlign_actionPerformed(ActionEvent e)\r
 -  {\r
 -    viewport.rightAlignIds = idRightAlign.isSelected();\r
 -    alignPanel.paintAlignment(true);\r
 -  }\r
 -\r
 -  @Override\r
 -  public void centreColumnLabels_actionPerformed(ActionEvent e)\r
 -  {\r
 -    viewport.centreColumnLabels = centreColumnLabelsMenuItem.getState();\r
 -    alignPanel.paintAlignment(true);\r
 -  }\r
 -\r
 -  /*\r
 -   * (non-Javadoc)\r
 -   * \r
 -   * @see jalview.jbgui.GAlignFrame#followHighlight_actionPerformed()\r
 -   */\r
 -  @Override\r
 -  protected void followHighlight_actionPerformed()\r
 -  {\r
 -    if (viewport.followHighlight = this.followHighlightMenuItem.getState())\r
 -    {\r
 -      alignPanel.scrollToPosition(\r
 -              alignPanel.seqPanel.seqCanvas.searchResults, false);\r
 -    }\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  protected void colourTextMenuItem_actionPerformed(ActionEvent e)\r
 -  {\r
 -    viewport.setColourText(colourTextMenuItem.isSelected());\r
 -    alignPanel.paintAlignment(true);\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  public void wrapMenuItem_actionPerformed(ActionEvent e)\r
 -  {\r
 -    scaleAbove.setVisible(wrapMenuItem.isSelected());\r
 -    scaleLeft.setVisible(wrapMenuItem.isSelected());\r
 -    scaleRight.setVisible(wrapMenuItem.isSelected());\r
 -    viewport.setWrapAlignment(wrapMenuItem.isSelected());\r
 -    alignPanel.setWrapAlignment(wrapMenuItem.isSelected());\r
 -  }\r
 -\r
 -  @Override\r
 -  public void showAllSeqs_actionPerformed(ActionEvent e)\r
 -  {\r
 -    viewport.showAllHiddenSeqs();\r
 -  }\r
 -\r
 -  @Override\r
 -  public void showAllColumns_actionPerformed(ActionEvent e)\r
 -  {\r
 -    viewport.showAllHiddenColumns();\r
 -    repaint();\r
 -  }\r
 -\r
 -  @Override\r
 -  public void hideSelSequences_actionPerformed(ActionEvent e)\r
 -  {\r
 -    viewport.hideAllSelectedSeqs();\r
 -    alignPanel.paintAlignment(true);\r
 -  }\r
 -\r
 -  /**\r
 -   * called by key handler and the hide all/show all menu items\r
 -   * \r
 -   * @param toggleSeqs\r
 -   * @param toggleCols\r
 -   */\r
 -  private void toggleHiddenRegions(boolean toggleSeqs, boolean toggleCols)\r
 -  {\r
 -\r
 -    boolean hide = false;\r
 -    SequenceGroup sg = viewport.getSelectionGroup();\r
 -    if (!toggleSeqs && !toggleCols)\r
 -    {\r
 -      // Hide everything by the current selection - this is a hack - we do the\r
 -      // invert and then hide\r
 -      // first check that there will be visible columns after the invert.\r
 -      if ((viewport.getColumnSelection() != null\r
 -              && viewport.getColumnSelection().getSelected() != null && viewport\r
 -              .getColumnSelection().getSelected().size() > 0)\r
 -              || (sg != null && sg.getSize() > 0 && sg.getStartRes() <= sg\r
 -                      .getEndRes()))\r
 -      {\r
 -        // now invert the sequence set, if required - empty selection implies\r
 -        // that no hiding is required.\r
 -        if (sg != null)\r
 -        {\r
 -          invertSequenceMenuItem_actionPerformed(null);\r
 -          sg = viewport.getSelectionGroup();\r
 -          toggleSeqs = true;\r
 -\r
 -        }\r
 -        viewport.expandColSelection(sg, true);\r
 -        // finally invert the column selection and get the new sequence\r
 -        // selection.\r
 -        invertColSel_actionPerformed(null);\r
 -        toggleCols = true;\r
 -      }\r
 -    }\r
 -\r
 -    if (toggleSeqs)\r
 -    {\r
 -      if (sg != null && sg.getSize() != viewport.getAlignment().getHeight())\r
 -      {\r
 -        hideSelSequences_actionPerformed(null);\r
 -        hide = true;\r
 -      }\r
 -      else if (!(toggleCols && viewport.getColumnSelection().getSelected()\r
 -              .size() > 0))\r
 -      {\r
 -        showAllSeqs_actionPerformed(null);\r
 -      }\r
 -    }\r
 -\r
 -    if (toggleCols)\r
 -    {\r
 -      if (viewport.getColumnSelection().getSelected().size() > 0)\r
 -      {\r
 -        hideSelColumns_actionPerformed(null);\r
 -        if (!toggleSeqs)\r
 -        {\r
 -          viewport.setSelectionGroup(sg);\r
 -        }\r
 -      }\r
 -      else if (!hide)\r
 -      {\r
 -        showAllColumns_actionPerformed(null);\r
 -      }\r
 -    }\r
 -  }\r
 -\r
 -  /*\r
 -   * (non-Javadoc)\r
 -   * \r
 -   * @see\r
 -   * jalview.jbgui.GAlignFrame#hideAllButSelection_actionPerformed(java.awt.\r
 -   * event.ActionEvent)\r
 -   */\r
 -  @Override\r
 -  public void hideAllButSelection_actionPerformed(ActionEvent e)\r
 -  {\r
 -    toggleHiddenRegions(false, false);\r
 -  }\r
 -\r
 -  /*\r
 -   * (non-Javadoc)\r
 -   * \r
 -   * @see\r
 -   * jalview.jbgui.GAlignFrame#hideAllSelection_actionPerformed(java.awt.event\r
 -   * .ActionEvent)\r
 -   */\r
 -  @Override\r
 -  public void hideAllSelection_actionPerformed(ActionEvent e)\r
 -  {\r
 -    SequenceGroup sg = viewport.getSelectionGroup();\r
 -    viewport.expandColSelection(sg, false);\r
 -    viewport.hideAllSelectedSeqs();\r
 -    viewport.hideSelectedColumns();\r
 -    alignPanel.paintAlignment(true);\r
 -  }\r
 -\r
 -  /*\r
 -   * (non-Javadoc)\r
 -   * \r
 -   * @see\r
 -   * jalview.jbgui.GAlignFrame#showAllhidden_actionPerformed(java.awt.event.\r
 -   * ActionEvent)\r
 -   */\r
 -  @Override\r
 -  public void showAllhidden_actionPerformed(ActionEvent e)\r
 -  {\r
 -    viewport.showAllHiddenColumns();\r
 -    viewport.showAllHiddenSeqs();\r
 -    alignPanel.paintAlignment(true);\r
 -  }\r
 -\r
 -  @Override\r
 -  public void hideSelColumns_actionPerformed(ActionEvent e)\r
 -  {\r
 -    viewport.hideSelectedColumns();\r
 -    alignPanel.paintAlignment(true);\r
 -  }\r
 -\r
 -  @Override\r
 -  public void hiddenMarkers_actionPerformed(ActionEvent e)\r
 -  {\r
 -    viewport.setShowHiddenMarkers(hiddenMarkers.isSelected());\r
 -    repaint();\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  protected void scaleAbove_actionPerformed(ActionEvent e)\r
 -  {\r
 -    viewport.setScaleAboveWrapped(scaleAbove.isSelected());\r
 -    alignPanel.paintAlignment(true);\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  protected void scaleLeft_actionPerformed(ActionEvent e)\r
 -  {\r
 -    viewport.setScaleLeftWrapped(scaleLeft.isSelected());\r
 -    alignPanel.paintAlignment(true);\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  protected void scaleRight_actionPerformed(ActionEvent e)\r
 -  {\r
 -    viewport.setScaleRightWrapped(scaleRight.isSelected());\r
 -    alignPanel.paintAlignment(true);\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  public void viewBoxesMenuItem_actionPerformed(ActionEvent e)\r
 -  {\r
 -    viewport.setShowBoxes(viewBoxesMenuItem.isSelected());\r
 -    alignPanel.paintAlignment(true);\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  public void viewTextMenuItem_actionPerformed(ActionEvent e)\r
 -  {\r
 -    viewport.setShowText(viewTextMenuItem.isSelected());\r
 -    alignPanel.paintAlignment(true);\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  protected void renderGapsMenuItem_actionPerformed(ActionEvent e)\r
 -  {\r
 -    viewport.setRenderGaps(renderGapsMenuItem.isSelected());\r
 -    alignPanel.paintAlignment(true);\r
 -  }\r
 -\r
 -  public FeatureSettings featureSettings;\r
 -\r
 -  @Override\r
 -  public void featureSettings_actionPerformed(ActionEvent e)\r
 -  {\r
 -    if (featureSettings != null)\r
 -    {\r
 -      featureSettings.close();\r
 -      featureSettings = null;\r
 -    }\r
 -    if (!showSeqFeatures.isSelected())\r
 -    {\r
 -      // make sure features are actually displayed\r
 -      showSeqFeatures.setSelected(true);\r
 -      showSeqFeatures_actionPerformed(null);\r
 -    }\r
 -    featureSettings = new FeatureSettings(this);\r
 -  }\r
 -\r
 -  /**\r
 -   * Set or clear 'Show Sequence Features'\r
 -   * \r
 -   * @param evt\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  public void showSeqFeatures_actionPerformed(ActionEvent evt)\r
 -  {\r
 -    viewport.setShowSequenceFeatures(showSeqFeatures.isSelected());\r
 -    alignPanel.paintAlignment(true);\r
 -    if (alignPanel.getOverviewPanel() != null)\r
 -    {\r
 -      alignPanel.getOverviewPanel().updateOverviewImage();\r
 -    }\r
 -  }\r
 -\r
 -  /**\r
 -   * Set or clear 'Show Sequence Features'\r
 -   * \r
 -   * @param evt\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  public void showSeqFeaturesHeight_actionPerformed(ActionEvent evt)\r
 -  {\r
 -    viewport.setShowSequenceFeaturesHeight(showSeqFeaturesHeight\r
 -            .isSelected());\r
 -    if (viewport.getShowSequenceFeaturesHeight())\r
 -    {\r
 -      // ensure we're actually displaying features\r
 -      viewport.setShowSequenceFeatures(true);\r
 -      showSeqFeatures.setSelected(true);\r
 -    }\r
 -    alignPanel.paintAlignment(true);\r
 -    if (alignPanel.getOverviewPanel() != null)\r
 -    {\r
 -      alignPanel.getOverviewPanel().updateOverviewImage();\r
 -    }\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  public void annotationPanelMenuItem_actionPerformed(ActionEvent e)\r
 -  {\r
 -    viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());\r
 -    alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());\r
 -  }\r
 -\r
 -  @Override\r
 -  public void alignmentProperties()\r
 -  {\r
 -    JEditorPane editPane = new JEditorPane("text/html", "");\r
 -    editPane.setEditable(false);\r
 -    StringBuffer contents = new AlignmentProperties(viewport.getAlignment())\r
 -            .formatAsHtml();\r
 -    editPane.setText(MessageManager.formatMessage("label.html_content", new String[]{contents.toString()}));\r
 -    JInternalFrame frame = new JInternalFrame();\r
 -    frame.getContentPane().add(new JScrollPane(editPane));\r
 -\r
 +
 +    int value = chooser.showOpenDialog(null);
 +
 +    if (value == JalviewFileChooser.APPROVE_OPTION)
 +    {
 +      String choice = chooser.getSelectedFile().getPath();
 +      jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
 +      loadJalviewDataFile(choice, null, null, null);
 +    }
 +
 +  }
 +
 +  /**
 +   * Close the current view or all views in the alignment frame. If the frame
 +   * only contains one view then the alignment will be removed from memory.
 +   * 
 +   * @param closeAllTabs
 +   */
 +  @Override
 +  public void closeMenuItem_actionPerformed(boolean closeAllTabs)
 +  {
 +    if (alignPanels != null && alignPanels.size() < 2)
 +    {
 +      closeAllTabs = true;
 +    }
 +
 +    try
 +    {
 +      if (alignPanels != null)
 +      {
 +        if (closeAllTabs)
 +        {
 +          if (this.isClosed())
 +          {
 +            // really close all the windows - otherwise wait till
 +            // setClosed(true) is called
 +            for (int i = 0; i < alignPanels.size(); i++)
 +            {
 +              AlignmentPanel ap = (AlignmentPanel) alignPanels.elementAt(i);
 +              ap.closePanel();
 +            }
 +          }
 +        }
 +        else
 +        {
 +          closeView(alignPanel);
 +        }
 +      }
 +
 +      if (closeAllTabs)
 +      {
 +        this.setClosed(true);
 +      }
 +    } catch (Exception ex)
 +    {
 +      ex.printStackTrace();
 +    }
 +  }
 +
 +  /**
 +   * close alignPanel2 and shuffle tabs appropriately.
 +   * 
 +   * @param alignPanel2
 +   */
 +  public void closeView(AlignmentPanel alignPanel2)
 +  {
 +    int index = tabbedPane.getSelectedIndex();
 +    int closedindex = tabbedPane.indexOfComponent(alignPanel2);
 +    alignPanels.removeElement(alignPanel2);
 +    // Unnecessary
 +    // if (viewport == alignPanel2.av)
 +    // {
 +    // viewport = null;
 +    // }
 +    alignPanel2.closePanel();
 +    alignPanel2 = null;
 +
 +    tabbedPane.removeTabAt(closedindex);
 +    tabbedPane.validate();
 +
 +    if (index > closedindex || index == tabbedPane.getTabCount())
 +    {
 +      // modify currently selected tab index if necessary.
 +      index--;
 +    }
 +
 +    this.tabSelectionChanged(index);
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   */
 +  void updateEditMenuBar()
 +  {
 +
 +    if (viewport.historyList.size() > 0)
 +    {
 +      undoMenuItem.setEnabled(true);
 +      CommandI command = (CommandI) viewport.historyList.peek();
 +      undoMenuItem.setText(MessageManager.formatMessage("label.undo_command", new String[]{command.getDescription()}));
 +    }
 +    else
 +    {
 +      undoMenuItem.setEnabled(false);
 +      undoMenuItem.setText(MessageManager.getString("action.undo"));
 +    }
 +
 +    if (viewport.redoList.size() > 0)
 +    {
 +      redoMenuItem.setEnabled(true);
 +
 +      CommandI command = (CommandI) viewport.redoList.peek();
 +      redoMenuItem.setText(MessageManager.formatMessage("label.redo_command", new String[]{command.getDescription()}));
 +    }
 +    else
 +    {
 +      redoMenuItem.setEnabled(false);
 +      redoMenuItem.setText(MessageManager.getString("action.redo"));
 +    }
 +  }
 +
 +  public void addHistoryItem(CommandI command)
 +  {
 +    if (command.getSize() > 0)
 +    {
 +      viewport.historyList.push(command);
 +      viewport.redoList.clear();
 +      updateEditMenuBar();
 +      viewport.updateHiddenColumns();
 +      // viewport.hasHiddenColumns = (viewport.getColumnSelection() != null
 +      // && viewport.getColumnSelection().getHiddenColumns() != null &&
 +      // viewport.getColumnSelection()
 +      // .getHiddenColumns().size() > 0);
 +    }
 +  }
 +
 +  /**
 +   * 
 +   * @return alignment objects for all views
 +   */
 +  AlignmentI[] getViewAlignments()
 +  {
 +    if (alignPanels != null)
 +    {
 +      Enumeration e = alignPanels.elements();
 +      AlignmentI[] als = new AlignmentI[alignPanels.size()];
 +      for (int i = 0; e.hasMoreElements(); i++)
 +      {
 +        als[i] = ((AlignmentPanel) e.nextElement()).av.getAlignment();
 +      }
 +      return als;
 +    }
 +    if (viewport != null)
 +    {
 +      return new AlignmentI[]
 +      { viewport.getAlignment() };
 +    }
 +    return null;
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  protected void undoMenuItem_actionPerformed(ActionEvent e)
 +  {
 +    if (viewport.historyList.empty())
 +      return;
 +    CommandI command = (CommandI) viewport.historyList.pop();
 +    viewport.redoList.push(command);
 +    command.undoCommand(getViewAlignments());
 +
 +    AlignViewport originalSource = getOriginatingSource(command);
 +    updateEditMenuBar();
 +
 +    if (originalSource != null)
 +    {
 +      if (originalSource != viewport)
 +      {
 +        Cache.log
 +                .warn("Implementation worry: mismatch of viewport origin for undo");
 +      }
 +      originalSource.updateHiddenColumns();
 +      // originalSource.hasHiddenColumns = (viewport.getColumnSelection() !=
 +      // null
 +      // && viewport.getColumnSelection().getHiddenColumns() != null &&
 +      // viewport.getColumnSelection()
 +      // .getHiddenColumns().size() > 0);
 +      originalSource.firePropertyChange("alignment", null, originalSource
 +              .getAlignment().getSequences());
 +    }
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  protected void redoMenuItem_actionPerformed(ActionEvent e)
 +  {
 +    if (viewport.redoList.size() < 1)
 +    {
 +      return;
 +    }
 +
 +    CommandI command = (CommandI) viewport.redoList.pop();
 +    viewport.historyList.push(command);
 +    command.doCommand(getViewAlignments());
 +
 +    AlignViewport originalSource = getOriginatingSource(command);
 +    updateEditMenuBar();
 +
 +    if (originalSource != null)
 +    {
 +
 +      if (originalSource != viewport)
 +      {
 +        Cache.log
 +                .warn("Implementation worry: mismatch of viewport origin for redo");
 +      }
 +      originalSource.updateHiddenColumns();
 +      // originalSource.hasHiddenColumns = (viewport.getColumnSelection() !=
 +      // null
 +      // && viewport.getColumnSelection().getHiddenColumns() != null &&
 +      // viewport.getColumnSelection()
 +      // .getHiddenColumns().size() > 0);
 +      originalSource.firePropertyChange("alignment", null, originalSource
 +              .getAlignment().getSequences());
 +    }
 +  }
 +
 +  AlignViewport getOriginatingSource(CommandI command)
 +  {
 +    AlignViewport originalSource = null;
 +    // For sequence removal and addition, we need to fire
 +    // the property change event FROM the viewport where the
 +    // original alignment was altered
 +    AlignmentI al = null;
 +    if (command instanceof EditCommand)
 +    {
 +      EditCommand editCommand = (EditCommand) command;
 +      al = editCommand.getAlignment();
 +      Vector comps = (Vector) PaintRefresher.components.get(viewport
 +              .getSequenceSetId());
 +
 +      for (int i = 0; i < comps.size(); i++)
 +      {
 +        if (comps.elementAt(i) instanceof AlignmentPanel)
 +        {
 +          if (al == ((AlignmentPanel) comps.elementAt(i)).av.getAlignment())
 +          {
 +            originalSource = ((AlignmentPanel) comps.elementAt(i)).av;
 +            break;
 +          }
 +        }
 +      }
 +    }
 +
 +    if (originalSource == null)
 +    {
 +      // The original view is closed, we must validate
 +      // the current view against the closed view first
 +      if (al != null)
 +      {
 +        PaintRefresher.validateSequences(al, viewport.getAlignment());
 +      }
 +
 +      originalSource = viewport;
 +    }
 +
 +    return originalSource;
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param up
 +   *          DOCUMENT ME!
 +   */
 +  public void moveSelectedSequences(boolean up)
 +  {
 +    SequenceGroup sg = viewport.getSelectionGroup();
 +
 +    if (sg == null)
 +    {
 +      return;
 +    }
 +    viewport.getAlignment().moveSelectedSequencesByOne(sg,
 +            viewport.getHiddenRepSequences(), up);
 +    alignPanel.paintAlignment(true);
 +  }
 +
 +  synchronized void slideSequences(boolean right, int size)
 +  {
 +    List<SequenceI> sg = new Vector();
 +    if (viewport.cursorMode)
 +    {
 +      sg.add(viewport.getAlignment().getSequenceAt(
 +              alignPanel.seqPanel.seqCanvas.cursorY));
 +    }
 +    else if (viewport.getSelectionGroup() != null
 +            && viewport.getSelectionGroup().getSize() != viewport
 +                    .getAlignment().getHeight())
 +    {
 +      sg = viewport.getSelectionGroup().getSequences(
 +              viewport.getHiddenRepSequences());
 +    }
 +
 +    if (sg.size() < 1)
 +    {
 +      return;
 +    }
 +
 +    Vector invertGroup = new Vector();
 +
 +    for (int i = 0; i < viewport.getAlignment().getHeight(); i++)
 +    {
 +      if (!sg.contains(viewport.getAlignment().getSequenceAt(i)))
 +        invertGroup.add(viewport.getAlignment().getSequenceAt(i));
 +    }
 +
 +    SequenceI[] seqs1 = sg.toArray(new SequenceI[0]);
 +
 +    SequenceI[] seqs2 = new SequenceI[invertGroup.size()];
 +    for (int i = 0; i < invertGroup.size(); i++)
 +      seqs2[i] = (SequenceI) invertGroup.elementAt(i);
 +
 +    SlideSequencesCommand ssc;
 +    if (right)
 +      ssc = new SlideSequencesCommand("Slide Sequences", seqs2, seqs1,
 +              size, viewport.getGapCharacter());
 +    else
 +      ssc = new SlideSequencesCommand("Slide Sequences", seqs1, seqs2,
 +              size, viewport.getGapCharacter());
 +
 +    int groupAdjustment = 0;
 +    if (ssc.getGapsInsertedBegin() && right)
 +    {
 +      if (viewport.cursorMode)
 +        alignPanel.seqPanel.moveCursor(size, 0);
 +      else
 +        groupAdjustment = size;
 +    }
 +    else if (!ssc.getGapsInsertedBegin() && !right)
 +    {
 +      if (viewport.cursorMode)
 +        alignPanel.seqPanel.moveCursor(-size, 0);
 +      else
 +        groupAdjustment = -size;
 +    }
 +
 +    if (groupAdjustment != 0)
 +    {
 +      viewport.getSelectionGroup().setStartRes(
 +              viewport.getSelectionGroup().getStartRes() + groupAdjustment);
 +      viewport.getSelectionGroup().setEndRes(
 +              viewport.getSelectionGroup().getEndRes() + groupAdjustment);
 +    }
 +
 +    boolean appendHistoryItem = false;
 +    if (viewport.historyList != null && viewport.historyList.size() > 0
 +            && viewport.historyList.peek() instanceof SlideSequencesCommand)
 +    {
 +      appendHistoryItem = ssc
 +              .appendSlideCommand((SlideSequencesCommand) viewport.historyList
 +                      .peek());
 +    }
 +
 +    if (!appendHistoryItem)
 +      addHistoryItem(ssc);
 +
 +    repaint();
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  protected void copy_actionPerformed(ActionEvent e)
 +  {
 +    System.gc();
 +    if (viewport.getSelectionGroup() == null)
 +    {
 +      return;
 +    }
 +    // TODO: preserve the ordering of displayed alignment annotation in any
 +    // internal paste (particularly sequence associated annotation)
 +    SequenceI[] seqs = viewport.getSelectionAsNewSequence();
 +    String[] omitHidden = null;
 +
 +    if (viewport.hasHiddenColumns())
 +    {
 +      omitHidden = viewport.getViewAsString(true);
 +    }
 +
 +    String output = new FormatAdapter().formatSequences("Fasta", seqs,
 +            omitHidden);
 +
 +    StringSelection ss = new StringSelection(output);
 +
 +    try
 +    {
 +      jalview.gui.Desktop.internalCopy = true;
 +      // Its really worth setting the clipboard contents
 +      // to empty before setting the large StringSelection!!
 +      Toolkit.getDefaultToolkit().getSystemClipboard()
 +              .setContents(new StringSelection(""), null);
 +
 +      Toolkit.getDefaultToolkit().getSystemClipboard()
 +              .setContents(ss, Desktop.instance);
 +    } catch (OutOfMemoryError er)
 +    {
 +      new OOMWarning("copying region", er);
 +      return;
 +    }
 +
 +    Vector hiddenColumns = null;
 +    if (viewport.hasHiddenColumns())
 +    {
 +      hiddenColumns = new Vector();
 +      int hiddenOffset = viewport.getSelectionGroup().getStartRes(), hiddenCutoff = viewport
 +              .getSelectionGroup().getEndRes();
 +      for (int i = 0; i < viewport.getColumnSelection().getHiddenColumns()
 +              .size(); i++)
 +      {
 +        int[] region = (int[]) viewport.getColumnSelection()
 +                .getHiddenColumns().elementAt(i);
 +        if (region[0] >= hiddenOffset && region[1] <= hiddenCutoff)
 +        {
 +          hiddenColumns.addElement(new int[]
 +          { region[0] - hiddenOffset, region[1] - hiddenOffset });
 +        }
 +      }
 +    }
 +
 +    Desktop.jalviewClipboard = new Object[]
 +    { seqs, viewport.getAlignment().getDataset(), hiddenColumns };
 +    statusBar.setText(MessageManager.formatMessage("label.copied_sequences_to_clipboard", new String[]{Integer.valueOf(seqs.length).toString()}));
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  protected void pasteNew_actionPerformed(ActionEvent e)
 +  {
 +    paste(true);
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  protected void pasteThis_actionPerformed(ActionEvent e)
 +  {
 +    paste(false);
 +  }
 +
 +  /**
 +   * Paste contents of Jalview clipboard
 +   * 
 +   * @param newAlignment
 +   *          true to paste to a new alignment, otherwise add to this.
 +   */
 +  void paste(boolean newAlignment)
 +  {
 +    boolean externalPaste = true;
 +    try
 +    {
 +      Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
 +      Transferable contents = c.getContents(this);
 +
 +      if (contents == null)
 +      {
 +        return;
 +      }
 +
 +      String str, format;
 +      try
 +      {
 +        str = (String) contents.getTransferData(DataFlavor.stringFlavor);
 +        if (str.length() < 1)
 +        {
 +          return;
 +        }
 +
 +        format = new IdentifyFile().Identify(str, "Paste");
 +
 +      } catch (OutOfMemoryError er)
 +      {
 +        new OOMWarning("Out of memory pasting sequences!!", er);
 +        return;
 +      }
 +
 +      SequenceI[] sequences;
 +      boolean annotationAdded = false;
 +      AlignmentI alignment = null;
 +
 +      if (Desktop.jalviewClipboard != null)
 +      {
 +        // The clipboard was filled from within Jalview, we must use the
 +        // sequences
 +        // And dataset from the copied alignment
 +        SequenceI[] newseq = (SequenceI[]) Desktop.jalviewClipboard[0];
 +        // be doubly sure that we create *new* sequence objects.
 +        sequences = new SequenceI[newseq.length];
 +        for (int i = 0; i < newseq.length; i++)
 +        {
 +          sequences[i] = new Sequence(newseq[i]);
 +        }
 +        alignment = new Alignment(sequences);
 +        externalPaste = false;
 +      }
 +      else
 +      {
 +        // parse the clipboard as an alignment.
 +        alignment = new FormatAdapter().readFile(str, "Paste", format);
 +        sequences = alignment.getSequencesArray();
 +      }
 +
 +      int alwidth = 0;
 +      ArrayList<Integer> newGraphGroups = new ArrayList<Integer>();
 +      int fgroup = -1;
 +
 +      if (newAlignment)
 +      {
 +
 +        if (Desktop.jalviewClipboard != null)
 +        {
 +          // dataset is inherited
 +          alignment.setDataset((Alignment) Desktop.jalviewClipboard[1]);
 +        }
 +        else
 +        {
 +          // new dataset is constructed
 +          alignment.setDataset(null);
 +        }
 +        alwidth = alignment.getWidth() + 1;
 +      }
 +      else
 +      {
 +        AlignmentI pastedal = alignment; // preserve pasted alignment object
 +        // Add pasted sequences and dataset into existing alignment.
 +        alignment = viewport.getAlignment();
 +        alwidth = alignment.getWidth() + 1;
 +        // decide if we need to import sequences from an existing dataset
 +        boolean importDs = Desktop.jalviewClipboard != null
 +                && Desktop.jalviewClipboard[1] != alignment.getDataset();
 +        // importDs==true instructs us to copy over new dataset sequences from
 +        // an existing alignment
 +        Vector newDs = (importDs) ? new Vector() : null; // used to create
 +        // minimum dataset set
 +
 +        for (int i = 0; i < sequences.length; i++)
 +        {
 +          if (importDs)
 +          {
 +            newDs.addElement(null);
 +          }
 +          SequenceI ds = sequences[i].getDatasetSequence(); // null for a simple
 +          // paste
 +          if (importDs && ds != null)
 +          {
 +            if (!newDs.contains(ds))
 +            {
 +              newDs.setElementAt(ds, i);
 +              ds = new Sequence(ds);
 +              // update with new dataset sequence
 +              sequences[i].setDatasetSequence(ds);
 +            }
 +            else
 +            {
 +              ds = sequences[newDs.indexOf(ds)].getDatasetSequence();
 +            }
 +          }
 +          else
 +          {
 +            // copy and derive new dataset sequence
 +            sequences[i] = sequences[i].deriveSequence();
 +            alignment.getDataset().addSequence(
 +                    sequences[i].getDatasetSequence());
 +            // TODO: avoid creation of duplicate dataset sequences with a
 +            // 'contains' method using SequenceI.equals()/SequenceI.contains()
 +          }
 +          alignment.addSequence(sequences[i]); // merges dataset
 +        }
 +        if (newDs != null)
 +        {
 +          newDs.clear(); // tidy up
 +        }
 +        if (alignment.getAlignmentAnnotation() != null)
 +        {
 +          for (AlignmentAnnotation alan : alignment
 +                  .getAlignmentAnnotation())
 +          {
 +            if (alan.graphGroup > fgroup)
 +            {
 +              fgroup = alan.graphGroup;
 +            }
 +          }
 +        }
 +        if (pastedal.getAlignmentAnnotation() != null)
 +        {
 +          // Add any annotation attached to alignment.
 +          AlignmentAnnotation[] alann = pastedal.getAlignmentAnnotation();
 +          for (int i = 0; i < alann.length; i++)
 +          {
 +            annotationAdded = true;
 +            if (alann[i].sequenceRef == null && !alann[i].autoCalculated)
 +            {
 +              AlignmentAnnotation newann = new AlignmentAnnotation(alann[i]);
 +              if (newann.graphGroup > -1)
 +              {
 +                if (newGraphGroups.size() <= newann.graphGroup
 +                        || newGraphGroups.get(newann.graphGroup) == null)
 +                {
 +                  for (int q = newGraphGroups.size(); q <= newann.graphGroup; q++)
 +                  {
 +                    newGraphGroups.add(q, null);
 +                  }
 +                  newGraphGroups.set(newann.graphGroup, new Integer(
 +                          ++fgroup));
 +                }
 +                newann.graphGroup = newGraphGroups.get(newann.graphGroup)
 +                        .intValue();
 +              }
 +
 +              newann.padAnnotation(alwidth);
 +              alignment.addAnnotation(newann);
 +            }
 +          }
 +        }
 +      }
 +      if (!newAlignment)
 +      {
 +        // /////
 +        // ADD HISTORY ITEM
 +        //
 +        addHistoryItem(new EditCommand("Add sequences", EditCommand.PASTE,
 +                sequences, 0, alignment.getWidth(), alignment));
 +      }
 +      // Add any annotations attached to sequences
 +      for (int i = 0; i < sequences.length; i++)
 +      {
 +        if (sequences[i].getAnnotation() != null)
 +        {
 +          AlignmentAnnotation newann;
 +          for (int a = 0; a < sequences[i].getAnnotation().length; a++)
 +          {
 +            annotationAdded = true;
 +            newann = sequences[i].getAnnotation()[a];
 +            newann.adjustForAlignment();
 +            newann.padAnnotation(alwidth);
 +            if (newann.graphGroup > -1)
 +            {
 +              if (newann.graphGroup > -1)
 +              {
 +                if (newGraphGroups.size() <= newann.graphGroup
 +                        || newGraphGroups.get(newann.graphGroup) == null)
 +                {
 +                  for (int q = newGraphGroups.size(); q <= newann.graphGroup; q++)
 +                  {
 +                    newGraphGroups.add(q, null);
 +                  }
 +                  newGraphGroups.set(newann.graphGroup, new Integer(
 +                          ++fgroup));
 +                }
 +                newann.graphGroup = newGraphGroups.get(newann.graphGroup)
 +                        .intValue();
 +              }
 +            }
 +            alignment.addAnnotation(sequences[i].getAnnotation()[a]); // annotation
 +            // was
 +            // duplicated
 +            // earlier
 +            alignment
 +                    .setAnnotationIndex(sequences[i].getAnnotation()[a], a);
 +          }
 +        }
 +      }
 +      if (!newAlignment)
 +      {
 +
 +        // propagate alignment changed.
 +        viewport.setEndSeq(alignment.getHeight());
 +        if (annotationAdded)
 +        {
 +          // Duplicate sequence annotation in all views.
 +          AlignmentI[] alview = this.getViewAlignments();
 +          for (int i = 0; i < sequences.length; i++)
 +          {
 +            AlignmentAnnotation sann[] = sequences[i].getAnnotation();
 +            if (sann == null)
 +              continue;
 +            for (int avnum = 0; avnum < alview.length; avnum++)
 +            {
 +              if (alview[avnum] != alignment)
 +              {
 +                // duplicate in a view other than the one with input focus
 +                int avwidth = alview[avnum].getWidth() + 1;
 +                // this relies on sann being preserved after we
 +                // modify the sequence's annotation array for each duplication
 +                for (int a = 0; a < sann.length; a++)
 +                {
 +                  AlignmentAnnotation newann = new AlignmentAnnotation(
 +                          sann[a]);
 +                  sequences[i].addAlignmentAnnotation(newann);
 +                  newann.padAnnotation(avwidth);
 +                  alview[avnum].addAnnotation(newann); // annotation was
 +                  // duplicated earlier
 +                  // TODO JAL-1145 graphGroups are not updated for sequence
 +                  // annotation added to several views. This may cause
 +                  // strangeness
 +                  alview[avnum].setAnnotationIndex(newann, a);
 +                }
 +              }
 +            }
 +          }
 +          buildSortByAnnotationScoresMenu();
 +        }
 +        viewport.firePropertyChange("alignment", null,
 +                alignment.getSequences());
 +        if (alignPanels != null)
 +        {
 +          for (AlignmentPanel ap : ((Vector<AlignmentPanel>) alignPanels))
 +          {
 +            ap.validateAnnotationDimensions(false);
 +          }
 +        }
 +        else
 +        {
 +          alignPanel.validateAnnotationDimensions(false);
 +        }
 +
 +      }
 +      else
 +      {
 +        AlignFrame af = new AlignFrame(alignment, DEFAULT_WIDTH,
 +                DEFAULT_HEIGHT);
 +        String newtitle = new String("Copied sequences");
 +
 +        if (Desktop.jalviewClipboard != null
 +                && Desktop.jalviewClipboard[2] != null)
 +        {
 +          Vector hc = (Vector) Desktop.jalviewClipboard[2];
 +          for (int i = 0; i < hc.size(); i++)
 +          {
 +            int[] region = (int[]) hc.elementAt(i);
 +            af.viewport.hideColumns(region[0], region[1]);
 +          }
 +        }
 +
 +        // >>>This is a fix for the moment, until a better solution is
 +        // found!!<<<
 +        af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer()
 +                .transferSettings(
 +                        alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
 +
 +        // TODO: maintain provenance of an alignment, rather than just make the
 +        // title a concatenation of operations.
 +        if (!externalPaste)
 +        {
 +          if (title.startsWith("Copied sequences"))
 +          {
 +            newtitle = title;
 +          }
 +          else
 +          {
 +            newtitle = newtitle.concat("- from " + title);
 +          }
 +        }
 +        else
 +        {
 +          newtitle = new String("Pasted sequences");
 +        }
 +
 +        Desktop.addInternalFrame(af, newtitle, DEFAULT_WIDTH,
 +                DEFAULT_HEIGHT);
 +
 +      }
 +
 +    } catch (Exception ex)
 +    {
 +      ex.printStackTrace();
 +      System.out.println("Exception whilst pasting: " + ex);
 +      // could be anything being pasted in here
 +    }
 +
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  protected void cut_actionPerformed(ActionEvent e)
 +  {
 +    copy_actionPerformed(null);
 +    delete_actionPerformed(null);
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  protected void delete_actionPerformed(ActionEvent evt)
 +  {
 +
 +    SequenceGroup sg = viewport.getSelectionGroup();
 +    if (sg == null)
 +    {
 +      return;
 +    }
 +
 +    Vector seqs = new Vector();
 +    SequenceI seq;
 +    for (int i = 0; i < sg.getSize(); i++)
 +    {
 +      seq = sg.getSequenceAt(i);
 +      seqs.addElement(seq);
 +    }
 +
 +    // If the cut affects all sequences, remove highlighted columns
 +    if (sg.getSize() == viewport.getAlignment().getHeight())
 +    {
 +      viewport.getColumnSelection().removeElements(sg.getStartRes(),
 +              sg.getEndRes() + 1);
 +    }
 +
 +    SequenceI[] cut = new SequenceI[seqs.size()];
 +    for (int i = 0; i < seqs.size(); i++)
 +    {
 +      cut[i] = (SequenceI) seqs.elementAt(i);
 +    }
 +
 +    /*
 +     * //ADD HISTORY ITEM
 +     */
 +    addHistoryItem(new EditCommand("Cut Sequences", EditCommand.CUT, cut,
 +            sg.getStartRes(), sg.getEndRes() - sg.getStartRes() + 1,
 +            viewport.getAlignment()));
 +
 +    viewport.setSelectionGroup(null);
 +    viewport.sendSelection();
 +    viewport.getAlignment().deleteGroup(sg);
 +
 +    viewport.firePropertyChange("alignment", null, viewport.getAlignment()
 +            .getSequences());
 +    if (viewport.getAlignment().getHeight() < 1)
 +    {
 +      try
 +      {
 +        this.setClosed(true);
 +      } catch (Exception ex)
 +      {
 +      }
 +    }
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  protected void deleteGroups_actionPerformed(ActionEvent e)
 +  {
 +    if (avc.deleteGroups()) {
 +      PaintRefresher.Refresh(this, viewport.getSequenceSetId());
 +      alignPanel.updateAnnotation();
 +      alignPanel.paintAlignment(true);
 +    }
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  public void selectAllSequenceMenuItem_actionPerformed(ActionEvent e)
 +  {
 +    SequenceGroup sg = new SequenceGroup();
 +
 +    for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
 +    {
 +      sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
 +    }
 +
 +    sg.setEndRes(viewport.getAlignment().getWidth() - 1);
 +    viewport.setSelectionGroup(sg);
 +    viewport.sendSelection();
 +    alignPanel.paintAlignment(true);
 +    PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  public void deselectAllSequenceMenuItem_actionPerformed(ActionEvent e)
 +  {
 +    if (viewport.cursorMode)
 +    {
 +      alignPanel.seqPanel.keyboardNo1 = null;
 +      alignPanel.seqPanel.keyboardNo2 = null;
 +    }
 +    viewport.setSelectionGroup(null);
 +    viewport.getColumnSelection().clear();
 +    viewport.setSelectionGroup(null);
 +    alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
 +    alignPanel.idPanel.idCanvas.searchResults = null;
 +    alignPanel.paintAlignment(true);
 +    PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
 +    viewport.sendSelection();
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  public void invertSequenceMenuItem_actionPerformed(ActionEvent e)
 +  {
 +    SequenceGroup sg = viewport.getSelectionGroup();
 +
 +    if (sg == null)
 +    {
 +      selectAllSequenceMenuItem_actionPerformed(null);
 +
 +      return;
 +    }
 +
 +    for (int i = 0; i < viewport.getAlignment().getSequences().size(); i++)
 +    {
 +      sg.addOrRemove(viewport.getAlignment().getSequenceAt(i), false);
 +    }
 +
 +    alignPanel.paintAlignment(true);
 +    PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
 +    viewport.sendSelection();
 +  }
 +
 +  @Override
 +  public void invertColSel_actionPerformed(ActionEvent e)
 +  {
 +    viewport.invertColumnSelection();
 +    alignPanel.paintAlignment(true);
 +    viewport.sendSelection();
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  public void remove2LeftMenuItem_actionPerformed(ActionEvent e)
 +  {
 +    trimAlignment(true);
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  public void remove2RightMenuItem_actionPerformed(ActionEvent e)
 +  {
 +    trimAlignment(false);
 +  }
 +
 +  void trimAlignment(boolean trimLeft)
 +  {
 +    ColumnSelection colSel = viewport.getColumnSelection();
 +    int column;
 +
 +    if (colSel.size() > 0)
 +    {
 +      if (trimLeft)
 +      {
 +        column = colSel.getMin();
 +      }
 +      else
 +      {
 +        column = colSel.getMax();
 +      }
 +
 +      SequenceI[] seqs;
 +      if (viewport.getSelectionGroup() != null)
 +      {
 +        seqs = viewport.getSelectionGroup().getSequencesAsArray(
 +                viewport.getHiddenRepSequences());
 +      }
 +      else
 +      {
 +        seqs = viewport.getAlignment().getSequencesArray();
 +      }
 +
 +      TrimRegionCommand trimRegion;
 +      if (trimLeft)
 +      {
 +        trimRegion = new TrimRegionCommand("Remove Left",
 +                TrimRegionCommand.TRIM_LEFT, seqs, column,
 +                viewport.getAlignment(), viewport.getColumnSelection(),
 +                viewport.getSelectionGroup());
 +        viewport.setStartRes(0);
 +      }
 +      else
 +      {
 +        trimRegion = new TrimRegionCommand("Remove Right",
 +                TrimRegionCommand.TRIM_RIGHT, seqs, column,
 +                viewport.getAlignment(), viewport.getColumnSelection(),
 +                viewport.getSelectionGroup());
 +      }
 +
 +      statusBar.setText(MessageManager.formatMessage("label.removed_columns", new String[]{Integer.valueOf(trimRegion.getSize()).toString()}));
 +
 +      addHistoryItem(trimRegion);
 +
 +      for (SequenceGroup sg : viewport.getAlignment().getGroups())
 +      {
 +        if ((trimLeft && !sg.adjustForRemoveLeft(column))
 +                || (!trimLeft && !sg.adjustForRemoveRight(column)))
 +        {
 +          viewport.getAlignment().deleteGroup(sg);
 +        }
 +      }
 +
 +      viewport.firePropertyChange("alignment", null, viewport
 +              .getAlignment().getSequences());
 +    }
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
 +  {
 +    int start = 0, end = viewport.getAlignment().getWidth() - 1;
 +
 +    SequenceI[] seqs;
 +    if (viewport.getSelectionGroup() != null)
 +    {
 +      seqs = viewport.getSelectionGroup().getSequencesAsArray(
 +              viewport.getHiddenRepSequences());
 +      start = viewport.getSelectionGroup().getStartRes();
 +      end = viewport.getSelectionGroup().getEndRes();
 +    }
 +    else
 +    {
 +      seqs = viewport.getAlignment().getSequencesArray();
 +    }
 +
 +    RemoveGapColCommand removeGapCols = new RemoveGapColCommand(
 +            "Remove Gapped Columns", seqs, start, end,
 +            viewport.getAlignment());
 +
 +    addHistoryItem(removeGapCols);
 +
 +    statusBar.setText(MessageManager.formatMessage("label.removed_empty_columns", new String[]{Integer.valueOf(removeGapCols.getSize()).toString()}));
 +
 +    // This is to maintain viewport position on first residue
 +    // of first sequence
 +    SequenceI seq = viewport.getAlignment().getSequenceAt(0);
 +    int startRes = seq.findPosition(viewport.startRes);
 +    // ShiftList shifts;
 +    // viewport.getAlignment().removeGaps(shifts=new ShiftList());
 +    // edit.alColumnChanges=shifts.getInverse();
 +    // if (viewport.hasHiddenColumns)
 +    // viewport.getColumnSelection().compensateForEdits(shifts);
 +    viewport.setStartRes(seq.findIndex(startRes) - 1);
 +    viewport.firePropertyChange("alignment", null, viewport.getAlignment()
 +            .getSequences());
 +
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
 +  {
 +    int start = 0, end = viewport.getAlignment().getWidth() - 1;
 +
 +    SequenceI[] seqs;
 +    if (viewport.getSelectionGroup() != null)
 +    {
 +      seqs = viewport.getSelectionGroup().getSequencesAsArray(
 +              viewport.getHiddenRepSequences());
 +      start = viewport.getSelectionGroup().getStartRes();
 +      end = viewport.getSelectionGroup().getEndRes();
 +    }
 +    else
 +    {
 +      seqs = viewport.getAlignment().getSequencesArray();
 +    }
 +
 +    // This is to maintain viewport position on first residue
 +    // of first sequence
 +    SequenceI seq = viewport.getAlignment().getSequenceAt(0);
 +    int startRes = seq.findPosition(viewport.startRes);
 +
 +    addHistoryItem(new RemoveGapsCommand("Remove Gaps", seqs, start, end,
 +            viewport.getAlignment()));
 +
 +    viewport.setStartRes(seq.findIndex(startRes) - 1);
 +
 +    viewport.firePropertyChange("alignment", null, viewport.getAlignment()
 +            .getSequences());
 +
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  public void padGapsMenuitem_actionPerformed(ActionEvent e)
 +  {
 +    viewport.setPadGaps(padGapsMenuitem.isSelected());
 +    viewport.firePropertyChange("alignment", null, viewport.getAlignment()
 +            .getSequences());
 +  }
 +
 +  // else
 +  {
 +    // if (justifySeqs>0)
 +    {
 +      // alignment.justify(justifySeqs!=RIGHT_JUSTIFY);
 +    }
 +  }
 +
 +  // }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  public void findMenuItem_actionPerformed(ActionEvent e)
 +  {
 +    new Finder();
 +  }
 +
 +  @Override
 +  public void newView_actionPerformed(ActionEvent e)
 +  {
 +    newView(true);
 +  }
 +
 +  /**
 +   * 
 +   * @param copyAnnotation
 +   *          if true then duplicate all annnotation, groups and settings
 +   * @return new alignment panel, already displayed.
 +   */
 +  public AlignmentPanel newView(boolean copyAnnotation)
 +  {
 +    return newView(null, copyAnnotation);
 +  }
 +
 +  /**
 +   * 
 +   * @param viewTitle
 +   *          title of newly created view
 +   * @return new alignment panel, already displayed.
 +   */
 +  public AlignmentPanel newView(String viewTitle)
 +  {
 +    return newView(viewTitle, true);
 +  }
 +
 +  /**
 +   * 
 +   * @param viewTitle
 +   *          title of newly created view
 +   * @param copyAnnotation
 +   *          if true then duplicate all annnotation, groups and settings
 +   * @return new alignment panel, already displayed.
 +   */
 +  public AlignmentPanel newView(String viewTitle, boolean copyAnnotation)
 +  {
 +    AlignmentPanel newap = new Jalview2XML().copyAlignPanel(alignPanel,
 +            true);
 +    if (!copyAnnotation)
 +    {
 +      // just remove all the current annotation except for the automatic stuff
 +      newap.av.getAlignment().deleteAllGroups();
 +      for (AlignmentAnnotation alan : newap.av.getAlignment()
 +              .getAlignmentAnnotation())
 +      {
 +        if (!alan.autoCalculated)
 +        {
 +          newap.av.getAlignment().deleteAnnotation(alan);
 +        }
 +        ;
 +      }
 +    }
 +
 +    newap.av.gatherViewsHere = false;
 +
 +    if (viewport.viewName == null)
 +    {
 +      viewport.viewName = "Original";
 +    }
 +
 +    newap.av.historyList = viewport.historyList;
 +    newap.av.redoList = viewport.redoList;
 +
 +    int index = Desktop.getViewCount(viewport.getSequenceSetId());
 +    // make sure the new view has a unique name - this is essential for Jalview
 +    // 2 archives
 +    boolean addFirstIndex = false;
 +    if (viewTitle == null || viewTitle.trim().length() == 0)
 +    {
 +      viewTitle = "View";
 +      addFirstIndex = true;
 +    }
 +    else
 +    {
 +      index = 1;// we count from 1 if given a specific name
 +    }
 +    String newViewName = viewTitle + ((addFirstIndex) ? " " + index : "");
 +    Vector comps = (Vector) PaintRefresher.components.get(viewport
 +            .getSequenceSetId());
 +    Vector existingNames = new Vector();
 +    for (int i = 0; i < comps.size(); i++)
 +    {
 +      if (comps.elementAt(i) instanceof AlignmentPanel)
 +      {
 +        AlignmentPanel ap = (AlignmentPanel) comps.elementAt(i);
 +        if (!existingNames.contains(ap.av.viewName))
 +        {
 +          existingNames.addElement(ap.av.viewName);
 +        }
 +      }
 +    }
 +
 +    while (existingNames.contains(newViewName))
 +    {
 +      newViewName = viewTitle + " " + (++index);
 +    }
 +
 +    newap.av.viewName = newViewName;
 +
 +    addAlignmentPanel(newap, true);
 +    newap.alignmentChanged();
 +    
 +    if (alignPanels.size() == 2)
 +    {
 +      viewport.gatherViewsHere = true;
 +    }
 +    tabbedPane.setSelectedIndex(tabbedPane.getTabCount() - 1);
 +    return newap;
 +  }
 +
 +  @Override
 +  public void expandViews_actionPerformed(ActionEvent e)
 +  {
 +    Desktop.instance.explodeViews(this);
 +  }
 +
 +  @Override
 +  public void gatherViews_actionPerformed(ActionEvent e)
 +  {
 +    Desktop.instance.gatherViews(this);
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  public void font_actionPerformed(ActionEvent e)
 +  {
 +    new FontChooser(alignPanel);
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  protected void seqLimit_actionPerformed(ActionEvent e)
 +  {
 +    viewport.setShowJVSuffix(seqLimits.isSelected());
 +
 +    alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel
 +            .calculateIdWidth());
 +    alignPanel.paintAlignment(true);
 +  }
 +
 +  @Override
 +  public void idRightAlign_actionPerformed(ActionEvent e)
 +  {
 +    viewport.rightAlignIds = idRightAlign.isSelected();
 +    alignPanel.paintAlignment(true);
 +  }
 +
 +  @Override
 +  public void centreColumnLabels_actionPerformed(ActionEvent e)
 +  {
 +    viewport.centreColumnLabels = centreColumnLabelsMenuItem.getState();
 +    alignPanel.paintAlignment(true);
 +  }
 +
 +  /*
 +   * (non-Javadoc)
 +   * 
 +   * @see jalview.jbgui.GAlignFrame#followHighlight_actionPerformed()
 +   */
 +  @Override
 +  protected void followHighlight_actionPerformed()
 +  {
 +    if (viewport.followHighlight = this.followHighlightMenuItem.getState())
 +    {
 +      alignPanel.scrollToPosition(
 +              alignPanel.seqPanel.seqCanvas.searchResults, false);
 +    }
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  protected void colourTextMenuItem_actionPerformed(ActionEvent e)
 +  {
 +    viewport.setColourText(colourTextMenuItem.isSelected());
 +    alignPanel.paintAlignment(true);
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  public void wrapMenuItem_actionPerformed(ActionEvent e)
 +  {
 +    scaleAbove.setVisible(wrapMenuItem.isSelected());
 +    scaleLeft.setVisible(wrapMenuItem.isSelected());
 +    scaleRight.setVisible(wrapMenuItem.isSelected());
 +    viewport.setWrapAlignment(wrapMenuItem.isSelected());
 +    alignPanel.setWrapAlignment(wrapMenuItem.isSelected());
 +  }
 +
 +  @Override
 +  public void showAllSeqs_actionPerformed(ActionEvent e)
 +  {
 +    viewport.showAllHiddenSeqs();
 +  }
 +
 +  @Override
 +  public void showAllColumns_actionPerformed(ActionEvent e)
 +  {
 +    viewport.showAllHiddenColumns();
 +    repaint();
 +  }
 +
 +  @Override
 +  public void hideSelSequences_actionPerformed(ActionEvent e)
 +  {
 +    viewport.hideAllSelectedSeqs();
 +    alignPanel.paintAlignment(true);
 +  }
 +
 +  /**
 +   * called by key handler and the hide all/show all menu items
 +   * 
 +   * @param toggleSeqs
 +   * @param toggleCols
 +   */
 +  private void toggleHiddenRegions(boolean toggleSeqs, boolean toggleCols)
 +  {
 +
 +    boolean hide = false;
 +    SequenceGroup sg = viewport.getSelectionGroup();
 +    if (!toggleSeqs && !toggleCols)
 +    {
 +      // Hide everything by the current selection - this is a hack - we do the
 +      // invert and then hide
 +      // first check that there will be visible columns after the invert.
 +      if ((viewport.getColumnSelection() != null
 +              && viewport.getColumnSelection().getSelected() != null && viewport
 +              .getColumnSelection().getSelected().size() > 0)
 +              || (sg != null && sg.getSize() > 0 && sg.getStartRes() <= sg
 +                      .getEndRes()))
 +      {
 +        // now invert the sequence set, if required - empty selection implies
 +        // that no hiding is required.
 +        if (sg != null)
 +        {
 +          invertSequenceMenuItem_actionPerformed(null);
 +          sg = viewport.getSelectionGroup();
 +          toggleSeqs = true;
 +
 +        }
 +        viewport.expandColSelection(sg, true);
 +        // finally invert the column selection and get the new sequence
 +        // selection.
 +        invertColSel_actionPerformed(null);
 +        toggleCols = true;
 +      }
 +    }
 +
 +    if (toggleSeqs)
 +    {
 +      if (sg != null && sg.getSize() != viewport.getAlignment().getHeight())
 +      {
 +        hideSelSequences_actionPerformed(null);
 +        hide = true;
 +      }
 +      else if (!(toggleCols && viewport.getColumnSelection().getSelected()
 +              .size() > 0))
 +      {
 +        showAllSeqs_actionPerformed(null);
 +      }
 +    }
 +
 +    if (toggleCols)
 +    {
 +      if (viewport.getColumnSelection().getSelected().size() > 0)
 +      {
 +        hideSelColumns_actionPerformed(null);
 +        if (!toggleSeqs)
 +        {
 +          viewport.setSelectionGroup(sg);
 +        }
 +      }
 +      else if (!hide)
 +      {
 +        showAllColumns_actionPerformed(null);
 +      }
 +    }
 +  }
 +
 +  /*
 +   * (non-Javadoc)
 +   * 
 +   * @see
 +   * jalview.jbgui.GAlignFrame#hideAllButSelection_actionPerformed(java.awt.
 +   * event.ActionEvent)
 +   */
 +  @Override
 +  public void hideAllButSelection_actionPerformed(ActionEvent e)
 +  {
 +    toggleHiddenRegions(false, false);
 +  }
 +
 +  /*
 +   * (non-Javadoc)
 +   * 
 +   * @see
 +   * jalview.jbgui.GAlignFrame#hideAllSelection_actionPerformed(java.awt.event
 +   * .ActionEvent)
 +   */
 +  @Override
 +  public void hideAllSelection_actionPerformed(ActionEvent e)
 +  {
 +    SequenceGroup sg = viewport.getSelectionGroup();
 +    viewport.expandColSelection(sg, false);
 +    viewport.hideAllSelectedSeqs();
 +    viewport.hideSelectedColumns();
 +    alignPanel.paintAlignment(true);
 +  }
 +
 +  /*
 +   * (non-Javadoc)
 +   * 
 +   * @see
 +   * jalview.jbgui.GAlignFrame#showAllhidden_actionPerformed(java.awt.event.
 +   * ActionEvent)
 +   */
 +  @Override
 +  public void showAllhidden_actionPerformed(ActionEvent e)
 +  {
 +    viewport.showAllHiddenColumns();
 +    viewport.showAllHiddenSeqs();
 +    alignPanel.paintAlignment(true);
 +  }
 +
 +  @Override
 +  public void hideSelColumns_actionPerformed(ActionEvent e)
 +  {
 +    viewport.hideSelectedColumns();
 +    alignPanel.paintAlignment(true);
 +  }
 +
 +  @Override
 +  public void hiddenMarkers_actionPerformed(ActionEvent e)
 +  {
 +    viewport.setShowHiddenMarkers(hiddenMarkers.isSelected());
 +    repaint();
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  protected void scaleAbove_actionPerformed(ActionEvent e)
 +  {
 +    viewport.setScaleAboveWrapped(scaleAbove.isSelected());
 +    alignPanel.paintAlignment(true);
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  protected void scaleLeft_actionPerformed(ActionEvent e)
 +  {
 +    viewport.setScaleLeftWrapped(scaleLeft.isSelected());
 +    alignPanel.paintAlignment(true);
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  protected void scaleRight_actionPerformed(ActionEvent e)
 +  {
 +    viewport.setScaleRightWrapped(scaleRight.isSelected());
 +    alignPanel.paintAlignment(true);
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  public void viewBoxesMenuItem_actionPerformed(ActionEvent e)
 +  {
 +    viewport.setShowBoxes(viewBoxesMenuItem.isSelected());
 +    alignPanel.paintAlignment(true);
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  public void viewTextMenuItem_actionPerformed(ActionEvent e)
 +  {
 +    viewport.setShowText(viewTextMenuItem.isSelected());
 +    alignPanel.paintAlignment(true);
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  protected void renderGapsMenuItem_actionPerformed(ActionEvent e)
 +  {
 +    viewport.setRenderGaps(renderGapsMenuItem.isSelected());
 +    alignPanel.paintAlignment(true);
 +  }
 +
 +  public FeatureSettings featureSettings;
 +
 +  @Override
 +  public void featureSettings_actionPerformed(ActionEvent e)
 +  {
 +    if (featureSettings != null)
 +    {
 +      featureSettings.close();
 +      featureSettings = null;
 +    }
 +    if (!showSeqFeatures.isSelected())
 +    {
 +      // make sure features are actually displayed
 +      showSeqFeatures.setSelected(true);
 +      showSeqFeatures_actionPerformed(null);
 +    }
 +    featureSettings = new FeatureSettings(this);
 +  }
 +
 +  /**
 +   * Set or clear 'Show Sequence Features'
 +   * 
 +   * @param evt
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  public void showSeqFeatures_actionPerformed(ActionEvent evt)
 +  {
 +    viewport.setShowSequenceFeatures(showSeqFeatures.isSelected());
 +    alignPanel.paintAlignment(true);
 +    if (alignPanel.getOverviewPanel() != null)
 +    {
 +      alignPanel.getOverviewPanel().updateOverviewImage();
 +    }
 +  }
 +
 +  /**
 +   * Set or clear 'Show Sequence Features'
 +   * 
 +   * @param evt
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  public void showSeqFeaturesHeight_actionPerformed(ActionEvent evt)
 +  {
 +    viewport.setShowSequenceFeaturesHeight(showSeqFeaturesHeight
 +            .isSelected());
 +    if (viewport.getShowSequenceFeaturesHeight())
 +    {
 +      // ensure we're actually displaying features
 +      viewport.setShowSequenceFeatures(true);
 +      showSeqFeatures.setSelected(true);
 +    }
 +    alignPanel.paintAlignment(true);
 +    if (alignPanel.getOverviewPanel() != null)
 +    {
 +      alignPanel.getOverviewPanel().updateOverviewImage();
 +    }
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
 +  {
 +    viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());
 +    alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());
 +  }
 +
 +  @Override
 +  public void alignmentProperties()
 +  {
 +    JEditorPane editPane = new JEditorPane("text/html", "");
 +    editPane.setEditable(false);
 +    StringBuffer contents = new AlignmentProperties(viewport.getAlignment())
 +            .formatAsHtml();
 +    editPane.setText(MessageManager.formatMessage("label.html_content", new String[]{contents.toString()}));
 +    JInternalFrame frame = new JInternalFrame();
 +    frame.getContentPane().add(new JScrollPane(editPane));
 +
-     Desktop.instance.addInternalFrame(frame, "Alignment Properties: "
-             + getTitle(), 500, 400);
+     Desktop.instance.addInternalFrame(frame, MessageManager.formatMessage("label.alignment_properties", new String[]{getTitle()}), 500, 400);\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  public void overviewMenuItem_actionPerformed(ActionEvent e)\r
 -  {\r
 -    if (alignPanel.overviewPanel != null)\r
 -    {\r
 -      return;\r
 -    }\r
 -\r
 -    JInternalFrame frame = new JInternalFrame();\r
 -    OverviewPanel overview = new OverviewPanel(alignPanel);\r
 -    frame.setContentPane(overview);\r
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  public void overviewMenuItem_actionPerformed(ActionEvent e)
 +  {
 +    if (alignPanel.overviewPanel != null)
 +    {
 +      return;
 +    }
 +
 +    JInternalFrame frame = new JInternalFrame();
 +    OverviewPanel overview = new OverviewPanel(alignPanel);
 +    frame.setContentPane(overview);
-     Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),
+     Desktop.addInternalFrame(frame, MessageManager.formatMessage("label.overview_params", new String[]{this.getTitle()}),\r
 -            frame.getWidth(), frame.getHeight());\r
 -    frame.pack();\r
 -    frame.setLayer(JLayeredPane.PALETTE_LAYER);\r
 -    frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()\r
 -    {\r
 -      @Override\r
 -      public void internalFrameClosed(\r
 -              javax.swing.event.InternalFrameEvent evt)\r
 -      {\r
 -        alignPanel.setOverviewPanel(null);\r
 -      };\r
 -    });\r
 -\r
 -    alignPanel.setOverviewPanel(overview);\r
 -  }\r
 -\r
 -  @Override\r
 -  public void textColour_actionPerformed(ActionEvent e)\r
 -  {\r
 -    new TextColourChooser().chooseColour(alignPanel, null);\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  protected void noColourmenuItem_actionPerformed(ActionEvent e)\r
 -  {\r
 -    changeColour(null);\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  public void clustalColour_actionPerformed(ActionEvent e)\r
 -  {\r
 -    changeColour(new ClustalxColourScheme(viewport.getAlignment(),\r
 -            viewport.getHiddenRepSequences()));\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  public void zappoColour_actionPerformed(ActionEvent e)\r
 -  {\r
 -    changeColour(new ZappoColourScheme());\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  public void taylorColour_actionPerformed(ActionEvent e)\r
 -  {\r
 -    changeColour(new TaylorColourScheme());\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  public void hydrophobicityColour_actionPerformed(ActionEvent e)\r
 -  {\r
 -    changeColour(new HydrophobicColourScheme());\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  public void helixColour_actionPerformed(ActionEvent e)\r
 -  {\r
 -    changeColour(new HelixColourScheme());\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  public void strandColour_actionPerformed(ActionEvent e)\r
 -  {\r
 -    changeColour(new StrandColourScheme());\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  public void turnColour_actionPerformed(ActionEvent e)\r
 -  {\r
 -    changeColour(new TurnColourScheme());\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  public void buriedColour_actionPerformed(ActionEvent e)\r
 -  {\r
 -    changeColour(new BuriedColourScheme());\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  public void nucleotideColour_actionPerformed(ActionEvent e)\r
 -  {\r
 -    changeColour(new NucleotideColourScheme());\r
 -  }\r
 -\r
 -  @Override\r
 -  public void purinePyrimidineColour_actionPerformed(ActionEvent e)\r
 -  {\r
 -    changeColour(new PurinePyrimidineColourScheme());\r
 -  }\r
 -\r
 -  /*\r
 -   * public void covariationColour_actionPerformed(ActionEvent e) {\r
 -   * changeColour(new\r
 -   * CovariationColourScheme(viewport.getAlignment().getAlignmentAnnotation\r
 -   * ()[0])); }\r
 -   */\r
 -  @Override\r
 -  public void annotationColour_actionPerformed(ActionEvent e)\r
 -  {\r
 -    new AnnotationColourChooser(viewport, alignPanel);\r
 -  }\r
 -\r
 -  @Override\r
 -  public void rnahelicesColour_actionPerformed(ActionEvent e)\r
 -  {\r
 -    new RNAHelicesColourChooser(viewport, alignPanel);\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  protected void applyToAllGroups_actionPerformed(ActionEvent e)\r
 -  {\r
 -    viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param cs\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  public void changeColour(ColourSchemeI cs)\r
 -  {\r
 -    // TODO: compare with applet and pull up to model method\r
 -    int threshold = 0;\r
 -\r
 -    if (cs != null)\r
 -    {\r
 -      if (viewport.getAbovePIDThreshold())\r
 -      {\r
 -        threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,\r
 -                "Background");\r
 -\r
 -        cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());\r
 -\r
 -        viewport.setGlobalColourScheme(cs);\r
 -      }\r
 -      else\r
 -      {\r
 -        cs.setThreshold(0, viewport.getIgnoreGapsConsensus());\r
 -      }\r
 -\r
 -      if (viewport.getConservationSelected())\r
 -      {\r
 -\r
 -        Alignment al = (Alignment) viewport.getAlignment();\r
 -        Conservation c = new Conservation("All",\r
 -                ResidueProperties.propHash, 3, al.getSequences(), 0,\r
 -                al.getWidth() - 1);\r
 -\r
 -        c.calculate();\r
 -        c.verdict(false, viewport.getConsPercGaps());\r
 -\r
 -        cs.setConservation(c);\r
 -\r
 -        cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel,\r
 -                cs, "Background"));\r
 -      }\r
 -      else\r
 -      {\r
 -        cs.setConservation(null);\r
 -      }\r
 -\r
 -      cs.setConsensus(viewport.getSequenceConsensusHash());\r
 -    }\r
 -\r
 -    viewport.setGlobalColourScheme(cs);\r
 -\r
 -    if (viewport.getColourAppliesToAllGroups())\r
 -    {\r
 -\r
 -      for (SequenceGroup sg : viewport.getAlignment().getGroups())\r
 -      {\r
 -        if (cs == null)\r
 -        {\r
 -          sg.cs = null;\r
 -          continue;\r
 -        }\r
 -\r
 -        if (cs instanceof ClustalxColourScheme)\r
 -        {\r
 -          sg.cs = new ClustalxColourScheme(sg,\r
 -                  viewport.getHiddenRepSequences());\r
 -        }\r
 -        else if (cs instanceof UserColourScheme)\r
 -        {\r
 -          sg.cs = new UserColourScheme(((UserColourScheme) cs).getColours());\r
 -        }\r
 -        else\r
 -        {\r
 -          try\r
 -          {\r
 -            sg.cs = cs.getClass().newInstance();\r
 -          } catch (Exception ex)\r
 -          {\r
 -          }\r
 -        }\r
 -\r
 -        if (viewport.getAbovePIDThreshold()\r
 -                || cs instanceof PIDColourScheme\r
 -                || cs instanceof Blosum62ColourScheme)\r
 -        {\r
 -          sg.cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());\r
 -\r
 -          sg.cs.setConsensus(AAFrequency.calculate(\r
 -                  sg.getSequences(viewport.getHiddenRepSequences()),\r
 -                  sg.getStartRes(), sg.getEndRes() + 1));\r
 -        }\r
 -        else\r
 -        {\r
 -          sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());\r
 -        }\r
 -\r
 -        if (viewport.getConservationSelected())\r
 -        {\r
 -          Conservation c = new Conservation("Group",\r
 -                  ResidueProperties.propHash, 3, sg.getSequences(viewport\r
 -                          .getHiddenRepSequences()), sg.getStartRes(),\r
 -                  sg.getEndRes() + 1);\r
 -          c.calculate();\r
 -          c.verdict(false, viewport.getConsPercGaps());\r
 -          sg.cs.setConservation(c);\r
 -        }\r
 -        else\r
 -        {\r
 -          sg.cs.setConservation(null);\r
 -        }\r
 -      }\r
 -    }\r
 -\r
 -    if (alignPanel.getOverviewPanel() != null)\r
 -    {\r
 -      alignPanel.getOverviewPanel().updateOverviewImage();\r
 -    }\r
 -\r
 -    alignPanel.paintAlignment(true);\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  protected void modifyPID_actionPerformed(ActionEvent e)\r
 -  {\r
 -    if (viewport.getAbovePIDThreshold()\r
 -            && viewport.getGlobalColourScheme() != null)\r
 -    {\r
 -      SliderPanel.setPIDSliderSource(alignPanel,\r
 -              viewport.getGlobalColourScheme(), "Background");\r
 -      SliderPanel.showPIDSlider();\r
 -    }\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  protected void modifyConservation_actionPerformed(ActionEvent e)\r
 -  {\r
 -    if (viewport.getConservationSelected()\r
 -            && viewport.getGlobalColourScheme() != null)\r
 -    {\r
 -      SliderPanel.setConservationSlider(alignPanel,\r
 -              viewport.getGlobalColourScheme(), "Background");\r
 -      SliderPanel.showConservationSlider();\r
 -    }\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  protected void conservationMenuItem_actionPerformed(ActionEvent e)\r
 -  {\r
 -    viewport.setConservationSelected(conservationMenuItem.isSelected());\r
 -\r
 -    viewport.setAbovePIDThreshold(false);\r
 -    abovePIDThreshold.setSelected(false);\r
 -\r
 -    changeColour(viewport.getGlobalColourScheme());\r
 -\r
 -    modifyConservation_actionPerformed(null);\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  public void abovePIDThreshold_actionPerformed(ActionEvent e)\r
 -  {\r
 -    viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());\r
 -\r
 -    conservationMenuItem.setSelected(false);\r
 -    viewport.setConservationSelected(false);\r
 -\r
 -    changeColour(viewport.getGlobalColourScheme());\r
 -\r
 -    modifyPID_actionPerformed(null);\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  public void userDefinedColour_actionPerformed(ActionEvent e)\r
 -  {\r
 +            frame.getWidth(), frame.getHeight());
 +    frame.pack();
 +    frame.setLayer(JLayeredPane.PALETTE_LAYER);
 +    frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
 +    {
 +      @Override
 +      public void internalFrameClosed(
 +              javax.swing.event.InternalFrameEvent evt)
 +      {
 +        alignPanel.setOverviewPanel(null);
 +      };
 +    });
 +
 +    alignPanel.setOverviewPanel(overview);
 +  }
 +
 +  @Override
 +  public void textColour_actionPerformed(ActionEvent e)
 +  {
 +    new TextColourChooser().chooseColour(alignPanel, null);
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  protected void noColourmenuItem_actionPerformed(ActionEvent e)
 +  {
 +    changeColour(null);
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  public void clustalColour_actionPerformed(ActionEvent e)
 +  {
 +    changeColour(new ClustalxColourScheme(viewport.getAlignment(),
 +            viewport.getHiddenRepSequences()));
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  public void zappoColour_actionPerformed(ActionEvent e)
 +  {
 +    changeColour(new ZappoColourScheme());
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  public void taylorColour_actionPerformed(ActionEvent e)
 +  {
 +    changeColour(new TaylorColourScheme());
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  public void hydrophobicityColour_actionPerformed(ActionEvent e)
 +  {
 +    changeColour(new HydrophobicColourScheme());
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  public void helixColour_actionPerformed(ActionEvent e)
 +  {
 +    changeColour(new HelixColourScheme());
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  public void strandColour_actionPerformed(ActionEvent e)
 +  {
 +    changeColour(new StrandColourScheme());
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  public void turnColour_actionPerformed(ActionEvent e)
 +  {
 +    changeColour(new TurnColourScheme());
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  public void buriedColour_actionPerformed(ActionEvent e)
 +  {
 +    changeColour(new BuriedColourScheme());
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  public void nucleotideColour_actionPerformed(ActionEvent e)
 +  {
 +    changeColour(new NucleotideColourScheme());
 +  }
 +
 +  @Override
 +  public void purinePyrimidineColour_actionPerformed(ActionEvent e)
 +  {
 +    changeColour(new PurinePyrimidineColourScheme());
 +  }
 +
 +  /*
 +   * public void covariationColour_actionPerformed(ActionEvent e) {
 +   * changeColour(new
 +   * CovariationColourScheme(viewport.getAlignment().getAlignmentAnnotation
 +   * ()[0])); }
 +   */
 +  @Override
 +  public void annotationColour_actionPerformed(ActionEvent e)
 +  {
 +    new AnnotationColourChooser(viewport, alignPanel);
 +  }
 +
 +  @Override
 +  public void rnahelicesColour_actionPerformed(ActionEvent e)
 +  {
 +    new RNAHelicesColourChooser(viewport, alignPanel);
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  protected void applyToAllGroups_actionPerformed(ActionEvent e)
 +  {
 +    viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param cs
 +   *          DOCUMENT ME!
 +   */
 +  public void changeColour(ColourSchemeI cs)
 +  {
 +    // TODO: compare with applet and pull up to model method
 +    int threshold = 0;
 +
 +    if (cs != null)
 +    {
 +      if (viewport.getAbovePIDThreshold())
 +      {
 +        threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
 +                "Background");
 +
 +        cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());
 +
 +        viewport.setGlobalColourScheme(cs);
 +      }
 +      else
 +      {
 +        cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
 +      }
 +
 +      if (viewport.getConservationSelected())
 +      {
 +
 +        Alignment al = (Alignment) viewport.getAlignment();
 +        Conservation c = new Conservation("All",
 +                ResidueProperties.propHash, 3, al.getSequences(), 0,
 +                al.getWidth() - 1);
 +
 +        c.calculate();
 +        c.verdict(false, viewport.getConsPercGaps());
 +
 +        cs.setConservation(c);
 +
 +        cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel,
 +                cs, "Background"));
 +      }
 +      else
 +      {
 +        cs.setConservation(null);
 +      }
 +
 +      cs.setConsensus(viewport.getSequenceConsensusHash());
 +    }
 +
 +    viewport.setGlobalColourScheme(cs);
 +
 +    if (viewport.getColourAppliesToAllGroups())
 +    {
 +
 +      for (SequenceGroup sg : viewport.getAlignment().getGroups())
 +      {
 +        if (cs == null)
 +        {
 +          sg.cs = null;
 +          continue;
 +        }
 +
 +        if (cs instanceof ClustalxColourScheme)
 +        {
 +          sg.cs = new ClustalxColourScheme(sg,
 +                  viewport.getHiddenRepSequences());
 +        }
 +        else if (cs instanceof UserColourScheme)
 +        {
 +          sg.cs = new UserColourScheme(((UserColourScheme) cs).getColours());
 +        }
 +        else
 +        {
 +          try
 +          {
 +            sg.cs = cs.getClass().newInstance();
 +          } catch (Exception ex)
 +          {
 +          }
 +        }
 +
 +        if (viewport.getAbovePIDThreshold()
 +                || cs instanceof PIDColourScheme
 +                || cs instanceof Blosum62ColourScheme)
 +        {
 +          sg.cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());
 +
 +          sg.cs.setConsensus(AAFrequency.calculate(
 +                  sg.getSequences(viewport.getHiddenRepSequences()),
 +                  sg.getStartRes(), sg.getEndRes() + 1));
 +        }
 +        else
 +        {
 +          sg.cs.setThreshold(0, viewport.getIgnoreGapsConsensus());
 +        }
 +
 +        if (viewport.getConservationSelected())
 +        {
 +          Conservation c = new Conservation("Group",
 +                  ResidueProperties.propHash, 3, sg.getSequences(viewport
 +                          .getHiddenRepSequences()), sg.getStartRes(),
 +                  sg.getEndRes() + 1);
 +          c.calculate();
 +          c.verdict(false, viewport.getConsPercGaps());
 +          sg.cs.setConservation(c);
 +        }
 +        else
 +        {
 +          sg.cs.setConservation(null);
 +        }
 +      }
 +    }
 +
 +    if (alignPanel.getOverviewPanel() != null)
 +    {
 +      alignPanel.getOverviewPanel().updateOverviewImage();
 +    }
 +
 +    alignPanel.paintAlignment(true);
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  protected void modifyPID_actionPerformed(ActionEvent e)
 +  {
 +    if (viewport.getAbovePIDThreshold()
 +            && viewport.getGlobalColourScheme() != null)
 +    {
 +      SliderPanel.setPIDSliderSource(alignPanel,
 +              viewport.getGlobalColourScheme(), "Background");
 +      SliderPanel.showPIDSlider();
 +    }
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  protected void modifyConservation_actionPerformed(ActionEvent e)
 +  {
 +    if (viewport.getConservationSelected()
 +            && viewport.getGlobalColourScheme() != null)
 +    {
 +      SliderPanel.setConservationSlider(alignPanel,
 +              viewport.getGlobalColourScheme(), "Background");
 +      SliderPanel.showConservationSlider();
 +    }
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  protected void conservationMenuItem_actionPerformed(ActionEvent e)
 +  {
 +    viewport.setConservationSelected(conservationMenuItem.isSelected());
 +
 +    viewport.setAbovePIDThreshold(false);
 +    abovePIDThreshold.setSelected(false);
 +
 +    changeColour(viewport.getGlobalColourScheme());
 +
 +    modifyConservation_actionPerformed(null);
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  public void abovePIDThreshold_actionPerformed(ActionEvent e)
 +  {
 +    viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
 +
 +    conservationMenuItem.setSelected(false);
 +    viewport.setConservationSelected(false);
 +
 +    changeColour(viewport.getGlobalColourScheme());
 +
 +    modifyPID_actionPerformed(null);
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  public void userDefinedColour_actionPerformed(ActionEvent e)
 +  {
-     if (e.getActionCommand().equals("User Defined..."))
+     if (e.getActionCommand().equals(MessageManager.getString("action.user_defined")))\r
 -    {\r
 -      new UserDefinedColours(alignPanel, null);\r
 -    }\r
 -    else\r
 -    {\r
 -      UserColourScheme udc = (UserColourScheme) UserDefinedColours\r
 -              .getUserColourSchemes().get(e.getActionCommand());\r
 -\r
 -      changeColour(udc);\r
 -    }\r
 -  }\r
 -\r
 -  public void updateUserColourMenu()\r
 -  {\r
 -\r
 -    Component[] menuItems = colourMenu.getMenuComponents();\r
 -    int i, iSize = menuItems.length;\r
 -    for (i = 0; i < iSize; i++)\r
 -    {\r
 -      if (menuItems[i].getName() != null\r
 -              && menuItems[i].getName().equals("USER_DEFINED"))\r
 -      {\r
 -        colourMenu.remove(menuItems[i]);\r
 -        iSize--;\r
 -      }\r
 -    }\r
 -    if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)\r
 -    {\r
 -      java.util.Enumeration userColours = jalview.gui.UserDefinedColours\r
 -              .getUserColourSchemes().keys();\r
 -\r
 -      while (userColours.hasMoreElements())\r
 -      {\r
 -        final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(\r
 -                userColours.nextElement().toString());\r
 -        radioItem.setName("USER_DEFINED");\r
 -        radioItem.addMouseListener(new MouseAdapter()\r
 -        {\r
 -          @Override\r
 -          public void mousePressed(MouseEvent evt)\r
 -          {\r
 -            if (evt.isControlDown()\r
 -                    || SwingUtilities.isRightMouseButton(evt))\r
 -            {\r
 -              radioItem.removeActionListener(radioItem.getActionListeners()[0]);\r
 -\r
 -              int option = JOptionPane.showInternalConfirmDialog(\r
 -                      jalview.gui.Desktop.desktop,\r
 -                      MessageManager.getString("label.remove_from_default_list"),\r
 -                      MessageManager.getString("label.remove_user_defined_colour"),\r
 -                      JOptionPane.YES_NO_OPTION);\r
 -              if (option == JOptionPane.YES_OPTION)\r
 -              {\r
 -                jalview.gui.UserDefinedColours\r
 -                        .removeColourFromDefaults(radioItem.getText());\r
 -                colourMenu.remove(radioItem);\r
 -              }\r
 -              else\r
 -              {\r
 -                radioItem.addActionListener(new ActionListener()\r
 -                {\r
 -                  @Override\r
 -                  public void actionPerformed(ActionEvent evt)\r
 -                  {\r
 -                    userDefinedColour_actionPerformed(evt);\r
 -                  }\r
 -                });\r
 -              }\r
 -            }\r
 -          }\r
 -        });\r
 -        radioItem.addActionListener(new ActionListener()\r
 -        {\r
 -          @Override\r
 -          public void actionPerformed(ActionEvent evt)\r
 -          {\r
 -            userDefinedColour_actionPerformed(evt);\r
 -          }\r
 -        });\r
 -\r
 -        colourMenu.insert(radioItem, 15);\r
 -        colours.add(radioItem);\r
 -      }\r
 -    }\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  public void PIDColour_actionPerformed(ActionEvent e)\r
 -  {\r
 -    changeColour(new PIDColourScheme());\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  public void BLOSUM62Colour_actionPerformed(ActionEvent e)\r
 -  {\r
 -    changeColour(new Blosum62ColourScheme());\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)\r
 -  {\r
 -    SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();\r
 -    AlignmentSorter.sortByPID(viewport.getAlignment(), viewport\r
 -            .getAlignment().getSequenceAt(0), null);\r
 -    addHistoryItem(new OrderCommand("Pairwise Sort", oldOrder,\r
 -            viewport.getAlignment()));\r
 -    alignPanel.paintAlignment(true);\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  public void sortIDMenuItem_actionPerformed(ActionEvent e)\r
 -  {\r
 -    SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();\r
 -    AlignmentSorter.sortByID(viewport.getAlignment());\r
 -    addHistoryItem(new OrderCommand("ID Sort", oldOrder,\r
 -            viewport.getAlignment()));\r
 -    alignPanel.paintAlignment(true);\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  public void sortLengthMenuItem_actionPerformed(ActionEvent e)\r
 -  {\r
 -    SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();\r
 -    AlignmentSorter.sortByLength(viewport.getAlignment());\r
 -    addHistoryItem(new OrderCommand("Length Sort", oldOrder,\r
 -            viewport.getAlignment()));\r
 -    alignPanel.paintAlignment(true);\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  public void sortGroupMenuItem_actionPerformed(ActionEvent e)\r
 -  {\r
 -    SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();\r
 -    AlignmentSorter.sortByGroup(viewport.getAlignment());\r
 -    addHistoryItem(new OrderCommand("Group Sort", oldOrder,\r
 -            viewport.getAlignment()));\r
 -\r
 -    alignPanel.paintAlignment(true);\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)\r
 -  {\r
 -    new RedundancyPanel(alignPanel, this);\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)\r
 -  {\r
 -    if ((viewport.getSelectionGroup() == null)\r
 -            || (viewport.getSelectionGroup().getSize() < 2))\r
 -    {\r
 -      JOptionPane.showInternalMessageDialog(this,\r
 -              MessageManager.getString("label.you_must_select_least_two_sequences"), MessageManager.getString("label.invalid_selection"),\r
 -              JOptionPane.WARNING_MESSAGE);\r
 -    }\r
 -    else\r
 -    {\r
 -      JInternalFrame frame = new JInternalFrame();\r
 -      frame.setContentPane(new PairwiseAlignPanel(viewport));\r
 +    {
 +      new UserDefinedColours(alignPanel, null);
 +    }
 +    else
 +    {
 +      UserColourScheme udc = (UserColourScheme) UserDefinedColours
 +              .getUserColourSchemes().get(e.getActionCommand());
 +
 +      changeColour(udc);
 +    }
 +  }
 +
 +  public void updateUserColourMenu()
 +  {
 +
 +    Component[] menuItems = colourMenu.getMenuComponents();
 +    int i, iSize = menuItems.length;
 +    for (i = 0; i < iSize; i++)
 +    {
 +      if (menuItems[i].getName() != null
 +              && menuItems[i].getName().equals("USER_DEFINED"))
 +      {
 +        colourMenu.remove(menuItems[i]);
 +        iSize--;
 +      }
 +    }
 +    if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
 +    {
 +      java.util.Enumeration userColours = jalview.gui.UserDefinedColours
 +              .getUserColourSchemes().keys();
 +
 +      while (userColours.hasMoreElements())
 +      {
 +        final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(
 +                userColours.nextElement().toString());
 +        radioItem.setName("USER_DEFINED");
 +        radioItem.addMouseListener(new MouseAdapter()
 +        {
 +          @Override
 +          public void mousePressed(MouseEvent evt)
 +          {
 +            if (evt.isControlDown()
 +                    || SwingUtilities.isRightMouseButton(evt))
 +            {
 +              radioItem.removeActionListener(radioItem.getActionListeners()[0]);
 +
 +              int option = JOptionPane.showInternalConfirmDialog(
 +                      jalview.gui.Desktop.desktop,
 +                      MessageManager.getString("label.remove_from_default_list"),
 +                      MessageManager.getString("label.remove_user_defined_colour"),
 +                      JOptionPane.YES_NO_OPTION);
 +              if (option == JOptionPane.YES_OPTION)
 +              {
 +                jalview.gui.UserDefinedColours
 +                        .removeColourFromDefaults(radioItem.getText());
 +                colourMenu.remove(radioItem);
 +              }
 +              else
 +              {
 +                radioItem.addActionListener(new ActionListener()
 +                {
 +                  @Override
 +                  public void actionPerformed(ActionEvent evt)
 +                  {
 +                    userDefinedColour_actionPerformed(evt);
 +                  }
 +                });
 +              }
 +            }
 +          }
 +        });
 +        radioItem.addActionListener(new ActionListener()
 +        {
 +          @Override
 +          public void actionPerformed(ActionEvent evt)
 +          {
 +            userDefinedColour_actionPerformed(evt);
 +          }
 +        });
 +
 +        colourMenu.insert(radioItem, 15);
 +        colours.add(radioItem);
 +      }
 +    }
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  public void PIDColour_actionPerformed(ActionEvent e)
 +  {
 +    changeColour(new PIDColourScheme());
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  public void BLOSUM62Colour_actionPerformed(ActionEvent e)
 +  {
 +    changeColour(new Blosum62ColourScheme());
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  public void sortPairwiseMenuItem_actionPerformed(ActionEvent e)
 +  {
 +    SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
 +    AlignmentSorter.sortByPID(viewport.getAlignment(), viewport
 +            .getAlignment().getSequenceAt(0), null);
 +    addHistoryItem(new OrderCommand("Pairwise Sort", oldOrder,
 +            viewport.getAlignment()));
 +    alignPanel.paintAlignment(true);
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  public void sortIDMenuItem_actionPerformed(ActionEvent e)
 +  {
 +    SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
 +    AlignmentSorter.sortByID(viewport.getAlignment());
 +    addHistoryItem(new OrderCommand("ID Sort", oldOrder,
 +            viewport.getAlignment()));
 +    alignPanel.paintAlignment(true);
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  public void sortLengthMenuItem_actionPerformed(ActionEvent e)
 +  {
 +    SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
 +    AlignmentSorter.sortByLength(viewport.getAlignment());
 +    addHistoryItem(new OrderCommand("Length Sort", oldOrder,
 +            viewport.getAlignment()));
 +    alignPanel.paintAlignment(true);
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  public void sortGroupMenuItem_actionPerformed(ActionEvent e)
 +  {
 +    SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
 +    AlignmentSorter.sortByGroup(viewport.getAlignment());
 +    addHistoryItem(new OrderCommand("Group Sort", oldOrder,
 +            viewport.getAlignment()));
 +
 +    alignPanel.paintAlignment(true);
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)
 +  {
 +    new RedundancyPanel(alignPanel, this);
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  public void pairwiseAlignmentMenuItem_actionPerformed(ActionEvent e)
 +  {
 +    if ((viewport.getSelectionGroup() == null)
 +            || (viewport.getSelectionGroup().getSize() < 2))
 +    {
 +      JOptionPane.showInternalMessageDialog(this,
 +              MessageManager.getString("label.you_must_select_least_two_sequences"), MessageManager.getString("label.invalid_selection"),
 +              JOptionPane.WARNING_MESSAGE);
 +    }
 +    else
 +    {
 +      JInternalFrame frame = new JInternalFrame();
 +      frame.setContentPane(new PairwiseAlignPanel(viewport));
-       Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);
+       Desktop.addInternalFrame(frame, MessageManager.getString("action.pairwise_alignment"), 600, 500);\r
 -    }\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  public void PCAMenuItem_actionPerformed(ActionEvent e)\r
 -  {\r
 -    if (((viewport.getSelectionGroup() != null)\r
 -            && (viewport.getSelectionGroup().getSize() < 4) && (viewport\r
 -            .getSelectionGroup().getSize() > 0))\r
 -            || (viewport.getAlignment().getHeight() < 4))\r
 -    {\r
 -      JOptionPane.showInternalMessageDialog(this,\r
 -              MessageManager.getString("label.principal_component_analysis_must_take_least_four_input_sequences"),\r
 -              MessageManager.getString("label.sequence_selection_insufficient"),\r
 -              JOptionPane.WARNING_MESSAGE);\r
 -\r
 -      return;\r
 -    }\r
 -\r
 -    new PCAPanel(alignPanel);\r
 -  }\r
 -\r
 -  @Override\r
 -  public void autoCalculate_actionPerformed(ActionEvent e)\r
 -  {\r
 -    viewport.autoCalculateConsensus = autoCalculate.isSelected();\r
 -    if (viewport.autoCalculateConsensus)\r
 -    {\r
 -      viewport.firePropertyChange("alignment", null, viewport\r
 -              .getAlignment().getSequences());\r
 -    }\r
 -  }\r
 -\r
 -  @Override\r
 -  public void sortByTreeOption_actionPerformed(ActionEvent e)\r
 -  {\r
 -    viewport.sortByTree = sortByTree.isSelected();\r
 -  }\r
 -\r
 -  @Override\r
 -  protected void listenToViewSelections_actionPerformed(ActionEvent e)\r
 -  {\r
 -    viewport.followSelection = listenToViewSelections.isSelected();\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)\r
 -  {\r
 -    NewTreePanel("AV", "PID", "Average distance tree using PID");\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)\r
 -  {\r
 -    NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
 -  {\r
 -    NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)\r
 -  {\r
 -    NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param type\r
 -   *          DOCUMENT ME!\r
 -   * @param pwType\r
 -   *          DOCUMENT ME!\r
 -   * @param title\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  void NewTreePanel(String type, String pwType, String title)\r
 -  {\r
 -    TreePanel tp;\r
 -\r
 -    if (viewport.getSelectionGroup() != null\r
 -            && viewport.getSelectionGroup().getSize() > 0)\r
 -    {\r
 -      if (viewport.getSelectionGroup().getSize() < 3)\r
 -      {\r
 -        JOptionPane\r
 -                .showMessageDialog(\r
 -                        Desktop.desktop,\r
 -                        MessageManager.getString("label.you_need_more_two_sequences_selected_build_tree"),\r
 -                        MessageManager.getString("label.not_enough_sequences"), JOptionPane.WARNING_MESSAGE);\r
 -        return;\r
 -      }\r
 -\r
 -      SequenceGroup sg = viewport.getSelectionGroup();\r
 -\r
 -      /* Decide if the selection is a column region */\r
 -      for (SequenceI _s : sg.getSequences())\r
 -      {\r
 -        if (_s.getLength() < sg.getEndRes())\r
 -        {\r
 -          JOptionPane\r
 -                  .showMessageDialog(\r
 -                          Desktop.desktop,\r
 -                          MessageManager.getString("label.selected_region_to_tree_may_only_contain_residues_or_gaps"),\r
 -                          MessageManager.getString("label.sequences_selection_not_aligned"),\r
 -                          JOptionPane.WARNING_MESSAGE);\r
 -\r
 -          return;\r
 -        }\r
 -      }\r
 -\r
 -      title = title + " on region";\r
 -      tp = new TreePanel(alignPanel, type, pwType);\r
 -    }\r
 -    else\r
 -    {\r
 -      // are the visible sequences aligned?\r
 -      if (!viewport.getAlignment().isAligned(false))\r
 -      {\r
 -        JOptionPane\r
 -                .showMessageDialog(\r
 -                        Desktop.desktop,\r
 -                        MessageManager.getString("label.sequences_must_be_aligned_before_creating_tree"),\r
 -                        MessageManager.getString("label.sequences_not_aligned"),\r
 -                        JOptionPane.WARNING_MESSAGE);\r
 -\r
 -        return;\r
 -      }\r
 -\r
 -      if (viewport.getAlignment().getHeight() < 2)\r
 -      {\r
 -        return;\r
 -      }\r
 -\r
 -      tp = new TreePanel(alignPanel, type, pwType);\r
 -    }\r
 -\r
 -    title += " from ";\r
 -\r
 -    if (viewport.viewName != null)\r
 -    {\r
 -      title += viewport.viewName + " of ";\r
 -    }\r
 -\r
 -    title += this.title;\r
 -\r
 -    Desktop.addInternalFrame(tp, title, 600, 500);\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param title\r
 -   *          DOCUMENT ME!\r
 -   * @param order\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  public void addSortByOrderMenuItem(String title,\r
 -          final AlignmentOrder order)\r
 -  {\r
 -    final JMenuItem item = new JMenuItem("by " + title);\r
 -    sort.add(item);\r
 -    item.addActionListener(new java.awt.event.ActionListener()\r
 -    {\r
 -      @Override\r
 -      public void actionPerformed(ActionEvent e)\r
 -      {\r
 -        SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();\r
 -\r
 -        // TODO: JBPNote - have to map order entries to curent SequenceI\r
 -        // pointers\r
 -        AlignmentSorter.sortBy(viewport.getAlignment(), order);\r
 -\r
 -        addHistoryItem(new OrderCommand(order.getName(), oldOrder, viewport\r
 -                .getAlignment()));\r
 -\r
 -        alignPanel.paintAlignment(true);\r
 -      }\r
 -    });\r
 -  }\r
 -\r
 -  /**\r
 -   * Add a new sort by annotation score menu item\r
 -   * \r
 -   * @param sort\r
 -   *          the menu to add the option to\r
 -   * @param scoreLabel\r
 -   *          the label used to retrieve scores for each sequence on the\r
 -   *          alignment\r
 -   */\r
 -  public void addSortByAnnotScoreMenuItem(JMenu sort,\r
 -          final String scoreLabel)\r
 -  {\r
 -    final JMenuItem item = new JMenuItem(scoreLabel);\r
 -    sort.add(item);\r
 -    item.addActionListener(new java.awt.event.ActionListener()\r
 -    {\r
 -      @Override\r
 -      public void actionPerformed(ActionEvent e)\r
 -      {\r
 -        SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();\r
 -        AlignmentSorter.sortByAnnotationScore(scoreLabel,\r
 -                viewport.getAlignment());// ,viewport.getSelectionGroup());\r
 -        addHistoryItem(new OrderCommand("Sort by " + scoreLabel, oldOrder,\r
 -                viewport.getAlignment()));\r
 -        alignPanel.paintAlignment(true);\r
 -      }\r
 -    });\r
 -  }\r
 -\r
 -  /**\r
 -   * last hash for alignment's annotation array - used to minimise cost of\r
 -   * rebuild.\r
 -   */\r
 -  protected int _annotationScoreVectorHash;\r
 -\r
 -  /**\r
 -   * search the alignment and rebuild the sort by annotation score submenu the\r
 -   * last alignment annotation vector hash is stored to minimize cost of\r
 -   * rebuilding in subsequence calls.\r
 -   * \r
 -   */\r
 -  @Override\r
 -  public void buildSortByAnnotationScoresMenu()\r
 -  {\r
 -    if (viewport.getAlignment().getAlignmentAnnotation() == null)\r
 -    {\r
 -      return;\r
 -    }\r
 -\r
 -    if (viewport.getAlignment().getAlignmentAnnotation().hashCode() != _annotationScoreVectorHash)\r
 -    {\r
 -      sortByAnnotScore.removeAll();\r
 -      // almost certainly a quicker way to do this - but we keep it simple\r
 -      Hashtable scoreSorts = new Hashtable();\r
 -      AlignmentAnnotation aann[];\r
 -      for (SequenceI sqa : viewport.getAlignment().getSequences())\r
 -      {\r
 -        aann = sqa.getAnnotation();\r
 -        for (int i = 0; aann != null && i < aann.length; i++)\r
 -        {\r
 -          if (aann[i].hasScore() && aann[i].sequenceRef != null)\r
 -          {\r
 -            scoreSorts.put(aann[i].label, aann[i].label);\r
 -          }\r
 -        }\r
 -      }\r
 -      Enumeration labels = scoreSorts.keys();\r
 -      while (labels.hasMoreElements())\r
 -      {\r
 -        addSortByAnnotScoreMenuItem(sortByAnnotScore,\r
 -                (String) labels.nextElement());\r
 -      }\r
 -      sortByAnnotScore.setVisible(scoreSorts.size() > 0);\r
 -      scoreSorts.clear();\r
 -\r
 -      _annotationScoreVectorHash = viewport.getAlignment()\r
 -              .getAlignmentAnnotation().hashCode();\r
 -    }\r
 -  }\r
 -\r
 -  /**\r
 -   * Maintain the Order by->Displayed Tree menu. Creates a new menu item for a\r
 -   * TreePanel with an appropriate <code>jalview.analysis.AlignmentSorter</code>\r
 -   * call. Listeners are added to remove the menu item when the treePanel is\r
 -   * closed, and adjust the tree leaf to sequence mapping when the alignment is\r
 -   * modified.\r
 -   * \r
 -   * @param treePanel\r
 -   *          Displayed tree window.\r
 -   * @param title\r
 -   *          SortBy menu item title.\r
 -   */\r
 -  @Override\r
 -  public void buildTreeMenu()\r
 -  {\r
 -    sortByTreeMenu.removeAll();\r
 -\r
 -    Vector comps = (Vector) PaintRefresher.components.get(viewport\r
 -            .getSequenceSetId());\r
 -    Vector treePanels = new Vector();\r
 -    int i, iSize = comps.size();\r
 -    for (i = 0; i < iSize; i++)\r
 -    {\r
 -      if (comps.elementAt(i) instanceof TreePanel)\r
 -      {\r
 -        treePanels.add(comps.elementAt(i));\r
 -      }\r
 -    }\r
 -\r
 -    iSize = treePanels.size();\r
 -\r
 -    if (iSize < 1)\r
 -    {\r
 -      sortByTreeMenu.setVisible(false);\r
 -      return;\r
 -    }\r
 -\r
 -    sortByTreeMenu.setVisible(true);\r
 -\r
 -    for (i = 0; i < treePanels.size(); i++)\r
 -    {\r
 -      final TreePanel tp = (TreePanel) treePanels.elementAt(i);\r
 -      final JMenuItem item = new JMenuItem(tp.getTitle());\r
 -      final NJTree tree = ((TreePanel) treePanels.elementAt(i)).getTree();\r
 -      item.addActionListener(new java.awt.event.ActionListener()\r
 -      {\r
 -        @Override\r
 -        public void actionPerformed(ActionEvent e)\r
 -        {\r
 -          tp.sortByTree_actionPerformed(null);\r
 -          addHistoryItem(tp.sortAlignmentIn(alignPanel));\r
 -\r
 -        }\r
 -      });\r
 -\r
 -      sortByTreeMenu.add(item);\r
 -    }\r
 -  }\r
 -\r
 -  public boolean sortBy(AlignmentOrder alorder, String undoname)\r
 -  {\r
 -    SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();\r
 -    AlignmentSorter.sortBy(viewport.getAlignment(), alorder);\r
 -    if (undoname != null)\r
 -    {\r
 -      addHistoryItem(new OrderCommand(undoname, oldOrder,\r
 -              viewport.getAlignment()));\r
 -    }\r
 -    alignPanel.paintAlignment(true);\r
 -    return true;\r
 -  }\r
 -\r
 -  /**\r
 -   * Work out whether the whole set of sequences or just the selected set will\r
 -   * be submitted for multiple alignment.\r
 -   * \r
 -   */\r
 -  public jalview.datamodel.AlignmentView gatherSequencesForAlignment()\r
 -  {\r
 -    // Now, check we have enough sequences\r
 -    AlignmentView msa = null;\r
 -\r
 -    if ((viewport.getSelectionGroup() != null)\r
 -            && (viewport.getSelectionGroup().getSize() > 1))\r
 -    {\r
 -      // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to\r
 -      // some common interface!\r
 -      /*\r
 -       * SequenceGroup seqs = viewport.getSelectionGroup(); int sz; msa = new\r
 -       * SequenceI[sz = seqs.getSize(false)];\r
 -       * \r
 -       * for (int i = 0; i < sz; i++) { msa[i] = (SequenceI)\r
 -       * seqs.getSequenceAt(i); }\r
 -       */\r
 -      msa = viewport.getAlignmentView(true);\r
 -    }\r
 -    else\r
 -    {\r
 -      /*\r
 -       * Vector seqs = viewport.getAlignment().getSequences();\r
 -       * \r
 -       * if (seqs.size() > 1) { msa = new SequenceI[seqs.size()];\r
 -       * \r
 -       * for (int i = 0; i < seqs.size(); i++) { msa[i] = (SequenceI)\r
 -       * seqs.elementAt(i); } }\r
 -       */\r
 -      msa = viewport.getAlignmentView(false);\r
 -    }\r
 -    return msa;\r
 -  }\r
 -\r
 -  /**\r
 -   * Decides what is submitted to a secondary structure prediction service: the\r
 -   * first sequence in the alignment, or in the current selection, or, if the\r
 -   * alignment is 'aligned' (ie padded with gaps), then the currently selected\r
 -   * region or the whole alignment. (where the first sequence in the set is the\r
 -   * one that the prediction will be for).\r
 -   */\r
 -  public AlignmentView gatherSeqOrMsaForSecStrPrediction()\r
 -  {\r
 -    AlignmentView seqs = null;\r
 -\r
 -    if ((viewport.getSelectionGroup() != null)\r
 -            && (viewport.getSelectionGroup().getSize() > 0))\r
 -    {\r
 -      seqs = viewport.getAlignmentView(true);\r
 -    }\r
 -    else\r
 -    {\r
 -      seqs = viewport.getAlignmentView(false);\r
 -    }\r
 -    // limit sequences - JBPNote in future - could spawn multiple prediction\r
 -    // jobs\r
 -    // TODO: viewport.getAlignment().isAligned is a global state - the local\r
 -    // selection may well be aligned - we preserve 2.0.8 behaviour for moment.\r
 -    if (!viewport.getAlignment().isAligned(false))\r
 -    {\r
 -      seqs.setSequences(new SeqCigar[]\r
 -      { seqs.getSequences()[0] });\r
 -      // TODO: if seqs.getSequences().length>1 then should really have warned\r
 -      // user!\r
 -\r
 -    }\r
 -    return seqs;\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  @Override\r
 -  protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)\r
 -  {\r
 -    // Pick the tree file\r
 -    JalviewFileChooser chooser = new JalviewFileChooser(\r
 -            jalview.bin.Cache.getProperty("LAST_DIRECTORY"));\r
 -    chooser.setFileView(new JalviewFileView());\r
 +    }
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  public void PCAMenuItem_actionPerformed(ActionEvent e)
 +  {
 +    if (((viewport.getSelectionGroup() != null)
 +            && (viewport.getSelectionGroup().getSize() < 4) && (viewport
 +            .getSelectionGroup().getSize() > 0))
 +            || (viewport.getAlignment().getHeight() < 4))
 +    {
 +      JOptionPane.showInternalMessageDialog(this,
 +              MessageManager.getString("label.principal_component_analysis_must_take_least_four_input_sequences"),
 +              MessageManager.getString("label.sequence_selection_insufficient"),
 +              JOptionPane.WARNING_MESSAGE);
 +
 +      return;
 +    }
 +
 +    new PCAPanel(alignPanel);
 +  }
 +
 +  @Override
 +  public void autoCalculate_actionPerformed(ActionEvent e)
 +  {
 +    viewport.autoCalculateConsensus = autoCalculate.isSelected();
 +    if (viewport.autoCalculateConsensus)
 +    {
 +      viewport.firePropertyChange("alignment", null, viewport
 +              .getAlignment().getSequences());
 +    }
 +  }
 +
 +  @Override
 +  public void sortByTreeOption_actionPerformed(ActionEvent e)
 +  {
 +    viewport.sortByTree = sortByTree.isSelected();
 +  }
 +
 +  @Override
 +  protected void listenToViewSelections_actionPerformed(ActionEvent e)
 +  {
 +    viewport.followSelection = listenToViewSelections.isSelected();
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  public void averageDistanceTreeMenuItem_actionPerformed(ActionEvent e)
 +  {
 +    NewTreePanel("AV", "PID", "Average distance tree using PID");
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  public void neighbourTreeMenuItem_actionPerformed(ActionEvent e)
 +  {
 +    NewTreePanel("NJ", "PID", "Neighbour joining tree using PID");
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  protected void njTreeBlosumMenuItem_actionPerformed(ActionEvent e)
 +  {
 +    NewTreePanel("NJ", "BL", "Neighbour joining tree using BLOSUM62");
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  protected void avTreeBlosumMenuItem_actionPerformed(ActionEvent e)
 +  {
 +    NewTreePanel("AV", "BL", "Average distance tree using BLOSUM62");
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param type
 +   *          DOCUMENT ME!
 +   * @param pwType
 +   *          DOCUMENT ME!
 +   * @param title
 +   *          DOCUMENT ME!
 +   */
 +  void NewTreePanel(String type, String pwType, String title)
 +  {
 +    TreePanel tp;
 +
 +    if (viewport.getSelectionGroup() != null
 +            && viewport.getSelectionGroup().getSize() > 0)
 +    {
 +      if (viewport.getSelectionGroup().getSize() < 3)
 +      {
 +        JOptionPane
 +                .showMessageDialog(
 +                        Desktop.desktop,
 +                        MessageManager.getString("label.you_need_more_two_sequences_selected_build_tree"),
 +                        MessageManager.getString("label.not_enough_sequences"), JOptionPane.WARNING_MESSAGE);
 +        return;
 +      }
 +
 +      SequenceGroup sg = viewport.getSelectionGroup();
 +
 +      /* Decide if the selection is a column region */
 +      for (SequenceI _s : sg.getSequences())
 +      {
 +        if (_s.getLength() < sg.getEndRes())
 +        {
 +          JOptionPane
 +                  .showMessageDialog(
 +                          Desktop.desktop,
 +                          MessageManager.getString("label.selected_region_to_tree_may_only_contain_residues_or_gaps"),
 +                          MessageManager.getString("label.sequences_selection_not_aligned"),
 +                          JOptionPane.WARNING_MESSAGE);
 +
 +          return;
 +        }
 +      }
 +
 +      title = title + " on region";
 +      tp = new TreePanel(alignPanel, type, pwType);
 +    }
 +    else
 +    {
 +      // are the visible sequences aligned?
 +      if (!viewport.getAlignment().isAligned(false))
 +      {
 +        JOptionPane
 +                .showMessageDialog(
 +                        Desktop.desktop,
 +                        MessageManager.getString("label.sequences_must_be_aligned_before_creating_tree"),
 +                        MessageManager.getString("label.sequences_not_aligned"),
 +                        JOptionPane.WARNING_MESSAGE);
 +
 +        return;
 +      }
 +
 +      if (viewport.getAlignment().getHeight() < 2)
 +      {
 +        return;
 +      }
 +
 +      tp = new TreePanel(alignPanel, type, pwType);
 +    }
 +
 +    title += " from ";
 +
 +    if (viewport.viewName != null)
 +    {
 +      title += viewport.viewName + " of ";
 +    }
 +
 +    title += this.title;
 +
 +    Desktop.addInternalFrame(tp, title, 600, 500);
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param title
 +   *          DOCUMENT ME!
 +   * @param order
 +   *          DOCUMENT ME!
 +   */
 +  public void addSortByOrderMenuItem(String title,
 +          final AlignmentOrder order)
 +  {
 +    final JMenuItem item = new JMenuItem("by " + title);
 +    sort.add(item);
 +    item.addActionListener(new java.awt.event.ActionListener()
 +    {
 +      @Override
 +      public void actionPerformed(ActionEvent e)
 +      {
 +        SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
 +
 +        // TODO: JBPNote - have to map order entries to curent SequenceI
 +        // pointers
 +        AlignmentSorter.sortBy(viewport.getAlignment(), order);
 +
 +        addHistoryItem(new OrderCommand(order.getName(), oldOrder, viewport
 +                .getAlignment()));
 +
 +        alignPanel.paintAlignment(true);
 +      }
 +    });
 +  }
 +
 +  /**
 +   * Add a new sort by annotation score menu item
 +   * 
 +   * @param sort
 +   *          the menu to add the option to
 +   * @param scoreLabel
 +   *          the label used to retrieve scores for each sequence on the
 +   *          alignment
 +   */
 +  public void addSortByAnnotScoreMenuItem(JMenu sort,
 +          final String scoreLabel)
 +  {
 +    final JMenuItem item = new JMenuItem(scoreLabel);
 +    sort.add(item);
 +    item.addActionListener(new java.awt.event.ActionListener()
 +    {
 +      @Override
 +      public void actionPerformed(ActionEvent e)
 +      {
 +        SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
 +        AlignmentSorter.sortByAnnotationScore(scoreLabel,
 +                viewport.getAlignment());// ,viewport.getSelectionGroup());
 +        addHistoryItem(new OrderCommand("Sort by " + scoreLabel, oldOrder,
 +                viewport.getAlignment()));
 +        alignPanel.paintAlignment(true);
 +      }
 +    });
 +  }
 +
 +  /**
 +   * last hash for alignment's annotation array - used to minimise cost of
 +   * rebuild.
 +   */
 +  protected int _annotationScoreVectorHash;
 +
 +  /**
 +   * search the alignment and rebuild the sort by annotation score submenu the
 +   * last alignment annotation vector hash is stored to minimize cost of
 +   * rebuilding in subsequence calls.
 +   * 
 +   */
 +  @Override
 +  public void buildSortByAnnotationScoresMenu()
 +  {
 +    if (viewport.getAlignment().getAlignmentAnnotation() == null)
 +    {
 +      return;
 +    }
 +
 +    if (viewport.getAlignment().getAlignmentAnnotation().hashCode() != _annotationScoreVectorHash)
 +    {
 +      sortByAnnotScore.removeAll();
 +      // almost certainly a quicker way to do this - but we keep it simple
 +      Hashtable scoreSorts = new Hashtable();
 +      AlignmentAnnotation aann[];
 +      for (SequenceI sqa : viewport.getAlignment().getSequences())
 +      {
 +        aann = sqa.getAnnotation();
 +        for (int i = 0; aann != null && i < aann.length; i++)
 +        {
 +          if (aann[i].hasScore() && aann[i].sequenceRef != null)
 +          {
 +            scoreSorts.put(aann[i].label, aann[i].label);
 +          }
 +        }
 +      }
 +      Enumeration labels = scoreSorts.keys();
 +      while (labels.hasMoreElements())
 +      {
 +        addSortByAnnotScoreMenuItem(sortByAnnotScore,
 +                (String) labels.nextElement());
 +      }
 +      sortByAnnotScore.setVisible(scoreSorts.size() > 0);
 +      scoreSorts.clear();
 +
 +      _annotationScoreVectorHash = viewport.getAlignment()
 +              .getAlignmentAnnotation().hashCode();
 +    }
 +  }
 +
 +  /**
 +   * Maintain the Order by->Displayed Tree menu. Creates a new menu item for a
 +   * TreePanel with an appropriate <code>jalview.analysis.AlignmentSorter</code>
 +   * call. Listeners are added to remove the menu item when the treePanel is
 +   * closed, and adjust the tree leaf to sequence mapping when the alignment is
 +   * modified.
 +   * 
 +   * @param treePanel
 +   *          Displayed tree window.
 +   * @param title
 +   *          SortBy menu item title.
 +   */
 +  @Override
 +  public void buildTreeMenu()
 +  {
 +    sortByTreeMenu.removeAll();
 +
 +    Vector comps = (Vector) PaintRefresher.components.get(viewport
 +            .getSequenceSetId());
 +    Vector treePanels = new Vector();
 +    int i, iSize = comps.size();
 +    for (i = 0; i < iSize; i++)
 +    {
 +      if (comps.elementAt(i) instanceof TreePanel)
 +      {
 +        treePanels.add(comps.elementAt(i));
 +      }
 +    }
 +
 +    iSize = treePanels.size();
 +
 +    if (iSize < 1)
 +    {
 +      sortByTreeMenu.setVisible(false);
 +      return;
 +    }
 +
 +    sortByTreeMenu.setVisible(true);
 +
 +    for (i = 0; i < treePanels.size(); i++)
 +    {
 +      final TreePanel tp = (TreePanel) treePanels.elementAt(i);
 +      final JMenuItem item = new JMenuItem(tp.getTitle());
 +      final NJTree tree = ((TreePanel) treePanels.elementAt(i)).getTree();
 +      item.addActionListener(new java.awt.event.ActionListener()
 +      {
 +        @Override
 +        public void actionPerformed(ActionEvent e)
 +        {
 +          tp.sortByTree_actionPerformed(null);
 +          addHistoryItem(tp.sortAlignmentIn(alignPanel));
 +
 +        }
 +      });
 +
 +      sortByTreeMenu.add(item);
 +    }
 +  }
 +
 +  public boolean sortBy(AlignmentOrder alorder, String undoname)
 +  {
 +    SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
 +    AlignmentSorter.sortBy(viewport.getAlignment(), alorder);
 +    if (undoname != null)
 +    {
 +      addHistoryItem(new OrderCommand(undoname, oldOrder,
 +              viewport.getAlignment()));
 +    }
 +    alignPanel.paintAlignment(true);
 +    return true;
 +  }
 +
 +  /**
 +   * Work out whether the whole set of sequences or just the selected set will
 +   * be submitted for multiple alignment.
 +   * 
 +   */
 +  public jalview.datamodel.AlignmentView gatherSequencesForAlignment()
 +  {
 +    // Now, check we have enough sequences
 +    AlignmentView msa = null;
 +
 +    if ((viewport.getSelectionGroup() != null)
 +            && (viewport.getSelectionGroup().getSize() > 1))
 +    {
 +      // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to
 +      // some common interface!
 +      /*
 +       * SequenceGroup seqs = viewport.getSelectionGroup(); int sz; msa = new
 +       * SequenceI[sz = seqs.getSize(false)];
 +       * 
 +       * for (int i = 0; i < sz; i++) { msa[i] = (SequenceI)
 +       * seqs.getSequenceAt(i); }
 +       */
 +      msa = viewport.getAlignmentView(true);
 +    }
 +    else
 +    {
 +      /*
 +       * Vector seqs = viewport.getAlignment().getSequences();
 +       * 
 +       * if (seqs.size() > 1) { msa = new SequenceI[seqs.size()];
 +       * 
 +       * for (int i = 0; i < seqs.size(); i++) { msa[i] = (SequenceI)
 +       * seqs.elementAt(i); } }
 +       */
 +      msa = viewport.getAlignmentView(false);
 +    }
 +    return msa;
 +  }
 +
 +  /**
 +   * Decides what is submitted to a secondary structure prediction service: the
 +   * first sequence in the alignment, or in the current selection, or, if the
 +   * alignment is 'aligned' (ie padded with gaps), then the currently selected
 +   * region or the whole alignment. (where the first sequence in the set is the
 +   * one that the prediction will be for).
 +   */
 +  public AlignmentView gatherSeqOrMsaForSecStrPrediction()
 +  {
 +    AlignmentView seqs = null;
 +
 +    if ((viewport.getSelectionGroup() != null)
 +            && (viewport.getSelectionGroup().getSize() > 0))
 +    {
 +      seqs = viewport.getAlignmentView(true);
 +    }
 +    else
 +    {
 +      seqs = viewport.getAlignmentView(false);
 +    }
 +    // limit sequences - JBPNote in future - could spawn multiple prediction
 +    // jobs
 +    // TODO: viewport.getAlignment().isAligned is a global state - the local
 +    // selection may well be aligned - we preserve 2.0.8 behaviour for moment.
 +    if (!viewport.getAlignment().isAligned(false))
 +    {
 +      seqs.setSequences(new SeqCigar[]
 +      { seqs.getSequences()[0] });
 +      // TODO: if seqs.getSequences().length>1 then should really have warned
 +      // user!
 +
 +    }
 +    return seqs;
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  @Override
 +  protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
 +  {
 +    // Pick the tree file
 +    JalviewFileChooser chooser = new JalviewFileChooser(
 +            jalview.bin.Cache.getProperty("LAST_DIRECTORY"));
 +    chooser.setFileView(new JalviewFileView());
-     chooser.setDialogTitle("Select a newick-like tree file");
-     chooser.setToolTipText("Load a tree file");
+     chooser.setDialogTitle(MessageManager.getString("label.select_newick_like_tree_file"));\r
+     chooser.setToolTipText(MessageManager.getString("label.load_tree_file"));\r
 -\r
 -    int value = chooser.showOpenDialog(null);\r
 -\r
 -    if (value == JalviewFileChooser.APPROVE_OPTION)\r
 -    {\r
 -      String choice = chooser.getSelectedFile().getPath();\r
 -      jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);\r
 -      jalview.io.NewickFile fin = null;\r
 -      try\r
 -      {\r
 -        fin = new jalview.io.NewickFile(choice, "File");\r
 -        viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());\r
 -      } catch (Exception ex)\r
 -      {\r
 -        JOptionPane.showMessageDialog(Desktop.desktop, ex.getMessage(),\r
 -                MessageManager.getString("label.problem_reading_tree_file"), JOptionPane.WARNING_MESSAGE);\r
 -        ex.printStackTrace();\r
 -      }\r
 -      if (fin != null && fin.hasWarningMessage())\r
 -      {\r
 -        JOptionPane.showMessageDialog(Desktop.desktop,\r
 -                fin.getWarningMessage(), MessageManager.getString("label.possible_problem_with_tree_file"),\r
 -                JOptionPane.WARNING_MESSAGE);\r
 -      }\r
 -    }\r
 -  }\r
 -\r
 -  @Override\r
 -  protected void tcoffeeColorScheme_actionPerformed(ActionEvent e)\r
 -  {\r
 -    changeColour(new TCoffeeColourScheme(alignPanel.getAlignment()));\r
 -  }\r
 -\r
 -  public TreePanel ShowNewickTree(NewickFile nf, String title)\r
 -  {\r
 -    return ShowNewickTree(nf, title, 600, 500, 4, 5);\r
 -  }\r
 -\r
 -  public TreePanel ShowNewickTree(NewickFile nf, String title,\r
 -          AlignmentView input)\r
 -  {\r
 -    return ShowNewickTree(nf, title, input, 600, 500, 4, 5);\r
 -  }\r
 -\r
 -  public TreePanel ShowNewickTree(NewickFile nf, String title, int w,\r
 -          int h, int x, int y)\r
 -  {\r
 -    return ShowNewickTree(nf, title, null, w, h, x, y);\r
 -  }\r
 -\r
 -  /**\r
 -   * Add a treeviewer for the tree extracted from a newick file object to the\r
 -   * current alignment view\r
 -   * \r
 -   * @param nf\r
 -   *          the tree\r
 -   * @param title\r
 -   *          tree viewer title\r
 -   * @param input\r
 -   *          Associated alignment input data (or null)\r
 -   * @param w\r
 -   *          width\r
 -   * @param h\r
 -   *          height\r
 -   * @param x\r
 -   *          position\r
 -   * @param y\r
 -   *          position\r
 -   * @return TreePanel handle\r
 -   */\r
 -  public TreePanel ShowNewickTree(NewickFile nf, String title,\r
 -          AlignmentView input, int w, int h, int x, int y)\r
 -  {\r
 -    TreePanel tp = null;\r
 -\r
 -    try\r
 -    {\r
 -      nf.parse();\r
 -\r
 -      if (nf.getTree() != null)\r
 -      {\r
 -        tp = new TreePanel(alignPanel, "FromFile", title, nf, input);\r
 -\r
 -        tp.setSize(w, h);\r
 -\r
 -        if (x > 0 && y > 0)\r
 -        {\r
 -          tp.setLocation(x, y);\r
 -        }\r
 -\r
 -        Desktop.addInternalFrame(tp, title, w, h);\r
 -      }\r
 -    } catch (Exception ex)\r
 -    {\r
 -      ex.printStackTrace();\r
 -    }\r
 -\r
 -    return tp;\r
 -  }\r
 -\r
 -  private boolean buildingMenu = false;\r
 -\r
 -  /**\r
 -   * Generates menu items and listener event actions for web service clients\r
 -   * \r
 -   */\r
 -  public void BuildWebServiceMenu()\r
 -  {\r
 -    while (buildingMenu)\r
 -    {\r
 -      try\r
 -      {\r
 -        System.err.println("Waiting for building menu to finish.");\r
 -        Thread.sleep(10);\r
 -      } catch (Exception e)\r
 -      {\r
 -      }\r
 -      ;\r
 -    }\r
 -    final AlignFrame me = this;\r
 -    buildingMenu = true;\r
 -    new Thread(new Runnable()\r
 -    {\r
 -      @Override\r
 -      public void run()\r
 -      {\r
 -        final List<JMenuItem> legacyItems=new ArrayList<JMenuItem>();\r
 -        try\r
 -        {\r
 -          System.err.println("Building ws menu again "\r
 -                  + Thread.currentThread());\r
 -          // TODO: add support for context dependent disabling of services based\r
 -          // on\r
 -          // alignment and current selection\r
 -          // TODO: add additional serviceHandle parameter to specify abstract\r
 -          // handler\r
 -          // class independently of AbstractName\r
 -          // TODO: add in rediscovery GUI function to restart discoverer\r
 -          // TODO: group services by location as well as function and/or\r
 -          // introduce\r
 -          // object broker mechanism.\r
 -          final Vector<JMenu> wsmenu = new Vector<JMenu>();\r
 -          final IProgressIndicator af = me;\r
 -          final JMenu msawsmenu = new JMenu("Alignment");\r
 -          final JMenu secstrmenu = new JMenu(\r
 -                  "Secondary Structure Prediction");\r
 -          final JMenu seqsrchmenu = new JMenu("Sequence Database Search");\r
 -          final JMenu analymenu = new JMenu("Analysis");\r
 -          final JMenu dismenu = new JMenu("Protein Disorder");\r
 -          // JAL-940 - only show secondary structure prediction services from\r
 -          // the legacy server\r
 -          if (// Cache.getDefault("SHOW_JWS1_SERVICES", true)\r
 -              // &&\r
 -          Discoverer.services != null && (Discoverer.services.size() > 0))\r
 -          {\r
 -            // TODO: refactor to allow list of AbstractName/Handler bindings to\r
 -            // be\r
 -            // stored or retrieved from elsewhere\r
 -            // No MSAWS used any more:\r
 -            // Vector msaws = null; // (Vector) Discoverer.services.get("MsaWS");\r
 -            Vector secstrpr = (Vector) Discoverer.services\r
 -                    .get("SecStrPred");\r
 -            if (secstrpr != null)\r
 -            {\r
 -              // Add any secondary structure prediction services\r
 -              for (int i = 0, j = secstrpr.size(); i < j; i++)\r
 -              {\r
 -                final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) secstrpr\r
 -                        .get(i);\r
 -                jalview.ws.WSMenuEntryProviderI impl = jalview.ws.jws1.Discoverer\r
 -                        .getServiceClient(sh);\r
 -                int p=secstrmenu.getItemCount();\r
 -                impl.attachWSMenuEntry(secstrmenu, me);\r
 -                int q=secstrmenu.getItemCount();\r
 -                for (int litm=p;litm<q; litm++)\r
 -                {\r
 -                  legacyItems.add(secstrmenu.getItem(litm));\r
 -                }\r
 -              }\r
 -            }\r
 -          }\r
 -          \r
 -          // Add all submenus in the order they should appear on the web\r
 -          // services menu\r
 -          wsmenu.add(msawsmenu);\r
 -          wsmenu.add(secstrmenu);\r
 -          wsmenu.add(dismenu);\r
 -          wsmenu.add(analymenu);\r
 -          // No search services yet\r
 -          // wsmenu.add(seqsrchmenu);\r
 -\r
 -          javax.swing.SwingUtilities.invokeLater(new Runnable()\r
 -          {\r
 -            @Override\r
 -            public void run()\r
 -            {\r
 -              try\r
 -              {\r
 -                webService.removeAll();\r
 -                // first, add discovered services onto the webservices menu\r
 -                if (wsmenu.size() > 0)\r
 -                {\r
 -                  for (int i = 0, j = wsmenu.size(); i < j; i++)\r
 -                  {\r
 -                    webService.add(wsmenu.get(i));\r
 -                  }\r
 -                }\r
 -                else\r
 -                {\r
 -                  webService.add(me.webServiceNoServices);\r
 -                }\r
 -                // TODO: move into separate menu builder class.\r
 -                boolean new_sspred=false;\r
 -                if (Cache.getDefault("SHOW_JWS2_SERVICES", true))\r
 -                {\r
 -                  Jws2Discoverer jws2servs = Jws2Discoverer.getDiscoverer();\r
 -                  if (jws2servs != null)\r
 -                  {\r
 -                    if (jws2servs.hasServices())\r
 -                    {\r
 -                      jws2servs.attachWSMenuEntry(webService, me);\r
 -                      for (Jws2Instance sv:jws2servs.getServices()) {\r
 -                        if (sv.description.toLowerCase().contains("jpred"))\r
 -                        {\r
 -                          for (JMenuItem jmi:legacyItems)\r
 -                          {\r
 -                            jmi.setVisible(false);\r
 -                          }\r
 -                        }\r
 -                      }\r
 -                      \r
 -                    }\r
 -                    if (jws2servs.isRunning())\r
 -                    {\r
 -                      JMenuItem tm = new JMenuItem(\r
 -                              "Still discovering JABA Services");\r
 -                      tm.setEnabled(false);\r
 -                      webService.add(tm);\r
 -                    }\r
 -                  }\r
 -                }\r
 -                build_urlServiceMenu(me.webService);\r
 -                build_fetchdbmenu(webService);\r
 -                for (JMenu item : wsmenu)\r
 -                {\r
 -                  if (item.getItemCount() == 0)\r
 -                  {\r
 -                    item.setEnabled(false);\r
 -                  }\r
 -                  else\r
 -                  {\r
 -                    item.setEnabled(true);\r
 -                  }\r
 -                }\r
 -              } catch (Exception e)\r
 -              {\r
 -                Cache.log\r
 -                        .debug("Exception during web service menu building process.",\r
 -                                e);\r
 -              }\r
 -              ;\r
 -            }\r
 -          });\r
 -        } catch (Exception e)\r
 -        {\r
 -        }\r
 -        ;\r
 -\r
 -        buildingMenu = false;\r
 -      }\r
 -    }).start();\r
 -\r
 -  }\r
 -\r
 -  /**\r
 -   * construct any groupURL type service menu entries.\r
 -   * \r
 -   * @param webService\r
 -   */\r
 -  private void build_urlServiceMenu(JMenu webService)\r
 -  {\r
 -    // TODO: remove this code when 2.7 is released\r
 -    // DEBUG - alignmentView\r
 -    /*\r
 -     * JMenuItem testAlView = new JMenuItem("Test AlignmentView"); final\r
 -     * AlignFrame af = this; testAlView.addActionListener(new ActionListener() {\r
 -     * \r
 -     * @Override public void actionPerformed(ActionEvent e) {\r
 -     * jalview.datamodel.AlignmentView\r
 -     * .testSelectionViews(af.viewport.getAlignment(),\r
 -     * af.viewport.getColumnSelection(), af.viewport.selectionGroup); }\r
 -     * \r
 -     * }); webService.add(testAlView);\r
 -     */\r
 -    // TODO: refactor to RestClient discoverer and merge menu entries for\r
 -    // rest-style services with other types of analysis/calculation service\r
 -    // SHmmr test client - still being implemented.\r
 -    // DEBUG - alignmentView\r
 -\r
 -    for (jalview.ws.rest.RestClient client : jalview.ws.rest.RestClient\r
 -            .getRestClients())\r
 -    {\r
 -      client.attachWSMenuEntry(\r
 -              JvSwingUtils.findOrCreateMenu(webService, client.getAction()),\r
 -              this);\r
 -    }\r
 -\r
 -    if (Cache.getDefault("SHOW_ENFIN_SERVICES", true))\r
 -    {\r
 -      jalview.ws.EnfinEnvision2OneWay.getInstance().attachWSMenuEntry(\r
 -              webService, this);\r
 -    }\r
 -  }\r
 -\r
 -  /*\r
 -   * public void vamsasStore_actionPerformed(ActionEvent e) { JalviewFileChooser\r
 -   * chooser = new JalviewFileChooser(jalview.bin.Cache.\r
 -   * getProperty("LAST_DIRECTORY"));\r
 -   * \r
 -   * chooser.setFileView(new JalviewFileView()); chooser.setDialogTitle("Export\r
 -   * to Vamsas file"); chooser.setToolTipText("Export");\r
 -   * \r
 -   * int value = chooser.showSaveDialog(this);\r
 -   * \r
 -   * if (value == JalviewFileChooser.APPROVE_OPTION) {\r
 -   * jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);\r
 -   * //vs.store(chooser.getSelectedFile().getAbsolutePath() ); vs.storeJalview(\r
 -   * chooser.getSelectedFile().getAbsolutePath(), this); } }\r
 -   */\r
 -  /**\r
 -   * prototype of an automatically enabled/disabled analysis function\r
 -   * \r
 -   */\r
 -  protected void setShowProductsEnabled()\r
 -  {\r
 -    SequenceI[] selection = viewport.getSequenceSelection();\r
 -    if (canShowProducts(selection, viewport.getSelectionGroup() != null,\r
 -            viewport.getAlignment().getDataset()))\r
 -    {\r
 -      showProducts.setEnabled(true);\r
 -\r
 -    }\r
 -    else\r
 -    {\r
 -      showProducts.setEnabled(false);\r
 -    }\r
 -  }\r
 -\r
 -  /**\r
 -   * search selection for sequence xRef products and build the show products\r
 -   * menu.\r
 -   * \r
 -   * @param selection\r
 -   * @param dataset\r
 -   * @return true if showProducts menu should be enabled.\r
 -   */\r
 -  public boolean canShowProducts(SequenceI[] selection,\r
 -          boolean isRegionSelection, Alignment dataset)\r
 -  {\r
 -    boolean showp = false;\r
 -    try\r
 -    {\r
 -      showProducts.removeAll();\r
 -      final boolean dna = viewport.getAlignment().isNucleotide();\r
 -      final Alignment ds = dataset;\r
 -      String[] ptypes = (selection == null || selection.length == 0) ? null\r
 -              : CrossRef.findSequenceXrefTypes(dna, selection, dataset);\r
 -      // Object[] prods =\r
 -      // CrossRef.buildXProductsList(viewport.getAlignment().isNucleotide(),\r
 -      // selection, dataset, true);\r
 -      final SequenceI[] sel = selection;\r
 -      for (int t = 0; ptypes != null && t < ptypes.length; t++)\r
 -      {\r
 -        showp = true;\r
 -        final boolean isRegSel = isRegionSelection;\r
 -        final AlignFrame af = this;\r
 -        final String source = ptypes[t];\r
 -        JMenuItem xtype = new JMenuItem(ptypes[t]);\r
 -        xtype.addActionListener(new ActionListener()\r
 -        {\r
 -\r
 -          @Override\r
 -          public void actionPerformed(ActionEvent e)\r
 -          {\r
 -            // TODO: new thread for this call with vis-delay\r
 -            af.showProductsFor(af.viewport.getSequenceSelection(), ds,\r
 -                    isRegSel, dna, source);\r
 -          }\r
 -\r
 -        });\r
 -        showProducts.add(xtype);\r
 -      }\r
 -      showProducts.setVisible(showp);\r
 -      showProducts.setEnabled(showp);\r
 -    } catch (Exception e)\r
 -    {\r
 -      jalview.bin.Cache.log\r
 -              .warn("canTranslate threw an exception - please report to help@jalview.org",\r
 -                      e);\r
 -      return false;\r
 -    }\r
 -    return showp;\r
 -  }\r
 -\r
 -  protected void showProductsFor(SequenceI[] sel, Alignment ds,\r
 -          boolean isRegSel, boolean dna, String source)\r
 -  {\r
 -    final boolean fisRegSel = isRegSel;\r
 -    final boolean fdna = dna;\r
 -    final String fsrc = source;\r
 -    final AlignFrame ths = this;\r
 -    final SequenceI[] fsel = sel;\r
 -    Runnable foo = new Runnable()\r
 -    {\r
 -\r
 -      @Override\r
 -      public void run()\r
 -      {\r
 -        final long sttime = System.currentTimeMillis();\r
 -        ths.setProgressBar("Searching for sequences from " + fsrc, sttime);\r
 -        try\r
 -        {\r
 -          Alignment ds = ths.getViewport().getAlignment().getDataset(); // update\r
 -          // our local\r
 -          // dataset\r
 -          // reference\r
 -          Alignment prods = CrossRef\r
 -                  .findXrefSequences(fsel, fdna, fsrc, ds);\r
 -          if (prods != null)\r
 -          {\r
 -            SequenceI[] sprods = new SequenceI[prods.getHeight()];\r
 -            for (int s = 0; s < sprods.length; s++)\r
 -            {\r
 -              sprods[s] = (prods.getSequenceAt(s)).deriveSequence();\r
 -              if (ds.getSequences() == null\r
 -                      || !ds.getSequences().contains(\r
 -                              sprods[s].getDatasetSequence()))\r
 -                ds.addSequence(sprods[s].getDatasetSequence());\r
 -              sprods[s].updatePDBIds();\r
 -            }\r
 -            Alignment al = new Alignment(sprods);\r
 -            AlignedCodonFrame[] cf = prods.getCodonFrames();\r
 -            al.setDataset(ds);\r
 -            for (int s = 0; cf != null && s < cf.length; s++)\r
 -            {\r
 -              al.addCodonFrame(cf[s]);\r
 -              cf[s] = null;\r
 -            }\r
 -            AlignFrame naf = new AlignFrame(al, DEFAULT_WIDTH,\r
 -                    DEFAULT_HEIGHT);\r
 -            String newtitle = "" + ((fdna) ? "Proteins " : "Nucleotides ")\r
 -                    + " for " + ((fisRegSel) ? "selected region of " : "")\r
 -                    + getTitle();\r
 -            Desktop.addInternalFrame(naf, newtitle, DEFAULT_WIDTH,\r
 -                    DEFAULT_HEIGHT);\r
 -          }\r
 -          else\r
 -          {\r
 -            System.err.println("No Sequences generated for xRef type "\r
 -                    + fsrc);\r
 -          }\r
 -        } catch (Exception e)\r
 -        {\r
 -          jalview.bin.Cache.log.error(\r
 -                  "Exception when finding crossreferences", e);\r
 -        } catch (OutOfMemoryError e)\r
 -        {\r
 -          new OOMWarning("whilst fetching crossreferences", e);\r
 -        } catch (Error e)\r
 -        {\r
 -          jalview.bin.Cache.log.error("Error when finding crossreferences",\r
 -                  e);\r
 -        }\r
 -        ths.setProgressBar("Finished searching for sequences from " + fsrc,\r
 -                sttime);\r
 -      }\r
 -\r
 -    };\r
 -    Thread frunner = new Thread(foo);\r
 -    frunner.start();\r
 -  }\r
 -\r
 -  public boolean canShowTranslationProducts(SequenceI[] selection,\r
 -          AlignmentI alignment)\r
 -  {\r
 -    // old way\r
 -    try\r
 -    {\r
 -      return (jalview.analysis.Dna.canTranslate(selection,\r
 -              viewport.getViewAsVisibleContigs(true)));\r
 -    } catch (Exception e)\r
 -    {\r
 -      jalview.bin.Cache.log\r
 -              .warn("canTranslate threw an exception - please report to help@jalview.org",\r
 -                      e);\r
 -      return false;\r
 -    }\r
 -  }\r
 -\r
 -  @Override\r
 -  public void showProducts_actionPerformed(ActionEvent e)\r
 -  {\r
 -    // /////////////////////////////\r
 -    // Collect Data to be translated/transferred\r
 -\r
 -    SequenceI[] selection = viewport.getSequenceSelection();\r
 -    AlignmentI al = null;\r
 -    try\r
 -    {\r
 -      al = jalview.analysis.Dna.CdnaTranslate(selection, viewport\r
 -              .getViewAsVisibleContigs(true), viewport.getGapCharacter(),\r
 -              viewport.getAlignment().getDataset());\r
 -    } catch (Exception ex)\r
 -    {\r
 -      al = null;\r
 -      jalview.bin.Cache.log.debug("Exception during translation.", ex);\r
 -    }\r
 -    if (al == null)\r
 -    {\r
 -      JOptionPane\r
 -              .showMessageDialog(\r
 -                      Desktop.desktop,\r
 -                      MessageManager.getString("label.select_at_least_three_bases_in_at_least_one_sequence_to_cDNA_translation"),\r
 -                      MessageManager.getString("label.translation_failed"), JOptionPane.WARNING_MESSAGE);\r
 -    }\r
 -    else\r
 -    {\r
 -      AlignFrame af = new AlignFrame(al, DEFAULT_WIDTH, DEFAULT_HEIGHT);\r
 +
 +    int value = chooser.showOpenDialog(null);
 +
 +    if (value == JalviewFileChooser.APPROVE_OPTION)
 +    {
 +      String choice = chooser.getSelectedFile().getPath();
 +      jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
 +      jalview.io.NewickFile fin = null;
 +      try
 +      {
 +        fin = new jalview.io.NewickFile(choice, "File");
 +        viewport.setCurrentTree(ShowNewickTree(fin, choice).getTree());
 +      } catch (Exception ex)
 +      {
 +        JOptionPane.showMessageDialog(Desktop.desktop, ex.getMessage(),
 +                MessageManager.getString("label.problem_reading_tree_file"), JOptionPane.WARNING_MESSAGE);
 +        ex.printStackTrace();
 +      }
 +      if (fin != null && fin.hasWarningMessage())
 +      {
 +        JOptionPane.showMessageDialog(Desktop.desktop,
 +                fin.getWarningMessage(), MessageManager.getString("label.possible_problem_with_tree_file"),
 +                JOptionPane.WARNING_MESSAGE);
 +      }
 +    }
 +  }
 +
 +  @Override
 +  protected void tcoffeeColorScheme_actionPerformed(ActionEvent e)
 +  {
 +    changeColour(new TCoffeeColourScheme(alignPanel.getAlignment()));
 +  }
 +
 +  public TreePanel ShowNewickTree(NewickFile nf, String title)
 +  {
 +    return ShowNewickTree(nf, title, 600, 500, 4, 5);
 +  }
 +
 +  public TreePanel ShowNewickTree(NewickFile nf, String title,
 +          AlignmentView input)
 +  {
 +    return ShowNewickTree(nf, title, input, 600, 500, 4, 5);
 +  }
 +
 +  public TreePanel ShowNewickTree(NewickFile nf, String title, int w,
 +          int h, int x, int y)
 +  {
 +    return ShowNewickTree(nf, title, null, w, h, x, y);
 +  }
 +
 +  /**
 +   * Add a treeviewer for the tree extracted from a newick file object to the
 +   * current alignment view
 +   * 
 +   * @param nf
 +   *          the tree
 +   * @param title
 +   *          tree viewer title
 +   * @param input
 +   *          Associated alignment input data (or null)
 +   * @param w
 +   *          width
 +   * @param h
 +   *          height
 +   * @param x
 +   *          position
 +   * @param y
 +   *          position
 +   * @return TreePanel handle
 +   */
 +  public TreePanel ShowNewickTree(NewickFile nf, String title,
 +          AlignmentView input, int w, int h, int x, int y)
 +  {
 +    TreePanel tp = null;
 +
 +    try
 +    {
 +      nf.parse();
 +
 +      if (nf.getTree() != null)
 +      {
 +        tp = new TreePanel(alignPanel, "FromFile", title, nf, input);
 +
 +        tp.setSize(w, h);
 +
 +        if (x > 0 && y > 0)
 +        {
 +          tp.setLocation(x, y);
 +        }
 +
 +        Desktop.addInternalFrame(tp, title, w, h);
 +      }
 +    } catch (Exception ex)
 +    {
 +      ex.printStackTrace();
 +    }
 +
 +    return tp;
 +  }
 +
 +  private boolean buildingMenu = false;
 +
 +  /**
 +   * Generates menu items and listener event actions for web service clients
 +   * 
 +   */
 +  public void BuildWebServiceMenu()
 +  {
 +    while (buildingMenu)
 +    {
 +      try
 +      {
 +        System.err.println("Waiting for building menu to finish.");
 +        Thread.sleep(10);
 +      } catch (Exception e)
 +      {
 +      }
 +      ;
 +    }
 +    final AlignFrame me = this;
 +    buildingMenu = true;
 +    new Thread(new Runnable()
 +    {
 +      @Override
 +      public void run()
 +      {
 +        final List<JMenuItem> legacyItems=new ArrayList<JMenuItem>();
 +        try
 +        {
 +          System.err.println("Building ws menu again "
 +                  + Thread.currentThread());
 +          // TODO: add support for context dependent disabling of services based
 +          // on
 +          // alignment and current selection
 +          // TODO: add additional serviceHandle parameter to specify abstract
 +          // handler
 +          // class independently of AbstractName
 +          // TODO: add in rediscovery GUI function to restart discoverer
 +          // TODO: group services by location as well as function and/or
 +          // introduce
 +          // object broker mechanism.
 +          final Vector<JMenu> wsmenu = new Vector<JMenu>();
 +          final IProgressIndicator af = me;
 +          final JMenu msawsmenu = new JMenu("Alignment");
 +          final JMenu secstrmenu = new JMenu(
 +                  "Secondary Structure Prediction");
 +          final JMenu seqsrchmenu = new JMenu("Sequence Database Search");
 +          final JMenu analymenu = new JMenu("Analysis");
 +          final JMenu dismenu = new JMenu("Protein Disorder");
 +          // JAL-940 - only show secondary structure prediction services from
 +          // the legacy server
 +          if (// Cache.getDefault("SHOW_JWS1_SERVICES", true)
 +              // &&
 +          Discoverer.services != null && (Discoverer.services.size() > 0))
 +          {
 +            // TODO: refactor to allow list of AbstractName/Handler bindings to
 +            // be
 +            // stored or retrieved from elsewhere
 +            // No MSAWS used any more:
 +            // Vector msaws = null; // (Vector) Discoverer.services.get("MsaWS");
 +            Vector secstrpr = (Vector) Discoverer.services
 +                    .get("SecStrPred");
 +            if (secstrpr != null)
 +            {
 +              // Add any secondary structure prediction services
 +              for (int i = 0, j = secstrpr.size(); i < j; i++)
 +              {
 +                final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) secstrpr
 +                        .get(i);
 +                jalview.ws.WSMenuEntryProviderI impl = jalview.ws.jws1.Discoverer
 +                        .getServiceClient(sh);
 +                int p=secstrmenu.getItemCount();
 +                impl.attachWSMenuEntry(secstrmenu, me);
 +                int q=secstrmenu.getItemCount();
 +                for (int litm=p;litm<q; litm++)
 +                {
 +                  legacyItems.add(secstrmenu.getItem(litm));
 +                }
 +              }
 +            }
 +          }
 +          
 +          // Add all submenus in the order they should appear on the web
 +          // services menu
 +          wsmenu.add(msawsmenu);
 +          wsmenu.add(secstrmenu);
 +          wsmenu.add(dismenu);
 +          wsmenu.add(analymenu);
 +          // No search services yet
 +          // wsmenu.add(seqsrchmenu);
 +
 +          javax.swing.SwingUtilities.invokeLater(new Runnable()
 +          {
 +            @Override
 +            public void run()
 +            {
 +              try
 +              {
 +                webService.removeAll();
 +                // first, add discovered services onto the webservices menu
 +                if (wsmenu.size() > 0)
 +                {
 +                  for (int i = 0, j = wsmenu.size(); i < j; i++)
 +                  {
 +                    webService.add(wsmenu.get(i));
 +                  }
 +                }
 +                else
 +                {
 +                  webService.add(me.webServiceNoServices);
 +                }
 +                // TODO: move into separate menu builder class.
 +                boolean new_sspred=false;
 +                if (Cache.getDefault("SHOW_JWS2_SERVICES", true))
 +                {
 +                  Jws2Discoverer jws2servs = Jws2Discoverer.getDiscoverer();
 +                  if (jws2servs != null)
 +                  {
 +                    if (jws2servs.hasServices())
 +                    {
 +                      jws2servs.attachWSMenuEntry(webService, me);
 +                      for (Jws2Instance sv:jws2servs.getServices()) {
 +                        if (sv.description.toLowerCase().contains("jpred"))
 +                        {
 +                          for (JMenuItem jmi:legacyItems)
 +                          {
 +                            jmi.setVisible(false);
 +                          }
 +                        }
 +                      }
 +                      
 +                    }
 +                    if (jws2servs.isRunning())
 +                    {
 +                      JMenuItem tm = new JMenuItem(
 +                              "Still discovering JABA Services");
 +                      tm.setEnabled(false);
 +                      webService.add(tm);
 +                    }
 +                  }
 +                }
 +                build_urlServiceMenu(me.webService);
 +                build_fetchdbmenu(webService);
 +                for (JMenu item : wsmenu)
 +                {
 +                  if (item.getItemCount() == 0)
 +                  {
 +                    item.setEnabled(false);
 +                  }
 +                  else
 +                  {
 +                    item.setEnabled(true);
 +                  }
 +                }
 +              } catch (Exception e)
 +              {
 +                Cache.log
 +                        .debug("Exception during web service menu building process.",
 +                                e);
 +              }
 +              ;
 +            }
 +          });
 +        } catch (Exception e)
 +        {
 +        }
 +        ;
 +
 +        buildingMenu = false;
 +      }
 +    }).start();
 +
 +  }
 +
 +  /**
 +   * construct any groupURL type service menu entries.
 +   * 
 +   * @param webService
 +   */
 +  private void build_urlServiceMenu(JMenu webService)
 +  {
 +    // TODO: remove this code when 2.7 is released
 +    // DEBUG - alignmentView
 +    /*
 +     * JMenuItem testAlView = new JMenuItem("Test AlignmentView"); final
 +     * AlignFrame af = this; testAlView.addActionListener(new ActionListener() {
 +     * 
 +     * @Override public void actionPerformed(ActionEvent e) {
 +     * jalview.datamodel.AlignmentView
 +     * .testSelectionViews(af.viewport.getAlignment(),
 +     * af.viewport.getColumnSelection(), af.viewport.selectionGroup); }
 +     * 
 +     * }); webService.add(testAlView);
 +     */
 +    // TODO: refactor to RestClient discoverer and merge menu entries for
 +    // rest-style services with other types of analysis/calculation service
 +    // SHmmr test client - still being implemented.
 +    // DEBUG - alignmentView
 +
 +    for (jalview.ws.rest.RestClient client : jalview.ws.rest.RestClient
 +            .getRestClients())
 +    {
 +      client.attachWSMenuEntry(
 +              JvSwingUtils.findOrCreateMenu(webService, client.getAction()),
 +              this);
 +    }
 +
 +    if (Cache.getDefault("SHOW_ENFIN_SERVICES", true))
 +    {
 +      jalview.ws.EnfinEnvision2OneWay.getInstance().attachWSMenuEntry(
 +              webService, this);
 +    }
 +  }
 +
 +  /*
 +   * public void vamsasStore_actionPerformed(ActionEvent e) { JalviewFileChooser
 +   * chooser = new JalviewFileChooser(jalview.bin.Cache.
 +   * getProperty("LAST_DIRECTORY"));
 +   * 
 +   * chooser.setFileView(new JalviewFileView()); chooser.setDialogTitle("Export
 +   * to Vamsas file"); chooser.setToolTipText("Export");
 +   * 
 +   * int value = chooser.showSaveDialog(this);
 +   * 
 +   * if (value == JalviewFileChooser.APPROVE_OPTION) {
 +   * jalview.io.VamsasDatastore vs = new jalview.io.VamsasDatastore(viewport);
 +   * //vs.store(chooser.getSelectedFile().getAbsolutePath() ); vs.storeJalview(
 +   * chooser.getSelectedFile().getAbsolutePath(), this); } }
 +   */
 +  /**
 +   * prototype of an automatically enabled/disabled analysis function
 +   * 
 +   */
 +  protected void setShowProductsEnabled()
 +  {
 +    SequenceI[] selection = viewport.getSequenceSelection();
 +    if (canShowProducts(selection, viewport.getSelectionGroup() != null,
 +            viewport.getAlignment().getDataset()))
 +    {
 +      showProducts.setEnabled(true);
 +
 +    }
 +    else
 +    {
 +      showProducts.setEnabled(false);
 +    }
 +  }
 +
 +  /**
 +   * search selection for sequence xRef products and build the show products
 +   * menu.
 +   * 
 +   * @param selection
 +   * @param dataset
 +   * @return true if showProducts menu should be enabled.
 +   */
 +  public boolean canShowProducts(SequenceI[] selection,
 +          boolean isRegionSelection, Alignment dataset)
 +  {
 +    boolean showp = false;
 +    try
 +    {
 +      showProducts.removeAll();
 +      final boolean dna = viewport.getAlignment().isNucleotide();
 +      final Alignment ds = dataset;
 +      String[] ptypes = (selection == null || selection.length == 0) ? null
 +              : CrossRef.findSequenceXrefTypes(dna, selection, dataset);
 +      // Object[] prods =
 +      // CrossRef.buildXProductsList(viewport.getAlignment().isNucleotide(),
 +      // selection, dataset, true);
 +      final SequenceI[] sel = selection;
 +      for (int t = 0; ptypes != null && t < ptypes.length; t++)
 +      {
 +        showp = true;
 +        final boolean isRegSel = isRegionSelection;
 +        final AlignFrame af = this;
 +        final String source = ptypes[t];
 +        JMenuItem xtype = new JMenuItem(ptypes[t]);
 +        xtype.addActionListener(new ActionListener()
 +        {
 +
 +          @Override
 +          public void actionPerformed(ActionEvent e)
 +          {
 +            // TODO: new thread for this call with vis-delay
 +            af.showProductsFor(af.viewport.getSequenceSelection(), ds,
 +                    isRegSel, dna, source);
 +          }
 +
 +        });
 +        showProducts.add(xtype);
 +      }
 +      showProducts.setVisible(showp);
 +      showProducts.setEnabled(showp);
 +    } catch (Exception e)
 +    {
 +      jalview.bin.Cache.log
 +              .warn("canTranslate threw an exception - please report to help@jalview.org",
 +                      e);
 +      return false;
 +    }
 +    return showp;
 +  }
 +
 +  protected void showProductsFor(SequenceI[] sel, Alignment ds,
 +          boolean isRegSel, boolean dna, String source)
 +  {
 +    final boolean fisRegSel = isRegSel;
 +    final boolean fdna = dna;
 +    final String fsrc = source;
 +    final AlignFrame ths = this;
 +    final SequenceI[] fsel = sel;
 +    Runnable foo = new Runnable()
 +    {
 +
 +      @Override
 +      public void run()
 +      {
 +        final long sttime = System.currentTimeMillis();
 +        ths.setProgressBar("Searching for sequences from " + fsrc, sttime);
 +        try
 +        {
 +          Alignment ds = ths.getViewport().getAlignment().getDataset(); // update
 +          // our local
 +          // dataset
 +          // reference
 +          Alignment prods = CrossRef
 +                  .findXrefSequences(fsel, fdna, fsrc, ds);
 +          if (prods != null)
 +          {
 +            SequenceI[] sprods = new SequenceI[prods.getHeight()];
 +            for (int s = 0; s < sprods.length; s++)
 +            {
 +              sprods[s] = (prods.getSequenceAt(s)).deriveSequence();
 +              if (ds.getSequences() == null
 +                      || !ds.getSequences().contains(
 +                              sprods[s].getDatasetSequence()))
 +                ds.addSequence(sprods[s].getDatasetSequence());
 +              sprods[s].updatePDBIds();
 +            }
 +            Alignment al = new Alignment(sprods);
 +            AlignedCodonFrame[] cf = prods.getCodonFrames();
 +            al.setDataset(ds);
 +            for (int s = 0; cf != null && s < cf.length; s++)
 +            {
 +              al.addCodonFrame(cf[s]);
 +              cf[s] = null;
 +            }
 +            AlignFrame naf = new AlignFrame(al, DEFAULT_WIDTH,
 +                    DEFAULT_HEIGHT);
 +            String newtitle = "" + ((fdna) ? "Proteins " : "Nucleotides ")
 +                    + " for " + ((fisRegSel) ? "selected region of " : "")
 +                    + getTitle();
 +            Desktop.addInternalFrame(naf, newtitle, DEFAULT_WIDTH,
 +                    DEFAULT_HEIGHT);
 +          }
 +          else
 +          {
 +            System.err.println("No Sequences generated for xRef type "
 +                    + fsrc);
 +          }
 +        } catch (Exception e)
 +        {
 +          jalview.bin.Cache.log.error(
 +                  "Exception when finding crossreferences", e);
 +        } catch (OutOfMemoryError e)
 +        {
 +          new OOMWarning("whilst fetching crossreferences", e);
 +        } catch (Error e)
 +        {
 +          jalview.bin.Cache.log.error("Error when finding crossreferences",
 +                  e);
 +        }
 +        ths.setProgressBar("Finished searching for sequences from " + fsrc,
 +                sttime);
 +      }
 +
 +    };
 +    Thread frunner = new Thread(foo);
 +    frunner.start();
 +  }
 +
 +  public boolean canShowTranslationProducts(SequenceI[] selection,
 +          AlignmentI alignment)
 +  {
 +    // old way
 +    try
 +    {
 +      return (jalview.analysis.Dna.canTranslate(selection,
 +              viewport.getViewAsVisibleContigs(true)));
 +    } catch (Exception e)
 +    {
 +      jalview.bin.Cache.log
 +              .warn("canTranslate threw an exception - please report to help@jalview.org",
 +                      e);
 +      return false;
 +    }
 +  }
 +
 +  @Override
 +  public void showProducts_actionPerformed(ActionEvent e)
 +  {
 +    // /////////////////////////////
 +    // Collect Data to be translated/transferred
 +
 +    SequenceI[] selection = viewport.getSequenceSelection();
 +    AlignmentI al = null;
 +    try
 +    {
 +      al = jalview.analysis.Dna.CdnaTranslate(selection, viewport
 +              .getViewAsVisibleContigs(true), viewport.getGapCharacter(),
 +              viewport.getAlignment().getDataset());
 +    } catch (Exception ex)
 +    {
 +      al = null;
 +      jalview.bin.Cache.log.debug("Exception during translation.", ex);
 +    }
 +    if (al == null)
 +    {
 +      JOptionPane
 +              .showMessageDialog(
 +                      Desktop.desktop,
 +                      MessageManager.getString("label.select_at_least_three_bases_in_at_least_one_sequence_to_cDNA_translation"),
 +                      MessageManager.getString("label.translation_failed"), JOptionPane.WARNING_MESSAGE);
 +    }
 +    else
 +    {
 +      AlignFrame af = new AlignFrame(al, DEFAULT_WIDTH, DEFAULT_HEIGHT);
-       Desktop.addInternalFrame(af, "Translation of " + this.getTitle(),
+       Desktop.addInternalFrame(af, MessageManager.formatMessage("label.translation_of_params", new String[]{this.getTitle()}),\r
 -              DEFAULT_WIDTH, DEFAULT_HEIGHT);\r
 -    }\r
 -  }\r
 -\r
 -  @Override\r
 -  public void showTranslation_actionPerformed(ActionEvent e)\r
 -  {\r
 -    // /////////////////////////////\r
 -    // Collect Data to be translated/transferred\r
 -\r
 -    SequenceI[] selection = viewport.getSequenceSelection();\r
 -    String[] seqstring = viewport.getViewAsString(true);\r
 -    AlignmentI al = null;\r
 -    try\r
 -    {\r
 -      al = jalview.analysis.Dna.CdnaTranslate(selection, seqstring,\r
 -              viewport.getViewAsVisibleContigs(true), viewport\r
 -                      .getGapCharacter(), viewport.getAlignment()\r
 -                      .getAlignmentAnnotation(), viewport.getAlignment()\r
 -                      .getWidth(), viewport.getAlignment().getDataset());\r
 -    } catch (Exception ex)\r
 -    {\r
 -      al = null;\r
 -      jalview.bin.Cache.log.error("Exception during translation. Please report this !", ex);\r
 -      JOptionPane\r
 -      .showMessageDialog(\r
 -              Desktop.desktop,\r
 -              MessageManager.getString("label.error_when_translating_sequences_submit_bug_report"),\r
 -              MessageManager.getString("label.implementation_error") + MessageManager.getString("translation_failed"), JOptionPane.ERROR_MESSAGE);\r
 -      return;\r
 -    }\r
 -    if (al == null)\r
 -    {\r
 -      JOptionPane\r
 -              .showMessageDialog(\r
 -                      Desktop.desktop,\r
 -                      MessageManager.getString("label.select_at_least_three_bases_in_at_least_one_sequence_to_cDNA_translation"),\r
 -                      MessageManager.getString("label.translation_failed"), JOptionPane.WARNING_MESSAGE);\r
 -    }\r
 -    else\r
 -    {\r
 -      AlignFrame af = new AlignFrame(al, DEFAULT_WIDTH, DEFAULT_HEIGHT);\r
 +              DEFAULT_WIDTH, DEFAULT_HEIGHT);
 +    }
 +  }
 +
 +  @Override
 +  public void showTranslation_actionPerformed(ActionEvent e)
 +  {
 +    // /////////////////////////////
 +    // Collect Data to be translated/transferred
 +
 +    SequenceI[] selection = viewport.getSequenceSelection();
 +    String[] seqstring = viewport.getViewAsString(true);
 +    AlignmentI al = null;
 +    try
 +    {
 +      al = jalview.analysis.Dna.CdnaTranslate(selection, seqstring,
 +              viewport.getViewAsVisibleContigs(true), viewport
 +                      .getGapCharacter(), viewport.getAlignment()
 +                      .getAlignmentAnnotation(), viewport.getAlignment()
 +                      .getWidth(), viewport.getAlignment().getDataset());
 +    } catch (Exception ex)
 +    {
 +      al = null;
 +      jalview.bin.Cache.log.error("Exception during translation. Please report this !", ex);
 +      JOptionPane
 +      .showMessageDialog(
 +              Desktop.desktop,
 +              MessageManager.getString("label.error_when_translating_sequences_submit_bug_report"),
 +              MessageManager.getString("label.implementation_error") + MessageManager.getString("translation_failed"), JOptionPane.ERROR_MESSAGE);
 +      return;
 +    }
 +    if (al == null)
 +    {
 +      JOptionPane
 +              .showMessageDialog(
 +                      Desktop.desktop,
 +                      MessageManager.getString("label.select_at_least_three_bases_in_at_least_one_sequence_to_cDNA_translation"),
 +                      MessageManager.getString("label.translation_failed"), JOptionPane.WARNING_MESSAGE);
 +    }
 +    else
 +    {
 +      AlignFrame af = new AlignFrame(al, DEFAULT_WIDTH, DEFAULT_HEIGHT);
-       Desktop.addInternalFrame(af, "Translation of " + this.getTitle(),
+       Desktop.addInternalFrame(af, MessageManager.formatMessage("label.translation_of_params", new String[]{this.getTitle()}),\r
 -              DEFAULT_WIDTH, DEFAULT_HEIGHT);\r
 -    }\r
 -  }\r
 -\r
 -  /**\r
 -   * Try to load a features file onto the alignment.\r
 -   * \r
 -   * @param file\r
 -   *          contents or path to retrieve file\r
 -   * @param type\r
 -   *          access mode of file (see jalview.io.AlignFile)\r
 -   * @return true if features file was parsed corectly.\r
 -   */\r
 -  public boolean parseFeaturesFile(String file, String type)\r
 -  {\r
 -    boolean featuresFile = false;\r
 -    try\r
 -    {\r
 -      featuresFile = new FeaturesFile(file, type).parse(viewport\r
 -              .getAlignment().getDataset(), alignPanel.seqPanel.seqCanvas\r
 -              .getFeatureRenderer().featureColours, false,\r
 -              jalview.bin.Cache.getDefault("RELAXEDSEQIDMATCHING", false));\r
 -    } catch (Exception ex)\r
 -    {\r
 -      ex.printStackTrace();\r
 -    }\r
 -\r
 -    if (featuresFile)\r
 -    {\r
 -      viewport.showSequenceFeatures = true;\r
 -      showSeqFeatures.setSelected(true);\r
 -      if (alignPanel.seqPanel.seqCanvas.fr != null)\r
 -      {\r
 -        // update the min/max ranges where necessary\r
 -        alignPanel.seqPanel.seqCanvas.fr.findAllFeatures(true);\r
 -      }\r
 -      if (featureSettings != null)\r
 -      {\r
 -        featureSettings.setTableData();\r
 -      }\r
 -      alignPanel.paintAlignment(true);\r
 -    }\r
 -\r
 -    return featuresFile;\r
 -  }\r
 -\r
 -  @Override\r
 -  public void dragEnter(DropTargetDragEvent evt)\r
 -  {\r
 -  }\r
 -\r
 -  @Override\r
 -  public void dragExit(DropTargetEvent evt)\r
 -  {\r
 -  }\r
 -\r
 -  @Override\r
 -  public void dragOver(DropTargetDragEvent evt)\r
 -  {\r
 -  }\r
 -\r
 -  @Override\r
 -  public void dropActionChanged(DropTargetDragEvent evt)\r
 -  {\r
 -  }\r
 -\r
 -  @Override\r
 -  public void drop(DropTargetDropEvent evt)\r
 -  {\r
 -    Transferable t = evt.getTransferable();\r
 -    java.util.List files = null;\r
 -\r
 -    try\r
 -    {\r
 -      DataFlavor uriListFlavor = new DataFlavor(\r
 -              "text/uri-list;class=java.lang.String");\r
 -      if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))\r
 -      {\r
 -        // Works on Windows and MacOSX\r
 -        evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);\r
 -        files = (java.util.List) t\r
 -                .getTransferData(DataFlavor.javaFileListFlavor);\r
 -      }\r
 -      else if (t.isDataFlavorSupported(uriListFlavor))\r
 -      {\r
 -        // This is used by Unix drag system\r
 -        evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);\r
 -        String data = (String) t.getTransferData(uriListFlavor);\r
 -        files = new java.util.ArrayList(1);\r
 -        for (java.util.StringTokenizer st = new java.util.StringTokenizer(\r
 -                data, "\r\n"); st.hasMoreTokens();)\r
 -        {\r
 -          String s = st.nextToken();\r
 -          if (s.startsWith("#"))\r
 -          {\r
 -            // the line is a comment (as per the RFC 2483)\r
 -            continue;\r
 -          }\r
 -\r
 -          java.net.URI uri = new java.net.URI(s);\r
 -          // check to see if we can handle this kind of URI\r
 -          if (uri.getScheme().toLowerCase().startsWith("http"))\r
 -          {\r
 -            files.add(uri.toString());\r
 -          }\r
 -          else\r
 -          {\r
 -            // otherwise preserve old behaviour: catch all for file objects\r
 -            java.io.File file = new java.io.File(uri);\r
 -            files.add(file.toString());\r
 -          }\r
 -        }\r
 -      }\r
 -    } catch (Exception e)\r
 -    {\r
 -      e.printStackTrace();\r
 -    }\r
 -    if (files != null)\r
 -    {\r
 -      try\r
 -      {\r
 -        // check to see if any of these files have names matching sequences in\r
 -        // the alignment\r
 -        SequenceIdMatcher idm = new SequenceIdMatcher(viewport\r
 -                .getAlignment().getSequencesArray());\r
 -        /**\r
 -         * Object[] { String,SequenceI}\r
 -         */\r
 -        ArrayList<Object[]> filesmatched = new ArrayList<Object[]>();\r
 -        ArrayList<String> filesnotmatched = new ArrayList<String>();\r
 -        for (int i = 0; i < files.size(); i++)\r
 -        {\r
 -          String file = files.get(i).toString();\r
 -          String pdbfn = "";\r
 -          String protocol = FormatAdapter.checkProtocol(file);\r
 -          if (protocol == jalview.io.FormatAdapter.FILE)\r
 -          {\r
 -            File fl = new File(file);\r
 -            pdbfn = fl.getName();\r
 -          }\r
 -          else if (protocol == jalview.io.FormatAdapter.URL)\r
 -          {\r
 -            URL url = new URL(file);\r
 -            pdbfn = url.getFile();\r
 -          }\r
 -          if (pdbfn.length() > 0)\r
 -          {\r
 -            // attempt to find a match in the alignment\r
 -            SequenceI[] mtch = idm.findAllIdMatches(pdbfn);\r
 -            int l = 0, c = pdbfn.indexOf(".");\r
 -            while (mtch == null && c != -1)\r
 -            {\r
 -              do\r
 -              {\r
 -                l = c;\r
 -              } while ((c = pdbfn.indexOf(".", l)) > l);\r
 -              if (l > -1)\r
 -              {\r
 -                pdbfn = pdbfn.substring(0, l);\r
 -              }\r
 -              mtch = idm.findAllIdMatches(pdbfn);\r
 -            }\r
 -            if (mtch != null)\r
 -            {\r
 -              String type = null;\r
 -              try\r
 -              {\r
 -                type = new IdentifyFile().Identify(file, protocol);\r
 -              } catch (Exception ex)\r
 -              {\r
 -                type = null;\r
 -              }\r
 -              if (type != null)\r
 -              {\r
 -                if (type.equalsIgnoreCase("PDB"))\r
 -                {\r
 -                  filesmatched.add(new Object[]\r
 -                  { file, protocol, mtch });\r
 -                  continue;\r
 -                }\r
 -              }\r
 -            }\r
 -            // File wasn't named like one of the sequences or wasn't a PDB file.\r
 -            filesnotmatched.add(file);\r
 -          }\r
 -        }\r
 -        int assocfiles = 0;\r
 -        if (filesmatched.size() > 0)\r
 -        {\r
 -          if (Cache.getDefault("AUTOASSOCIATE_PDBANDSEQS", false)\r
 -                  || JOptionPane\r
 -                          .showConfirmDialog(\r
 -                                  this,\r
 -                                  MessageManager.formatMessage("label.automatically_associate_pdb_files_with_sequences_same_name",\r
 -                                                new String[]{Integer.valueOf(filesmatched.size()).toString()}),\r
 -                                  MessageManager.getString("label.automatically_associate_pdb_files_by_name"),\r
 -                                  JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION)\r
 -\r
 -          {\r
 -            for (Object[] fm : filesmatched)\r
 -            {\r
 -              // try and associate\r
 -              // TODO: may want to set a standard ID naming formalism for\r
 -              // associating PDB files which have no IDs.\r
 -              for (SequenceI toassoc : (SequenceI[]) fm[2])\r
 -              {\r
 -                PDBEntry pe = new AssociatePdbFileWithSeq()\r
 -                        .associatePdbWithSeq((String) fm[0],\r
 -                                (String) fm[1], toassoc, false);\r
 -                if (pe != null)\r
 -                {\r
 -                  System.err.println("Associated file : "\r
 -                          + ((String) fm[0]) + " with "\r
 -                          + toassoc.getDisplayId(true));\r
 -                  assocfiles++;\r
 -                }\r
 -              }\r
 -              alignPanel.paintAlignment(true);\r
 -            }\r
 -          }\r
 -        }\r
 -        if (filesnotmatched.size() > 0)\r
 -        {\r
 -          if (assocfiles > 0\r
 -                  && (Cache.getDefault(\r
 -                          "AUTOASSOCIATE_PDBANDSEQS_IGNOREOTHERS", false) || JOptionPane\r
 -                          .showConfirmDialog(\r
 -                                  this,\r
 -                                  MessageManager.formatMessage("label.ignore_unmatched_dropped_files_info", new String[]{Integer.valueOf(filesnotmatched.size()).toString()}),\r
 -                                  MessageManager.getString("label.ignore_unmatched_dropped_files"),\r
 -                                  JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION))\r
 -          {\r
 -            return;\r
 -          }\r
 -          for (String fn : filesnotmatched)\r
 -          {\r
 -            loadJalviewDataFile(fn, null, null, null);\r
 -          }\r
 -\r
 -        }\r
 -      } catch (Exception ex)\r
 -      {\r
 -        ex.printStackTrace();\r
 -      }\r
 -    }\r
 -  }\r
 -\r
 -  /**\r
 -   * Attempt to load a "dropped" file or URL string: First by testing whether\r
 -   * it's and Annotation file, then a JNet file, and finally a features file. If\r
 -   * all are false then the user may have dropped an alignment file onto this\r
 -   * AlignFrame.\r
 -   * \r
 -   * @param file\r
 -   *          either a filename or a URL string.\r
 -   */\r
 -  public void loadJalviewDataFile(String file, String protocol,\r
 -          String format, SequenceI assocSeq)\r
 -  {\r
 -    try\r
 -    {\r
 -      if (protocol == null)\r
 -      {\r
 -        protocol = jalview.io.FormatAdapter.checkProtocol(file);\r
 -      }\r
 -      // if the file isn't identified, or not positively identified as some\r
 -      // other filetype (PFAM is default unidentified alignment file type) then\r
 -      // try to parse as annotation.\r
 -      boolean isAnnotation = (format == null || format\r
 -              .equalsIgnoreCase("PFAM")) ? new AnnotationFile()\r
 -              .readAnnotationFile(viewport.getAlignment(), file, protocol)\r
 -              : false;\r
 -\r
 -      if (!isAnnotation)\r
 -      {\r
 -        // first see if its a T-COFFEE score file\r
 -        TCoffeeScoreFile tcf = null;\r
 -        try\r
 -        {\r
 -          tcf = new TCoffeeScoreFile(file, protocol);\r
 -          if (tcf.isValid())\r
 -          {\r
 -            if (tcf.annotateAlignment(viewport.getAlignment(), true))\r
 -            {\r
 -              tcoffeeColour.setEnabled(true);\r
 -              tcoffeeColour.setSelected(true);\r
 -              changeColour(new TCoffeeColourScheme(viewport.getAlignment()));\r
 -              isAnnotation = true;\r
 -              statusBar.setText(MessageManager.getString("label.successfully_pasted_tcoffee_scores_to_alignment"));\r
 -            }\r
 -            else\r
 -            {\r
 -              // some problem - if no warning its probable that the ID matching\r
 -              // process didn't work\r
 -              JOptionPane\r
 -                      .showMessageDialog(\r
 -                              Desktop.desktop,\r
 -                              tcf.getWarningMessage() == null ? MessageManager.getString("label.check_file_matches_sequence_ids_alignment")\r
 -                                      : tcf.getWarningMessage(),\r
 -                              MessageManager.getString("label.problem_reading_tcoffee_score_file"),\r
 -                              JOptionPane.WARNING_MESSAGE);\r
 -            }\r
 -          }\r
 -          else\r
 -          {\r
 -            tcf = null;\r
 -          }\r
 -        } catch (Exception x)\r
 -        {\r
 -          Cache.log\r
 -                  .debug("Exception when processing data source as T-COFFEE score file",\r
 -                          x);\r
 -          tcf = null;\r
 -        }\r
 -        if (tcf == null)\r
 -        {\r
 -          // try to see if its a JNet 'concise' style annotation file *before*\r
 -          // we\r
 -          // try to parse it as a features file\r
 -          if (format == null)\r
 -          {\r
 -            format = new IdentifyFile().Identify(file, protocol);\r
 -          }\r
 -          if (format.equalsIgnoreCase("JnetFile"))\r
 -          {\r
 -            jalview.io.JPredFile predictions = new jalview.io.JPredFile(\r
 -                    file, protocol);\r
 -            new JnetAnnotationMaker().add_annotation(predictions,\r
 -                    viewport.getAlignment(), 0, false);\r
 -            isAnnotation = true;\r
 -          }\r
 -          else\r
 -          {\r
 -            /*\r
 -             * if (format.equalsIgnoreCase("PDB")) {\r
 -             * \r
 -             * String pdbfn = ""; // try to match up filename with sequence id\r
 -             * try { if (protocol == jalview.io.FormatAdapter.FILE) { File fl =\r
 -             * new File(file); pdbfn = fl.getName(); } else if (protocol ==\r
 -             * jalview.io.FormatAdapter.URL) { URL url = new URL(file); pdbfn =\r
 -             * url.getFile(); } } catch (Exception e) { } ; if (assocSeq ==\r
 -             * null) { SequenceIdMatcher idm = new SequenceIdMatcher(viewport\r
 -             * .getAlignment().getSequencesArray()); if (pdbfn.length() > 0) {\r
 -             * // attempt to find a match in the alignment SequenceI mtch =\r
 -             * idm.findIdMatch(pdbfn); int l = 0, c = pdbfn.indexOf("."); while\r
 -             * (mtch == null && c != -1) { while ((c = pdbfn.indexOf(".", l)) >\r
 -             * l) { l = c; } if (l > -1) { pdbfn = pdbfn.substring(0, l); } mtch\r
 -             * = idm.findIdMatch(pdbfn); } if (mtch != null) { // try and\r
 -             * associate // prompt ? PDBEntry pe = new AssociatePdbFileWithSeq()\r
 -             * .associatePdbWithSeq(file, protocol, mtch, true); if (pe != null)\r
 -             * { System.err.println("Associated file : " + file + " with " +\r
 -             * mtch.getDisplayId(true)); alignPanel.paintAlignment(true); } } //\r
 -             * TODO: maybe need to load as normal otherwise return; } }\r
 -             */\r
 -            // try to parse it as a features file\r
 -            boolean isGroupsFile = parseFeaturesFile(file, protocol);\r
 -            // if it wasn't a features file then we just treat it as a general\r
 -            // alignment file to load into the current view.\r
 -            if (!isGroupsFile)\r
 -            {\r
 -              new FileLoader().LoadFile(viewport, file, protocol, format);\r
 -            }\r
 -            else\r
 -            {\r
 -              alignPanel.paintAlignment(true);\r
 -            }\r
 -          }\r
 -        }\r
 -      }\r
 -      if (isAnnotation)\r
 -      {\r
 -\r
 -        alignPanel.adjustAnnotationHeight();\r
 -        viewport.updateSequenceIdColours();\r
 -        buildSortByAnnotationScoresMenu();\r
 -        alignPanel.paintAlignment(true);\r
 -      }\r
 -    } catch (Exception ex)\r
 -    {\r
 -      ex.printStackTrace();\r
 -    } catch (OutOfMemoryError oom)\r
 -    {\r
 -      try\r
 -      {\r
 -        System.gc();\r
 -      } catch (Exception x)\r
 -      {\r
 -      }\r
 -      ;\r
 -      new OOMWarning(\r
 -              "loading data "\r
 -                      + (protocol != null ? (protocol.equals(FormatAdapter.PASTE) ? "from clipboard."\r
 -                              : "using " + protocol + " from " + file)\r
 -                              : ".")\r
 -                      + (format != null ? "(parsing as '" + format\r
 -                              + "' file)" : ""), oom, Desktop.desktop);\r
 -    }\r
 -  }\r
 -\r
 -  @Override\r
 -  public void tabSelectionChanged(int index)\r
 -  {\r
 -    if (index > -1)\r
 -    {\r
 -      alignPanel = (AlignmentPanel) alignPanels.elementAt(index);\r
 -      viewport = alignPanel.av;\r
 -      avc.setViewportAndAlignmentPanel(viewport, alignPanel);\r
 -      setMenusFromViewport(viewport);\r
 -    }\r
 -  }\r
 -\r
 -  @Override\r
 -  public void tabbedPane_mousePressed(MouseEvent e)\r
 -  {\r
 -    if (SwingUtilities.isRightMouseButton(e))\r
 -    {\r
 -      String reply = JOptionPane.showInternalInputDialog(this,\r
 -              MessageManager.getString("label.enter_view_name"), MessageManager.getString("label.enter_view_name"),\r
 -              JOptionPane.QUESTION_MESSAGE);\r
 -\r
 -      if (reply != null)\r
 -      {\r
 -        viewport.viewName = reply;\r
 -        tabbedPane.setTitleAt(tabbedPane.getSelectedIndex(), reply);\r
 -      }\r
 -    }\r
 -  }\r
 -\r
 -  public AlignViewport getCurrentView()\r
 -  {\r
 -    return viewport;\r
 -  }\r
 -\r
 -  /**\r
 -   * Open the dialog for regex description parsing.\r
 -   */\r
 -  @Override\r
 -  protected void extractScores_actionPerformed(ActionEvent e)\r
 -  {\r
 -    ParseProperties pp = new jalview.analysis.ParseProperties(\r
 -            viewport.getAlignment());\r
 -    // TODO: verify regex and introduce GUI dialog for version 2.5\r
 -    // if (pp.getScoresFromDescription("col", "score column ",\r
 -    // "\\W*([-+]?\\d*\\.?\\d*e?-?\\d*)\\W+([-+]?\\d*\\.?\\d*e?-?\\d*)",\r
 -    // true)>0)\r
 -    if (pp.getScoresFromDescription("description column",\r
 -            "score in description column ", "\\W*([-+eE0-9.]+)", true) > 0)\r
 -    {\r
 -      buildSortByAnnotationScoresMenu();\r
 -    }\r
 -  }\r
 -\r
 -  /*\r
 -   * (non-Javadoc)\r
 -   * \r
 -   * @see\r
 -   * jalview.jbgui.GAlignFrame#showDbRefs_actionPerformed(java.awt.event.ActionEvent\r
 -   * )\r
 -   */\r
 -  @Override\r
 -  protected void showDbRefs_actionPerformed(ActionEvent e)\r
 -  {\r
 -    viewport.setShowDbRefs(showDbRefsMenuitem.isSelected());\r
 -  }\r
 -\r
 -  /*\r
 -   * (non-Javadoc)\r
 -   * \r
 -   * @seejalview.jbgui.GAlignFrame#showNpFeats_actionPerformed(java.awt.event.\r
 -   * ActionEvent)\r
 -   */\r
 -  @Override\r
 -  protected void showNpFeats_actionPerformed(ActionEvent e)\r
 -  {\r
 -    viewport.setShowNpFeats(showNpFeatsMenuitem.isSelected());\r
 -  }\r
 -\r
 -  /**\r
 -   * find the viewport amongst the tabs in this alignment frame and close that\r
 -   * tab\r
 -   * \r
 -   * @param av\r
 -   */\r
 -  public boolean closeView(AlignViewport av)\r
 -  {\r
 -    if (viewport == av)\r
 -    {\r
 -      this.closeMenuItem_actionPerformed(false);\r
 -      return true;\r
 -    }\r
 -    Component[] comp = tabbedPane.getComponents();\r
 -    for (int i = 0; comp != null && i < comp.length; i++)\r
 -    {\r
 -      if (comp[i] instanceof AlignmentPanel)\r
 -      {\r
 -        if (((AlignmentPanel) comp[i]).av == av)\r
 -        {\r
 -          // close the view.\r
 -          closeView((AlignmentPanel) comp[i]);\r
 -          return true;\r
 -        }\r
 -      }\r
 -    }\r
 -    return false;\r
 -  }\r
 -\r
 -  protected void build_fetchdbmenu(JMenu webService)\r
 -  {\r
 -    // Temporary hack - DBRef Fetcher always top level ws entry.\r
 -    // TODO We probably want to store a sequence database checklist in\r
 -    // preferences and have checkboxes.. rather than individual sources selected\r
 -    // here\r
 +              DEFAULT_WIDTH, DEFAULT_HEIGHT);
 +    }
 +  }
 +
 +  /**
 +   * Try to load a features file onto the alignment.
 +   * 
 +   * @param file
 +   *          contents or path to retrieve file
 +   * @param type
 +   *          access mode of file (see jalview.io.AlignFile)
 +   * @return true if features file was parsed corectly.
 +   */
 +  public boolean parseFeaturesFile(String file, String type)
 +  {
 +    boolean featuresFile = false;
 +    try
 +    {
 +      featuresFile = new FeaturesFile(file, type).parse(viewport
 +              .getAlignment().getDataset(), alignPanel.seqPanel.seqCanvas
 +              .getFeatureRenderer().featureColours, false,
 +              jalview.bin.Cache.getDefault("RELAXEDSEQIDMATCHING", false));
 +    } catch (Exception ex)
 +    {
 +      ex.printStackTrace();
 +    }
 +
 +    if (featuresFile)
 +    {
 +      viewport.showSequenceFeatures = true;
 +      showSeqFeatures.setSelected(true);
 +      if (alignPanel.seqPanel.seqCanvas.fr != null)
 +      {
 +        // update the min/max ranges where necessary
 +        alignPanel.seqPanel.seqCanvas.fr.findAllFeatures(true);
 +      }
 +      if (featureSettings != null)
 +      {
 +        featureSettings.setTableData();
 +      }
 +      alignPanel.paintAlignment(true);
 +    }
 +
 +    return featuresFile;
 +  }
 +
 +  @Override
 +  public void dragEnter(DropTargetDragEvent evt)
 +  {
 +  }
 +
 +  @Override
 +  public void dragExit(DropTargetEvent evt)
 +  {
 +  }
 +
 +  @Override
 +  public void dragOver(DropTargetDragEvent evt)
 +  {
 +  }
 +
 +  @Override
 +  public void dropActionChanged(DropTargetDragEvent evt)
 +  {
 +  }
 +
 +  @Override
 +  public void drop(DropTargetDropEvent evt)
 +  {
 +    Transferable t = evt.getTransferable();
 +    java.util.List files = null;
 +
 +    try
 +    {
 +      DataFlavor uriListFlavor = new DataFlavor(
 +              "text/uri-list;class=java.lang.String");
 +      if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
 +      {
 +        // Works on Windows and MacOSX
 +        evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
 +        files = (java.util.List) t
 +                .getTransferData(DataFlavor.javaFileListFlavor);
 +      }
 +      else if (t.isDataFlavorSupported(uriListFlavor))
 +      {
 +        // This is used by Unix drag system
 +        evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
 +        String data = (String) t.getTransferData(uriListFlavor);
 +        files = new java.util.ArrayList(1);
 +        for (java.util.StringTokenizer st = new java.util.StringTokenizer(
 +                data, "\r\n"); st.hasMoreTokens();)
 +        {
 +          String s = st.nextToken();
 +          if (s.startsWith("#"))
 +          {
 +            // the line is a comment (as per the RFC 2483)
 +            continue;
 +          }
 +
 +          java.net.URI uri = new java.net.URI(s);
 +          // check to see if we can handle this kind of URI
 +          if (uri.getScheme().toLowerCase().startsWith("http"))
 +          {
 +            files.add(uri.toString());
 +          }
 +          else
 +          {
 +            // otherwise preserve old behaviour: catch all for file objects
 +            java.io.File file = new java.io.File(uri);
 +            files.add(file.toString());
 +          }
 +        }
 +      }
 +    } catch (Exception e)
 +    {
 +      e.printStackTrace();
 +    }
 +    if (files != null)
 +    {
 +      try
 +      {
 +        // check to see if any of these files have names matching sequences in
 +        // the alignment
 +        SequenceIdMatcher idm = new SequenceIdMatcher(viewport
 +                .getAlignment().getSequencesArray());
 +        /**
 +         * Object[] { String,SequenceI}
 +         */
 +        ArrayList<Object[]> filesmatched = new ArrayList<Object[]>();
 +        ArrayList<String> filesnotmatched = new ArrayList<String>();
 +        for (int i = 0; i < files.size(); i++)
 +        {
 +          String file = files.get(i).toString();
 +          String pdbfn = "";
 +          String protocol = FormatAdapter.checkProtocol(file);
 +          if (protocol == jalview.io.FormatAdapter.FILE)
 +          {
 +            File fl = new File(file);
 +            pdbfn = fl.getName();
 +          }
 +          else if (protocol == jalview.io.FormatAdapter.URL)
 +          {
 +            URL url = new URL(file);
 +            pdbfn = url.getFile();
 +          }
 +          if (pdbfn.length() > 0)
 +          {
 +            // attempt to find a match in the alignment
 +            SequenceI[] mtch = idm.findAllIdMatches(pdbfn);
 +            int l = 0, c = pdbfn.indexOf(".");
 +            while (mtch == null && c != -1)
 +            {
 +              do
 +              {
 +                l = c;
 +              } while ((c = pdbfn.indexOf(".", l)) > l);
 +              if (l > -1)
 +              {
 +                pdbfn = pdbfn.substring(0, l);
 +              }
 +              mtch = idm.findAllIdMatches(pdbfn);
 +            }
 +            if (mtch != null)
 +            {
 +              String type = null;
 +              try
 +              {
 +                type = new IdentifyFile().Identify(file, protocol);
 +              } catch (Exception ex)
 +              {
 +                type = null;
 +              }
 +              if (type != null)
 +              {
 +                if (type.equalsIgnoreCase("PDB"))
 +                {
 +                  filesmatched.add(new Object[]
 +                  { file, protocol, mtch });
 +                  continue;
 +                }
 +              }
 +            }
 +            // File wasn't named like one of the sequences or wasn't a PDB file.
 +            filesnotmatched.add(file);
 +          }
 +        }
 +        int assocfiles = 0;
 +        if (filesmatched.size() > 0)
 +        {
 +          if (Cache.getDefault("AUTOASSOCIATE_PDBANDSEQS", false)
 +                  || JOptionPane
 +                          .showConfirmDialog(
 +                                  this,
 +                                  MessageManager.formatMessage("label.automatically_associate_pdb_files_with_sequences_same_name",
 +                                                new String[]{Integer.valueOf(filesmatched.size()).toString()}),
 +                                  MessageManager.getString("label.automatically_associate_pdb_files_by_name"),
 +                                  JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION)
 +
 +          {
 +            for (Object[] fm : filesmatched)
 +            {
 +              // try and associate
 +              // TODO: may want to set a standard ID naming formalism for
 +              // associating PDB files which have no IDs.
 +              for (SequenceI toassoc : (SequenceI[]) fm[2])
 +              {
 +                PDBEntry pe = new AssociatePdbFileWithSeq()
 +                        .associatePdbWithSeq((String) fm[0],
 +                                (String) fm[1], toassoc, false);
 +                if (pe != null)
 +                {
 +                  System.err.println("Associated file : "
 +                          + ((String) fm[0]) + " with "
 +                          + toassoc.getDisplayId(true));
 +                  assocfiles++;
 +                }
 +              }
 +              alignPanel.paintAlignment(true);
 +            }
 +          }
 +        }
 +        if (filesnotmatched.size() > 0)
 +        {
 +          if (assocfiles > 0
 +                  && (Cache.getDefault(
 +                          "AUTOASSOCIATE_PDBANDSEQS_IGNOREOTHERS", false) || JOptionPane
 +                          .showConfirmDialog(
 +                                  this,
 +                                  MessageManager.formatMessage("label.ignore_unmatched_dropped_files_info", new String[]{Integer.valueOf(filesnotmatched.size()).toString()}),
 +                                  MessageManager.getString("label.ignore_unmatched_dropped_files"),
 +                                  JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION))
 +          {
 +            return;
 +          }
 +          for (String fn : filesnotmatched)
 +          {
 +            loadJalviewDataFile(fn, null, null, null);
 +          }
 +
 +        }
 +      } catch (Exception ex)
 +      {
 +        ex.printStackTrace();
 +      }
 +    }
 +  }
 +
 +  /**
 +   * Attempt to load a "dropped" file or URL string: First by testing whether
 +   * it's and Annotation file, then a JNet file, and finally a features file. If
 +   * all are false then the user may have dropped an alignment file onto this
 +   * AlignFrame.
 +   * 
 +   * @param file
 +   *          either a filename or a URL string.
 +   */
 +  public void loadJalviewDataFile(String file, String protocol,
 +          String format, SequenceI assocSeq)
 +  {
 +    try
 +    {
 +      if (protocol == null)
 +      {
 +        protocol = jalview.io.FormatAdapter.checkProtocol(file);
 +      }
 +      // if the file isn't identified, or not positively identified as some
 +      // other filetype (PFAM is default unidentified alignment file type) then
 +      // try to parse as annotation.
 +      boolean isAnnotation = (format == null || format
 +              .equalsIgnoreCase("PFAM")) ? new AnnotationFile()
 +              .readAnnotationFile(viewport.getAlignment(), file, protocol)
 +              : false;
 +
 +      if (!isAnnotation)
 +      {
 +        // first see if its a T-COFFEE score file
 +        TCoffeeScoreFile tcf = null;
 +        try
 +        {
 +          tcf = new TCoffeeScoreFile(file, protocol);
 +          if (tcf.isValid())
 +          {
 +            if (tcf.annotateAlignment(viewport.getAlignment(), true))
 +            {
 +              tcoffeeColour.setEnabled(true);
 +              tcoffeeColour.setSelected(true);
 +              changeColour(new TCoffeeColourScheme(viewport.getAlignment()));
 +              isAnnotation = true;
 +              statusBar.setText(MessageManager.getString("label.successfully_pasted_tcoffee_scores_to_alignment"));
 +            }
 +            else
 +            {
 +              // some problem - if no warning its probable that the ID matching
 +              // process didn't work
 +              JOptionPane
 +                      .showMessageDialog(
 +                              Desktop.desktop,
 +                              tcf.getWarningMessage() == null ? MessageManager.getString("label.check_file_matches_sequence_ids_alignment")
 +                                      : tcf.getWarningMessage(),
 +                              MessageManager.getString("label.problem_reading_tcoffee_score_file"),
 +                              JOptionPane.WARNING_MESSAGE);
 +            }
 +          }
 +          else
 +          {
 +            tcf = null;
 +          }
 +        } catch (Exception x)
 +        {
 +          Cache.log
 +                  .debug("Exception when processing data source as T-COFFEE score file",
 +                          x);
 +          tcf = null;
 +        }
 +        if (tcf == null)
 +        {
 +          // try to see if its a JNet 'concise' style annotation file *before*
 +          // we
 +          // try to parse it as a features file
 +          if (format == null)
 +          {
 +            format = new IdentifyFile().Identify(file, protocol);
 +          }
 +          if (format.equalsIgnoreCase("JnetFile"))
 +          {
 +            jalview.io.JPredFile predictions = new jalview.io.JPredFile(
 +                    file, protocol);
 +            new JnetAnnotationMaker().add_annotation(predictions,
 +                    viewport.getAlignment(), 0, false);
 +            isAnnotation = true;
 +          }
 +          else
 +          {
 +            /*
 +             * if (format.equalsIgnoreCase("PDB")) {
 +             * 
 +             * String pdbfn = ""; // try to match up filename with sequence id
 +             * try { if (protocol == jalview.io.FormatAdapter.FILE) { File fl =
 +             * new File(file); pdbfn = fl.getName(); } else if (protocol ==
 +             * jalview.io.FormatAdapter.URL) { URL url = new URL(file); pdbfn =
 +             * url.getFile(); } } catch (Exception e) { } ; if (assocSeq ==
 +             * null) { SequenceIdMatcher idm = new SequenceIdMatcher(viewport
 +             * .getAlignment().getSequencesArray()); if (pdbfn.length() > 0) {
 +             * // attempt to find a match in the alignment SequenceI mtch =
 +             * idm.findIdMatch(pdbfn); int l = 0, c = pdbfn.indexOf("."); while
 +             * (mtch == null && c != -1) { while ((c = pdbfn.indexOf(".", l)) >
 +             * l) { l = c; } if (l > -1) { pdbfn = pdbfn.substring(0, l); } mtch
 +             * = idm.findIdMatch(pdbfn); } if (mtch != null) { // try and
 +             * associate // prompt ? PDBEntry pe = new AssociatePdbFileWithSeq()
 +             * .associatePdbWithSeq(file, protocol, mtch, true); if (pe != null)
 +             * { System.err.println("Associated file : " + file + " with " +
 +             * mtch.getDisplayId(true)); alignPanel.paintAlignment(true); } } //
 +             * TODO: maybe need to load as normal otherwise return; } }
 +             */
 +            // try to parse it as a features file
 +            boolean isGroupsFile = parseFeaturesFile(file, protocol);
 +            // if it wasn't a features file then we just treat it as a general
 +            // alignment file to load into the current view.
 +            if (!isGroupsFile)
 +            {
 +              new FileLoader().LoadFile(viewport, file, protocol, format);
 +            }
 +            else
 +            {
 +              alignPanel.paintAlignment(true);
 +            }
 +          }
 +        }
 +      }
 +      if (isAnnotation)
 +      {
 +
 +        alignPanel.adjustAnnotationHeight();
 +        viewport.updateSequenceIdColours();
 +        buildSortByAnnotationScoresMenu();
 +        alignPanel.paintAlignment(true);
 +      }
 +    } catch (Exception ex)
 +    {
 +      ex.printStackTrace();
 +    } catch (OutOfMemoryError oom)
 +    {
 +      try
 +      {
 +        System.gc();
 +      } catch (Exception x)
 +      {
 +      }
 +      ;
 +      new OOMWarning(
 +              "loading data "
 +                      + (protocol != null ? (protocol.equals(FormatAdapter.PASTE) ? "from clipboard."
 +                              : "using " + protocol + " from " + file)
 +                              : ".")
 +                      + (format != null ? "(parsing as '" + format
 +                              + "' file)" : ""), oom, Desktop.desktop);
 +    }
 +  }
 +
 +  @Override
 +  public void tabSelectionChanged(int index)
 +  {
 +    if (index > -1)
 +    {
 +      alignPanel = (AlignmentPanel) alignPanels.elementAt(index);
 +      viewport = alignPanel.av;
 +      avc.setViewportAndAlignmentPanel(viewport, alignPanel);
 +      setMenusFromViewport(viewport);
 +    }
 +  }
 +
 +  @Override
 +  public void tabbedPane_mousePressed(MouseEvent e)
 +  {
 +    if (SwingUtilities.isRightMouseButton(e))
 +    {
 +      String reply = JOptionPane.showInternalInputDialog(this,
 +              MessageManager.getString("label.enter_view_name"), MessageManager.getString("label.enter_view_name"),
 +              JOptionPane.QUESTION_MESSAGE);
 +
 +      if (reply != null)
 +      {
 +        viewport.viewName = reply;
 +        tabbedPane.setTitleAt(tabbedPane.getSelectedIndex(), reply);
 +      }
 +    }
 +  }
 +
 +  public AlignViewport getCurrentView()
 +  {
 +    return viewport;
 +  }
 +
 +  /**
 +   * Open the dialog for regex description parsing.
 +   */
 +  @Override
 +  protected void extractScores_actionPerformed(ActionEvent e)
 +  {
 +    ParseProperties pp = new jalview.analysis.ParseProperties(
 +            viewport.getAlignment());
 +    // TODO: verify regex and introduce GUI dialog for version 2.5
 +    // if (pp.getScoresFromDescription("col", "score column ",
 +    // "\\W*([-+]?\\d*\\.?\\d*e?-?\\d*)\\W+([-+]?\\d*\\.?\\d*e?-?\\d*)",
 +    // true)>0)
 +    if (pp.getScoresFromDescription("description column",
 +            "score in description column ", "\\W*([-+eE0-9.]+)", true) > 0)
 +    {
 +      buildSortByAnnotationScoresMenu();
 +    }
 +  }
 +
 +  /*
 +   * (non-Javadoc)
 +   * 
 +   * @see
 +   * jalview.jbgui.GAlignFrame#showDbRefs_actionPerformed(java.awt.event.ActionEvent
 +   * )
 +   */
 +  @Override
 +  protected void showDbRefs_actionPerformed(ActionEvent e)
 +  {
 +    viewport.setShowDbRefs(showDbRefsMenuitem.isSelected());
 +  }
 +
 +  /*
 +   * (non-Javadoc)
 +   * 
 +   * @seejalview.jbgui.GAlignFrame#showNpFeats_actionPerformed(java.awt.event.
 +   * ActionEvent)
 +   */
 +  @Override
 +  protected void showNpFeats_actionPerformed(ActionEvent e)
 +  {
 +    viewport.setShowNpFeats(showNpFeatsMenuitem.isSelected());
 +  }
 +
 +  /**
 +   * find the viewport amongst the tabs in this alignment frame and close that
 +   * tab
 +   * 
 +   * @param av
 +   */
 +  public boolean closeView(AlignViewport av)
 +  {
 +    if (viewport == av)
 +    {
 +      this.closeMenuItem_actionPerformed(false);
 +      return true;
 +    }
 +    Component[] comp = tabbedPane.getComponents();
 +    for (int i = 0; comp != null && i < comp.length; i++)
 +    {
 +      if (comp[i] instanceof AlignmentPanel)
 +      {
 +        if (((AlignmentPanel) comp[i]).av == av)
 +        {
 +          // close the view.
 +          closeView((AlignmentPanel) comp[i]);
 +          return true;
 +        }
 +      }
 +    }
 +    return false;
 +  }
 +
 +  protected void build_fetchdbmenu(JMenu webService)
 +  {
 +    // Temporary hack - DBRef Fetcher always top level ws entry.
 +    // TODO We probably want to store a sequence database checklist in
 +    // preferences and have checkboxes.. rather than individual sources selected
 +    // here
-     final JMenu rfetch = new JMenu("Fetch DB References");
-     rfetch.setToolTipText("Retrieve and parse sequence database records for the alignment or the currently selected sequences");
+     final JMenu rfetch = new JMenu(MessageManager.getString("action.fetch_db_references"));\r
+     rfetch.setToolTipText(MessageManager.getString("label.retrieve_parse_sequence_database_records_alignment_or_selected_sequences"));\r
 -    webService.add(rfetch);\r
 -\r
 +    webService.add(rfetch);
 +
-     JMenuItem fetchr = new JMenuItem("Standard Databases");
-     fetchr.setToolTipText("Fetch from EMBL/EMBLCDS or Uniprot/PDB and any selected DAS sources");
+     JMenuItem fetchr = new JMenuItem(MessageManager.getString("label.standard_databases"));\r
+     fetchr.setToolTipText(MessageManager.getString("label.fetch_embl_uniprot"));\r
 -    fetchr.addActionListener(new ActionListener()\r
 -    {\r
 -\r
 -      @Override\r
 -      public void actionPerformed(ActionEvent e)\r
 -      {\r
 -        new Thread(new Runnable()\r
 -        {\r
 -\r
 -          @Override\r
 -          public void run()\r
 -          {\r
 -            new jalview.ws.DBRefFetcher(alignPanel.av\r
 -                    .getSequenceSelection(), alignPanel.alignFrame)\r
 -                    .fetchDBRefs(false);\r
 -          }\r
 -        }).start();\r
 -\r
 -      }\r
 -\r
 -    });\r
 -    rfetch.add(fetchr);\r
 -    final AlignFrame me = this;\r
 -    new Thread(new Runnable()\r
 -    {\r
 -      @Override\r
 -      public void run()\r
 -      {\r
 -        final jalview.ws.SequenceFetcher sf = SequenceFetcher\r
 -                .getSequenceFetcherSingleton(me);\r
 -        javax.swing.SwingUtilities.invokeLater(new Runnable()\r
 -        {\r
 -          @Override\r
 -          public void run()\r
 -          {\r
 -            String[] dbclasses = sf.getOrderedSupportedSources();\r
 -            // sf.getDbInstances(jalview.ws.dbsources.DasSequenceSource.class);\r
 -            // jalview.util.QuickSort.sort(otherdb, otherdb);\r
 -            List<DbSourceProxy> otherdb;\r
 -            JMenu dfetch = new JMenu();\r
 -            JMenu ifetch = new JMenu();\r
 -            JMenuItem fetchr = null;\r
 -            int comp = 0, icomp = 0, mcomp = 15;\r
 -            String mname = null;\r
 -            int dbi = 0;\r
 -            for (String dbclass : dbclasses)\r
 -            {\r
 -              otherdb = sf.getSourceProxy(dbclass);\r
 -              // add a single entry for this class, or submenu allowing 'fetch\r
 -              // all' or pick one\r
 -              if (otherdb == null || otherdb.size() < 1)\r
 -              {\r
 -                continue;\r
 -              }\r
 -              // List<DbSourceProxy> dbs=otherdb;\r
 -              // otherdb=new ArrayList<DbSourceProxy>();\r
 -              // for (DbSourceProxy db:dbs)\r
 -              // {\r
 -              // if (!db.isA(DBRefSource.ALIGNMENTDB)\r
 -              // }\r
 -              if (mname == null)\r
 -              {\r
 -                mname = "From " + dbclass;\r
 -              }\r
 -              if (otherdb.size() == 1)\r
 -              {\r
 -                final DbSourceProxy[] dassource = otherdb\r
 -                        .toArray(new DbSourceProxy[0]);\r
 -                DbSourceProxy src = otherdb.get(0);\r
 -                fetchr = new JMenuItem(src.getDbSource());\r
 -                fetchr.addActionListener(new ActionListener()\r
 -                {\r
 -\r
 -                  @Override\r
 -                  public void actionPerformed(ActionEvent e)\r
 -                  {\r
 -                    new Thread(new Runnable()\r
 -                    {\r
 -\r
 -                      @Override\r
 -                      public void run()\r
 -                      {\r
 -                        new jalview.ws.DBRefFetcher(alignPanel.av\r
 -                                .getSequenceSelection(),\r
 -                                alignPanel.alignFrame, dassource)\r
 -                                .fetchDBRefs(false);\r
 -                      }\r
 -                    }).start();\r
 -                  }\r
 -\r
 -                });\r
 -                fetchr.setToolTipText("<html>"\r
 -                        + JvSwingUtils.wrapTooltip("Retrieve from "\r
 -                                + src.getDbName()) + "<html>");\r
 -                dfetch.add(fetchr);\r
 -                comp++;\r
 -              }\r
 -              else\r
 -              {\r
 -                final DbSourceProxy[] dassource = otherdb\r
 -                        .toArray(new DbSourceProxy[0]);\r
 -                // fetch all entry\r
 -                DbSourceProxy src = otherdb.get(0);\r
 +    fetchr.addActionListener(new ActionListener()
 +    {
 +
 +      @Override
 +      public void actionPerformed(ActionEvent e)
 +      {
 +        new Thread(new Runnable()
 +        {
 +
 +          @Override
 +          public void run()
 +          {
 +            new jalview.ws.DBRefFetcher(alignPanel.av
 +                    .getSequenceSelection(), alignPanel.alignFrame)
 +                    .fetchDBRefs(false);
 +          }
 +        }).start();
 +
 +      }
 +
 +    });
 +    rfetch.add(fetchr);
 +    final AlignFrame me = this;
 +    new Thread(new Runnable()
 +    {
 +      @Override
 +      public void run()
 +      {
 +        final jalview.ws.SequenceFetcher sf = SequenceFetcher
 +                .getSequenceFetcherSingleton(me);
 +        javax.swing.SwingUtilities.invokeLater(new Runnable()
 +        {
 +          @Override
 +          public void run()
 +          {
 +            String[] dbclasses = sf.getOrderedSupportedSources();
 +            // sf.getDbInstances(jalview.ws.dbsources.DasSequenceSource.class);
 +            // jalview.util.QuickSort.sort(otherdb, otherdb);
 +            List<DbSourceProxy> otherdb;
 +            JMenu dfetch = new JMenu();
 +            JMenu ifetch = new JMenu();
 +            JMenuItem fetchr = null;
 +            int comp = 0, icomp = 0, mcomp = 15;
 +            String mname = null;
 +            int dbi = 0;
 +            for (String dbclass : dbclasses)
 +            {
 +              otherdb = sf.getSourceProxy(dbclass);
 +              // add a single entry for this class, or submenu allowing 'fetch
 +              // all' or pick one
 +              if (otherdb == null || otherdb.size() < 1)
 +              {
 +                continue;
 +              }
 +              // List<DbSourceProxy> dbs=otherdb;
 +              // otherdb=new ArrayList<DbSourceProxy>();
 +              // for (DbSourceProxy db:dbs)
 +              // {
 +              // if (!db.isA(DBRefSource.ALIGNMENTDB)
 +              // }
 +              if (mname == null)
 +              {
 +                mname = "From " + dbclass;
 +              }
 +              if (otherdb.size() == 1)
 +              {
 +                final DbSourceProxy[] dassource = otherdb
 +                        .toArray(new DbSourceProxy[0]);
 +                DbSourceProxy src = otherdb.get(0);
 +                fetchr = new JMenuItem(src.getDbSource());
 +                fetchr.addActionListener(new ActionListener()
 +                {
 +
 +                  @Override
 +                  public void actionPerformed(ActionEvent e)
 +                  {
 +                    new Thread(new Runnable()
 +                    {
 +
 +                      @Override
 +                      public void run()
 +                      {
 +                        new jalview.ws.DBRefFetcher(alignPanel.av
 +                                .getSequenceSelection(),
 +                                alignPanel.alignFrame, dassource)
 +                                .fetchDBRefs(false);
 +                      }
 +                    }).start();
 +                  }
 +
 +                });
 +                fetchr.setToolTipText("<html>"
 +                        + JvSwingUtils.wrapTooltip("Retrieve from "
 +                                + src.getDbName()) + "<html>");
 +                dfetch.add(fetchr);
 +                comp++;
 +              }
 +              else
 +              {
 +                final DbSourceProxy[] dassource = otherdb
 +                        .toArray(new DbSourceProxy[0]);
 +                // fetch all entry
 +                DbSourceProxy src = otherdb.get(0);
-                 fetchr = new JMenuItem("Fetch All '" + src.getDbSource()
-                         + "'");
+                 fetchr = new JMenuItem(MessageManager.formatMessage("label.fetch_all_param", new String[]{src.getDbSource()}));\r
 -                fetchr.addActionListener(new ActionListener()\r
 -                {\r
 -                  @Override\r
 -                  public void actionPerformed(ActionEvent e)\r
 -                  {\r
 -                    new Thread(new Runnable()\r
 -                    {\r
 -\r
 -                      @Override\r
 -                      public void run()\r
 -                      {\r
 -                        new jalview.ws.DBRefFetcher(alignPanel.av\r
 -                                .getSequenceSelection(),\r
 -                                alignPanel.alignFrame, dassource)\r
 -                                .fetchDBRefs(false);\r
 -                      }\r
 -                    }).start();\r
 -                  }\r
 -                });\r
 -\r
 -                fetchr.setToolTipText("<html>"\r
 -                        + JvSwingUtils.wrapTooltip("Retrieve from all "\r
 -                                + otherdb.size() + " sources in "\r
 -                                + src.getDbSource() + "<br>First is :"\r
 -                                + src.getDbName()) + "<html>");\r
 -                dfetch.add(fetchr);\r
 -                comp++;\r
 -                // and then build the rest of the individual menus\r
 -                ifetch = new JMenu("Sources from " + src.getDbSource());\r
 -                icomp = 0;\r
 -                String imname = null;\r
 -                int i = 0;\r
 -                for (DbSourceProxy sproxy : otherdb)\r
 -                {\r
 -                  String dbname = sproxy.getDbName();\r
 -                  String sname = dbname.length() > 5 ? dbname.substring(0,\r
 -                          5) + "..." : dbname;\r
 -                  String msname = dbname.length() > 10 ? dbname.substring(\r
 -                          0, 10) + "..." : dbname;\r
 -                  if (imname == null)\r
 -                  {\r
 -                    imname = "from '" + sname + "'";\r
 -                  }\r
 -                  fetchr = new JMenuItem(msname);\r
 -                  final DbSourceProxy[] dassrc =\r
 -                  { sproxy };\r
 -                  fetchr.addActionListener(new ActionListener()\r
 -                  {\r
 -\r
 -                    @Override\r
 -                    public void actionPerformed(ActionEvent e)\r
 -                    {\r
 -                      new Thread(new Runnable()\r
 -                      {\r
 -\r
 -                        @Override\r
 -                        public void run()\r
 -                        {\r
 -                          new jalview.ws.DBRefFetcher(alignPanel.av\r
 -                                  .getSequenceSelection(),\r
 -                                  alignPanel.alignFrame, dassrc)\r
 -                                  .fetchDBRefs(false);\r
 -                        }\r
 -                      }).start();\r
 -                    }\r
 -\r
 -                  });\r
 -                  fetchr.setToolTipText("<html>"\r
 -                          + JvSwingUtils.wrapTooltip("Retrieve from "\r
 -                                  + dbname) + "</html>");\r
 -                  ifetch.add(fetchr);\r
 -                  ++i;\r
 -                  if (++icomp >= mcomp || i == (otherdb.size()))\r
 -                  {\r
 -                    ifetch.setText(MessageManager.formatMessage("label.source_to_target",new String[]{imname,sname}));\r
 -                    dfetch.add(ifetch);\r
 -                    ifetch = new JMenu();\r
 -                    imname = null;\r
 -                    icomp = 0;\r
 -                    comp++;\r
 -                  }\r
 -                }\r
 -              }\r
 -              ++dbi;\r
 -              if (comp >= mcomp || dbi >= (dbclasses.length))\r
 -              {\r
 -                dfetch.setText(MessageManager.formatMessage("label.source_to_target",new String[]{mname,dbclass}));\r
 -                rfetch.add(dfetch);\r
 -                dfetch = new JMenu();\r
 -                mname = null;\r
 -                comp = 0;\r
 -              }\r
 -            }\r
 -          }\r
 -        });\r
 -      }\r
 -    }).start();\r
 -\r
 -  }\r
 -\r
 -  /**\r
 -   * Left justify the whole alignment.\r
 -   */\r
 -  @Override\r
 -  protected void justifyLeftMenuItem_actionPerformed(ActionEvent e)\r
 -  {\r
 -    AlignmentI al = viewport.getAlignment();\r
 -    al.justify(false);\r
 -    viewport.firePropertyChange("alignment", null, al);\r
 -  }\r
 -\r
 -  /**\r
 -   * Right justify the whole alignment.\r
 -   */\r
 -  @Override\r
 -  protected void justifyRightMenuItem_actionPerformed(ActionEvent e)\r
 -  {\r
 -    AlignmentI al = viewport.getAlignment();\r
 -    al.justify(true);\r
 -    viewport.firePropertyChange("alignment", null, al);\r
 -  }\r
 -\r
 -  public void setShowSeqFeatures(boolean b)\r
 -  {\r
 -    showSeqFeatures.setSelected(true);\r
 -    viewport.setShowSequenceFeatures(true);\r
 -  }\r
 -\r
 -  /*\r
 -   * (non-Javadoc)\r
 -   * \r
 -   * @see\r
 -   * jalview.jbgui.GAlignFrame#showUnconservedMenuItem_actionPerformed(java.\r
 -   * awt.event.ActionEvent)\r
 -   */\r
 -  @Override\r
 -  protected void showUnconservedMenuItem_actionPerformed(ActionEvent e)\r
 -  {\r
 -    viewport.setShowUnconserved(showNonconservedMenuItem.getState());\r
 -    alignPanel.paintAlignment(true);\r
 -  }\r
 -\r
 -  /*\r
 -   * (non-Javadoc)\r
 -   * \r
 -   * @see\r
 -   * jalview.jbgui.GAlignFrame#showGroupConsensus_actionPerformed(java.awt.event\r
 -   * .ActionEvent)\r
 -   */\r
 -  @Override\r
 -  protected void showGroupConsensus_actionPerformed(ActionEvent e)\r
 -  {\r
 -    viewport.setShowGroupConsensus(showGroupConsensus.getState());\r
 -    alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());\r
 -\r
 -  }\r
 -\r
 -  /*\r
 -   * (non-Javadoc)\r
 -   * \r
 -   * @see\r
 -   * jalview.jbgui.GAlignFrame#showGroupConservation_actionPerformed(java.awt\r
 -   * .event.ActionEvent)\r
 -   */\r
 -  @Override\r
 -  protected void showGroupConservation_actionPerformed(ActionEvent e)\r
 -  {\r
 -    viewport.setShowGroupConservation(showGroupConservation.getState());\r
 -    alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());\r
 -  }\r
 -\r
 -  /*\r
 -   * (non-Javadoc)\r
 -   * \r
 -   * @see\r
 -   * jalview.jbgui.GAlignFrame#showConsensusHistogram_actionPerformed(java.awt\r
 -   * .event.ActionEvent)\r
 -   */\r
 -  @Override\r
 -  protected void showConsensusHistogram_actionPerformed(ActionEvent e)\r
 -  {\r
 -    viewport.setShowConsensusHistogram(showConsensusHistogram.getState());\r
 -    alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());\r
 -  }\r
 -\r
 -  /*\r
 -   * (non-Javadoc)\r
 -   * \r
 -   * @see\r
 -   * jalview.jbgui.GAlignFrame#showConsensusProfile_actionPerformed(java.awt\r
 -   * .event.ActionEvent)\r
 -   */\r
 -  @Override\r
 -  protected void showSequenceLogo_actionPerformed(ActionEvent e)\r
 -  {\r
 -    viewport.setShowSequenceLogo(showSequenceLogo.getState());\r
 -    alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());\r
 -  }\r
 -\r
 -  @Override\r
 -  protected void normaliseSequenceLogo_actionPerformed(ActionEvent e)\r
 -  {\r
 -    showSequenceLogo.setState(true);\r
 -    viewport.setShowSequenceLogo(true);\r
 -    viewport.setNormaliseSequenceLogo(normaliseSequenceLogo.getState());\r
 -    alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());\r
 -  }\r
 -\r
 -  @Override\r
 -  protected void applyAutoAnnotationSettings_actionPerformed(ActionEvent e)\r
 -  {\r
 -    alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());\r
 -  }\r
 -\r
 -  /*\r
 -   * (non-Javadoc)\r
 -   * \r
 -   * @see\r
 -   * jalview.jbgui.GAlignFrame#makeGrpsFromSelection_actionPerformed(java.awt\r
 -   * .event.ActionEvent)\r
 -   */\r
 -  @Override\r
 -  protected void makeGrpsFromSelection_actionPerformed(ActionEvent e)\r
 -  {\r
 -    if (avc.makeGroupsFromSelection()) {\r
 -      PaintRefresher.Refresh(this, viewport.getSequenceSetId());\r
 -      alignPanel.updateAnnotation();\r
 -      alignPanel.paintAlignment(true);\r
 -    }\r
 -  }\r
 -\r
 -  @Override\r
 -  protected void createGroup_actionPerformed(ActionEvent e)\r
 -  {\r
 -    if (avc.createGroup())\r
 -    {\r
 -      alignPanel.alignmentChanged();\r
 -    }\r
 -  }\r
 -\r
 -  @Override\r
 -  protected void unGroup_actionPerformed(ActionEvent e)\r
 -  {\r
 -    if (avc.unGroup())\r
 -    {\r
 -      alignPanel.alignmentChanged();\r
 -    }\r
 -  }\r
 -\r
 -  /**\r
 -   * make the given alignmentPanel the currently selected tab\r
 -   * \r
 -   * @param alignmentPanel\r
 -   */\r
 -  public void setDisplayedView(AlignmentPanel alignmentPanel)\r
 -  {\r
 -    if (!viewport.getSequenceSetId().equals(\r
 -            alignmentPanel.av.getSequenceSetId()))\r
 -    {\r
 -      throw new Error(\r
 -              "Implementation error: cannot show a view from another alignment in an AlignFrame.");\r
 -    }\r
 -    if (tabbedPane != null\r
 -            & alignPanels.indexOf(alignmentPanel) != tabbedPane\r
 -                    .getSelectedIndex())\r
 -    {\r
 -      tabbedPane.setSelectedIndex(alignPanels.indexOf(alignmentPanel));\r
 -    }\r
 -  }\r
 -}\r
 -\r
 -class PrintThread extends Thread\r
 -{\r
 -  AlignmentPanel ap;\r
 -\r
 -  public PrintThread(AlignmentPanel ap)\r
 -  {\r
 -    this.ap = ap;\r
 -  }\r
 -\r
 -  static PageFormat pf;\r
 -\r
 -  @Override\r
 -  public void run()\r
 -  {\r
 -    PrinterJob printJob = PrinterJob.getPrinterJob();\r
 -\r
 -    if (pf != null)\r
 -    {\r
 -      printJob.setPrintable(ap, pf);\r
 -    }\r
 -    else\r
 -    {\r
 -      printJob.setPrintable(ap);\r
 -    }\r
 -\r
 -    if (printJob.printDialog())\r
 -    {\r
 -      try\r
 -      {\r
 -        printJob.print();\r
 -      } catch (Exception PrintException)\r
 -      {\r
 -        PrintException.printStackTrace();\r
 -      }\r
 -    }\r
 -  }\r
 -}\r
 +                fetchr.addActionListener(new ActionListener()
 +                {
 +                  @Override
 +                  public void actionPerformed(ActionEvent e)
 +                  {
 +                    new Thread(new Runnable()
 +                    {
 +
 +                      @Override
 +                      public void run()
 +                      {
 +                        new jalview.ws.DBRefFetcher(alignPanel.av
 +                                .getSequenceSelection(),
 +                                alignPanel.alignFrame, dassource)
 +                                .fetchDBRefs(false);
 +                      }
 +                    }).start();
 +                  }
 +                });
 +
 +                fetchr.setToolTipText("<html>"
 +                        + JvSwingUtils.wrapTooltip("Retrieve from all "
 +                                + otherdb.size() + " sources in "
 +                                + src.getDbSource() + "<br>First is :"
 +                                + src.getDbName()) + "<html>");
 +                dfetch.add(fetchr);
 +                comp++;
 +                // and then build the rest of the individual menus
 +                ifetch = new JMenu("Sources from " + src.getDbSource());
 +                icomp = 0;
 +                String imname = null;
 +                int i = 0;
 +                for (DbSourceProxy sproxy : otherdb)
 +                {
 +                  String dbname = sproxy.getDbName();
 +                  String sname = dbname.length() > 5 ? dbname.substring(0,
 +                          5) + "..." : dbname;
 +                  String msname = dbname.length() > 10 ? dbname.substring(
 +                          0, 10) + "..." : dbname;
 +                  if (imname == null)
 +                  {
 +                    imname = "from '" + sname + "'";
 +                  }
 +                  fetchr = new JMenuItem(msname);
 +                  final DbSourceProxy[] dassrc =
 +                  { sproxy };
 +                  fetchr.addActionListener(new ActionListener()
 +                  {
 +
 +                    @Override
 +                    public void actionPerformed(ActionEvent e)
 +                    {
 +                      new Thread(new Runnable()
 +                      {
 +
 +                        @Override
 +                        public void run()
 +                        {
 +                          new jalview.ws.DBRefFetcher(alignPanel.av
 +                                  .getSequenceSelection(),
 +                                  alignPanel.alignFrame, dassrc)
 +                                  .fetchDBRefs(false);
 +                        }
 +                      }).start();
 +                    }
 +
 +                  });
 +                  fetchr.setToolTipText("<html>"
 +                          + JvSwingUtils.wrapTooltip("Retrieve from "
 +                                  + dbname) + "</html>");
 +                  ifetch.add(fetchr);
 +                  ++i;
 +                  if (++icomp >= mcomp || i == (otherdb.size()))
 +                  {
 +                    ifetch.setText(MessageManager.formatMessage("label.source_to_target",new String[]{imname,sname}));
 +                    dfetch.add(ifetch);
 +                    ifetch = new JMenu();
 +                    imname = null;
 +                    icomp = 0;
 +                    comp++;
 +                  }
 +                }
 +              }
 +              ++dbi;
 +              if (comp >= mcomp || dbi >= (dbclasses.length))
 +              {
 +                dfetch.setText(MessageManager.formatMessage("label.source_to_target",new String[]{mname,dbclass}));
 +                rfetch.add(dfetch);
 +                dfetch = new JMenu();
 +                mname = null;
 +                comp = 0;
 +              }
 +            }
 +          }
 +        });
 +      }
 +    }).start();
 +
 +  }
 +
 +  /**
 +   * Left justify the whole alignment.
 +   */
 +  @Override
 +  protected void justifyLeftMenuItem_actionPerformed(ActionEvent e)
 +  {
 +    AlignmentI al = viewport.getAlignment();
 +    al.justify(false);
 +    viewport.firePropertyChange("alignment", null, al);
 +  }
 +
 +  /**
 +   * Right justify the whole alignment.
 +   */
 +  @Override
 +  protected void justifyRightMenuItem_actionPerformed(ActionEvent e)
 +  {
 +    AlignmentI al = viewport.getAlignment();
 +    al.justify(true);
 +    viewport.firePropertyChange("alignment", null, al);
 +  }
 +
 +  public void setShowSeqFeatures(boolean b)
 +  {
 +    showSeqFeatures.setSelected(true);
 +    viewport.setShowSequenceFeatures(true);
 +  }
 +
 +  /*
 +   * (non-Javadoc)
 +   * 
 +   * @see
 +   * jalview.jbgui.GAlignFrame#showUnconservedMenuItem_actionPerformed(java.
 +   * awt.event.ActionEvent)
 +   */
 +  @Override
 +  protected void showUnconservedMenuItem_actionPerformed(ActionEvent e)
 +  {
 +    viewport.setShowUnconserved(showNonconservedMenuItem.getState());
 +    alignPanel.paintAlignment(true);
 +  }
 +
 +  /*
 +   * (non-Javadoc)
 +   * 
 +   * @see
 +   * jalview.jbgui.GAlignFrame#showGroupConsensus_actionPerformed(java.awt.event
 +   * .ActionEvent)
 +   */
 +  @Override
 +  protected void showGroupConsensus_actionPerformed(ActionEvent e)
 +  {
 +    viewport.setShowGroupConsensus(showGroupConsensus.getState());
 +    alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
 +
 +  }
 +
 +  /*
 +   * (non-Javadoc)
 +   * 
 +   * @see
 +   * jalview.jbgui.GAlignFrame#showGroupConservation_actionPerformed(java.awt
 +   * .event.ActionEvent)
 +   */
 +  @Override
 +  protected void showGroupConservation_actionPerformed(ActionEvent e)
 +  {
 +    viewport.setShowGroupConservation(showGroupConservation.getState());
 +    alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
 +  }
 +
 +  /*
 +   * (non-Javadoc)
 +   * 
 +   * @see
 +   * jalview.jbgui.GAlignFrame#showConsensusHistogram_actionPerformed(java.awt
 +   * .event.ActionEvent)
 +   */
 +  @Override
 +  protected void showConsensusHistogram_actionPerformed(ActionEvent e)
 +  {
 +    viewport.setShowConsensusHistogram(showConsensusHistogram.getState());
 +    alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
 +  }
 +
 +  /*
 +   * (non-Javadoc)
 +   * 
 +   * @see
 +   * jalview.jbgui.GAlignFrame#showConsensusProfile_actionPerformed(java.awt
 +   * .event.ActionEvent)
 +   */
 +  @Override
 +  protected void showSequenceLogo_actionPerformed(ActionEvent e)
 +  {
 +    viewport.setShowSequenceLogo(showSequenceLogo.getState());
 +    alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
 +  }
 +
 +  @Override
 +  protected void normaliseSequenceLogo_actionPerformed(ActionEvent e)
 +  {
 +    showSequenceLogo.setState(true);
 +    viewport.setShowSequenceLogo(true);
 +    viewport.setNormaliseSequenceLogo(normaliseSequenceLogo.getState());
 +    alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
 +  }
 +
 +  @Override
 +  protected void applyAutoAnnotationSettings_actionPerformed(ActionEvent e)
 +  {
 +    alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
 +  }
 +
 +  /*
 +   * (non-Javadoc)
 +   * 
 +   * @see
 +   * jalview.jbgui.GAlignFrame#makeGrpsFromSelection_actionPerformed(java.awt
 +   * .event.ActionEvent)
 +   */
 +  @Override
 +  protected void makeGrpsFromSelection_actionPerformed(ActionEvent e)
 +  {
 +    if (avc.makeGroupsFromSelection()) {
 +      PaintRefresher.Refresh(this, viewport.getSequenceSetId());
 +      alignPanel.updateAnnotation();
 +      alignPanel.paintAlignment(true);
 +    }
 +  }
 +
 +  @Override
 +  protected void createGroup_actionPerformed(ActionEvent e)
 +  {
 +    if (avc.createGroup())
 +    {
 +      alignPanel.alignmentChanged();
 +    }
 +  }
 +
 +  @Override
 +  protected void unGroup_actionPerformed(ActionEvent e)
 +  {
 +    if (avc.unGroup())
 +    {
 +      alignPanel.alignmentChanged();
 +    }
 +  }
 +
 +  /**
 +   * make the given alignmentPanel the currently selected tab
 +   * 
 +   * @param alignmentPanel
 +   */
 +  public void setDisplayedView(AlignmentPanel alignmentPanel)
 +  {
 +    if (!viewport.getSequenceSetId().equals(
 +            alignmentPanel.av.getSequenceSetId()))
 +    {
 +      throw new Error(
 +              "Implementation error: cannot show a view from another alignment in an AlignFrame.");
 +    }
 +    if (tabbedPane != null
 +            & alignPanels.indexOf(alignmentPanel) != tabbedPane
 +                    .getSelectedIndex())
 +    {
 +      tabbedPane.setSelectedIndex(alignPanels.indexOf(alignmentPanel));
 +    }
 +  }
 +}
 +
 +class PrintThread extends Thread
 +{
 +  AlignmentPanel ap;
 +
 +  public PrintThread(AlignmentPanel ap)
 +  {
 +    this.ap = ap;
 +  }
 +
 +  static PageFormat pf;
 +
 +  @Override
 +  public void run()
 +  {
 +    PrinterJob printJob = PrinterJob.getPrinterJob();
 +
 +    if (pf != null)
 +    {
 +      printJob.setPrintable(ap, pf);
 +    }
 +    else
 +    {
 +      printJob.setPrintable(ap);
 +    }
 +
 +    if (printJob.printDialog())
 +    {
 +      try
 +      {
 +        printJob.print();
 +      } catch (Exception PrintException)
 +      {
 +        PrintException.printStackTrace();
 +      }
 +    }
 +  }
 +}
Simple merge
Simple merge
 -/*\r
 - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8)\r
 - * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle\r
 - * \r
 - * This file is part of Jalview.\r
 - * \r
 - * Jalview is free software: you can redistribute it and/or\r
 - * modify it under the terms of the GNU General Public License \r
 - * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\r
 - *  \r
 - * Jalview is distributed in the hope that it will be useful, but \r
 - * WITHOUT ANY WARRANTY; without even the implied warranty \r
 - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR \r
 - * PURPOSE.  See the GNU General Public License for more details.\r
 - * \r
 - * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.\r
 - */\r
 -package jalview.gui;\r
 -\r
 -import java.util.*;\r
 -import java.awt.*;\r
 -import javax.swing.*;\r
 -import javax.swing.event.*;\r
 -\r
 -import java.awt.event.*;\r
 -import java.io.*;\r
 -\r
 -import jalview.jbgui.GStructureViewer;\r
 -import jalview.api.SequenceStructureBinding;\r
 -import jalview.bin.Cache;\r
 -import jalview.datamodel.*;\r
 -import jalview.gui.ViewSelectionMenu.ViewSetProvider;\r
 -import jalview.datamodel.PDBEntry;\r
 -import jalview.io.*;\r
 -import jalview.schemes.*;\r
 -import jalview.util.MessageManager;\r
 -import jalview.util.Platform;\r
 -\r
 -public class AppJmol extends GStructureViewer implements Runnable,\r
 -        SequenceStructureBinding, ViewSetProvider\r
 -\r
 -{\r
 -  AppJmolBinding jmb;\r
 -\r
 -  JPanel scriptWindow;\r
 -\r
 -  JSplitPane splitPane;\r
 -\r
 -  RenderPanel renderPanel;\r
 -\r
 -  AlignmentPanel ap;\r
 -\r
 -  Vector atomsPicked = new Vector();\r
 -\r
 -  private boolean addingStructures = false;\r
 -\r
 -  /**\r
 -   * \r
 -   * @param file\r
 -   * @param id\r
 -   * @param seq\r
 -   * @param ap\r
 -   * @param loadStatus\r
 -   * @param bounds\r
 -   * @deprecated defaults to AppJmol(String[] files, ... , viewid);\r
 -   */\r
 -  public AppJmol(String file, String id, SequenceI[] seq,\r
 -          AlignmentPanel ap, String loadStatus, Rectangle bounds)\r
 -  {\r
 -    this(file, id, seq, ap, loadStatus, bounds, null);\r
 -  }\r
 -\r
 -  /**\r
 -   * @deprecated\r
 -   */\r
 -  public AppJmol(String file, String id, SequenceI[] seq,\r
 -          AlignmentPanel ap, String loadStatus, Rectangle bounds,\r
 -          String viewid)\r
 -  {\r
 -    this(new String[]\r
 -    { file }, new String[]\r
 -    { id }, new SequenceI[][]\r
 -    { seq }, ap, true, true, false, loadStatus, bounds, viewid);\r
 -  }\r
 -\r
 -  ViewSelectionMenu seqColourBy;\r
 -\r
 -  /**\r
 -   * \r
 -   * @param files\r
 -   * @param ids\r
 -   * @param seqs\r
 -   * @param ap\r
 -   * @param usetoColour\r
 -   *          - add the alignment panel to the list used for colouring these\r
 -   *          structures\r
 -   * @param useToAlign\r
 -   *          - add the alignment panel to the list used for aligning these\r
 -   *          structures\r
 -   * @param leaveColouringToJmol\r
 -   *          - do not update the colours from any other source. Jmol is\r
 -   *          handling them\r
 -   * @param loadStatus\r
 -   * @param bounds\r
 -   * @param viewid\r
 -   */\r
 -  public AppJmol(String[] files, String[] ids, SequenceI[][] seqs,\r
 -          AlignmentPanel ap, boolean usetoColour, boolean useToAlign,\r
 -          boolean leaveColouringToJmol, String loadStatus,\r
 -          Rectangle bounds, String viewid)\r
 -  {\r
 -    PDBEntry[] pdbentrys = new PDBEntry[files.length];\r
 -    for (int i = 0; i < pdbentrys.length; i++)\r
 -    {\r
 -      PDBEntry pdbentry = new PDBEntry();\r
 -      pdbentry.setFile(files[i]);\r
 -      pdbentry.setId(ids[i]);\r
 -      pdbentrys[i] = pdbentry;\r
 -    }\r
 -    // / TODO: check if protocol is needed to be set, and if chains are\r
 -    // autodiscovered.\r
 -    jmb = new AppJmolBinding(this, ap.getStructureSelectionManager(),\r
 -            pdbentrys, seqs, null, null);\r
 -\r
 -    jmb.setLoadingFromArchive(true);\r
 -    addAlignmentPanel(ap);\r
 -    if (useToAlign)\r
 -    {\r
 -      useAlignmentPanelForSuperposition(ap);\r
 -    }\r
 -    if (leaveColouringToJmol || !usetoColour)\r
 -    {\r
 -      jmb.setColourBySequence(false);\r
 -      seqColour.setSelected(false);\r
 -      jmolColour.setSelected(true);\r
 -    }\r
 -    if (usetoColour)\r
 -    {\r
 -      useAlignmentPanelForColourbyseq(ap);\r
 -      jmb.setColourBySequence(true);\r
 -      seqColour.setSelected(true);\r
 -      jmolColour.setSelected(false);\r
 -    }\r
 -    this.setBounds(bounds);\r
 -    initMenus();\r
 -    viewId = viewid;\r
 -    // jalview.gui.Desktop.addInternalFrame(this, "Loading File",\r
 -    // bounds.width,bounds.height);\r
 -\r
 -    this.addInternalFrameListener(new InternalFrameAdapter()\r
 -    {\r
 -      public void internalFrameClosing(InternalFrameEvent internalFrameEvent)\r
 -      {\r
 -        closeViewer();\r
 -      }\r
 -    });\r
 -    initJmol(loadStatus); // pdbentry, seq, JBPCHECK!\r
 -\r
 -  }\r
 -\r
 -  private void initMenus()\r
 -  {\r
 -    seqColour.setSelected(jmb.isColourBySequence());\r
 -    jmolColour.setSelected(!jmb.isColourBySequence());\r
 -    if (_colourwith == null)\r
 -    {\r
 -      _colourwith = new Vector<AlignmentPanel>();\r
 -    }\r
 -    if (_alignwith == null)\r
 -    {\r
 -      _alignwith = new Vector<AlignmentPanel>();\r
 -    }\r
 -\r
 -    seqColourBy = new ViewSelectionMenu("Colour by ..", this, _colourwith,\r
 -            new ItemListener()\r
 -            {\r
 -\r
 -              @Override\r
 -              public void itemStateChanged(ItemEvent e)\r
 -              {\r
 -                if (!seqColour.isSelected())\r
 -                {\r
 -                  seqColour.doClick();\r
 -                }\r
 -                else\r
 -                {\r
 -                  // update the jmol display now.\r
 -                  seqColour_actionPerformed(null);\r
 -                }\r
 -              }\r
 -            });\r
 -    viewMenu.add(seqColourBy);\r
 -    final ItemListener handler;\r
 -    JMenu alpanels = new ViewSelectionMenu("Superpose with ..", this,\r
 -            _alignwith, handler = new ItemListener()\r
 -            {\r
 -\r
 -              @Override\r
 -              public void itemStateChanged(ItemEvent e)\r
 -              {\r
 -                alignStructs.setEnabled(_alignwith.size() > 0);\r
 +/*
 + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
 + * Copyright (C) 2014 The Jalview Authors
 + * 
 + * This file is part of Jalview.
 + * 
 + * Jalview is free software: you can redistribute it and/or
 + * modify it under the terms of the GNU General Public License 
 + * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
 + *  
 + * Jalview is distributed in the hope that it will be useful, but 
 + * WITHOUT ANY WARRANTY; without even the implied warranty 
 + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
 + * PURPOSE.  See the GNU General Public License for more details.
 + * 
 + * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
 + * The Jalview Authors are detailed in the 'AUTHORS' file.
 + */
 +package jalview.gui;
 +
 +import java.util.*;
 +import java.awt.*;
 +import javax.swing.*;
 +import javax.swing.event.*;
 +
 +import java.awt.event.*;
 +import java.io.*;
 +
 +import jalview.jbgui.GStructureViewer;
 +import jalview.api.SequenceStructureBinding;
 +import jalview.bin.Cache;
 +import jalview.datamodel.*;
 +import jalview.gui.ViewSelectionMenu.ViewSetProvider;
 +import jalview.datamodel.PDBEntry;
 +import jalview.io.*;
 +import jalview.schemes.*;
 +import jalview.util.MessageManager;
 +import jalview.util.Platform;
 +
 +public class AppJmol extends GStructureViewer implements Runnable,
 +        SequenceStructureBinding, ViewSetProvider
 +
 +{
 +  AppJmolBinding jmb;
 +
 +  JPanel scriptWindow;
 +
 +  JSplitPane splitPane;
 +
 +  RenderPanel renderPanel;
 +
 +  AlignmentPanel ap;
 +
 +  Vector atomsPicked = new Vector();
 +
 +  private boolean addingStructures = false;
 +
 +  /**
 +   * 
 +   * @param file
 +   * @param id
 +   * @param seq
 +   * @param ap
 +   * @param loadStatus
 +   * @param bounds
 +   * @deprecated defaults to AppJmol(String[] files, ... , viewid);
 +   */
 +  public AppJmol(String file, String id, SequenceI[] seq,
 +          AlignmentPanel ap, String loadStatus, Rectangle bounds)
 +  {
 +    this(file, id, seq, ap, loadStatus, bounds, null);
 +  }
 +
 +  /**
 +   * @deprecated
 +   */
 +  public AppJmol(String file, String id, SequenceI[] seq,
 +          AlignmentPanel ap, String loadStatus, Rectangle bounds,
 +          String viewid)
 +  {
 +    this(new String[]
 +    { file }, new String[]
 +    { id }, new SequenceI[][]
 +    { seq }, ap, true, true, false, loadStatus, bounds, viewid);
 +  }
 +
 +  ViewSelectionMenu seqColourBy;
 +
 +  /**
 +   * 
 +   * @param files
 +   * @param ids
 +   * @param seqs
 +   * @param ap
 +   * @param usetoColour
 +   *          - add the alignment panel to the list used for colouring these
 +   *          structures
 +   * @param useToAlign
 +   *          - add the alignment panel to the list used for aligning these
 +   *          structures
 +   * @param leaveColouringToJmol
 +   *          - do not update the colours from any other source. Jmol is
 +   *          handling them
 +   * @param loadStatus
 +   * @param bounds
 +   * @param viewid
 +   */
 +  public AppJmol(String[] files, String[] ids, SequenceI[][] seqs,
 +          AlignmentPanel ap, boolean usetoColour, boolean useToAlign,
 +          boolean leaveColouringToJmol, String loadStatus,
 +          Rectangle bounds, String viewid)
 +  {
 +    PDBEntry[] pdbentrys = new PDBEntry[files.length];
 +    for (int i = 0; i < pdbentrys.length; i++)
 +    {
 +      PDBEntry pdbentry = new PDBEntry();
 +      pdbentry.setFile(files[i]);
 +      pdbentry.setId(ids[i]);
 +      pdbentrys[i] = pdbentry;
 +    }
 +    // / TODO: check if protocol is needed to be set, and if chains are
 +    // autodiscovered.
 +    jmb = new AppJmolBinding(this, ap.getStructureSelectionManager(),
 +            pdbentrys, seqs, null, null);
 +
 +    jmb.setLoadingFromArchive(true);
 +    addAlignmentPanel(ap);
 +    if (useToAlign)
 +    {
 +      useAlignmentPanelForSuperposition(ap);
 +    }
 +    if (leaveColouringToJmol || !usetoColour)
 +    {
 +      jmb.setColourBySequence(false);
 +      seqColour.setSelected(false);
 +      jmolColour.setSelected(true);
 +    }
 +    if (usetoColour)
 +    {
 +      useAlignmentPanelForColourbyseq(ap);
 +      jmb.setColourBySequence(true);
 +      seqColour.setSelected(true);
 +      jmolColour.setSelected(false);
 +    }
 +    this.setBounds(bounds);
 +    initMenus();
 +    viewId = viewid;
 +    // jalview.gui.Desktop.addInternalFrame(this, "Loading File",
 +    // bounds.width,bounds.height);
 +
 +    this.addInternalFrameListener(new InternalFrameAdapter()
 +    {
 +      public void internalFrameClosing(InternalFrameEvent internalFrameEvent)
 +      {
 +        closeViewer();
 +      }
 +    });
 +    initJmol(loadStatus); // pdbentry, seq, JBPCHECK!
 +
 +  }
 +
 +  private void initMenus()
 +  {
 +    seqColour.setSelected(jmb.isColourBySequence());
 +    jmolColour.setSelected(!jmb.isColourBySequence());
 +    if (_colourwith == null)
 +    {
 +      _colourwith = new Vector<AlignmentPanel>();
 +    }
 +    if (_alignwith == null)
 +    {
 +      _alignwith = new Vector<AlignmentPanel>();
 +    }
 +
 +    seqColourBy = new ViewSelectionMenu("Colour by ..", this, _colourwith,
 +            new ItemListener()
 +            {
 +
 +              @Override
 +              public void itemStateChanged(ItemEvent e)
 +              {
 +                if (!seqColour.isSelected())
 +                {
 +                  seqColour.doClick();
 +                }
 +                else
 +                {
 +                  // update the jmol display now.
 +                  seqColour_actionPerformed(null);
 +                }
 +              }
 +            });
 +    viewMenu.add(seqColourBy);
 +    final ItemListener handler;
 +    JMenu alpanels = new ViewSelectionMenu("Superpose with ..", this,
 +            _alignwith, handler = new ItemListener()
 +            {
 +
 +              @Override
 +              public void itemStateChanged(ItemEvent e)
 +              {
 +                alignStructs.setEnabled(_alignwith.size() > 0);
-                 alignStructs.setToolTipText("Align structures using "
-                         + _alignwith.size() + " linked alignment views");
+                 alignStructs.setToolTipText(MessageManager.formatMessage("label.align_structures_using_linked_alignment_views", new String[] {new Integer(_alignwith.size()).toString()}));\r
 -              }\r
 -            });\r
 -    handler.itemStateChanged(null);\r
 -    jmolActionMenu.add(alpanels);\r
 -    jmolActionMenu.addMenuListener(new MenuListener()\r
 -    {\r
 -\r
 -      @Override\r
 -      public void menuSelected(MenuEvent e)\r
 -      {\r
 -        handler.itemStateChanged(null);\r
 -      }\r
 -\r
 -      @Override\r
 -      public void menuDeselected(MenuEvent e)\r
 -      {\r
 -        // TODO Auto-generated method stub\r
 -\r
 -      }\r
 -\r
 -      @Override\r
 -      public void menuCanceled(MenuEvent e)\r
 -      {\r
 -        // TODO Auto-generated method stub\r
 -\r
 -      }\r
 -    });\r
 -  }\r
 -\r
 -  IProgressIndicator progressBar = null;\r
 -\r
 -  /**\r
 -   * add a single PDB structure to a new or existing Jmol view\r
 -   * \r
 -   * @param pdbentry\r
 -   * @param seq\r
 -   * @param chains\r
 -   * @param ap\r
 -   */\r
 -  public AppJmol(PDBEntry pdbentry, SequenceI[] seq, String[] chains,\r
 -          final AlignmentPanel ap)\r
 -  {\r
 -    progressBar = ap.alignFrame;\r
 -    // ////////////////////////////////\r
 -    // Is the pdb file already loaded?\r
 -    String alreadyMapped = ap.getStructureSelectionManager()\r
 -            .alreadyMappedToFile(pdbentry.getId());\r
 -\r
 -    if (alreadyMapped != null)\r
 -    {\r
 -      int option = JOptionPane.showInternalConfirmDialog(Desktop.desktop,\r
 -                MessageManager.formatMessage("label.pdb_entry_is_already_displayed",  new String[]{pdbentry.getId()}),\r
 -              MessageManager.formatMessage("label.map_sequences_to_visible_window", new String[]{pdbentry.getId()}),\r
 -              JOptionPane.YES_NO_OPTION);\r
 -\r
 -      if (option == JOptionPane.YES_OPTION)\r
 -      {\r
 -        // TODO : Fix multiple seq to one chain issue here.\r
 -        ap.getStructureSelectionManager().setMapping(seq, chains,\r
 -                alreadyMapped, AppletFormatAdapter.FILE);\r
 -        if (ap.seqPanel.seqCanvas.fr != null)\r
 -        {\r
 -          ap.seqPanel.seqCanvas.fr.featuresAdded();\r
 -          ap.paintAlignment(true);\r
 -        }\r
 -\r
 -        // Now this AppJmol is mapped to new sequences. We must add them to\r
 -        // the exisiting array\r
 -        JInternalFrame[] frames = Desktop.instance.getAllFrames();\r
 -\r
 -        for (int i = 0; i < frames.length; i++)\r
 -        {\r
 -          if (frames[i] instanceof AppJmol)\r
 -          {\r
 -            final AppJmol topJmol = ((AppJmol) frames[i]);\r
 -            // JBPNOTE: this looks like a binding routine, rather than a gui\r
 -            // routine\r
 -            for (int pe = 0; pe < topJmol.jmb.pdbentry.length; pe++)\r
 -            {\r
 -              if (topJmol.jmb.pdbentry[pe].getFile().equals(alreadyMapped))\r
 -              {\r
 -                topJmol.jmb.addSequence(pe, seq);\r
 -                topJmol.addAlignmentPanel(ap);\r
 -                // add it to the set used for colouring\r
 -                topJmol.useAlignmentPanelForColourbyseq(ap);\r
 -                topJmol.buildJmolActionMenu();\r
 -                ap.getStructureSelectionManager()\r
 -                        .sequenceColoursChanged(ap);\r
 -                break;\r
 -              }\r
 -            }\r
 -          }\r
 -        }\r
 -\r
 -        return;\r
 -      }\r
 -    }\r
 -    // /////////////////////////////////\r
 -    // Check if there are other Jmol views involving this alignment\r
 -    // and prompt user about adding this molecule to one of them\r
 -    Vector existingViews = getJmolsFor(ap);\r
 -    if (existingViews.size() > 0)\r
 -    {\r
 -      Enumeration jm = existingViews.elements();\r
 -      while (jm.hasMoreElements())\r
 -      {\r
 -        AppJmol topJmol = (AppJmol) jm.nextElement();\r
 -        // TODO: highlight topJmol in view somehow\r
 -        int option = JOptionPane.showInternalConfirmDialog(Desktop.desktop,\r
 -                      MessageManager.formatMessage("label.add_pdbentry_to_view", new String[]{pdbentry.getId(),topJmol.getTitle()}),\r
 -                      MessageManager.getString("label.align_to_existing_structure_view"),\r
 -                JOptionPane.YES_NO_OPTION);\r
 -        if (option == JOptionPane.YES_OPTION)\r
 -        {\r
 -          topJmol.useAlignmentPanelForSuperposition(ap);\r
 -          topJmol.addStructure(pdbentry, seq, chains, true, ap.alignFrame);\r
 -          return;\r
 -        }\r
 -      }\r
 -    }\r
 -    // /////////////////////////////////\r
 -    openNewJmol(ap, new PDBEntry[]\r
 -    { pdbentry }, new SequenceI[][]\r
 -    { seq });\r
 -  }\r
 -\r
 -  private void openNewJmol(AlignmentPanel ap, PDBEntry[] pdbentrys,\r
 -          SequenceI[][] seqs)\r
 -  {\r
 -    progressBar = ap.alignFrame;\r
 -    jmb = new AppJmolBinding(this, ap.getStructureSelectionManager(),\r
 -            pdbentrys, seqs, null, null);\r
 -    addAlignmentPanel(ap);\r
 -    useAlignmentPanelForColourbyseq(ap);\r
 -    if (pdbentrys.length > 1)\r
 -    {\r
 -      alignAddedStructures = true;\r
 -      useAlignmentPanelForSuperposition(ap);\r
 -    }\r
 -    jmb.setColourBySequence(true);\r
 -    setSize(400, 400); // probably should be a configurable/dynamic default here\r
 -    initMenus();\r
 -    worker = null;\r
 -    {\r
 -      addingStructures = false;\r
 -      worker = new Thread(this);\r
 -      worker.start();\r
 -    }\r
 -    this.addInternalFrameListener(new InternalFrameAdapter()\r
 -    {\r
 -      public void internalFrameClosing(InternalFrameEvent internalFrameEvent)\r
 -      {\r
 -        closeViewer();\r
 -      }\r
 -    });\r
 -\r
 -  }\r
 -\r
 -  /**\r
 -   * create a new Jmol containing several structures superimposed using the\r
 -   * given alignPanel.\r
 -   * \r
 -   * @param ap\r
 -   * @param pe\r
 -   * @param seqs\r
 -   */\r
 -  public AppJmol(AlignmentPanel ap, PDBEntry[] pe, SequenceI[][] seqs)\r
 -  {\r
 -    openNewJmol(ap, pe, seqs);\r
 -  }\r
 -\r
 -  /**\r
 -   * list of sequenceSet ids associated with the view\r
 -   */\r
 -  ArrayList<String> _aps = new ArrayList();\r
 -\r
 -  public AlignmentPanel[] getAllAlignmentPanels()\r
 -  {\r
 -    AlignmentPanel[] t, list = new AlignmentPanel[0];\r
 -    for (String setid : _aps)\r
 -    {\r
 -      AlignmentPanel[] panels = PaintRefresher.getAssociatedPanels(setid);\r
 -      if (panels != null)\r
 -      {\r
 -        t = new AlignmentPanel[list.length + panels.length];\r
 -        System.arraycopy(list, 0, t, 0, list.length);\r
 -        System.arraycopy(panels, 0, t, list.length, panels.length);\r
 -        list = t;\r
 -      }\r
 -    }\r
 -\r
 -    return list;\r
 -  }\r
 -\r
 -  /**\r
 -   * list of alignment panels to use for superposition\r
 -   */\r
 -  Vector<AlignmentPanel> _alignwith = new Vector<AlignmentPanel>();\r
 -\r
 -  /**\r
 -   * list of alignment panels that are used for colouring structures by aligned\r
 -   * sequences\r
 -   */\r
 -  Vector<AlignmentPanel> _colourwith = new Vector<AlignmentPanel>();\r
 -\r
 -  /**\r
 -   * set the primary alignmentPanel reference and add another alignPanel to the\r
 -   * list of ones to use for colouring and aligning\r
 -   * \r
 -   * @param nap\r
 -   */\r
 -  public void addAlignmentPanel(AlignmentPanel nap)\r
 -  {\r
 -    if (ap == null)\r
 -    {\r
 -      ap = nap;\r
 -    }\r
 -    if (!_aps.contains(nap.av.getSequenceSetId()))\r
 -    {\r
 -      _aps.add(nap.av.getSequenceSetId());\r
 -    }\r
 -  }\r
 -\r
 -  /**\r
 -   * remove any references held to the given alignment panel\r
 -   * \r
 -   * @param nap\r
 -   */\r
 -  public void removeAlignmentPanel(AlignmentPanel nap)\r
 -  {\r
 -    try\r
 -    {\r
 -      _alignwith.remove(nap);\r
 -      _colourwith.remove(nap);\r
 -      if (ap == nap)\r
 -      {\r
 -        ap = null;\r
 -        for (AlignmentPanel aps : getAllAlignmentPanels())\r
 -        {\r
 -          if (aps != nap)\r
 -          {\r
 -            ap = aps;\r
 -            break;\r
 -          }\r
 -        }\r
 -      }\r
 -    } catch (Exception ex)\r
 -    {\r
 -    }\r
 -    if (ap != null)\r
 -    {\r
 -      buildJmolActionMenu();\r
 -    }\r
 -  }\r
 -\r
 -  public void useAlignmentPanelForSuperposition(AlignmentPanel nap)\r
 -  {\r
 -    addAlignmentPanel(nap);\r
 -    if (!_alignwith.contains(nap))\r
 -    {\r
 -      _alignwith.add(nap);\r
 -    }\r
 -  }\r
 -\r
 -  public void excludeAlignmentPanelForSuperposition(AlignmentPanel nap)\r
 -  {\r
 -    if (_alignwith.contains(nap))\r
 -    {\r
 -      _alignwith.remove(nap);\r
 -    }\r
 -  }\r
 -\r
 -  public void useAlignmentPanelForColourbyseq(AlignmentPanel nap,\r
 -          boolean enableColourBySeq)\r
 -  {\r
 -    useAlignmentPanelForColourbyseq(nap);\r
 -    jmb.setColourBySequence(enableColourBySeq);\r
 -    seqColour.setSelected(enableColourBySeq);\r
 -    jmolColour.setSelected(!enableColourBySeq);\r
 -  }\r
 -\r
 -  public void useAlignmentPanelForColourbyseq(AlignmentPanel nap)\r
 -  {\r
 -    addAlignmentPanel(nap);\r
 -    if (!_colourwith.contains(nap))\r
 -    {\r
 -      _colourwith.add(nap);\r
 -    }\r
 -  }\r
 -\r
 -  public void excludeAlignmentPanelForColourbyseq(AlignmentPanel nap)\r
 -  {\r
 -    if (_colourwith.contains(nap))\r
 -    {\r
 -      _colourwith.remove(nap);\r
 -    }\r
 -  }\r
 -\r
 -  /**\r
 -   * pdb retrieval thread.\r
 -   */\r
 -  private Thread worker = null;\r
 -\r
 -  /**\r
 -   * add a new structure (with associated sequences and chains) to this viewer,\r
 -   * retrieving it if necessary first.\r
 -   * \r
 -   * @param pdbentry\r
 -   * @param seq\r
 -   * @param chains\r
 -   * @param alignFrame\r
 -   * @param align\r
 -   *          if true, new structure(s) will be align using associated alignment\r
 -   */\r
 -  private void addStructure(final PDBEntry pdbentry, final SequenceI[] seq,\r
 -          final String[] chains, final boolean b,\r
 -          final IProgressIndicator alignFrame)\r
 -  {\r
 -    if (pdbentry.getFile() == null)\r
 -    {\r
 -      if (worker != null && worker.isAlive())\r
 -      {\r
 -        // a retrieval is in progress, wait around and add ourselves to the\r
 -        // queue.\r
 -        new Thread(new Runnable()\r
 -        {\r
 -          public void run()\r
 -          {\r
 -            while (worker != null && worker.isAlive() && _started)\r
 -            {\r
 -              try\r
 -              {\r
 -                Thread.sleep(100 + ((int) Math.random() * 100));\r
 -\r
 -              } catch (Exception e)\r
 -              {\r
 -              }\r
 -\r
 -            }\r
 -            // and call ourselves again.\r
 -            addStructure(pdbentry, seq, chains, b, alignFrame);\r
 -          }\r
 -        }).start();\r
 -        return;\r
 -      }\r
 -    }\r
 -    // otherwise, start adding the structure.\r
 -    jmb.addSequenceAndChain(new PDBEntry[]\r
 -    { pdbentry }, new SequenceI[][]\r
 -    { seq }, new String[][]\r
 -    { chains });\r
 -    addingStructures = true;\r
 -    _started = false;\r
 -    alignAddedStructures = b;\r
 -    progressBar = alignFrame; // visual indication happens on caller frame.\r
 -    (worker = new Thread(this)).start();\r
 -    return;\r
 -  }\r
 -\r
 -  private Vector getJmolsFor(AlignmentPanel ap2)\r
 -  {\r
 -    Vector otherJmols = new Vector();\r
 -    // Now this AppJmol is mapped to new sequences. We must add them to\r
 -    // the exisiting array\r
 -    JInternalFrame[] frames = Desktop.instance.getAllFrames();\r
 -\r
 -    for (int i = 0; i < frames.length; i++)\r
 -    {\r
 -      if (frames[i] instanceof AppJmol)\r
 -      {\r
 -        AppJmol topJmol = ((AppJmol) frames[i]);\r
 -        if (topJmol.isLinkedWith(ap2))\r
 -        {\r
 -          otherJmols.addElement(topJmol);\r
 -        }\r
 -      }\r
 -    }\r
 -    return otherJmols;\r
 -  }\r
 -\r
 -  void initJmol(String command)\r
 -  {\r
 -    jmb.setFinishedInit(false);\r
 -    renderPanel = new RenderPanel();\r
 -    // TODO: consider waiting until the structure/view is fully loaded before\r
 -    // displaying\r
 -    this.getContentPane().add(renderPanel, java.awt.BorderLayout.CENTER);\r
 -    jalview.gui.Desktop.addInternalFrame(this, jmb.getViewerTitle(),\r
 -            getBounds().width, getBounds().height);\r
 -    if (scriptWindow == null)\r
 -    {\r
 -      BorderLayout bl = new BorderLayout();\r
 -      bl.setHgap(0);\r
 -      bl.setVgap(0);\r
 -      scriptWindow = new JPanel(bl);\r
 -      scriptWindow.setVisible(false);\r
 -    }\r
 -    ;\r
 -    jmb.allocateViewer(renderPanel, true, "", null, null, "", scriptWindow,\r
 -            null);\r
 -    jmb.newJmolPopup(true, "Jmol", true);\r
 -    if (command == null)\r
 -    {\r
 -      command = "";\r
 -    }\r
 -    jmb.evalStateCommand(command);\r
 -    jmb.setFinishedInit(true);\r
 -  }\r
 -\r
 -  void setChainMenuItems(Vector chains)\r
 -  {\r
 -    chainMenu.removeAll();\r
 -    if (chains == null)\r
 -    {\r
 -      return;\r
 -    }\r
 +              }
 +            });
 +    handler.itemStateChanged(null);
 +    jmolActionMenu.add(alpanels);
 +    jmolActionMenu.addMenuListener(new MenuListener()
 +    {
 +
 +      @Override
 +      public void menuSelected(MenuEvent e)
 +      {
 +        handler.itemStateChanged(null);
 +      }
 +
 +      @Override
 +      public void menuDeselected(MenuEvent e)
 +      {
 +        // TODO Auto-generated method stub
 +
 +      }
 +
 +      @Override
 +      public void menuCanceled(MenuEvent e)
 +      {
 +        // TODO Auto-generated method stub
 +
 +      }
 +    });
 +  }
 +
 +  IProgressIndicator progressBar = null;
 +
 +  /**
 +   * add a single PDB structure to a new or existing Jmol view
 +   * 
 +   * @param pdbentry
 +   * @param seq
 +   * @param chains
 +   * @param ap
 +   */
 +  public AppJmol(PDBEntry pdbentry, SequenceI[] seq, String[] chains,
 +          final AlignmentPanel ap)
 +  {
 +    progressBar = ap.alignFrame;
 +    // ////////////////////////////////
 +    // Is the pdb file already loaded?
 +    String alreadyMapped = ap.getStructureSelectionManager()
 +            .alreadyMappedToFile(pdbentry.getId());
 +
 +    if (alreadyMapped != null)
 +    {
 +      int option = JOptionPane.showInternalConfirmDialog(Desktop.desktop,
 +                MessageManager.formatMessage("label.pdb_entry_is_already_displayed",  new String[]{pdbentry.getId()}),
 +              MessageManager.formatMessage("label.map_sequences_to_visible_window", new String[]{pdbentry.getId()}),
 +              JOptionPane.YES_NO_OPTION);
 +
 +      if (option == JOptionPane.YES_OPTION)
 +      {
 +        // TODO : Fix multiple seq to one chain issue here.
 +        ap.getStructureSelectionManager().setMapping(seq, chains,
 +                alreadyMapped, AppletFormatAdapter.FILE);
 +        if (ap.seqPanel.seqCanvas.fr != null)
 +        {
 +          ap.seqPanel.seqCanvas.fr.featuresAdded();
 +          ap.paintAlignment(true);
 +        }
 +
 +        // Now this AppJmol is mapped to new sequences. We must add them to
 +        // the exisiting array
 +        JInternalFrame[] frames = Desktop.instance.getAllFrames();
 +
 +        for (int i = 0; i < frames.length; i++)
 +        {
 +          if (frames[i] instanceof AppJmol)
 +          {
 +            final AppJmol topJmol = ((AppJmol) frames[i]);
 +            // JBPNOTE: this looks like a binding routine, rather than a gui
 +            // routine
 +            for (int pe = 0; pe < topJmol.jmb.pdbentry.length; pe++)
 +            {
 +              if (topJmol.jmb.pdbentry[pe].getFile().equals(alreadyMapped))
 +              {
 +                topJmol.jmb.addSequence(pe, seq);
 +                topJmol.addAlignmentPanel(ap);
 +                // add it to the set used for colouring
 +                topJmol.useAlignmentPanelForColourbyseq(ap);
 +                topJmol.buildJmolActionMenu();
 +                ap.getStructureSelectionManager()
 +                        .sequenceColoursChanged(ap);
 +                break;
 +              }
 +            }
 +          }
 +        }
 +
 +        return;
 +      }
 +    }
 +    // /////////////////////////////////
 +    // Check if there are other Jmol views involving this alignment
 +    // and prompt user about adding this molecule to one of them
 +    Vector existingViews = getJmolsFor(ap);
 +    if (existingViews.size() > 0)
 +    {
 +      Enumeration jm = existingViews.elements();
 +      while (jm.hasMoreElements())
 +      {
 +        AppJmol topJmol = (AppJmol) jm.nextElement();
 +        // TODO: highlight topJmol in view somehow
 +        int option = JOptionPane.showInternalConfirmDialog(Desktop.desktop,
 +                      MessageManager.formatMessage("label.add_pdbentry_to_view", new String[]{pdbentry.getId(),topJmol.getTitle()}),
 +                      MessageManager.getString("label.align_to_existing_structure_view"),
 +                JOptionPane.YES_NO_OPTION);
 +        if (option == JOptionPane.YES_OPTION)
 +        {
 +          topJmol.useAlignmentPanelForSuperposition(ap);
 +          topJmol.addStructure(pdbentry, seq, chains, true, ap.alignFrame);
 +          return;
 +        }
 +      }
 +    }
 +    // /////////////////////////////////
 +    openNewJmol(ap, new PDBEntry[]
 +    { pdbentry }, new SequenceI[][]
 +    { seq });
 +  }
 +
 +  private void openNewJmol(AlignmentPanel ap, PDBEntry[] pdbentrys,
 +          SequenceI[][] seqs)
 +  {
 +    progressBar = ap.alignFrame;
 +    jmb = new AppJmolBinding(this, ap.getStructureSelectionManager(),
 +            pdbentrys, seqs, null, null);
 +    addAlignmentPanel(ap);
 +    useAlignmentPanelForColourbyseq(ap);
 +    if (pdbentrys.length > 1)
 +    {
 +      alignAddedStructures = true;
 +      useAlignmentPanelForSuperposition(ap);
 +    }
 +    jmb.setColourBySequence(true);
 +    setSize(400, 400); // probably should be a configurable/dynamic default here
 +    initMenus();
 +    worker = null;
 +    {
 +      addingStructures = false;
 +      worker = new Thread(this);
 +      worker.start();
 +    }
 +    this.addInternalFrameListener(new InternalFrameAdapter()
 +    {
 +      public void internalFrameClosing(InternalFrameEvent internalFrameEvent)
 +      {
 +        closeViewer();
 +      }
 +    });
 +
 +  }
 +
 +  /**
 +   * create a new Jmol containing several structures superimposed using the
 +   * given alignPanel.
 +   * 
 +   * @param ap
 +   * @param pe
 +   * @param seqs
 +   */
 +  public AppJmol(AlignmentPanel ap, PDBEntry[] pe, SequenceI[][] seqs)
 +  {
 +    openNewJmol(ap, pe, seqs);
 +  }
 +
 +  /**
 +   * list of sequenceSet ids associated with the view
 +   */
 +  ArrayList<String> _aps = new ArrayList();
 +
 +  public AlignmentPanel[] getAllAlignmentPanels()
 +  {
 +    AlignmentPanel[] t, list = new AlignmentPanel[0];
 +    for (String setid : _aps)
 +    {
 +      AlignmentPanel[] panels = PaintRefresher.getAssociatedPanels(setid);
 +      if (panels != null)
 +      {
 +        t = new AlignmentPanel[list.length + panels.length];
 +        System.arraycopy(list, 0, t, 0, list.length);
 +        System.arraycopy(panels, 0, t, list.length, panels.length);
 +        list = t;
 +      }
 +    }
 +
 +    return list;
 +  }
 +
 +  /**
 +   * list of alignment panels to use for superposition
 +   */
 +  Vector<AlignmentPanel> _alignwith = new Vector<AlignmentPanel>();
 +
 +  /**
 +   * list of alignment panels that are used for colouring structures by aligned
 +   * sequences
 +   */
 +  Vector<AlignmentPanel> _colourwith = new Vector<AlignmentPanel>();
 +
 +  /**
 +   * set the primary alignmentPanel reference and add another alignPanel to the
 +   * list of ones to use for colouring and aligning
 +   * 
 +   * @param nap
 +   */
 +  public void addAlignmentPanel(AlignmentPanel nap)
 +  {
 +    if (ap == null)
 +    {
 +      ap = nap;
 +    }
 +    if (!_aps.contains(nap.av.getSequenceSetId()))
 +    {
 +      _aps.add(nap.av.getSequenceSetId());
 +    }
 +  }
 +
 +  /**
 +   * remove any references held to the given alignment panel
 +   * 
 +   * @param nap
 +   */
 +  public void removeAlignmentPanel(AlignmentPanel nap)
 +  {
 +    try
 +    {
 +      _alignwith.remove(nap);
 +      _colourwith.remove(nap);
 +      if (ap == nap)
 +      {
 +        ap = null;
 +        for (AlignmentPanel aps : getAllAlignmentPanels())
 +        {
 +          if (aps != nap)
 +          {
 +            ap = aps;
 +            break;
 +          }
 +        }
 +      }
 +    } catch (Exception ex)
 +    {
 +    }
 +    if (ap != null)
 +    {
 +      buildJmolActionMenu();
 +    }
 +  }
 +
 +  public void useAlignmentPanelForSuperposition(AlignmentPanel nap)
 +  {
 +    addAlignmentPanel(nap);
 +    if (!_alignwith.contains(nap))
 +    {
 +      _alignwith.add(nap);
 +    }
 +  }
 +
 +  public void excludeAlignmentPanelForSuperposition(AlignmentPanel nap)
 +  {
 +    if (_alignwith.contains(nap))
 +    {
 +      _alignwith.remove(nap);
 +    }
 +  }
 +
 +  public void useAlignmentPanelForColourbyseq(AlignmentPanel nap,
 +          boolean enableColourBySeq)
 +  {
 +    useAlignmentPanelForColourbyseq(nap);
 +    jmb.setColourBySequence(enableColourBySeq);
 +    seqColour.setSelected(enableColourBySeq);
 +    jmolColour.setSelected(!enableColourBySeq);
 +  }
 +
 +  public void useAlignmentPanelForColourbyseq(AlignmentPanel nap)
 +  {
 +    addAlignmentPanel(nap);
 +    if (!_colourwith.contains(nap))
 +    {
 +      _colourwith.add(nap);
 +    }
 +  }
 +
 +  public void excludeAlignmentPanelForColourbyseq(AlignmentPanel nap)
 +  {
 +    if (_colourwith.contains(nap))
 +    {
 +      _colourwith.remove(nap);
 +    }
 +  }
 +
 +  /**
 +   * pdb retrieval thread.
 +   */
 +  private Thread worker = null;
 +
 +  /**
 +   * add a new structure (with associated sequences and chains) to this viewer,
 +   * retrieving it if necessary first.
 +   * 
 +   * @param pdbentry
 +   * @param seq
 +   * @param chains
 +   * @param alignFrame
 +   * @param align
 +   *          if true, new structure(s) will be align using associated alignment
 +   */
 +  private void addStructure(final PDBEntry pdbentry, final SequenceI[] seq,
 +          final String[] chains, final boolean b,
 +          final IProgressIndicator alignFrame)
 +  {
 +    if (pdbentry.getFile() == null)
 +    {
 +      if (worker != null && worker.isAlive())
 +      {
 +        // a retrieval is in progress, wait around and add ourselves to the
 +        // queue.
 +        new Thread(new Runnable()
 +        {
 +          public void run()
 +          {
 +            while (worker != null && worker.isAlive() && _started)
 +            {
 +              try
 +              {
 +                Thread.sleep(100 + ((int) Math.random() * 100));
 +
 +              } catch (Exception e)
 +              {
 +              }
 +
 +            }
 +            // and call ourselves again.
 +            addStructure(pdbentry, seq, chains, b, alignFrame);
 +          }
 +        }).start();
 +        return;
 +      }
 +    }
 +    // otherwise, start adding the structure.
 +    jmb.addSequenceAndChain(new PDBEntry[]
 +    { pdbentry }, new SequenceI[][]
 +    { seq }, new String[][]
 +    { chains });
 +    addingStructures = true;
 +    _started = false;
 +    alignAddedStructures = b;
 +    progressBar = alignFrame; // visual indication happens on caller frame.
 +    (worker = new Thread(this)).start();
 +    return;
 +  }
 +
 +  private Vector getJmolsFor(AlignmentPanel ap2)
 +  {
 +    Vector otherJmols = new Vector();
 +    // Now this AppJmol is mapped to new sequences. We must add them to
 +    // the exisiting array
 +    JInternalFrame[] frames = Desktop.instance.getAllFrames();
 +
 +    for (int i = 0; i < frames.length; i++)
 +    {
 +      if (frames[i] instanceof AppJmol)
 +      {
 +        AppJmol topJmol = ((AppJmol) frames[i]);
 +        if (topJmol.isLinkedWith(ap2))
 +        {
 +          otherJmols.addElement(topJmol);
 +        }
 +      }
 +    }
 +    return otherJmols;
 +  }
 +
 +  void initJmol(String command)
 +  {
 +    jmb.setFinishedInit(false);
 +    renderPanel = new RenderPanel();
 +    // TODO: consider waiting until the structure/view is fully loaded before
 +    // displaying
 +    this.getContentPane().add(renderPanel, java.awt.BorderLayout.CENTER);
 +    jalview.gui.Desktop.addInternalFrame(this, jmb.getViewerTitle(),
 +            getBounds().width, getBounds().height);
 +    if (scriptWindow == null)
 +    {
 +      BorderLayout bl = new BorderLayout();
 +      bl.setHgap(0);
 +      bl.setVgap(0);
 +      scriptWindow = new JPanel(bl);
 +      scriptWindow.setVisible(false);
 +    }
 +    ;
 +    jmb.allocateViewer(renderPanel, true, "", null, null, "", scriptWindow,
 +            null);
 +    jmb.newJmolPopup(true, "Jmol", true);
 +    if (command == null)
 +    {
 +      command = "";
 +    }
 +    jmb.evalStateCommand(command);
 +    jmb.setFinishedInit(true);
 +  }
 +
 +  void setChainMenuItems(Vector chains)
 +  {
 +    chainMenu.removeAll();
 +    if (chains == null)
 +    {
 +      return;
 +    }
-     JMenuItem menuItem = new JMenuItem("All");
+     JMenuItem menuItem = new JMenuItem(MessageManager.getString("label.all"));\r
 -    menuItem.addActionListener(new ActionListener()\r
 -    {\r
 -      public void actionPerformed(ActionEvent evt)\r
 -      {\r
 -        allChainsSelected = true;\r
 -        for (int i = 0; i < chainMenu.getItemCount(); i++)\r
 -        {\r
 -          if (chainMenu.getItem(i) instanceof JCheckBoxMenuItem)\r
 -            ((JCheckBoxMenuItem) chainMenu.getItem(i)).setSelected(true);\r
 -        }\r
 -        centerViewer();\r
 -        allChainsSelected = false;\r
 -      }\r
 -    });\r
 -\r
 -    chainMenu.add(menuItem);\r
 -\r
 -    for (int c = 0; c < chains.size(); c++)\r
 -    {\r
 -      menuItem = new JCheckBoxMenuItem(chains.elementAt(c).toString(), true);\r
 -      menuItem.addItemListener(new ItemListener()\r
 -      {\r
 -        public void itemStateChanged(ItemEvent evt)\r
 -        {\r
 -          if (!allChainsSelected)\r
 -            centerViewer();\r
 -        }\r
 -      });\r
 -\r
 -      chainMenu.add(menuItem);\r
 -    }\r
 -  }\r
 -\r
 -  boolean allChainsSelected = false;\r
 -\r
 -  private boolean alignAddedStructures = false;\r
 -\r
 -  void centerViewer()\r
 -  {\r
 -    Vector toshow = new Vector();\r
 -    String lbl;\r
 -    int mlength, p, mnum;\r
 -    for (int i = 0; i < chainMenu.getItemCount(); i++)\r
 -    {\r
 -      if (chainMenu.getItem(i) instanceof JCheckBoxMenuItem)\r
 -      {\r
 -        JCheckBoxMenuItem item = (JCheckBoxMenuItem) chainMenu.getItem(i);\r
 -        if (item.isSelected())\r
 -        {\r
 -          toshow.addElement(item.getText());\r
 -        }\r
 -      }\r
 -    }\r
 -    jmb.centerViewer(toshow);\r
 -  }\r
 -\r
 -  void closeViewer()\r
 -  {\r
 -    jmb.closeViewer();\r
 -    ap = null;\r
 -    _aps.clear();\r
 -    _alignwith.clear();\r
 -    _colourwith.clear();\r
 -    // TODO: check for memory leaks where instance isn't finalised because jmb\r
 -    // holds a reference to the window\r
 -    jmb = null;\r
 -  }\r
 -\r
 -  /**\r
 -   * state flag for PDB retrieval thread\r
 -   */\r
 -  private boolean _started = false;\r
 -\r
 -  public void run()\r
 -  {\r
 -    _started = true;\r
 -    String pdbid = "";\r
 -    // todo - record which pdbids were successfuly imported.\r
 -    StringBuffer errormsgs = new StringBuffer(), files = new StringBuffer();\r
 -    try\r
 -    {\r
 -      String[] curfiles = jmb.getPdbFile(); // files currently in viewer\r
 -      // TODO: replace with reference fetching/transfer code (validate PDBentry\r
 -      // as a DBRef?)\r
 -      jalview.ws.dbsources.Pdb pdbclient = new jalview.ws.dbsources.Pdb();\r
 -      for (int pi = 0; pi < jmb.pdbentry.length; pi++)\r
 -      {\r
 -        String file = jmb.pdbentry[pi].getFile();\r
 -        if (file == null)\r
 -        {\r
 -          // retrieve the pdb and store it locally\r
 -          AlignmentI pdbseq = null;\r
 -          pdbid = jmb.pdbentry[pi].getId();\r
 -          long hdl = pdbid.hashCode() - System.currentTimeMillis();\r
 -          if (progressBar != null)\r
 -          {\r
 -            progressBar.setProgressBar("Fetching PDB " + pdbid, hdl);\r
 -          }\r
 -          try\r
 -          {\r
 -            pdbseq = pdbclient.getSequenceRecords(pdbid = jmb.pdbentry[pi]\r
 -                    .getId());\r
 -          } catch (OutOfMemoryError oomerror)\r
 -          {\r
 -            new OOMWarning("Retrieving PDB id " + pdbid, oomerror);\r
 -          } catch (Exception ex)\r
 -          {\r
 -            ex.printStackTrace();\r
 -            errormsgs.append("'" + pdbid + "'");\r
 -          }\r
 -          if (progressBar != null)\r
 -          {\r
 -            progressBar.setProgressBar("Finished.", hdl);\r
 -          }\r
 -          if (pdbseq != null)\r
 -          {\r
 -            // just transfer the file name from the first sequence's first\r
 -            // PDBEntry\r
 -            file = new File(((PDBEntry) pdbseq.getSequenceAt(0).getPDBId()\r
 -                    .elementAt(0)).getFile()).getAbsolutePath();\r
 -            jmb.pdbentry[pi].setFile(file);\r
 -\r
 -            files.append(" \"" + Platform.escapeString(file) + "\"");\r
 -          }\r
 -          else\r
 -          {\r
 -            errormsgs.append("'" + pdbid + "' ");\r
 -          }\r
 -        }\r
 -        else\r
 -        {\r
 -          if (curfiles != null && curfiles.length > 0)\r
 -          {\r
 -            addingStructures = true; // already files loaded.\r
 -            for (int c = 0; c < curfiles.length; c++)\r
 -            {\r
 -              if (curfiles[c].equals(file))\r
 -              {\r
 -                file = null;\r
 -                break;\r
 -              }\r
 -            }\r
 -          }\r
 -          if (file != null)\r
 -          {\r
 -            files.append(" \"" + Platform.escapeString(file) + "\"");\r
 -          }\r
 -        }\r
 -      }\r
 -    } catch (OutOfMemoryError oomerror)\r
 -    {\r
 -      new OOMWarning("Retrieving PDB files: " + pdbid, oomerror);\r
 -    } catch (Exception ex)\r
 -    {\r
 -      ex.printStackTrace();\r
 -      errormsgs.append("When retrieving pdbfiles : current was: '" + pdbid\r
 -              + "'");\r
 -    }\r
 -    if (errormsgs.length() > 0)\r
 -    {\r
 -\r
 -      JOptionPane.showInternalMessageDialog(Desktop.desktop,\r
 -                MessageManager.formatMessage("label.pdb_entries_couldnt_be_retrieved", new String[]{errormsgs.toString()}),\r
 -              MessageManager.getString("label.couldnt_load_file"), JOptionPane.ERROR_MESSAGE);\r
 -\r
 -    }\r
 -    long lastnotify = jmb.getLoadNotifiesHandled();\r
 -    if (files.length() > 0)\r
 -    {\r
 -      if (!addingStructures)\r
 -      {\r
 -\r
 -        try\r
 -        {\r
 -          initJmol("load FILES " + files.toString());\r
 -        } catch (OutOfMemoryError oomerror)\r
 -        {\r
 -          new OOMWarning("When trying to open the Jmol viewer!", oomerror);\r
 -          Cache.log.debug("File locations are " + files);\r
 -        } catch (Exception ex)\r
 -        {\r
 -          Cache.log.error("Couldn't open Jmol viewer!", ex);\r
 -        }\r
 -      }\r
 -      else\r
 -      {\r
 -        StringBuffer cmd = new StringBuffer();\r
 -        cmd.append("loadingJalviewdata=true\nload APPEND ");\r
 -        cmd.append(files.toString());\r
 -        cmd.append("\nloadingJalviewdata=null");\r
 -        final String command = cmd.toString();\r
 -        cmd = null;\r
 -        lastnotify = jmb.getLoadNotifiesHandled();\r
 -\r
 -        try\r
 -        {\r
 -          jmb.evalStateCommand(command);\r
 -        } catch (OutOfMemoryError oomerror)\r
 -        {\r
 -          new OOMWarning(\r
 -                  "When trying to add structures to the Jmol viewer!",\r
 -                  oomerror);\r
 -          Cache.log.debug("File locations are " + files);\r
 -        } catch (Exception ex)\r
 -        {\r
 -          Cache.log.error("Couldn't add files to Jmol viewer!", ex);\r
 -        }\r
 -      }\r
 -\r
 -      // need to wait around until script has finished\r
 -      while (addingStructures ? lastnotify >= jmb.getLoadNotifiesHandled()\r
 -              : (jmb.isFinishedInit() && jmb.getPdbFile().length != jmb.pdbentry.length))\r
 -      {\r
 -        try\r
 -        {\r
 -          Cache.log.debug("Waiting around for jmb notify.");\r
 -          Thread.sleep(35);\r
 -        } catch (Exception e)\r
 -        {\r
 -        }\r
 -      }\r
 -      // refresh the sequence colours for the new structure(s)\r
 -      for (AlignmentPanel ap : _colourwith)\r
 -      {\r
 -        jmb.updateColours(ap);\r
 -      }\r
 -      // do superposition if asked to\r
 -      if (alignAddedStructures)\r
 -      {\r
 -        javax.swing.SwingUtilities.invokeLater(new Runnable()\r
 -        {\r
 -          public void run()\r
 -          {\r
 -            alignStructs_withAllAlignPanels();\r
 -            // jmb.superposeStructures(ap.av.getAlignment(), -1, null);\r
 -          }\r
 -        });\r
 -        alignAddedStructures = false;\r
 -      }\r
 -      addingStructures = false;\r
 -\r
 -    }\r
 -    _started = false;\r
 -    worker = null;\r
 -  }\r
 -\r
 -  public void pdbFile_actionPerformed(ActionEvent actionEvent)\r
 -  {\r
 -    JalviewFileChooser chooser = new JalviewFileChooser(\r
 -            jalview.bin.Cache.getProperty("LAST_DIRECTORY"));\r
 -\r
 -    chooser.setFileView(new JalviewFileView());\r
 -    chooser.setDialogTitle("Save PDB File");\r
 +    menuItem.addActionListener(new ActionListener()
 +    {
 +      public void actionPerformed(ActionEvent evt)
 +      {
 +        allChainsSelected = true;
 +        for (int i = 0; i < chainMenu.getItemCount(); i++)
 +        {
 +          if (chainMenu.getItem(i) instanceof JCheckBoxMenuItem)
 +            ((JCheckBoxMenuItem) chainMenu.getItem(i)).setSelected(true);
 +        }
 +        centerViewer();
 +        allChainsSelected = false;
 +      }
 +    });
 +
 +    chainMenu.add(menuItem);
 +
 +    for (int c = 0; c < chains.size(); c++)
 +    {
 +      menuItem = new JCheckBoxMenuItem(chains.elementAt(c).toString(), true);
 +      menuItem.addItemListener(new ItemListener()
 +      {
 +        public void itemStateChanged(ItemEvent evt)
 +        {
 +          if (!allChainsSelected)
 +            centerViewer();
 +        }
 +      });
 +
 +      chainMenu.add(menuItem);
 +    }
 +  }
 +
 +  boolean allChainsSelected = false;
 +
 +  private boolean alignAddedStructures = false;
 +
 +  void centerViewer()
 +  {
 +    Vector toshow = new Vector();
 +    String lbl;
 +    int mlength, p, mnum;
 +    for (int i = 0; i < chainMenu.getItemCount(); i++)
 +    {
 +      if (chainMenu.getItem(i) instanceof JCheckBoxMenuItem)
 +      {
 +        JCheckBoxMenuItem item = (JCheckBoxMenuItem) chainMenu.getItem(i);
 +        if (item.isSelected())
 +        {
 +          toshow.addElement(item.getText());
 +        }
 +      }
 +    }
 +    jmb.centerViewer(toshow);
 +  }
 +
 +  void closeViewer()
 +  {
 +    jmb.closeViewer();
 +    ap = null;
 +    _aps.clear();
 +    _alignwith.clear();
 +    _colourwith.clear();
 +    // TODO: check for memory leaks where instance isn't finalised because jmb
 +    // holds a reference to the window
 +    jmb = null;
 +  }
 +
 +  /**
 +   * state flag for PDB retrieval thread
 +   */
 +  private boolean _started = false;
 +
 +  public void run()
 +  {
 +    _started = true;
 +    String pdbid = "";
 +    // todo - record which pdbids were successfuly imported.
 +    StringBuffer errormsgs = new StringBuffer(), files = new StringBuffer();
 +    try
 +    {
 +      String[] curfiles = jmb.getPdbFile(); // files currently in viewer
 +      // TODO: replace with reference fetching/transfer code (validate PDBentry
 +      // as a DBRef?)
 +      jalview.ws.dbsources.Pdb pdbclient = new jalview.ws.dbsources.Pdb();
 +      for (int pi = 0; pi < jmb.pdbentry.length; pi++)
 +      {
 +        String file = jmb.pdbentry[pi].getFile();
 +        if (file == null)
 +        {
 +          // retrieve the pdb and store it locally
 +          AlignmentI pdbseq = null;
 +          pdbid = jmb.pdbentry[pi].getId();
 +          long hdl = pdbid.hashCode() - System.currentTimeMillis();
 +          if (progressBar != null)
 +          {
 +            progressBar.setProgressBar("Fetching PDB " + pdbid, hdl);
 +          }
 +          try
 +          {
 +            pdbseq = pdbclient.getSequenceRecords(pdbid = jmb.pdbentry[pi]
 +                    .getId());
 +          } catch (OutOfMemoryError oomerror)
 +          {
 +            new OOMWarning("Retrieving PDB id " + pdbid, oomerror);
 +          } catch (Exception ex)
 +          {
 +            ex.printStackTrace();
 +            errormsgs.append("'" + pdbid + "'");
 +          }
 +          if (progressBar != null)
 +          {
 +            progressBar.setProgressBar("Finished.", hdl);
 +          }
 +          if (pdbseq != null)
 +          {
 +            // just transfer the file name from the first sequence's first
 +            // PDBEntry
 +            file = new File(((PDBEntry) pdbseq.getSequenceAt(0).getPDBId()
 +                    .elementAt(0)).getFile()).getAbsolutePath();
 +            jmb.pdbentry[pi].setFile(file);
 +
 +            files.append(" \"" + Platform.escapeString(file) + "\"");
 +          }
 +          else
 +          {
 +            errormsgs.append("'" + pdbid + "' ");
 +          }
 +        }
 +        else
 +        {
 +          if (curfiles != null && curfiles.length > 0)
 +          {
 +            addingStructures = true; // already files loaded.
 +            for (int c = 0; c < curfiles.length; c++)
 +            {
 +              if (curfiles[c].equals(file))
 +              {
 +                file = null;
 +                break;
 +              }
 +            }
 +          }
 +          if (file != null)
 +          {
 +            files.append(" \"" + Platform.escapeString(file) + "\"");
 +          }
 +        }
 +      }
 +    } catch (OutOfMemoryError oomerror)
 +    {
 +      new OOMWarning("Retrieving PDB files: " + pdbid, oomerror);
 +    } catch (Exception ex)
 +    {
 +      ex.printStackTrace();
 +      errormsgs.append("When retrieving pdbfiles : current was: '" + pdbid
 +              + "'");
 +    }
 +    if (errormsgs.length() > 0)
 +    {
 +
 +      JOptionPane.showInternalMessageDialog(Desktop.desktop,
 +                MessageManager.formatMessage("label.pdb_entries_couldnt_be_retrieved", new String[]{errormsgs.toString()}),
 +              MessageManager.getString("label.couldnt_load_file"), JOptionPane.ERROR_MESSAGE);
 +
 +    }
 +    long lastnotify = jmb.getLoadNotifiesHandled();
 +    if (files.length() > 0)
 +    {
 +      if (!addingStructures)
 +      {
 +
 +        try
 +        {
 +          initJmol("load FILES " + files.toString());
 +        } catch (OutOfMemoryError oomerror)
 +        {
 +          new OOMWarning("When trying to open the Jmol viewer!", oomerror);
 +          Cache.log.debug("File locations are " + files);
 +        } catch (Exception ex)
 +        {
 +          Cache.log.error("Couldn't open Jmol viewer!", ex);
 +        }
 +      }
 +      else
 +      {
 +        StringBuffer cmd = new StringBuffer();
 +        cmd.append("loadingJalviewdata=true\nload APPEND ");
 +        cmd.append(files.toString());
 +        cmd.append("\nloadingJalviewdata=null");
 +        final String command = cmd.toString();
 +        cmd = null;
 +        lastnotify = jmb.getLoadNotifiesHandled();
 +
 +        try
 +        {
 +          jmb.evalStateCommand(command);
 +        } catch (OutOfMemoryError oomerror)
 +        {
 +          new OOMWarning(
 +                  "When trying to add structures to the Jmol viewer!",
 +                  oomerror);
 +          Cache.log.debug("File locations are " + files);
 +        } catch (Exception ex)
 +        {
 +          Cache.log.error("Couldn't add files to Jmol viewer!", ex);
 +        }
 +      }
 +
 +      // need to wait around until script has finished
 +      while (addingStructures ? lastnotify >= jmb.getLoadNotifiesHandled()
 +              : (jmb.isFinishedInit() && jmb.getPdbFile().length != jmb.pdbentry.length))
 +      {
 +        try
 +        {
 +          Cache.log.debug("Waiting around for jmb notify.");
 +          Thread.sleep(35);
 +        } catch (Exception e)
 +        {
 +        }
 +      }
 +      // refresh the sequence colours for the new structure(s)
 +      for (AlignmentPanel ap : _colourwith)
 +      {
 +        jmb.updateColours(ap);
 +      }
 +      // do superposition if asked to
 +      if (alignAddedStructures)
 +      {
 +        javax.swing.SwingUtilities.invokeLater(new Runnable()
 +        {
 +          public void run()
 +          {
 +            alignStructs_withAllAlignPanels();
 +            // jmb.superposeStructures(ap.av.getAlignment(), -1, null);
 +          }
 +        });
 +        alignAddedStructures = false;
 +      }
 +      addingStructures = false;
 +
 +    }
 +    _started = false;
 +    worker = null;
 +  }
 +
 +  public void pdbFile_actionPerformed(ActionEvent actionEvent)
 +  {
 +    JalviewFileChooser chooser = new JalviewFileChooser(
 +            jalview.bin.Cache.getProperty("LAST_DIRECTORY"));
 +
 +    chooser.setFileView(new JalviewFileView());
 +    chooser.setDialogTitle("Save PDB File");
-     chooser.setToolTipText("Save");
+     chooser.setToolTipText(MessageManager.getString("action.save"));\r
 -\r
 -    int value = chooser.showSaveDialog(this);\r
 -\r
 -    if (value == JalviewFileChooser.APPROVE_OPTION)\r
 -    {\r
 -      try\r
 -      {\r
 -        // TODO: cope with multiple PDB files in view\r
 -        BufferedReader in = new BufferedReader(new FileReader(\r
 -                jmb.getPdbFile()[0]));\r
 -        File outFile = chooser.getSelectedFile();\r
 -\r
 -        PrintWriter out = new PrintWriter(new FileOutputStream(outFile));\r
 -        String data;\r
 -        while ((data = in.readLine()) != null)\r
 -        {\r
 -          if (!(data.indexOf("<PRE>") > -1 || data.indexOf("</PRE>") > -1))\r
 -          {\r
 -            out.println(data);\r
 -          }\r
 -        }\r
 -        out.close();\r
 -      } catch (Exception ex)\r
 -      {\r
 -        ex.printStackTrace();\r
 -      }\r
 -    }\r
 -  }\r
 -\r
 -  public void viewMapping_actionPerformed(ActionEvent actionEvent)\r
 -  {\r
 -    jalview.gui.CutAndPasteTransfer cap = new jalview.gui.CutAndPasteTransfer();\r
 -    try\r
 -    {\r
 -      for (int pdbe = 0; pdbe < jmb.pdbentry.length; pdbe++)\r
 -      {\r
 -        cap.appendText(jmb.printMapping(jmb.pdbentry[pdbe].getFile()));\r
 -        cap.appendText("\n");\r
 -      }\r
 -    } catch (OutOfMemoryError e)\r
 -    {\r
 -      new OOMWarning(\r
 -              "composing sequence-structure alignments for display in text box.",\r
 -              e);\r
 -      cap.dispose();\r
 -      return;\r
 -    }\r
 +
 +    int value = chooser.showSaveDialog(this);
 +
 +    if (value == JalviewFileChooser.APPROVE_OPTION)
 +    {
 +      try
 +      {
 +        // TODO: cope with multiple PDB files in view
 +        BufferedReader in = new BufferedReader(new FileReader(
 +                jmb.getPdbFile()[0]));
 +        File outFile = chooser.getSelectedFile();
 +
 +        PrintWriter out = new PrintWriter(new FileOutputStream(outFile));
 +        String data;
 +        while ((data = in.readLine()) != null)
 +        {
 +          if (!(data.indexOf("<PRE>") > -1 || data.indexOf("</PRE>") > -1))
 +          {
 +            out.println(data);
 +          }
 +        }
 +        out.close();
 +      } catch (Exception ex)
 +      {
 +        ex.printStackTrace();
 +      }
 +    }
 +  }
 +
 +  public void viewMapping_actionPerformed(ActionEvent actionEvent)
 +  {
 +    jalview.gui.CutAndPasteTransfer cap = new jalview.gui.CutAndPasteTransfer();
 +    try
 +    {
 +      for (int pdbe = 0; pdbe < jmb.pdbentry.length; pdbe++)
 +      {
 +        cap.appendText(jmb.printMapping(jmb.pdbentry[pdbe].getFile()));
 +        cap.appendText("\n");
 +      }
 +    } catch (OutOfMemoryError e)
 +    {
 +      new OOMWarning(
 +              "composing sequence-structure alignments for display in text box.",
 +              e);
 +      cap.dispose();
 +      return;
 +    }
-     jalview.gui.Desktop.addInternalFrame(cap, "PDB - Sequence Mapping",
+     jalview.gui.Desktop.addInternalFrame(cap, MessageManager.getString("label.pdb_sequence_mapping"),\r
 -            550, 600);\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  public void eps_actionPerformed(ActionEvent e)\r
 -  {\r
 -    makePDBImage(jalview.util.ImageMaker.EPS);\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  public void png_actionPerformed(ActionEvent e)\r
 -  {\r
 -    makePDBImage(jalview.util.ImageMaker.PNG);\r
 -  }\r
 -\r
 -  void makePDBImage(int type)\r
 -  {\r
 -    int width = getWidth();\r
 -    int height = getHeight();\r
 -\r
 -    jalview.util.ImageMaker im;\r
 -\r
 -    if (type == jalview.util.ImageMaker.PNG)\r
 -    {\r
 -      im = new jalview.util.ImageMaker(this, jalview.util.ImageMaker.PNG,\r
 -              "Make PNG image from view", width, height, null, null);\r
 -    }\r
 -    else\r
 -    {\r
 -      im = new jalview.util.ImageMaker(this, jalview.util.ImageMaker.EPS,\r
 -              "Make EPS file from view", width, height, null,\r
 -              this.getTitle());\r
 -    }\r
 -\r
 -    if (im.getGraphics() != null)\r
 -    {\r
 -      Rectangle rect = new Rectangle(width, height);\r
 -      jmb.viewer.renderScreenImage(im.getGraphics(), rect.getSize(), rect);\r
 -      im.writeImage();\r
 -    }\r
 -  }\r
 -\r
 -  public void jmolColour_actionPerformed(ActionEvent actionEvent)\r
 -  {\r
 -    if (jmolColour.isSelected())\r
 -    {\r
 -      // disable automatic sequence colouring.\r
 -      jmb.setColourBySequence(false);\r
 -    }\r
 -  }\r
 -\r
 -  public void seqColour_actionPerformed(ActionEvent actionEvent)\r
 -  {\r
 -    jmb.setColourBySequence(seqColour.isSelected());\r
 -    if (_colourwith == null)\r
 -    {\r
 -      _colourwith = new Vector<AlignmentPanel>();\r
 -    }\r
 -    if (jmb.isColourBySequence())\r
 -    {\r
 -      if (!jmb.isLoadingFromArchive())\r
 -      {\r
 -        if (_colourwith.size() == 0 && ap != null)\r
 -        {\r
 -          // Make the currently displayed alignment panel the associated view\r
 -          _colourwith.add(ap.alignFrame.alignPanel);\r
 -        }\r
 -      }\r
 -      // Set the colour using the current view for the associated alignframe\r
 -      for (AlignmentPanel ap : _colourwith)\r
 -      {\r
 -        jmb.colourBySequence(ap.av.showSequenceFeatures, ap);\r
 -      }\r
 -    }\r
 -  }\r
 -\r
 -  public void chainColour_actionPerformed(ActionEvent actionEvent)\r
 -  {\r
 -    chainColour.setSelected(true);\r
 -    jmb.colourByChain();\r
 -  }\r
 -\r
 -  public void chargeColour_actionPerformed(ActionEvent actionEvent)\r
 -  {\r
 -    chargeColour.setSelected(true);\r
 -    jmb.colourByCharge();\r
 -  }\r
 -\r
 -  public void zappoColour_actionPerformed(ActionEvent actionEvent)\r
 -  {\r
 -    zappoColour.setSelected(true);\r
 -    jmb.setJalviewColourScheme(new ZappoColourScheme());\r
 -  }\r
 -\r
 -  public void taylorColour_actionPerformed(ActionEvent actionEvent)\r
 -  {\r
 -    taylorColour.setSelected(true);\r
 -    jmb.setJalviewColourScheme(new TaylorColourScheme());\r
 -  }\r
 -\r
 -  public void hydroColour_actionPerformed(ActionEvent actionEvent)\r
 -  {\r
 -    hydroColour.setSelected(true);\r
 -    jmb.setJalviewColourScheme(new HydrophobicColourScheme());\r
 -  }\r
 -\r
 -  public void helixColour_actionPerformed(ActionEvent actionEvent)\r
 -  {\r
 -    helixColour.setSelected(true);\r
 -    jmb.setJalviewColourScheme(new HelixColourScheme());\r
 -  }\r
 -\r
 -  public void strandColour_actionPerformed(ActionEvent actionEvent)\r
 -  {\r
 -    strandColour.setSelected(true);\r
 -    jmb.setJalviewColourScheme(new StrandColourScheme());\r
 -  }\r
 -\r
 -  public void turnColour_actionPerformed(ActionEvent actionEvent)\r
 -  {\r
 -    turnColour.setSelected(true);\r
 -    jmb.setJalviewColourScheme(new TurnColourScheme());\r
 -  }\r
 -\r
 -  public void buriedColour_actionPerformed(ActionEvent actionEvent)\r
 -  {\r
 -    buriedColour.setSelected(true);\r
 -    jmb.setJalviewColourScheme(new BuriedColourScheme());\r
 -  }\r
 -\r
 -  public void purinePyrimidineColour_actionPerformed(ActionEvent actionEvent)\r
 -  {\r
 -    setJalviewColourScheme(new PurinePyrimidineColourScheme());\r
 -  }\r
 -\r
 -  public void userColour_actionPerformed(ActionEvent actionEvent)\r
 -  {\r
 -    userColour.setSelected(true);\r
 -    new UserDefinedColours(this, null);\r
 -  }\r
 -\r
 -  public void backGround_actionPerformed(ActionEvent actionEvent)\r
 -  {\r
 -    java.awt.Color col = JColorChooser.showDialog(this,\r
 -            "Select Background Colour", null);\r
 -    if (col != null)\r
 -    {\r
 -      jmb.setBackgroundColour(col);\r
 -    }\r
 -  }\r
 -\r
 -  public void jmolHelp_actionPerformed(ActionEvent actionEvent)\r
 -  {\r
 -    try\r
 -    {\r
 -      jalview.util.BrowserLauncher\r
 -              .openURL("http://jmol.sourceforge.net/docs/JmolUserGuide/");\r
 -    } catch (Exception ex)\r
 -    {\r
 -    }\r
 -  }\r
 -\r
 -  public void showConsole(boolean showConsole)\r
 -  {\r
 -\r
 -    if (showConsole)\r
 -    {\r
 -      if (splitPane == null)\r
 -      {\r
 -        splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);\r
 -        splitPane.setTopComponent(renderPanel);\r
 -        splitPane.setBottomComponent(scriptWindow);\r
 -        this.getContentPane().add(splitPane, BorderLayout.CENTER);\r
 -        splitPane.setDividerLocation(getHeight() - 200);\r
 -        scriptWindow.setVisible(true);\r
 -        scriptWindow.validate();\r
 -        splitPane.validate();\r
 -      }\r
 -\r
 -    }\r
 -    else\r
 -    {\r
 -      if (splitPane != null)\r
 -      {\r
 -        splitPane.setVisible(false);\r
 -      }\r
 -\r
 -      splitPane = null;\r
 -\r
 -      this.getContentPane().add(renderPanel, BorderLayout.CENTER);\r
 -    }\r
 -\r
 -    validate();\r
 -  }\r
 -\r
 -  class RenderPanel extends JPanel\r
 -  {\r
 -    final Dimension currentSize = new Dimension();\r
 -\r
 -    final Rectangle rectClip = new Rectangle();\r
 -\r
 -    public void paintComponent(Graphics g)\r
 -    {\r
 -      getSize(currentSize);\r
 -      g.getClipBounds(rectClip);\r
 -\r
 -      if (jmb.fileLoadingError != null)\r
 -      {\r
 -        g.setColor(Color.black);\r
 -        g.fillRect(0, 0, currentSize.width, currentSize.height);\r
 -        g.setColor(Color.white);\r
 -        g.setFont(new Font("Verdana", Font.BOLD, 14));\r
 -        g.drawString(MessageManager.getString("label.error_loading_file") + "...", 20, currentSize.height / 2);\r
 -        StringBuffer sb = new StringBuffer();\r
 -        int lines = 0;\r
 -        for (int e = 0; e < jmb.pdbentry.length; e++)\r
 -        {\r
 -          sb.append(jmb.pdbentry[e].getId());\r
 -          if (e < jmb.pdbentry.length - 1)\r
 -          {\r
 -            sb.append(",");\r
 -          }\r
 -\r
 -          if (e == jmb.pdbentry.length - 1 || sb.length() > 20)\r
 -          {\r
 -            lines++;\r
 -            g.drawString(sb.toString(), 20, currentSize.height / 2 - lines\r
 -                    * g.getFontMetrics().getHeight());\r
 -          }\r
 -        }\r
 -      }\r
 -      else if (jmb == null || jmb.viewer == null || !jmb.isFinishedInit())\r
 -      {\r
 -        g.setColor(Color.black);\r
 -        g.fillRect(0, 0, currentSize.width, currentSize.height);\r
 -        g.setColor(Color.white);\r
 -        g.setFont(new Font("Verdana", Font.BOLD, 14));\r
 -        g.drawString(MessageManager.getString("label.retrieving_pdb_data"), 20, currentSize.height / 2);\r
 -      }\r
 -      else\r
 -      {\r
 -        jmb.viewer.renderScreenImage(g, currentSize, rectClip);\r
 -      }\r
 -    }\r
 -  }\r
 -\r
 -  String viewId = null;\r
 -\r
 -  public String getViewId()\r
 -  {\r
 -    if (viewId == null)\r
 -    {\r
 -      viewId = System.currentTimeMillis() + "." + this.hashCode();\r
 -    }\r
 -    return viewId;\r
 -  }\r
 -\r
 -  public void updateTitleAndMenus()\r
 -  {\r
 -    if (jmb.fileLoadingError != null && jmb.fileLoadingError.length() > 0)\r
 -    {\r
 -      repaint();\r
 -      return;\r
 -    }\r
 -    setChainMenuItems(jmb.chainNames);\r
 -\r
 -    this.setTitle(jmb.getViewerTitle());\r
 -    if (jmb.getPdbFile().length > 1 && jmb.sequence.length > 1)\r
 -    {\r
 -      jmolActionMenu.setVisible(true);\r
 -    }\r
 -    if (!jmb.isLoadingFromArchive())\r
 -    {\r
 -      seqColour_actionPerformed(null);\r
 -    }\r
 -  }\r
 -\r
 -  protected void buildJmolActionMenu()\r
 -  {\r
 -    if (_alignwith == null)\r
 -    {\r
 -      _alignwith = new Vector<AlignmentPanel>();\r
 -    }\r
 -    if (_alignwith.size() == 0 && ap != null)\r
 -    {\r
 -      _alignwith.add(ap);\r
 -    }\r
 -    ;\r
 -    for (Component c : jmolActionMenu.getMenuComponents())\r
 -    {\r
 -      if (c != alignStructs)\r
 -      {\r
 -        jmolActionMenu.remove((JMenuItem) c);\r
 -      }\r
 -    }\r
 -    final ItemListener handler;\r
 -  }\r
 -\r
 -  /*\r
 -   * (non-Javadoc)\r
 -   * \r
 -   * @see\r
 -   * jalview.jbgui.GStructureViewer#alignStructs_actionPerformed(java.awt.event\r
 -   * .ActionEvent)\r
 -   */\r
 -  @Override\r
 -  protected void alignStructs_actionPerformed(ActionEvent actionEvent)\r
 -  {\r
 -    alignStructs_withAllAlignPanels();\r
 -  }\r
 -\r
 -  private void alignStructs_withAllAlignPanels()\r
 -  {\r
 -    if (ap == null)\r
 -    {\r
 -      return;\r
 -    }\r
 -    ;\r
 -    if (_alignwith.size() == 0)\r
 -    {\r
 -      _alignwith.add(ap);\r
 -    }\r
 -    ;\r
 -    try\r
 -    {\r
 -      AlignmentI[] als = new Alignment[_alignwith.size()];\r
 -      ColumnSelection[] alc = new ColumnSelection[_alignwith.size()];\r
 -      int[] alm = new int[_alignwith.size()];\r
 -      int a = 0;\r
 -\r
 -      for (AlignmentPanel ap : _alignwith)\r
 -      {\r
 -        als[a] = ap.av.getAlignment();\r
 -        alm[a] = -1;\r
 -        alc[a++] = ap.av.getColumnSelection();\r
 -      }\r
 -      jmb.superposeStructures(als, alm, alc);\r
 -    } catch (Exception e)\r
 -    {\r
 -      StringBuffer sp = new StringBuffer();\r
 -      for (AlignmentPanel ap : _alignwith)\r
 -      {\r
 -        sp.append("'" + ap.alignFrame.getTitle() + "' ");\r
 -      }\r
 -      Cache.log.info("Couldn't align structures with the " + sp.toString()\r
 -              + "associated alignment panels.", e);\r
 -\r
 -    }\r
 -\r
 -  }\r
 -\r
 -  public void setJalviewColourScheme(ColourSchemeI ucs)\r
 -  {\r
 -    jmb.setJalviewColourScheme(ucs);\r
 -\r
 -  }\r
 -\r
 -  /**\r
 -   * \r
 -   * @param alignment\r
 -   * @return first alignment panel displaying given alignment, or the default\r
 -   *         alignment panel\r
 -   */\r
 -  public AlignmentPanel getAlignmentPanelFor(AlignmentI alignment)\r
 -  {\r
 -    for (AlignmentPanel ap : getAllAlignmentPanels())\r
 -    {\r
 -      if (ap.av.getAlignment() == alignment)\r
 -      {\r
 -        return ap;\r
 -      }\r
 -    }\r
 -    return ap;\r
 -  }\r
 -\r
 -  /**\r
 -   * \r
 -   * @param ap2\r
 -   * @return true if this Jmol instance is linked with the given alignPanel\r
 -   */\r
 -  public boolean isLinkedWith(AlignmentPanel ap2)\r
 -  {\r
 -    return _aps.contains(ap2.av.getSequenceSetId());\r
 -  }\r
 -\r
 -  public boolean isUsedforaligment(AlignmentPanel ap2)\r
 -  {\r
 -\r
 -    return (_alignwith != null) && _alignwith.contains(ap2);\r
 -  }\r
 -\r
 -  public boolean isUsedforcolourby(AlignmentPanel ap2)\r
 -  {\r
 -    return (_colourwith != null) && _colourwith.contains(ap2);\r
 -  }\r
 -\r
 -  /**\r
 -   * \r
 -   * @return TRUE if the view is NOT being coloured by sequence associations.\r
 -   */\r
 -  public boolean isColouredByJmol()\r
 -  {\r
 -    return !jmb.isColourBySequence();\r
 -  }\r
 -\r
 -}\r
 +            550, 600);
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  public void eps_actionPerformed(ActionEvent e)
 +  {
 +    makePDBImage(jalview.util.ImageMaker.EPS);
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  public void png_actionPerformed(ActionEvent e)
 +  {
 +    makePDBImage(jalview.util.ImageMaker.PNG);
 +  }
 +
 +  void makePDBImage(int type)
 +  {
 +    int width = getWidth();
 +    int height = getHeight();
 +
 +    jalview.util.ImageMaker im;
 +
 +    if (type == jalview.util.ImageMaker.PNG)
 +    {
 +      im = new jalview.util.ImageMaker(this, jalview.util.ImageMaker.PNG,
 +              "Make PNG image from view", width, height, null, null);
 +    }
 +    else
 +    {
 +      im = new jalview.util.ImageMaker(this, jalview.util.ImageMaker.EPS,
 +              "Make EPS file from view", width, height, null,
 +              this.getTitle());
 +    }
 +
 +    if (im.getGraphics() != null)
 +    {
 +      Rectangle rect = new Rectangle(width, height);
 +      jmb.viewer.renderScreenImage(im.getGraphics(), rect.getSize(), rect);
 +      im.writeImage();
 +    }
 +  }
 +
 +  public void jmolColour_actionPerformed(ActionEvent actionEvent)
 +  {
 +    if (jmolColour.isSelected())
 +    {
 +      // disable automatic sequence colouring.
 +      jmb.setColourBySequence(false);
 +    }
 +  }
 +
 +  public void seqColour_actionPerformed(ActionEvent actionEvent)
 +  {
 +    jmb.setColourBySequence(seqColour.isSelected());
 +    if (_colourwith == null)
 +    {
 +      _colourwith = new Vector<AlignmentPanel>();
 +    }
 +    if (jmb.isColourBySequence())
 +    {
 +      if (!jmb.isLoadingFromArchive())
 +      {
 +        if (_colourwith.size() == 0 && ap != null)
 +        {
 +          // Make the currently displayed alignment panel the associated view
 +          _colourwith.add(ap.alignFrame.alignPanel);
 +        }
 +      }
 +      // Set the colour using the current view for the associated alignframe
 +      for (AlignmentPanel ap : _colourwith)
 +      {
 +        jmb.colourBySequence(ap.av.showSequenceFeatures, ap);
 +      }
 +    }
 +  }
 +
 +  public void chainColour_actionPerformed(ActionEvent actionEvent)
 +  {
 +    chainColour.setSelected(true);
 +    jmb.colourByChain();
 +  }
 +
 +  public void chargeColour_actionPerformed(ActionEvent actionEvent)
 +  {
 +    chargeColour.setSelected(true);
 +    jmb.colourByCharge();
 +  }
 +
 +  public void zappoColour_actionPerformed(ActionEvent actionEvent)
 +  {
 +    zappoColour.setSelected(true);
 +    jmb.setJalviewColourScheme(new ZappoColourScheme());
 +  }
 +
 +  public void taylorColour_actionPerformed(ActionEvent actionEvent)
 +  {
 +    taylorColour.setSelected(true);
 +    jmb.setJalviewColourScheme(new TaylorColourScheme());
 +  }
 +
 +  public void hydroColour_actionPerformed(ActionEvent actionEvent)
 +  {
 +    hydroColour.setSelected(true);
 +    jmb.setJalviewColourScheme(new HydrophobicColourScheme());
 +  }
 +
 +  public void helixColour_actionPerformed(ActionEvent actionEvent)
 +  {
 +    helixColour.setSelected(true);
 +    jmb.setJalviewColourScheme(new HelixColourScheme());
 +  }
 +
 +  public void strandColour_actionPerformed(ActionEvent actionEvent)
 +  {
 +    strandColour.setSelected(true);
 +    jmb.setJalviewColourScheme(new StrandColourScheme());
 +  }
 +
 +  public void turnColour_actionPerformed(ActionEvent actionEvent)
 +  {
 +    turnColour.setSelected(true);
 +    jmb.setJalviewColourScheme(new TurnColourScheme());
 +  }
 +
 +  public void buriedColour_actionPerformed(ActionEvent actionEvent)
 +  {
 +    buriedColour.setSelected(true);
 +    jmb.setJalviewColourScheme(new BuriedColourScheme());
 +  }
 +
 +  public void purinePyrimidineColour_actionPerformed(ActionEvent actionEvent)
 +  {
 +    setJalviewColourScheme(new PurinePyrimidineColourScheme());
 +  }
 +
 +  public void userColour_actionPerformed(ActionEvent actionEvent)
 +  {
 +    userColour.setSelected(true);
 +    new UserDefinedColours(this, null);
 +  }
 +
 +  public void backGround_actionPerformed(ActionEvent actionEvent)
 +  {
 +    java.awt.Color col = JColorChooser.showDialog(this,
 +            "Select Background Colour", null);
 +    if (col != null)
 +    {
 +      jmb.setBackgroundColour(col);
 +    }
 +  }
 +
 +  public void jmolHelp_actionPerformed(ActionEvent actionEvent)
 +  {
 +    try
 +    {
 +      jalview.util.BrowserLauncher
 +              .openURL("http://jmol.sourceforge.net/docs/JmolUserGuide/");
 +    } catch (Exception ex)
 +    {
 +    }
 +  }
 +
 +  public void showConsole(boolean showConsole)
 +  {
 +
 +    if (showConsole)
 +    {
 +      if (splitPane == null)
 +      {
 +        splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
 +        splitPane.setTopComponent(renderPanel);
 +        splitPane.setBottomComponent(scriptWindow);
 +        this.getContentPane().add(splitPane, BorderLayout.CENTER);
 +        splitPane.setDividerLocation(getHeight() - 200);
 +        scriptWindow.setVisible(true);
 +        scriptWindow.validate();
 +        splitPane.validate();
 +      }
 +
 +    }
 +    else
 +    {
 +      if (splitPane != null)
 +      {
 +        splitPane.setVisible(false);
 +      }
 +
 +      splitPane = null;
 +
 +      this.getContentPane().add(renderPanel, BorderLayout.CENTER);
 +    }
 +
 +    validate();
 +  }
 +
 +  class RenderPanel extends JPanel
 +  {
 +    final Dimension currentSize = new Dimension();
 +
 +    final Rectangle rectClip = new Rectangle();
 +
 +    public void paintComponent(Graphics g)
 +    {
 +      getSize(currentSize);
 +      g.getClipBounds(rectClip);
 +
 +      if (jmb.fileLoadingError != null)
 +      {
 +        g.setColor(Color.black);
 +        g.fillRect(0, 0, currentSize.width, currentSize.height);
 +        g.setColor(Color.white);
 +        g.setFont(new Font("Verdana", Font.BOLD, 14));
 +        g.drawString(MessageManager.getString("label.error_loading_file") + "...", 20, currentSize.height / 2);
 +        StringBuffer sb = new StringBuffer();
 +        int lines = 0;
 +        for (int e = 0; e < jmb.pdbentry.length; e++)
 +        {
 +          sb.append(jmb.pdbentry[e].getId());
 +          if (e < jmb.pdbentry.length - 1)
 +          {
 +            sb.append(",");
 +          }
 +
 +          if (e == jmb.pdbentry.length - 1 || sb.length() > 20)
 +          {
 +            lines++;
 +            g.drawString(sb.toString(), 20, currentSize.height / 2 - lines
 +                    * g.getFontMetrics().getHeight());
 +          }
 +        }
 +      }
 +      else if (jmb == null || jmb.viewer == null || !jmb.isFinishedInit())
 +      {
 +        g.setColor(Color.black);
 +        g.fillRect(0, 0, currentSize.width, currentSize.height);
 +        g.setColor(Color.white);
 +        g.setFont(new Font("Verdana", Font.BOLD, 14));
 +        g.drawString(MessageManager.getString("label.retrieving_pdb_data"), 20, currentSize.height / 2);
 +      }
 +      else
 +      {
 +        jmb.viewer.renderScreenImage(g, currentSize, rectClip);
 +      }
 +    }
 +  }
 +
 +  String viewId = null;
 +
 +  public String getViewId()
 +  {
 +    if (viewId == null)
 +    {
 +      viewId = System.currentTimeMillis() + "." + this.hashCode();
 +    }
 +    return viewId;
 +  }
 +
 +  public void updateTitleAndMenus()
 +  {
 +    if (jmb.fileLoadingError != null && jmb.fileLoadingError.length() > 0)
 +    {
 +      repaint();
 +      return;
 +    }
 +    setChainMenuItems(jmb.chainNames);
 +
 +    this.setTitle(jmb.getViewerTitle());
 +    if (jmb.getPdbFile().length > 1 && jmb.sequence.length > 1)
 +    {
 +      jmolActionMenu.setVisible(true);
 +    }
 +    if (!jmb.isLoadingFromArchive())
 +    {
 +      seqColour_actionPerformed(null);
 +    }
 +  }
 +
 +  protected void buildJmolActionMenu()
 +  {
 +    if (_alignwith == null)
 +    {
 +      _alignwith = new Vector<AlignmentPanel>();
 +    }
 +    if (_alignwith.size() == 0 && ap != null)
 +    {
 +      _alignwith.add(ap);
 +    }
 +    ;
 +    for (Component c : jmolActionMenu.getMenuComponents())
 +    {
 +      if (c != alignStructs)
 +      {
 +        jmolActionMenu.remove((JMenuItem) c);
 +      }
 +    }
 +    final ItemListener handler;
 +  }
 +
 +  /*
 +   * (non-Javadoc)
 +   * 
 +   * @see
 +   * jalview.jbgui.GStructureViewer#alignStructs_actionPerformed(java.awt.event
 +   * .ActionEvent)
 +   */
 +  @Override
 +  protected void alignStructs_actionPerformed(ActionEvent actionEvent)
 +  {
 +    alignStructs_withAllAlignPanels();
 +  }
 +
 +  private void alignStructs_withAllAlignPanels()
 +  {
 +    if (ap == null)
 +    {
 +      return;
 +    }
 +    ;
 +    if (_alignwith.size() == 0)
 +    {
 +      _alignwith.add(ap);
 +    }
 +    ;
 +    try
 +    {
 +      AlignmentI[] als = new Alignment[_alignwith.size()];
 +      ColumnSelection[] alc = new ColumnSelection[_alignwith.size()];
 +      int[] alm = new int[_alignwith.size()];
 +      int a = 0;
 +
 +      for (AlignmentPanel ap : _alignwith)
 +      {
 +        als[a] = ap.av.getAlignment();
 +        alm[a] = -1;
 +        alc[a++] = ap.av.getColumnSelection();
 +      }
 +      jmb.superposeStructures(als, alm, alc);
 +    } catch (Exception e)
 +    {
 +      StringBuffer sp = new StringBuffer();
 +      for (AlignmentPanel ap : _alignwith)
 +      {
 +        sp.append("'" + ap.alignFrame.getTitle() + "' ");
 +      }
 +      Cache.log.info("Couldn't align structures with the " + sp.toString()
 +              + "associated alignment panels.", e);
 +
 +    }
 +
 +  }
 +
 +  public void setJalviewColourScheme(ColourSchemeI ucs)
 +  {
 +    jmb.setJalviewColourScheme(ucs);
 +
 +  }
 +
 +  /**
 +   * 
 +   * @param alignment
 +   * @return first alignment panel displaying given alignment, or the default
 +   *         alignment panel
 +   */
 +  public AlignmentPanel getAlignmentPanelFor(AlignmentI alignment)
 +  {
 +    for (AlignmentPanel ap : getAllAlignmentPanels())
 +    {
 +      if (ap.av.getAlignment() == alignment)
 +      {
 +        return ap;
 +      }
 +    }
 +    return ap;
 +  }
 +
 +  /**
 +   * 
 +   * @param ap2
 +   * @return true if this Jmol instance is linked with the given alignPanel
 +   */
 +  public boolean isLinkedWith(AlignmentPanel ap2)
 +  {
 +    return _aps.contains(ap2.av.getSequenceSetId());
 +  }
 +
 +  public boolean isUsedforaligment(AlignmentPanel ap2)
 +  {
 +
 +    return (_alignwith != null) && _alignwith.contains(ap2);
 +  }
 +
 +  public boolean isUsedforcolourby(AlignmentPanel ap2)
 +  {
 +    return (_colourwith != null) && _colourwith.contains(ap2);
 +  }
 +
 +  /**
 +   * 
 +   * @return TRUE if the view is NOT being coloured by sequence associations.
 +   */
 +  public boolean isColouredByJmol()
 +  {
 +    return !jmb.isColourBySequence();
 +  }
 +
 +}
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
  package jalview.gui;
  
  import java.util.*;
--
  import java.awt.event.*;
  
  import jalview.analysis.*;
  import jalview.datamodel.*;
  import jalview.jbgui.*;
++import jalview.util.MessageManager;
  
  /**
   * DOCUMENT ME!
 -/*\r
 - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8)\r
 - * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle\r
 - * \r
 - * This file is part of Jalview.\r
 - * \r
 - * Jalview is free software: you can redistribute it and/or\r
 - * modify it under the terms of the GNU General Public License \r
 - * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\r
 - *  \r
 - * Jalview is distributed in the hope that it will be useful, but \r
 - * WITHOUT ANY WARRANTY; without even the implied warranty \r
 - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR \r
 - * PURPOSE.  See the GNU General Public License for more details.\r
 - * \r
 - * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.\r
 - */\r
 -package jalview.gui;\r
 -\r
 -import java.util.*;\r
 -\r
 -import java.awt.*;\r
 -import java.awt.event.*;\r
 -\r
 -import javax.swing.*;\r
 -\r
 -import jalview.analysis.*;\r
 -import jalview.commands.*;\r
 -import jalview.datamodel.*;\r
 -import jalview.io.*;\r
 -import jalview.schemes.*;\r
 -import jalview.util.GroupUrlLink;\r
 -import jalview.util.GroupUrlLink.UrlStringTooLongException;\r
 +/*
 + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
 + * Copyright (C) 2014 The Jalview Authors
 + * 
 + * This file is part of Jalview.
 + * 
 + * Jalview is free software: you can redistribute it and/or
 + * modify it under the terms of the GNU General Public License 
 + * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
 + *  
 + * Jalview is distributed in the hope that it will be useful, but 
 + * WITHOUT ANY WARRANTY; without even the implied warranty 
 + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
 + * PURPOSE.  See the GNU General Public License for more details.
 + * 
 + * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
 + * The Jalview Authors are detailed in the 'AUTHORS' file.
 + */
 +package jalview.gui;
 +
 +import java.util.*;
 +
 +import java.awt.*;
 +import java.awt.event.*;
 +
 +import javax.swing.*;
 +
 +import jalview.analysis.*;
 +import jalview.commands.*;
 +import jalview.datamodel.*;
 +import jalview.io.*;
 +import jalview.schemes.*;
 +import jalview.util.GroupUrlLink;
 +import jalview.util.GroupUrlLink.UrlStringTooLongException;
+ import jalview.util.MessageManager;\r
 -import jalview.util.UrlLink;\r
 -\r
 -/**\r
 - * DOCUMENT ME!\r
 - * \r
 - * @author $author$\r
 - * @version $Revision: 1.118 $\r
 - */\r
 -public class PopupMenu extends JPopupMenu\r
 -{\r
 -  JMenu groupMenu = new JMenu();\r
 -\r
 -  JMenuItem groupName = new JMenuItem();\r
 -\r
 -  protected JRadioButtonMenuItem clustalColour = new JRadioButtonMenuItem();\r
 -\r
 -  protected JRadioButtonMenuItem zappoColour = new JRadioButtonMenuItem();\r
 -\r
 -  protected JRadioButtonMenuItem taylorColour = new JRadioButtonMenuItem();\r
 -\r
 -  protected JRadioButtonMenuItem hydrophobicityColour = new JRadioButtonMenuItem();\r
 -\r
 -  protected JRadioButtonMenuItem helixColour = new JRadioButtonMenuItem();\r
 -\r
 -  protected JRadioButtonMenuItem strandColour = new JRadioButtonMenuItem();\r
 -\r
 -  protected JRadioButtonMenuItem turnColour = new JRadioButtonMenuItem();\r
 -\r
 -  protected JRadioButtonMenuItem buriedColour = new JRadioButtonMenuItem();\r
 -\r
 -  protected JCheckBoxMenuItem abovePIDColour = new JCheckBoxMenuItem();\r
 -\r
 -  protected JRadioButtonMenuItem userDefinedColour = new JRadioButtonMenuItem();\r
 -\r
 -  protected JRadioButtonMenuItem PIDColour = new JRadioButtonMenuItem();\r
 -\r
 -  protected JRadioButtonMenuItem BLOSUM62Colour = new JRadioButtonMenuItem();\r
 -\r
 -  protected JRadioButtonMenuItem purinePyrimidineColour = new JRadioButtonMenuItem();\r
 -\r
 -  // protected JRadioButtonMenuItem covariationColour = new\r
 -  // JRadioButtonMenuItem();\r
 -\r
 -  JRadioButtonMenuItem noColourmenuItem = new JRadioButtonMenuItem();\r
 -\r
 -  protected JCheckBoxMenuItem conservationMenuItem = new JCheckBoxMenuItem();\r
 -\r
 -  AlignmentPanel ap;\r
 -\r
 -  JMenu sequenceMenu = new JMenu();\r
 -\r
 -  JMenuItem sequenceName = new JMenuItem();\r
 -\r
 -  JMenuItem sequenceDetails = new JMenuItem();\r
 -\r
 -  JMenuItem sequenceSelDetails = new JMenuItem();\r
 -\r
 -  SequenceI sequence;\r
 -  JMenuItem createGroupMenuItem = new JMenuItem();\r
 -  JMenuItem unGroupMenuItem = new JMenuItem();\r
 -\r
 -  JMenuItem outline = new JMenuItem();\r
 -\r
 -  JRadioButtonMenuItem nucleotideMenuItem = new JRadioButtonMenuItem();\r
 -\r
 -  JMenu colourMenu = new JMenu();\r
 -\r
 -  JCheckBoxMenuItem showBoxes = new JCheckBoxMenuItem();\r
 -\r
 -  JCheckBoxMenuItem showText = new JCheckBoxMenuItem();\r
 -\r
 -  JCheckBoxMenuItem showColourText = new JCheckBoxMenuItem();\r
 -\r
 -  JCheckBoxMenuItem displayNonconserved = new JCheckBoxMenuItem();\r
 -\r
 -  JMenu editMenu = new JMenu();\r
 -\r
 -  JMenuItem cut = new JMenuItem();\r
 -\r
 -  JMenuItem copy = new JMenuItem();\r
 -\r
 -  JMenuItem upperCase = new JMenuItem();\r
 -\r
 -  JMenuItem lowerCase = new JMenuItem();\r
 -\r
 -  JMenuItem toggle = new JMenuItem();\r
 -\r
 -  JMenu pdbMenu = new JMenu();\r
 -\r
 -  JMenuItem pdbFromFile = new JMenuItem();\r
 -\r
 -  JMenuItem enterPDB = new JMenuItem();\r
 -\r
 -  JMenuItem discoverPDB = new JMenuItem();\r
 -\r
 -  JMenu outputMenu = new JMenu();\r
 -\r
 -  JMenuItem sequenceFeature = new JMenuItem();\r
 -\r
 -  JMenuItem textColour = new JMenuItem();\r
 -\r
 -  JMenu jMenu1 = new JMenu();\r
 -\r
 -  JMenu structureMenu = new JMenu();\r
 -\r
 -  JMenu viewStructureMenu = new JMenu();\r
 -\r
 -  // JMenu colStructureMenu = new JMenu();\r
 -  JMenuItem editSequence = new JMenuItem();\r
 -\r
 -  // JMenuItem annotationMenuItem = new JMenuItem();\r
 -\r
 -  JMenu groupLinksMenu;\r
 -\r
 -  /**\r
 -   * Creates a new PopupMenu object.\r
 -   * \r
 -   * @param ap\r
 -   *          DOCUMENT ME!\r
 -   * @param seq\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  public PopupMenu(final AlignmentPanel ap, Sequence seq, Vector links)\r
 -  {\r
 -    this(ap, seq, links, null);\r
 -  }\r
 -\r
 -  /**\r
 -   * \r
 -   * @param ap\r
 -   * @param seq\r
 -   * @param links\r
 -   * @param groupLinks\r
 -   */\r
 -  public PopupMenu(final AlignmentPanel ap, final SequenceI seq,\r
 -          Vector links, Vector groupLinks)\r
 -  {\r
 -    // /////////////////////////////////////////////////////////\r
 -    // If this is activated from the sequence panel, the user may want to\r
 -    // edit or annotate a particular residue. Therefore display the residue menu\r
 -    //\r
 -    // If from the IDPanel, we must display the sequence menu\r
 -    // ////////////////////////////////////////////////////////\r
 -    this.ap = ap;\r
 -    sequence = seq;\r
 -\r
 -    ButtonGroup colours = new ButtonGroup();\r
 -    colours.add(noColourmenuItem);\r
 -    colours.add(clustalColour);\r
 -    colours.add(zappoColour);\r
 -    colours.add(taylorColour);\r
 -    colours.add(hydrophobicityColour);\r
 -    colours.add(helixColour);\r
 -    colours.add(strandColour);\r
 -    colours.add(turnColour);\r
 -    colours.add(buriedColour);\r
 -    colours.add(abovePIDColour);\r
 -    colours.add(userDefinedColour);\r
 -    colours.add(PIDColour);\r
 -    colours.add(BLOSUM62Colour);\r
 -    colours.add(purinePyrimidineColour);\r
 -    // colours.add(covariationColour);\r
 -\r
 -    for (int i = 0; i < jalview.io.FormatAdapter.WRITEABLE_FORMATS.length; i++)\r
 -    {\r
 -      JMenuItem item = new JMenuItem(\r
 -              jalview.io.FormatAdapter.WRITEABLE_FORMATS[i]);\r
 -\r
 -      item.addActionListener(new java.awt.event.ActionListener()\r
 -      {\r
 -        public void actionPerformed(ActionEvent e)\r
 -        {\r
 -          outputText_actionPerformed(e);\r
 -        }\r
 -      });\r
 -\r
 -      outputMenu.add(item);\r
 -    }\r
 -\r
 -    try\r
 -    {\r
 -      jbInit();\r
 -    } catch (Exception e)\r
 -    {\r
 -      e.printStackTrace();\r
 -    }\r
 -\r
 -    JMenuItem menuItem;\r
 -    if (seq != null)\r
 -    {\r
 -      sequenceMenu.setText(sequence.getName());\r
 -\r
 -      if (seq.getDatasetSequence().getPDBId() != null\r
 -              && seq.getDatasetSequence().getPDBId().size() > 0)\r
 -      {\r
 -        java.util.Enumeration e = seq.getDatasetSequence().getPDBId()\r
 -                .elements();\r
 -\r
 -        while (e.hasMoreElements())\r
 -        {\r
 -          final PDBEntry pdb = (PDBEntry) e.nextElement();\r
 -\r
 -          menuItem = new JMenuItem();\r
 -          menuItem.setText(pdb.getId());\r
 -          menuItem.addActionListener(new java.awt.event.ActionListener()\r
 -          {\r
 -            public void actionPerformed(ActionEvent e)\r
 -            {\r
 -              // TODO re JAL-860: optionally open dialog or provide a menu entry\r
 -              // allowing user to open just one structure per sequence\r
 -              new AppJmol(pdb, ap.av.collateForPDB(new PDBEntry[]\r
 -              { pdb })[0], null, ap);\r
 -              // new PDBViewer(pdb, seqs2, null, ap, AppletFormatAdapter.FILE);\r
 -            }\r
 -\r
 -          });\r
 -          viewStructureMenu.add(menuItem);\r
 -\r
 -          /*\r
 -           * menuItem = new JMenuItem(); menuItem.setText(pdb.getId());\r
 -           * menuItem.addActionListener(new java.awt.event.ActionListener() {\r
 -           * public void actionPerformed(ActionEvent e) {\r
 -           * colourByStructure(pdb.getId()); } });\r
 -           * colStructureMenu.add(menuItem);\r
 -           */\r
 -        }\r
 -      }\r
 -      else\r
 -      {\r
 -        if (ap.av.getAlignment().isNucleotide() == false)\r
 -        {\r
 -          structureMenu.remove(viewStructureMenu);\r
 -        }\r
 -        // structureMenu.remove(colStructureMenu);\r
 -      }\r
 -\r
 -      if (ap.av.getAlignment().isNucleotide() == true)\r
 -      {\r
 -        AlignmentAnnotation[] aa = ap.av.getAlignment()\r
 -                .getAlignmentAnnotation();\r
 -        for (int i = 0; i < aa.length; i++)\r
 -        {\r
 -          if (aa[i].getRNAStruc() != null)\r
 -          {\r
 -            final String rnastruc = aa[i].getRNAStruc();\r
 -            final String structureLine = aa[i].label;\r
 -            menuItem = new JMenuItem();\r
 +import jalview.util.UrlLink;
 +
 +/**
 + * DOCUMENT ME!
 + * 
 + * @author $author$
 + * @version $Revision: 1.118 $
 + */
 +public class PopupMenu extends JPopupMenu
 +{
 +  JMenu groupMenu = new JMenu();
 +
 +  JMenuItem groupName = new JMenuItem();
 +
 +  protected JRadioButtonMenuItem clustalColour = new JRadioButtonMenuItem();
 +
 +  protected JRadioButtonMenuItem zappoColour = new JRadioButtonMenuItem();
 +
 +  protected JRadioButtonMenuItem taylorColour = new JRadioButtonMenuItem();
 +
 +  protected JRadioButtonMenuItem hydrophobicityColour = new JRadioButtonMenuItem();
 +
 +  protected JRadioButtonMenuItem helixColour = new JRadioButtonMenuItem();
 +
 +  protected JRadioButtonMenuItem strandColour = new JRadioButtonMenuItem();
 +
 +  protected JRadioButtonMenuItem turnColour = new JRadioButtonMenuItem();
 +
 +  protected JRadioButtonMenuItem buriedColour = new JRadioButtonMenuItem();
 +
 +  protected JCheckBoxMenuItem abovePIDColour = new JCheckBoxMenuItem();
 +
 +  protected JRadioButtonMenuItem userDefinedColour = new JRadioButtonMenuItem();
 +
 +  protected JRadioButtonMenuItem PIDColour = new JRadioButtonMenuItem();
 +
 +  protected JRadioButtonMenuItem BLOSUM62Colour = new JRadioButtonMenuItem();
 +
 +  protected JRadioButtonMenuItem purinePyrimidineColour = new JRadioButtonMenuItem();
 +
 +  // protected JRadioButtonMenuItem covariationColour = new
 +  // JRadioButtonMenuItem();
 +
 +  JRadioButtonMenuItem noColourmenuItem = new JRadioButtonMenuItem();
 +
 +  protected JCheckBoxMenuItem conservationMenuItem = new JCheckBoxMenuItem();
 +
 +  AlignmentPanel ap;
 +
 +  JMenu sequenceMenu = new JMenu();
 +
 +  JMenuItem sequenceName = new JMenuItem();
 +
 +  JMenuItem sequenceDetails = new JMenuItem();
 +
 +  JMenuItem sequenceSelDetails = new JMenuItem();
 +
 +  SequenceI sequence;
 +  JMenuItem createGroupMenuItem = new JMenuItem();
 +  JMenuItem unGroupMenuItem = new JMenuItem();
 +
 +  JMenuItem outline = new JMenuItem();
 +
 +  JRadioButtonMenuItem nucleotideMenuItem = new JRadioButtonMenuItem();
 +
 +  JMenu colourMenu = new JMenu();
 +
 +  JCheckBoxMenuItem showBoxes = new JCheckBoxMenuItem();
 +
 +  JCheckBoxMenuItem showText = new JCheckBoxMenuItem();
 +
 +  JCheckBoxMenuItem showColourText = new JCheckBoxMenuItem();
 +
 +  JCheckBoxMenuItem displayNonconserved = new JCheckBoxMenuItem();
 +
 +  JMenu editMenu = new JMenu();
 +
 +  JMenuItem cut = new JMenuItem();
 +
 +  JMenuItem copy = new JMenuItem();
 +
 +  JMenuItem upperCase = new JMenuItem();
 +
 +  JMenuItem lowerCase = new JMenuItem();
 +
 +  JMenuItem toggle = new JMenuItem();
 +
 +  JMenu pdbMenu = new JMenu();
 +
 +  JMenuItem pdbFromFile = new JMenuItem();
 +
 +  JMenuItem enterPDB = new JMenuItem();
 +
 +  JMenuItem discoverPDB = new JMenuItem();
 +
 +  JMenu outputMenu = new JMenu();
 +
 +  JMenuItem sequenceFeature = new JMenuItem();
 +
 +  JMenuItem textColour = new JMenuItem();
 +
 +  JMenu jMenu1 = new JMenu();
 +
 +  JMenu structureMenu = new JMenu();
 +
 +  JMenu viewStructureMenu = new JMenu();
 +
 +  // JMenu colStructureMenu = new JMenu();
 +  JMenuItem editSequence = new JMenuItem();
 +
 +  // JMenuItem annotationMenuItem = new JMenuItem();
 +
 +  JMenu groupLinksMenu;
 +
 +  /**
 +   * Creates a new PopupMenu object.
 +   * 
 +   * @param ap
 +   *          DOCUMENT ME!
 +   * @param seq
 +   *          DOCUMENT ME!
 +   */
 +  public PopupMenu(final AlignmentPanel ap, Sequence seq, Vector links)
 +  {
 +    this(ap, seq, links, null);
 +  }
 +
 +  /**
 +   * 
 +   * @param ap
 +   * @param seq
 +   * @param links
 +   * @param groupLinks
 +   */
 +  public PopupMenu(final AlignmentPanel ap, final SequenceI seq,
 +          Vector links, Vector groupLinks)
 +  {
 +    // /////////////////////////////////////////////////////////
 +    // If this is activated from the sequence panel, the user may want to
 +    // edit or annotate a particular residue. Therefore display the residue menu
 +    //
 +    // If from the IDPanel, we must display the sequence menu
 +    // ////////////////////////////////////////////////////////
 +    this.ap = ap;
 +    sequence = seq;
 +
 +    ButtonGroup colours = new ButtonGroup();
 +    colours.add(noColourmenuItem);
 +    colours.add(clustalColour);
 +    colours.add(zappoColour);
 +    colours.add(taylorColour);
 +    colours.add(hydrophobicityColour);
 +    colours.add(helixColour);
 +    colours.add(strandColour);
 +    colours.add(turnColour);
 +    colours.add(buriedColour);
 +    colours.add(abovePIDColour);
 +    colours.add(userDefinedColour);
 +    colours.add(PIDColour);
 +    colours.add(BLOSUM62Colour);
 +    colours.add(purinePyrimidineColour);
 +    // colours.add(covariationColour);
 +
 +    for (int i = 0; i < jalview.io.FormatAdapter.WRITEABLE_FORMATS.length; i++)
 +    {
 +      JMenuItem item = new JMenuItem(
 +              jalview.io.FormatAdapter.WRITEABLE_FORMATS[i]);
 +
 +      item.addActionListener(new java.awt.event.ActionListener()
 +      {
 +        public void actionPerformed(ActionEvent e)
 +        {
 +          outputText_actionPerformed(e);
 +        }
 +      });
 +
 +      outputMenu.add(item);
 +    }
 +
 +    try
 +    {
 +      jbInit();
 +    } catch (Exception e)
 +    {
 +      e.printStackTrace();
 +    }
 +
 +    JMenuItem menuItem;
 +    if (seq != null)
 +    {
 +      sequenceMenu.setText(sequence.getName());
 +
 +      if (seq.getDatasetSequence().getPDBId() != null
 +              && seq.getDatasetSequence().getPDBId().size() > 0)
 +      {
 +        java.util.Enumeration e = seq.getDatasetSequence().getPDBId()
 +                .elements();
 +
 +        while (e.hasMoreElements())
 +        {
 +          final PDBEntry pdb = (PDBEntry) e.nextElement();
 +
 +          menuItem = new JMenuItem();
 +          menuItem.setText(pdb.getId());
 +          menuItem.addActionListener(new java.awt.event.ActionListener()
 +          {
 +            public void actionPerformed(ActionEvent e)
 +            {
 +              // TODO re JAL-860: optionally open dialog or provide a menu entry
 +              // allowing user to open just one structure per sequence
 +              new AppJmol(pdb, ap.av.collateForPDB(new PDBEntry[]
 +              { pdb })[0], null, ap);
 +              // new PDBViewer(pdb, seqs2, null, ap, AppletFormatAdapter.FILE);
 +            }
 +
 +          });
 +          viewStructureMenu.add(menuItem);
 +
 +          /*
 +           * menuItem = new JMenuItem(); menuItem.setText(pdb.getId());
 +           * menuItem.addActionListener(new java.awt.event.ActionListener() {
 +           * public void actionPerformed(ActionEvent e) {
 +           * colourByStructure(pdb.getId()); } });
 +           * colStructureMenu.add(menuItem);
 +           */
 +        }
 +      }
 +      else
 +      {
 +        if (ap.av.getAlignment().isNucleotide() == false)
 +        {
 +          structureMenu.remove(viewStructureMenu);
 +        }
 +        // structureMenu.remove(colStructureMenu);
 +      }
 +
 +      if (ap.av.getAlignment().isNucleotide() == true)
 +      {
 +        AlignmentAnnotation[] aa = ap.av.getAlignment()
 +                .getAlignmentAnnotation();
 +        for (int i = 0; i < aa.length; i++)
 +        {
 +          if (aa[i].getRNAStruc() != null)
 +          {
 +            final String rnastruc = aa[i].getRNAStruc();
 +            final String structureLine = aa[i].label;
 +            menuItem = new JMenuItem();
-             menuItem.setText("2D RNA " + structureLine);
+             menuItem.setText(MessageManager.formatMessage("label.2d_rna_structure_line", new String[]{structureLine}));\r
 -            menuItem.addActionListener(new java.awt.event.ActionListener()\r
 -            {\r
 -              public void actionPerformed(ActionEvent e)\r
 -              {\r
 -                new AppVarna(structureLine, seq, seq.getSequenceAsString(),\r
 -                        rnastruc, seq.getName(), ap);\r
 -              }\r
 -            });\r
 -            viewStructureMenu.add(menuItem);\r
 -          }\r
 -        }\r
 -\r
 -        // SequenceFeatures[] test = seq.getSequenceFeatures();\r
 -\r
 -        if (seq.getAnnotation() != null)\r
 -        {\r
 -          AlignmentAnnotation seqAnno[] = seq.getAnnotation();\r
 -          for (int i = 0; i < seqAnno.length; i++)\r
 -          {\r
 -            if (seqAnno[i].getRNAStruc() != null)\r
 -            {\r
 -              final String rnastruc = seqAnno[i].getRNAStruc();\r
 -\r
 -              // TODO: make rnastrucF a bit more nice\r
 -              menuItem = new JMenuItem();\r
 +            menuItem.addActionListener(new java.awt.event.ActionListener()
 +            {
 +              public void actionPerformed(ActionEvent e)
 +              {
 +                new AppVarna(structureLine, seq, seq.getSequenceAsString(),
 +                        rnastruc, seq.getName(), ap);
 +              }
 +            });
 +            viewStructureMenu.add(menuItem);
 +          }
 +        }
 +
 +        // SequenceFeatures[] test = seq.getSequenceFeatures();
 +
 +        if (seq.getAnnotation() != null)
 +        {
 +          AlignmentAnnotation seqAnno[] = seq.getAnnotation();
 +          for (int i = 0; i < seqAnno.length; i++)
 +          {
 +            if (seqAnno[i].getRNAStruc() != null)
 +            {
 +              final String rnastruc = seqAnno[i].getRNAStruc();
 +
 +              // TODO: make rnastrucF a bit more nice
 +              menuItem = new JMenuItem();
-               menuItem.setText("2D RNA - " + seq.getName());
+               menuItem.setText(MessageManager.formatMessage("label.2d_rna_sequence_name", new String[]{seq.getName()}));\r
 -              menuItem.addActionListener(new java.awt.event.ActionListener()\r
 -              {\r
 -                public void actionPerformed(ActionEvent e)\r
 -                {\r
 -                  // TODO: VARNA does'nt print gaps in the sequence\r
 -                  new AppVarna(seq.getName() + " structure", seq, seq\r
 -                          .getSequenceAsString(), rnastruc, seq.getName(),\r
 -                          ap);\r
 -                }\r
 -              });\r
 -              viewStructureMenu.add(menuItem);\r
 -            }\r
 -          }\r
 -        }\r
 -\r
 -      }\r
 -\r
 +              menuItem.addActionListener(new java.awt.event.ActionListener()
 +              {
 +                public void actionPerformed(ActionEvent e)
 +                {
 +                  // TODO: VARNA does'nt print gaps in the sequence
 +                  new AppVarna(seq.getName() + " structure", seq, seq
 +                          .getSequenceAsString(), rnastruc, seq.getName(),
 +                          ap);
 +                }
 +              });
 +              viewStructureMenu.add(menuItem);
 +            }
 +          }
 +        }
 +
 +      }
 +
-       menuItem = new JMenuItem("Hide Sequences");
+       menuItem = new JMenuItem(MessageManager.getString("action.hide_sequences"));\r
 -      menuItem.addActionListener(new java.awt.event.ActionListener()\r
 -      {\r
 -        public void actionPerformed(ActionEvent e)\r
 -        {\r
 -          hideSequences(false);\r
 -        }\r
 -      });\r
 -      add(menuItem);\r
 -\r
 -      if (ap.av.getSelectionGroup() != null\r
 -              && ap.av.getSelectionGroup().getSize() > 1)\r
 -      {\r
 +      menuItem.addActionListener(new java.awt.event.ActionListener()
 +      {
 +        public void actionPerformed(ActionEvent e)
 +        {
 +          hideSequences(false);
 +        }
 +      });
 +      add(menuItem);
 +
 +      if (ap.av.getSelectionGroup() != null
 +              && ap.av.getSelectionGroup().getSize() > 1)
 +      {
-         menuItem = new JMenuItem("Represent Group with " + seq.getName());
+         menuItem = new JMenuItem(MessageManager.formatMessage("label.represent_group_with", new String[]{seq.getName()}));\r
 -        menuItem.addActionListener(new java.awt.event.ActionListener()\r
 -        {\r
 -          public void actionPerformed(ActionEvent e)\r
 -          {\r
 -            hideSequences(true);\r
 -          }\r
 -        });\r
 -        sequenceMenu.add(menuItem);\r
 -      }\r
 -\r
 -      if (ap.av.hasHiddenRows())\r
 -      {\r
 -        final int index = ap.av.getAlignment().findIndex(seq);\r
 -\r
 -        if (ap.av.adjustForHiddenSeqs(index)\r
 -                - ap.av.adjustForHiddenSeqs(index - 1) > 1)\r
 -        {\r
 +        menuItem.addActionListener(new java.awt.event.ActionListener()
 +        {
 +          public void actionPerformed(ActionEvent e)
 +          {
 +            hideSequences(true);
 +          }
 +        });
 +        sequenceMenu.add(menuItem);
 +      }
 +
 +      if (ap.av.hasHiddenRows())
 +      {
 +        final int index = ap.av.getAlignment().findIndex(seq);
 +
 +        if (ap.av.adjustForHiddenSeqs(index)
 +                - ap.av.adjustForHiddenSeqs(index - 1) > 1)
 +        {
-           menuItem = new JMenuItem("Reveal Sequences");
+           menuItem = new JMenuItem(MessageManager.getString("action.reveal_sequences"));\r
 -          menuItem.addActionListener(new ActionListener()\r
 -          {\r
 -            public void actionPerformed(ActionEvent e)\r
 -            {\r
 -              ap.av.showSequence(index);\r
 -              if (ap.overviewPanel != null)\r
 -              {\r
 -                ap.overviewPanel.updateOverviewImage();\r
 -              }\r
 -            }\r
 -          });\r
 -          add(menuItem);\r
 -        }\r
 -      }\r
 -    }\r
 -    // for the case when no sequences are even visible\r
 -    if (ap.av.hasHiddenRows())\r
 -    {\r
 -      {\r
 +          menuItem.addActionListener(new ActionListener()
 +          {
 +            public void actionPerformed(ActionEvent e)
 +            {
 +              ap.av.showSequence(index);
 +              if (ap.overviewPanel != null)
 +              {
 +                ap.overviewPanel.updateOverviewImage();
 +              }
 +            }
 +          });
 +          add(menuItem);
 +        }
 +      }
 +    }
 +    // for the case when no sequences are even visible
 +    if (ap.av.hasHiddenRows())
 +    {
 +      {
-         menuItem = new JMenuItem("Reveal All");
+         menuItem = new JMenuItem(MessageManager.getString("action.reveal_all"));\r
 -        menuItem.addActionListener(new ActionListener()\r
 -        {\r
 -          public void actionPerformed(ActionEvent e)\r
 -          {\r
 -            ap.av.showAllHiddenSeqs();\r
 -            if (ap.overviewPanel != null)\r
 -            {\r
 -              ap.overviewPanel.updateOverviewImage();\r
 -            }\r
 -          }\r
 -        });\r
 -\r
 -        add(menuItem);\r
 -      }\r
 -\r
 -    }\r
 -\r
 -    SequenceGroup sg = ap.av.getSelectionGroup();\r
 -    boolean isDefinedGroup = (sg!=null) ? ap.av.getAlignment().getGroups().contains(sg) : false;\r
 -\r
 -    if (sg != null && sg.getSize() > 0)\r
 -    {      \r
 +        menuItem.addActionListener(new ActionListener()
 +        {
 +          public void actionPerformed(ActionEvent e)
 +          {
 +            ap.av.showAllHiddenSeqs();
 +            if (ap.overviewPanel != null)
 +            {
 +              ap.overviewPanel.updateOverviewImage();
 +            }
 +          }
 +        });
 +
 +        add(menuItem);
 +      }
 +
 +    }
 +
 +    SequenceGroup sg = ap.av.getSelectionGroup();
 +    boolean isDefinedGroup = (sg!=null) ? ap.av.getAlignment().getGroups().contains(sg) : false;
 +
 +    if (sg != null && sg.getSize() > 0)
 +    {      
-       groupName.setText("Name: " + sg.getName());
-       groupName.setText("Edit name and description of current group.");
+       groupName.setText(MessageManager.formatMessage("label.name_param", new String[]{sg.getName()}));\r
+       groupName.setText(MessageManager.getString("label.edit_name_and_description_current_group"));\r
 -\r
 -      if (sg.cs instanceof ZappoColourScheme)\r
 -      {\r
 -        zappoColour.setSelected(true);\r
 -      }\r
 -      else if (sg.cs instanceof TaylorColourScheme)\r
 -      {\r
 -        taylorColour.setSelected(true);\r
 -      }\r
 -      else if (sg.cs instanceof PIDColourScheme)\r
 -      {\r
 -        PIDColour.setSelected(true);\r
 -      }\r
 -      else if (sg.cs instanceof Blosum62ColourScheme)\r
 -      {\r
 -        BLOSUM62Colour.setSelected(true);\r
 -      }\r
 -      else if (sg.cs instanceof UserColourScheme)\r
 -      {\r
 -        userDefinedColour.setSelected(true);\r
 -      }\r
 -      else if (sg.cs instanceof HydrophobicColourScheme)\r
 -      {\r
 -        hydrophobicityColour.setSelected(true);\r
 -      }\r
 -      else if (sg.cs instanceof HelixColourScheme)\r
 -      {\r
 -        helixColour.setSelected(true);\r
 -      }\r
 -      else if (sg.cs instanceof StrandColourScheme)\r
 -      {\r
 -        strandColour.setSelected(true);\r
 -      }\r
 -      else if (sg.cs instanceof TurnColourScheme)\r
 -      {\r
 -        turnColour.setSelected(true);\r
 -      }\r
 -      else if (sg.cs instanceof BuriedColourScheme)\r
 -      {\r
 -        buriedColour.setSelected(true);\r
 -      }\r
 -      else if (sg.cs instanceof ClustalxColourScheme)\r
 -      {\r
 -        clustalColour.setSelected(true);\r
 -      }\r
 -      else if (sg.cs instanceof PurinePyrimidineColourScheme)\r
 -      {\r
 -        purinePyrimidineColour.setSelected(true);\r
 -      }\r
 -      /*\r
 -       * else if (sg.cs instanceof CovariationColourScheme) {\r
 -       * covariationColour.setSelected(true); }\r
 -       */\r
 -      else\r
 -      {\r
 -        noColourmenuItem.setSelected(true);\r
 -      }\r
 -\r
 -      if (sg.cs != null && sg.cs.conservationApplied())\r
 -      {\r
 -        conservationMenuItem.setSelected(true);\r
 -      }\r
 -      displayNonconserved.setSelected(sg.getShowNonconserved());\r
 -      showText.setSelected(sg.getDisplayText());\r
 -      showColourText.setSelected(sg.getColourText());\r
 -      showBoxes.setSelected(sg.getDisplayBoxes());\r
 -      // add any groupURLs to the groupURL submenu and make it visible\r
 -      if (groupLinks != null && groupLinks.size() > 0)\r
 -      {\r
 -        buildGroupURLMenu(sg, groupLinks);\r
 -      }\r
 -      // Add a 'show all structures' for the current selection\r
 -      Hashtable<String, PDBEntry> pdbe = new Hashtable<String, PDBEntry>();\r
 -      SequenceI sqass = null;\r
 -      for (SequenceI sq : ap.av.getSequenceSelection())\r
 -      {\r
 -        Vector<PDBEntry> pes = (Vector<PDBEntry>) sq.getDatasetSequence()\r
 -                .getPDBId();\r
 -        if (pes != null)\r
 -        {\r
 -          for (PDBEntry pe : pes)\r
 -          {\r
 -            pdbe.put(pe.getId(), pe);\r
 -            if (sqass == null)\r
 -            {\r
 -              sqass = sq;\r
 -            }\r
 -          }\r
 -        }\r
 -      }\r
 -      if (pdbe.size() > 0)\r
 -      {\r
 -        final PDBEntry[] pe = pdbe.values().toArray(\r
 -                new PDBEntry[pdbe.size()]);\r
 -        final JMenuItem gpdbview;\r
 -        if (pdbe.size() == 1)\r
 -        {\r
 +
 +      if (sg.cs instanceof ZappoColourScheme)
 +      {
 +        zappoColour.setSelected(true);
 +      }
 +      else if (sg.cs instanceof TaylorColourScheme)
 +      {
 +        taylorColour.setSelected(true);
 +      }
 +      else if (sg.cs instanceof PIDColourScheme)
 +      {
 +        PIDColour.setSelected(true);
 +      }
 +      else if (sg.cs instanceof Blosum62ColourScheme)
 +      {
 +        BLOSUM62Colour.setSelected(true);
 +      }
 +      else if (sg.cs instanceof UserColourScheme)
 +      {
 +        userDefinedColour.setSelected(true);
 +      }
 +      else if (sg.cs instanceof HydrophobicColourScheme)
 +      {
 +        hydrophobicityColour.setSelected(true);
 +      }
 +      else if (sg.cs instanceof HelixColourScheme)
 +      {
 +        helixColour.setSelected(true);
 +      }
 +      else if (sg.cs instanceof StrandColourScheme)
 +      {
 +        strandColour.setSelected(true);
 +      }
 +      else if (sg.cs instanceof TurnColourScheme)
 +      {
 +        turnColour.setSelected(true);
 +      }
 +      else if (sg.cs instanceof BuriedColourScheme)
 +      {
 +        buriedColour.setSelected(true);
 +      }
 +      else if (sg.cs instanceof ClustalxColourScheme)
 +      {
 +        clustalColour.setSelected(true);
 +      }
 +      else if (sg.cs instanceof PurinePyrimidineColourScheme)
 +      {
 +        purinePyrimidineColour.setSelected(true);
 +      }
 +      /*
 +       * else if (sg.cs instanceof CovariationColourScheme) {
 +       * covariationColour.setSelected(true); }
 +       */
 +      else
 +      {
 +        noColourmenuItem.setSelected(true);
 +      }
 +
 +      if (sg.cs != null && sg.cs.conservationApplied())
 +      {
 +        conservationMenuItem.setSelected(true);
 +      }
 +      displayNonconserved.setSelected(sg.getShowNonconserved());
 +      showText.setSelected(sg.getDisplayText());
 +      showColourText.setSelected(sg.getColourText());
 +      showBoxes.setSelected(sg.getDisplayBoxes());
 +      // add any groupURLs to the groupURL submenu and make it visible
 +      if (groupLinks != null && groupLinks.size() > 0)
 +      {
 +        buildGroupURLMenu(sg, groupLinks);
 +      }
 +      // Add a 'show all structures' for the current selection
 +      Hashtable<String, PDBEntry> pdbe = new Hashtable<String, PDBEntry>();
 +      SequenceI sqass = null;
 +      for (SequenceI sq : ap.av.getSequenceSelection())
 +      {
 +        Vector<PDBEntry> pes = (Vector<PDBEntry>) sq.getDatasetSequence()
 +                .getPDBId();
 +        if (pes != null)
 +        {
 +          for (PDBEntry pe : pes)
 +          {
 +            pdbe.put(pe.getId(), pe);
 +            if (sqass == null)
 +            {
 +              sqass = sq;
 +            }
 +          }
 +        }
 +      }
 +      if (pdbe.size() > 0)
 +      {
 +        final PDBEntry[] pe = pdbe.values().toArray(
 +                new PDBEntry[pdbe.size()]);
 +        final JMenuItem gpdbview;
 +        if (pdbe.size() == 1)
 +        {
-           structureMenu.add(gpdbview = new JMenuItem("View structure for "
-                   + sqass.getDisplayId(false)));
+           structureMenu.add(gpdbview = new JMenuItem(MessageManager.formatMessage("label.view_structure_for", new String[]{sqass.getDisplayId(false)})));\r
 -        }\r
 -        else\r
 -        {\r
 +        }
 +        else
 +        {
-           structureMenu.add(gpdbview = new JMenuItem("View all "
-                   + pdbe.size() + " structures."));
+           structureMenu.add(gpdbview = new JMenuItem(MessageManager.formatMessage("label.view_all_structures", new String[]{new Integer(pdbe.size()).toString()})));\r
 -        }\r
 +        }
-         gpdbview.setToolTipText("Open a new Jmol view with all structures associated with the current selection and superimpose them using the alignment.");
+         gpdbview.setToolTipText(MessageManager.getString("label.open_new_jmol_view_with_all_structures_associated_current_selection_superimpose_using_alignment"));\r
 -        gpdbview.addActionListener(new ActionListener()\r
 -        {\r
 -\r
 -          @Override\r
 -          public void actionPerformed(ActionEvent e)\r
 -          {\r
 -            new AppJmol(ap, pe, ap.av.collateForPDB(pe));\r
 -          }\r
 -        });\r
 -      }\r
 -    }\r
 -    else\r
 -    {\r
 -      groupMenu.setVisible(false);\r
 -      editMenu.setVisible(false);\r
 -    }\r
 -\r
 -    if (!isDefinedGroup)\r
 -    {\r
 -      createGroupMenuItem.setVisible(true);\r
 -      unGroupMenuItem.setVisible(false);\r
 +        gpdbview.addActionListener(new ActionListener()
 +        {
 +
 +          @Override
 +          public void actionPerformed(ActionEvent e)
 +          {
 +            new AppJmol(ap, pe, ap.av.collateForPDB(pe));
 +          }
 +        });
 +      }
 +    }
 +    else
 +    {
 +      groupMenu.setVisible(false);
 +      editMenu.setVisible(false);
 +    }
 +
 +    if (!isDefinedGroup)
 +    {
 +      createGroupMenuItem.setVisible(true);
 +      unGroupMenuItem.setVisible(false);
-       jMenu1.setText("Edit New Group");
+       jMenu1.setText(MessageManager.getString("action.edit_new_group"));\r
 -    } else {\r
 -      createGroupMenuItem.setVisible(false);\r
 -      unGroupMenuItem.setVisible(true);\r
 +    } else {
 +      createGroupMenuItem.setVisible(false);
 +      unGroupMenuItem.setVisible(true);
-       jMenu1.setText("Edit Group");
+       jMenu1.setText(MessageManager.getString("action.edit_group"));\r
 -    }\r
 -\r
 -    if (seq == null)\r
 -    {\r
 -      sequenceMenu.setVisible(false);\r
 -      structureMenu.setVisible(false);\r
 -    }\r
 -\r
 -    if (links != null && links.size() > 0)\r
 -    {\r
 -\r
 +    }
 +
 +    if (seq == null)
 +    {
 +      sequenceMenu.setVisible(false);
 +      structureMenu.setVisible(false);
 +    }
 +
 +    if (links != null && links.size() > 0)
 +    {
 +
-       JMenu linkMenu = new JMenu("Link");
+       JMenu linkMenu = new JMenu(MessageManager.getString("action.link"));\r
 -      Vector linkset = new Vector();\r
 -      for (int i = 0; i < links.size(); i++)\r
 -      {\r
 -        String link = links.elementAt(i).toString();\r
 -        UrlLink urlLink = null;\r
 -        try\r
 -        {\r
 -          urlLink = new UrlLink(link);\r
 -        } catch (Exception foo)\r
 -        {\r
 -          jalview.bin.Cache.log.error("Exception for URLLink '" + link\r
 -                  + "'", foo);\r
 -          continue;\r
 -        }\r
 -        ;\r
 -        if (!urlLink.isValid())\r
 -        {\r
 -          jalview.bin.Cache.log.error(urlLink.getInvalidMessage());\r
 -          continue;\r
 -        }\r
 -        final String label = urlLink.getLabel();\r
 -        if (seq != null && urlLink.isDynamic())\r
 -        {\r
 -\r
 -          // collect matching db-refs\r
 -          DBRefEntry[] dbr = jalview.util.DBRefUtils.selectRefs(\r
 -                  seq.getDBRef(), new String[]\r
 -                  { urlLink.getTarget() });\r
 -          // collect id string too\r
 -          String id = seq.getName();\r
 -          String descr = seq.getDescription();\r
 -          if (descr != null && descr.length() < 1)\r
 -          {\r
 -            descr = null;\r
 -          }\r
 -\r
 -          if (dbr != null)\r
 -          {\r
 -            for (int r = 0; r < dbr.length; r++)\r
 -            {\r
 -              if (id != null && dbr[r].getAccessionId().equals(id))\r
 -              {\r
 -                // suppress duplicate link creation for the bare sequence ID\r
 -                // string with this link\r
 -                id = null;\r
 -              }\r
 -              // create Bare ID link for this RUL\r
 -              String[] urls = urlLink.makeUrls(dbr[r].getAccessionId(),\r
 -                      true);\r
 -              if (urls != null)\r
 -              {\r
 -                for (int u = 0; u < urls.length; u += 2)\r
 -                {\r
 -                  if (!linkset.contains(urls[u] + "|" + urls[u + 1]))\r
 -                  {\r
 -                    linkset.addElement(urls[u] + "|" + urls[u + 1]);\r
 -                    addshowLink(linkMenu, label + "|" + urls[u],\r
 -                            urls[u + 1]);\r
 -                  }\r
 -                }\r
 -              }\r
 -            }\r
 -          }\r
 -          if (id != null)\r
 -          {\r
 -            // create Bare ID link for this RUL\r
 -            String[] urls = urlLink.makeUrls(id, true);\r
 -            if (urls != null)\r
 -            {\r
 -              for (int u = 0; u < urls.length; u += 2)\r
 -              {\r
 -                if (!linkset.contains(urls[u] + "|" + urls[u + 1]))\r
 -                {\r
 -                  linkset.addElement(urls[u] + "|" + urls[u + 1]);\r
 -                  addshowLink(linkMenu, label, urls[u + 1]);\r
 -                }\r
 -              }\r
 -            }\r
 -          }\r
 -          // Create urls from description but only for URL links which are regex\r
 -          // links\r
 -          if (descr != null && urlLink.getRegexReplace() != null)\r
 -          {\r
 -            // create link for this URL from description where regex matches\r
 -            String[] urls = urlLink.makeUrls(descr, true);\r
 -            if (urls != null)\r
 -            {\r
 -              for (int u = 0; u < urls.length; u += 2)\r
 -              {\r
 -                if (!linkset.contains(urls[u] + "|" + urls[u + 1]))\r
 -                {\r
 -                  linkset.addElement(urls[u] + "|" + urls[u + 1]);\r
 -                  addshowLink(linkMenu, label, urls[u + 1]);\r
 -                }\r
 -              }\r
 -            }\r
 -          }\r
 -        }\r
 -        else\r
 -        {\r
 -          if (!linkset.contains(label + "|" + urlLink.getUrl_prefix()))\r
 -          {\r
 -            linkset.addElement(label + "|" + urlLink.getUrl_prefix());\r
 -            // Add a non-dynamic link\r
 -            addshowLink(linkMenu, label, urlLink.getUrl_prefix());\r
 -          }\r
 -        }\r
 -      }\r
 -      if (sequence != null)\r
 -      {\r
 -        sequenceMenu.add(linkMenu);\r
 -      }\r
 -      else\r
 -      {\r
 -        add(linkMenu);\r
 -      }\r
 -    }\r
 -  }\r
 -\r
 -  private void buildGroupURLMenu(SequenceGroup sg, Vector groupLinks)\r
 -  {\r
 -\r
 -    // TODO: usability: thread off the generation of group url content so root\r
 -    // menu appears asap\r
 -    // sequence only URLs\r
 -    // ID/regex match URLs\r
 +      Vector linkset = new Vector();
 +      for (int i = 0; i < links.size(); i++)
 +      {
 +        String link = links.elementAt(i).toString();
 +        UrlLink urlLink = null;
 +        try
 +        {
 +          urlLink = new UrlLink(link);
 +        } catch (Exception foo)
 +        {
 +          jalview.bin.Cache.log.error("Exception for URLLink '" + link
 +                  + "'", foo);
 +          continue;
 +        }
 +        ;
 +        if (!urlLink.isValid())
 +        {
 +          jalview.bin.Cache.log.error(urlLink.getInvalidMessage());
 +          continue;
 +        }
 +        final String label = urlLink.getLabel();
 +        if (seq != null && urlLink.isDynamic())
 +        {
 +
 +          // collect matching db-refs
 +          DBRefEntry[] dbr = jalview.util.DBRefUtils.selectRefs(
 +                  seq.getDBRef(), new String[]
 +                  { urlLink.getTarget() });
 +          // collect id string too
 +          String id = seq.getName();
 +          String descr = seq.getDescription();
 +          if (descr != null && descr.length() < 1)
 +          {
 +            descr = null;
 +          }
 +
 +          if (dbr != null)
 +          {
 +            for (int r = 0; r < dbr.length; r++)
 +            {
 +              if (id != null && dbr[r].getAccessionId().equals(id))
 +              {
 +                // suppress duplicate link creation for the bare sequence ID
 +                // string with this link
 +                id = null;
 +              }
 +              // create Bare ID link for this RUL
 +              String[] urls = urlLink.makeUrls(dbr[r].getAccessionId(),
 +                      true);
 +              if (urls != null)
 +              {
 +                for (int u = 0; u < urls.length; u += 2)
 +                {
 +                  if (!linkset.contains(urls[u] + "|" + urls[u + 1]))
 +                  {
 +                    linkset.addElement(urls[u] + "|" + urls[u + 1]);
 +                    addshowLink(linkMenu, label + "|" + urls[u],
 +                            urls[u + 1]);
 +                  }
 +                }
 +              }
 +            }
 +          }
 +          if (id != null)
 +          {
 +            // create Bare ID link for this RUL
 +            String[] urls = urlLink.makeUrls(id, true);
 +            if (urls != null)
 +            {
 +              for (int u = 0; u < urls.length; u += 2)
 +              {
 +                if (!linkset.contains(urls[u] + "|" + urls[u + 1]))
 +                {
 +                  linkset.addElement(urls[u] + "|" + urls[u + 1]);
 +                  addshowLink(linkMenu, label, urls[u + 1]);
 +                }
 +              }
 +            }
 +          }
 +          // Create urls from description but only for URL links which are regex
 +          // links
 +          if (descr != null && urlLink.getRegexReplace() != null)
 +          {
 +            // create link for this URL from description where regex matches
 +            String[] urls = urlLink.makeUrls(descr, true);
 +            if (urls != null)
 +            {
 +              for (int u = 0; u < urls.length; u += 2)
 +              {
 +                if (!linkset.contains(urls[u] + "|" + urls[u + 1]))
 +                {
 +                  linkset.addElement(urls[u] + "|" + urls[u + 1]);
 +                  addshowLink(linkMenu, label, urls[u + 1]);
 +                }
 +              }
 +            }
 +          }
 +        }
 +        else
 +        {
 +          if (!linkset.contains(label + "|" + urlLink.getUrl_prefix()))
 +          {
 +            linkset.addElement(label + "|" + urlLink.getUrl_prefix());
 +            // Add a non-dynamic link
 +            addshowLink(linkMenu, label, urlLink.getUrl_prefix());
 +          }
 +        }
 +      }
 +      if (sequence != null)
 +      {
 +        sequenceMenu.add(linkMenu);
 +      }
 +      else
 +      {
 +        add(linkMenu);
 +      }
 +    }
 +  }
 +
 +  private void buildGroupURLMenu(SequenceGroup sg, Vector groupLinks)
 +  {
 +
 +    // TODO: usability: thread off the generation of group url content so root
 +    // menu appears asap
 +    // sequence only URLs
 +    // ID/regex match URLs
-     groupLinksMenu = new JMenu("Group Link");
+     groupLinksMenu = new JMenu(MessageManager.getString("action.group_link"));\r
 -    JMenu[] linkMenus = new JMenu[]\r
 +    JMenu[] linkMenus = new JMenu[]
-     { null, new JMenu("IDS"), new JMenu("Sequences"),
-         new JMenu("IDS and Sequences") }; // three types of url that might be
+     { null, new JMenu(MessageManager.getString("action.ids")), new JMenu(MessageManager.getString("action.sequences")),\r
+         new JMenu(MessageManager.getString("action.ids_sequences")) }; // three types of url that might be\r
 -                                          // created.\r
 -    SequenceI[] seqs = ap.av.getSelectionAsNewSequence();\r
 -    String[][] idandseqs = GroupUrlLink.formStrings(seqs);\r
 -    Hashtable commonDbrefs = new Hashtable();\r
 -    for (int sq = 0; sq < seqs.length; sq++)\r
 -    {\r
 -\r
 -      int start = seqs[sq].findPosition(sg.getStartRes()), end = seqs[sq]\r
 -              .findPosition(sg.getEndRes());\r
 -      // just collect ids from dataset sequence\r
 -      // TODO: check if IDs collected from selecton group intersects with the\r
 -      // current selection, too\r
 -      SequenceI sqi = seqs[sq];\r
 -      while (sqi.getDatasetSequence() != null)\r
 -      {\r
 -        sqi = sqi.getDatasetSequence();\r
 -      }\r
 -      DBRefEntry[] dbr = sqi.getDBRef();\r
 -      if (dbr != null && dbr.length > 0)\r
 -      {\r
 -        for (int d = 0; d < dbr.length; d++)\r
 -        {\r
 -          String src = dbr[d].getSource(); // jalview.util.DBRefUtils.getCanonicalName(dbr[d].getSource()).toUpperCase();\r
 -          Object[] sarray = (Object[]) commonDbrefs.get(src);\r
 -          if (sarray == null)\r
 -          {\r
 -            sarray = new Object[2];\r
 -            sarray[0] = new int[]\r
 -            { 0 };\r
 -            sarray[1] = new String[seqs.length];\r
 -\r
 -            commonDbrefs.put(src, sarray);\r
 -          }\r
 -\r
 -          if (((String[]) sarray[1])[sq] == null)\r
 -          {\r
 -            if (!dbr[d].hasMap()\r
 -                    || (dbr[d].getMap().locateMappedRange(start, end) != null))\r
 -            {\r
 -              ((String[]) sarray[1])[sq] = dbr[d].getAccessionId();\r
 -              ((int[]) sarray[0])[0]++;\r
 -            }\r
 -          }\r
 -        }\r
 -      }\r
 -    }\r
 -    // now create group links for all distinct ID/sequence sets.\r
 -    boolean addMenu = false; // indicates if there are any group links to give\r
 -                             // to user\r
 -    for (int i = 0; i < groupLinks.size(); i++)\r
 -    {\r
 -      String link = groupLinks.elementAt(i).toString();\r
 -      GroupUrlLink urlLink = null;\r
 -      try\r
 -      {\r
 -        urlLink = new GroupUrlLink(link);\r
 -      } catch (Exception foo)\r
 -      {\r
 -        jalview.bin.Cache.log.error("Exception for GroupURLLink '" + link\r
 -                + "'", foo);\r
 -        continue;\r
 -      }\r
 -      ;\r
 -      if (!urlLink.isValid())\r
 -      {\r
 -        jalview.bin.Cache.log.error(urlLink.getInvalidMessage());\r
 -        continue;\r
 -      }\r
 -      final String label = urlLink.getLabel();\r
 -      boolean usingNames = false;\r
 -      // Now see which parts of the group apply for this URL\r
 -      String ltarget = urlLink.getTarget(); // jalview.util.DBRefUtils.getCanonicalName(urlLink.getTarget());\r
 -      Object[] idset = (Object[]) commonDbrefs.get(ltarget.toUpperCase());\r
 -      String[] seqstr, ids; // input to makeUrl\r
 -      if (idset != null)\r
 -      {\r
 -        int numinput = ((int[]) idset[0])[0];\r
 -        String[] allids = ((String[]) idset[1]);\r
 -        seqstr = new String[numinput];\r
 -        ids = new String[numinput];\r
 -        for (int sq = 0, idcount = 0; sq < seqs.length; sq++)\r
 -        {\r
 -          if (allids[sq] != null)\r
 -          {\r
 -            ids[idcount] = allids[sq];\r
 -            seqstr[idcount++] = idandseqs[1][sq];\r
 -          }\r
 -        }\r
 -      }\r
 -      else\r
 -      {\r
 -        // just use the id/seq set\r
 -        seqstr = idandseqs[1];\r
 -        ids = idandseqs[0];\r
 -        usingNames = true;\r
 -      }\r
 -      // and try and make the groupURL!\r
 -\r
 -      Object[] urlset = null;\r
 -      try\r
 -      {\r
 -        urlset = urlLink.makeUrlStubs(ids, seqstr,\r
 -                "FromJalview" + System.currentTimeMillis(), false);\r
 -      } catch (UrlStringTooLongException e)\r
 -      {\r
 -      }\r
 -      if (urlset != null)\r
 -      {\r
 -        int type = urlLink.getGroupURLType() & 3;\r
 -        // System.out.println(urlLink.getGroupURLType()\r
 -        // +" "+((String[])urlset[3])[0]);\r
 -        // first two bits ofurlLink type bitfield are sequenceids and sequences\r
 -        // TODO: FUTURE: ensure the groupURL menu structure can be generalised\r
 -        addshowLink(linkMenus[type], label\r
 -                + (((type & 1) == 1) ? ("("\r
 -                        + (usingNames ? "Names" : ltarget) + ")") : ""),\r
 -                urlLink, urlset);\r
 -        addMenu = true;\r
 -      }\r
 -    }\r
 -    if (addMenu)\r
 -    {\r
 +                                          // created.
 +    SequenceI[] seqs = ap.av.getSelectionAsNewSequence();
 +    String[][] idandseqs = GroupUrlLink.formStrings(seqs);
 +    Hashtable commonDbrefs = new Hashtable();
 +    for (int sq = 0; sq < seqs.length; sq++)
 +    {
 +
 +      int start = seqs[sq].findPosition(sg.getStartRes()), end = seqs[sq]
 +              .findPosition(sg.getEndRes());
 +      // just collect ids from dataset sequence
 +      // TODO: check if IDs collected from selecton group intersects with the
 +      // current selection, too
 +      SequenceI sqi = seqs[sq];
 +      while (sqi.getDatasetSequence() != null)
 +      {
 +        sqi = sqi.getDatasetSequence();
 +      }
 +      DBRefEntry[] dbr = sqi.getDBRef();
 +      if (dbr != null && dbr.length > 0)
 +      {
 +        for (int d = 0; d < dbr.length; d++)
 +        {
 +          String src = dbr[d].getSource(); // jalview.util.DBRefUtils.getCanonicalName(dbr[d].getSource()).toUpperCase();
 +          Object[] sarray = (Object[]) commonDbrefs.get(src);
 +          if (sarray == null)
 +          {
 +            sarray = new Object[2];
 +            sarray[0] = new int[]
 +            { 0 };
 +            sarray[1] = new String[seqs.length];
 +
 +            commonDbrefs.put(src, sarray);
 +          }
 +
 +          if (((String[]) sarray[1])[sq] == null)
 +          {
 +            if (!dbr[d].hasMap()
 +                    || (dbr[d].getMap().locateMappedRange(start, end) != null))
 +            {
 +              ((String[]) sarray[1])[sq] = dbr[d].getAccessionId();
 +              ((int[]) sarray[0])[0]++;
 +            }
 +          }
 +        }
 +      }
 +    }
 +    // now create group links for all distinct ID/sequence sets.
 +    boolean addMenu = false; // indicates if there are any group links to give
 +                             // to user
 +    for (int i = 0; i < groupLinks.size(); i++)
 +    {
 +      String link = groupLinks.elementAt(i).toString();
 +      GroupUrlLink urlLink = null;
 +      try
 +      {
 +        urlLink = new GroupUrlLink(link);
 +      } catch (Exception foo)
 +      {
 +        jalview.bin.Cache.log.error("Exception for GroupURLLink '" + link
 +                + "'", foo);
 +        continue;
 +      }
 +      ;
 +      if (!urlLink.isValid())
 +      {
 +        jalview.bin.Cache.log.error(urlLink.getInvalidMessage());
 +        continue;
 +      }
 +      final String label = urlLink.getLabel();
 +      boolean usingNames = false;
 +      // Now see which parts of the group apply for this URL
 +      String ltarget = urlLink.getTarget(); // jalview.util.DBRefUtils.getCanonicalName(urlLink.getTarget());
 +      Object[] idset = (Object[]) commonDbrefs.get(ltarget.toUpperCase());
 +      String[] seqstr, ids; // input to makeUrl
 +      if (idset != null)
 +      {
 +        int numinput = ((int[]) idset[0])[0];
 +        String[] allids = ((String[]) idset[1]);
 +        seqstr = new String[numinput];
 +        ids = new String[numinput];
 +        for (int sq = 0, idcount = 0; sq < seqs.length; sq++)
 +        {
 +          if (allids[sq] != null)
 +          {
 +            ids[idcount] = allids[sq];
 +            seqstr[idcount++] = idandseqs[1][sq];
 +          }
 +        }
 +      }
 +      else
 +      {
 +        // just use the id/seq set
 +        seqstr = idandseqs[1];
 +        ids = idandseqs[0];
 +        usingNames = true;
 +      }
 +      // and try and make the groupURL!
 +
 +      Object[] urlset = null;
 +      try
 +      {
 +        urlset = urlLink.makeUrlStubs(ids, seqstr,
 +                "FromJalview" + System.currentTimeMillis(), false);
 +      } catch (UrlStringTooLongException e)
 +      {
 +      }
 +      if (urlset != null)
 +      {
 +        int type = urlLink.getGroupURLType() & 3;
 +        // System.out.println(urlLink.getGroupURLType()
 +        // +" "+((String[])urlset[3])[0]);
 +        // first two bits ofurlLink type bitfield are sequenceids and sequences
 +        // TODO: FUTURE: ensure the groupURL menu structure can be generalised
 +        addshowLink(linkMenus[type], label
 +                + (((type & 1) == 1) ? ("("
 +                        + (usingNames ? "Names" : ltarget) + ")") : ""),
 +                urlLink, urlset);
 +        addMenu = true;
 +      }
 +    }
 +    if (addMenu)
 +    {
-       groupLinksMenu = new JMenu("Group Links");
+       groupLinksMenu = new JMenu(MessageManager.getString("action.group_link"));\r
 -      for (int m = 0; m < linkMenus.length; m++)\r
 -      {\r
 -        if (linkMenus[m] != null\r
 -                && linkMenus[m].getMenuComponentCount() > 0)\r
 -        {\r
 -          groupLinksMenu.add(linkMenus[m]);\r
 -        }\r
 -      }\r
 -\r
 -      groupMenu.add(groupLinksMenu);\r
 -    }\r
 -  }\r
 -\r
 -  /**\r
 -   * add a show URL menu item to the given linkMenu\r
 -   * \r
 -   * @param linkMenu\r
 -   * @param label\r
 -   *          - menu label string\r
 -   * @param url\r
 -   *          - url to open\r
 -   */\r
 -  private void addshowLink(JMenu linkMenu, String label, final String url)\r
 -  {\r
 -    JMenuItem item = new JMenuItem(label);\r
 +      for (int m = 0; m < linkMenus.length; m++)
 +      {
 +        if (linkMenus[m] != null
 +                && linkMenus[m].getMenuComponentCount() > 0)
 +        {
 +          groupLinksMenu.add(linkMenus[m]);
 +        }
 +      }
 +
 +      groupMenu.add(groupLinksMenu);
 +    }
 +  }
 +
 +  /**
 +   * add a show URL menu item to the given linkMenu
 +   * 
 +   * @param linkMenu
 +   * @param label
 +   *          - menu label string
 +   * @param url
 +   *          - url to open
 +   */
 +  private void addshowLink(JMenu linkMenu, String label, final String url)
 +  {
 +    JMenuItem item = new JMenuItem(label);
-     item.setToolTipText("open URL: " + url);
+     item.setToolTipText(MessageManager.formatMessage("label.open_url_param", new String[]{url}));\r
 -    item.addActionListener(new java.awt.event.ActionListener()\r
 -    {\r
 -      public void actionPerformed(ActionEvent e)\r
 -      {\r
 -        new Thread(new Runnable()\r
 -        {\r
 -\r
 -          public void run()\r
 -          {\r
 -            showLink(url);\r
 -          }\r
 -\r
 -        }).start();\r
 -      }\r
 -    });\r
 -\r
 -    linkMenu.add(item);\r
 -  }\r
 -\r
 -  /**\r
 -   * add a late bound groupURL item to the given linkMenu\r
 -   * \r
 -   * @param linkMenu\r
 -   * @param label\r
 -   *          - menu label string\r
 -   * @param urlgenerator\r
 -   *          GroupURLLink used to generate URL\r
 -   * @param urlstub\r
 -   *          Object array returned from the makeUrlStubs function.\r
 -   */\r
 -  private void addshowLink(JMenu linkMenu, String label,\r
 -          final GroupUrlLink urlgenerator, final Object[] urlstub)\r
 -  {\r
 -    JMenuItem item = new JMenuItem(label);\r
 +    item.addActionListener(new java.awt.event.ActionListener()
 +    {
 +      public void actionPerformed(ActionEvent e)
 +      {
 +        new Thread(new Runnable()
 +        {
 +
 +          public void run()
 +          {
 +            showLink(url);
 +          }
 +
 +        }).start();
 +      }
 +    });
 +
 +    linkMenu.add(item);
 +  }
 +
 +  /**
 +   * add a late bound groupURL item to the given linkMenu
 +   * 
 +   * @param linkMenu
 +   * @param label
 +   *          - menu label string
 +   * @param urlgenerator
 +   *          GroupURLLink used to generate URL
 +   * @param urlstub
 +   *          Object array returned from the makeUrlStubs function.
 +   */
 +  private void addshowLink(JMenu linkMenu, String label,
 +          final GroupUrlLink urlgenerator, final Object[] urlstub)
 +  {
 +    JMenuItem item = new JMenuItem(label);
-     item.setToolTipText("open URL (" + urlgenerator.getUrl_prefix()
-             + "..) (" + urlgenerator.getNumberInvolved(urlstub) + " seqs)"); // TODO:
-                                                                              // put
-                                                                              // in
-                                                                              // info
-                                                                              // about
-                                                                              // what
-                                                                              // is
-                                                                              // being
-                                                                              // sent.
+     item.setToolTipText(MessageManager.formatMessage("label.open_url_seqs_param", new Object[]{urlgenerator.getUrl_prefix(),urlgenerator.getNumberInvolved(urlstub)}));\r
+     // TODO: put in info about what is being sent.\r
 -    item.addActionListener(new java.awt.event.ActionListener()\r
 -    {\r
 -      public void actionPerformed(ActionEvent e)\r
 -      {\r
 -        new Thread(new Runnable()\r
 -        {\r
 -\r
 -          public void run()\r
 -          {\r
 -            try\r
 -            {\r
 -              showLink(urlgenerator.constructFrom(urlstub));\r
 -            } catch (UrlStringTooLongException e)\r
 -            {\r
 -            }\r
 -          }\r
 -\r
 -        }).start();\r
 -      }\r
 -    });\r
 -\r
 -    linkMenu.add(item);\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @throws Exception\r
 -   *           DOCUMENT ME!\r
 -   */\r
 -  private void jbInit() throws Exception\r
 -  {\r
 +    item.addActionListener(new java.awt.event.ActionListener()
 +    {
 +      public void actionPerformed(ActionEvent e)
 +      {
 +        new Thread(new Runnable()
 +        {
 +
 +          public void run()
 +          {
 +            try
 +            {
 +              showLink(urlgenerator.constructFrom(urlstub));
 +            } catch (UrlStringTooLongException e)
 +            {
 +            }
 +          }
 +
 +        }).start();
 +      }
 +    });
 +
 +    linkMenu.add(item);
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @throws Exception
 +   *           DOCUMENT ME!
 +   */
 +  private void jbInit() throws Exception
 +  {
-     groupMenu.setText("Group");
-     groupMenu.setText("Selection");
-     groupName.setText("Name");
+     groupMenu.setText(MessageManager.getString("label.group"));\r
+     groupMenu.setText(MessageManager.getString("label.selection"));\r
+     groupName.setText(MessageManager.getString("label.name"));\r
 -    groupName.addActionListener(new java.awt.event.ActionListener()\r
 -    {\r
 -      public void actionPerformed(ActionEvent e)\r
 -      {\r
 -        groupName_actionPerformed();\r
 -      }\r
 -    });\r
 +    groupName.addActionListener(new java.awt.event.ActionListener()
 +    {
 +      public void actionPerformed(ActionEvent e)
 +      {
 +        groupName_actionPerformed();
 +      }
 +    });
-     sequenceMenu.setText("Sequence");
-     sequenceName.setText("Edit Name/Description");
+     sequenceMenu.setText(MessageManager.getString("label.sequence"));\r
+     sequenceName.setText(MessageManager.getString("label.edit_name_description"));\r
 -    sequenceName.addActionListener(new java.awt.event.ActionListener()\r
 -    {\r
 -      public void actionPerformed(ActionEvent e)\r
 -      {\r
 -        sequenceName_actionPerformed();\r
 -      }\r
 -    });\r
 +    sequenceName.addActionListener(new java.awt.event.ActionListener()
 +    {
 +      public void actionPerformed(ActionEvent e)
 +      {
 +        sequenceName_actionPerformed();
 +      }
 +    });
-     sequenceDetails.setText("Sequence Details ...");
+     sequenceDetails.setText(MessageManager.getString("label.sequence_details") + "...");\r
 -    sequenceDetails.addActionListener(new java.awt.event.ActionListener()\r
 -    {\r
 -      public void actionPerformed(ActionEvent e)\r
 -      {\r
 -        sequenceDetails_actionPerformed();\r
 -      }\r
 -    });\r
 +    sequenceDetails.addActionListener(new java.awt.event.ActionListener()
 +    {
 +      public void actionPerformed(ActionEvent e)
 +      {
 +        sequenceDetails_actionPerformed();
 +      }
 +    });
-     sequenceSelDetails.setText("Sequence Details ...");
+     sequenceSelDetails.setText(MessageManager.getString("label.sequence_details") + "...");\r
 -    sequenceSelDetails\r
 -            .addActionListener(new java.awt.event.ActionListener()\r
 -            {\r
 -              public void actionPerformed(ActionEvent e)\r
 -              {\r
 -                sequenceSelectionDetails_actionPerformed();\r
 -              }\r
 -            });\r
 -    PIDColour.setFocusPainted(false);\r
 +    sequenceSelDetails
 +            .addActionListener(new java.awt.event.ActionListener()
 +            {
 +              public void actionPerformed(ActionEvent e)
 +              {
 +                sequenceSelectionDetails_actionPerformed();
 +              }
 +            });
 +    PIDColour.setFocusPainted(false);
-     unGroupMenuItem.setText("Remove Group");
+     unGroupMenuItem.setText(MessageManager.getString("action.remove_group"));\r
 -    unGroupMenuItem.addActionListener(new java.awt.event.ActionListener()\r
 -    {\r
 -      public void actionPerformed(ActionEvent e)\r
 -      {\r
 -        unGroupMenuItem_actionPerformed();\r
 -      }\r
 -    });\r
 +    unGroupMenuItem.addActionListener(new java.awt.event.ActionListener()
 +    {
 +      public void actionPerformed(ActionEvent e)
 +      {
 +        unGroupMenuItem_actionPerformed();
 +      }
 +    });
-     createGroupMenuItem.setText("Create Group");
+     createGroupMenuItem.setText(MessageManager.getString("action.create_group"));\r
 -    createGroupMenuItem.addActionListener(new java.awt.event.ActionListener()\r
 -    {\r
 -      public void actionPerformed(ActionEvent e)\r
 -      {\r
 -        createGroupMenuItem_actionPerformed();\r
 -      }\r
 -    });\r
 -\r
 +    createGroupMenuItem.addActionListener(new java.awt.event.ActionListener()
 +    {
 +      public void actionPerformed(ActionEvent e)
 +      {
 +        createGroupMenuItem_actionPerformed();
 +      }
 +    });
 +
-     outline.setText("Border colour");
+     outline.setText(MessageManager.getString("action.border_colour"));\r
 -    outline.addActionListener(new java.awt.event.ActionListener()\r
 -    {\r
 -      public void actionPerformed(ActionEvent e)\r
 -      {\r
 -        outline_actionPerformed();\r
 -      }\r
 -    });\r
 +    outline.addActionListener(new java.awt.event.ActionListener()
 +    {
 +      public void actionPerformed(ActionEvent e)
 +      {
 +        outline_actionPerformed();
 +      }
 +    });
-     nucleotideMenuItem.setText("Nucleotide");
+     nucleotideMenuItem.setText(MessageManager.getString("label.nucleotide"));\r
 -    nucleotideMenuItem.addActionListener(new ActionListener()\r
 -    {\r
 -      public void actionPerformed(ActionEvent e)\r
 -      {\r
 -        nucleotideMenuItem_actionPerformed();\r
 -      }\r
 -    });\r
 +    nucleotideMenuItem.addActionListener(new ActionListener()
 +    {
 +      public void actionPerformed(ActionEvent e)
 +      {
 +        nucleotideMenuItem_actionPerformed();
 +      }
 +    });
-     colourMenu.setText("Group Colour");
-     showBoxes.setText("Boxes");
+     colourMenu.setText(MessageManager.getString("label.group_colour"));\r
+     showBoxes.setText(MessageManager.getString("action.boxes"));\r
 -    showBoxes.setState(true);\r
 -    showBoxes.addActionListener(new ActionListener()\r
 -    {\r
 -      public void actionPerformed(ActionEvent e)\r
 -      {\r
 -        showBoxes_actionPerformed();\r
 -      }\r
 -    });\r
 +    showBoxes.setState(true);
 +    showBoxes.addActionListener(new ActionListener()
 +    {
 +      public void actionPerformed(ActionEvent e)
 +      {
 +        showBoxes_actionPerformed();
 +      }
 +    });
-     showText.setText("Text");
+     showText.setText(MessageManager.getString("action.text"));\r
 -    showText.setState(true);\r
 -    showText.addActionListener(new ActionListener()\r
 -    {\r
 -      public void actionPerformed(ActionEvent e)\r
 -      {\r
 -        showText_actionPerformed();\r
 -      }\r
 -    });\r
 +    showText.setState(true);
 +    showText.addActionListener(new ActionListener()
 +    {
 +      public void actionPerformed(ActionEvent e)
 +      {
 +        showText_actionPerformed();
 +      }
 +    });
-     showColourText.setText("Colour Text");
+     showColourText.setText(MessageManager.getString("label.colour_text"));\r
 -    showColourText.addActionListener(new ActionListener()\r
 -    {\r
 -      public void actionPerformed(ActionEvent e)\r
 -      {\r
 -        showColourText_actionPerformed();\r
 -      }\r
 -    });\r
 +    showColourText.addActionListener(new ActionListener()
 +    {
 +      public void actionPerformed(ActionEvent e)
 +      {
 +        showColourText_actionPerformed();
 +      }
 +    });
-     displayNonconserved.setText("Show Nonconserved");
+     displayNonconserved.setText(MessageManager.getString("label.show_non_conversed"));\r
 -    displayNonconserved.setState(true);\r
 -    displayNonconserved.addActionListener(new ActionListener()\r
 -    {\r
 -      public void actionPerformed(ActionEvent e)\r
 -      {\r
 -        showNonconserved_actionPerformed();\r
 -      }\r
 -    });\r
 +    displayNonconserved.setState(true);
 +    displayNonconserved.addActionListener(new ActionListener()
 +    {
 +      public void actionPerformed(ActionEvent e)
 +      {
 +        showNonconserved_actionPerformed();
 +      }
 +    });
-     editMenu.setText("Edit");
-     cut.setText("Cut");
+     editMenu.setText(MessageManager.getString("action.edit"));\r
+     cut.setText(MessageManager.getString("action.cut"));\r
 -    cut.addActionListener(new ActionListener()\r
 -    {\r
 -      public void actionPerformed(ActionEvent e)\r
 -      {\r
 -        cut_actionPerformed();\r
 -      }\r
 -    });\r
 +    cut.addActionListener(new ActionListener()
 +    {
 +      public void actionPerformed(ActionEvent e)
 +      {
 +        cut_actionPerformed();
 +      }
 +    });
-     upperCase.setText("To Upper Case");
+     upperCase.setText(MessageManager.getString("label.to_upper_case"));\r
 -    upperCase.addActionListener(new ActionListener()\r
 -    {\r
 -      public void actionPerformed(ActionEvent e)\r
 -      {\r
 -        changeCase(e);\r
 -      }\r
 -    });\r
 +    upperCase.addActionListener(new ActionListener()
 +    {
 +      public void actionPerformed(ActionEvent e)
 +      {
 +        changeCase(e);
 +      }
 +    });
-     copy.setText("Copy");
+     copy.setText(MessageManager.getString("action.copy"));\r
 -    copy.addActionListener(new ActionListener()\r
 -    {\r
 -      public void actionPerformed(ActionEvent e)\r
 -      {\r
 -        copy_actionPerformed();\r
 -      }\r
 -    });\r
 +    copy.addActionListener(new ActionListener()
 +    {
 +      public void actionPerformed(ActionEvent e)
 +      {
 +        copy_actionPerformed();
 +      }
 +    });
-     lowerCase.setText("To Lower Case");
+     lowerCase.setText(MessageManager.getString("label.to_lower_case"));\r
 -    lowerCase.addActionListener(new ActionListener()\r
 -    {\r
 -      public void actionPerformed(ActionEvent e)\r
 -      {\r
 -        changeCase(e);\r
 -      }\r
 -    });\r
 +    lowerCase.addActionListener(new ActionListener()
 +    {
 +      public void actionPerformed(ActionEvent e)
 +      {
 +        changeCase(e);
 +      }
 +    });
-     toggle.setText("Toggle Case");
+     toggle.setText(MessageManager.getString("label.toggle_case"));\r
 -    toggle.addActionListener(new ActionListener()\r
 -    {\r
 -      public void actionPerformed(ActionEvent e)\r
 -      {\r
 -        changeCase(e);\r
 -      }\r
 -    });\r
 +    toggle.addActionListener(new ActionListener()
 +    {
 +      public void actionPerformed(ActionEvent e)
 +      {
 +        changeCase(e);
 +      }
 +    });
-     pdbMenu.setText("Associate Structure with Sequence");
-     pdbFromFile.setText("From File");
+     pdbMenu.setText(MessageManager.getString("label.associate_structure_with_sequence"));\r
+     pdbFromFile.setText(MessageManager.getString("label.from_file"));\r
 -    pdbFromFile.addActionListener(new ActionListener()\r
 -    {\r
 -      public void actionPerformed(ActionEvent e)\r
 -      {\r
 -        pdbFromFile_actionPerformed();\r
 -      }\r
 -    });\r
 +    pdbFromFile.addActionListener(new ActionListener()
 +    {
 +      public void actionPerformed(ActionEvent e)
 +      {
 +        pdbFromFile_actionPerformed();
 +      }
 +    });
-     enterPDB.setText("Enter PDB Id");
+     enterPDB.setText(MessageManager.getString("label.enter_pdb_id"));\r
 -    enterPDB.addActionListener(new ActionListener()\r
 -    {\r
 -      public void actionPerformed(ActionEvent e)\r
 -      {\r
 -        enterPDB_actionPerformed();\r
 -      }\r
 -    });\r
 +    enterPDB.addActionListener(new ActionListener()
 +    {
 +      public void actionPerformed(ActionEvent e)
 +      {
 +        enterPDB_actionPerformed();
 +      }
 +    });
-     discoverPDB.setText("Discover PDB ids");
+     discoverPDB.setText(MessageManager.getString("label.discover_pdb_ids"));\r
 -    discoverPDB.addActionListener(new ActionListener()\r
 -    {\r
 -      public void actionPerformed(ActionEvent e)\r
 -      {\r
 -        discoverPDB_actionPerformed();\r
 -      }\r
 -    });\r
 +    discoverPDB.addActionListener(new ActionListener()
 +    {
 +      public void actionPerformed(ActionEvent e)
 +      {
 +        discoverPDB_actionPerformed();
 +      }
 +    });
-     outputMenu.setText("Output to Textbox...");
-     sequenceFeature.setText("Create Sequence Feature");
+     outputMenu.setText(MessageManager.getString("label.out_to_textbox") + "...");\r
+     sequenceFeature.setText(MessageManager.getString("label.create_sequence_feature"));\r
 -    sequenceFeature.addActionListener(new ActionListener()\r
 -    {\r
 -      public void actionPerformed(ActionEvent e)\r
 -      {\r
 -        sequenceFeature_actionPerformed();\r
 -      }\r
 -    });\r
 +    sequenceFeature.addActionListener(new ActionListener()
 +    {
 +      public void actionPerformed(ActionEvent e)
 +      {
 +        sequenceFeature_actionPerformed();
 +      }
 +    });
-     textColour.setText("Text Colour");
+     textColour.setText(MessageManager.getString("label.text_colour"));\r
 -    textColour.addActionListener(new ActionListener()\r
 -    {\r
 -      public void actionPerformed(ActionEvent e)\r
 -      {\r
 -        textColour_actionPerformed();\r
 -      }\r
 -    });\r
 +    textColour.addActionListener(new ActionListener()
 +    {
 +      public void actionPerformed(ActionEvent e)
 +      {
 +        textColour_actionPerformed();
 +      }
 +    });
-     jMenu1.setText("Group");
-     structureMenu.setText("Structure");
-     viewStructureMenu.setText("View Structure");
+     jMenu1.setText(MessageManager.getString("label.group"));\r
+     structureMenu.setText(MessageManager.getString("label.structure"));\r
+     viewStructureMenu.setText(MessageManager.getString("label.view_structure"));\r
 -    // colStructureMenu.setText("Colour By Structure");\r
 +    // colStructureMenu.setText("Colour By Structure");
-     editSequence.setText("Edit Sequence...");
+     editSequence.setText(MessageManager.getString("label.edit_sequence") + "...");\r
 -    editSequence.addActionListener(new ActionListener()\r
 -    {\r
 -      public void actionPerformed(ActionEvent actionEvent)\r
 -      {\r
 -        editSequence_actionPerformed(actionEvent);\r
 -      }\r
 -    });\r
 -\r
 -    /*\r
 -     * annotationMenuItem.setText("By Annotation");\r
 -     * annotationMenuItem.addActionListener(new ActionListener() { public void\r
 -     * actionPerformed(ActionEvent actionEvent) {\r
 -     * annotationMenuItem_actionPerformed(actionEvent); } });\r
 -     */\r
 -    groupMenu.add(sequenceSelDetails);\r
 -    add(groupMenu);\r
 -    add(sequenceMenu);\r
 -    this.add(structureMenu);\r
 -    groupMenu.add(editMenu);\r
 -    groupMenu.add(outputMenu);\r
 -    groupMenu.add(sequenceFeature);\r
 -    groupMenu.add(createGroupMenuItem);\r
 -    groupMenu.add(unGroupMenuItem);\r
 -    groupMenu.add(jMenu1);\r
 -    sequenceMenu.add(sequenceName);\r
 -    sequenceMenu.add(sequenceDetails);\r
 -    colourMenu.add(textColour);\r
 -    colourMenu.add(noColourmenuItem);\r
 -    colourMenu.add(clustalColour);\r
 -    colourMenu.add(BLOSUM62Colour);\r
 -    colourMenu.add(PIDColour);\r
 -    colourMenu.add(zappoColour);\r
 -    colourMenu.add(taylorColour);\r
 -    colourMenu.add(hydrophobicityColour);\r
 -    colourMenu.add(helixColour);\r
 -    colourMenu.add(strandColour);\r
 -    colourMenu.add(turnColour);\r
 -    colourMenu.add(buriedColour);\r
 -    colourMenu.add(nucleotideMenuItem);\r
 -    if (ap.getAlignment().isNucleotide())\r
 -    {\r
 -      colourMenu.add(purinePyrimidineColour);\r
 -    }\r
 -    // colourMenu.add(covariationColour);\r
 -    colourMenu.add(userDefinedColour);\r
 -\r
 -    if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)\r
 -    {\r
 -      java.util.Enumeration userColours = jalview.gui.UserDefinedColours\r
 -              .getUserColourSchemes().keys();\r
 -\r
 -      while (userColours.hasMoreElements())\r
 -      {\r
 -        JMenuItem item = new JMenuItem(userColours.nextElement().toString());\r
 -        item.addActionListener(new ActionListener()\r
 -        {\r
 -          public void actionPerformed(ActionEvent evt)\r
 -          {\r
 -            userDefinedColour_actionPerformed(evt);\r
 -          }\r
 -        });\r
 -        colourMenu.add(item);\r
 -      }\r
 -    }\r
 -\r
 -    colourMenu.addSeparator();\r
 -    colourMenu.add(abovePIDColour);\r
 -    colourMenu.add(conservationMenuItem);\r
 -    // colourMenu.add(annotationMenuItem);\r
 -    editMenu.add(copy);\r
 -    editMenu.add(cut);\r
 -    editMenu.add(editSequence);\r
 -    editMenu.add(upperCase);\r
 -    editMenu.add(lowerCase);\r
 -    editMenu.add(toggle);\r
 -    pdbMenu.add(pdbFromFile);\r
 -    pdbMenu.add(enterPDB);\r
 -    pdbMenu.add(discoverPDB);\r
 -    jMenu1.add(groupName);\r
 -    jMenu1.add(colourMenu);\r
 -    jMenu1.add(showBoxes);\r
 -    jMenu1.add(showText);\r
 -    jMenu1.add(showColourText);\r
 -    jMenu1.add(outline);\r
 -    jMenu1.add(displayNonconserved);\r
 -    structureMenu.add(pdbMenu);\r
 -    structureMenu.add(viewStructureMenu);\r
 -    // structureMenu.add(colStructureMenu);\r
 +    editSequence.addActionListener(new ActionListener()
 +    {
 +      public void actionPerformed(ActionEvent actionEvent)
 +      {
 +        editSequence_actionPerformed(actionEvent);
 +      }
 +    });
 +
 +    /*
 +     * annotationMenuItem.setText("By Annotation");
 +     * annotationMenuItem.addActionListener(new ActionListener() { public void
 +     * actionPerformed(ActionEvent actionEvent) {
 +     * annotationMenuItem_actionPerformed(actionEvent); } });
 +     */
 +    groupMenu.add(sequenceSelDetails);
 +    add(groupMenu);
 +    add(sequenceMenu);
 +    this.add(structureMenu);
 +    groupMenu.add(editMenu);
 +    groupMenu.add(outputMenu);
 +    groupMenu.add(sequenceFeature);
 +    groupMenu.add(createGroupMenuItem);
 +    groupMenu.add(unGroupMenuItem);
 +    groupMenu.add(jMenu1);
 +    sequenceMenu.add(sequenceName);
 +    sequenceMenu.add(sequenceDetails);
 +    colourMenu.add(textColour);
 +    colourMenu.add(noColourmenuItem);
 +    colourMenu.add(clustalColour);
 +    colourMenu.add(BLOSUM62Colour);
 +    colourMenu.add(PIDColour);
 +    colourMenu.add(zappoColour);
 +    colourMenu.add(taylorColour);
 +    colourMenu.add(hydrophobicityColour);
 +    colourMenu.add(helixColour);
 +    colourMenu.add(strandColour);
 +    colourMenu.add(turnColour);
 +    colourMenu.add(buriedColour);
 +    colourMenu.add(nucleotideMenuItem);
 +    if (ap.getAlignment().isNucleotide())
 +    {
 +      colourMenu.add(purinePyrimidineColour);
 +    }
 +    // colourMenu.add(covariationColour);
 +    colourMenu.add(userDefinedColour);
 +
 +    if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
 +    {
 +      java.util.Enumeration userColours = jalview.gui.UserDefinedColours
 +              .getUserColourSchemes().keys();
 +
 +      while (userColours.hasMoreElements())
 +      {
 +        JMenuItem item = new JMenuItem(userColours.nextElement().toString());
 +        item.addActionListener(new ActionListener()
 +        {
 +          public void actionPerformed(ActionEvent evt)
 +          {
 +            userDefinedColour_actionPerformed(evt);
 +          }
 +        });
 +        colourMenu.add(item);
 +      }
 +    }
 +
 +    colourMenu.addSeparator();
 +    colourMenu.add(abovePIDColour);
 +    colourMenu.add(conservationMenuItem);
 +    // colourMenu.add(annotationMenuItem);
 +    editMenu.add(copy);
 +    editMenu.add(cut);
 +    editMenu.add(editSequence);
 +    editMenu.add(upperCase);
 +    editMenu.add(lowerCase);
 +    editMenu.add(toggle);
 +    pdbMenu.add(pdbFromFile);
 +    pdbMenu.add(enterPDB);
 +    pdbMenu.add(discoverPDB);
 +    jMenu1.add(groupName);
 +    jMenu1.add(colourMenu);
 +    jMenu1.add(showBoxes);
 +    jMenu1.add(showText);
 +    jMenu1.add(showColourText);
 +    jMenu1.add(outline);
 +    jMenu1.add(displayNonconserved);
 +    structureMenu.add(pdbMenu);
 +    structureMenu.add(viewStructureMenu);
 +    // structureMenu.add(colStructureMenu);
-     noColourmenuItem.setText("None");
+     noColourmenuItem.setText(MessageManager.getString("label.none"));\r
 -    noColourmenuItem.addActionListener(new java.awt.event.ActionListener()\r
 -    {\r
 -      public void actionPerformed(ActionEvent e)\r
 -      {\r
 -        noColourmenuItem_actionPerformed();\r
 -      }\r
 -    });\r
 -\r
 +    noColourmenuItem.addActionListener(new java.awt.event.ActionListener()
 +    {
 +      public void actionPerformed(ActionEvent e)
 +      {
 +        noColourmenuItem_actionPerformed();
 +      }
 +    });
 +
-     clustalColour.setText("Clustalx colours");
+     clustalColour.setText(MessageManager.getString("label.clustalx_colours"));\r
 -    clustalColour.addActionListener(new java.awt.event.ActionListener()\r
 -    {\r
 -      public void actionPerformed(ActionEvent e)\r
 -      {\r
 -        clustalColour_actionPerformed();\r
 -      }\r
 -    });\r
 +    clustalColour.addActionListener(new java.awt.event.ActionListener()
 +    {
 +      public void actionPerformed(ActionEvent e)
 +      {
 +        clustalColour_actionPerformed();
 +      }
 +    });
-     zappoColour.setText("Zappo");
+     zappoColour.setText(MessageManager.getString("label.zappo"));\r
 -    zappoColour.addActionListener(new java.awt.event.ActionListener()\r
 -    {\r
 -      public void actionPerformed(ActionEvent e)\r
 -      {\r
 -        zappoColour_actionPerformed();\r
 -      }\r
 -    });\r
 +    zappoColour.addActionListener(new java.awt.event.ActionListener()
 +    {
 +      public void actionPerformed(ActionEvent e)
 +      {
 +        zappoColour_actionPerformed();
 +      }
 +    });
-     taylorColour.setText("Taylor");
+     taylorColour.setText(MessageManager.getString("label.taylor"));\r
 -    taylorColour.addActionListener(new java.awt.event.ActionListener()\r
 -    {\r
 -      public void actionPerformed(ActionEvent e)\r
 -      {\r
 -        taylorColour_actionPerformed();\r
 -      }\r
 -    });\r
 +    taylorColour.addActionListener(new java.awt.event.ActionListener()
 +    {
 +      public void actionPerformed(ActionEvent e)
 +      {
 +        taylorColour_actionPerformed();
 +      }
 +    });
-     hydrophobicityColour.setText("Hydrophobicity");
+     hydrophobicityColour.setText(MessageManager.getString("label.hydrophobicity"));\r
 -    hydrophobicityColour\r
 -            .addActionListener(new java.awt.event.ActionListener()\r
 -            {\r
 -              public void actionPerformed(ActionEvent e)\r
 -              {\r
 -                hydrophobicityColour_actionPerformed();\r
 -              }\r
 -            });\r
 +    hydrophobicityColour
 +            .addActionListener(new java.awt.event.ActionListener()
 +            {
 +              public void actionPerformed(ActionEvent e)
 +              {
 +                hydrophobicityColour_actionPerformed();
 +              }
 +            });
-     helixColour.setText("Helix propensity");
+     helixColour.setText(MessageManager.getString("label.helix_propensity"));\r
 -    helixColour.addActionListener(new java.awt.event.ActionListener()\r
 -    {\r
 -      public void actionPerformed(ActionEvent e)\r
 -      {\r
 -        helixColour_actionPerformed();\r
 -      }\r
 -    });\r
 +    helixColour.addActionListener(new java.awt.event.ActionListener()
 +    {
 +      public void actionPerformed(ActionEvent e)
 +      {
 +        helixColour_actionPerformed();
 +      }
 +    });
-     strandColour.setText("Strand propensity");
+     strandColour.setText(MessageManager.getString("label.strand_propensity"));\r
 -    strandColour.addActionListener(new java.awt.event.ActionListener()\r
 -    {\r
 -      public void actionPerformed(ActionEvent e)\r
 -      {\r
 -        strandColour_actionPerformed();\r
 -      }\r
 -    });\r
 +    strandColour.addActionListener(new java.awt.event.ActionListener()
 +    {
 +      public void actionPerformed(ActionEvent e)
 +      {
 +        strandColour_actionPerformed();
 +      }
 +    });
-     turnColour.setText("Turn propensity");
+     turnColour.setText(MessageManager.getString("label.turn_propensity"));\r
 -    turnColour.addActionListener(new java.awt.event.ActionListener()\r
 -    {\r
 -      public void actionPerformed(ActionEvent e)\r
 -      {\r
 -        turnColour_actionPerformed();\r
 -      }\r
 -    });\r
 +    turnColour.addActionListener(new java.awt.event.ActionListener()
 +    {
 +      public void actionPerformed(ActionEvent e)
 +      {
 +        turnColour_actionPerformed();
 +      }
 +    });
-     buriedColour.setText("Buried Index");
+     buriedColour.setText(MessageManager.getString("label.buried_index"));\r
 -    buriedColour.addActionListener(new java.awt.event.ActionListener()\r
 -    {\r
 -      public void actionPerformed(ActionEvent e)\r
 -      {\r
 -        buriedColour_actionPerformed();\r
 -      }\r
 -    });\r
 +    buriedColour.addActionListener(new java.awt.event.ActionListener()
 +    {
 +      public void actionPerformed(ActionEvent e)
 +      {
 +        buriedColour_actionPerformed();
 +      }
 +    });
-     abovePIDColour.setText("Above % Identity");
+     abovePIDColour.setText(MessageManager.getString("label.above_identity_percentage"));\r
 -    abovePIDColour.addActionListener(new java.awt.event.ActionListener()\r
 -    {\r
 -      public void actionPerformed(ActionEvent e)\r
 -      {\r
 -        abovePIDColour_actionPerformed();\r
 -      }\r
 -    });\r
 +    abovePIDColour.addActionListener(new java.awt.event.ActionListener()
 +    {
 +      public void actionPerformed(ActionEvent e)
 +      {
 +        abovePIDColour_actionPerformed();
 +      }
 +    });
-     userDefinedColour.setText("User Defined...");
+     userDefinedColour.setText(MessageManager.getString("action.user_defined"));\r
 -    userDefinedColour.addActionListener(new java.awt.event.ActionListener()\r
 -    {\r
 -      public void actionPerformed(ActionEvent e)\r
 -      {\r
 -        userDefinedColour_actionPerformed(e);\r
 -      }\r
 -    });\r
 +    userDefinedColour.addActionListener(new java.awt.event.ActionListener()
 +    {
 +      public void actionPerformed(ActionEvent e)
 +      {
 +        userDefinedColour_actionPerformed(e);
 +      }
 +    });
-     PIDColour.setText("Percentage Identity");
+     PIDColour.setText(MessageManager.getString("label.percentage_identity"));\r
 -    PIDColour.addActionListener(new java.awt.event.ActionListener()\r
 -    {\r
 -      public void actionPerformed(ActionEvent e)\r
 -      {\r
 -        PIDColour_actionPerformed();\r
 -      }\r
 -    });\r
 +    PIDColour.addActionListener(new java.awt.event.ActionListener()
 +    {
 +      public void actionPerformed(ActionEvent e)
 +      {
 +        PIDColour_actionPerformed();
 +      }
 +    });
-     BLOSUM62Colour.setText("BLOSUM62");
+     BLOSUM62Colour.setText(MessageManager.getString("label.blosum62"));\r
 -    BLOSUM62Colour.addActionListener(new java.awt.event.ActionListener()\r
 -    {\r
 -      public void actionPerformed(ActionEvent e)\r
 -      {\r
 -        BLOSUM62Colour_actionPerformed();\r
 -      }\r
 -    });\r
 +    BLOSUM62Colour.addActionListener(new java.awt.event.ActionListener()
 +    {
 +      public void actionPerformed(ActionEvent e)
 +      {
 +        BLOSUM62Colour_actionPerformed();
 +      }
 +    });
-     purinePyrimidineColour.setText("Purine/Pyrimidine");
+     purinePyrimidineColour.setText(MessageManager.getString("label.purine_pyrimidine"));\r
 -    purinePyrimidineColour\r
 -            .addActionListener(new java.awt.event.ActionListener()\r
 -            {\r
 -              public void actionPerformed(ActionEvent e)\r
 -              {\r
 -                purinePyrimidineColour_actionPerformed();\r
 -              }\r
 -            });\r
 -    /*\r
 -     * covariationColour.addActionListener(new java.awt.event.ActionListener() {\r
 -     * public void actionPerformed(ActionEvent e) {\r
 -     * covariationColour_actionPerformed(); } });\r
 -     */\r
 -\r
 +    purinePyrimidineColour
 +            .addActionListener(new java.awt.event.ActionListener()
 +            {
 +              public void actionPerformed(ActionEvent e)
 +              {
 +                purinePyrimidineColour_actionPerformed();
 +              }
 +            });
 +    /*
 +     * covariationColour.addActionListener(new java.awt.event.ActionListener() {
 +     * public void actionPerformed(ActionEvent e) {
 +     * covariationColour_actionPerformed(); } });
 +     */
 +
-     conservationMenuItem.setText("Conservation");
+     conservationMenuItem.setText(MessageManager.getString("label.conservation"));\r
 -    conservationMenuItem\r
 -            .addActionListener(new java.awt.event.ActionListener()\r
 -            {\r
 -              public void actionPerformed(ActionEvent e)\r
 -              {\r
 -                conservationMenuItem_actionPerformed();\r
 -              }\r
 -            });\r
 -  }\r
 -\r
 -  protected void sequenceSelectionDetails_actionPerformed()\r
 -  {\r
 -    createSequenceDetailsReport(ap.av.getSequenceSelection());\r
 -  }\r
 -\r
 -  protected void sequenceDetails_actionPerformed()\r
 -  {\r
 -    createSequenceDetailsReport(new SequenceI[]\r
 -    { sequence });\r
 -  }\r
 -\r
 -  public void createSequenceDetailsReport(SequenceI[] sequences)\r
 -  {\r
 -    CutAndPasteHtmlTransfer cap = new CutAndPasteHtmlTransfer();\r
 -    StringBuffer contents = new StringBuffer();\r
 -    for (SequenceI seq : sequences)\r
 -    {         \r
 +    conservationMenuItem
 +            .addActionListener(new java.awt.event.ActionListener()
 +            {
 +              public void actionPerformed(ActionEvent e)
 +              {
 +                conservationMenuItem_actionPerformed();
 +              }
 +            });
 +  }
 +
 +  protected void sequenceSelectionDetails_actionPerformed()
 +  {
 +    createSequenceDetailsReport(ap.av.getSequenceSelection());
 +  }
 +
 +  protected void sequenceDetails_actionPerformed()
 +  {
 +    createSequenceDetailsReport(new SequenceI[]
 +    { sequence });
 +  }
 +
 +  public void createSequenceDetailsReport(SequenceI[] sequences)
 +  {
 +    CutAndPasteHtmlTransfer cap = new CutAndPasteHtmlTransfer();
 +    StringBuffer contents = new StringBuffer();
 +    for (SequenceI seq : sequences)
 +    {
-       contents.append("<p><h2>Annotation for " + seq.getDisplayId(true)
+       contents.append("<p><h2>" + MessageManager.formatMessage("label.create_sequence_details_report_annotation_for", new String[]{seq.getDisplayId(true)})\r
 -              + "</h2></p><p>");\r
 -      new SequenceAnnotationReport(null)\r
 -              .createSequenceAnnotationReport(\r
 -                      contents,\r
 -                      seq,\r
 -                      true,\r
 -                      true,\r
 -                      false,\r
 -                      (ap.seqPanel.seqCanvas.fr != null) ? ap.seqPanel.seqCanvas.fr.minmax\r
 -                              : null);\r
 -      contents.append("</p>");\r
 -    }\r
 -    cap.setText("<html>" + contents.toString() + "</html>");\r
 -\r
 +              + "</h2></p><p>");
 +      new SequenceAnnotationReport(null)
 +              .createSequenceAnnotationReport(
 +                      contents,
 +                      seq,
 +                      true,
 +                      true,
 +                      false,
 +                      (ap.seqPanel.seqCanvas.fr != null) ? ap.seqPanel.seqCanvas.fr.minmax
 +                              : null);
 +      contents.append("</p>");
 +    }
 +    cap.setText("<html>" + contents.toString() + "</html>");
 +
-     Desktop.instance.addInternalFrame(cap, "Sequence Details for "
-             + (sequences.length == 1 ? sequences[0].getDisplayId(true)
-                     : "Selection"), 500, 400);
+     Desktop.instance.addInternalFrame(cap, MessageManager.formatMessage("label.sequece_details_for", (sequences.length == 1 ? new String[]{sequences[0].getDisplayId(true)}: new String[]{MessageManager.getString("label.selection")}))\r
+               ,500, 400);\r
 -\r
 -  }\r
 -\r
 -  protected void showNonconserved_actionPerformed()\r
 -  {\r
 -    getGroup().setShowNonconserved(displayNonconserved.isSelected());\r
 -    refresh();\r
 -  }\r
 -\r
 -  /**\r
 -   * call to refresh view after settings change\r
 -   */\r
 -  void refresh()\r
 -  {\r
 -    ap.updateAnnotation();\r
 -    ap.paintAlignment(true);\r
 -\r
 -    PaintRefresher.Refresh(this, ap.av.getSequenceSetId());\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  protected void clustalColour_actionPerformed()\r
 -  {\r
 -    SequenceGroup sg = getGroup();\r
 -    sg.cs = new ClustalxColourScheme(sg, ap.av.getHiddenRepSequences());\r
 -    refresh();\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  protected void zappoColour_actionPerformed()\r
 -  {\r
 -    getGroup().cs = new ZappoColourScheme();\r
 -    refresh();\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  protected void taylorColour_actionPerformed()\r
 -  {\r
 -    getGroup().cs = new TaylorColourScheme();\r
 -    refresh();\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  protected void hydrophobicityColour_actionPerformed()\r
 -  {\r
 -    getGroup().cs = new HydrophobicColourScheme();\r
 -    refresh();\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  protected void helixColour_actionPerformed()\r
 -  {\r
 -    getGroup().cs = new HelixColourScheme();\r
 -    refresh();\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  protected void strandColour_actionPerformed()\r
 -  {\r
 -    getGroup().cs = new StrandColourScheme();\r
 -    refresh();\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  protected void turnColour_actionPerformed()\r
 -  {\r
 -    getGroup().cs = new TurnColourScheme();\r
 -    refresh();\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  protected void buriedColour_actionPerformed()\r
 -  {\r
 -    getGroup().cs = new BuriedColourScheme();\r
 -    refresh();\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  public void nucleotideMenuItem_actionPerformed()\r
 -  {\r
 -    getGroup().cs = new NucleotideColourScheme();\r
 -    refresh();\r
 -  }\r
 -\r
 -  protected void purinePyrimidineColour_actionPerformed()\r
 -  {\r
 -    getGroup().cs = new PurinePyrimidineColourScheme();\r
 -    refresh();\r
 -  }\r
 -\r
 -  /*\r
 -   * protected void covariationColour_actionPerformed() { getGroup().cs = new\r
 -   * CovariationColourScheme(sequence.getAnnotation()[0]); refresh(); }\r
 -   */\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  protected void abovePIDColour_actionPerformed()\r
 -  {\r
 -    SequenceGroup sg = getGroup();\r
 -    if (sg.cs == null)\r
 -    {\r
 -      return;\r
 -    }\r
 -\r
 -    if (abovePIDColour.isSelected())\r
 -    {\r
 -      sg.cs.setConsensus(AAFrequency.calculate(\r
 -              sg.getSequences(ap.av.getHiddenRepSequences()),\r
 -              sg.getStartRes(), sg.getEndRes() + 1));\r
 -\r
 -      int threshold = SliderPanel.setPIDSliderSource(ap, sg.cs, getGroup()\r
 -              .getName());\r
 -\r
 -      sg.cs.setThreshold(threshold, ap.av.getIgnoreGapsConsensus());\r
 -\r
 -      SliderPanel.showPIDSlider();\r
 -    }\r
 -    else\r
 -    // remove PIDColouring\r
 -    {\r
 -      sg.cs.setThreshold(0, ap.av.getIgnoreGapsConsensus());\r
 -    }\r
 -\r
 -    refresh();\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  protected void userDefinedColour_actionPerformed(ActionEvent e)\r
 -  {\r
 -    SequenceGroup sg = getGroup();\r
 -\r
 +
 +  }
 +
 +  protected void showNonconserved_actionPerformed()
 +  {
 +    getGroup().setShowNonconserved(displayNonconserved.isSelected());
 +    refresh();
 +  }
 +
 +  /**
 +   * call to refresh view after settings change
 +   */
 +  void refresh()
 +  {
 +    ap.updateAnnotation();
 +    ap.paintAlignment(true);
 +
 +    PaintRefresher.Refresh(this, ap.av.getSequenceSetId());
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  protected void clustalColour_actionPerformed()
 +  {
 +    SequenceGroup sg = getGroup();
 +    sg.cs = new ClustalxColourScheme(sg, ap.av.getHiddenRepSequences());
 +    refresh();
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  protected void zappoColour_actionPerformed()
 +  {
 +    getGroup().cs = new ZappoColourScheme();
 +    refresh();
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  protected void taylorColour_actionPerformed()
 +  {
 +    getGroup().cs = new TaylorColourScheme();
 +    refresh();
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  protected void hydrophobicityColour_actionPerformed()
 +  {
 +    getGroup().cs = new HydrophobicColourScheme();
 +    refresh();
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  protected void helixColour_actionPerformed()
 +  {
 +    getGroup().cs = new HelixColourScheme();
 +    refresh();
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  protected void strandColour_actionPerformed()
 +  {
 +    getGroup().cs = new StrandColourScheme();
 +    refresh();
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  protected void turnColour_actionPerformed()
 +  {
 +    getGroup().cs = new TurnColourScheme();
 +    refresh();
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  protected void buriedColour_actionPerformed()
 +  {
 +    getGroup().cs = new BuriedColourScheme();
 +    refresh();
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  public void nucleotideMenuItem_actionPerformed()
 +  {
 +    getGroup().cs = new NucleotideColourScheme();
 +    refresh();
 +  }
 +
 +  protected void purinePyrimidineColour_actionPerformed()
 +  {
 +    getGroup().cs = new PurinePyrimidineColourScheme();
 +    refresh();
 +  }
 +
 +  /*
 +   * protected void covariationColour_actionPerformed() { getGroup().cs = new
 +   * CovariationColourScheme(sequence.getAnnotation()[0]); refresh(); }
 +   */
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  protected void abovePIDColour_actionPerformed()
 +  {
 +    SequenceGroup sg = getGroup();
 +    if (sg.cs == null)
 +    {
 +      return;
 +    }
 +
 +    if (abovePIDColour.isSelected())
 +    {
 +      sg.cs.setConsensus(AAFrequency.calculate(
 +              sg.getSequences(ap.av.getHiddenRepSequences()),
 +              sg.getStartRes(), sg.getEndRes() + 1));
 +
 +      int threshold = SliderPanel.setPIDSliderSource(ap, sg.cs, getGroup()
 +              .getName());
 +
 +      sg.cs.setThreshold(threshold, ap.av.getIgnoreGapsConsensus());
 +
 +      SliderPanel.showPIDSlider();
 +    }
 +    else
 +    // remove PIDColouring
 +    {
 +      sg.cs.setThreshold(0, ap.av.getIgnoreGapsConsensus());
 +    }
 +
 +    refresh();
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  protected void userDefinedColour_actionPerformed(ActionEvent e)
 +  {
 +    SequenceGroup sg = getGroup();
 +
-     if (e.getActionCommand().equals("User Defined..."))
+     if (e.getSource().equals(userDefinedColour))\r
 -    {\r
 -      new UserDefinedColours(ap, sg);\r
 -    }\r
 -    else\r
 -    {\r
 -      UserColourScheme udc = (UserColourScheme) UserDefinedColours\r
 -              .getUserColourSchemes().get(e.getActionCommand());\r
 -\r
 -      sg.cs = udc;\r
 -    }\r
 -    refresh();\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  protected void PIDColour_actionPerformed()\r
 -  {\r
 -    SequenceGroup sg = getGroup();\r
 -    sg.cs = new PIDColourScheme();\r
 -    sg.cs.setConsensus(AAFrequency.calculate(\r
 -            sg.getSequences(ap.av.getHiddenRepSequences()),\r
 -            sg.getStartRes(), sg.getEndRes() + 1));\r
 -    refresh();\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  protected void BLOSUM62Colour_actionPerformed()\r
 -  {\r
 -    SequenceGroup sg = getGroup();\r
 -\r
 -    sg.cs = new Blosum62ColourScheme();\r
 -\r
 -    sg.cs.setConsensus(AAFrequency.calculate(\r
 -            sg.getSequences(ap.av.getHiddenRepSequences()),\r
 -            sg.getStartRes(), sg.getEndRes() + 1));\r
 -\r
 -    refresh();\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  protected void noColourmenuItem_actionPerformed()\r
 -  {\r
 -    getGroup().cs = null;\r
 -    refresh();\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  protected void conservationMenuItem_actionPerformed()\r
 -  {\r
 -    SequenceGroup sg = getGroup();\r
 -    if (sg.cs == null)\r
 -    {\r
 -      return;\r
 -    }\r
 -\r
 -    if (conservationMenuItem.isSelected())\r
 -    {\r
 -      Conservation c = new Conservation(MessageManager.getString("label.group"),\r
 -              ResidueProperties.propHash, 3, sg.getSequences(ap.av\r
 -                      .getHiddenRepSequences()), sg.getStartRes(),\r
 -              sg.getEndRes() + 1);\r
 -\r
 -      c.calculate();\r
 -      c.verdict(false, ap.av.getConsPercGaps());\r
 -\r
 -      sg.cs.setConservation(c);\r
 -\r
 -      SliderPanel.setConservationSlider(ap, sg.cs, sg.getName());\r
 -      SliderPanel.showConservationSlider();\r
 -    }\r
 -    else\r
 -    // remove ConservationColouring\r
 -    {\r
 -      sg.cs.setConservation(null);\r
 -    }\r
 -\r
 -    refresh();\r
 -  }\r
 -\r
 -  public void annotationMenuItem_actionPerformed(ActionEvent actionEvent)\r
 -  {\r
 -    SequenceGroup sg = getGroup();\r
 -    if (sg == null)\r
 -    {\r
 -      return;\r
 -    }\r
 -\r
 -    AnnotationColourGradient acg = new AnnotationColourGradient(\r
 -            sequence.getAnnotation()[0], null,\r
 -            AnnotationColourGradient.NO_THRESHOLD);\r
 -\r
 -    acg.setPredefinedColours(true);\r
 -    sg.cs = acg;\r
 -\r
 -    refresh();\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  protected void groupName_actionPerformed()\r
 -  {\r
 -\r
 -    SequenceGroup sg = getGroup();\r
 -    EditNameDialog dialog = new EditNameDialog(sg.getName(),\r
 +    {
 +      new UserDefinedColours(ap, sg);
 +    }
 +    else
 +    {
 +      UserColourScheme udc = (UserColourScheme) UserDefinedColours
 +              .getUserColourSchemes().get(e.getActionCommand());
 +
 +      sg.cs = udc;
 +    }
 +    refresh();
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  protected void PIDColour_actionPerformed()
 +  {
 +    SequenceGroup sg = getGroup();
 +    sg.cs = new PIDColourScheme();
 +    sg.cs.setConsensus(AAFrequency.calculate(
 +            sg.getSequences(ap.av.getHiddenRepSequences()),
 +            sg.getStartRes(), sg.getEndRes() + 1));
 +    refresh();
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  protected void BLOSUM62Colour_actionPerformed()
 +  {
 +    SequenceGroup sg = getGroup();
 +
 +    sg.cs = new Blosum62ColourScheme();
 +
 +    sg.cs.setConsensus(AAFrequency.calculate(
 +            sg.getSequences(ap.av.getHiddenRepSequences()),
 +            sg.getStartRes(), sg.getEndRes() + 1));
 +
 +    refresh();
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  protected void noColourmenuItem_actionPerformed()
 +  {
 +    getGroup().cs = null;
 +    refresh();
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  protected void conservationMenuItem_actionPerformed()
 +  {
 +    SequenceGroup sg = getGroup();
 +    if (sg.cs == null)
 +    {
 +      return;
 +    }
 +
 +    if (conservationMenuItem.isSelected())
 +    {
++    // JBPNote: Conservation name shouldn't be i18n translated
 +      Conservation c = new Conservation("Group",
 +              ResidueProperties.propHash, 3, sg.getSequences(ap.av
 +                      .getHiddenRepSequences()), sg.getStartRes(),
 +              sg.getEndRes() + 1);
 +
 +      c.calculate();
 +      c.verdict(false, ap.av.getConsPercGaps());
 +
 +      sg.cs.setConservation(c);
 +
 +      SliderPanel.setConservationSlider(ap, sg.cs, sg.getName());
 +      SliderPanel.showConservationSlider();
 +    }
 +    else
 +    // remove ConservationColouring
 +    {
 +      sg.cs.setConservation(null);
 +    }
 +
 +    refresh();
 +  }
 +
 +  public void annotationMenuItem_actionPerformed(ActionEvent actionEvent)
 +  {
 +    SequenceGroup sg = getGroup();
 +    if (sg == null)
 +    {
 +      return;
 +    }
 +
 +    AnnotationColourGradient acg = new AnnotationColourGradient(
 +            sequence.getAnnotation()[0], null,
 +            AnnotationColourGradient.NO_THRESHOLD);
 +
 +    acg.setPredefinedColours(true);
 +    sg.cs = acg;
 +
 +    refresh();
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  protected void groupName_actionPerformed()
 +  {
 +
 +    SequenceGroup sg = getGroup();
 +    EditNameDialog dialog = new EditNameDialog(sg.getName(),
-             sg.getDescription(), "       Group Name ",
-             "Group Description ", "Edit Group Name/Description",
+             sg.getDescription(), "       " + MessageManager.getString("label.group_name") + " ",\r
+             MessageManager.getString("label.group_description") + " ", MessageManager.getString("label.edit_group_name_description"),\r
 -            ap.alignFrame);\r
 -\r
 -    if (!dialog.accept)\r
 -    {\r
 -      return;\r
 -    }\r
 -\r
 -    sg.setName(dialog.getName());\r
 -    sg.setDescription(dialog.getDescription());\r
 -    refresh();\r
 -  }\r
 -\r
 -  /**\r
 -   * Get selection group - adding it to the alignment if necessary.\r
 -   * \r
 -   * @return sequence group to operate on\r
 -   */\r
 -  SequenceGroup getGroup()\r
 -  {\r
 -    SequenceGroup sg = ap.av.getSelectionGroup();\r
 -    // this method won't add a new group if it already exists\r
 -    if (sg != null)\r
 -    {\r
 -      ap.av.getAlignment().addGroup(sg);\r
 -    }\r
 -\r
 -    return sg;\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  void sequenceName_actionPerformed()\r
 -  {\r
 -    EditNameDialog dialog = new EditNameDialog(sequence.getName(),\r
 +            ap.alignFrame);
 +
 +    if (!dialog.accept)
 +    {
 +      return;
 +    }
 +
 +    sg.setName(dialog.getName());
 +    sg.setDescription(dialog.getDescription());
 +    refresh();
 +  }
 +
 +  /**
 +   * Get selection group - adding it to the alignment if necessary.
 +   * 
 +   * @return sequence group to operate on
 +   */
 +  SequenceGroup getGroup()
 +  {
 +    SequenceGroup sg = ap.av.getSelectionGroup();
 +    // this method won't add a new group if it already exists
 +    if (sg != null)
 +    {
 +      ap.av.getAlignment().addGroup(sg);
 +    }
 +
 +    return sg;
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  void sequenceName_actionPerformed()
 +  {
 +    EditNameDialog dialog = new EditNameDialog(sequence.getName(),
-             sequence.getDescription(), "       Sequence Name ",
-             "Sequence Description ", "Edit Sequence Name/Description",
+             sequence.getDescription(), "       " + MessageManager.getString("label.sequence_name") + " ",\r
+             MessageManager.getString("label.sequence_description") + " ", MessageManager.getString("label.edit_sequence_name_description"),\r
 -            ap.alignFrame);\r
 -\r
 -    if (!dialog.accept)\r
 -    {\r
 -      return;\r
 -    }\r
 -\r
 -    if (dialog.getName() != null)\r
 -    {\r
 -      if (dialog.getName().indexOf(" ") > -1)\r
 -      {\r
 -        JOptionPane.showMessageDialog(ap,\r
 +            ap.alignFrame);
 +
 +    if (!dialog.accept)
 +    {
 +      return;
 +    }
 +
 +    if (dialog.getName() != null)
 +    {
 +      if (dialog.getName().indexOf(" ") > -1)
 +      {
 +        JOptionPane.showMessageDialog(ap,
-                 "Spaces have been converted to \"_\"",
-                 "No spaces allowed in Sequence Name",
+                 MessageManager.getString("label.spaces_converted_to_backslashes"),\r
+                 MessageManager.getString("label.no_spaces_allowed_sequence_name"),\r
 -                JOptionPane.WARNING_MESSAGE);\r
 -      }\r
 -\r
 -      sequence.setName(dialog.getName().replace(' ', '_'));\r
 -      ap.paintAlignment(false);\r
 -    }\r
 -\r
 -    sequence.setDescription(dialog.getDescription());\r
 -\r
 -    ap.av.firePropertyChange("alignment", null, ap.av.getAlignment()\r
 -            .getSequences());\r
 -\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  void unGroupMenuItem_actionPerformed()\r
 -  {\r
 -    SequenceGroup sg = ap.av.getSelectionGroup();\r
 -    ap.av.getAlignment().deleteGroup(sg);\r
 -    ap.av.setSelectionGroup(null);\r
 -    refresh();\r
 -  }\r
 -  void createGroupMenuItem_actionPerformed()\r
 -  {\r
 -    getGroup(); // implicitly creates group - note - should apply defaults / use standard alignment window logic for this\r
 -    refresh();\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  protected void outline_actionPerformed()\r
 -  {\r
 -    SequenceGroup sg = getGroup();\r
 +                JOptionPane.WARNING_MESSAGE);
 +      }
 +
 +      sequence.setName(dialog.getName().replace(' ', '_'));
 +      ap.paintAlignment(false);
 +    }
 +
 +    sequence.setDescription(dialog.getDescription());
 +
 +    ap.av.firePropertyChange("alignment", null, ap.av.getAlignment()
 +            .getSequences());
 +
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  void unGroupMenuItem_actionPerformed()
 +  {
 +    SequenceGroup sg = ap.av.getSelectionGroup();
 +    ap.av.getAlignment().deleteGroup(sg);
 +    ap.av.setSelectionGroup(null);
 +    refresh();
 +  }
 +  void createGroupMenuItem_actionPerformed()
 +  {
 +    getGroup(); // implicitly creates group - note - should apply defaults / use standard alignment window logic for this
 +    refresh();
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  protected void outline_actionPerformed()
 +  {
 +    SequenceGroup sg = getGroup();
-     Color col = JColorChooser.showDialog(this, "Select Outline Colour",
+     Color col = JColorChooser.showDialog(this, MessageManager.getString("label.select_outline_colour"),\r
 -            Color.BLUE);\r
 -\r
 -    if (col != null)\r
 -    {\r
 -      sg.setOutlineColour(col);\r
 -    }\r
 -\r
 -    refresh();\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  public void showBoxes_actionPerformed()\r
 -  {\r
 -    getGroup().setDisplayBoxes(showBoxes.isSelected());\r
 -    refresh();\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  public void showText_actionPerformed()\r
 -  {\r
 -    getGroup().setDisplayText(showText.isSelected());\r
 -    refresh();\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  public void showColourText_actionPerformed()\r
 -  {\r
 -    getGroup().setColourText(showColourText.isSelected());\r
 -    refresh();\r
 -  }\r
 -\r
 -  public void showLink(String url)\r
 -  {\r
 -    try\r
 -    {\r
 -      jalview.util.BrowserLauncher.openURL(url);\r
 -    } catch (Exception ex)\r
 -    {\r
 -      JOptionPane\r
 -              .showInternalMessageDialog(\r
 -                      Desktop.desktop,\r
 +            Color.BLUE);
 +
 +    if (col != null)
 +    {
 +      sg.setOutlineColour(col);
 +    }
 +
 +    refresh();
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  public void showBoxes_actionPerformed()
 +  {
 +    getGroup().setDisplayBoxes(showBoxes.isSelected());
 +    refresh();
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  public void showText_actionPerformed()
 +  {
 +    getGroup().setDisplayText(showText.isSelected());
 +    refresh();
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  public void showColourText_actionPerformed()
 +  {
 +    getGroup().setColourText(showColourText.isSelected());
 +    refresh();
 +  }
 +
 +  public void showLink(String url)
 +  {
 +    try
 +    {
 +      jalview.util.BrowserLauncher.openURL(url);
 +    } catch (Exception ex)
 +    {
 +      JOptionPane
 +              .showInternalMessageDialog(
 +                      Desktop.desktop,
-                       "Unixers: Couldn't find default web browser."
-                               + "\nAdd the full path to your browser in Preferences.",
-                       "Web browser not found", JOptionPane.WARNING_MESSAGE);
+                       MessageManager.getString("label.web_browser_not_found_unix"),\r
+                       MessageManager.getString("label.web_browser_not_found"), JOptionPane.WARNING_MESSAGE);\r
 -\r
 -      ex.printStackTrace();\r
 -    }\r
 -  }\r
 -\r
 -  void hideSequences(boolean representGroup)\r
 -  {\r
 -    SequenceGroup sg = ap.av.getSelectionGroup();\r
 -    if (sg == null || sg.getSize() < 1)\r
 -    {\r
 -      ap.av.hideSequence(new SequenceI[]\r
 -      { sequence });\r
 -      return;\r
 -    }\r
 -\r
 -    ap.av.setSelectionGroup(null);\r
 -\r
 -    if (representGroup)\r
 -    {\r
 -      ap.av.hideRepSequences(sequence, sg);\r
 -\r
 -      return;\r
 -    }\r
 -\r
 -    int gsize = sg.getSize();\r
 -    SequenceI[] hseqs;\r
 -\r
 -    hseqs = new SequenceI[gsize];\r
 -\r
 -    int index = 0;\r
 -    for (int i = 0; i < gsize; i++)\r
 -    {\r
 -      hseqs[index++] = sg.getSequenceAt(i);\r
 -    }\r
 -\r
 -    ap.av.hideSequence(hseqs);\r
 -    // refresh(); TODO: ? needed ?\r
 -    ap.av.sendSelection();\r
 -  }\r
 -\r
 -  public void copy_actionPerformed()\r
 -  {\r
 -    ap.alignFrame.copy_actionPerformed(null);\r
 -  }\r
 -\r
 -  public void cut_actionPerformed()\r
 -  {\r
 -    ap.alignFrame.cut_actionPerformed(null);\r
 -  }\r
 -\r
 -  void changeCase(ActionEvent e)\r
 -  {\r
 -    Object source = e.getSource();\r
 -    SequenceGroup sg = ap.av.getSelectionGroup();\r
 -\r
 -    if (sg != null)\r
 -    {\r
 -      int[][] startEnd = ap.av.getVisibleRegionBoundaries(sg.getStartRes(),\r
 -              sg.getEndRes() + 1);\r
 -\r
 -      String description;\r
 -      int caseChange;\r
 -\r
 -      if (source == toggle)\r
 -      {\r
 +
 +      ex.printStackTrace();
 +    }
 +  }
 +
 +  void hideSequences(boolean representGroup)
 +  {
 +    SequenceGroup sg = ap.av.getSelectionGroup();
 +    if (sg == null || sg.getSize() < 1)
 +    {
 +      ap.av.hideSequence(new SequenceI[]
 +      { sequence });
 +      return;
 +    }
 +
 +    ap.av.setSelectionGroup(null);
 +
 +    if (representGroup)
 +    {
 +      ap.av.hideRepSequences(sequence, sg);
 +
 +      return;
 +    }
 +
 +    int gsize = sg.getSize();
 +    SequenceI[] hseqs;
 +
 +    hseqs = new SequenceI[gsize];
 +
 +    int index = 0;
 +    for (int i = 0; i < gsize; i++)
 +    {
 +      hseqs[index++] = sg.getSequenceAt(i);
 +    }
 +
 +    ap.av.hideSequence(hseqs);
 +    // refresh(); TODO: ? needed ?
 +    ap.av.sendSelection();
 +  }
 +
 +  public void copy_actionPerformed()
 +  {
 +    ap.alignFrame.copy_actionPerformed(null);
 +  }
 +
 +  public void cut_actionPerformed()
 +  {
 +    ap.alignFrame.cut_actionPerformed(null);
 +  }
 +
 +  void changeCase(ActionEvent e)
 +  {
 +    Object source = e.getSource();
 +    SequenceGroup sg = ap.av.getSelectionGroup();
 +
 +    if (sg != null)
 +    {
 +      int[][] startEnd = ap.av.getVisibleRegionBoundaries(sg.getStartRes(),
 +              sg.getEndRes() + 1);
 +
 +      String description;
 +      int caseChange;
 +
 +      if (source == toggle)
 +      {
-         description = "Toggle Case";
+         description = MessageManager.getString("label.toggle_case");\r
 -        caseChange = ChangeCaseCommand.TOGGLE_CASE;\r
 -      }\r
 -      else if (source == upperCase)\r
 -      {\r
 +        caseChange = ChangeCaseCommand.TOGGLE_CASE;
 +      }
 +      else if (source == upperCase)
 +      {
-         description = "To Upper Case";
+         description = MessageManager.getString("label.to_upper_case");\r
 -        caseChange = ChangeCaseCommand.TO_UPPER;\r
 -      }\r
 -      else\r
 -      {\r
 +        caseChange = ChangeCaseCommand.TO_UPPER;
 +      }
 +      else
 +      {
-         description = "To Lower Case";
+         description = MessageManager.getString("label.to_lower_case");\r
 -        caseChange = ChangeCaseCommand.TO_LOWER;\r
 -      }\r
 -\r
 -      ChangeCaseCommand caseCommand = new ChangeCaseCommand(description,\r
 -              sg.getSequencesAsArray(ap.av.getHiddenRepSequences()),\r
 -              startEnd, caseChange);\r
 -\r
 -      ap.alignFrame.addHistoryItem(caseCommand);\r
 -\r
 -      ap.av.firePropertyChange("alignment", null, ap.av.getAlignment()\r
 -              .getSequences());\r
 -\r
 -    }\r
 -  }\r
 -\r
 -  public void outputText_actionPerformed(ActionEvent e)\r
 -  {\r
 -    CutAndPasteTransfer cap = new CutAndPasteTransfer();\r
 -    cap.setForInput(null);\r
 -    Desktop.addInternalFrame(cap,\r
 +        caseChange = ChangeCaseCommand.TO_LOWER;
 +      }
 +
 +      ChangeCaseCommand caseCommand = new ChangeCaseCommand(description,
 +              sg.getSequencesAsArray(ap.av.getHiddenRepSequences()),
 +              startEnd, caseChange);
 +
 +      ap.alignFrame.addHistoryItem(caseCommand);
 +
 +      ap.av.firePropertyChange("alignment", null, ap.av.getAlignment()
 +              .getSequences());
 +
 +    }
 +  }
 +
 +  public void outputText_actionPerformed(ActionEvent e)
 +  {
 +    CutAndPasteTransfer cap = new CutAndPasteTransfer();
 +    cap.setForInput(null);
 +    Desktop.addInternalFrame(cap,
-             "Alignment output - " + e.getActionCommand(), 600, 500);
+             MessageManager.formatMessage("label.alignment_output_command", new String[]{e.getActionCommand()}), 600, 500);\r
 -\r
 -    String[] omitHidden = null;\r
 -\r
 -    System.out.println("PROMPT USER HERE"); // TODO: decide if a prompt happens\r
 -    // or we simply trust the user wants\r
 -    // wysiwig behaviour\r
 -    SequenceGroup sg = ap.av.getSelectionGroup();\r
 -    ColumnSelection csel = new ColumnSelection(ap.av.getColumnSelection());\r
 -    omitHidden = ap.av.getViewAsString(true);\r
 -    Alignment oal = new Alignment(ap.av.getSequenceSelection());\r
 -    AlignmentAnnotation[] nala = ap.av.getAlignment()\r
 -            .getAlignmentAnnotation();\r
 -    if (nala != null)\r
 -    {\r
 -      for (int i = 0; i < nala.length; i++)\r
 -      {\r
 -        AlignmentAnnotation na = nala[i];\r
 -        oal.addAnnotation(na);\r
 -      }\r
 -    }\r
 -    cap.setText(new FormatAdapter().formatSequences(e.getActionCommand(),\r
 -            oal, omitHidden, csel, sg));\r
 -    oal = null;\r
 -  }\r
 -\r
 -  public void pdbFromFile_actionPerformed()\r
 -  {\r
 -    jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser(\r
 -            jalview.bin.Cache.getProperty("LAST_DIRECTORY"));\r
 -    chooser.setFileView(new jalview.io.JalviewFileView());\r
 +
 +    String[] omitHidden = null;
 +
 +    System.out.println("PROMPT USER HERE"); // TODO: decide if a prompt happens
 +    // or we simply trust the user wants
 +    // wysiwig behaviour
 +    SequenceGroup sg = ap.av.getSelectionGroup();
 +    ColumnSelection csel = new ColumnSelection(ap.av.getColumnSelection());
 +    omitHidden = ap.av.getViewAsString(true);
 +    Alignment oal = new Alignment(ap.av.getSequenceSelection());
 +    AlignmentAnnotation[] nala = ap.av.getAlignment()
 +            .getAlignmentAnnotation();
 +    if (nala != null)
 +    {
 +      for (int i = 0; i < nala.length; i++)
 +      {
 +        AlignmentAnnotation na = nala[i];
 +        oal.addAnnotation(na);
 +      }
 +    }
 +    cap.setText(new FormatAdapter().formatSequences(e.getActionCommand(),
 +            oal, omitHidden, csel, sg));
 +    oal = null;
 +  }
 +
 +  public void pdbFromFile_actionPerformed()
 +  {
 +    jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser(
 +            jalview.bin.Cache.getProperty("LAST_DIRECTORY"));
 +    chooser.setFileView(new jalview.io.JalviewFileView());
-     chooser.setDialogTitle("Select a PDB file for "
-             + sequence.getDisplayId(false));
-     chooser.setToolTipText("Load a PDB file and associate it with sequence '"
-             + sequence.getDisplayId(false) + "'");
+     chooser.setDialogTitle(MessageManager.formatMessage("label.select_pdb_file_for", new String[]{sequence.getDisplayId(false)}));\r
+     chooser.setToolTipText(MessageManager.formatMessage("label.load_pdb_file_associate_with_sequence", new String[]{new Integer(sequence.getDisplayId(false)).toString()}));\r
 -\r
 -    int value = chooser.showOpenDialog(null);\r
 -\r
 -    if (value == jalview.io.JalviewFileChooser.APPROVE_OPTION)\r
 -    {\r
 -      String choice = chooser.getSelectedFile().getPath();\r
 -      jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);\r
 -      new AssociatePdbFileWithSeq().associatePdbWithSeq(choice,\r
 -              jalview.io.AppletFormatAdapter.FILE, sequence, true);\r
 -    }\r
 -\r
 -  }\r
 -\r
 -  public void enterPDB_actionPerformed()\r
 -  {\r
 -    String id = JOptionPane.showInternalInputDialog(Desktop.desktop,\r
 +
 +    int value = chooser.showOpenDialog(null);
 +
 +    if (value == jalview.io.JalviewFileChooser.APPROVE_OPTION)
 +    {
 +      String choice = chooser.getSelectedFile().getPath();
 +      jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice);
 +      new AssociatePdbFileWithSeq().associatePdbWithSeq(choice,
 +              jalview.io.AppletFormatAdapter.FILE, sequence, true);
 +    }
 +
 +  }
 +
 +  public void enterPDB_actionPerformed()
 +  {
 +    String id = JOptionPane.showInternalInputDialog(Desktop.desktop,
-             "Enter PDB Id", "Enter PDB Id", JOptionPane.QUESTION_MESSAGE);
+             MessageManager.getString("label.enter_pdb_id"), MessageManager.getString("label.enter_pdb_id"), JOptionPane.QUESTION_MESSAGE);\r
 -\r
 -    if (id != null && id.length() > 0)\r
 -    {\r
 -      PDBEntry entry = new PDBEntry();\r
 -      entry.setId(id.toUpperCase());\r
 -      sequence.getDatasetSequence().addPDBId(entry);\r
 -    }\r
 -  }\r
 -\r
 -  public void discoverPDB_actionPerformed()\r
 -  {\r
 -\r
 -    final SequenceI[] sequences = ((ap.av.getSelectionGroup() == null) ? new SequenceI[]\r
 -    { sequence }\r
 -            : ap.av.getSequenceSelection());\r
 -    Thread discpdb = new Thread(new Runnable()\r
 -    {\r
 -      public void run()\r
 -      {\r
 -\r
 -        new jalview.ws.DBRefFetcher(sequences, ap.alignFrame)\r
 -                .fetchDBRefs(false);\r
 -      }\r
 -\r
 -    });\r
 -    discpdb.start();\r
 -  }\r
 -\r
 -  public void sequenceFeature_actionPerformed()\r
 -  {\r
 -    SequenceGroup sg = ap.av.getSelectionGroup();\r
 -    if (sg == null)\r
 -    {\r
 -      return;\r
 -    }\r
 -\r
 -    int rsize = 0, gSize = sg.getSize();\r
 -    SequenceI[] rseqs, seqs = new SequenceI[gSize];\r
 -    SequenceFeature[] tfeatures, features = new SequenceFeature[gSize];\r
 -\r
 -    for (int i = 0; i < gSize; i++)\r
 -    {\r
 -      int start = sg.getSequenceAt(i).findPosition(sg.getStartRes());\r
 -      int end = sg.findEndRes(sg.getSequenceAt(i));\r
 -      if (start <= end)\r
 -      {\r
 -        seqs[rsize] = sg.getSequenceAt(i).getDatasetSequence();\r
 -        features[rsize] = new SequenceFeature(null, null, null, start, end,\r
 -                "Jalview");\r
 -        rsize++;\r
 -      }\r
 -    }\r
 -    rseqs = new SequenceI[rsize];\r
 -    tfeatures = new SequenceFeature[rsize];\r
 -    System.arraycopy(seqs, 0, rseqs, 0, rsize);\r
 -    System.arraycopy(features, 0, tfeatures, 0, rsize);\r
 -    features = tfeatures;\r
 -    seqs = rseqs;\r
 -    if (ap.seqPanel.seqCanvas.getFeatureRenderer().amendFeatures(seqs,\r
 -            features, true, ap))\r
 -    {\r
 -      ap.alignFrame.setShowSeqFeatures(true);\r
 -      ap.highlightSearchResults(null);\r
 -    }\r
 -  }\r
 -\r
 -  public void textColour_actionPerformed()\r
 -  {\r
 -    SequenceGroup sg = getGroup();\r
 -    if (sg != null)\r
 -    {\r
 -      new TextColourChooser().chooseColour(ap, sg);\r
 -    }\r
 -  }\r
 -\r
 -  public void colourByStructure(String pdbid)\r
 -  {\r
 -    Annotation[] anots = ap.av.getStructureSelectionManager()\r
 -            .colourSequenceFromStructure(sequence, pdbid);\r
 -\r
 -    AlignmentAnnotation an = new AlignmentAnnotation("Structure",\r
 -            "Coloured by " + pdbid, anots);\r
 -\r
 -    ap.av.getAlignment().addAnnotation(an);\r
 -    an.createSequenceMapping(sequence, 0, true);\r
 -    // an.adjustForAlignment();\r
 -    ap.av.getAlignment().setAnnotationIndex(an, 0);\r
 -\r
 -    ap.adjustAnnotationHeight();\r
 -\r
 -    sequence.addAlignmentAnnotation(an);\r
 -\r
 -  }\r
 -\r
 -  public void editSequence_actionPerformed(ActionEvent actionEvent)\r
 -  {\r
 -    SequenceGroup sg = ap.av.getSelectionGroup();\r
 -\r
 -    if (sg != null)\r
 -    {\r
 -      if (sequence == null)\r
 -        sequence = (Sequence) sg.getSequenceAt(0);\r
 -\r
 -      EditNameDialog dialog = new EditNameDialog(\r
 -              sequence.getSequenceAsString(sg.getStartRes(),\r
 +
 +    if (id != null && id.length() > 0)
 +    {
 +      PDBEntry entry = new PDBEntry();
 +      entry.setId(id.toUpperCase());
 +      sequence.getDatasetSequence().addPDBId(entry);
 +    }
 +  }
 +
 +  public void discoverPDB_actionPerformed()
 +  {
 +
 +    final SequenceI[] sequences = ((ap.av.getSelectionGroup() == null) ? new SequenceI[]
 +    { sequence }
 +            : ap.av.getSequenceSelection());
 +    Thread discpdb = new Thread(new Runnable()
 +    {
 +      public void run()
 +      {
 +
 +        new jalview.ws.DBRefFetcher(sequences, ap.alignFrame)
 +                .fetchDBRefs(false);
 +      }
 +
 +    });
 +    discpdb.start();
 +  }
 +
 +  public void sequenceFeature_actionPerformed()
 +  {
 +    SequenceGroup sg = ap.av.getSelectionGroup();
 +    if (sg == null)
 +    {
 +      return;
 +    }
 +
 +    int rsize = 0, gSize = sg.getSize();
 +    SequenceI[] rseqs, seqs = new SequenceI[gSize];
 +    SequenceFeature[] tfeatures, features = new SequenceFeature[gSize];
 +
 +    for (int i = 0; i < gSize; i++)
 +    {
 +      int start = sg.getSequenceAt(i).findPosition(sg.getStartRes());
 +      int end = sg.findEndRes(sg.getSequenceAt(i));
 +      if (start <= end)
 +      {
 +        seqs[rsize] = sg.getSequenceAt(i).getDatasetSequence();
 +        features[rsize] = new SequenceFeature(null, null, null, start, end,
 +                "Jalview");
 +        rsize++;
 +      }
 +    }
 +    rseqs = new SequenceI[rsize];
 +    tfeatures = new SequenceFeature[rsize];
 +    System.arraycopy(seqs, 0, rseqs, 0, rsize);
 +    System.arraycopy(features, 0, tfeatures, 0, rsize);
 +    features = tfeatures;
 +    seqs = rseqs;
 +    if (ap.seqPanel.seqCanvas.getFeatureRenderer().amendFeatures(seqs,
 +            features, true, ap))
 +    {
 +      ap.alignFrame.setShowSeqFeatures(true);
 +      ap.highlightSearchResults(null);
 +    }
 +  }
 +
 +  public void textColour_actionPerformed()
 +  {
 +    SequenceGroup sg = getGroup();
 +    if (sg != null)
 +    {
 +      new TextColourChooser().chooseColour(ap, sg);
 +    }
 +  }
 +
 +  public void colourByStructure(String pdbid)
 +  {
 +    Annotation[] anots = ap.av.getStructureSelectionManager()
 +            .colourSequenceFromStructure(sequence, pdbid);
 +
 +    AlignmentAnnotation an = new AlignmentAnnotation("Structure",
 +            "Coloured by " + pdbid, anots);
 +
 +    ap.av.getAlignment().addAnnotation(an);
 +    an.createSequenceMapping(sequence, 0, true);
 +    // an.adjustForAlignment();
 +    ap.av.getAlignment().setAnnotationIndex(an, 0);
 +
 +    ap.adjustAnnotationHeight();
 +
 +    sequence.addAlignmentAnnotation(an);
 +
 +  }
 +
 +  public void editSequence_actionPerformed(ActionEvent actionEvent)
 +  {
 +    SequenceGroup sg = ap.av.getSelectionGroup();
 +
 +    if (sg != null)
 +    {
 +      if (sequence == null)
 +        sequence = (Sequence) sg.getSequenceAt(0);
 +
 +      EditNameDialog dialog = new EditNameDialog(
 +              sequence.getSequenceAsString(sg.getStartRes(),
-                       sg.getEndRes() + 1), null, "Edit Sequence ", null,
-               "Edit Sequence", ap.alignFrame);
+                       sg.getEndRes() + 1), null, MessageManager.getString("label.edit_sequence"), null,\r
+                       MessageManager.getString("label.edit_sequence"), ap.alignFrame);\r
 -\r
 -      if (dialog.accept)\r
 -      {\r
 +
 +      if (dialog.accept)
 +      {
-         EditCommand editCommand = new EditCommand("Edit Sequences",
+         EditCommand editCommand = new EditCommand(MessageManager.getString("label.edit_sequences"),\r
 -                EditCommand.REPLACE, dialog.getName().replace(' ',\r
 -                        ap.av.getGapCharacter()),\r
 -                sg.getSequencesAsArray(ap.av.getHiddenRepSequences()),\r
 -                sg.getStartRes(), sg.getEndRes() + 1, ap.av.getAlignment());\r
 -\r
 -        ap.alignFrame.addHistoryItem(editCommand);\r
 -\r
 -        ap.av.firePropertyChange("alignment", null, ap.av.getAlignment()\r
 -                .getSequences());\r
 -      }\r
 -    }\r
 -  }\r
 -\r
 -}\r
 +                EditCommand.REPLACE, dialog.getName().replace(' ',
 +                        ap.av.getGapCharacter()),
 +                sg.getSequencesAsArray(ap.av.getHiddenRepSequences()),
 +                sg.getStartRes(), sg.getEndRes() + 1, ap.av.getAlignment());
 +
 +        ap.alignFrame.addHistoryItem(editCommand);
 +
 +        ap.av.firePropertyChange("alignment", null, ap.av.getAlignment()
 +                .getSequences());
 +      }
 +    }
 +  }
 +
 +}
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
 -/*\r
 - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8)\r
 - * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle\r
 - * \r
 - * This file is part of Jalview.\r
 - * \r
 - * Jalview is free software: you can redistribute it and/or\r
 - * modify it under the terms of the GNU General Public License \r
 - * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\r
 - *  \r
 - * Jalview is distributed in the hope that it will be useful, but \r
 - * WITHOUT ANY WARRANTY; without even the implied warranty \r
 - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR \r
 - * PURPOSE.  See the GNU General Public License for more details.\r
 - * \r
 - * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.\r
 - */\r
 -package jalview.gui;\r
 -\r
 -import jalview.datamodel.SequenceGroup;\r
 -import jalview.io.JalviewFileChooser;\r
 -import jalview.jbgui.GUserDefinedColours;\r
 -import jalview.schemes.ColourSchemeI;\r
 -import jalview.schemes.ResidueProperties;\r
 -import jalview.schemes.UserColourScheme;\r
 -import jalview.util.MessageManager;\r
 -\r
 -import java.awt.Color;\r
 -import java.awt.Font;\r
 -import java.awt.event.ActionEvent;\r
 -import java.awt.event.MouseEvent;\r
 -import java.io.File;\r
 -import java.io.FileInputStream;\r
 -import java.io.FileOutputStream;\r
 -import java.io.InputStreamReader;\r
 -import java.io.OutputStreamWriter;\r
 -import java.io.PrintWriter;\r
 -import java.util.Hashtable;\r
 -import java.util.StringTokenizer;\r
 -import java.util.Vector;\r
 -\r
 -import javax.swing.JButton;\r
 -import javax.swing.JInternalFrame;\r
 -import javax.swing.JOptionPane;\r
 -import javax.swing.event.ChangeEvent;\r
 -import javax.swing.event.ChangeListener;\r
 -\r
 -/**\r
 - * DOCUMENT ME!\r
 - * \r
 - * @author $author$\r
 - * @version $Revision$\r
 - */\r
 -public class UserDefinedColours extends GUserDefinedColours implements\r
 -        ChangeListener\r
 -{\r
 -  AlignmentPanel ap;\r
 -\r
 -  SequenceGroup seqGroup;\r
 -\r
 -  Vector selectedButtons;\r
 -\r
 -  ColourSchemeI oldColourScheme;\r
 -\r
 -  JInternalFrame frame;\r
 -\r
 -  AppJmol jmol;\r
 -\r
 -  Vector upperCaseButtons;\r
 -\r
 -  Vector lowerCaseButtons;\r
 -\r
 -  /**\r
 -   * Creates a new UserDefinedColours object.\r
 -   * \r
 -   * @param ap\r
 -   *          DOCUMENT ME!\r
 -   * @param sg\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  public UserDefinedColours(AlignmentPanel ap, SequenceGroup sg)\r
 -  {\r
 -    super();\r
 -\r
 -    lcaseColour.setEnabled(false);\r
 -\r
 -    this.ap = ap;\r
 -    seqGroup = sg;\r
 -\r
 -    if (seqGroup != null)\r
 -    {\r
 -      oldColourScheme = seqGroup.cs;\r
 -    }\r
 -    else\r
 -    {\r
 -      oldColourScheme = ap.av.getGlobalColourScheme();\r
 -    }\r
 -\r
 -    if (oldColourScheme instanceof UserColourScheme)\r
 -    {\r
 -      schemeName.setText(((UserColourScheme) oldColourScheme).getName());\r
 -      if (((UserColourScheme) oldColourScheme).getLowerCaseColours() != null)\r
 -      {\r
 -        caseSensitive.setSelected(true);\r
 -        lcaseColour.setEnabled(true);\r
 -        resetButtonPanel(true);\r
 -      }\r
 -      else\r
 -      {\r
 -        resetButtonPanel(false);\r
 -      }\r
 -    }\r
 -    else\r
 -    {\r
 -      resetButtonPanel(false);\r
 -    }\r
 -\r
 -    showFrame();\r
 -  }\r
 -\r
 -  public UserDefinedColours(AppJmol jmol, ColourSchemeI oldcs)\r
 -  {\r
 -    super();\r
 -    this.jmol = jmol;\r
 -\r
 -    colorChooser.getSelectionModel().addChangeListener(this);\r
 -\r
 -    oldColourScheme = oldcs;\r
 -\r
 -    if (oldColourScheme instanceof UserColourScheme)\r
 -    {\r
 -      schemeName.setText(((UserColourScheme) oldColourScheme).getName());\r
 -    }\r
 -\r
 -    resetButtonPanel(false);\r
 -\r
 -    showFrame();\r
 -\r
 -  }\r
 -\r
 -  void showFrame()\r
 -  {\r
 -    colorChooser.getSelectionModel().addChangeListener(this);\r
 -    frame = new JInternalFrame();\r
 -    frame.setContentPane(this);\r
 +/*
 + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
 + * Copyright (C) 2014 The Jalview Authors
 + * 
 + * This file is part of Jalview.
 + * 
 + * Jalview is free software: you can redistribute it and/or
 + * modify it under the terms of the GNU General Public License 
 + * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
 + *  
 + * Jalview is distributed in the hope that it will be useful, but 
 + * WITHOUT ANY WARRANTY; without even the implied warranty 
 + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
 + * PURPOSE.  See the GNU General Public License for more details.
 + * 
 + * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
 + * The Jalview Authors are detailed in the 'AUTHORS' file.
 + */
 +package jalview.gui;
 +
 +import jalview.datamodel.SequenceGroup;
 +import jalview.io.JalviewFileChooser;
 +import jalview.jbgui.GUserDefinedColours;
 +import jalview.schemes.ColourSchemeI;
 +import jalview.schemes.ResidueProperties;
 +import jalview.schemes.UserColourScheme;
 +import jalview.util.MessageManager;
 +
 +import java.awt.Color;
 +import java.awt.Font;
 +import java.awt.event.ActionEvent;
 +import java.awt.event.MouseEvent;
 +import java.io.File;
 +import java.io.FileInputStream;
 +import java.io.FileOutputStream;
 +import java.io.InputStreamReader;
 +import java.io.OutputStreamWriter;
 +import java.io.PrintWriter;
 +import java.util.Hashtable;
 +import java.util.StringTokenizer;
 +import java.util.Vector;
 +
 +import javax.swing.JButton;
 +import javax.swing.JInternalFrame;
 +import javax.swing.JOptionPane;
 +import javax.swing.event.ChangeEvent;
 +import javax.swing.event.ChangeListener;
 +
 +/**
 + * DOCUMENT ME!
 + * 
 + * @author $author$
 + * @version $Revision$
 + */
 +public class UserDefinedColours extends GUserDefinedColours implements
 +        ChangeListener
 +{
 +  AlignmentPanel ap;
 +
 +  SequenceGroup seqGroup;
 +
 +  Vector selectedButtons;
 +
 +  ColourSchemeI oldColourScheme;
 +
 +  JInternalFrame frame;
 +
 +  AppJmol jmol;
 +
 +  Vector upperCaseButtons;
 +
 +  Vector lowerCaseButtons;
 +
 +  /**
 +   * Creates a new UserDefinedColours object.
 +   * 
 +   * @param ap
 +   *          DOCUMENT ME!
 +   * @param sg
 +   *          DOCUMENT ME!
 +   */
 +  public UserDefinedColours(AlignmentPanel ap, SequenceGroup sg)
 +  {
 +    super();
 +
 +    lcaseColour.setEnabled(false);
 +
 +    this.ap = ap;
 +    seqGroup = sg;
 +
 +    if (seqGroup != null)
 +    {
 +      oldColourScheme = seqGroup.cs;
 +    }
 +    else
 +    {
 +      oldColourScheme = ap.av.getGlobalColourScheme();
 +    }
 +
 +    if (oldColourScheme instanceof UserColourScheme)
 +    {
 +      schemeName.setText(((UserColourScheme) oldColourScheme).getName());
 +      if (((UserColourScheme) oldColourScheme).getLowerCaseColours() != null)
 +      {
 +        caseSensitive.setSelected(true);
 +        lcaseColour.setEnabled(true);
 +        resetButtonPanel(true);
 +      }
 +      else
 +      {
 +        resetButtonPanel(false);
 +      }
 +    }
 +    else
 +    {
 +      resetButtonPanel(false);
 +    }
 +
 +    showFrame();
 +  }
 +
 +  public UserDefinedColours(AppJmol jmol, ColourSchemeI oldcs)
 +  {
 +    super();
 +    this.jmol = jmol;
 +
 +    colorChooser.getSelectionModel().addChangeListener(this);
 +
 +    oldColourScheme = oldcs;
 +
 +    if (oldColourScheme instanceof UserColourScheme)
 +    {
 +      schemeName.setText(((UserColourScheme) oldColourScheme).getName());
 +    }
 +
 +    resetButtonPanel(false);
 +
 +    showFrame();
 +
 +  }
 +
 +  void showFrame()
 +  {
 +    colorChooser.getSelectionModel().addChangeListener(this);
 +    frame = new JInternalFrame();
 +    frame.setContentPane(this);
-     Desktop.addInternalFrame(frame, "User Defined Colours", 720, 370, true);
+     Desktop.addInternalFrame(frame, MessageManager.getString("label.user_defined_colours"), 720, 370, true);\r
 -\r
 -    if (seqGroup != null)\r
 -    {\r
 -      frame.setTitle(frame.getTitle() + " (" + seqGroup.getName() + ")");\r
 -    }\r
 -\r
 -    if (new jalview.util.Platform().isAMac())\r
 -    {\r
 -      frame.setSize(760, 370);\r
 -    }\r
 -  }\r
 -\r
 -  void resetButtonPanel(boolean caseSensitive)\r
 -  {\r
 -    buttonPanel.removeAll();\r
 -\r
 -    if (upperCaseButtons == null)\r
 -    {\r
 -      upperCaseButtons = new Vector();\r
 -    }\r
 -\r
 -    JButton button;\r
 -    String label;\r
 -    for (int i = 0; i < 20; i++)\r
 -    {\r
 -      if (caseSensitive)\r
 -      {\r
 -        label = ResidueProperties.aa[i];\r
 -      }\r
 -      else\r
 -      {\r
 -        label = ResidueProperties.aa2Triplet.get(ResidueProperties.aa[i])\r
 -                .toString();\r
 -      }\r
 -\r
 -      button = makeButton(label, ResidueProperties.aa[i], upperCaseButtons,\r
 -              i);\r
 -\r
 -      buttonPanel.add(button);\r
 -    }\r
 -\r
 -    buttonPanel.add(makeButton("B", "B", upperCaseButtons, 20));\r
 -    buttonPanel.add(makeButton("Z", "Z", upperCaseButtons, 21));\r
 -    buttonPanel.add(makeButton("X", "X", upperCaseButtons, 22));\r
 -    buttonPanel.add(makeButton("Gap", "-", upperCaseButtons, 23));\r
 -\r
 -    if (!caseSensitive)\r
 -    {\r
 -      gridLayout.setRows(6);\r
 -      gridLayout.setColumns(4);\r
 -    }\r
 -    else\r
 -    {\r
 -      gridLayout.setRows(7);\r
 -      int cols = 7;\r
 -      gridLayout.setColumns(cols + 1);\r
 -\r
 -      if (lowerCaseButtons == null)\r
 -      {\r
 -        lowerCaseButtons = new Vector();\r
 -      }\r
 -\r
 -      for (int i = 0; i < 20; i++)\r
 -      {\r
 -        int row = i / cols + 1;\r
 -        int index = (row * cols) + i;\r
 -        button = makeButton(ResidueProperties.aa[i].toLowerCase(),\r
 -                ResidueProperties.aa[i].toLowerCase(), lowerCaseButtons, i);\r
 -\r
 -        buttonPanel.add(button, index);\r
 -      }\r
 -    }\r
 -\r
 -    if (caseSensitive)\r
 -    {\r
 -      buttonPanel.add(makeButton("b", "b", lowerCaseButtons, 20));\r
 -      buttonPanel.add(makeButton("z", "z", lowerCaseButtons, 21));\r
 -      buttonPanel.add(makeButton("x", "x", lowerCaseButtons, 22));\r
 -    }\r
 -\r
 -    buttonPanel.validate();\r
 -    validate();\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param evt\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  public void stateChanged(ChangeEvent evt)\r
 -  {\r
 -    if (selectedButtons != null)\r
 -    {\r
 -      JButton button = null;\r
 -      for (int i = 0; i < selectedButtons.size(); i++)\r
 -      {\r
 -        button = (JButton) selectedButtons.elementAt(i);\r
 -        button.setBackground(colorChooser.getColor());\r
 -        button.setForeground(button.getBackground().brighter().brighter()\r
 -                .brighter());\r
 -      }\r
 -      if (button == lcaseColour)\r
 -      {\r
 -        for (int i = 0; i < lowerCaseButtons.size(); i++)\r
 -        {\r
 -          button = (JButton) lowerCaseButtons.elementAt(i);\r
 -          button.setBackground(colorChooser.getColor());\r
 -          button.setForeground(button.getBackground().brighter().brighter()\r
 -                  .brighter());\r
 -        }\r
 -      }\r
 -    }\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  public void colourButtonPressed(MouseEvent e)\r
 -  {\r
 -    if (selectedButtons == null)\r
 -    {\r
 -      selectedButtons = new Vector();\r
 -    }\r
 -\r
 -    JButton pressed = (JButton) e.getSource();\r
 -\r
 -    if (e.isShiftDown())\r
 -    {\r
 -      JButton start, end = (JButton) e.getSource();\r
 -      if (selectedButtons.size() > 0)\r
 -      {\r
 -        start = (JButton) selectedButtons\r
 -                .elementAt(selectedButtons.size() - 1);\r
 -      }\r
 -      else\r
 -      {\r
 -        start = (JButton) e.getSource();\r
 -      }\r
 -\r
 -      int startIndex = 0, endIndex = 0;\r
 -      for (int b = 0; b < buttonPanel.getComponentCount(); b++)\r
 -      {\r
 -        if (buttonPanel.getComponent(b) == start)\r
 -        {\r
 -          startIndex = b;\r
 -        }\r
 -        if (buttonPanel.getComponent(b) == end)\r
 -        {\r
 -          endIndex = b;\r
 -        }\r
 -      }\r
 -\r
 -      if (startIndex > endIndex)\r
 -      {\r
 -        int temp = startIndex;\r
 -        startIndex = endIndex;\r
 -        endIndex = temp;\r
 -      }\r
 -\r
 -      for (int b = startIndex; b <= endIndex; b++)\r
 -      {\r
 -        JButton button = (JButton) buttonPanel.getComponent(b);\r
 -        if (!selectedButtons.contains(button))\r
 -        {\r
 -          button.setForeground(button.getBackground().brighter().brighter());\r
 -          selectedButtons.add(button);\r
 -        }\r
 -      }\r
 -    }\r
 -    else if (!e.isControlDown())\r
 -    {\r
 -      for (int b = 0; b < selectedButtons.size(); b++)\r
 -      {\r
 -        JButton button = (JButton) selectedButtons.elementAt(b);\r
 -        button.setForeground(button.getBackground().darker().darker());\r
 -      }\r
 -      selectedButtons.clear();\r
 -      pressed.setForeground(pressed.getBackground().brighter().brighter());\r
 -      selectedButtons.addElement(pressed);\r
 -\r
 -    }\r
 -    else if (e.isControlDown())\r
 -    {\r
 -      if (selectedButtons.contains(pressed))\r
 -      {\r
 -        pressed.setForeground(pressed.getBackground().darker().darker());\r
 -        selectedButtons.remove(pressed);\r
 -      }\r
 -      else\r
 -      {\r
 -        pressed.setForeground(pressed.getBackground().brighter().brighter());\r
 -        selectedButtons.addElement(pressed);\r
 -      }\r
 -    }\r
 -\r
 -    if (selectedButtons.size() > 0)\r
 -    {\r
 -      colorChooser.setColor(((JButton) selectedButtons.elementAt(0))\r
 -              .getBackground());\r
 -    }\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param label\r
 -   *          DOCUMENT ME!\r
 -   * @param aa\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  JButton makeButton(String label, String aa, Vector caseSensitiveButtons,\r
 -          int buttonIndex)\r
 -  {\r
 -    final JButton button;\r
 -    Color col;\r
 -\r
 -    if (buttonIndex < caseSensitiveButtons.size())\r
 -    {\r
 -      button = (JButton) caseSensitiveButtons.elementAt(buttonIndex);\r
 -      col = button.getBackground();\r
 -    }\r
 -    else\r
 -    {\r
 -      button = new JButton();\r
 -      button.addMouseListener(new java.awt.event.MouseAdapter()\r
 -      {\r
 -        public void mouseClicked(MouseEvent e)\r
 -        {\r
 -          colourButtonPressed(e);\r
 -        }\r
 -      });\r
 -\r
 -      caseSensitiveButtons.addElement(button);\r
 -\r
 -      col = Color.white;\r
 -      if (oldColourScheme != null)\r
 -      {\r
 -        try\r
 -        {\r
 -          col = oldColourScheme.findColour(aa.charAt(0), -1, null);\r
 -        } catch (Exception ex)\r
 -        {\r
 -        }\r
 -      }\r
 -    }\r
 -\r
 -    if (caseSensitive.isSelected())\r
 -    {\r
 -      button.setMargin(new java.awt.Insets(2, 2, 2, 2));\r
 -    }\r
 -    else\r
 -    {\r
 -      button.setMargin(new java.awt.Insets(2, 14, 2, 14));\r
 -    }\r
 -\r
 -    button.setBackground(col);\r
 -    button.setText(label);\r
 -    button.setForeground(col.darker().darker().darker());\r
 -    button.setFont(new java.awt.Font("Verdana", Font.BOLD, 10));\r
 -\r
 -    return button;\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  protected void okButton_actionPerformed(ActionEvent e)\r
 -  {\r
 -    applyButton_actionPerformed(null);\r
 -\r
 -    try\r
 -    {\r
 -      frame.setClosed(true);\r
 -    } catch (Exception ex)\r
 -    {\r
 -    }\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  protected void applyButton_actionPerformed(ActionEvent e)\r
 -  {\r
 -    UserColourScheme ucs = getSchemeFromButtons();\r
 -    ucs.setName(schemeName.getText());\r
 -\r
 -    if (seqGroup != null)\r
 -    {\r
 -      seqGroup.cs = ucs;\r
 -      ap.paintAlignment(true);\r
 -    }\r
 -    else if (ap != null)\r
 -    {\r
 -      ap.alignFrame.changeColour(ucs);\r
 -    }\r
 -    else if (jmol != null)\r
 -    {\r
 -      jmol.setJalviewColourScheme(ucs);\r
 -    }\r
 -  }\r
 -\r
 -  UserColourScheme getSchemeFromButtons()\r
 -  {\r
 -\r
 -    Color[] newColours = new Color[24];\r
 -\r
 -    for (int i = 0; i < 24; i++)\r
 -    {\r
 -      JButton button = (JButton) upperCaseButtons.elementAt(i);\r
 -      newColours[i] = button.getBackground();\r
 -    }\r
 -\r
 -    UserColourScheme ucs = new UserColourScheme(newColours);\r
 -\r
 -    if (caseSensitive.isSelected())\r
 -    {\r
 -      newColours = new Color[23];\r
 -      for (int i = 0; i < 23; i++)\r
 -      {\r
 -        JButton button = (JButton) lowerCaseButtons.elementAt(i);\r
 -        newColours[i] = button.getBackground();\r
 -      }\r
 -      ucs.setLowerCaseColours(newColours);\r
 -    }\r
 -\r
 -    if (ap != null)\r
 -    {\r
 -      ucs.setThreshold(0, ap.av.getIgnoreGapsConsensus());\r
 -    }\r
 -\r
 -    return ucs;\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  protected void loadbutton_actionPerformed(ActionEvent e)\r
 -  {\r
 -    upperCaseButtons = new Vector();\r
 -    lowerCaseButtons = new Vector();\r
 -\r
 -    JalviewFileChooser chooser = new JalviewFileChooser(\r
 -            jalview.bin.Cache.getProperty("LAST_DIRECTORY"), new String[]\r
 -            { "jc" }, new String[]\r
 -            { "Jalview User Colours" }, "Jalview User Colours");\r
 -    chooser.setFileView(new jalview.io.JalviewFileView());\r
 +
 +    if (seqGroup != null)
 +    {
 +      frame.setTitle(frame.getTitle() + " (" + seqGroup.getName() + ")");
 +    }
 +
 +    if (new jalview.util.Platform().isAMac())
 +    {
 +      frame.setSize(760, 370);
 +    }
 +  }
 +
 +  void resetButtonPanel(boolean caseSensitive)
 +  {
 +    buttonPanel.removeAll();
 +
 +    if (upperCaseButtons == null)
 +    {
 +      upperCaseButtons = new Vector();
 +    }
 +
 +    JButton button;
 +    String label;
 +    for (int i = 0; i < 20; i++)
 +    {
 +      if (caseSensitive)
 +      {
 +        label = ResidueProperties.aa[i];
 +      }
 +      else
 +      {
 +        label = ResidueProperties.aa2Triplet.get(ResidueProperties.aa[i])
 +                .toString();
 +      }
 +
 +      button = makeButton(label, ResidueProperties.aa[i], upperCaseButtons,
 +              i);
 +
 +      buttonPanel.add(button);
 +    }
 +
 +    buttonPanel.add(makeButton("B", "B", upperCaseButtons, 20));
 +    buttonPanel.add(makeButton("Z", "Z", upperCaseButtons, 21));
 +    buttonPanel.add(makeButton("X", "X", upperCaseButtons, 22));
 +    buttonPanel.add(makeButton("Gap", "-", upperCaseButtons, 23));
 +
 +    if (!caseSensitive)
 +    {
 +      gridLayout.setRows(6);
 +      gridLayout.setColumns(4);
 +    }
 +    else
 +    {
 +      gridLayout.setRows(7);
 +      int cols = 7;
 +      gridLayout.setColumns(cols + 1);
 +
 +      if (lowerCaseButtons == null)
 +      {
 +        lowerCaseButtons = new Vector();
 +      }
 +
 +      for (int i = 0; i < 20; i++)
 +      {
 +        int row = i / cols + 1;
 +        int index = (row * cols) + i;
 +        button = makeButton(ResidueProperties.aa[i].toLowerCase(),
 +                ResidueProperties.aa[i].toLowerCase(), lowerCaseButtons, i);
 +
 +        buttonPanel.add(button, index);
 +      }
 +    }
 +
 +    if (caseSensitive)
 +    {
 +      buttonPanel.add(makeButton("b", "b", lowerCaseButtons, 20));
 +      buttonPanel.add(makeButton("z", "z", lowerCaseButtons, 21));
 +      buttonPanel.add(makeButton("x", "x", lowerCaseButtons, 22));
 +    }
 +
 +    buttonPanel.validate();
 +    validate();
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param evt
 +   *          DOCUMENT ME!
 +   */
 +  public void stateChanged(ChangeEvent evt)
 +  {
 +    if (selectedButtons != null)
 +    {
 +      JButton button = null;
 +      for (int i = 0; i < selectedButtons.size(); i++)
 +      {
 +        button = (JButton) selectedButtons.elementAt(i);
 +        button.setBackground(colorChooser.getColor());
 +        button.setForeground(button.getBackground().brighter().brighter()
 +                .brighter());
 +      }
 +      if (button == lcaseColour)
 +      {
 +        for (int i = 0; i < lowerCaseButtons.size(); i++)
 +        {
 +          button = (JButton) lowerCaseButtons.elementAt(i);
 +          button.setBackground(colorChooser.getColor());
 +          button.setForeground(button.getBackground().brighter().brighter()
 +                  .brighter());
 +        }
 +      }
 +    }
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  public void colourButtonPressed(MouseEvent e)
 +  {
 +    if (selectedButtons == null)
 +    {
 +      selectedButtons = new Vector();
 +    }
 +
 +    JButton pressed = (JButton) e.getSource();
 +
 +    if (e.isShiftDown())
 +    {
 +      JButton start, end = (JButton) e.getSource();
 +      if (selectedButtons.size() > 0)
 +      {
 +        start = (JButton) selectedButtons
 +                .elementAt(selectedButtons.size() - 1);
 +      }
 +      else
 +      {
 +        start = (JButton) e.getSource();
 +      }
 +
 +      int startIndex = 0, endIndex = 0;
 +      for (int b = 0; b < buttonPanel.getComponentCount(); b++)
 +      {
 +        if (buttonPanel.getComponent(b) == start)
 +        {
 +          startIndex = b;
 +        }
 +        if (buttonPanel.getComponent(b) == end)
 +        {
 +          endIndex = b;
 +        }
 +      }
 +
 +      if (startIndex > endIndex)
 +      {
 +        int temp = startIndex;
 +        startIndex = endIndex;
 +        endIndex = temp;
 +      }
 +
 +      for (int b = startIndex; b <= endIndex; b++)
 +      {
 +        JButton button = (JButton) buttonPanel.getComponent(b);
 +        if (!selectedButtons.contains(button))
 +        {
 +          button.setForeground(button.getBackground().brighter().brighter());
 +          selectedButtons.add(button);
 +        }
 +      }
 +    }
 +    else if (!e.isControlDown())
 +    {
 +      for (int b = 0; b < selectedButtons.size(); b++)
 +      {
 +        JButton button = (JButton) selectedButtons.elementAt(b);
 +        button.setForeground(button.getBackground().darker().darker());
 +      }
 +      selectedButtons.clear();
 +      pressed.setForeground(pressed.getBackground().brighter().brighter());
 +      selectedButtons.addElement(pressed);
 +
 +    }
 +    else if (e.isControlDown())
 +    {
 +      if (selectedButtons.contains(pressed))
 +      {
 +        pressed.setForeground(pressed.getBackground().darker().darker());
 +        selectedButtons.remove(pressed);
 +      }
 +      else
 +      {
 +        pressed.setForeground(pressed.getBackground().brighter().brighter());
 +        selectedButtons.addElement(pressed);
 +      }
 +    }
 +
 +    if (selectedButtons.size() > 0)
 +    {
 +      colorChooser.setColor(((JButton) selectedButtons.elementAt(0))
 +              .getBackground());
 +    }
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param label
 +   *          DOCUMENT ME!
 +   * @param aa
 +   *          DOCUMENT ME!
 +   */
 +  JButton makeButton(String label, String aa, Vector caseSensitiveButtons,
 +          int buttonIndex)
 +  {
 +    final JButton button;
 +    Color col;
 +
 +    if (buttonIndex < caseSensitiveButtons.size())
 +    {
 +      button = (JButton) caseSensitiveButtons.elementAt(buttonIndex);
 +      col = button.getBackground();
 +    }
 +    else
 +    {
 +      button = new JButton();
 +      button.addMouseListener(new java.awt.event.MouseAdapter()
 +      {
 +        public void mouseClicked(MouseEvent e)
 +        {
 +          colourButtonPressed(e);
 +        }
 +      });
 +
 +      caseSensitiveButtons.addElement(button);
 +
 +      col = Color.white;
 +      if (oldColourScheme != null)
 +      {
 +        try
 +        {
 +          col = oldColourScheme.findColour(aa.charAt(0), -1, null);
 +        } catch (Exception ex)
 +        {
 +        }
 +      }
 +    }
 +
 +    if (caseSensitive.isSelected())
 +    {
 +      button.setMargin(new java.awt.Insets(2, 2, 2, 2));
 +    }
 +    else
 +    {
 +      button.setMargin(new java.awt.Insets(2, 14, 2, 14));
 +    }
 +
 +    button.setBackground(col);
 +    button.setText(label);
 +    button.setForeground(col.darker().darker().darker());
 +    button.setFont(new java.awt.Font("Verdana", Font.BOLD, 10));
 +
 +    return button;
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  protected void okButton_actionPerformed(ActionEvent e)
 +  {
 +    applyButton_actionPerformed(null);
 +
 +    try
 +    {
 +      frame.setClosed(true);
 +    } catch (Exception ex)
 +    {
 +    }
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  protected void applyButton_actionPerformed(ActionEvent e)
 +  {
 +    UserColourScheme ucs = getSchemeFromButtons();
 +    ucs.setName(schemeName.getText());
 +
 +    if (seqGroup != null)
 +    {
 +      seqGroup.cs = ucs;
 +      ap.paintAlignment(true);
 +    }
 +    else if (ap != null)
 +    {
 +      ap.alignFrame.changeColour(ucs);
 +    }
 +    else if (jmol != null)
 +    {
 +      jmol.setJalviewColourScheme(ucs);
 +    }
 +  }
 +
 +  UserColourScheme getSchemeFromButtons()
 +  {
 +
 +    Color[] newColours = new Color[24];
 +
 +    for (int i = 0; i < 24; i++)
 +    {
 +      JButton button = (JButton) upperCaseButtons.elementAt(i);
 +      newColours[i] = button.getBackground();
 +    }
 +
 +    UserColourScheme ucs = new UserColourScheme(newColours);
 +
 +    if (caseSensitive.isSelected())
 +    {
 +      newColours = new Color[23];
 +      for (int i = 0; i < 23; i++)
 +      {
 +        JButton button = (JButton) lowerCaseButtons.elementAt(i);
 +        newColours[i] = button.getBackground();
 +      }
 +      ucs.setLowerCaseColours(newColours);
 +    }
 +
 +    if (ap != null)
 +    {
 +      ucs.setThreshold(0, ap.av.getIgnoreGapsConsensus());
 +    }
 +
 +    return ucs;
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  protected void loadbutton_actionPerformed(ActionEvent e)
 +  {
 +    upperCaseButtons = new Vector();
 +    lowerCaseButtons = new Vector();
 +
 +    JalviewFileChooser chooser = new JalviewFileChooser(
 +            jalview.bin.Cache.getProperty("LAST_DIRECTORY"), new String[]
 +            { "jc" }, new String[]
 +            { "Jalview User Colours" }, "Jalview User Colours");
 +    chooser.setFileView(new jalview.io.JalviewFileView());
-     chooser.setDialogTitle("Load colour scheme");
-     chooser.setToolTipText("Load");
+     chooser.setDialogTitle(MessageManager.getString("label.load_colour_scheme"));\r
+     chooser.setToolTipText(MessageManager.getString("action.load"));\r
 -\r
 -    int value = chooser.showOpenDialog(this);\r
 -\r
 -    if (value == JalviewFileChooser.APPROVE_OPTION)\r
 -    {\r
 -      File choice = chooser.getSelectedFile();\r
 -      jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice.getParent());\r
 -      String defaultColours = jalview.bin.Cache.getDefault(\r
 -              "USER_DEFINED_COLOURS", choice.getPath());\r
 -      if (defaultColours.indexOf(choice.getPath()) == -1)\r
 -      {\r
 -        defaultColours = defaultColours.concat("|")\r
 -                .concat(choice.getPath());\r
 -      }\r
 -\r
 -      jalview.bin.Cache.setProperty("USER_DEFINED_COLOURS", defaultColours);\r
 -\r
 -      UserColourScheme ucs = loadColours(choice.getAbsolutePath());\r
 -      Color[] colors = ucs.getColours();\r
 -      schemeName.setText(ucs.getName());\r
 -\r
 -      if (ucs.getLowerCaseColours() != null)\r
 -      {\r
 -        caseSensitive.setSelected(true);\r
 -        lcaseColour.setEnabled(true);\r
 -        resetButtonPanel(true);\r
 -        for (int i = 0; i < lowerCaseButtons.size(); i++)\r
 -        {\r
 -          JButton button = (JButton) lowerCaseButtons.elementAt(i);\r
 -          button.setBackground(ucs.getLowerCaseColours()[i]);\r
 -        }\r
 -\r
 -      }\r
 -      else\r
 -      {\r
 -        caseSensitive.setSelected(false);\r
 -        lcaseColour.setEnabled(false);\r
 -        resetButtonPanel(false);\r
 -      }\r
 -\r
 -      for (int i = 0; i < upperCaseButtons.size(); i++)\r
 -      {\r
 -        JButton button = (JButton) upperCaseButtons.elementAt(i);\r
 -        button.setBackground(colors[i]);\r
 -      }\r
 -\r
 -    }\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @return DOCUMENT ME!\r
 -   */\r
 -  public static UserColourScheme loadDefaultColours()\r
 -  {\r
 -    UserColourScheme ret = null;\r
 -\r
 -    String colours = jalview.bin.Cache.getProperty("USER_DEFINED_COLOURS");\r
 -    if (colours != null)\r
 -    {\r
 -      if (colours.indexOf("|") > -1)\r
 -      {\r
 -        colours = colours.substring(0, colours.indexOf("|"));\r
 -      }\r
 -\r
 -      ret = loadColours(colours);\r
 -    }\r
 -\r
 -    if (ret == null)\r
 -    {\r
 -      Color[] newColours = new Color[24];\r
 -      for (int i = 0; i < 24; i++)\r
 -      {\r
 -        newColours[i] = Color.white;\r
 -      }\r
 -      ret = new UserColourScheme(newColours);\r
 -    }\r
 -\r
 -    return ret;\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param file\r
 -   *          DOCUMENT ME!\r
 -   * \r
 -   * @return DOCUMENT ME!\r
 -   */\r
 -  static UserColourScheme loadColours(String file)\r
 -  {\r
 -    UserColourScheme ucs = null;\r
 -    Color[] newColours = null;\r
 -    try\r
 -    {\r
 -      InputStreamReader in = new InputStreamReader(\r
 -              new FileInputStream(file), "UTF-8");\r
 -\r
 -      jalview.schemabinding.version2.JalviewUserColours jucs = new jalview.schemabinding.version2.JalviewUserColours();\r
 -\r
 -      org.exolab.castor.xml.Unmarshaller unmar = new org.exolab.castor.xml.Unmarshaller(\r
 -              jucs);\r
 -      jucs = (jalview.schemabinding.version2.JalviewUserColours) unmar\r
 -              .unmarshal(in);\r
 -\r
 -      newColours = new Color[24];\r
 -\r
 -      Color[] lowerCase = null;\r
 -      boolean caseSensitive = false;\r
 -\r
 -      String name;\r
 -      int index;\r
 -      for (int i = 0; i < jucs.getColourCount(); i++)\r
 -      {\r
 -        name = jucs.getColour(i).getName();\r
 -        if (ResidueProperties.aa3Hash.containsKey(name))\r
 -        {\r
 -          index = ((Integer) ResidueProperties.aa3Hash.get(name))\r
 -                  .intValue();\r
 -        }\r
 -        else\r
 -        {\r
 -          index = ResidueProperties.aaIndex[name.charAt(0)];\r
 -        }\r
 -        if (index == -1)\r
 -        {\r
 -          continue;\r
 -        }\r
 -\r
 -        if (name.toLowerCase().equals(name))\r
 -        {\r
 -          if (lowerCase == null)\r
 -          {\r
 -            lowerCase = new Color[23];\r
 -          }\r
 -          caseSensitive = true;\r
 -          lowerCase[index] = new Color(Integer.parseInt(jucs.getColour(i)\r
 -                  .getRGB(), 16));\r
 -        }\r
 -        else\r
 -        {\r
 -          newColours[index] = new Color(Integer.parseInt(jucs.getColour(i)\r
 -                  .getRGB(), 16));\r
 -        }\r
 -      }\r
 -\r
 -      if (newColours != null)\r
 -      {\r
 -        ucs = new UserColourScheme(newColours);\r
 -        ucs.setName(jucs.getSchemeName());\r
 -        if (caseSensitive)\r
 -        {\r
 -          ucs.setLowerCaseColours(lowerCase);\r
 -        }\r
 -      }\r
 -\r
 -    } catch (Exception ex)\r
 -    {\r
 -      // Could be Archive Jalview format\r
 -      try\r
 -      {\r
 -        InputStreamReader in = new InputStreamReader(new FileInputStream(\r
 -                file), "UTF-8");\r
 -\r
 -        jalview.binding.JalviewUserColours jucs = new jalview.binding.JalviewUserColours();\r
 -\r
 -        jucs = (jalview.binding.JalviewUserColours) jucs.unmarshal(in);\r
 -\r
 -        newColours = new Color[jucs.getColourCount()];\r
 -\r
 -        for (int i = 0; i < 24; i++)\r
 -        {\r
 -          newColours[i] = new Color(Integer.parseInt(jucs.getColour(i)\r
 -                  .getRGB(), 16));\r
 -        }\r
 -        if (newColours != null)\r
 -        {\r
 -          ucs = new UserColourScheme(newColours);\r
 -          ucs.setName(jucs.getSchemeName());\r
 -        }\r
 -      } catch (Exception ex2)\r
 -      {\r
 -        ex2.printStackTrace();\r
 -      }\r
 -\r
 -      if (newColours == null)\r
 -      {\r
 -        System.out.println("Error loading User ColourFile\n" + ex);\r
 -      }\r
 -    }\r
 -\r
 -    return ucs;\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  protected void savebutton_actionPerformed(ActionEvent e)\r
 -  {\r
 -    if (schemeName.getText().trim().length() < 1)\r
 -    {\r
 -      JOptionPane.showInternalMessageDialog(Desktop.desktop,\r
 -              MessageManager.getString("label.user_colour_scheme_must_have_name"),\r
 -              MessageManager.getString("label.no_name_colour_scheme"), JOptionPane.WARNING_MESSAGE);\r
 -      return;\r
 -    }\r
 -\r
 -    if (userColourSchemes != null\r
 -            && userColourSchemes.containsKey(schemeName.getText()))\r
 -    {\r
 -      int reply = JOptionPane.showInternalConfirmDialog(\r
 -              Desktop.desktop,\r
 -              MessageManager.formatMessage("label.colour_scheme_exists_overwrite", new String[]{schemeName.getText(),schemeName.getText()}),\r
 -              MessageManager.getString("label.duplicate_scheme_name"), JOptionPane.YES_NO_OPTION);\r
 -      if (reply != JOptionPane.YES_OPTION)\r
 -      {\r
 -        return;\r
 -      }\r
 -\r
 -      userColourSchemes.remove(schemeName.getText());\r
 -    }\r
 -    JalviewFileChooser chooser = new JalviewFileChooser(\r
 -            jalview.bin.Cache.getProperty("LAST_DIRECTORY"), new String[]\r
 -            { "jc" }, new String[]\r
 -            { "Jalview User Colours" }, "Jalview User Colours");\r
 -\r
 -    chooser.setFileView(new jalview.io.JalviewFileView());\r
 -    chooser.setDialogTitle("Save colour scheme");\r
 +
 +    int value = chooser.showOpenDialog(this);
 +
 +    if (value == JalviewFileChooser.APPROVE_OPTION)
 +    {
 +      File choice = chooser.getSelectedFile();
 +      jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice.getParent());
 +      String defaultColours = jalview.bin.Cache.getDefault(
 +              "USER_DEFINED_COLOURS", choice.getPath());
 +      if (defaultColours.indexOf(choice.getPath()) == -1)
 +      {
 +        defaultColours = defaultColours.concat("|")
 +                .concat(choice.getPath());
 +      }
 +
 +      jalview.bin.Cache.setProperty("USER_DEFINED_COLOURS", defaultColours);
 +
 +      UserColourScheme ucs = loadColours(choice.getAbsolutePath());
 +      Color[] colors = ucs.getColours();
 +      schemeName.setText(ucs.getName());
 +
 +      if (ucs.getLowerCaseColours() != null)
 +      {
 +        caseSensitive.setSelected(true);
 +        lcaseColour.setEnabled(true);
 +        resetButtonPanel(true);
 +        for (int i = 0; i < lowerCaseButtons.size(); i++)
 +        {
 +          JButton button = (JButton) lowerCaseButtons.elementAt(i);
 +          button.setBackground(ucs.getLowerCaseColours()[i]);
 +        }
 +
 +      }
 +      else
 +      {
 +        caseSensitive.setSelected(false);
 +        lcaseColour.setEnabled(false);
 +        resetButtonPanel(false);
 +      }
 +
 +      for (int i = 0; i < upperCaseButtons.size(); i++)
 +      {
 +        JButton button = (JButton) upperCaseButtons.elementAt(i);
 +        button.setBackground(colors[i]);
 +      }
 +
 +    }
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @return DOCUMENT ME!
 +   */
 +  public static UserColourScheme loadDefaultColours()
 +  {
 +    UserColourScheme ret = null;
 +
 +    String colours = jalview.bin.Cache.getProperty("USER_DEFINED_COLOURS");
 +    if (colours != null)
 +    {
 +      if (colours.indexOf("|") > -1)
 +      {
 +        colours = colours.substring(0, colours.indexOf("|"));
 +      }
 +
 +      ret = loadColours(colours);
 +    }
 +
 +    if (ret == null)
 +    {
 +      Color[] newColours = new Color[24];
 +      for (int i = 0; i < 24; i++)
 +      {
 +        newColours[i] = Color.white;
 +      }
 +      ret = new UserColourScheme(newColours);
 +    }
 +
 +    return ret;
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param file
 +   *          DOCUMENT ME!
 +   * 
 +   * @return DOCUMENT ME!
 +   */
 +  static UserColourScheme loadColours(String file)
 +  {
 +    UserColourScheme ucs = null;
 +    Color[] newColours = null;
 +    try
 +    {
 +      InputStreamReader in = new InputStreamReader(
 +              new FileInputStream(file), "UTF-8");
 +
 +      jalview.schemabinding.version2.JalviewUserColours jucs = new jalview.schemabinding.version2.JalviewUserColours();
 +
 +      org.exolab.castor.xml.Unmarshaller unmar = new org.exolab.castor.xml.Unmarshaller(
 +              jucs);
 +      jucs = (jalview.schemabinding.version2.JalviewUserColours) unmar
 +              .unmarshal(in);
 +
 +      newColours = new Color[24];
 +
 +      Color[] lowerCase = null;
 +      boolean caseSensitive = false;
 +
 +      String name;
 +      int index;
 +      for (int i = 0; i < jucs.getColourCount(); i++)
 +      {
 +        name = jucs.getColour(i).getName();
 +        if (ResidueProperties.aa3Hash.containsKey(name))
 +        {
 +          index = ((Integer) ResidueProperties.aa3Hash.get(name))
 +                  .intValue();
 +        }
 +        else
 +        {
 +          index = ResidueProperties.aaIndex[name.charAt(0)];
 +        }
 +        if (index == -1)
 +        {
 +          continue;
 +        }
 +
 +        if (name.toLowerCase().equals(name))
 +        {
 +          if (lowerCase == null)
 +          {
 +            lowerCase = new Color[23];
 +          }
 +          caseSensitive = true;
 +          lowerCase[index] = new Color(Integer.parseInt(jucs.getColour(i)
 +                  .getRGB(), 16));
 +        }
 +        else
 +        {
 +          newColours[index] = new Color(Integer.parseInt(jucs.getColour(i)
 +                  .getRGB(), 16));
 +        }
 +      }
 +
 +      if (newColours != null)
 +      {
 +        ucs = new UserColourScheme(newColours);
 +        ucs.setName(jucs.getSchemeName());
 +        if (caseSensitive)
 +        {
 +          ucs.setLowerCaseColours(lowerCase);
 +        }
 +      }
 +
 +    } catch (Exception ex)
 +    {
 +      // Could be Archive Jalview format
 +      try
 +      {
 +        InputStreamReader in = new InputStreamReader(new FileInputStream(
 +                file), "UTF-8");
 +
 +        jalview.binding.JalviewUserColours jucs = new jalview.binding.JalviewUserColours();
 +
 +        jucs = (jalview.binding.JalviewUserColours) jucs.unmarshal(in);
 +
 +        newColours = new Color[jucs.getColourCount()];
 +
 +        for (int i = 0; i < 24; i++)
 +        {
 +          newColours[i] = new Color(Integer.parseInt(jucs.getColour(i)
 +                  .getRGB(), 16));
 +        }
 +        if (newColours != null)
 +        {
 +          ucs = new UserColourScheme(newColours);
 +          ucs.setName(jucs.getSchemeName());
 +        }
 +      } catch (Exception ex2)
 +      {
 +        ex2.printStackTrace();
 +      }
 +
 +      if (newColours == null)
 +      {
 +        System.out.println("Error loading User ColourFile\n" + ex);
 +      }
 +    }
 +
 +    return ucs;
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  protected void savebutton_actionPerformed(ActionEvent e)
 +  {
 +    if (schemeName.getText().trim().length() < 1)
 +    {
 +      JOptionPane.showInternalMessageDialog(Desktop.desktop,
 +              MessageManager.getString("label.user_colour_scheme_must_have_name"),
 +              MessageManager.getString("label.no_name_colour_scheme"), JOptionPane.WARNING_MESSAGE);
 +      return;
 +    }
 +
 +    if (userColourSchemes != null
 +            && userColourSchemes.containsKey(schemeName.getText()))
 +    {
 +      int reply = JOptionPane.showInternalConfirmDialog(
 +              Desktop.desktop,
 +              MessageManager.formatMessage("label.colour_scheme_exists_overwrite", new String[]{schemeName.getText(),schemeName.getText()}),
 +              MessageManager.getString("label.duplicate_scheme_name"), JOptionPane.YES_NO_OPTION);
 +      if (reply != JOptionPane.YES_OPTION)
 +      {
 +        return;
 +      }
 +
 +      userColourSchemes.remove(schemeName.getText());
 +    }
 +    JalviewFileChooser chooser = new JalviewFileChooser(
 +            jalview.bin.Cache.getProperty("LAST_DIRECTORY"), new String[]
 +            { "jc" }, new String[]
 +            { "Jalview User Colours" }, "Jalview User Colours");
 +
 +    chooser.setFileView(new jalview.io.JalviewFileView());
 +    chooser.setDialogTitle("Save colour scheme");
-     chooser.setToolTipText("Save");
+     chooser.setToolTipText(MessageManager.getString("action.save"));\r
 -\r
 -    int value = chooser.showSaveDialog(this);\r
 -\r
 -    if (value == JalviewFileChooser.APPROVE_OPTION)\r
 -    {\r
 -      String choice = chooser.getSelectedFile().getPath();\r
 -      String defaultColours = jalview.bin.Cache.getDefault(\r
 -              "USER_DEFINED_COLOURS", choice);\r
 -      if (defaultColours.indexOf(choice) == -1)\r
 -      {\r
 -        if (defaultColours.length() > 0)\r
 -        {\r
 -          defaultColours = defaultColours.concat("|");\r
 -        }\r
 -        defaultColours = defaultColours.concat(choice);\r
 -      }\r
 -\r
 -      userColourSchemes.put(schemeName.getText(), getSchemeFromButtons());\r
 -\r
 -      ap.alignFrame.updateUserColourMenu();\r
 -\r
 -      jalview.bin.Cache.setProperty("USER_DEFINED_COLOURS", defaultColours);\r
 -\r
 -      jalview.schemabinding.version2.JalviewUserColours ucs = new jalview.schemabinding.version2.JalviewUserColours();\r
 -\r
 -      ucs.setSchemeName(schemeName.getText());\r
 -      try\r
 -      {\r
 -        PrintWriter out = new PrintWriter(new OutputStreamWriter(\r
 -                new FileOutputStream(choice), "UTF-8"));\r
 -\r
 -        for (int i = 0; i < buttonPanel.getComponentCount(); i++)\r
 -        {\r
 -          JButton button = (JButton) buttonPanel.getComponent(i);\r
 -          jalview.schemabinding.version2.Colour col = new jalview.schemabinding.version2.Colour();\r
 -          col.setName(button.getText());\r
 -          col.setRGB(jalview.util.Format.getHexString(button\r
 -                  .getBackground()));\r
 -          ucs.addColour(col);\r
 -        }\r
 -\r
 -        ucs.marshal(out);\r
 -        out.close();\r
 -      } catch (Exception ex)\r
 -      {\r
 -        ex.printStackTrace();\r
 -      }\r
 -    }\r
 -  }\r
 -\r
 -  /**\r
 -   * DOCUMENT ME!\r
 -   * \r
 -   * @param e\r
 -   *          DOCUMENT ME!\r
 -   */\r
 -  protected void cancelButton_actionPerformed(ActionEvent e)\r
 -  {\r
 -    if (ap != null)\r
 -    {\r
 -      if (seqGroup != null)\r
 -      {\r
 -        seqGroup.cs = oldColourScheme;\r
 -      }\r
 -      else if (ap != null)\r
 -      {\r
 -        ap.av.setGlobalColourScheme(oldColourScheme);\r
 -      }\r
 -      ap.paintAlignment(true);\r
 -    }\r
 -\r
 -    if (jmol != null)\r
 -    {\r
 -      jmol.setJalviewColourScheme(oldColourScheme);\r
 -    }\r
 -\r
 -    try\r
 -    {\r
 -      frame.setClosed(true);\r
 -    } catch (Exception ex)\r
 -    {\r
 -    }\r
 -  }\r
 -\r
 -  static Hashtable userColourSchemes;\r
 -\r
 -  public static Hashtable getUserColourSchemes()\r
 -  {\r
 -    return userColourSchemes;\r
 -  }\r
 -\r
 -  public static void initUserColourSchemes(String files)\r
 -  {\r
 -    userColourSchemes = new Hashtable();\r
 -\r
 -    if (files == null || files.length() == 0)\r
 -    {\r
 -      return;\r
 -    }\r
 -\r
 -    // In case colours can't be loaded, we'll remove them\r
 -    // from the default list here.\r
 -    StringBuffer coloursFound = new StringBuffer();\r
 -    StringTokenizer st = new StringTokenizer(files, "|");\r
 -    while (st.hasMoreElements())\r
 -    {\r
 -      String file = st.nextToken();\r
 -      try\r
 -      {\r
 -        UserColourScheme ucs = loadColours(file);\r
 -        if (ucs != null)\r
 -        {\r
 -          if (coloursFound.length() > 0)\r
 -          {\r
 -            coloursFound.append("|");\r
 -          }\r
 -          coloursFound.append(file);\r
 -          userColourSchemes.put(ucs.getName(), ucs);\r
 -        }\r
 -      } catch (Exception ex)\r
 -      {\r
 -        System.out.println("Error loading User ColourFile\n" + ex);\r
 -      }\r
 -    }\r
 -    if (!files.equals(coloursFound.toString()))\r
 -    {\r
 -      if (coloursFound.toString().length() > 1)\r
 -      {\r
 -        jalview.bin.Cache.setProperty("USER_DEFINED_COLOURS",\r
 -                coloursFound.toString());\r
 -      }\r
 -      else\r
 -      {\r
 -        jalview.bin.Cache.applicationProperties\r
 -                .remove("USER_DEFINED_COLOURS");\r
 -      }\r
 -    }\r
 -  }\r
 -\r
 -  public static void removeColourFromDefaults(String target)\r
 -  {\r
 -    // The only way to find colours by name is to load them in\r
 -    // In case colours can't be loaded, we'll remove them\r
 -    // from the default list here.\r
 -\r
 -    userColourSchemes = new Hashtable();\r
 -\r
 -    StringBuffer coloursFound = new StringBuffer();\r
 -    StringTokenizer st = new StringTokenizer(\r
 -            jalview.bin.Cache.getProperty("USER_DEFINED_COLOURS"), "|");\r
 -\r
 -    while (st.hasMoreElements())\r
 -    {\r
 -      String file = st.nextToken();\r
 -      try\r
 -      {\r
 -        UserColourScheme ucs = loadColours(file);\r
 -        if (ucs != null && !ucs.getName().equals(target))\r
 -        {\r
 -          if (coloursFound.length() > 0)\r
 -          {\r
 -            coloursFound.append("|");\r
 -          }\r
 -          coloursFound.append(file);\r
 -          userColourSchemes.put(ucs.getName(), ucs);\r
 -        }\r
 -      } catch (Exception ex)\r
 -      {\r
 -        System.out.println("Error loading User ColourFile\n" + ex);\r
 -      }\r
 -    }\r
 -\r
 -    if (coloursFound.toString().length() > 1)\r
 -    {\r
 -      jalview.bin.Cache.setProperty("USER_DEFINED_COLOURS",\r
 -              coloursFound.toString());\r
 -    }\r
 -    else\r
 -    {\r
 -      jalview.bin.Cache.applicationProperties\r
 -              .remove("USER_DEFINED_COLOURS");\r
 -    }\r
 -\r
 -  }\r
 -\r
 -  public void caseSensitive_actionPerformed(ActionEvent e)\r
 -  {\r
 -    resetButtonPanel(caseSensitive.isSelected());\r
 -    lcaseColour.setEnabled(caseSensitive.isSelected());\r
 -  }\r
 -\r
 -  public void lcaseColour_actionPerformed(ActionEvent e)\r
 -  {\r
 -    if (selectedButtons == null)\r
 -    {\r
 -      selectedButtons = new Vector();\r
 -    }\r
 -    else\r
 -    {\r
 -      selectedButtons.clear();\r
 -    }\r
 -    selectedButtons.add(lcaseColour);\r
 -  }\r
 -\r
 -}\r
 +
 +    int value = chooser.showSaveDialog(this);
 +
 +    if (value == JalviewFileChooser.APPROVE_OPTION)
 +    {
 +      String choice = chooser.getSelectedFile().getPath();
 +      String defaultColours = jalview.bin.Cache.getDefault(
 +              "USER_DEFINED_COLOURS", choice);
 +      if (defaultColours.indexOf(choice) == -1)
 +      {
 +        if (defaultColours.length() > 0)
 +        {
 +          defaultColours = defaultColours.concat("|");
 +        }
 +        defaultColours = defaultColours.concat(choice);
 +      }
 +
 +      userColourSchemes.put(schemeName.getText(), getSchemeFromButtons());
 +
 +      ap.alignFrame.updateUserColourMenu();
 +
 +      jalview.bin.Cache.setProperty("USER_DEFINED_COLOURS", defaultColours);
 +
 +      jalview.schemabinding.version2.JalviewUserColours ucs = new jalview.schemabinding.version2.JalviewUserColours();
 +
 +      ucs.setSchemeName(schemeName.getText());
 +      try
 +      {
 +        PrintWriter out = new PrintWriter(new OutputStreamWriter(
 +                new FileOutputStream(choice), "UTF-8"));
 +
 +        for (int i = 0; i < buttonPanel.getComponentCount(); i++)
 +        {
 +          JButton button = (JButton) buttonPanel.getComponent(i);
 +          jalview.schemabinding.version2.Colour col = new jalview.schemabinding.version2.Colour();
 +          col.setName(button.getText());
 +          col.setRGB(jalview.util.Format.getHexString(button
 +                  .getBackground()));
 +          ucs.addColour(col);
 +        }
 +
 +        ucs.marshal(out);
 +        out.close();
 +      } catch (Exception ex)
 +      {
 +        ex.printStackTrace();
 +      }
 +    }
 +  }
 +
 +  /**
 +   * DOCUMENT ME!
 +   * 
 +   * @param e
 +   *          DOCUMENT ME!
 +   */
 +  protected void cancelButton_actionPerformed(ActionEvent e)
 +  {
 +    if (ap != null)
 +    {
 +      if (seqGroup != null)
 +      {
 +        seqGroup.cs = oldColourScheme;
 +      }
 +      else if (ap != null)
 +      {
 +        ap.av.setGlobalColourScheme(oldColourScheme);
 +      }
 +      ap.paintAlignment(true);
 +    }
 +
 +    if (jmol != null)
 +    {
 +      jmol.setJalviewColourScheme(oldColourScheme);
 +    }
 +
 +    try
 +    {
 +      frame.setClosed(true);
 +    } catch (Exception ex)
 +    {
 +    }
 +  }
 +
 +  static Hashtable userColourSchemes;
 +
 +  public static Hashtable getUserColourSchemes()
 +  {
 +    return userColourSchemes;
 +  }
 +
 +  public static void initUserColourSchemes(String files)
 +  {
 +    userColourSchemes = new Hashtable();
 +
 +    if (files == null || files.length() == 0)
 +    {
 +      return;
 +    }
 +
 +    // In case colours can't be loaded, we'll remove them
 +    // from the default list here.
 +    StringBuffer coloursFound = new StringBuffer();
 +    StringTokenizer st = new StringTokenizer(files, "|");
 +    while (st.hasMoreElements())
 +    {
 +      String file = st.nextToken();
 +      try
 +      {
 +        UserColourScheme ucs = loadColours(file);
 +        if (ucs != null)
 +        {
 +          if (coloursFound.length() > 0)
 +          {
 +            coloursFound.append("|");
 +          }
 +          coloursFound.append(file);
 +          userColourSchemes.put(ucs.getName(), ucs);
 +        }
 +      } catch (Exception ex)
 +      {
 +        System.out.println("Error loading User ColourFile\n" + ex);
 +      }
 +    }
 +    if (!files.equals(coloursFound.toString()))
 +    {
 +      if (coloursFound.toString().length() > 1)
 +      {
 +        jalview.bin.Cache.setProperty("USER_DEFINED_COLOURS",
 +                coloursFound.toString());
 +      }
 +      else
 +      {
 +        jalview.bin.Cache.applicationProperties
 +                .remove("USER_DEFINED_COLOURS");
 +      }
 +    }
 +  }
 +
 +  public static void removeColourFromDefaults(String target)
 +  {
 +    // The only way to find colours by name is to load them in
 +    // In case colours can't be loaded, we'll remove them
 +    // from the default list here.
 +
 +    userColourSchemes = new Hashtable();
 +
 +    StringBuffer coloursFound = new StringBuffer();
 +    StringTokenizer st = new StringTokenizer(
 +            jalview.bin.Cache.getProperty("USER_DEFINED_COLOURS"), "|");
 +
 +    while (st.hasMoreElements())
 +    {
 +      String file = st.nextToken();
 +      try
 +      {
 +        UserColourScheme ucs = loadColours(file);
 +        if (ucs != null && !ucs.getName().equals(target))
 +        {
 +          if (coloursFound.length() > 0)
 +          {
 +            coloursFound.append("|");
 +          }
 +          coloursFound.append(file);
 +          userColourSchemes.put(ucs.getName(), ucs);
 +        }
 +      } catch (Exception ex)
 +      {
 +        System.out.println("Error loading User ColourFile\n" + ex);
 +      }
 +    }
 +
 +    if (coloursFound.toString().length() > 1)
 +    {
 +      jalview.bin.Cache.setProperty("USER_DEFINED_COLOURS",
 +              coloursFound.toString());
 +    }
 +    else
 +    {
 +      jalview.bin.Cache.applicationProperties
 +              .remove("USER_DEFINED_COLOURS");
 +    }
 +
 +  }
 +
 +  public void caseSensitive_actionPerformed(ActionEvent e)
 +  {
 +    resetButtonPanel(caseSensitive.isSelected());
 +    lcaseColour.setEnabled(caseSensitive.isSelected());
 +  }
 +
 +  public void lcaseColour_actionPerformed(ActionEvent e)
 +  {
 +    if (selectedButtons == null)
 +    {
 +      selectedButtons = new Vector();
 +    }
 +    else
 +    {
 +      selectedButtons.clear();
 +    }
 +    selectedButtons.add(lcaseColour);
 +  }
 +
 +}
   * PURPOSE.  See the GNU General Public License for more details.
   * 
   * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
 + * The Jalview Authors are detailed in the 'AUTHORS' file.
   */
 -
  package jalview.gui;
  
+ import jalview.util.MessageManager;
  import java.awt.Component;
  import java.awt.event.ActionEvent;
  import java.awt.event.ActionListener;
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
   */
  package jalview.jbgui;
  
++import jalview.util.MessageManager;
++
  import java.awt.*;
  import java.awt.event.*;
++
  import javax.swing.*;
  
  /**
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge