JAL-1355 (basic i18n support)
authordarolmar <darolmar@gmail.com>
Wed, 25 Dec 2013 15:52:36 +0000 (16:52 +0100)
committerdarolmar <darolmar@gmail.com>
Wed, 25 Dec 2013 20:01:45 +0000 (21:01 +0100)
68 files changed:
doc/i18n.html
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

index d2a7420..0be5673 100644 (file)
 <p>To use it within your code, you only have to invoke MessageManager with the text key in Messages_xx.properties:</p>\r
 <p>JButton ok = new JButton(MessageManager.getString("button.ok"));</p>\r
 <p>This will set JButton text to the one included at button.ok key. In English JButton text will be OK, while in Spanish will be Aceptar. This is the big thing of i18n. :)</p>\r
+<h1>Don't rely comparisons on labels</h1>\r
+<p>Don't use this type of coding:\r
+    threshold.addItem("No Threshold");<br>\r
+    threshold.addItem("Above Threshold");<br>\r
+    threshold.addItem("Below Threshold");<br>\r
+    [...]<br>\r
+    if (threshold.getSelectedItem().equals("Above Threshold"))<br>\r
+    {</br>\r
+      aboveThreshold = AnnotationColourGradient.ABOVE_THRESHOLD;<br>\r
+    }<br>\r
+    else if (threshold.getSelectedItem().equals("Below Threshold"))<br>\r
+    {<br>\r
+      aboveThreshold = AnnotationColourGradient.BELOW_THRESHOLD;<br>\r
+    }<br>\r
+</p>\r
+<p>Once text has been translated, these equals will fail as the label won't be the English ones. It should be used getSelectedIndex() instead of getSelectedItem(). If you do the proper way, the code will look like this:<br>\r
+    threshold.addItem(MessageManager.getString("label.threshold_feature_no_thereshold"));<br>\r
+    threshold.addItem(MessageManager.getString("label.threshold_feature_above_thereshold"));<br>\r
+    threshold.addItem(MessageManager.getString("label.threshold_feature_below_thereshold"));<br>\r
+    [...]<br>\r
+    if (threshold.getSelectedIndex()==1)<br>\r
+    {<br>\r
+      aboveThreshold = AnnotationColourGradient.ABOVE_THRESHOLD;<br>\r
+    }<br>\r
+    else if (threshold.getSelectedIndex()==2)<br>\r
+    {<br>\r
+      aboveThreshold = AnnotationColourGradient.BELOW_THRESHOLD;<br>\r
+    }<br>    \r
+</p>\r
 <h1>How to translate Jalview</h1>\r
 <p>Anyone interested in localizing/translating Jalview is strongly encouraged to join the <a href="mailto:jalview-dev@jalview.org">Jalview Development List</a> list. We would recommend that you read this entire page before proceeding.</p>\r
 <p>If you are planning on working on a Jalview translation, please send us an email (<a href="mailto:jalview-dev@jalview.org">Jalview Development List</a>). There may be someone else already working on translating Jalview to your target language.</p>\r
index 53a05dd..80f82cf 100644 (file)
@@ -1,3 +1,39 @@
+action.refresh_services = Refresh Services\r
+action.reset_services = Reset Services\r
+action.merge_results = Merge Results\r
+action.load_scheme = Load scheme\r
+action.save_scheme = Save scheme\r
+action.save_image = Save Image\r
+action.paste = Paste\r
+action.show_html_source = Show HTML Source\r
+action.print = Print\r
+action.web_service = Web Service\r
+action.cancel_job = Cancel Job\r
+action.start_job = Start Job\r
+action.revert = Revert\r
+action.move_down = Move Down\r
+action.move_up = Move Up\r
+action.remove_return_datatype = Remove return datatype\r
+action.add_return_datatype = Add return datatype\r
+action.remove_input_parameter = Remove selected input parameter\r
+action.add_input_parameter = Add input parameter\r
+action.edit = Edit\r
+action.new = New\r
+action.open_file = Open file\r
+action.show_unconserved = Show Unconserved\r
+action.open_new_aligmnent = Open new alignment\r
+action.raise_associated_windows = Raise Associated Windows\r
+action.minimize_associated_windows = Minimize Associated Windows\r
+action.close_all = Close all\r
+action.load_project = Load Project\r
+action.save_project = Save Project\r
+action.quit = Quit\r
+action.expand_views = Expand Views\r
+action.gather_views = Gather Views\r
+action.page_setup = Page Setup\r
+action.reload = Reload\r
+action.load = Load\r
+action.open = Open\r
 action.cancel = Cancel\r
 action.create = Create\r
 action.update = Update\r
@@ -13,12 +49,15 @@ action.remove_left = Remove left
 action.remove_right = Remove right\r
 action.remove_empty_columns = Remove Empty Columns\r
 action.remove_all_gaps = Remove All Gaps\r
+action.left_justify_alignment = Left Justify Alignment\r
+action.right_justify_alignment = Right Justify Alignment\r
 action.boxes = Boxes\r
 action.text = Text\r
 action.by_pairwise_id = by Pairwise Identity\r
 action.by_id = by Id\r
 action.by_length = by Length\r
 action.by_group = by Group\r
+action.remove = Remove\r
 action.remove_redundancy = Remove Redundancy...\r
 action.pairwise_alignment = Pairwise Alignments...\r
 action.by_rna_helixes = by RNA Helices\r
@@ -26,12 +65,13 @@ action.user_defined = User Defined...
 action.by_conservation = By Conservation\r
 action.wrap = Wrap\r
 action.show_gaps = Show Gaps\r
-action.find = Find...\r
+action.show_hidden_markers = Show Hidden Markers\r
+action.find = Find\r
 action.undefine_groups = Undefine Groups\r
+action.create_groups = Create Groups\r
 action.make_groups_selection = Make Groups For Selection\r
 action.copy = Copy\r
 action.cut = Cut\r
-action.paste = Paste\r
 action.font = Font...\r
 action.scale_above = Scale Above\r
 action.scale_left = Scale Left\r
@@ -50,8 +90,12 @@ action.set_defaults = Defaults
 action.create_group = Create Group\r
 action.remove_group = Remove Group\r
 action.edit_group = Edit Group\r
+action.border_colour = Border colour\r
 action.edit_new_group = Edit New Group\r
 action.hide_sequences = Hide Sequences\r
+action.sequences = Sequences\r
+action.ids = IDS\r
+action.ids_sequences = IDS and sequences\r
 action.reveal_all = Reveal All\r
 action.reveal_sequences = Reveal Sequences\r
 action.find_all = Find all\r
@@ -71,9 +115,12 @@ action.new_view = New View
 action.close = Close\r
 action.add = Add\r
 action.save_as_default = Save as default\r
+action.save_as = Save as\r
+action.save = Save\r
 action.cancel_fetch = Cancel Fetch\r
 action.save_omit_hidden_columns = Save / Omit Hidden Columns\r
 action.change_font = Change Font\r
+action.change_font_tree_panel = Change Font (Tree Panel)\r
 action.colour = Colour\r
 action.calculate = Calculate\r
 action.select_all = Select all\r
@@ -81,7 +128,10 @@ action.deselect_all = Deselect all
 action.invert_selection = Invert selection\r
 action.using_jmol = Using Jmol\r
 action.link = Link\r
+action.group_link = Group Links\r
 action.show_chain = Show Chain\r
+action.show_group = Show Group\r
+action.fetch_db_references = Fetch DB References\r
 label.str = Str:\r
 label.seq = Seq:\r
 label.structures_manager = Structures Manager\r
@@ -89,9 +139,12 @@ label.nickname = Nickname:
 label.url = URL:\r
 label.input_file_url = Enter URL or Input File\r
 label.select_feature = Select feature:\r
-label.name = Name:\r
+label.name = Name\r
 label.name_param = Name: {0}\r
-label.group = Group:\r
+label.group = Group\r
+label.group_name = Group Name\r
+label.group_description = Group Description\r
+label.edit_group_name_description = Edit Group Name/Description\r
 label.colour = Colour:\r
 label.description = Description:\r
 label.start = Start:\r
@@ -112,8 +165,15 @@ label.neighbour_joining_identity = Neighbour Joining Using % Identity
 label.status_bar = Status bar\r
 label.out_to_textbox = Output to Textbox\r
 label.clustalx = Clustalx\r
+label.clustal = Clustal\r
 label.zappo = Zappo\r
 label.taylor = Taylor\r
+label.blc = BLC\r
+label.fasta = Fasta\r
+label.msf = MSF\r
+label.pfam = PFAM\r
+label.pileup = Pileup\r
+label.pir = PIR\r
 label.hydrophobicity = Hydrophobicity\r
 label.helix_propensity = Helix Propensity\r
 label.strand_propensity = Strand Propensity\r
@@ -121,6 +181,7 @@ label.turn_propensity = Turn Propensity
 label.buried_index = Buried Index\r
 label.purine_pyrimidine = Purine/Pyrimidine\r
 label.percentage_identity = Percentage Identity\r
+label.blosum62 = BLOSUM62\r
 label.blosum62_score = BLOSUM62 Score\r
 label.tcoffee_scores = T-Coffee Scores\r
 label.average_distance_bloslum62 = Average Distance Using BLOSUM62\r
@@ -131,6 +192,7 @@ label.show_non_conversed = Show nonconserved
 label.overview_window = Overview Window\r
 label.none = None\r
 label.above_identity_threshold = Above Identity Threshold\r
+label.show_sequence_features = Show Sequence Features\r
 label.nucleotide = Nucleotide\r
 label.to_new_alignment = To New Alignment\r
 label.to_this_alignment = Add To This Alignment\r
@@ -159,11 +221,11 @@ label.show_consensus_logo = Show Consensus Logo
 label.norm_consensus_logo = Normalise Consensus Logo\r
 label.apply_all_groups = Apply to all groups\r
 label.autocalculated_annotation = Autocalculated Annotation\r
-label.min_colour = Min Colour\r
-label.max_colour = Max Colour\r
+label.min_colour = Minimum Colour\r
+label.max_colour = Maximum Colour\r
 label.use_original_colours = Use Original Colours\r
 label.threshold_minmax = Threshold is min/max\r
-label.represent_group_with = Represent Group with\r
+label.represent_group_with = Represent Group with {0}\r
 label.selection = Selection\r
 label.group_colour = Group Colour\r
 label.sequence = Sequence\r
@@ -176,6 +238,8 @@ label.match_case = Match Case
 label.view_alignment_editor = View in alignment editor\r
 label.labels = Labels\r
 label.output_values = Output Values...\r
+label.output_points = Output points...\r
+label.output_transformed_points = Output transformed points\r
 label.input_data = Input Data...\r
 label.nucleotide_matrix = Nucleotide matrix\r
 label.protein_matrix = Protein matrix\r
@@ -184,6 +248,7 @@ label.show_distances = Show distances
 label.mark_unassociated_leaves = Mark Unassociated Leaves\r
 label.fit_to_window = Fit To Window\r
 label.newick_format = Newick Format\r
+label.select_newick_like_tree_file = Select a newick-like tree file\r
 label.colours = Colours\r
 label.view_mapping = View Mapping\r
 label.wireframe = Wireframe\r
@@ -205,6 +270,7 @@ label.could_not_parse_newick_file  = Could not parse Newick file\!\n {0}
 label.successfully_pasted_tcoffee_scores_to_alignment= Successfully pasted T-Coffee scores to alignment.\r
 label.failed_add_tcoffee_scores = Failed to add T-Coffee scores: \r
 label.successfully_pasted_annotation_to_alignment= Successfully pasted annotation to alignment.\r
+label.couldnt_parse_pasted_text_as_valid_annotation_feature_GFF_tcoffee_file = Couldn't parse pasted text as a valid annotation, feature, GFF, or T-Coffee score file\r
 label.successfully_pasted_alignment_file = Successfully pasted alignment file\r
 label.paste_your_alignment_file = Paste your alignment file here\r
 label.paste_your = Paste your\r
@@ -238,6 +304,10 @@ label.blog_item_published_on_date = {0} {1}
 label.select_das_service_from_table = Select a DAS service from the table to read a full description here.</font></html>\r
 label.session_update = Session Update\r
 label.new_vamsas_session = New Vamsas Session\r
+label.load_vamsas_session = Load Vamsas Session\r
+label.save_vamsas_session = Save Vamsas Session\r
+label.select_vamsas_session_opened_as_new_vamsas_session= Select a vamsas session to be opened as a new vamsas session.\r
+label.open_saved_vamsas_session = Open a saved VAMSAS session\r
 label.groovy_console = Groovy Console...\r
 label.lineart = Lineart\r
 label.dont_ask_me_again = Don't ask me again\r
@@ -250,6 +320,7 @@ label.save_colours = Save Colours
 label.fetch_das_features = Fetch DAS Features\r
 label.selected_database_to_fetch_from = Selected {0} database {1} to fetch from {2} \r
 label.database_param = Database: {0}\r
+label.example = Example\r
 label.example_param = Example: {0}\r
 label.select_file_format_before_saving = You must select a file format before saving!\r
 label.file_format_not_specified = File format not specified\r
@@ -295,6 +366,7 @@ label.enter_local_das_source = Enter Nickname & URL of Local DAS Source
 label.you_can_only_edit_or_remove_local_das_sources = You can only edit or remove local DAS Sources!\r
 label.public_das_source = Public DAS source - not editable\r
 label.input_alignment_from_url = Input Alignment From URL\r
+label.input_alignment = Input Alignment\r
 label.couldnt_import_as_vamsas_session = Couldn't import '{0}' as a new vamsas session.\r
 label.vamsas_document_import_failed = Vamsas Document Import Failed\r
 label.couldnt_locate = Couldn't locate {0}\r
@@ -319,6 +391,7 @@ label.jalview_user_survey = Jalview User Survey
 label.alignment_properties = Alignment Properties: {0}\r
 label.alignment_props = Alignment Properties\r
 label.input_cut_paste = Cut & Paste Input\r
+label.input_cut_paste_params = Cut & Paste Input - {0}\r
 label.alignment_output_command = Alignment output - {0}\r
 label.annotations = Annotations\r
 label.features = Features\r
@@ -365,7 +438,7 @@ label.state_job_error = job error!
 label.server_error_try_later = Server Error! (try later)\r
 label.error_loading_pdb_data = Error loading PDB data!!\r
 label.fetching_pdb_data = Fetching PDB data...\r
-label.structure_type = Structure_type\r
+label.structure_type = Structure type\r
 label.settings_for_type = Settings for {0}\r
 label.view_full_application = View in Full Application\r
 label.load_associated_tree = Load Associated Tree ...\r
@@ -380,10 +453,270 @@ label.toggle_case = Toggle Case
 label.edit_name_description = Edit Name/Description\r
 label.create_sequence_feature = Create Sequence Feature\r
 label.edit_sequence = Edit Sequence\r
+label.edit_sequences = Edit Sequences\r
 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
\ No newline at end of file
index b9cdaea..f55155e 100755 (executable)
@@ -140,10 +140,10 @@ public class PDBViewer extends JInternalFrame implements Runnable
     });
 
     this.setJMenuBar(jMenuBar1);
-    fileMenu.setText("File");
-    coloursMenu.setText("Colours");
-    saveMenu.setActionCommand("Save Image");
-    saveMenu.setText("Save As");
+    fileMenu.setText(MessageManager.getString("action.file"));
+    coloursMenu.setText(MessageManager.getString("label.colours"));
+    saveMenu.setActionCommand(MessageManager.getString("action.save_image"));
+    saveMenu.setText(MessageManager.getString("action.save_as"));
     png.setText("PNG");
     png.addActionListener(new ActionListener()
     {
@@ -160,7 +160,7 @@ public class PDBViewer extends JInternalFrame implements Runnable
         eps_actionPerformed(e);
       }
     });
-    mapping.setText("View Mapping");
+    mapping.setText(MessageManager.getString("label.view_mapping"));
     mapping.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -168,7 +168,7 @@ public class PDBViewer extends JInternalFrame implements Runnable
         mapping_actionPerformed(e);
       }
     });
-    wire.setText("Wireframe");
+    wire.setText(MessageManager.getString("label.wireframe"));
     wire.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -177,7 +177,7 @@ public class PDBViewer extends JInternalFrame implements Runnable
       }
     });
     depth.setSelected(true);
-    depth.setText("Depthcue");
+    depth.setText(MessageManager.getString("label.depthcue"));
     depth.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -186,7 +186,7 @@ public class PDBViewer extends JInternalFrame implements Runnable
       }
     });
     zbuffer.setSelected(true);
-    zbuffer.setText("Z Buffering");
+    zbuffer.setText(MessageManager.getString("label.z_buffering"));
     zbuffer.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -194,7 +194,7 @@ public class PDBViewer extends JInternalFrame implements Runnable
         zbuffer_actionPerformed(e);
       }
     });
-    charge.setText("Charge & Cysteine");
+    charge.setText(MessageManager.getString("label.charge_cysteine"));
     charge.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -202,7 +202,7 @@ public class PDBViewer extends JInternalFrame implements Runnable
         charge_actionPerformed(e);
       }
     });
-    chain.setText("By Chain");
+    chain.setText(MessageManager.getString("action.by_chain"));
     chain.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -211,7 +211,7 @@ public class PDBViewer extends JInternalFrame implements Runnable
       }
     });
     seqButton.setSelected(true);
-    seqButton.setText("By Sequence");
+    seqButton.setText(MessageManager.getString("action.by_sequence"));
     seqButton.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -220,7 +220,7 @@ public class PDBViewer extends JInternalFrame implements Runnable
       }
     });
     allchains.setSelected(true);
-    allchains.setText("Show All Chains");
+    allchains.setText(MessageManager.getString("label.show_all_chains"));
     allchains.addItemListener(new ItemListener()
     {
       public void itemStateChanged(ItemEvent e)
@@ -228,7 +228,7 @@ public class PDBViewer extends JInternalFrame implements Runnable
         allchains_itemStateChanged(e);
       }
     });
-    zappo.setText("Zappo");
+    zappo.setText(MessageManager.getString("label.zappo"));
     zappo.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -236,7 +236,7 @@ public class PDBViewer extends JInternalFrame implements Runnable
         zappo_actionPerformed(e);
       }
     });
-    taylor.setText("Taylor");
+    taylor.setText(MessageManager.getString("label.taylor"));
     taylor.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -244,7 +244,7 @@ public class PDBViewer extends JInternalFrame implements Runnable
         taylor_actionPerformed(e);
       }
     });
-    hydro.setText("Hydro");
+    hydro.setText(MessageManager.getString("label.hydrophobicity"));
     hydro.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -252,7 +252,7 @@ public class PDBViewer extends JInternalFrame implements Runnable
         hydro_actionPerformed(e);
       }
     });
-    helix.setText("Helix");
+    helix.setText(MessageManager.getString("label.helix_propensity"));
     helix.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -260,7 +260,7 @@ public class PDBViewer extends JInternalFrame implements Runnable
         helix_actionPerformed(e);
       }
     });
-    strand.setText("Strand");
+    strand.setText(MessageManager.getString("label.strand_propensity"));
     strand.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -268,7 +268,7 @@ public class PDBViewer extends JInternalFrame implements Runnable
         strand_actionPerformed(e);
       }
     });
-    turn.setText("Turn");
+    turn.setText(MessageManager.getString("label.turn_propensity"));
     turn.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -276,7 +276,7 @@ public class PDBViewer extends JInternalFrame implements Runnable
         turn_actionPerformed(e);
       }
     });
-    buried.setText("Buried");
+    buried.setText(MessageManager.getString("label.buried_index"));
     buried.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -284,7 +284,7 @@ public class PDBViewer extends JInternalFrame implements Runnable
         buried_actionPerformed(e);
       }
     });
-    user.setText("User Defined...");
+    user.setText(MessageManager.getString("action.user_defined"));
     user.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -292,8 +292,8 @@ public class PDBViewer extends JInternalFrame implements Runnable
         user_actionPerformed(e);
       }
     });
-    viewMenu.setText("View");
-    background.setText("Background Colour...");
+    viewMenu.setText(MessageManager.getString("action.view"));
+    background.setText(MessageManager.getString("label.background_colour") + "...");
     background.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -301,7 +301,7 @@ public class PDBViewer extends JInternalFrame implements Runnable
         background_actionPerformed(e);
       }
     });
-    savePDB.setText("PDB File");
+    savePDB.setText(MessageManager.getString("label.pdb_file"));
     savePDB.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -565,7 +565,7 @@ public class PDBViewer extends JInternalFrame implements Runnable
     try
     {
       cap.setText(pdbcanvas.mappingDetails.toString());
-      Desktop.addInternalFrame(cap, "PDB - Sequence Mapping", 550, 600);
+      Desktop.addInternalFrame(cap, MessageManager.getString("label.pdb_sequence_mapping"), 550, 600);
     } catch (OutOfMemoryError oom)
     {
       new OOMWarning("Opening sequence to structure mapping report", oom);
@@ -628,7 +628,7 @@ public class PDBViewer extends JInternalFrame implements Runnable
 
   public void user_actionPerformed(ActionEvent e)
   {
-    if (e.getActionCommand().equals("User Defined..."))
+    if (e.getActionCommand().equals(MessageManager.getString("action.user_defined")))
     {
       // new UserDefinedColours(pdbcanvas, null);
     }
@@ -646,7 +646,7 @@ public class PDBViewer extends JInternalFrame implements Runnable
   public void background_actionPerformed(ActionEvent e)
   {
     java.awt.Color col = JColorChooser.showDialog(this,
-            "Select Background Colour", pdbcanvas.backgroundColour);
+            MessageManager.getString("label.select_backgroud_colour"), pdbcanvas.backgroundColour);
 
     if (col != null)
     {
@@ -663,7 +663,7 @@ public class PDBViewer extends JInternalFrame implements Runnable
 
     chooser.setFileView(new JalviewFileView());
     chooser.setDialogTitle("Save PDB File");
-    chooser.setToolTipText("Save");
+    chooser.setToolTipText(MessageManager.getString("action.save"));
 
     int value = chooser.showSaveDialog(this);
 
index c51653d..2f8b5a5 100644 (file)
@@ -773,10 +773,10 @@ public class APopupMenu extends java.awt.PopupMenu implements
     seqMenu.setLabel(MessageManager.getString("label.sequence"));
     pdb.setLabel(MessageManager.getString("label.view_pdb_structure"));
     hideSeqs.setLabel(MessageManager.getString("action.hide_sequences"));
-    repGroup.setLabel(MessageManager.getString("label.represent_group_with"));
+    repGroup.setLabel(MessageManager.formatMessage("label.represent_group_with", new String[]{""}));
     revealAll.setLabel(MessageManager.getString("action.reveal_all"));
     revealSeq.setLabel(MessageManager.getString("action.reveal_sequences"));
-    menu1.setLabel(MessageManager.getString("label.group"));
+    menu1.setLabel(MessageManager.getString("label.group")+":");
     add(groupMenu);
     this.add(seqMenu);
     this.add(hideSeqs);
index 3c0f704..583f64f 100644 (file)
@@ -111,9 +111,9 @@ public class AnnotationColourChooser extends Panel implements
       annotations.addItem(list.elementAt(i).toString());
     }
 
-    threshold.addItem("No Threshold");
-    threshold.addItem("Above Threshold");
-    threshold.addItem("Below Threshold");
+    threshold.addItem(MessageManager.getString("label.threshold_feature_no_thereshold"));
+    threshold.addItem(MessageManager.getString("label.threshold_feature_above_thereshold"));
+    threshold.addItem(MessageManager.getString("label.threshold_feature_below_thereshold"));
 
     if (oldcs instanceof AnnotationColourGradient)
     {
@@ -122,13 +122,13 @@ public class AnnotationColourChooser extends Panel implements
       switch (acg.getAboveThreshold())
       {
       case AnnotationColourGradient.NO_THRESHOLD:
-        threshold.select("No Threshold");
+        threshold.select(0);
         break;
       case AnnotationColourGradient.ABOVE_THRESHOLD:
-        threshold.select("Above Threshold");
+        threshold.select(1);
         break;
       case AnnotationColourGradient.BELOW_THRESHOLD:
-        threshold.select("Below Threshold");
+        threshold.select(1);
         break;
       default:
         throw new Error(
@@ -401,11 +401,11 @@ public class AnnotationColourChooser extends Panel implements
             .getSelectedIndex()];
 
     int aboveThreshold = -1;
-    if (threshold.getSelectedItem().equals("Above Threshold"))
+    if (threshold.getSelectedIndex()==1)
     {
       aboveThreshold = AnnotationColourGradient.ABOVE_THRESHOLD;
     }
-    else if (threshold.getSelectedItem().equals("Below Threshold"))
+    else if (threshold.getSelectedIndex()==2)
     {
       aboveThreshold = AnnotationColourGradient.BELOW_THRESHOLD;
     }
index 8e758e6..bae94a5 100644 (file)
@@ -200,7 +200,7 @@ public class CutAndPasteTransfer extends Panel implements ActionListener,
           alignFrame.alignPanel.fontChanged();
           alignFrame.alignPanel.setScrollValues(0, 0);
           alignFrame.statusBar
-                  .setText("Successfully pasted annotation to alignment.");
+                  .setText(MessageManager.getString("label.successfully_pasted_annotation_to_alignment"));
 
         }
         else
@@ -209,7 +209,7 @@ public class CutAndPasteTransfer extends Panel implements ActionListener,
                   jalview.io.AppletFormatAdapter.PASTE))
           {
             alignFrame.statusBar
-                    .setText("Couldn't parse pasted text as a valid annotation, feature, GFF, or T-Coffee score file.");
+                    .setText(MessageManager.getString("label.couldnt_parse_pasted_text_as_valid_annotation_feature_GFF_tcoffee_file"));
           }
         }
       }
index c36d680..4e0b4a6 100644 (file)
@@ -113,7 +113,7 @@ public class FeatureColourChooser extends Panel implements ActionListener,
     slider.addAdjustmentListener(this);
     slider.addMouseListener(this);
     owner = (af != null) ? af : fs.frame;
-    frame = new JVDialog(owner, "Graduated Feature Colour for " + type,
+    frame = new JVDialog(owner, MessageManager.formatMessage("label.graduated_color_for_params", new String[]{type}),
             true, 480, 248);
     frame.setMainPanel(this);
     validate();
@@ -168,9 +168,9 @@ public class FeatureColourChooser extends Panel implements ActionListener,
     jPanel2.setBackground(Color.white);
     jPanel4.setBackground(Color.white);
     threshold.addItemListener(this);
-    threshold.addItem("No Threshold");
-    threshold.addItem("Above Threshold");
-    threshold.addItem("Below Threshold");
+    threshold.addItem(MessageManager.getString("label.threshold_feature_no_thereshold"));
+    threshold.addItem(MessageManager.getString("label.threshold_feature_above_thereshold"));
+    threshold.addItem(MessageManager.getString("label.threshold_feature_below_thereshold"));
     thresholdValue.addActionListener(this);
     slider.setBackground(Color.white);
     slider.setEnabled(false);
@@ -289,7 +289,7 @@ public class FeatureColourChooser extends Panel implements ActionListener,
     {
       UserDefinedColours udc = new UserDefinedColours(this,
               minColour.getBackground(), owner,
-              "Select Colour for Minimum Value"); // frame.owner,
+              MessageManager.getString("label.select_colour_minimum_value")); // frame.owner,
     }
     else
     {
@@ -310,7 +310,7 @@ public class FeatureColourChooser extends Panel implements ActionListener,
       // "Select Colour for Maximum Value",maxColour.getBackground(),true);
       UserDefinedColours udc = new UserDefinedColours(this,
               maxColour.getBackground(), owner,
-              "Select Colour for Maximum Value");
+              MessageManager.getString("label.select_colour_maximum_value"));
     }
     else
     {
@@ -330,11 +330,11 @@ public class FeatureColourChooser extends Panel implements ActionListener,
     }
 
     int aboveThreshold = AnnotationColourGradient.NO_THRESHOLD;
-    if (threshold.getSelectedItem().equals("Above Threshold"))
+    if (threshold.getSelectedIndex()==1)
     {
       aboveThreshold = AnnotationColourGradient.ABOVE_THRESHOLD;
     }
-    else if (threshold.getSelectedItem().equals("Below Threshold"))
+    else if (threshold.getSelectedIndex()==2)
     {
       aboveThreshold = AnnotationColourGradient.BELOW_THRESHOLD;
     }
index 7de8789..4527390 100644 (file)
@@ -186,7 +186,7 @@ public class FontChooser extends Panel implements ActionListener,
       fontName.select(lastSelected.getName());
       fontStyle.select(lastSelStyle);
       fontSize.select("" + lastSelSize);
-      JVDialog d = new JVDialog(this.frame, "Invalid Font", true, 350, 200);
+      JVDialog d = new JVDialog(this.frame, MessageManager.getString("label.invalid_font"), true, 350, 200);
       Panel mp = new Panel();
       d.cancel.setVisible(false);
       mp.setLayout(new FlowLayout());
index 62fd29d..4c7ae80 100644 (file)
-/*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8)
- * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle
- * 
- * 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/>.
- */
-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");
-
-    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);
-    } 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");
-
-    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);
-  }
-
-  /**
-   * 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(),
-            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..."))
-    {
-      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);
-    }
-  }
-
-  /**
-   * 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");
-
-    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(),
-              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(),
-              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");
-    webService.add(rfetch);
-
-    JMenuItem fetchr = new JMenuItem("Standard Databases");
-    fetchr.setToolTipText("Fetch from EMBL/EMBLCDS or Uniprot/PDB and any selected DAS sources");
-    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.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();
-      }
-    }
-  }
-}
+/*\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
+    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
+              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
+    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
+    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
+    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
+    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
+      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
+    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
+      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
+      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
+    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
+    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 = 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
index 5ee69f2..9b0ce7a 100644 (file)
@@ -73,7 +73,7 @@ public class AnnotationColourChooser extends JPanel
     frame = new JInternalFrame();
     frame.setContentPane(this);
     frame.setLayer(JLayeredPane.PALETTE_LAYER);
-    Desktop.addInternalFrame(frame, "Colour by Annotation", 520, 215);
+    Desktop.addInternalFrame(frame, MessageManager.getString("label.colour_by_annotation"), 520, 215);
 
     slider.addChangeListener(new ChangeListener()
     {
@@ -136,9 +136,9 @@ public class AnnotationColourChooser extends JPanel
     annotations = new JComboBox(
             getAnnotationItems(seqAssociated.isSelected()));
 
-    threshold.addItem("No Threshold");
-    threshold.addItem("Above Threshold");
-    threshold.addItem("Below Threshold");
+    threshold.addItem(MessageManager.getString("label.threshold_feature_no_thereshold"));
+    threshold.addItem(MessageManager.getString("label.threshold_feature_above_thereshold"));
+    threshold.addItem(MessageManager.getString("label.threshold_feature_below_thereshold"));
 
     if (oldcs instanceof AnnotationColourGradient)
     {
@@ -147,13 +147,13 @@ public class AnnotationColourChooser extends JPanel
       switch (acg.getAboveThreshold())
       {
       case AnnotationColourGradient.NO_THRESHOLD:
-        threshold.setSelectedItem("No Threshold");
+        threshold.setSelectedIndex(0);
         break;
       case AnnotationColourGradient.ABOVE_THRESHOLD:
-        threshold.setSelectedItem("Above Threshold");
+        threshold.setSelectedIndex(1);
         break;
       case AnnotationColourGradient.BELOW_THRESHOLD:
-        threshold.setSelectedItem("Below Threshold");
+        threshold.setSelectedIndex(2);
         break;
       default:
         throw new Error(
@@ -242,7 +242,7 @@ public class AnnotationColourChooser extends JPanel
     minColour.setFont(JvSwingUtils.getLabelFont());
     minColour.setBorder(BorderFactory.createEtchedBorder());
     minColour.setPreferredSize(new Dimension(40, 20));
-    minColour.setToolTipText("Minimum Colour");
+    minColour.setToolTipText(MessageManager.getString("label.min_colour"));
     minColour.addMouseListener(new MouseAdapter()
     {
       public void mousePressed(MouseEvent e)
@@ -256,7 +256,7 @@ public class AnnotationColourChooser extends JPanel
     maxColour.setFont(JvSwingUtils.getLabelFont());
     maxColour.setBorder(BorderFactory.createEtchedBorder());
     maxColour.setPreferredSize(new Dimension(40, 20));
-    maxColour.setToolTipText("Maximum Colour");
+    maxColour.setToolTipText(MessageManager.getString("label.max_colour"));
     maxColour.addMouseListener(new MouseAdapter()
     {
       public void mousePressed(MouseEvent e)
@@ -288,7 +288,7 @@ public class AnnotationColourChooser extends JPanel
     defColours.setOpaque(false);
     defColours.setText(MessageManager.getString("action.set_defaults"));
     defColours
-            .setToolTipText("Reset min and max colours to defaults from user preferences.");
+            .setToolTipText(MessageManager.getString("label.reset_min_max_colours_to_defaults"));
     defColours.addActionListener(new ActionListener()
     {
 
@@ -489,11 +489,11 @@ public class AnnotationColourChooser extends JPanel
             .getSelectedIndex()]];
 
     int aboveThreshold = -1;
-    if (threshold.getSelectedItem().equals("Above Threshold"))
+    if (threshold.getSelectedIndex()==1)
     {
       aboveThreshold = AnnotationColourGradient.ABOVE_THRESHOLD;
     }
-    else if (threshold.getSelectedItem().equals("Below Threshold"))
+    else if (threshold.getSelectedIndex()==2)
     {
       aboveThreshold = AnnotationColourGradient.BELOW_THRESHOLD;
     }
index 02758fa..3f14544 100644 (file)
@@ -97,7 +97,7 @@ public class AnnotationExporter extends JPanel
     chooser.setFileView(new JalviewFileView());
     chooser.setDialogTitle(features ? "Save Features to File"
             : "Save Annotation to File");
-    chooser.setToolTipText("Save");
+    chooser.setToolTipText(MessageManager.getString("action.save"));
 
     int value = chooser.showSaveDialog(this);
 
@@ -183,13 +183,12 @@ public class AnnotationExporter extends JPanel
     try
     {
       cap.setText(text);
-      Desktop.addInternalFrame(cap, (features ? "Features for - "
-              : "Annotations for - ") + ap.alignFrame.getTitle(), 600, 500);
+      Desktop.addInternalFrame(cap, (features ? MessageManager.formatMessage("label.features_for_params", new String[]{ap.alignFrame.getTitle()})
+              : MessageManager.formatMessage("label.annotations_for_params", new String[]{ap.alignFrame.getTitle()})), 600, 500);
     } catch (OutOfMemoryError oom)
     {
-      new OOMWarning("generating "
-              + (features ? "Features for - " : "Annotations for - ")
-              + ap.alignFrame.getTitle(), oom);
+      new OOMWarning((features ? MessageManager.formatMessage("label.generating_features_for_params", new String[]{ap.alignFrame.getTitle()}) : MessageManager.formatMessage("label.generating_annotations_for_params", new String[]{ap.alignFrame.getTitle()}))
+              , oom);
       cap.dispose();
     }
 
index c7fd4fe..1b90a31 100755 (executable)
@@ -531,7 +531,7 @@ public class AnnotationLabels extends JPanel implements MouseListener,
       return;
     }
 
-    JPopupMenu pop = new JPopupMenu("Annotations");
+    JPopupMenu pop = new JPopupMenu(MessageManager.getString("label.annotations"));
     JMenuItem item = new JMenuItem(ADDNEW);
     item.addActionListener(this);
     pop.add(item);
index ce731ad..92cd407 100755 (executable)
@@ -483,7 +483,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI,
         return;
       }
 
-      JPopupMenu pop = new JPopupMenu("Structure type");
+      JPopupMenu pop = new JPopupMenu(MessageManager.getString("label.structure_type"));
       JMenuItem item;
       /*
        * Just display the needed structure options
index 3b4b738..ef0e1b9 100644 (file)
-/*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8)
- * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle
- * 
- * 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/>.
- */
-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");
-              }
-            });
-    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");
-    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");
-
-    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",
-            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();
-  }
-
-}
+/*\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
+                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
+    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
+    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
+    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
index 1a4c7ac..efa9a8a 100644 (file)
@@ -27,6 +27,7 @@ import javax.swing.*;
 import jalview.bin.Cache;
 import jalview.datamodel.*;
 import jalview.structure.*;
+import jalview.util.MessageManager;
 import jalview.util.ShiftList;
 import fr.orsay.lri.varna.VARNAPanel;
 import fr.orsay.lri.varna.exceptions.ExceptionFileFormatOrSyntax;
@@ -117,7 +118,7 @@ public class AppVarna extends JInternalFrame implements
     // getContentPane().add(vab.getTools(), BorderLayout.NORTH);
     varnaPanel.addVARNAListener(this);
     varnaPanel.addSelectionListener(this);
-    jalview.gui.Desktop.addInternalFrame(this, "VARNA -" + name,
+    jalview.gui.Desktop.addInternalFrame(this, MessageManager.formatMessage("label.varna_params", new String[]{name}),
             getBounds().width, getBounds().height);
     this.pack();
     showPanel(true);
index 02b375f..897c0ca 100644 (file)
@@ -139,7 +139,7 @@ public class CutAndPasteHtmlTransfer extends GCutAndPasteHtmlTransfer
     chooser.setAcceptAllFileFilterUsed(false);
     chooser.setFileView(new JalviewFileView());
     chooser.setDialogTitle("Save Text to File");
-    chooser.setToolTipText("Save");
+    chooser.setToolTipText(MessageManager.getString("action.save"));
 
     int value = chooser.showSaveDialog(this);
 
@@ -211,8 +211,8 @@ public class CutAndPasteHtmlTransfer extends GCutAndPasteHtmlTransfer
   {
     if (SwingUtilities.isRightMouseButton(e))
     {
-      JPopupMenu popup = new JPopupMenu("Edit");
-      JMenuItem item = new JMenuItem("Copy");
+      JPopupMenu popup = new JPopupMenu(MessageManager.getString("action.edit"));
+      JMenuItem item = new JMenuItem(MessageManager.getString("action.copy"));
       item.addActionListener(new ActionListener()
       {
         public void actionPerformed(ActionEvent e)
index 2a555d0..1805c3b 100644 (file)
@@ -98,7 +98,7 @@ public class CutAndPasteTransfer extends GCutAndPasteTransfer
     chooser.setAcceptAllFileFilterUsed(false);
     chooser.setFileView(new JalviewFileView());
     chooser.setDialogTitle("Save Text to File");
-    chooser.setToolTipText("Save");
+    chooser.setToolTipText(MessageManager.getString("action.save"));
 
     int value = chooser.showSaveDialog(this);
 
@@ -199,7 +199,7 @@ public class CutAndPasteTransfer extends GCutAndPasteTransfer
         AlignFrame af = new AlignFrame(al, AlignFrame.DEFAULT_WIDTH,
                 AlignFrame.DEFAULT_HEIGHT);
         af.currentFileFormat = format;
-        Desktop.addInternalFrame(af, "Cut & Paste input - " + format,
+        Desktop.addInternalFrame(af, MessageManager.formatMessage("label.input_cut_paste_params", new String[]{format}),
                 AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT);
         af.statusBar.setText(MessageManager.getString("label.successfully_pasted_alignment_file"));
 
@@ -234,8 +234,8 @@ public class CutAndPasteTransfer extends GCutAndPasteTransfer
   {
     if (SwingUtilities.isRightMouseButton(e))
     {
-      JPopupMenu popup = new JPopupMenu("Edit");
-      JMenuItem item = new JMenuItem("Copy");
+      JPopupMenu popup = new JPopupMenu(MessageManager.getString("action.edit"));
+      JMenuItem item = new JMenuItem(MessageManager.getString("action.copy"));
       item.addActionListener(new ActionListener()
       {
         public void actionPerformed(ActionEvent e)
@@ -244,7 +244,7 @@ public class CutAndPasteTransfer extends GCutAndPasteTransfer
         }
       });
       popup.add(item);
-      item = new JMenuItem("Paste");
+      item = new JMenuItem(MessageManager.getString("action.paste"));
       item.addActionListener(new ActionListener()
       {
         public void actionPerformed(ActionEvent e)
index f4d1885..7ca6338 100644 (file)
@@ -558,7 +558,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements
   void showPasteMenu(int x, int y)
   {
     JPopupMenu popup = new JPopupMenu();
-    JMenuItem item = new JMenuItem("Paste To New Window");
+    JMenuItem item = new JMenuItem(MessageManager.getString("label.paste_new_window"));
     item.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent evt)
@@ -901,8 +901,8 @@ public class Desktop extends jalview.jbgui.GDesktop implements
             jalview.bin.Cache.getProperty("DEFAULT_FILE_FORMAT"));
 
     chooser.setFileView(new JalviewFileView());
-    chooser.setDialogTitle("Open local file");
-    chooser.setToolTipText("Open");
+    chooser.setDialogTitle(MessageManager.getString("label.open_local_file"));
+    chooser.setToolTipText(MessageManager.getString("action.open"));
 
     int value = chooser.showOpenDialog(this);
 
@@ -1712,7 +1712,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements
 
       chooser.setFileView(new JalviewFileView());
       chooser.setDialogTitle("Open a saved VAMSAS session");
-      chooser.setToolTipText("select a vamsas session to be opened as a new vamsas session.");
+      chooser.setToolTipText(MessageManager.getString("label.select_vamsas_session_opened_as_new_vamsas_session"));
 
       int value = chooser.showOpenDialog(this);
 
@@ -1914,7 +1914,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements
         {
           JMenuItem sessit = new JMenuItem();
           sessit.setText(sess[i]);
-          sessit.setToolTipText("Connect to session " + sess[i]);
+          sessit.setToolTipText(MessageManager.formatMessage("label.connect_to_session", new String[]{sess[i]}));
           final Desktop dsktp = this;
           final String mysesid = sess[i];
           sessit.addActionListener(new ActionListener()
index 0fc55e1..b17eced 100644 (file)
@@ -183,7 +183,7 @@ public class FeatureColourChooser extends JalviewDialog
     minColour.setFont(JvSwingUtils.getLabelFont());
     minColour.setBorder(BorderFactory.createLineBorder(Color.black));
     minColour.setPreferredSize(new Dimension(40, 20));
-    minColour.setToolTipText("Minimum Colour");
+    minColour.setToolTipText(MessageManager.getString("label.min_colour"));
     minColour.addMouseListener(new MouseAdapter()
     {
       public void mousePressed(MouseEvent e)
@@ -197,7 +197,7 @@ public class FeatureColourChooser extends JalviewDialog
     maxColour.setFont(JvSwingUtils.getLabelFont());
     maxColour.setBorder(BorderFactory.createLineBorder(Color.black));
     maxColour.setPreferredSize(new Dimension(40, 20));
-    maxColour.setToolTipText("Maximum Colour");
+    maxColour.setToolTipText(MessageManager.getString("label.max_colour"));
     maxColour.addMouseListener(new MouseAdapter()
     {
       public void mousePressed(MouseEvent e)
@@ -224,10 +224,10 @@ public class FeatureColourChooser extends JalviewDialog
         threshold_actionPerformed(e);
       }
     });
-    threshold.setToolTipText("Threshold the feature display by score.");
-    threshold.addItem("No Threshold"); // index 0
-    threshold.addItem("Above Threshold"); // index 1
-    threshold.addItem("Below Threshold"); // index 2
+    threshold.setToolTipText(MessageManager.getString("label.threshold_feature_display_by_score"));
+    threshold.addItem(MessageManager.getString("label.threshold_feature_no_thereshold")); // index 0
+    threshold.addItem(MessageManager.getString("label.threshold_feature_above_thereshold")); // index 1
+    threshold.addItem(MessageManager.getString("label.threshold_feature_below_thereshold")); // index 2
     jPanel3.setLayout(flowLayout2);
     thresholdValue.addActionListener(new ActionListener()
     {
@@ -242,14 +242,14 @@ public class FeatureColourChooser extends JalviewDialog
     slider.setEnabled(false);
     slider.setOpaque(false);
     slider.setPreferredSize(new Dimension(100, 32));
-    slider.setToolTipText("Adjust threshold");
+    slider.setToolTipText(MessageManager.getString("label.adjust_thereshold"));
     thresholdValue.setEnabled(false);
     thresholdValue.setColumns(7);
     jPanel3.setBackground(Color.white);
     thresholdIsMin.setBackground(Color.white);
     thresholdIsMin.setText(MessageManager.getString("label.threshold_minmax"));
     thresholdIsMin
-            .setToolTipText("Toggle between absolute and relative display threshold.");
+            .setToolTipText(MessageManager.getString("label.toggle_absolute_relative_display_threshold"));
     thresholdIsMin.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent actionEvent)
@@ -260,7 +260,7 @@ public class FeatureColourChooser extends JalviewDialog
     colourByLabel.setBackground(Color.white);
     colourByLabel.setText(MessageManager.getString("label.colour_by_label"));
     colourByLabel
-            .setToolTipText("Display features of the same type with a different label using a different colour. (e.g. domain features)");
+            .setToolTipText(MessageManager.getString("label.display_features_same_type_different_label_using_different_colour"));
     colourByLabel.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent actionEvent)
@@ -330,7 +330,7 @@ public class FeatureColourChooser extends JalviewDialog
   public void minColour_actionPerformed()
   {
     Color col = JColorChooser.showDialog(this,
-            "Select Colour for Minimum Value", minColour.getBackground());
+            MessageManager.getString("label.select_colour_minimum_value"), minColour.getBackground());
     if (col != null)
     {
       minColour.setBackground(col);
@@ -343,7 +343,7 @@ public class FeatureColourChooser extends JalviewDialog
   public void maxColour_actionPerformed()
   {
     Color col = JColorChooser.showDialog(this,
-            "Select Colour for Maximum Value", maxColour.getBackground());
+            MessageManager.getString("label.select_colour_maximum_value"), maxColour.getBackground());
     if (col != null)
     {
       maxColour.setBackground(col);
@@ -362,11 +362,11 @@ public class FeatureColourChooser extends JalviewDialog
     }
 
     int aboveThreshold = AnnotationColourGradient.NO_THRESHOLD;
-    if (threshold.getSelectedItem().equals("Above Threshold"))
+    if (threshold.getSelectedIndex()==1)
     {
       aboveThreshold = AnnotationColourGradient.ABOVE_THRESHOLD;
     }
-    else if (threshold.getSelectedItem().equals("Below Threshold"))
+    else if (threshold.getSelectedIndex()==2)
     {
       aboveThreshold = AnnotationColourGradient.BELOW_THRESHOLD;
     }
index 587c12f..57bd59e 100644 (file)
@@ -1117,7 +1117,7 @@ public class FeatureRenderer implements jalview.api.FeatureRenderer
 
     tmp = new JPanel();
     panel.add(tmp);
-    tmp.add(new JLabel(MessageManager.getString("label.group"), JLabel.RIGHT));
+    tmp.add(new JLabel(MessageManager.getString("label.group")+":", JLabel.RIGHT));
     tmp.add(source);
 
     tmp = new JPanel();
index 106ced9..963209c 100644 (file)
@@ -166,11 +166,11 @@ public class FeatureSettings extends JPanel
     frame.setContentPane(this);
     if (new jalview.util.Platform().isAMac())
     {
-      Desktop.addInternalFrame(frame, "Sequence Feature Settings", 475, 480);
+      Desktop.addInternalFrame(frame, MessageManager.getString("label.sequence_feature_settings"), 475, 480);
     }
     else
     {
-      Desktop.addInternalFrame(frame, "Sequence Feature Settings", 400, 450);
+      Desktop.addInternalFrame(frame, MessageManager.getString("label.sequence_feature_settings"), 400, 450);
     }
 
     frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
@@ -188,8 +188,8 @@ public class FeatureSettings extends JPanel
   protected void popupSort(final int selectedRow, final String type,
           final Object typeCol, final Hashtable minmax, int x, int y)
   {
-    JPopupMenu men = new JPopupMenu("Settings for " + type);
-    JMenuItem scr = new JMenuItem("Sort by Score");
+    JPopupMenu men = new JPopupMenu(MessageManager.formatMessage("label.settings_for_param", new String[]{type}));
+    JMenuItem scr = new JMenuItem(MessageManager.getString("label.sort_by_score"));
     men.add(scr);
     final FeatureSettings me = this;
     scr.addActionListener(new ActionListener()
@@ -202,7 +202,7 @@ public class FeatureSettings extends JPanel
       }
 
     });
-    JMenuItem dens = new JMenuItem("Sort by Density");
+    JMenuItem dens = new JMenuItem(MessageManager.getString("label.sort_by_density"));
     dens.addActionListener(new ActionListener()
     {
 
@@ -603,7 +603,7 @@ public class FeatureSettings extends JPanel
             { "Sequence Feature Colours" }, "Sequence Feature Colours");
     chooser.setFileView(new jalview.io.JalviewFileView());
     chooser.setDialogTitle("Load Feature Colours");
-    chooser.setToolTipText("Load");
+    chooser.setToolTipText(MessageManager.getString("action.load"));
 
     int value = chooser.showOpenDialog(this);
 
@@ -701,7 +701,7 @@ public class FeatureSettings extends JPanel
             { "Sequence Feature Colours" }, "Sequence Feature Colours");
     chooser.setFileView(new jalview.io.JalviewFileView());
     chooser.setDialogTitle("Save Feature Colour Scheme");
-    chooser.setToolTipText("Save");
+    chooser.setToolTipText(MessageManager.getString("action.save"));
 
     int value = chooser.showSaveDialog(this);
 
@@ -933,7 +933,7 @@ public class FeatureSettings extends JPanel
       }
     });
     sortByDens.setFont(JvSwingUtils.getLabelFont());
-    sortByDens.setText("Seq Sort by density");
+    sortByDens.setText(MessageManager.getString("label.sequence_sort_by_density"));
     sortByDens.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
index d0782b9..1504f41 100755 (executable)
@@ -23,6 +23,7 @@ import javax.swing.*;
 
 import jalview.bin.*;
 import jalview.jbgui.*;
+import jalview.util.MessageManager;
 
 /**
  * DOCUMENT ME!
@@ -80,12 +81,12 @@ public class FontChooser extends GFontChooser
 
     if (tp != null)
     {
-      Desktop.addInternalFrame(frame, "Change Font (Tree Panel)", 340, 170,
+      Desktop.addInternalFrame(frame, MessageManager.getString("action.change_font_tree_panel"), 340, 170,
               false);
     }
     else
     {
-      Desktop.addInternalFrame(frame, "Change Font", 340, 170, false);
+      Desktop.addInternalFrame(frame, MessageManager.getString("action.change_font"), 340, 170, false);
     }
 
     frame.setLayer(JLayeredPane.PALETTE_LAYER);
index 6518af8..1eb151d 100644 (file)
@@ -58,8 +58,7 @@ public final class JvSwingUtils
       return "<table width=350 border=0><tr><td>" + ttext
               + "</td></tr></table>";
     }
-  }
-
+  }  
   public static JButton makeButton(String label, String tooltip,
           ActionListener action)
   {
index eb55994..4b96cb2 100644 (file)
@@ -17,6 +17,7 @@
  */
 package jalview.gui;
 
+import jalview.util.MessageManager;
 import jalview.ws.params.ArgumentI;
 import jalview.ws.params.OptionI;
 import jalview.ws.params.ParameterI;
@@ -767,7 +768,7 @@ public class OptsAndParamsPage
   {
 
     JPopupMenu mnu = new JPopupMenu();
-    JMenuItem mitem = new JMenuItem("View " + finfo);
+    JMenuItem mitem = new JMenuItem(MessageManager.formatMessage("label.view_params", new String[]{finfo}));
     mitem.addActionListener(new ActionListener()
     {
 
index 663c262..35af1ef 100644 (file)
@@ -164,7 +164,7 @@ public class PCAPanel extends GPCAPanel implements Runnable,
     if (getParent() == null)
     {
       addKeyListener(rc);
-      Desktop.addInternalFrame(this, "Principal component analysis", 475,
+      Desktop.addInternalFrame(this, MessageManager.getString("label.principal_component_analysis"), 475,
               450);
     }
   }
@@ -260,7 +260,7 @@ public class PCAPanel extends GPCAPanel implements Runnable,
     try
     {
       cap.setText(pcaModel.getDetails());
-      Desktop.addInternalFrame(cap, "PCA details", 500, 500);
+      Desktop.addInternalFrame(cap, MessageManager.getString("label.pca_details"), 500, 500);
     } catch (OutOfMemoryError oom)
     {
       new OOMWarning("opening PCA details", oom);
@@ -334,7 +334,7 @@ public class PCAPanel extends GPCAPanel implements Runnable,
         // af.addSortByOrderMenuItem(ServiceName + " Ordering",
         // msaorder);
 
-        Desktop.addInternalFrame(af, "Original Data for " + this.title,
+        Desktop.addInternalFrame(af, MessageManager.formatMessage("label.original_data_for_params", new String[]{this.title}),
                 AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT);
       }
     }
@@ -523,7 +523,7 @@ public class PCAPanel extends GPCAPanel implements Runnable,
       cap.setText(pcaModel.getPointsasCsv(false,
               xCombobox.getSelectedIndex(), yCombobox.getSelectedIndex(),
               zCombobox.getSelectedIndex()));
-      Desktop.addInternalFrame(cap, "Points for " + getTitle(), 500, 500);
+      Desktop.addInternalFrame(cap, MessageManager.formatMessage("label.points_for_params", new String[]{this.getTitle()}), 500, 500);
     } catch (OutOfMemoryError oom)
     {
       new OOMWarning("exporting PCA points", oom);
@@ -546,7 +546,7 @@ public class PCAPanel extends GPCAPanel implements Runnable,
       cap.setText(pcaModel.getPointsasCsv(true,
               xCombobox.getSelectedIndex(), yCombobox.getSelectedIndex(),
               zCombobox.getSelectedIndex()));
-      Desktop.addInternalFrame(cap, "Transformed points for " + getTitle(),
+      Desktop.addInternalFrame(cap, MessageManager.formatMessage("label.transformed_points_for_params", new String[]{this.getTitle()}),
               500, 500);
     } catch (OutOfMemoryError oom)
     {
index 6041e7b..e9e5c1c 100755 (executable)
@@ -148,7 +148,7 @@ public class PairwiseAlignPanel extends GPairwiseAlignPanel
     AlignFrame af = new AlignFrame(new Alignment(seq),
             AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT);
 
-    Desktop.addInternalFrame(af, "Pairwise Aligned Sequences",
+    Desktop.addInternalFrame(af, MessageManager.getString("label.pairwise_aligned_sequences"),
             AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT);
   }
 }
index 3bc7c5c..a7f070d 100644 (file)
-/*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8)
- * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle
- * 
- * 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/>.
- */
-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.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.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.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.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.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.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.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.");
-
-      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)));
-        }
-        else
-        {
-          structureMenu.add(gpdbview = new JMenuItem("View all "
-                  + pdbe.size() + " structures."));
-        }
-        gpdbview.setToolTipText("Open a new Jmol view with all structures associated with the current selection and superimpose them using the alignment.");
-        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");
-    } else {
-      createGroupMenuItem.setVisible(false);
-      unGroupMenuItem.setVisible(true);
-      jMenu1.setText("Edit Group");
-    }
-
-    if (seq == null)
-    {
-      sequenceMenu.setVisible(false);
-      structureMenu.setVisible(false);
-    }
-
-    if (links != null && links.size() > 0)
-    {
-
-      JMenu linkMenu = new JMenu("Link");
-      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");
-    JMenu[] linkMenus = new JMenu[]
-    { null, new JMenu("IDS"), new JMenu("Sequences"),
-        new JMenu("IDS and Sequences") }; // three types of url that might be
-                                          // 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");
-      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.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.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");
-    groupName.addActionListener(new java.awt.event.ActionListener()
-    {
-      public void actionPerformed(ActionEvent e)
-      {
-        groupName_actionPerformed();
-      }
-    });
-    sequenceMenu.setText("Sequence");
-    sequenceName.setText("Edit Name/Description");
-    sequenceName.addActionListener(new java.awt.event.ActionListener()
-    {
-      public void actionPerformed(ActionEvent e)
-      {
-        sequenceName_actionPerformed();
-      }
-    });
-    sequenceDetails.setText("Sequence Details ...");
-    sequenceDetails.addActionListener(new java.awt.event.ActionListener()
-    {
-      public void actionPerformed(ActionEvent e)
-      {
-        sequenceDetails_actionPerformed();
-      }
-    });
-    sequenceSelDetails.setText("Sequence Details ...");
-    sequenceSelDetails
-            .addActionListener(new java.awt.event.ActionListener()
-            {
-              public void actionPerformed(ActionEvent e)
-              {
-                sequenceSelectionDetails_actionPerformed();
-              }
-            });
-    PIDColour.setFocusPainted(false);
-    unGroupMenuItem.setText("Remove Group");
-    unGroupMenuItem.addActionListener(new java.awt.event.ActionListener()
-    {
-      public void actionPerformed(ActionEvent e)
-      {
-        unGroupMenuItem_actionPerformed();
-      }
-    });
-    createGroupMenuItem.setText("Create Group");
-    createGroupMenuItem.addActionListener(new java.awt.event.ActionListener()
-    {
-      public void actionPerformed(ActionEvent e)
-      {
-        createGroupMenuItem_actionPerformed();
-      }
-    });
-
-    outline.setText("Border colour");
-    outline.addActionListener(new java.awt.event.ActionListener()
-    {
-      public void actionPerformed(ActionEvent e)
-      {
-        outline_actionPerformed();
-      }
-    });
-    nucleotideMenuItem.setText("Nucleotide");
-    nucleotideMenuItem.addActionListener(new ActionListener()
-    {
-      public void actionPerformed(ActionEvent e)
-      {
-        nucleotideMenuItem_actionPerformed();
-      }
-    });
-    colourMenu.setText("Group Colour");
-    showBoxes.setText("Boxes");
-    showBoxes.setState(true);
-    showBoxes.addActionListener(new ActionListener()
-    {
-      public void actionPerformed(ActionEvent e)
-      {
-        showBoxes_actionPerformed();
-      }
-    });
-    showText.setText("Text");
-    showText.setState(true);
-    showText.addActionListener(new ActionListener()
-    {
-      public void actionPerformed(ActionEvent e)
-      {
-        showText_actionPerformed();
-      }
-    });
-    showColourText.setText("Colour Text");
-    showColourText.addActionListener(new ActionListener()
-    {
-      public void actionPerformed(ActionEvent e)
-      {
-        showColourText_actionPerformed();
-      }
-    });
-    displayNonconserved.setText("Show Nonconserved");
-    displayNonconserved.setState(true);
-    displayNonconserved.addActionListener(new ActionListener()
-    {
-      public void actionPerformed(ActionEvent e)
-      {
-        showNonconserved_actionPerformed();
-      }
-    });
-    editMenu.setText("Edit");
-    cut.setText("Cut");
-    cut.addActionListener(new ActionListener()
-    {
-      public void actionPerformed(ActionEvent e)
-      {
-        cut_actionPerformed();
-      }
-    });
-    upperCase.setText("To Upper Case");
-    upperCase.addActionListener(new ActionListener()
-    {
-      public void actionPerformed(ActionEvent e)
-      {
-        changeCase(e);
-      }
-    });
-    copy.setText("Copy");
-    copy.addActionListener(new ActionListener()
-    {
-      public void actionPerformed(ActionEvent e)
-      {
-        copy_actionPerformed();
-      }
-    });
-    lowerCase.setText("To Lower Case");
-    lowerCase.addActionListener(new ActionListener()
-    {
-      public void actionPerformed(ActionEvent e)
-      {
-        changeCase(e);
-      }
-    });
-    toggle.setText("Toggle Case");
-    toggle.addActionListener(new ActionListener()
-    {
-      public void actionPerformed(ActionEvent e)
-      {
-        changeCase(e);
-      }
-    });
-    pdbMenu.setText("Associate Structure with Sequence");
-    pdbFromFile.setText("From File");
-    pdbFromFile.addActionListener(new ActionListener()
-    {
-      public void actionPerformed(ActionEvent e)
-      {
-        pdbFromFile_actionPerformed();
-      }
-    });
-    enterPDB.setText("Enter PDB Id");
-    enterPDB.addActionListener(new ActionListener()
-    {
-      public void actionPerformed(ActionEvent e)
-      {
-        enterPDB_actionPerformed();
-      }
-    });
-    discoverPDB.setText("Discover PDB ids");
-    discoverPDB.addActionListener(new ActionListener()
-    {
-      public void actionPerformed(ActionEvent e)
-      {
-        discoverPDB_actionPerformed();
-      }
-    });
-    outputMenu.setText("Output to Textbox...");
-    sequenceFeature.setText("Create Sequence Feature");
-    sequenceFeature.addActionListener(new ActionListener()
-    {
-      public void actionPerformed(ActionEvent e)
-      {
-        sequenceFeature_actionPerformed();
-      }
-    });
-    textColour.setText("Text Colour");
-    textColour.addActionListener(new ActionListener()
-    {
-      public void actionPerformed(ActionEvent e)
-      {
-        textColour_actionPerformed();
-      }
-    });
-    jMenu1.setText("Group");
-    structureMenu.setText("Structure");
-    viewStructureMenu.setText("View Structure");
-    // colStructureMenu.setText("Colour By Structure");
-    editSequence.setText("Edit Sequence...");
-    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.addActionListener(new java.awt.event.ActionListener()
-    {
-      public void actionPerformed(ActionEvent e)
-      {
-        noColourmenuItem_actionPerformed();
-      }
-    });
-
-    clustalColour.setText("Clustalx colours");
-    clustalColour.addActionListener(new java.awt.event.ActionListener()
-    {
-      public void actionPerformed(ActionEvent e)
-      {
-        clustalColour_actionPerformed();
-      }
-    });
-    zappoColour.setText("Zappo");
-    zappoColour.addActionListener(new java.awt.event.ActionListener()
-    {
-      public void actionPerformed(ActionEvent e)
-      {
-        zappoColour_actionPerformed();
-      }
-    });
-    taylorColour.setText("Taylor");
-    taylorColour.addActionListener(new java.awt.event.ActionListener()
-    {
-      public void actionPerformed(ActionEvent e)
-      {
-        taylorColour_actionPerformed();
-      }
-    });
-    hydrophobicityColour.setText("Hydrophobicity");
-    hydrophobicityColour
-            .addActionListener(new java.awt.event.ActionListener()
-            {
-              public void actionPerformed(ActionEvent e)
-              {
-                hydrophobicityColour_actionPerformed();
-              }
-            });
-    helixColour.setText("Helix propensity");
-    helixColour.addActionListener(new java.awt.event.ActionListener()
-    {
-      public void actionPerformed(ActionEvent e)
-      {
-        helixColour_actionPerformed();
-      }
-    });
-    strandColour.setText("Strand propensity");
-    strandColour.addActionListener(new java.awt.event.ActionListener()
-    {
-      public void actionPerformed(ActionEvent e)
-      {
-        strandColour_actionPerformed();
-      }
-    });
-    turnColour.setText("Turn propensity");
-    turnColour.addActionListener(new java.awt.event.ActionListener()
-    {
-      public void actionPerformed(ActionEvent e)
-      {
-        turnColour_actionPerformed();
-      }
-    });
-    buriedColour.setText("Buried Index");
-    buriedColour.addActionListener(new java.awt.event.ActionListener()
-    {
-      public void actionPerformed(ActionEvent e)
-      {
-        buriedColour_actionPerformed();
-      }
-    });
-    abovePIDColour.setText("Above % Identity");
-    abovePIDColour.addActionListener(new java.awt.event.ActionListener()
-    {
-      public void actionPerformed(ActionEvent e)
-      {
-        abovePIDColour_actionPerformed();
-      }
-    });
-    userDefinedColour.setText("User Defined...");
-    userDefinedColour.addActionListener(new java.awt.event.ActionListener()
-    {
-      public void actionPerformed(ActionEvent e)
-      {
-        userDefinedColour_actionPerformed(e);
-      }
-    });
-    PIDColour.setText("Percentage Identity");
-    PIDColour.addActionListener(new java.awt.event.ActionListener()
-    {
-      public void actionPerformed(ActionEvent e)
-      {
-        PIDColour_actionPerformed();
-      }
-    });
-    BLOSUM62Colour.setText("BLOSUM62");
-    BLOSUM62Colour.addActionListener(new java.awt.event.ActionListener()
-    {
-      public void actionPerformed(ActionEvent e)
-      {
-        BLOSUM62Colour_actionPerformed();
-      }
-    });
-    purinePyrimidineColour.setText("Purine/Pyrimidine");
-    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
-            .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)
-              + "</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);
-
-  }
-
-  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..."))
-    {
-      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())
-    {
-      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",
-            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",
-            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",
-                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.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);
-
-      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";
-        caseChange = ChangeCaseCommand.TOGGLE_CASE;
-      }
-      else if (source == upperCase)
-      {
-        description = "To Upper Case";
-        caseChange = ChangeCaseCommand.TO_UPPER;
-      }
-      else
-      {
-        description = "To Lower Case";
-        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);
-
-    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) + "'");
-
-    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);
-
-    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);
-
-      if (dialog.accept)
-      {
-        EditCommand editCommand = new EditCommand("Edit Sequences",
-                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());
-      }
-    }
-  }
-
-}
+/*\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
+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
+            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.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 = 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 = 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 = 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 = 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
+      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
+          structureMenu.add(gpdbview = new JMenuItem(MessageManager.formatMessage("label.view_structure_for", new String[]{sqass.getDisplayId(false)})));\r
+        }\r
+        else\r
+        {\r
+          structureMenu.add(gpdbview = new JMenuItem(MessageManager.formatMessage("label.view_all_structures", new String[]{new Integer(pdbe.size()).toString()})));\r
+        }\r
+        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
+      jMenu1.setText(MessageManager.getString("action.edit_new_group"));\r
+    } else {\r
+      createGroupMenuItem.setVisible(false);\r
+      unGroupMenuItem.setVisible(true);\r
+      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
+      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
+    groupLinksMenu = new JMenu(MessageManager.getString("action.group_link"));\r
+    JMenu[] linkMenus = new JMenu[]\r
+    { 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
+      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
+    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.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
+    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
+    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
+    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
+    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
+    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
+    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
+    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
+    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
+    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
+    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
+    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
+    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
+    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
+    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
+    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
+    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
+    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
+    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
+    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
+    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
+    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
+    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
+    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
+    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
+    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
+    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
+    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
+    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
+    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
+    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
+    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
+    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
+    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
+    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
+    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
+    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
+    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
+    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
+    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
+      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
+    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
+    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
+            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
+            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
+                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
+    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
+                      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
+        description = MessageManager.getString("label.toggle_case");\r
+        caseChange = ChangeCaseCommand.TOGGLE_CASE;\r
+      }\r
+      else if (source == upperCase)\r
+      {\r
+        description = MessageManager.getString("label.to_upper_case");\r
+        caseChange = ChangeCaseCommand.TO_UPPER;\r
+      }\r
+      else\r
+      {\r
+        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
+            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
+    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
+            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
+                      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
+        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
index f8932d1..06b42bf 100755 (executable)
@@ -119,7 +119,7 @@ public class Preferences extends GPreferences
       height = 460;
     }
 
-    Desktop.addInternalFrame(frame, "Preferences", width, height);
+    Desktop.addInternalFrame(frame, MessageManager.getString("label.preferences"), width, height);
     frame.setMinimumSize(new Dimension(width, height));
 
     seqLimit.setSelected(Cache.getDefault("SHOW_JVSUFFIX", true));
index 08481d0..0038939 100755 (executable)
@@ -27,6 +27,7 @@ import jalview.analysis.AlignSeq;
 import jalview.commands.*;
 import jalview.datamodel.*;
 import jalview.jbgui.*;
+import jalview.util.MessageManager;
 
 /**
  * DOCUMENT ME!
@@ -73,7 +74,7 @@ public class RedundancyPanel extends GSliderPanel implements Runnable
       }
     });
 
-    applyButton.setText("Remove");
+    applyButton.setText(MessageManager.getString("action.remove"));
     allGroupsCheck.setVisible(false);
     slider.setMinimum(0);
     slider.setMaximum(100);
@@ -84,7 +85,7 @@ public class RedundancyPanel extends GSliderPanel implements Runnable
 
     frame = new JInternalFrame();
     frame.setContentPane(this);
-    Desktop.addInternalFrame(frame, "Redundancy threshold selection", 400,
+    Desktop.addInternalFrame(frame, MessageManager.getString("label.redundancy_threshold_selection"), 400,
             100, false);
     frame.addInternalFrameListener(new InternalFrameAdapter()
     {
@@ -114,7 +115,7 @@ public class RedundancyPanel extends GSliderPanel implements Runnable
     progress.setIndeterminate(true);
     southPanel.add(progress, java.awt.BorderLayout.SOUTH);
 
-    label.setText("Calculating....");
+    label.setText(MessageManager.getString("label.calculating"));
 
     slider.setVisible(false);
     applyButton.setEnabled(false);
index 907446b..0fef469 100644 (file)
@@ -19,6 +19,7 @@ package jalview.gui;
 
 import jalview.io.packed.DataProvider.JvDataType;
 import jalview.jbgui.GRestServiceEditorPane;
+import jalview.util.MessageManager;
 import jalview.ws.rest.InputType;
 import jalview.ws.rest.RestServiceDescription;
 
@@ -266,7 +267,7 @@ public class RestServiceEditorPane extends GRestServiceEditorPane
     final int rdatasel = rdata.getSelectedIndex();
     if (rdatasel > -1)
     {
-      JPopupMenu popup = new JPopupMenu("Select return type");
+      JPopupMenu popup = new JPopupMenu(MessageManager.getString("label.select_return_type"));
       for (final JvDataType type : JvDataType.values())
       {
         popup.add(new JMenuItem(type.name())).addActionListener(
@@ -427,15 +428,13 @@ public class RestServiceEditorPane extends GRestServiceEditorPane
             }
             else
             {
-              parseRes.setText("Parsing failed. Syntax errors shown below\n"
-                      + rsd.getInvalidMessage());
+              parseRes.setText(MessageManager.formatMessage("label.parsing_failed_syntax_errors_shown_below_param", new String[]{rsd.getInvalidMessage()}));
               parseWarnings.setVisible(true);
             }
           } catch (Throwable e)
           {
             e.printStackTrace();
-            parseRes.setText("\nParsing failed. An unrecoverable exception was thrown:\n"
-                    + e.toString());
+            parseRes.setText(MessageManager.formatMessage("label.parsing_failed_unrecoverable_exception_thrown_param", new String[]{e.toString()}));
             parseWarnings.setVisible(true);
           }
         }
index abd41c0..649f0af 100755 (executable)
@@ -94,7 +94,7 @@ public class ScalePanel extends JPanel implements MouseMotionListener,
       JPopupMenu pop = new JPopupMenu();
       if (reveal != null)
       {
-        JMenuItem item = new JMenuItem("Reveal");
+        JMenuItem item = new JMenuItem(MessageManager.getString("label.reveal"));
         item.addActionListener(new ActionListener()
         {
           public void actionPerformed(ActionEvent e)
@@ -112,7 +112,7 @@ public class ScalePanel extends JPanel implements MouseMotionListener,
 
         if (av.getColumnSelection().getHiddenColumns().size() > 1)
         {
-          item = new JMenuItem("Reveal All");
+          item = new JMenuItem(MessageManager.getString("action.reveal_all"));
           item.addActionListener(new ActionListener()
           {
             public void actionPerformed(ActionEvent e)
@@ -132,7 +132,7 @@ public class ScalePanel extends JPanel implements MouseMotionListener,
       }
       else if (av.getColumnSelection().contains(res))
       {
-        JMenuItem item = new JMenuItem("Hide Columns");
+        JMenuItem item = new JMenuItem(MessageManager.getString("label.hide_columns"));
         item.addActionListener(new ActionListener()
         {
           public void actionPerformed(ActionEvent e)
@@ -357,7 +357,7 @@ public class ScalePanel extends JPanel implements MouseMotionListener,
       {
         reveal = region;
         ToolTipManager.sharedInstance().registerComponent(this);
-        this.setToolTipText("Reveal Hidden Columns with Right Mouse Button");
+        this.setToolTipText(MessageManager.getString("label.reveal_hidden_columns"));
         break;
       }
       else
index c069adb..0a33e1a 100755 (executable)
@@ -228,13 +228,13 @@ public class SequenceFetcher extends JPanel implements Runnable
     dbeg.setFont(new java.awt.Font("Verdana", Font.BOLD, 11));
     jLabel1.setFont(new java.awt.Font("Verdana", Font.ITALIC, 11));
     jLabel1.setHorizontalAlignment(SwingConstants.CENTER);
-    jLabel1.setText("Separate multiple accession ids with semi colon \";\"");
+    jLabel1.setText(MessageManager.getString("label.separate_multiple_accession_ids"));
 
     replacePunctuation.setHorizontalAlignment(SwingConstants.CENTER);
     replacePunctuation
             .setFont(new java.awt.Font("Verdana", Font.ITALIC, 11));
-    replacePunctuation.setText("Replace commas with semi-colons");
-    ok.setText("OK");
+    replacePunctuation.setText(MessageManager.getString("label.replace_commas_semicolons"));
+    ok.setText(MessageManager.getString("action.ok"));
     ok.addActionListener(new ActionListener()
     {
       @Override
@@ -243,7 +243,7 @@ public class SequenceFetcher extends JPanel implements Runnable
         ok_actionPerformed();
       }
     });
-    clear.setText("Clear");
+    clear.setText(MessageManager.getString("action.clear"));
     clear.addActionListener(new ActionListener()
     {
       @Override
@@ -253,7 +253,7 @@ public class SequenceFetcher extends JPanel implements Runnable
       }
     });
 
-    example.setText("Example");
+    example.setText(MessageManager.getString("label.example"));
     example.addActionListener(new ActionListener()
     {
       @Override
@@ -262,7 +262,7 @@ public class SequenceFetcher extends JPanel implements Runnable
         example_actionPerformed();
       }
     });
-    close.setText("Close");
+    close.setText(MessageManager.getString("action.close"));
     close.addActionListener(new ActionListener()
     {
       @Override
@@ -305,7 +305,7 @@ public class SequenceFetcher extends JPanel implements Runnable
                           + database.getSelectedSources().size()
                           + " others)" : ""));
           String eq = database.getExampleQueries();
-          dbeg.setText("Example query: " + eq);
+          dbeg.setText(MessageManager.formatMessage("label.example_query_param", new String[]{eq}));
           boolean enablePunct = !(eq != null && eq.indexOf(",") > -1);
           for (DbSourceProxy dbs : database.getSelectedSources())
           {
@@ -803,7 +803,7 @@ public class SequenceFetcher extends JPanel implements Runnable
         Desktop.addInternalFrame(af, title, AlignFrame.DEFAULT_WIDTH,
                 AlignFrame.DEFAULT_HEIGHT);
 
-        af.statusBar.setText("Successfully pasted alignment file");
+        af.statusBar.setText(MessageManager.getString("label.successfully_pasted_alignment_file"));
 
         try
         {
index d7e452a..fa6e55e 100755 (executable)
@@ -26,6 +26,7 @@ import javax.swing.event.*;
 import jalview.datamodel.*;
 import jalview.jbgui.*;
 import jalview.schemes.*;
+import jalview.util.MessageManager;
 
 /**
  * DOCUMENT ME!
@@ -68,13 +69,13 @@ public class SliderPanel extends GSliderPanel
 
     if (forConservation)
     {
-      label.setText("Enter value to increase conservation visibility");
+      label.setText(MessageManager.getString("label.enter_value_increase_conservation_visibility"));
       slider.setMinimum(0);
       slider.setMaximum(100);
     }
     else
     {
-      label.setText("Enter % identity above which to colour residues");
+      label.setText(MessageManager.getString("label.enter_percentage_identity_above_which_colour_residues"));
       slider.setMinimum(0);
       slider.setMaximum(100);
     }
index 9a0e1b7..02fb9ff 100644 (file)
@@ -23,6 +23,7 @@ import javax.swing.*;
 import javax.swing.event.*;
 
 import jalview.datamodel.*;
+import jalview.util.MessageManager;
 
 public class TextColourChooser
 {
@@ -53,12 +54,12 @@ public class TextColourChooser
     final JPanel col1 = new JPanel();
     col1.setPreferredSize(new Dimension(40, 20));
     col1.setBorder(BorderFactory.createEtchedBorder());
-    col1.setToolTipText("Dark Colour");
+    col1.setToolTipText(MessageManager.getString("label.dark_colour"));
     col1.setBackground(new Color(original1));
     final JPanel col2 = new JPanel();
     col2.setPreferredSize(new Dimension(40, 20));
     col2.setBorder(BorderFactory.createEtchedBorder());
-    col2.setToolTipText("Light Colour");
+    col2.setToolTipText(MessageManager.getString("label.ligth_colour"));
     col2.setBackground(new Color(original2));
     final JPanel bigpanel = new JPanel(new BorderLayout());
     JPanel panel = new JPanel();
index 09708da..a185bc5 100755 (executable)
@@ -790,9 +790,7 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
     if (ob instanceof SequenceNode)
     {
       highlightNode = (SequenceNode) ob;
-      this.setToolTipText("<html>Left click to select leaves"
-              + "<br>Double-click to invert leaves"
-              + "<br>Right click to change colour");
+      this.setToolTipText("<html>" + MessageManager.getString("label.highlightnode"));
       repaint();
 
     }
index 5b51919..35a8b74 100755 (executable)
@@ -36,6 +36,7 @@ import jalview.commands.OrderCommand;
 import jalview.datamodel.*;
 import jalview.io.*;
 import jalview.jbgui.*;
+import jalview.util.MessageManager;
 
 /**
  * DOCUMENT ME!
@@ -396,7 +397,7 @@ public class TreePanel extends GTreePanel
             jalview.bin.Cache.getProperty("LAST_DIRECTORY"));
     chooser.setFileView(new JalviewFileView());
     chooser.setDialogTitle("Save tree as newick file");
-    chooser.setToolTipText("Save");
+    chooser.setToolTipText(MessageManager.getString("action.save"));
 
     int value = chooser.showSaveDialog(null);
 
@@ -488,7 +489,7 @@ public class TreePanel extends GTreePanel
         // af.addSortByOrderMenuItem(ServiceName + " Ordering",
         // msaorder);
 
-        Desktop.addInternalFrame(af, "Original Data for " + this.title,
+        Desktop.addInternalFrame(af, MessageManager.formatMessage("label.original_data_for_params", new String[]{this.title}),
                 AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT);
       }
     }
@@ -690,7 +691,7 @@ public class TreePanel extends GTreePanel
               { "Encapsulated Postscript" }, "Encapsulated Postscript");
       chooser.setFileView(new jalview.io.JalviewFileView());
       chooser.setDialogTitle("Create EPS file from tree");
-      chooser.setToolTipText("Save");
+      chooser.setToolTipText(MessageManager.getString("action.save"));
 
       int value = chooser.showSaveDialog(this);
 
@@ -737,7 +738,7 @@ public class TreePanel extends GTreePanel
 
       chooser.setFileView(new jalview.io.JalviewFileView());
       chooser.setDialogTitle("Create PNG image from tree");
-      chooser.setToolTipText("Save");
+      chooser.setToolTipText(MessageManager.getString("action.save"));
 
       int value = chooser.showSaveDialog(this);
 
index a104ad9..1c6e561 100755 (executable)
-/*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8)
- * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle
- * 
- * 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/>.
- */
-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);
-
-    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");
-
-    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");
-
-    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);
-  }
-
-}
+/*\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
+    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
+    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
+    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
index 37e93b2..6170909 100644 (file)
@@ -18,6 +18,8 @@
 
 package jalview.gui;
 
+import jalview.util.MessageManager;
+
 import java.awt.Component;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
@@ -148,7 +150,7 @@ public class ViewSelectionMenu extends JMenu
       append = append || _selectedviews.size() > 1;
       toggleview = new JCheckBoxMenuItem("Select many views", append);
       toggleview
-              .setToolTipText("When enabled, allows many views to be selected.");
+              .setToolTipText(MessageManager.getString("label.toggle_enabled_views"));
       toggleview.addItemListener(new ItemListener()
       {
 
@@ -166,7 +168,7 @@ public class ViewSelectionMenu extends JMenu
 
       });
       add(toggleview);
-      add(selectAll = new JMenuItem("Select all views"));
+      add(selectAll = new JMenuItem(MessageManager.getString("label.select_all_views")));
       selectAll.addActionListener(new ActionListener()
       {
 
@@ -188,7 +190,7 @@ public class ViewSelectionMenu extends JMenu
           }
         }
       });
-      add(invertSel = new JMenuItem("Invert selection"));
+      add(invertSel = new JMenuItem(MessageManager.getString("label.invert_selection")));
       invertSel.addActionListener(new ActionListener()
       {
 
index 4f222bf..6879e9a 100644 (file)
@@ -262,8 +262,8 @@ public class WsJobParameters extends JPanel implements ItemListener,
 
       }
     });
-    updatepref = JvSwingUtils.makeButton("Update",
-            "Update this existing user parameter set.",
+    updatepref = JvSwingUtils.makeButton(MessageManager.getString("action.update"),
+            MessageManager.getString("label.update_user_parameter_set"),
             new ActionListener()
             {
 
@@ -272,8 +272,8 @@ public class WsJobParameters extends JPanel implements ItemListener,
                 update_actionPerformed(e);
               }
             });
-    deletepref = JvSwingUtils.makeButton("Delete",
-            "Delete the currently selected user parameter set.",
+    deletepref = JvSwingUtils.makeButton(MessageManager.getString("action.delete"),
+            MessageManager.getString("label.delete_user_parameter_set"),
             new ActionListener()
             {
 
@@ -282,8 +282,8 @@ public class WsJobParameters extends JPanel implements ItemListener,
                 delete_actionPerformed(e);
               }
             });
-    createpref = JvSwingUtils.makeButton("Create",
-            "Create a new parameter set with the current settings.",
+    createpref = JvSwingUtils.makeButton(MessageManager.getString("action.create"),
+            MessageManager.getString("label.create_user_parameter_set"),
             new ActionListener()
             {
 
@@ -292,8 +292,8 @@ public class WsJobParameters extends JPanel implements ItemListener,
                 create_actionPerformed(e);
               }
             });
-    revertpref = JvSwingUtils.makeButton("Revert",
-            "Undo all changes to the current parameter set",
+    revertpref = JvSwingUtils.makeButton(MessageManager.getString("action.revert"),
+            MessageManager.getString("label.revert_changes_user_parameter_set"),
             new ActionListener()
             {
 
@@ -302,16 +302,16 @@ public class WsJobParameters extends JPanel implements ItemListener,
                 revert_actionPerformed(e);
               }
             });
-    startjob = JvSwingUtils.makeButton("Start Job",
-            "Start Job with current settings.", new ActionListener()
+    startjob = JvSwingUtils.makeButton(MessageManager.getString("action.start_job"),
+            MessageManager.getString("label.start_job_current_settings"), new ActionListener()
             {
               public void actionPerformed(ActionEvent e)
               {
                 startjob_actionPerformed(e);
               }
             });
-    canceljob = JvSwingUtils.makeButton("Cancel Job",
-            "Close this dialog and cancel job.", new ActionListener()
+    canceljob = JvSwingUtils.makeButton(MessageManager.getString("action.cancel_job"),
+            MessageManager.getString("label.cancel_job_close_dialog"), new ActionListener()
             {
               public void actionPerformed(ActionEvent e)
               {
@@ -319,7 +319,7 @@ public class WsJobParameters extends JPanel implements ItemListener,
               }
             });
 
-    setDetails.setBorder(new TitledBorder("Details"));
+    setDetails.setBorder(new TitledBorder(MessageManager.getString("label.details")));
     setDetails.setLayout(new BorderLayout());
     setDescr.setColumns(40);
     setDescr.setWrapStyleWord(true);
@@ -327,7 +327,7 @@ public class WsJobParameters extends JPanel implements ItemListener,
     setDescr.setBackground(getBackground());
     setDescr.setEditable(true);
     setDescr.getDocument().addDocumentListener(this);
-    setDescr.setToolTipText("Click to edit the notes for this parameter set.");
+    setDescr.setToolTipText(MessageManager.getString("label.edit_notes_parameter_set"));
     JScrollPane setDescrView = new JScrollPane();
     // setDescrView.setPreferredSize(new Dimension(350, 200));
     setDescrView.getViewport().setView(setDescr);
@@ -377,9 +377,9 @@ public class WsJobParameters extends JPanel implements ItemListener,
 
     // paramPane.setPreferredSize(new Dimension(360, 400));
     // paramPane.setPreferredSize(null);
-    jobOptions.setBorder(new TitledBorder("Options"));
+    jobOptions.setBorder(new TitledBorder(MessageManager.getString("label.options")));
     jobOptions.setOpaque(true);
-    paramList.setBorder(new TitledBorder("Parameters"));
+    paramList.setBorder(new TitledBorder(MessageManager.getString("label.parameters")));
     paramList.setOpaque(true);
     JPanel bjo = new JPanel(new BorderLayout()), bjp = new JPanel(
             new BorderLayout());
index bd8e43e..92e7a89 100644 (file)
@@ -32,6 +32,7 @@ import javax.swing.JOptionPane;
 
 import jalview.bin.Cache;
 import jalview.io.JalviewFileChooser;
+import jalview.util.MessageManager;
 import jalview.ws.params.ParamDatastoreI;
 import jalview.ws.params.ParamManager;
 import jalview.ws.params.WsParamSetI;
@@ -186,7 +187,7 @@ public class WsParamSetManager implements ParamManager
               "Web Service Parameter File");
       chooser.setFileView(new jalview.io.JalviewFileView());
       chooser.setDialogTitle("Choose a filename for this parameter file");
-      chooser.setToolTipText("Save");
+      chooser.setToolTipText(MessageManager.getString("action.save"));
       int value = chooser.showSaveDialog(Desktop.instance);
       if (value == JalviewFileChooser.APPROVE_OPTION)
       {
index a8c60fd..9d13900 100755 (executable)
@@ -318,8 +318,7 @@ public class FileLoader implements Runnable
             alignFrame = new AlignFrame(al, AlignFrame.DEFAULT_WIDTH,
                     AlignFrame.DEFAULT_HEIGHT);
 
-            alignFrame.statusBar.setText("Successfully loaded file "
-                    + title);
+            alignFrame.statusBar.setText(MessageManager.formatMessage("label.successfully_loaded_file", new String[]{title}));
 
             if (!protocol.equals(AppletFormatAdapter.PASTE))
               alignFrame.setFileName(file, format);
index 71c822c..f27a8e1 100755 (executable)
@@ -23,6 +23,7 @@ import java.awt.*;
 
 import jalview.datamodel.*;
 import jalview.gui.*;
+import jalview.util.MessageManager;
 
 public class HTMLOutput
 {
@@ -50,7 +51,7 @@ public class HTMLOutput
 
     chooser.setFileView(new JalviewFileView());
     chooser.setDialogTitle("Save as HTML");
-    chooser.setToolTipText("Save");
+    chooser.setToolTipText(MessageManager.getString("action.save"));
 
     int value = chooser.showSaveDialog(null);
 
index b0db2e0..9d214e1 100755 (executable)
@@ -18,6 +18,8 @@
 //////////////////////////////////////////////////////////////////
 package jalview.io;
 
+import jalview.util.MessageManager;
+
 import java.io.*;
 import java.util.*;
 
@@ -181,7 +183,7 @@ public class JalviewFileChooser extends JFileChooser
 
     setDialogType(SAVE_DIALOG);
 
-    int ret = showDialog(parent, "Save");
+    int ret = showDialog(parent, MessageManager.getString("action.save"));
 
     if (getFileFilter() instanceof JalviewFileFilter)
     {
index f8f5027..d4d1a60 100755 (executable)
@@ -24,6 +24,7 @@ import javax.swing.*;
 import jalview.analysis.*;
 import jalview.datamodel.*;
 import jalview.gui.*;
+import jalview.util.MessageManager;
 import uk.ac.ebi.www.*;
 
 /**
@@ -56,15 +57,10 @@ public class WSWUBlastClient
   {
     this.ap = ap;
     this.al = al;
-    output.setText("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));");
+    output.setText(MessageManager.getString("label.wswublast_client_credits"));
 
     Desktop.addInternalFrame(output,
-            "BLASTing for unidentified sequences ", 800, 300);
+            MessageManager.getString("label.blasting_for_unidentified_sequence"), 800, 300);
 
     for (int i = 0; i < ids.size(); i++)
     {
index f070c84..24e3af1 100755 (executable)
@@ -557,8 +557,8 @@ public class GAlignFrame extends JInternalFrame
 
   private void jbInit() throws Exception
   {
-    fileMenu.setText("File");
-    saveAs.setText("Save As...");
+    fileMenu.setText(MessageManager.getString("action.file"));
+    saveAs.setText(MessageManager.getString("action.save_as") + "...");
     saveAs.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
             java.awt.event.KeyEvent.VK_S, Toolkit.getDefaultToolkit()
                     .getMenuShortcutKeyMask()
@@ -570,7 +570,7 @@ public class GAlignFrame extends JInternalFrame
         saveAs_actionPerformed(e);
       }
     });
-    closeMenuItem.setText("Close");
+    closeMenuItem.setText(MessageManager.getString("action.close"));
     closeMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
             java.awt.event.KeyEvent.VK_W, Toolkit.getDefaultToolkit()
                     .getMenuShortcutKeyMask(), false));
@@ -581,12 +581,12 @@ public class GAlignFrame extends JInternalFrame
         closeMenuItem_actionPerformed(false);
       }
     });
-    editMenu.setText("Edit");
-    viewMenu.setText("View");
-    colourMenu.setText("Colour");
-    calculateMenu.setText("Calculate");
-    webService.setText("Web Service");
-    selectAllSequenceMenuItem.setText("Select All");
+    editMenu.setText(MessageManager.getString("action.edit"));
+    viewMenu.setText(MessageManager.getString("action.view"));
+    colourMenu.setText(MessageManager.getString("action.colour"));
+    calculateMenu.setText(MessageManager.getString("action.calculate"));
+    webService.setText(MessageManager.getString("action.web_service"));
+    selectAllSequenceMenuItem.setText(MessageManager.getString("action.select_all"));
     selectAllSequenceMenuItem.setAccelerator(javax.swing.KeyStroke
             .getKeyStroke(java.awt.event.KeyEvent.VK_A, Toolkit
                     .getDefaultToolkit().getMenuShortcutKeyMask(), false));
@@ -598,7 +598,7 @@ public class GAlignFrame extends JInternalFrame
                 selectAllSequenceMenuItem_actionPerformed(e);
               }
             });
-    deselectAllSequenceMenuItem.setText("Deselect All");
+    deselectAllSequenceMenuItem.setText(MessageManager.getString("action.deselect_all"));
     deselectAllSequenceMenuItem.setAccelerator(javax.swing.KeyStroke
             .getKeyStroke(java.awt.event.KeyEvent.VK_ESCAPE, 0, false));
     deselectAllSequenceMenuItem
@@ -609,7 +609,7 @@ public class GAlignFrame extends JInternalFrame
                 deselectAllSequenceMenuItem_actionPerformed(e);
               }
             });
-    invertSequenceMenuItem.setText("Invert Sequence Selection");
+    invertSequenceMenuItem.setText(MessageManager.getString("action.invert_sequence_selection"));
     invertSequenceMenuItem.setAccelerator(javax.swing.KeyStroke
             .getKeyStroke(java.awt.event.KeyEvent.VK_I, Toolkit
                     .getDefaultToolkit().getMenuShortcutKeyMask(), false));
@@ -621,7 +621,7 @@ public class GAlignFrame extends JInternalFrame
                 invertSequenceMenuItem_actionPerformed(e);
               }
             });
-    grpsFromSelection.setText("Make Groups For Selection");
+    grpsFromSelection.setText(MessageManager.getString("action.make_groups_selection"));
     grpsFromSelection.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -630,7 +630,7 @@ public class GAlignFrame extends JInternalFrame
       }
     });
 
-    remove2LeftMenuItem.setText("Remove Left");
+    remove2LeftMenuItem.setText(MessageManager.getString("action.remove_left"));
     remove2LeftMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
             java.awt.event.KeyEvent.VK_L, Toolkit.getDefaultToolkit()
                     .getMenuShortcutKeyMask(), false));
@@ -642,7 +642,7 @@ public class GAlignFrame extends JInternalFrame
                 remove2LeftMenuItem_actionPerformed(e);
               }
             });
-    remove2RightMenuItem.setText("Remove Right");
+    remove2RightMenuItem.setText(MessageManager.getString("action.remove_right"));
     remove2RightMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
             java.awt.event.KeyEvent.VK_R, Toolkit.getDefaultToolkit()
                     .getMenuShortcutKeyMask(), false));
@@ -654,7 +654,7 @@ public class GAlignFrame extends JInternalFrame
                 remove2RightMenuItem_actionPerformed(e);
               }
             });
-    removeGappedColumnMenuItem.setText("Remove Empty Columns");
+    removeGappedColumnMenuItem.setText(MessageManager.getString("action.remove_empty_columns"));
     removeGappedColumnMenuItem.setAccelerator(javax.swing.KeyStroke
             .getKeyStroke(java.awt.event.KeyEvent.VK_E, Toolkit
                     .getDefaultToolkit().getMenuShortcutKeyMask(), false));
@@ -666,7 +666,7 @@ public class GAlignFrame extends JInternalFrame
                 removeGappedColumnMenuItem_actionPerformed(e);
               }
             });
-    removeAllGapsMenuItem.setText("Remove All Gaps");
+    removeAllGapsMenuItem.setText(MessageManager.getString("action.remove_all_gaps"));
     removeAllGapsMenuItem.setAccelerator(javax.swing.KeyStroke
             .getKeyStroke(java.awt.event.KeyEvent.VK_E, Toolkit
                     .getDefaultToolkit().getMenuShortcutKeyMask()
@@ -679,7 +679,7 @@ public class GAlignFrame extends JInternalFrame
                 removeAllGapsMenuItem_actionPerformed(e);
               }
             });
-    justifyLeftMenuItem.setText("Left Justify Alignment");
+    justifyLeftMenuItem.setText(MessageManager.getString("action.left_justify_alignment"));
     justifyLeftMenuItem
             .addActionListener(new java.awt.event.ActionListener()
             {
@@ -688,7 +688,7 @@ public class GAlignFrame extends JInternalFrame
                 justifyLeftMenuItem_actionPerformed(e);
               }
             });
-    justifyRightMenuItem.setText("Right Justify Alignment");
+    justifyRightMenuItem.setText(MessageManager.getString("action.right_justify_alignment"));
     justifyRightMenuItem
             .addActionListener(new java.awt.event.ActionListener()
             {
@@ -697,7 +697,7 @@ public class GAlignFrame extends JInternalFrame
                 justifyRightMenuItem_actionPerformed(e);
               }
             });
-    viewBoxesMenuItem.setText("Boxes");
+    viewBoxesMenuItem.setText(MessageManager.getString("action.boxes"));
     viewBoxesMenuItem.setState(true);
     viewBoxesMenuItem.addActionListener(new java.awt.event.ActionListener()
     {
@@ -706,7 +706,7 @@ public class GAlignFrame extends JInternalFrame
         viewBoxesMenuItem_actionPerformed(e);
       }
     });
-    viewTextMenuItem.setText("Text");
+    viewTextMenuItem.setText(MessageManager.getString("action.text"));
     viewTextMenuItem.setState(true);
     viewTextMenuItem.addActionListener(new java.awt.event.ActionListener()
     {
@@ -715,7 +715,7 @@ public class GAlignFrame extends JInternalFrame
         viewTextMenuItem_actionPerformed(e);
       }
     });
-    showNonconservedMenuItem.setText("Show nonconserved");
+    showNonconservedMenuItem.setText(MessageManager.getString("label.show_non_conversed"));
     showNonconservedMenuItem.setState(false);
     showNonconservedMenuItem
             .addActionListener(new java.awt.event.ActionListener()
@@ -725,7 +725,7 @@ public class GAlignFrame extends JInternalFrame
                 showUnconservedMenuItem_actionPerformed(e);
               }
             });
-    sortPairwiseMenuItem.setText("by Pairwise Identity");
+    sortPairwiseMenuItem.setText(MessageManager.getString("action.by_pairwise_id"));
     sortPairwiseMenuItem
             .addActionListener(new java.awt.event.ActionListener()
             {
@@ -734,7 +734,7 @@ public class GAlignFrame extends JInternalFrame
                 sortPairwiseMenuItem_actionPerformed(e);
               }
             });
-    sortIDMenuItem.setText("by ID");
+    sortIDMenuItem.setText(MessageManager.getString("action.by_id"));
     sortIDMenuItem.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -742,7 +742,7 @@ public class GAlignFrame extends JInternalFrame
         sortIDMenuItem_actionPerformed(e);
       }
     });
-    sortLengthMenuItem.setText("By Length");
+    sortLengthMenuItem.setText(MessageManager.getString("action.by_length"));
     sortLengthMenuItem
             .addActionListener(new java.awt.event.ActionListener()
             {
@@ -751,7 +751,7 @@ public class GAlignFrame extends JInternalFrame
                 sortLengthMenuItem_actionPerformed(e);
               }
             });
-    sortGroupMenuItem.setText("by Group");
+    sortGroupMenuItem.setText(MessageManager.getString("action.by_group"));
     sortGroupMenuItem.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -759,7 +759,7 @@ public class GAlignFrame extends JInternalFrame
         sortGroupMenuItem_actionPerformed(e);
       }
     });
-    removeRedundancyMenuItem.setText("Remove Redundancy...");
+    removeRedundancyMenuItem.setText(MessageManager.getString("action.remove_redundancy"));
     removeRedundancyMenuItem.setAccelerator(javax.swing.KeyStroke
             .getKeyStroke(java.awt.event.KeyEvent.VK_D, Toolkit
                     .getDefaultToolkit().getMenuShortcutKeyMask(), false));
@@ -771,7 +771,7 @@ public class GAlignFrame extends JInternalFrame
                 removeRedundancyMenuItem_actionPerformed(e);
               }
             });
-    pairwiseAlignmentMenuItem.setText("Pairwise Alignments...");
+    pairwiseAlignmentMenuItem.setText(MessageManager.getString("action.pairwise_alignment"));
     pairwiseAlignmentMenuItem
             .addActionListener(new java.awt.event.ActionListener()
             {
@@ -780,7 +780,7 @@ public class GAlignFrame extends JInternalFrame
                 pairwiseAlignmentMenuItem_actionPerformed(e);
               }
             });
-    PCAMenuItem.setText("Principal Component Analysis");
+    PCAMenuItem.setText(MessageManager.getString("label.principal_component_analysis"));
     PCAMenuItem.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -789,7 +789,7 @@ public class GAlignFrame extends JInternalFrame
       }
     });
     averageDistanceTreeMenuItem
-            .setText("Average Distance Using % Identity");
+            .setText(MessageManager.getString("label.average_distance_identity"));
     averageDistanceTreeMenuItem
             .addActionListener(new java.awt.event.ActionListener()
             {
@@ -798,7 +798,7 @@ public class GAlignFrame extends JInternalFrame
                 averageDistanceTreeMenuItem_actionPerformed(e);
               }
             });
-    neighbourTreeMenuItem.setText("Neighbour Joining Using % Identity");
+    neighbourTreeMenuItem.setText(MessageManager.getString("label.neighbour_joining_identity"));
     neighbourTreeMenuItem
             .addActionListener(new java.awt.event.ActionListener()
             {
@@ -812,9 +812,9 @@ public class GAlignFrame extends JInternalFrame
     statusBar.setBackground(Color.white);
     statusBar.setFont(new java.awt.Font("Verdana", 0, 11));
     statusBar.setBorder(BorderFactory.createLineBorder(Color.black));
-    statusBar.setText("Status bar");
-    outputTextboxMenu.setText("Output to Textbox");
-    clustalColour.setText("Clustalx");
+    statusBar.setText(MessageManager.getString("label.status_bar"));
+    outputTextboxMenu.setText(MessageManager.getString("label.out_to_textbox"));
+    clustalColour.setText(MessageManager.getString("label.clustalx"));
 
     clustalColour.addActionListener(new java.awt.event.ActionListener()
     {
@@ -823,7 +823,7 @@ public class GAlignFrame extends JInternalFrame
         clustalColour_actionPerformed(e);
       }
     });
-    zappoColour.setText("Zappo");
+    zappoColour.setText(MessageManager.getString("label.zappo"));
     zappoColour.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -831,7 +831,7 @@ public class GAlignFrame extends JInternalFrame
         zappoColour_actionPerformed(e);
       }
     });
-    taylorColour.setText("Taylor");
+    taylorColour.setText(MessageManager.getString("label.taylor"));
     taylorColour.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -839,7 +839,7 @@ public class GAlignFrame extends JInternalFrame
         taylorColour_actionPerformed(e);
       }
     });
-    hydrophobicityColour.setText("Hydrophobicity");
+    hydrophobicityColour.setText(MessageManager.getString("label.hydrophobicity"));
     hydrophobicityColour
             .addActionListener(new java.awt.event.ActionListener()
             {
@@ -848,7 +848,7 @@ public class GAlignFrame extends JInternalFrame
                 hydrophobicityColour_actionPerformed(e);
               }
             });
-    helixColour.setText("Helix Propensity");
+    helixColour.setText(MessageManager.getString("label.helix_propensity"));
     helixColour.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -856,7 +856,7 @@ public class GAlignFrame extends JInternalFrame
         helixColour_actionPerformed(e);
       }
     });
-    strandColour.setText("Strand Propensity");
+    strandColour.setText(MessageManager.getString("label.strand_propensity"));
     strandColour.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -864,7 +864,7 @@ public class GAlignFrame extends JInternalFrame
         strandColour_actionPerformed(e);
       }
     });
-    turnColour.setText("Turn Propensity");
+    turnColour.setText(MessageManager.getString("Turn Propensity"));
     turnColour.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -872,7 +872,7 @@ public class GAlignFrame extends JInternalFrame
         turnColour_actionPerformed(e);
       }
     });
-    buriedColour.setText("Buried Index");
+    buriedColour.setText(MessageManager.getString("Buried Index"));
     buriedColour.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -880,7 +880,7 @@ public class GAlignFrame extends JInternalFrame
         buriedColour_actionPerformed(e);
       }
     });
-    userDefinedColour.setText("User Defined...");
+    userDefinedColour.setText(MessageManager.getString("action.user_defined"));
     userDefinedColour.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -888,7 +888,7 @@ public class GAlignFrame extends JInternalFrame
         userDefinedColour_actionPerformed(e);
       }
     });
-    PIDColour.setText("Percentage Identity");
+    PIDColour.setText(MessageManager.getString("label.percentage_identity"));
     PIDColour.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -896,7 +896,7 @@ public class GAlignFrame extends JInternalFrame
         PIDColour_actionPerformed(e);
       }
     });
-    BLOSUM62Colour.setText("BLOSUM62 Score");
+    BLOSUM62Colour.setText(MessageManager.getString("label.blosum62_score"));
     BLOSUM62Colour.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -904,7 +904,7 @@ public class GAlignFrame extends JInternalFrame
         BLOSUM62Colour_actionPerformed(e);
       }
     });
-    nucleotideColour.setText("Nucleotide");
+    nucleotideColour.setText(MessageManager.getString("label.nucleotide"));
     nucleotideColour.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -913,7 +913,7 @@ public class GAlignFrame extends JInternalFrame
       }
     });
 
-    purinePyrimidineColour.setText("Purine/Pyrimidine");
+    purinePyrimidineColour.setText(MessageManager.getString("label.purine_pyrimidine"));
     purinePyrimidineColour
             .addActionListener(new java.awt.event.ActionListener()
             {
@@ -929,7 +929,7 @@ public class GAlignFrame extends JInternalFrame
      * covariationColour_actionPerformed(e); } });
      */
 
-    avDistanceTreeBlosumMenuItem.setText("Average Distance Using BLOSUM62");
+    avDistanceTreeBlosumMenuItem.setText(MessageManager.getString("label.average_distance_bloslum62"));
     avDistanceTreeBlosumMenuItem
             .addActionListener(new java.awt.event.ActionListener()
             {
@@ -938,7 +938,7 @@ public class GAlignFrame extends JInternalFrame
                 avTreeBlosumMenuItem_actionPerformed(e);
               }
             });
-    njTreeBlosumMenuItem.setText("Neighbour Joining using BLOSUM62");
+    njTreeBlosumMenuItem.setText(MessageManager.getString("label.neighbour_blosum62"));
     njTreeBlosumMenuItem
             .addActionListener(new java.awt.event.ActionListener()
             {
@@ -948,7 +948,7 @@ public class GAlignFrame extends JInternalFrame
               }
             });
     annotationPanelMenuItem.setActionCommand("");
-    annotationPanelMenuItem.setText("Show Annotations");
+    annotationPanelMenuItem.setText(MessageManager.getString("label.show_annotations"));
     annotationPanelMenuItem.setState(jalview.bin.Cache.getDefault(
             "SHOW_ANNOTATIONS", true));
     annotationPanelMenuItem
@@ -959,7 +959,7 @@ public class GAlignFrame extends JInternalFrame
                 annotationPanelMenuItem_actionPerformed(e);
               }
             });
-    colourTextMenuItem.setText("Colour Text");
+    colourTextMenuItem.setText(MessageManager.getString("label.colour_text"));
     colourTextMenuItem
             .addActionListener(new java.awt.event.ActionListener()
             {
@@ -968,7 +968,7 @@ public class GAlignFrame extends JInternalFrame
                 colourTextMenuItem_actionPerformed(e);
               }
             });
-    htmlMenuItem.setText("HTML");
+    htmlMenuItem.setText(MessageManager.getString("label.html"));
     htmlMenuItem.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -976,7 +976,7 @@ public class GAlignFrame extends JInternalFrame
         htmlMenuItem_actionPerformed(e);
       }
     });
-    overviewMenuItem.setText("Overview Window");
+    overviewMenuItem.setText(MessageManager.getString("label.overview_window"));
     overviewMenuItem.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -985,7 +985,7 @@ public class GAlignFrame extends JInternalFrame
       }
     });
     undoMenuItem.setEnabled(false);
-    undoMenuItem.setText("Undo");
+    undoMenuItem.setText(MessageManager.getString("action.undo"));
     undoMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
             java.awt.event.KeyEvent.VK_Z, Toolkit.getDefaultToolkit()
                     .getMenuShortcutKeyMask(), false));
@@ -997,7 +997,7 @@ public class GAlignFrame extends JInternalFrame
       }
     });
     redoMenuItem.setEnabled(false);
-    redoMenuItem.setText("Redo");
+    redoMenuItem.setText(MessageManager.getString("action.redo"));
     redoMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
             java.awt.event.KeyEvent.VK_Y, Toolkit.getDefaultToolkit()
                     .getMenuShortcutKeyMask(), false));
@@ -1008,7 +1008,7 @@ public class GAlignFrame extends JInternalFrame
         redoMenuItem_actionPerformed(e);
       }
     });
-    conservationMenuItem.setText("By Conservation");
+    conservationMenuItem.setText(MessageManager.getString("action.by_conservation"));
     conservationMenuItem
             .addActionListener(new java.awt.event.ActionListener()
             {
@@ -1017,7 +1017,7 @@ public class GAlignFrame extends JInternalFrame
                 conservationMenuItem_actionPerformed(e);
               }
             });
-    noColourmenuItem.setText("None");
+    noColourmenuItem.setText(MessageManager.getString("label.none"));
     noColourmenuItem.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -1025,7 +1025,7 @@ public class GAlignFrame extends JInternalFrame
         noColourmenuItem_actionPerformed(e);
       }
     });
-    wrapMenuItem.setText("Wrap");
+    wrapMenuItem.setText(MessageManager.getString("labe.wrap"));
     wrapMenuItem.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -1033,7 +1033,7 @@ public class GAlignFrame extends JInternalFrame
         wrapMenuItem_actionPerformed(e);
       }
     });
-    printMenuItem.setText("Print ...");
+    printMenuItem.setText(MessageManager.getString("action.print") + "...");
     printMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
             java.awt.event.KeyEvent.VK_P, Toolkit.getDefaultToolkit()
                     .getMenuShortcutKeyMask(), false));
@@ -1044,7 +1044,7 @@ public class GAlignFrame extends JInternalFrame
         printMenuItem_actionPerformed(e);
       }
     });
-    renderGapsMenuItem.setText("Show Gaps");
+    renderGapsMenuItem.setText(MessageManager.getString("action.show_gaps"));
     renderGapsMenuItem.setState(true);
     renderGapsMenuItem
             .addActionListener(new java.awt.event.ActionListener()
@@ -1054,7 +1054,7 @@ public class GAlignFrame extends JInternalFrame
                 renderGapsMenuItem_actionPerformed(e);
               }
             });
-    findMenuItem.setText("Find...");
+    findMenuItem.setText(MessageManager.getString("action.find"));
     findMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
             java.awt.event.KeyEvent.VK_F, Toolkit.getDefaultToolkit()
                     .getMenuShortcutKeyMask(), false));
@@ -1065,7 +1065,7 @@ public class GAlignFrame extends JInternalFrame
         findMenuItem_actionPerformed(e);
       }
     });
-    abovePIDThreshold.setText("Above Identity Threshold");
+    abovePIDThreshold.setText(MessageManager.getString("label.above_identity_threshold"));
     abovePIDThreshold.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -1073,7 +1073,7 @@ public class GAlignFrame extends JInternalFrame
         abovePIDThreshold_actionPerformed(e);
       }
     });
-    showSeqFeatures.setText("Show Sequence Features");
+    showSeqFeatures.setText(MessageManager.getString("label.show_sequence_features"));
     showSeqFeatures.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent actionEvent)
@@ -1087,7 +1087,7 @@ public class GAlignFrame extends JInternalFrame
      * void actionPerformed(ActionEvent actionEvent) {
      * showSeqFeaturesHeight_actionPerformed(actionEvent); } });
      */
-    showDbRefsMenuitem.setText("Show Database Refs");
+    showDbRefsMenuitem.setText(MessageManager.getString("label.show_database_refs"));
     showDbRefsMenuitem.addActionListener(new ActionListener()
     {
 
@@ -1097,7 +1097,7 @@ public class GAlignFrame extends JInternalFrame
       }
 
     });
-    showNpFeatsMenuitem.setText("Show Non-Positional Features");
+    showNpFeatsMenuitem.setText(MessageManager.getString("label.show_non_positional_features"));
     showNpFeatsMenuitem.addActionListener(new ActionListener()
     {
 
@@ -1107,7 +1107,7 @@ public class GAlignFrame extends JInternalFrame
       }
 
     });
-    showGroupConservation.setText("Group Conservation");
+    showGroupConservation.setText(MessageManager.getString("label.group_conservation"));
     showGroupConservation.addActionListener(new ActionListener()
     {
 
@@ -1118,7 +1118,7 @@ public class GAlignFrame extends JInternalFrame
 
     });
 
-    showGroupConsensus.setText("Group Consensus");
+    showGroupConsensus.setText(MessageManager.getString("label.group_consensus"));
     showGroupConsensus.addActionListener(new ActionListener()
     {
 
@@ -1128,7 +1128,7 @@ public class GAlignFrame extends JInternalFrame
       }
 
     });
-    showConsensusHistogram.setText("Show Consensus Histogram");
+    showConsensusHistogram.setText(MessageManager.getString("label.show_consensus_histogram"));
     showConsensusHistogram.addActionListener(new ActionListener()
     {
 
@@ -1138,7 +1138,7 @@ public class GAlignFrame extends JInternalFrame
       }
 
     });
-    showSequenceLogo.setText("Show Consensus Logo");
+    showSequenceLogo.setText(MessageManager.getString("label.show_consensus_logo"));
     showSequenceLogo.addActionListener(new ActionListener()
     {
 
@@ -1148,7 +1148,7 @@ public class GAlignFrame extends JInternalFrame
       }
 
     });
-    normaliseSequenceLogo.setText("Normalise Consensus Logo");
+    normaliseSequenceLogo.setText(MessageManager.getString("label.norm_consensus_logo"));
     normaliseSequenceLogo.addActionListener(new ActionListener()
     {
 
@@ -1158,7 +1158,7 @@ public class GAlignFrame extends JInternalFrame
       }
 
     });
-    applyAutoAnnotationSettings.setText("Apply to all groups");
+    applyAutoAnnotationSettings.setText(MessageManager.getString("label.apply_all_groups"));
     applyAutoAnnotationSettings.setState(false);
     applyAutoAnnotationSettings.setVisible(true);
     applyAutoAnnotationSettings.addActionListener(new ActionListener()
@@ -1171,7 +1171,7 @@ public class GAlignFrame extends JInternalFrame
 
     });
 
-    nucleotideColour.setText("Nucleotide");
+    nucleotideColour.setText(MessageManager.getString("label.nucleotide"));
     nucleotideColour.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -1180,7 +1180,7 @@ public class GAlignFrame extends JInternalFrame
       }
     });
 
-    tcoffeeColour.setText("T-Coffee scores");
+    tcoffeeColour.setText(MessageManager.getString("label.tcoffee_scores"));
     tcoffeeColour.setEnabled(false);
     tcoffeeColour.addActionListener(new ActionListener()
     {
@@ -1192,7 +1192,7 @@ public class GAlignFrame extends JInternalFrame
       }
     });
 
-    deleteGroups.setText("Undefine groups");
+    deleteGroups.setText(MessageManager.getString("action.undefine_groups"));
     deleteGroups.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
             java.awt.event.KeyEvent.VK_U, Toolkit.getDefaultToolkit()
                     .getMenuShortcutKeyMask(), false));
@@ -1203,7 +1203,7 @@ public class GAlignFrame extends JInternalFrame
         deleteGroups_actionPerformed(e);
       }
     });
-    createGroup.setText("Create group");
+    createGroup.setText(MessageManager.getString("action.create_groups"));
     createGroup.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
             java.awt.event.KeyEvent.VK_G, Toolkit.getDefaultToolkit()
                     .getMenuShortcutKeyMask(), false));
@@ -1214,7 +1214,7 @@ public class GAlignFrame extends JInternalFrame
         createGroup_actionPerformed(e);
       }
     });
-    unGroup.setText("Remove Group");
+    unGroup.setText(MessageManager.getString("action.remove_group"));
     unGroup.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
             java.awt.event.KeyEvent.VK_G,Toolkit.getDefaultToolkit()
                     .getMenuShortcutKeyMask() | java.awt.event.KeyEvent.SHIFT_MASK, false));
@@ -1225,7 +1225,7 @@ public class GAlignFrame extends JInternalFrame
         unGroup_actionPerformed(e);
       }
     });
-    copy.setText("Copy");
+    copy.setText(MessageManager.getString("action.copy"));
     copy.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
             java.awt.event.KeyEvent.VK_C, Toolkit.getDefaultToolkit()
                     .getMenuShortcutKeyMask(), false));
@@ -1237,7 +1237,7 @@ public class GAlignFrame extends JInternalFrame
         copy_actionPerformed(e);
       }
     });
-    cut.setText("Cut");
+    cut.setText(MessageManager.getString("action.cut"));
     cut.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
             java.awt.event.KeyEvent.VK_X, Toolkit.getDefaultToolkit()
                     .getMenuShortcutKeyMask(), false));
@@ -1248,7 +1248,7 @@ public class GAlignFrame extends JInternalFrame
         cut_actionPerformed(e);
       }
     });
-    delete.setText("Delete");
+    delete.setText(MessageManager.getString("action.delete"));
     delete.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
             java.awt.event.KeyEvent.VK_BACK_SPACE, 0, false));
     delete.addActionListener(new java.awt.event.ActionListener()
@@ -1258,8 +1258,8 @@ public class GAlignFrame extends JInternalFrame
         delete_actionPerformed(e);
       }
     });
-    pasteMenu.setText("Paste");
-    pasteNew.setText("To New Alignment");
+    pasteMenu.setText(MessageManager.getString("action.paste"));
+    pasteNew.setText(MessageManager.getString("label.to_new_alignment"));
     pasteNew.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
             java.awt.event.KeyEvent.VK_V, Toolkit.getDefaultToolkit()
                     .getMenuShortcutKeyMask()
@@ -1271,7 +1271,7 @@ public class GAlignFrame extends JInternalFrame
         pasteNew_actionPerformed(e);
       }
     });
-    pasteThis.setText("Add To This Alignment");
+    pasteThis.setText(MessageManager.getString("label.to_this_alignment"));
     pasteThis.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
             java.awt.event.KeyEvent.VK_V, Toolkit.getDefaultToolkit()
                     .getMenuShortcutKeyMask(), false));
@@ -1282,7 +1282,7 @@ public class GAlignFrame extends JInternalFrame
         pasteThis_actionPerformed(e);
       }
     });
-    applyToAllGroups.setText("Apply Colour To All Groups");
+    applyToAllGroups.setText(MessageManager.getString("label.apply_colour_to_all_groups"));
     applyToAllGroups.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -1297,9 +1297,9 @@ public class GAlignFrame extends JInternalFrame
         createPNG(null);
       }
     });
-    createPNG.setActionCommand("Save As PNG Image");
+    createPNG.setActionCommand(MessageManager.getString("label.save_png_image"));
     createPNG.setText("PNG");
-    font.setText("Font...");
+    font.setText(MessageManager.getString("action.font"));
     font.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -1308,7 +1308,7 @@ public class GAlignFrame extends JInternalFrame
       }
     });
 
-    seqLimits.setText("Show Sequence Limits");
+    seqLimits.setText(MessageManager.getString("label.show_sequence_limits"));
     seqLimits.setState(jalview.bin.Cache.getDefault("SHOW_JVSUFFIX", true));
     seqLimits.addActionListener(new java.awt.event.ActionListener()
     {
@@ -1325,8 +1325,8 @@ public class GAlignFrame extends JInternalFrame
         createEPS(null);
       }
     });
-    LoadtreeMenuItem.setActionCommand("Load a tree for this sequence set");
-    LoadtreeMenuItem.setText("Load Associated Tree");
+    LoadtreeMenuItem.setActionCommand(MessageManager.getString("label.load_tree_for_sequence_set"));
+    LoadtreeMenuItem.setText(MessageManager.getString("label.load_associated_tree"));
     LoadtreeMenuItem.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -1336,7 +1336,7 @@ public class GAlignFrame extends JInternalFrame
     });
 
     scaleAbove.setVisible(false);
-    scaleAbove.setText("Scale Above");
+    scaleAbove.setText(MessageManager.getString("action.scale_above"));
     scaleAbove.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -1346,7 +1346,7 @@ public class GAlignFrame extends JInternalFrame
     });
     scaleLeft.setVisible(false);
     scaleLeft.setSelected(true);
-    scaleLeft.setText("Scale Left");
+    scaleLeft.setText(MessageManager.getString("action.scale_left"));
     scaleLeft.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -1356,7 +1356,7 @@ public class GAlignFrame extends JInternalFrame
     });
     scaleRight.setVisible(false);
     scaleRight.setSelected(true);
-    scaleRight.setText("Scale Right");
+    scaleRight.setText(MessageManager.getString("action.scale_right"));
     scaleRight.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -1366,7 +1366,7 @@ public class GAlignFrame extends JInternalFrame
     });
     centreColumnLabelsMenuItem.setVisible(true);
     centreColumnLabelsMenuItem.setState(false);
-    centreColumnLabelsMenuItem.setText("Centre Column Labels");
+    centreColumnLabelsMenuItem.setText(MessageManager.getString("label.centre_column_labels"));
     centreColumnLabelsMenuItem
             .addActionListener(new java.awt.event.ActionListener()
             {
@@ -1377,7 +1377,7 @@ public class GAlignFrame extends JInternalFrame
             });
     followHighlightMenuItem.setVisible(true);
     followHighlightMenuItem.setState(true);
-    followHighlightMenuItem.setText("Automatic Scrolling");
+    followHighlightMenuItem.setText(MessageManager.getString("label.automatic_scrolling"));
     followHighlightMenuItem.addActionListener(new ActionListener()
     {
 
@@ -1388,7 +1388,7 @@ public class GAlignFrame extends JInternalFrame
 
     });
 
-    modifyPID.setText("Modify Identity Threshold...");
+    modifyPID.setText(MessageManager.getString("label.modify_identity_thereshold"));
     modifyPID.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -1396,7 +1396,7 @@ public class GAlignFrame extends JInternalFrame
         modifyPID_actionPerformed(e);
       }
     });
-    modifyConservation.setText("Modify Conservation Threshold...");
+    modifyConservation.setText(MessageManager.getString("label.modify_conservation_thereshold"));
     modifyConservation
             .addActionListener(new java.awt.event.ActionListener()
             {
@@ -1405,8 +1405,8 @@ public class GAlignFrame extends JInternalFrame
                 modifyConservation_actionPerformed(e);
               }
             });
-    sortByTreeMenu.setText("By Tree Order");
-    sort.setText("Sort");
+    sortByTreeMenu.setText(MessageManager.getString("action.by_tree_order"));
+    sort.setText(MessageManager.getString("action.sort"));
     sort.addMenuListener(new MenuListener()
     {
       public void menuSelected(MenuEvent e)
@@ -1422,7 +1422,7 @@ public class GAlignFrame extends JInternalFrame
       {
       }
     });
-    sortByAnnotScore.setText("by Score");
+    sortByAnnotScore.setText(MessageManager.getString("label.sort_by_score"));
     sort.add(sortByAnnotScore);
     sortByAnnotScore.addMenuListener(new javax.swing.event.MenuListener()
     {
@@ -1442,10 +1442,10 @@ public class GAlignFrame extends JInternalFrame
     });
     sortByAnnotScore.setVisible(false);
 
-    calculateTree.setText("Calculate Tree");
+    calculateTree.setText(MessageManager.getString("action.calculate_tree"));
 
-    jMenu2.setText("Export Image");
-    padGapsMenuitem.setText("Pad Gaps");
+    jMenu2.setText(MessageManager.getString("label.export_image"));
+    padGapsMenuitem.setText(MessageManager.getString("label.pad_gaps"));
     padGapsMenuitem.setState(jalview.bin.Cache
             .getDefault("PAD_GAPS", false));
     padGapsMenuitem.addActionListener(new ActionListener()
@@ -1456,7 +1456,7 @@ public class GAlignFrame extends JInternalFrame
       }
     });
     vamsasStore.setVisible(false);
-    vamsasStore.setText("VAMSAS store");
+    vamsasStore.setText(MessageManager.getString("label.vamsas_store"));
     vamsasStore.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -1464,7 +1464,7 @@ public class GAlignFrame extends JInternalFrame
         vamsasStore_actionPerformed(e);
       }
     });
-    showTranslation.setText("Translate cDNA");
+    showTranslation.setText(MessageManager.getString("label.translate_cDNA"));
     showTranslation.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -1472,7 +1472,7 @@ public class GAlignFrame extends JInternalFrame
         showTranslation_actionPerformed(e);
       }
     });
-    extractScores.setText("Extract Scores...");
+    extractScores.setText(MessageManager.getString("label.extract_scores") + "...");
     extractScores.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -1482,14 +1482,14 @@ public class GAlignFrame extends JInternalFrame
     });
     extractScores.setVisible(true); // JBPNote: TODO: make gui for regex based
     // score extraction
-    showProducts.setText("Get Cross References");
+    showProducts.setText(MessageManager.getString("label.get_cross_refs"));
     /*
      * showProducts.addActionListener(new ActionListener() {
      * 
      * public void actionPerformed(ActionEvent e) {
      * showProducts_actionPerformed(e); } });
      */
-    openFeatureSettings.setText("Feature Settings...");
+    openFeatureSettings.setText(MessageManager.getString("label.feature_settings"));
     openFeatureSettings.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -1497,7 +1497,7 @@ public class GAlignFrame extends JInternalFrame
         featureSettings_actionPerformed(e);
       }
     });
-    fetchSequence.setText("Fetch Sequence(s)...");
+    fetchSequence.setText(MessageManager.getString("label.fetch_sequences"));
     fetchSequence.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -1506,7 +1506,7 @@ public class GAlignFrame extends JInternalFrame
       }
     });
 
-    annotationColour.setText("By Annotation...");
+    annotationColour.setText(MessageManager.getString("action.by_annotation"));
     annotationColour.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -1515,7 +1515,7 @@ public class GAlignFrame extends JInternalFrame
       }
     });
 
-    rnahelicesColour.setText("By RNA helices");
+    rnahelicesColour.setText(MessageManager.getString("action.by_rna_helixes"));
     rnahelicesColour.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -1524,7 +1524,7 @@ public class GAlignFrame extends JInternalFrame
       }
     });
 
-    associatedData.setText("Load Features / Annotations");
+    associatedData.setText(MessageManager.getString("label.load_features_annotations"));
     associatedData.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -1532,7 +1532,7 @@ public class GAlignFrame extends JInternalFrame
         associatedData_actionPerformed(e);
       }
     });
-    autoCalculate.setText("Autocalculate Consensus");
+    autoCalculate.setText(MessageManager.getString("label.autocalculate_consensus"));
     autoCalculate.setState(jalview.bin.Cache.getDefault(
             "AUTO_CALC_CONSENSUS", true));
     autoCalculate.addActionListener(new ActionListener()
@@ -1542,9 +1542,9 @@ public class GAlignFrame extends JInternalFrame
         autoCalculate_actionPerformed(e);
       }
     });
-    sortByTree.setText("Sort Alignment With New Tree");
+    sortByTree.setText(MessageManager.getString("label.sort_alignment_new_tree"));
     sortByTree
-            .setToolTipText("<html>Enable this to automatically sort<br>the alignment when you open<br> a new tree.");
+            .setToolTipText("<html>" + MessageManager.getString("label.enable_automatically_sort_alignment_when_open_new_tree"));
     sortByTree
             .setState(jalview.bin.Cache.getDefault("SORT_BY_TREE", false));
     sortByTree.addActionListener(new ActionListener()
@@ -1555,9 +1555,9 @@ public class GAlignFrame extends JInternalFrame
       }
     });
 
-    listenToViewSelections.setText("Listen for selections");
+    listenToViewSelections.setText(MessageManager.getString("label.listen_for_selections"));
     listenToViewSelections
-            .setToolTipText("<html>When selected, selections in this view will mirror<br>selections made on the same sequences in other views.");
+            .setToolTipText("<html>" + MessageManager.getString("label.selections_mirror_selections_made_same_sequences_other_views"));
     listenToViewSelections.setState(false);
     listenToViewSelections.addActionListener(new ActionListener()
     {
@@ -1567,8 +1567,8 @@ public class GAlignFrame extends JInternalFrame
       }
     });
 
-    addSequenceMenu.setText("Add Sequences");
-    addFromFile.setText("From File");
+    addSequenceMenu.setText(MessageManager.getString("label.add_sequences"));
+    addFromFile.setText(MessageManager.getString("label.from_file"));
     addFromFile.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -1576,7 +1576,7 @@ public class GAlignFrame extends JInternalFrame
         addFromFile_actionPerformed(e);
       }
     });
-    addFromText.setText("From Textbox");
+    addFromText.setText(MessageManager.getString("label.from_textbox"));
     addFromText.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -1584,7 +1584,7 @@ public class GAlignFrame extends JInternalFrame
         addFromText_actionPerformed(e);
       }
     });
-    addFromURL.setText("From URL");
+    addFromURL.setText(MessageManager.getString("label.from_url"));
     addFromURL.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -1592,7 +1592,7 @@ public class GAlignFrame extends JInternalFrame
         addFromURL_actionPerformed(e);
       }
     });
-    exportFeatures.setText("Export Features...");
+    exportFeatures.setText(MessageManager.getString("label.export_features"));
     exportFeatures.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -1600,7 +1600,7 @@ public class GAlignFrame extends JInternalFrame
         exportFeatures_actionPerformed(e);
       }
     });
-    exportAnnotations.setText("Export Annotations...");
+    exportAnnotations.setText(MessageManager.getString("label.export_annotations"));
     exportAnnotations.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -1609,9 +1609,9 @@ public class GAlignFrame extends JInternalFrame
       }
     });
     statusPanel.setLayout(gridLayout1);
-    jMenu3.setText("Show");
-    showAllSeqs.setText("All Sequences");
-    showAllSeqs.setToolTipText("Shift+H toggles sequence visiblity.");
+    jMenu3.setText(MessageManager.getString("action.show"));
+    showAllSeqs.setText(MessageManager.getString("label.all_sequences"));
+    showAllSeqs.setToolTipText(MessageManager.getString("label.toggle_sequence_visibility"));
     showAllSeqs.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -1619,8 +1619,8 @@ public class GAlignFrame extends JInternalFrame
         showAllSeqs_actionPerformed(e);
       }
     });
-    showAllColumns.setText("All Columns");
-    showAllColumns.setToolTipText("Ctrl+H toggles column visiblity.");
+    showAllColumns.setText(MessageManager.getString("label.all_columns"));
+    showAllColumns.setToolTipText(MessageManager.getString("label.toggle_columns_visibility"));
     showAllColumns.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -1628,9 +1628,9 @@ public class GAlignFrame extends JInternalFrame
         showAllColumns_actionPerformed(e);
       }
     });
-    hideMenu.setText("Hide");
-    hideSelSequences.setText("Selected Sequences");
-    hideSelSequences.setToolTipText("Shift+H toggles sequence visiblity.");
+    hideMenu.setText(MessageManager.getString("action.hide"));
+    hideSelSequences.setText(MessageManager.getString("label.selected_sequences"));
+    hideSelSequences.setToolTipText(MessageManager.getString("label.toggle_sequence_visibility"));
     hideSelSequences.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -1638,8 +1638,8 @@ public class GAlignFrame extends JInternalFrame
         hideSelSequences_actionPerformed(e);
       }
     });
-    hideSelColumns.setText("Selected Columns");
-    hideSelColumns.setToolTipText("Ctrl+H toggles column visiblity.");
+    hideSelColumns.setText(MessageManager.getString("label.selected_columns"));
+    hideSelColumns.setToolTipText(MessageManager.getString("label.toggle_columns_visibility"));
     hideSelColumns.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -1647,7 +1647,7 @@ public class GAlignFrame extends JInternalFrame
         hideSelColumns_actionPerformed(e);
       }
     });
-    hideAllSelection.setText("Selected Region");
+    hideAllSelection.setText(MessageManager.getString("label.selected_region"));
     hideAllSelection.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -1656,7 +1656,7 @@ public class GAlignFrame extends JInternalFrame
       }
     });
     // TODO: should be hidden if no selection exists.
-    hideAllButSelection.setText("All but Selected Region (Shift+Ctrl+H)");
+    hideAllButSelection.setText(MessageManager.getString("label.all_but_selected_region"));
     hideAllButSelection.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -1664,9 +1664,9 @@ public class GAlignFrame extends JInternalFrame
         hideAllButSelection_actionPerformed(e);
       }
     });
-    showAllhidden.setText("All Sequences and Columns");
+    showAllhidden.setText(MessageManager.getString("label.all_sequences_columns"));
     showAllhidden
-            .setToolTipText("H toggles visibility of hidden or selected regions.");
+            .setToolTipText(MessageManager.getString("label.toggles_visibility_hidden_selected_regions"));
     showAllhidden.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -1675,7 +1675,7 @@ public class GAlignFrame extends JInternalFrame
       }
     });
 
-    hiddenMarkers.setText("Show Hidden Markers");
+    hiddenMarkers.setText(MessageManager.getString("action.show_hidden_markers"));
     hiddenMarkers.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -1683,7 +1683,7 @@ public class GAlignFrame extends JInternalFrame
         hiddenMarkers_actionPerformed(e);
       }
     });
-    invertColSel.setText("Invert Column Selection");
+    invertColSel.setText(MessageManager.getString("action.invert_column_selection"));
     invertColSel.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
             java.awt.event.KeyEvent.VK_I, Toolkit.getDefaultToolkit()
                     .getMenuShortcutKeyMask()
@@ -1718,7 +1718,7 @@ public class GAlignFrame extends JInternalFrame
         tabbedPane_focusGained(e);
       }
     });
-    save.setText("Save");
+    save.setText(MessageManager.getString("action.save"));
     save.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
             java.awt.event.KeyEvent.VK_S, Toolkit.getDefaultToolkit()
                     .getMenuShortcutKeyMask(), false));
@@ -1730,7 +1730,7 @@ public class GAlignFrame extends JInternalFrame
       }
     });
     reload.setEnabled(false);
-    reload.setText("Reload");
+    reload.setText(MessageManager.getString("action.reload"));
     reload.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -1738,7 +1738,7 @@ public class GAlignFrame extends JInternalFrame
         reload_actionPerformed(e);
       }
     });
-    newView.setText("New View");
+    newView.setText(MessageManager.getString("action.new_view"));
     newView.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
             java.awt.event.KeyEvent.VK_T, Toolkit.getDefaultToolkit()
                     .getMenuShortcutKeyMask(), false));
@@ -1749,9 +1749,8 @@ public class GAlignFrame extends JInternalFrame
         newView_actionPerformed(e);
       }
     });
-    tabbedPane.setToolTipText("<html><i> Right-click to rename tab"
-            + "<br> Press X to eXpand tabs, G to reGroup.</i></html>");
-    textColour.setText("Colour Text ...");
+    tabbedPane.setToolTipText("<html><i>" + MessageManager.getString("label.rename_tab_eXpand_reGroup") + "</i></html>");
+    textColour.setText(MessageManager.getString("label.colour_text") + "...");
     textColour.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -1759,9 +1758,9 @@ public class GAlignFrame extends JInternalFrame
         textColour_actionPerformed(e);
       }
     });
-    formatMenu.setText("Format");
-    selectMenu.setText("Select");
-    idRightAlign.setText("Right Align Sequence Id");
+    formatMenu.setText(MessageManager.getString("action.format"));
+    selectMenu.setText(MessageManager.getString("action.select"));
+    idRightAlign.setText(MessageManager.getString("label.right_align_sequence_id"));
     idRightAlign.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -1770,7 +1769,7 @@ public class GAlignFrame extends JInternalFrame
       }
     });
     gatherViews.setEnabled(false);
-    gatherViews.setText("Gather Views");
+    gatherViews.setText(MessageManager.getString("action.gather_views"));
     gatherViews.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
             java.awt.event.KeyEvent.VK_G, 0, false));
     gatherViews.addActionListener(new ActionListener()
@@ -1781,7 +1780,7 @@ public class GAlignFrame extends JInternalFrame
       }
     });
     expandViews.setEnabled(false);
-    expandViews.setText("Expand Views");
+    expandViews.setText(MessageManager.getString("action.expand_views"));
     expandViews.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
             java.awt.event.KeyEvent.VK_X, 0, false));
     expandViews.addActionListener(new ActionListener()
@@ -1791,7 +1790,7 @@ public class GAlignFrame extends JInternalFrame
         expandViews_actionPerformed(e);
       }
     });
-    pageSetup.setText("Page Setup ...");
+    pageSetup.setText(MessageManager.getString("action.page_setup") + "...");
     pageSetup.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -1799,7 +1798,7 @@ public class GAlignFrame extends JInternalFrame
         pageSetup_actionPerformed(e);
       }
     });
-    alignmentProperties.setText("Alignment Properties...");
+    alignmentProperties.setText(MessageManager.getString("label.alignment_props") + "...");
     alignmentProperties.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent actionEvent)
@@ -1807,8 +1806,8 @@ public class GAlignFrame extends JInternalFrame
         alignmentProperties();
       }
     });
-    tooltipSettingsMenu.setText("Sequence ID Tooltip");
-    autoAnnMenu.setText("Autocalculated Annotation");
+    tooltipSettingsMenu.setText(MessageManager.getString("label.sequence_id_tooltip"));
+    autoAnnMenu.setText(MessageManager.getString("label.autocalculated_annotation"));
     alignFrameMenuBar.add(fileMenu);
     alignFrameMenuBar.add(editMenu);
     alignFrameMenuBar.add(selectMenu);
@@ -1921,7 +1920,7 @@ public class GAlignFrame extends JInternalFrame
     calculateMenu.add(sortByTree);
     calculateMenu.addSeparator();
     calculateMenu.add(extractScores);
-    webServiceNoServices = new JMenuItem("<No Services>");
+    webServiceNoServices = new JMenuItem(MessageManager.getString("label.no_services"));
     webService.add(webServiceNoServices);
     pasteMenu.add(pasteNew);
     pasteMenu.add(pasteThis);
index 4a591d1..130574d 100644 (file)
@@ -18,6 +18,7 @@
 package jalview.jbgui;
 
 import jalview.gui.JvSwingUtils;
+import jalview.util.MessageManager;
 
 import java.awt.*;
 import java.awt.event.*;
@@ -87,7 +88,7 @@ public class GCutAndPasteHtmlTransfer extends JInternalFrame
   {
     scrollPane.setBorder(null);
     ok.setFont(JvSwingUtils.getLabelFont());
-    ok.setText("New Window");
+    ok.setText(MessageManager.getString("label.new_window"));
     ok.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -95,7 +96,7 @@ public class GCutAndPasteHtmlTransfer extends JInternalFrame
         ok_actionPerformed(e);
       }
     });
-    cancel.setText("Close");
+    cancel.setText(MessageManager.getString("action.close"));
     cancel.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -104,7 +105,7 @@ public class GCutAndPasteHtmlTransfer extends JInternalFrame
       }
     });
     textarea.setBorder(null);
-    close.setText("Close");
+    close.setText(MessageManager.getString("action.close"));
     close.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -115,7 +116,7 @@ public class GCutAndPasteHtmlTransfer extends JInternalFrame
     close.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
             java.awt.event.KeyEvent.VK_W, Toolkit.getDefaultToolkit()
                     .getMenuShortcutKeyMask(), false));
-    selectAll.setText("Select All");
+    selectAll.setText(MessageManager.getString("action.select_all"));
     selectAll.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
             java.awt.event.KeyEvent.VK_A, Toolkit.getDefaultToolkit()
                     .getMenuShortcutKeyMask(), false));
@@ -126,8 +127,8 @@ public class GCutAndPasteHtmlTransfer extends JInternalFrame
         selectAll_actionPerformed(e);
       }
     });
-    jMenu1.setText("File");
-    save.setText("Save");
+    jMenu1.setText(MessageManager.getString("action.file"));
+    save.setText(MessageManager.getString("action.save"));
     save.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
             java.awt.event.KeyEvent.VK_S, Toolkit.getDefaultToolkit()
                     .getMenuShortcutKeyMask(), false));
@@ -152,8 +153,8 @@ public class GCutAndPasteHtmlTransfer extends JInternalFrame
         textarea_mousePressed(e);
       }
     });
-    editMenu.setText("Edit");
-    copyItem.setText("Copy");
+    editMenu.setText(MessageManager.getString("action.edit"));
+    copyItem.setText(MessageManager.getString("action.copy"));
     copyItem.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -161,9 +162,9 @@ public class GCutAndPasteHtmlTransfer extends JInternalFrame
         copyItem_actionPerformed(e);
       }
     });
-    displaySource.setText("Show HTML Source");
+    displaySource.setText(MessageManager.getString("action.show_html_source"));
     displaySource
-            .setToolTipText("Select this if you want to copy raw html");
+            .setToolTipText(MessageManager.getString("label.select_copy_raw_html"));
     displaySource.addActionListener(new ActionListener()
     {
 
index 4f650df..f9ee953 100755 (executable)
@@ -18,6 +18,7 @@
 package jalview.jbgui;
 
 import jalview.gui.JvSwingUtils;
+import jalview.util.MessageManager;
 
 import java.awt.*;
 import java.awt.event.*;
@@ -84,7 +85,7 @@ public class GCutAndPasteTransfer extends JInternalFrame
   {
     scrollPane.setBorder(null);
     ok.setFont(JvSwingUtils.getLabelFont());
-    ok.setText("New Window");
+    ok.setText(MessageManager.getString("label.new_window"));
     ok.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -92,7 +93,7 @@ public class GCutAndPasteTransfer extends JInternalFrame
         ok_actionPerformed(e);
       }
     });
-    cancel.setText("Close");
+    cancel.setText(MessageManager.getString("action.close"));
     cancel.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -102,7 +103,7 @@ public class GCutAndPasteTransfer extends JInternalFrame
     });
     textarea.setBorder(null);
 
-    selectAll.setText("Select All");
+    selectAll.setText(MessageManager.getString("action.select_all"));
     selectAll.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
             java.awt.event.KeyEvent.VK_A, Toolkit.getDefaultToolkit()
                     .getMenuShortcutKeyMask(), false));
@@ -113,8 +114,8 @@ public class GCutAndPasteTransfer extends JInternalFrame
         selectAll_actionPerformed(e);
       }
     });
-    jMenu1.setText("File");
-    save.setText("Save");
+    jMenu1.setText(MessageManager.getString("action.file"));
+    save.setText(MessageManager.getString("action.save"));
     save.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
             java.awt.event.KeyEvent.VK_S, Toolkit.getDefaultToolkit()
                     .getMenuShortcutKeyMask(), false));
@@ -141,8 +142,8 @@ public class GCutAndPasteTransfer extends JInternalFrame
         textarea_mousePressed(e);
       }
     });
-    editMenu.setText("Edit");
-    pasteMenu.setText("Paste");
+    editMenu.setText(MessageManager.getString("action.edit"));
+    pasteMenu.setText(MessageManager.getString("action.paste"));
     pasteMenu.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -150,7 +151,7 @@ public class GCutAndPasteTransfer extends JInternalFrame
         pasteMenu_actionPerformed(e);
       }
     });
-    copyItem.setText("Copy");
+    copyItem.setText(MessageManager.getString("action.copy"));
     copyItem.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
index 4bf265f..180ba70 100755 (executable)
@@ -17,6 +17,8 @@
  */
 package jalview.jbgui;
 
+import jalview.util.MessageManager;
+
 import java.awt.*;
 import java.awt.event.*;
 import javax.swing.*;
@@ -39,7 +41,7 @@ public class GDasSourceBrowser extends JPanel
   private void jbInit() throws Exception
   {
     this.setLayout(gridBagLayout1);
-    refresh.setText("Refresh Available Sources");
+    refresh.setText(MessageManager.getString("label.refresh_available_sources"));
     refresh.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -63,8 +65,8 @@ public class GDasSourceBrowser extends JPanel
     fullDetails.setEditable(false);
     registryLabel.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));
     registryLabel.setHorizontalAlignment(SwingConstants.TRAILING);
-    registryLabel.setText("Use Registry");
-    addLocal.setText("Add Local Source");
+    registryLabel.setText(MessageManager.getString("label.use_registry"));
+    addLocal.setText(MessageManager.getString("label.add_local_source"));
     addLocal.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -90,7 +92,7 @@ public class GDasSourceBrowser extends JPanel
     table.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));
     reset.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));
     reset.setMargin(new Insets(2, 2, 2, 2));
-    reset.setText("Reset");
+    reset.setText(MessageManager.getString("action.reset"));
     reset.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -139,7 +141,7 @@ public class GDasSourceBrowser extends JPanel
 
   protected JEditorPane fullDetails = new JEditorPane("text/html", "");
 
-  TitledBorder titledBorder1 = new TitledBorder("Available DAS Sources");
+  TitledBorder titledBorder1 = new TitledBorder(MessageManager.getString("label.available_das_sources"));
 
   protected JButton refresh = new JButton();
 
@@ -147,7 +149,7 @@ public class GDasSourceBrowser extends JPanel
 
   protected JScrollPane scrollPane = new JScrollPane();
 
-  TitledBorder titledBorder2 = new TitledBorder("Full Details");
+  TitledBorder titledBorder2 = new TitledBorder(MessageManager.getString("label.full_details"));
 
   protected JScrollPane fullDetailsScrollpane = new JScrollPane();
 
@@ -175,11 +177,11 @@ public class GDasSourceBrowser extends JPanel
 
   GridBagLayout gridBagLayout1 = new GridBagLayout();
 
-  TitledBorder titledBorder3 = new TitledBorder("Authority:");
+  TitledBorder titledBorder3 = new TitledBorder(MessageManager.getString("label.authority") + ":");
 
-  TitledBorder titledBorder4 = new TitledBorder("Type:");
+  TitledBorder titledBorder4 = new TitledBorder(MessageManager.getString("label.type") + ":");
 
-  TitledBorder titledBorder5 = new TitledBorder("Label:");
+  TitledBorder titledBorder5 = new TitledBorder(MessageManager.getString("label.label") + ":");
 
   JButton reset = new JButton();
 
index a3af237..eb8246f 100755 (executable)
@@ -17,6 +17,8 @@
  */
 package jalview.jbgui;
 
+import jalview.util.MessageManager;
+
 import java.awt.*;
 import java.awt.event.*;
 
@@ -126,13 +128,13 @@ public class GDesktop extends JFrame
    */
   private void jbInit() throws Exception
   {
-    FileMenu.setText("File");
-    HelpMenu.setText("Help");
+    FileMenu.setText(MessageManager.getString("action.file"));
+    HelpMenu.setText(MessageManager.getString("action.help"));
     VamsasMenu.setText("Vamsas");
-    VamsasMenu.setToolTipText("Share data with other vamsas applications.");
-    VamsasStMenu.setText("Connect to");
-    VamsasStMenu.setToolTipText("Join an existing vamsas session");
-    inputLocalFileMenuItem.setText("from File");
+    VamsasMenu.setToolTipText(MessageManager.getString("label.share_data_vamsas_applications"));
+    VamsasStMenu.setText(MessageManager.getString("label.connect_to"));
+    VamsasStMenu.setToolTipText(MessageManager.getString("label.join_existing_vamsas_session"));
+    inputLocalFileMenuItem.setText(MessageManager.getString("label.load_tree_from_file"));
     inputLocalFileMenuItem.setAccelerator(javax.swing.KeyStroke
             .getKeyStroke(java.awt.event.KeyEvent.VK_O, Toolkit
                     .getDefaultToolkit().getMenuShortcutKeyMask(), false));
@@ -144,7 +146,7 @@ public class GDesktop extends JFrame
                 inputLocalFileMenuItem_actionPerformed(null);
               }
             });
-    inputURLMenuItem.setText("from URL");
+    inputURLMenuItem.setText(MessageManager.getString("label.from_url"));
     inputURLMenuItem.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -152,7 +154,7 @@ public class GDesktop extends JFrame
         inputURLMenuItem_actionPerformed(null);
       }
     });
-    inputTextboxMenuItem.setText("from Textbox");
+    inputTextboxMenuItem.setText(MessageManager.getString("label.from_textbox"));
     inputTextboxMenuItem
             .addActionListener(new java.awt.event.ActionListener()
             {
@@ -161,7 +163,7 @@ public class GDesktop extends JFrame
                 inputTextboxMenuItem_actionPerformed(null);
               }
             });
-    quit.setText("Quit");
+    quit.setText(MessageManager.getString("action.quit"));
     quit.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -169,7 +171,7 @@ public class GDesktop extends JFrame
         quit();
       }
     });
-    aboutMenuItem.setText("About");
+    aboutMenuItem.setText(MessageManager.getString("label.about"));
     aboutMenuItem.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -177,7 +179,7 @@ public class GDesktop extends JFrame
         aboutMenuItem_actionPerformed(e);
       }
     });
-    documentationMenuItem.setText("Documentation");
+    documentationMenuItem.setText(MessageManager.getString("label.documentation"));
     documentationMenuItem.setAccelerator(javax.swing.KeyStroke
             .getKeyStroke(java.awt.event.KeyEvent.VK_F1, 0, false));
     documentationMenuItem
@@ -189,8 +191,8 @@ public class GDesktop extends JFrame
               }
             });
     this.getContentPane().setLayout(flowLayout1);
-    windowMenu.setText("Window");
-    preferences.setText("Preferences...");
+    windowMenu.setText(MessageManager.getString("label.window"));
+    preferences.setText(MessageManager.getString("label.preferences") + "...");
     preferences.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -198,8 +200,8 @@ public class GDesktop extends JFrame
         preferences_actionPerformed(e);
       }
     });
-    toolsMenu.setText("Tools");
-    saveState.setText("Save Project");
+    toolsMenu.setText(MessageManager.getString("label.tools"));
+    saveState.setText(MessageManager.getString("action.save_project"));
     saveState.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -207,7 +209,7 @@ public class GDesktop extends JFrame
         saveState_actionPerformed(e);
       }
     });
-    loadState.setText("Load Project");
+    loadState.setText(MessageManager.getString("action.load_project"));
     loadState.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -215,8 +217,8 @@ public class GDesktop extends JFrame
         loadState_actionPerformed(e);
       }
     });
-    inputMenu.setText("Input Alignment");
-    vamsasStart.setText("New Vamsas Session...");
+    inputMenu.setText(MessageManager.getString("label.input_alignment"));
+    vamsasStart.setText(MessageManager.getString("label.new_vamsas_session") + "...");
     vamsasStart.setVisible(false);
     vamsasStart.addActionListener(new ActionListener()
     {
@@ -225,7 +227,7 @@ public class GDesktop extends JFrame
         vamsasStart_actionPerformed(e);
       }
     });
-    vamsasImport.setText("Load Vamsas Session...");
+    vamsasImport.setText(MessageManager.getString("label.load_vamsas_session") + "...");
     vamsasImport.setVisible(false);
     vamsasImport.addActionListener(new ActionListener()
     {
@@ -234,7 +236,7 @@ public class GDesktop extends JFrame
         vamsasImport_actionPerformed(e);
       }
     });
-    vamsasSave.setText("Save Vamsas Session...");
+    vamsasSave.setText(MessageManager.getString("label.save_vamsas_session") + "...");
     vamsasSave.setVisible(false);
     vamsasSave.addActionListener(new ActionListener()
     {
@@ -243,7 +245,7 @@ public class GDesktop extends JFrame
         vamsasSave_actionPerformed(e);
       }
     });
-    inputSequence.setText("Fetch Sequence(s)...");
+    inputSequence.setText(MessageManager.getString("label.fetch_sequences") + "...");
     inputSequence.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -251,7 +253,7 @@ public class GDesktop extends JFrame
         inputSequence_actionPerformed(e);
       }
     });
-    vamsasStop.setText("Stop Vamsas Session");
+    vamsasStop.setText(MessageManager.getString("label.stop_vamsas_session"));
     vamsasStop.setVisible(false);
     vamsasStop.addActionListener(new ActionListener()
     {
@@ -260,7 +262,7 @@ public class GDesktop extends JFrame
         vamsasStop_actionPerformed(e);
       }
     });
-    closeAll.setText("Close All");
+    closeAll.setText(MessageManager.getString("action.close_all"));
     closeAll.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -268,7 +270,7 @@ public class GDesktop extends JFrame
         closeAll_actionPerformed(e);
       }
     });
-    raiseRelated.setText("Raise Associated Windows");
+    raiseRelated.setText(MessageManager.getString("action.raise_associated_windows"));
     raiseRelated.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -276,7 +278,7 @@ public class GDesktop extends JFrame
         raiseRelated_actionPerformed(e);
       }
     });
-    minimizeAssociated.setText("Minimize Associated Windows");
+    minimizeAssociated.setText(MessageManager.getString("action.minimize_associated_windows"));
     minimizeAssociated.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -284,7 +286,7 @@ public class GDesktop extends JFrame
         minimizeAssociated_actionPerformed(e);
       }
     });
-    garbageCollect.setText("Collect Garbage");
+    garbageCollect.setText(MessageManager.getString("label.collect_garbage"));
     garbageCollect.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -292,7 +294,7 @@ public class GDesktop extends JFrame
         garbageCollect_actionPerformed(e);
       }
     });
-    showMemusage.setText("Show Memory Usage");
+    showMemusage.setText(MessageManager.getString("label.show_memory_usage"));
     showMemusage.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -300,7 +302,7 @@ public class GDesktop extends JFrame
         showMemusage_actionPerformed(e);
       }
     });
-    showConsole.setText("Show Java Console");
+    showConsole.setText(MessageManager.getString("label.show_java_console"));
     showConsole.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -308,7 +310,7 @@ public class GDesktop extends JFrame
         showConsole_actionPerformed(e);
       }
     });
-    showNews.setText("Show Jalview News");
+    showNews.setText(MessageManager.getString("label.show_jalview_news"));
     showNews.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
index 8292e58..40d6a51 100755 (executable)
@@ -24,6 +24,7 @@ import javax.swing.event.*;
 
 import jalview.datamodel.*;
 import jalview.io.*;
+import jalview.util.MessageManager;
 
 public class GFinder extends JPanel
 {
@@ -71,10 +72,10 @@ public class GFinder extends JPanel
   private void jbInit() throws Exception
   {
     jLabel1.setFont(new java.awt.Font("Verdana", 0, 12));
-    jLabel1.setText("Find");
+    jLabel1.setText(MessageManager.getString("action.find"));
     this.setLayout(borderLayout1);
     findAll.setFont(new java.awt.Font("Verdana", 0, 12));
-    findAll.setText("Find all");
+    findAll.setText(MessageManager.getString("action.find_all"));
     findAll.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -83,7 +84,7 @@ public class GFinder extends JPanel
       }
     });
     findNext.setFont(new java.awt.Font("Verdana", 0, 12));
-    findNext.setText("Find Next");
+    findNext.setText(MessageManager.getString("action.find_next"));
     findNext.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -98,7 +99,7 @@ public class GFinder extends JPanel
     createNewGroup.setEnabled(false);
     createNewGroup.setFont(new java.awt.Font("Verdana", 0, 12));
     createNewGroup.setMargin(new Insets(0, 0, 0, 0));
-    createNewGroup.setText("New Feature");
+    createNewGroup.setText(MessageManager.getString("label.new_feature"));
     createNewGroup.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -130,7 +131,7 @@ public class GFinder extends JPanel
     jPanel2.setPreferredSize(new Dimension(10, 1));
     jPanel3.setPreferredSize(new Dimension(10, 1));
     caseSensitive.setHorizontalAlignment(SwingConstants.LEFT);
-    caseSensitive.setText("Match Case");
+    caseSensitive.setText(MessageManager.getString("label.match_case"));
     jPanel1.add(findNext, null);
     jPanel1.add(findAll, null);
     jPanel1.add(createNewGroup, null);
index 12e1740..c75da38 100755 (executable)
@@ -18,6 +18,7 @@
 package jalview.jbgui;
 
 import jalview.gui.JvSwingUtils;
+import jalview.util.MessageManager;
 
 import java.awt.*;
 import java.awt.event.*;
@@ -93,7 +94,7 @@ public class GFontChooser extends JPanel
   {
     jLabel1.setFont(new java.awt.Font("Verdana", 0, 11));
     jLabel1.setHorizontalAlignment(SwingConstants.RIGHT);
-    jLabel1.setText("Font: ");
+    jLabel1.setText(MessageManager.getString("label.font"));
     jLabel1.setVerticalTextPosition(javax.swing.SwingConstants.CENTER);
     this.setLayout(null);
     fontSize.setFont(new java.awt.Font("Verdana", 0, 11));
@@ -118,11 +119,11 @@ public class GFontChooser extends JPanel
     });
     jLabel2.setFont(new java.awt.Font("Verdana", 0, 11));
     jLabel2.setHorizontalAlignment(SwingConstants.RIGHT);
-    jLabel2.setText("Size: ");
+    jLabel2.setText(MessageManager.getString("label.size"));
     jLabel2.setVerticalTextPosition(javax.swing.SwingConstants.CENTER);
     jLabel3.setFont(new java.awt.Font("Verdana", 0, 11));
     jLabel3.setHorizontalAlignment(SwingConstants.RIGHT);
-    jLabel3.setText("Style: ");
+    jLabel3.setText(MessageManager.getString("label.style"));
     jLabel3.setVerticalTextPosition(javax.swing.SwingConstants.CENTER);
     fontName.setFont(new java.awt.Font("Verdana", 0, 11));
     fontName.setMaximumSize(new Dimension(32767, 32767));
@@ -137,7 +138,7 @@ public class GFontChooser extends JPanel
       }
     });
     ok.setFont(new java.awt.Font("Verdana", 0, 11));
-    ok.setText("OK");
+    ok.setText(MessageManager.getString("action.ok"));
     ok.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -146,7 +147,7 @@ public class GFontChooser extends JPanel
       }
     });
     cancel.setFont(new java.awt.Font("Verdana", 0, 11));
-    cancel.setText("Cancel");
+    cancel.setText(MessageManager.getString("action.cancel"));
     cancel.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -165,7 +166,7 @@ public class GFontChooser extends JPanel
     jPanel3.setBounds(new Rectangle(174, 38, 134, 21));
     jPanel3.setLayout(borderLayout2);
     defaultButton.setFont(JvSwingUtils.getLabelFont());
-    defaultButton.setText("Set as Default");
+    defaultButton.setText(MessageManager.getString("label.set_as_default"));
     defaultButton.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -175,7 +176,7 @@ public class GFontChooser extends JPanel
     });
     smoothFont.setFont(JvSwingUtils.getLabelFont());
     smoothFont.setOpaque(false);
-    smoothFont.setText("Anti-alias Fonts (Slower to render)");
+    smoothFont.setText(MessageManager.getString("label.anti_alias_fonts"));
     smoothFont.setBounds(new Rectangle(41, 65, 223, 23));
     smoothFont.addActionListener(new ActionListener()
     {
@@ -187,8 +188,8 @@ public class GFontChooser extends JPanel
     monospaced.setEnabled(false);
     monospaced.setFont(JvSwingUtils.getLabelFont());
     monospaced.setOpaque(false);
-    monospaced.setToolTipText("Monospaced fonts are faster to render");
-    monospaced.setText("Monospaced");
+    monospaced.setToolTipText(MessageManager.getString("label.monospaced_fonts_faster_to_render"));
+    monospaced.setText(MessageManager.getString("label.monospaced_font"));
     jPanel4.setOpaque(false);
     jPanel4.setBounds(new Rectangle(24, 92, 259, 35));
     jPanel1.add(jLabel1, BorderLayout.WEST);
index 94e8dca..f5612dd 100755 (executable)
@@ -17,6 +17,8 @@
  */
 package jalview.jbgui;
 
+import jalview.util.MessageManager;
+
 import java.awt.*;
 import java.awt.event.*;
 
@@ -144,7 +146,7 @@ public class GPCAPanel extends JInternalFrame
       }
     });
     resetButton.setFont(new java.awt.Font("Verdana", 0, 12));
-    resetButton.setText("Reset");
+    resetButton.setText(MessageManager.getString("action.reset"));
     resetButton.addActionListener(new java.awt.event.ActionListener()
     {
       @Override
@@ -153,8 +155,8 @@ public class GPCAPanel extends JInternalFrame
         resetButton_actionPerformed(e);
       }
     });
-    fileMenu.setText("File");
-    saveMenu.setText("Save as");
+    fileMenu.setText(MessageManager.getString("action.file"));
+    saveMenu.setText(MessageManager.getString("action.save_as"));
     eps.setText("EPS");
     eps.addActionListener(new ActionListener()
     {
@@ -171,7 +173,7 @@ public class GPCAPanel extends JInternalFrame
         png_actionPerformed(e);
       }
     });
-    outputValues.setText("Output Values...");
+    outputValues.setText(MessageManager.getString("label.output_values"));
     outputValues.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -179,7 +181,7 @@ public class GPCAPanel extends JInternalFrame
         outputValues_actionPerformed(e);
       }
     });
-    outputPoints.setText("Output points...");
+    outputPoints.setText(MessageManager.getString("label.output_points"));
     outputPoints.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -187,7 +189,7 @@ public class GPCAPanel extends JInternalFrame
         outputPoints_actionPerformed(e);
       }
     });
-    outputProjPoints.setText("Output transformed points...");
+    outputProjPoints.setText(MessageManager.getString("label.output_transformed_points") + "...");
     outputProjPoints.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -202,7 +204,7 @@ public class GPCAPanel extends JInternalFrame
         print_actionPerformed(e);
       }
     });
-    viewMenu.setText("View");
+    viewMenu.setText(MessageManager.getString("aciton.view"));
     viewMenu.addMenuListener(new MenuListener()
     {
       public void menuSelected(MenuEvent e)
@@ -218,7 +220,7 @@ public class GPCAPanel extends JInternalFrame
       {
       }
     });
-    showLabels.setText("Show Labels");
+    showLabels.setText(MessageManager.getString("label.show_labels"));
     showLabels.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -226,8 +228,8 @@ public class GPCAPanel extends JInternalFrame
         showLabels_actionPerformed(e);
       }
     });
-    print.setText("Print");
-    bgcolour.setText("Background Colour...");
+    print.setText(MessageManager.getString("action.print"));
+    bgcolour.setText(MessageManager.getString("label.background_colour") + "...");
     bgcolour.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -235,7 +237,7 @@ public class GPCAPanel extends JInternalFrame
         bgcolour_actionPerformed(e);
       }
     });
-    originalSeqData.setText("Input Data...");
+    originalSeqData.setText(MessageManager.getString("label.input_data"));
     originalSeqData.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -243,10 +245,10 @@ public class GPCAPanel extends JInternalFrame
         originalSeqData_actionPerformed(e);
       }
     });
-    associateViewsMenu.setText("Associate Nodes With");
-    calcSettings.setText("Change Parameters");
-    nuclSetting.setText("Nucleotide matrix");
-    protSetting.setText("Protein matrix");
+    associateViewsMenu.setText(MessageManager.getString("label.associate_nodes_with"));
+    calcSettings.setText(MessageManager.getString("action.change_params"));
+    nuclSetting.setText(MessageManager.getString("label.nucleotide_matrix"));
+    protSetting.setText(MessageManager.getString("label.protein_matrix"));
     nuclSetting.addActionListener(new ActionListener()
     {
 
@@ -265,7 +267,7 @@ public class GPCAPanel extends JInternalFrame
         protSetting_actionPerfomed(arg0);
       }
     });
-    jvVersionSetting.setText("Jalview PCA Calculation");
+    jvVersionSetting.setText(MessageManager.getString("label.jalview_pca_calculation"));
     jvVersionSetting.addActionListener(new ActionListener()
     {
       @Override
index f02c670..fcb6036 100755 (executable)
@@ -17,6 +17,8 @@
  */
 package jalview.jbgui;
 
+import jalview.util.MessageManager;
+
 import java.awt.*;
 import java.awt.event.*;
 import javax.swing.*;
@@ -66,7 +68,7 @@ public class GPairwiseAlignPanel extends JPanel
     textarea.setText("");
     textarea.setWrapStyleWord(false);
     viewInEditorButton.setFont(new java.awt.Font("Verdana", 0, 12));
-    viewInEditorButton.setText("View in alignment editor");
+    viewInEditorButton.setText(MessageManager.getString("label.view_alignment_editor"));
     viewInEditorButton
             .addActionListener(new java.awt.event.ActionListener()
             {
index aa8f176..90ab1c6 100755 (executable)
@@ -18,6 +18,7 @@
 package jalview.jbgui;
 
 import jalview.gui.JvSwingUtils;
+import jalview.util.MessageManager;
 
 import java.awt.*;
 import java.awt.event.*;
@@ -129,9 +130,9 @@ public class GPreferences extends JPanel
 
   JPanel jPanel1 = new JPanel();
 
-  TitledBorder titledBorder1 = new TitledBorder("Proxy Server");
+  TitledBorder titledBorder1 = new TitledBorder(MessageManager.getString("label.proxy_server"));
 
-  TitledBorder titledBorder2 = new TitledBorder("File Output");
+  TitledBorder titledBorder2 = new TitledBorder(MessageManager.getString("label.file_output"));
 
   GridBagLayout gridBagLayout2 = new GridBagLayout();
 
@@ -276,7 +277,7 @@ public class GPreferences extends JPanel
   private void jbInit() throws Exception
   {
     this.setLayout(borderLayout1);
-    ok.setText("OK");
+    ok.setText(MessageManager.getString("action.ok"));
     ok.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -284,7 +285,7 @@ public class GPreferences extends JPanel
         ok_actionPerformed(e);
       }
     });
-    cancel.setText("Cancel");
+    cancel.setText(MessageManager.getString("action.cancel"));
     cancel.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -297,76 +298,76 @@ public class GPreferences extends JPanel
     quality.setHorizontalAlignment(SwingConstants.RIGHT);
     quality.setHorizontalTextPosition(SwingConstants.LEFT);
     quality.setSelected(true);
-    quality.setText("Quality");
-    visualTab.setBorder(new TitledBorder("Open new alignment"));
+    quality.setText(MessageManager.getString("label.quality"));
+    visualTab.setBorder(new TitledBorder(MessageManager.getString("action.open_new_aligmnent")));
     visualTab.setLayout(null);
-    visual2Tab.setBorder(new TitledBorder("Open new alignment"));
+    visual2Tab.setBorder(new TitledBorder(MessageManager.getString("action.open_new_aligmnent")));
     visual2Tab.setLayout(new FlowLayout());
     fullScreen.setFont(verdana11);
     fullScreen.setHorizontalAlignment(SwingConstants.RIGHT);
     fullScreen.setHorizontalTextPosition(SwingConstants.LEFT);
-    fullScreen.setText("Maximise Window");
+    fullScreen.setText(MessageManager.getString("label.maximize_window"));
     conservation.setEnabled(false);
     conservation.setFont(verdana11);
     conservation.setHorizontalAlignment(SwingConstants.RIGHT);
     conservation.setHorizontalTextPosition(SwingConstants.LEFT);
     conservation.setSelected(true);
-    conservation.setText("Conservation");
+    conservation.setText(MessageManager.getString("label.conservation"));
     identity.setEnabled(false);
     identity.setFont(verdana11);
     identity.setHorizontalAlignment(SwingConstants.RIGHT);
     identity.setHorizontalTextPosition(SwingConstants.LEFT);
     identity.setSelected(true);
-    identity.setText("Consensus");
+    identity.setText(MessageManager.getString("label.consensus"));
     showGroupbits.setFont(verdana11);
     showGroupbits.setHorizontalAlignment(SwingConstants.RIGHT);
     showGroupbits.setHorizontalTextPosition(SwingConstants.LEFT);
-    showGroupbits.setText("Show group:");
+    showGroupbits.setText(MessageManager.getString("action.show_group") + ":");
     showConsensbits.setFont(verdana11);
     showConsensbits.setHorizontalAlignment(SwingConstants.RIGHT);
     showConsensbits.setHorizontalTextPosition(SwingConstants.LEFT);
-    showConsensbits.setText("Consensus:");
+    showConsensbits.setText(MessageManager.getString("label.consensus") + ":");
     showConsensHistogram.setEnabled(false);
     showConsensHistogram.setFont(verdana11);
     showConsensHistogram.setHorizontalAlignment(SwingConstants.RIGHT);
     showConsensHistogram.setHorizontalTextPosition(SwingConstants.LEFT);
     showConsensHistogram.setSelected(true);
-    showConsensHistogram.setText("Histogram");
+    showConsensHistogram.setText(MessageManager.getString("label.histogram"));
     showConsensLogo.setEnabled(false);
     showConsensLogo.setFont(verdana11);
     showConsensLogo.setHorizontalAlignment(SwingConstants.RIGHT);
     showConsensLogo.setHorizontalTextPosition(SwingConstants.LEFT);
     showConsensLogo.setSelected(true);
-    showConsensLogo.setText("Logo");
+    showConsensLogo.setText(MessageManager.getString("label.logo"));
     showGroupConsensus.setEnabled(false);
     showGroupConsensus.setFont(verdana11);
     showGroupConsensus.setHorizontalAlignment(SwingConstants.RIGHT);
     showGroupConsensus.setHorizontalTextPosition(SwingConstants.LEFT);
     showGroupConsensus.setSelected(true);
-    showGroupConsensus.setText("Consensus");
+    showGroupConsensus.setText(MessageManager.getString("label.consensus"));
     showGroupConservation.setEnabled(false);
     showGroupConservation.setFont(verdana11);
     showGroupConservation.setHorizontalAlignment(SwingConstants.RIGHT);
     showGroupConservation.setHorizontalTextPosition(SwingConstants.LEFT);
     showGroupConservation.setSelected(true);
-    showGroupConservation.setText("Conservation");
+    showGroupConservation.setText(MessageManager.getString("label.conservation"));
     showNpTooltip.setEnabled(true);
     showNpTooltip.setFont(verdana11);
     showNpTooltip.setHorizontalAlignment(SwingConstants.RIGHT);
     showNpTooltip.setHorizontalTextPosition(SwingConstants.LEFT);
     showNpTooltip.setSelected(true);
-    showNpTooltip.setText("Non-positional Features");
+    showNpTooltip.setText(MessageManager.getString("label.non_positional_features"));
     showDbRefTooltip.setEnabled(true);
     showDbRefTooltip.setFont(verdana11);
     showDbRefTooltip.setHorizontalAlignment(SwingConstants.RIGHT);
     showDbRefTooltip.setHorizontalTextPosition(SwingConstants.LEFT);
     showDbRefTooltip.setSelected(true);
-    showDbRefTooltip.setText("Database References");
+    showDbRefTooltip.setText(MessageManager.getString("label.database_references"));
     annotations.setFont(verdana11);
     annotations.setHorizontalAlignment(SwingConstants.RIGHT);
     annotations.setHorizontalTextPosition(SwingConstants.LEADING);
     annotations.setSelected(true);
-    annotations.setText("Show Annotations");
+    annotations.setText(MessageManager.getString("label.show_annotations"));
     annotations.setBounds(new Rectangle(169, 12, 200, 23));
     annotations.addActionListener(new ActionListener()
     {
@@ -393,7 +394,7 @@ public class GPreferences extends JPanel
     showUnconserved.setHorizontalAlignment(SwingConstants.RIGHT);
     showUnconserved.setHorizontalTextPosition(SwingConstants.LEFT);
     showUnconserved.setSelected(true);
-    showUnconserved.setText("Show Unconserved");
+    showUnconserved.setText(MessageManager.getString("action.show_unconserved"));
     showUnconserved.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -406,25 +407,25 @@ public class GPreferences extends JPanel
     shareSelections.setHorizontalAlignment(SwingConstants.RIGHT);
     shareSelections.setHorizontalTextPosition(SwingConstants.LEFT);
     shareSelections.setSelected(true);
-    shareSelections.setText("Share selection across views");
+    shareSelections.setText(MessageManager.getString("label.share_selection_across_views"));
     followHighlight.setFont(verdana11);
     followHighlight.setHorizontalAlignment(SwingConstants.RIGHT);
     followHighlight.setHorizontalTextPosition(SwingConstants.LEFT);
     // showUnconserved.setBounds(new Rectangle(169, 40, 200, 23));
     followHighlight.setSelected(true);
-    followHighlight.setText("Scroll to highlighted regions");
+    followHighlight.setText(MessageManager.getString("label.scroll_highlighted_regions"));
 
     gapLabel.setFont(verdana11);
     gapLabel.setHorizontalAlignment(SwingConstants.RIGHT);
-    gapLabel.setText("Gap Symbol ");
+    gapLabel.setText(MessageManager.getString("label.gap_symbol") + " ");
     colour.setFont(verdana11);
     colour.setBounds(new Rectangle(172, 225, 155, 21));
     colourLabel.setFont(verdana11);
     colourLabel.setHorizontalAlignment(SwingConstants.RIGHT);
-    colourLabel.setText("Alignment Colour ");
+    colourLabel.setText(MessageManager.getString("label.alignment_colour") + " ");
     fontLabel.setFont(verdana11);
     fontLabel.setHorizontalAlignment(SwingConstants.RIGHT);
-    fontLabel.setText("Font ");
+    fontLabel.setText(MessageManager.getString("label.font"));
     fontSizeCB.setFont(verdana11);
     fontSizeCB.setBounds(new Rectangle(319, 104, 49, 23));
     fontStyleCB.setFont(verdana11);
@@ -435,7 +436,7 @@ public class GPreferences extends JPanel
     gapSymbolCB.setBounds(new Rectangle(172, 204, 69, 23));
     mincolourLabel.setFont(verdana11);
     mincolourLabel.setHorizontalAlignment(SwingConstants.RIGHT);
-    mincolourLabel.setText("Minimum Colour");
+    mincolourLabel.setText(MessageManager.getString("label.min_colour"));
     minColour.setFont(verdana11);
     minColour.setBorder(BorderFactory.createEtchedBorder());
     minColour.setPreferredSize(new Dimension(40, 20));
@@ -448,7 +449,7 @@ public class GPreferences extends JPanel
     });
     maxcolourLabel.setFont(verdana11);
     maxcolourLabel.setHorizontalAlignment(SwingConstants.RIGHT);
-    maxcolourLabel.setText("Maximum Colour ");
+    maxcolourLabel.setText(MessageManager.getString("label.max_colour"));
     maxColour.setFont(verdana11);
     maxColour.setBorder(BorderFactory.createEtchedBorder());
     maxColour.setPreferredSize(new Dimension(40, 20));
@@ -460,7 +461,7 @@ public class GPreferences extends JPanel
       }
     });
 
-    startupCheckbox.setText("Open file");
+    startupCheckbox.setText(MessageManager.getString("action.open_file"));
     startupCheckbox.setFont(verdana11);
     startupCheckbox.setHorizontalAlignment(SwingConstants.RIGHT);
     startupCheckbox.setHorizontalTextPosition(SwingConstants.LEFT);
@@ -479,32 +480,32 @@ public class GPreferences extends JPanel
     });
 
     connectTab.setLayout(gridBagLayout3);
-    serverLabel.setText("Address");
+    serverLabel.setText(MessageManager.getString("label.address"));
     serverLabel.setHorizontalAlignment(SwingConstants.RIGHT);
     serverLabel.setFont(verdana11);
     proxyServerTB.setFont(verdana11);
     proxyPortTB.setFont(verdana11);
     portLabel.setFont(verdana11);
     portLabel.setHorizontalAlignment(SwingConstants.RIGHT);
-    portLabel.setText("Port");
+    portLabel.setText(MessageManager.getString("label.port"));
     browserLabel.setFont(new java.awt.Font("SansSerif", 0, 11));
     browserLabel.setHorizontalAlignment(SwingConstants.TRAILING);
-    browserLabel.setText("Default Browser (Unix)");
+    browserLabel.setText(MessageManager.getString("label.default_browser_unix"));
     defaultBrowser.setFont(verdana11);
     defaultBrowser.setText("");
-    usagestats.setText("Send usage statistics");
+    usagestats.setText(MessageManager.getString("label.send_usage_statistics"));
     usagestats.setFont(verdana11);
     usagestats.setHorizontalAlignment(SwingConstants.RIGHT);
     usagestats.setHorizontalTextPosition(SwingConstants.LEADING);
-    questionnaire.setText("Check for questionnaires");
+    questionnaire.setText(MessageManager.getString("label.check_for_questionnaires"));
     questionnaire.setFont(verdana11);
     questionnaire.setHorizontalAlignment(SwingConstants.RIGHT);
     questionnaire.setHorizontalTextPosition(SwingConstants.LEADING);
-    versioncheck.setText("Check for latest version");
+    versioncheck.setText(MessageManager.getString("label.check_for_latest_version"));
     versioncheck.setFont(verdana11);
     versioncheck.setHorizontalAlignment(SwingConstants.RIGHT);
     versioncheck.setHorizontalTextPosition(SwingConstants.LEADING);
-    newLink.setText("New");
+    newLink.setText(MessageManager.getString("action.new"));
     newLink.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -512,7 +513,7 @@ public class GPreferences extends JPanel
         newLink_actionPerformed(e);
       }
     });
-    editLink.setText("Edit");
+    editLink.setText(MessageManager.getString("action.edit"));
     editLink.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -520,7 +521,7 @@ public class GPreferences extends JPanel
         editLink_actionPerformed(e);
       }
     });
-    deleteLink.setText("Delete");
+    deleteLink.setText(MessageManager.getString("action.delete"));
     deleteLink.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -548,7 +549,7 @@ public class GPreferences extends JPanel
     });
 
     linkScrollPane.setBorder(null);
-    linkPanel.setBorder(new TitledBorder("URL link from Sequence ID"));
+    linkPanel.setBorder(new TitledBorder(MessageManager.getString("label.url_linkfrom_sequence_id")));
     linkPanel.setLayout(borderLayout2);
     editLinkButtons.setLayout(gridLayout1);
     gridLayout1.setRows(3);
@@ -571,7 +572,7 @@ public class GPreferences extends JPanel
     useProxy.setFont(verdana11);
     useProxy.setHorizontalAlignment(SwingConstants.RIGHT);
     useProxy.setHorizontalTextPosition(SwingConstants.LEADING);
-    useProxy.setText("Use a proxy server");
+    useProxy.setText(MessageManager.getString("label.use_proxy_server"));
     useProxy.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -585,32 +586,32 @@ public class GPreferences extends JPanel
     sortby.setBounds(new Rectangle(172, 249, 155, 21));
     sortLabel.setFont(verdana11);
     sortLabel.setHorizontalAlignment(SwingConstants.RIGHT);
-    sortLabel.setText("Sort by ");
+    sortLabel.setText(MessageManager.getString("label.sort_by"));
     jPanel2.setBounds(new Rectangle(7, 17, 158, 278));
     jPanel2.setLayout(gridLayout2);
     gridLayout2.setRows(12);
     exportTab.setLayout(null);
     epsLabel.setFont(verdana11);
     epsLabel.setHorizontalAlignment(SwingConstants.RIGHT);
-    epsLabel.setText("EPS Rendering Style");
+    epsLabel.setText(MessageManager.getString("label.eps_rendering_style"));
     epsLabel.setBounds(new Rectangle(9, 31, 140, 24));
     epsRendering.setFont(verdana11);
     epsRendering.setBounds(new Rectangle(154, 34, 187, 21));
     jLabel1.setFont(verdana11);
     jLabel1.setHorizontalAlignment(SwingConstants.CENTER);
-    jLabel1.setText("Append /start-end (/15-380)");
+    jLabel1.setText(MessageManager.getString("label.append_start_end"));
     jLabel1.setFont(verdana11);
     fastajv.setFont(verdana11);
     fastajv.setHorizontalAlignment(SwingConstants.LEFT);
-    clustaljv.setText("Clustal     ");
-    blcjv.setText("BLC     ");
-    fastajv.setText("Fasta     ");
-    msfjv.setText("MSF     ");
-    pfamjv.setText("PFAM     ");
-    pileupjv.setText("Pileup     ");
+    clustaljv.setText(MessageManager.getString("label.clustal") + "     ");
+    blcjv.setText(MessageManager.getString("label.blc") + "     ");
+    fastajv.setText(MessageManager.getString("label.fasta") + "     ");
+    msfjv.setText(MessageManager.getString("label.msf")+ "     ");
+    pfamjv.setText(MessageManager.getString("label.pfam") + "     ");
+    pileupjv.setText(MessageManager.getString("label.pileup") + "     ");
     msfjv.setFont(verdana11);
     msfjv.setHorizontalAlignment(SwingConstants.LEFT);
-    pirjv.setText("PIR     ");
+    pirjv.setText(MessageManager.getString("label.pir") + "     ");
     jPanel11.setFont(verdana11);
     jPanel11.setBorder(titledBorder2);
     jPanel11.setBounds(new Rectangle(30, 72, 196, 182));
@@ -628,27 +629,27 @@ public class GPreferences extends JPanel
     seqLimit.setFont(verdana11);
     seqLimit.setHorizontalAlignment(SwingConstants.RIGHT);
     seqLimit.setHorizontalTextPosition(SwingConstants.LEFT);
-    seqLimit.setText("Full Sequence Id");
+    seqLimit.setText(MessageManager.getString("label.full_sequence_id"));
     gridLayout3.setRows(8);
     smoothFont.setFont(verdana11);
     smoothFont.setHorizontalAlignment(SwingConstants.RIGHT);
     smoothFont.setHorizontalTextPosition(SwingConstants.LEADING);
-    smoothFont.setText("Smooth Font");
+    smoothFont.setText(MessageManager.getString("label.smooth_font"));
     calcTab.setLayout(null);
     autoCalculateConsCheck.setFont(JvSwingUtils.getLabelFont());
-    autoCalculateConsCheck.setText("AutoCalculate Consensus");
+    autoCalculateConsCheck.setText(MessageManager.getString("label.autocalculate_consensus"));
     autoCalculateConsCheck.setBounds(new Rectangle(21, 52, 209, 23));
     padGaps.setFont(JvSwingUtils.getLabelFont());
-    padGaps.setText("Pad Gaps When Editing");
+    padGaps.setText(MessageManager.getString("label.pad_gaps_when_editing"));
     padGaps.setBounds(new Rectangle(22, 94, 168, 23));
     sortByTree.setFont(JvSwingUtils.getLabelFont());
-    sortByTree.setText("Sort With New Tree");
+    sortByTree.setText(MessageManager.getString("label.sort_with_new_tree"));
     sortByTree
-            .setToolTipText("When selected, any trees calculated or loaded onto the alignment will automatically sort the alignment.");
+            .setToolTipText(MessageManager.getString("label.any_trees_calculated_or_loaded_alignment_automatically_sort"));
     sortByTree.setBounds(new Rectangle(22, 136, 168, 23));
 
     autoIdWidth.setFont(JvSwingUtils.getLabelFont());
-    autoIdWidth.setText("Automatically set ID width");
+    autoIdWidth.setText(MessageManager.getString("label.automatically_set_id_width"));
     autoIdWidth
             .setToolTipText("<html>"
                     + JvSwingUtils
@@ -665,7 +666,7 @@ public class GPreferences extends JPanel
       }
     });
     userIdWidthlabel.setFont(JvSwingUtils.getLabelFont());
-    userIdWidthlabel.setText("Figure ID column width");
+    userIdWidthlabel.setText(MessageManager.getString("label.figure_id_column_width"));
     userIdWidth
             .setToolTipText("<html>"
                     + JvSwingUtils
@@ -690,7 +691,7 @@ public class GPreferences extends JPanel
       }
     });
     modellerOutput.setFont(JvSwingUtils.getLabelFont());
-    modellerOutput.setText("Use Modeller Output");
+    modellerOutput.setText(MessageManager.getString("label.use_modeller_output"));
     modellerOutput.setBounds(new Rectangle(228, 226, 168, 23));
 
     dasPanel.setLayout(borderLayout4);
@@ -698,21 +699,21 @@ public class GPreferences extends JPanel
     wrap.setFont(JvSwingUtils.getLabelFont());
     wrap.setHorizontalAlignment(SwingConstants.TRAILING);
     wrap.setHorizontalTextPosition(SwingConstants.LEADING);
-    wrap.setText("Wrap Alignment");
+    wrap.setText(MessageManager.getString("label.wrap_alignment"));
     rightAlign.setFont(JvSwingUtils.getLabelFont());
     rightAlign.setForeground(Color.black);
     rightAlign.setHorizontalAlignment(SwingConstants.RIGHT);
     rightAlign.setHorizontalTextPosition(SwingConstants.LEFT);
-    rightAlign.setText("Right Align Ids");
+    rightAlign.setText(MessageManager.getString("label.right_align_ids"));
     idItalics.setFont(JvSwingUtils.getLabelFont());
     idItalics.setHorizontalAlignment(SwingConstants.RIGHT);
     idItalics.setHorizontalTextPosition(SwingConstants.LEADING);
-    idItalics.setText("Sequence Name Italics");
+    idItalics.setText(MessageManager.getString("label.sequence_name_italics"));
     openoverv.setFont(JvSwingUtils.getLabelFont());
-    openoverv.setActionCommand("Open Overview");
+    openoverv.setActionCommand(MessageManager.getString("label.open_overview"));
     openoverv.setHorizontalAlignment(SwingConstants.RIGHT);
     openoverv.setHorizontalTextPosition(SwingConstants.LEFT);
-    openoverv.setText("Open Overview");
+    openoverv.setText(MessageManager.getString(("label.open_overview")));
     jPanel2.add(fullScreen);
     jPanel2.add(openoverv);
     jPanel2.add(seqLimit);
@@ -763,7 +764,7 @@ public class GPreferences extends JPanel
     autoAnnotSettings3.add(showConsensLogo);
 
     JPanel tooltipSettings = new JPanel();
-    tooltipSettings.setBorder(new TitledBorder("Sequence ID Tooltip"));
+    tooltipSettings.setBorder(new TitledBorder(MessageManager.getString("label.sequence_id_tooltip")));
     tooltipSettings.setBounds(173, 130, 200, 62);
     tooltipSettings.setLayout(new GridLayout(2, 1));
     tooltipSettings.add(showDbRefTooltip);
@@ -771,16 +772,16 @@ public class GPreferences extends JPanel
     visualTab.add(tooltipSettings);
     visualTab.add(jPanel2);
     JvSwingUtils.addtoLayout(visual2Tab,
-            "Default Colourscheme for alignment", colourLabel, colour);
+           MessageManager.getString("label.default_colour_scheme_for_alignment"), colourLabel, colour);
     JPanel annotationShding = new JPanel();
     annotationShding.setBorder(new TitledBorder(
-            "Annotation Shading Default"));
+            MessageManager.getString("label.annotation_shading_default")));
     annotationShding.setLayout(new GridLayout(1, 2));
     JvSwingUtils.addtoLayout(annotationShding,
-            "Default Minimum Colour for annotation shading",
+            MessageManager.getString("label.default_minimum_colour_annotation_shading"),
             mincolourLabel, minColour);
     JvSwingUtils.addtoLayout(annotationShding,
-            "Default Maximum Colour for annotation shading",
+            MessageManager.getString("label.default_maximum_colour_annotation_shading"),
             maxcolourLabel, maxColour);
     visual2Tab.add(annotationShding); // , FlowLayout.LEFT);
 
@@ -842,10 +843,10 @@ public class GPreferences extends JPanel
     dlcr.setHorizontalAlignment(DefaultListCellRenderer.CENTER);
     gapSymbolCB.setRenderer(dlcr);
 
-    tabbedPane.add(visualTab, "Visual");
-    tabbedPane.add(visual2Tab, "Colours");
-    tabbedPane.add(connectTab, "Connections");
-    tabbedPane.add(exportTab, "Output");
+    tabbedPane.add(visualTab, MessageManager.getString("label.visual"));
+    tabbedPane.add(visual2Tab, MessageManager.getString("label.colours"));
+    tabbedPane.add(connectTab, MessageManager.getString("label.connections"));
+    tabbedPane.add(exportTab, MessageManager.getString("label.output"));
     jPanel11.add(jLabel1);
     jPanel11.add(blcjv);
     jPanel11.add(clustaljv);
@@ -858,13 +859,13 @@ public class GPreferences extends JPanel
     exportTab.add(userIdWidth);
     exportTab.add(userIdWidthlabel);
     exportTab.add(modellerOutput);
-    tabbedPane.add(calcTab, "Editing");
+    tabbedPane.add(calcTab, MessageManager.getString("label.editing"));
     calcTab.add(autoCalculateConsCheck);
     calcTab.add(padGaps);
     calcTab.add(sortByTree);
 
-    tabbedPane.add(dasPanel, "DAS Settings");
-    tabbedPane.add(wsPanel, "Web Services");
+    tabbedPane.add(dasPanel, MessageManager.getString("label.das_settings"));
+    tabbedPane.add(wsPanel, MessageManager.getString("label.web_services"));
 
     exportTab.add(epsLabel);
     exportTab.add(epsRendering);
index 31657f0..dc5262b 100644 (file)
@@ -23,6 +23,7 @@ import java.awt.event.KeyListener;
 
 import jalview.gui.JvSwingUtils;
 import jalview.gui.OptsAndParamsPage;
+import jalview.util.MessageManager;
 
 import javax.swing.*;
 import javax.swing.border.TitledBorder;
@@ -94,16 +95,16 @@ public class GRestInputParamEditDialog
     optionsPanel = new JPanel(new MigLayout("", "[fill]", "[fill]"));
     JScrollPane optionView = new JScrollPane();
     optionView.setViewportView(options);
-    JvSwingUtils.mgAddtoLayout(dpane, "Input Parameter name", new JLabel(
-            "Name"), tok, "grow,spanx 3,wrap");
+    JvSwingUtils.mgAddtoLayout(dpane, MessageManager.getString("label.input_parameter_name"), new JLabel(
+            MessageManager.getString("label.name")), tok, "grow,spanx 3,wrap");
     JPanel paramsType = new JPanel(new MigLayout("", "[grow 100,fill]",
             "[grow 100,fill]"));
-    paramsType.setBorder(new TitledBorder("Select input type"));
+    paramsType.setBorder(new TitledBorder(MessageManager.getString("label.select_input_type")));
     JScrollPane jlistScroller = new JScrollPane();
     jlistScroller.setViewportView(typeList);
     paramsType.add(jlistScroller, "spanx 2,spany 2");
     dpane.add(paramsType);
-    optionsPanel.setBorder(new TitledBorder("Set options for type"));
+    optionsPanel.setBorder(new TitledBorder(MessageManager.getString("label.set_options_for_type")));
     optionsPanel.add(optionView);
     dpane.add(optionsPanel, "wrap");
     okcancel = new JPanel(new MigLayout("", "[center][center]", "[]"));
index 92747b5..f6ff418 100644 (file)
@@ -85,13 +85,13 @@ public class GRestServiceEditorPane extends JPanel
   protected void jbInit()
   {
     details = new JPanel();
-    details.setName("Details");
+    details.setName(MessageManager.getString("label.details"));
     details.setLayout(new MigLayout());
     inputs = new JPanel();
-    inputs.setName("Input/Output");
+    inputs.setName(MessageManager.getString("label.input_output"));
     inputs.setLayout(new MigLayout("", "[grow 85,fill][]", ""));
     paste = new JPanel();
-    paste.setName("Cut'n'Paste");
+    paste.setName(MessageManager.getString("label.cut_paste"));
     paste.setLayout(new MigLayout("", "[grow 100, fill]",
             "[][grow 100,fill]"));
 
@@ -107,19 +107,19 @@ public class GRestServiceEditorPane extends JPanel
     name = new JTextArea(1, 12);
 
     JvSwingUtils.mgAddtoLayout(cpanel,
-            "Short descriptive name for service", new JLabel(MessageManager.getString("label.name")),
+            MessageManager.getString("label.short_descriptive_name_for_service"), new JLabel(MessageManager.getString("label.name")),
             name, "wrap");
     action = new JComboBox();
     JvSwingUtils
             .mgAddtoLayout(
                     cpanel,
-                    "What kind of function the service performs (e.g. alignment, analysis, search, etc).",
+                    MessageManager.getString("label.function_service_performs"),
                     new JLabel(MessageManager.getString("label.service_action")), action, "wrap");
     descr = new JTextArea(4, 60);
     descrVp = new JScrollPane();
     descrVp.setViewportView(descr);
-    JvSwingUtils.mgAddtoLayout(cpanel, "Brief description of service",
-            new JLabel("Description:"), descrVp, "wrap");
+    JvSwingUtils.mgAddtoLayout(cpanel, MessageManager.getString("label.brief_description_service"),
+            new JLabel(MessageManager.getString("label.description")), descrVp, "wrap");
 
     url = new JTextArea(2, 60);
     urlVp = new JScrollPane();
@@ -127,7 +127,7 @@ public class GRestServiceEditorPane extends JPanel
     JvSwingUtils
             .mgAddtoLayout(
                     cpanel,
-                    "URL to post data to service. Include any special parameters needed here",
+                    MessageManager.getString("label.url_post_data_service"),
                     new JLabel(MessageManager.getString("label.post_url")), urlVp, "wrap");
 
     urlsuff = new JTextArea();
@@ -136,7 +136,7 @@ public class GRestServiceEditorPane extends JPanel
     JvSwingUtils
             .mgAddtoLayout(
                     cpanel,
-                    "Optional suffix added to URL when retrieving results from service",
+                    MessageManager.getString("label.optional_suffix"),
                     new JLabel(MessageManager.getString("label.url_suffix")), urlsuff, "wrap");
 
     // input options
@@ -179,8 +179,8 @@ public class GRestServiceEditorPane extends JPanel
     });
     gapChar = new JComboBox();
     JvSwingUtils.mgAddtoLayout(cpanel,
-            "Which gap character does this service prefer ?", new JLabel(
-                    "Gap Character:"), gapChar, "wrap");
+            MessageManager.getString("label.preferred_gap_character"), new JLabel(
+                    MessageManager.getString("label.gap_character") + ":"), gapChar, "wrap");
 
     cpanel.add(hSeparable);
     cpanel.add(vSeparable);
@@ -188,7 +188,7 @@ public class GRestServiceEditorPane extends JPanel
     // Input and Output lists
     // Inputparams
     JPanel iprmsList = new JPanel();
-    iprmsList.setBorder(new TitledBorder("Data input parameters"));
+    iprmsList.setBorder(new TitledBorder(MessageManager.getString("label.data_input_parameters")));
     iprmsList.setLayout(new MigLayout("", "[grow 90, fill][]"));
     iprmVp = new JScrollPane();
     iprmVp.getViewport().setView(iprms = new JList());
@@ -238,7 +238,7 @@ public class GRestServiceEditorPane extends JPanel
     JPanel iprmButs = new JPanel();
     iprmButs.setLayout(new MigLayout());
 
-    iprmsAdd = JvSwingUtils.makeButton("+", "Add input parameter",
+    iprmsAdd = JvSwingUtils.makeButton("+", MessageManager.getString("action.add_input_parameter"),
             new ActionListener()
             {
 
@@ -250,7 +250,7 @@ public class GRestServiceEditorPane extends JPanel
               }
             });
     iprmsRem = JvSwingUtils.makeButton("-",
-            "Remove selected input parameter", new ActionListener()
+            MessageManager.getString("action.remove_input_parameter"), new ActionListener()
             {
 
               @Override
@@ -268,7 +268,7 @@ public class GRestServiceEditorPane extends JPanel
 
     // Return Parameters
 
-    rdataAdd = JvSwingUtils.makeButton("+", "Add return datatype",
+    rdataAdd = JvSwingUtils.makeButton("+", MessageManager.getString("action.add_return_datatype"),
             new ActionListener()
             {
 
@@ -279,7 +279,7 @@ public class GRestServiceEditorPane extends JPanel
 
               }
             });
-    rdataRem = JvSwingUtils.makeButton("-", "Remove return datatype",
+    rdataRem = JvSwingUtils.makeButton("-", MessageManager.getString("action.remove_return_datatype"),
             new ActionListener()
             {
 
@@ -290,8 +290,8 @@ public class GRestServiceEditorPane extends JPanel
 
               }
             });
-    rdataNup = JvSwingUtils.makeButton("Move Up",
-            "Move return type up order", new ActionListener()
+    rdataNup = JvSwingUtils.makeButton(MessageManager.getString("action.move_up"),
+            MessageManager.getString("label.move_return_type_up_order"), new ActionListener()
             {
 
               @Override
@@ -301,8 +301,8 @@ public class GRestServiceEditorPane extends JPanel
 
               }
             });
-    rdataNdown = JvSwingUtils.makeButton("Move Down",
-            "Move return type down order", new ActionListener()
+    rdataNdown = JvSwingUtils.makeButton(MessageManager.getString("action.move_down"),
+            MessageManager.getString("label.move_return_type_down_order"), new ActionListener()
             {
 
               @Override
@@ -314,10 +314,10 @@ public class GRestServiceEditorPane extends JPanel
             });
 
     JPanel rparamList = new JPanel();
-    rparamList.setBorder(new TitledBorder("Data returned by service"));
+    rparamList.setBorder(new TitledBorder(MessageManager.getString("label.data_returned_by_service")));
     rparamList.setLayout(new MigLayout("", "[grow 90, fill][]"));
     rdata = new JList();
-    rdata.setToolTipText("Right click to edit currently selected parameter.");
+    rdata.setToolTipText(MessageManager.getString("label.right_click_to_edit_currently_selected_parameter"));
     rdata.addMouseListener(new MouseListener()
     {
 
@@ -380,7 +380,7 @@ public class GRestServiceEditorPane extends JPanel
     JPanel urldescPane = new JPanel();
     urldescPane.setLayout(new MigLayout("", "[grow 100, fill]",
             "[grow 100, fill]"));
-    urldescPane.setBorder(new TitledBorder("RSBS Encoded Service"));
+    urldescPane.setBorder(new TitledBorder(MessageManager.getString("label.rsbs_encoded_service")));
     urldescPane.add(urldescVp, "span");
     paste.add(urldescPane, "span");
     urldescPane
@@ -395,7 +395,7 @@ public class GRestServiceEditorPane extends JPanel
     parseRes.setColumns(60);
     parseWarnings = new JPanel(new MigLayout("", "[grow 100, fill]",
             "[grow 100, fill]"));
-    parseWarnings.setBorder(new TitledBorder("Parsing errors"));
+    parseWarnings.setBorder(new TitledBorder(MessageManager.getString("label.parsing_errors")));
     parseWarnings
             .setToolTipText("<html>"
                     + JvSwingUtils
@@ -406,7 +406,7 @@ public class GRestServiceEditorPane extends JPanel
     paste.add(parseWarnings, "span");
     setLayout(new BorderLayout());
     add(panels, BorderLayout.CENTER);
-    okButton = JvSwingUtils.makeButton("OK", "", new ActionListener()
+    okButton = JvSwingUtils.makeButton(MessageManager.getString("action.ok"), "", new ActionListener()
     {
 
       @Override
@@ -415,7 +415,7 @@ public class GRestServiceEditorPane extends JPanel
         ok_actionPerformed();
       }
     });
-    cancelButton = JvSwingUtils.makeButton("Cancel", "",
+    cancelButton = JvSwingUtils.makeButton(MessageManager.getString("action.cancel"), "",
             new ActionListener()
             {
 
index 88de6f7..3d5683c 100755 (executable)
@@ -18,6 +18,7 @@
 package jalview.jbgui;
 
 import jalview.gui.JvSwingUtils;
+import jalview.util.MessageManager;
 import jalview.util.UrlLink;
 
 import java.awt.*;
@@ -61,11 +62,11 @@ public class GSequenceLink extends Panel
     });
     jLabel1.setFont(JvSwingUtils.getLabelFont());
     jLabel1.setHorizontalAlignment(SwingConstants.TRAILING);
-    jLabel1.setText("Link Name");
+    jLabel1.setText(MessageManager.getString("label.link_name"));
     jLabel1.setBounds(new Rectangle(4, 10, 71, 24));
     jLabel2.setFont(JvSwingUtils.getLabelFont());
     jLabel2.setHorizontalAlignment(SwingConstants.TRAILING);
-    jLabel2.setText("URL");
+    jLabel2.setText(MessageManager.getString("label.url"));
     jLabel2.setBounds(new Rectangle(17, 37, 54, 27));
     jLabel3.setFont(new java.awt.Font("Verdana", Font.ITALIC, 11));
     jLabel3.setText("Use $SEQUENCE_ID$ or $SEQUENCE_ID=/<regex>/=$");
index 5f833d7..07cfc23 100755 (executable)
@@ -17,6 +17,8 @@
  */
 package jalview.jbgui;
 
+import jalview.util.MessageManager;
+
 import java.awt.*;
 import java.awt.event.*;
 import javax.swing.*;
@@ -107,13 +109,13 @@ public class GSliderPanel extends JPanel
     label.setFont(new java.awt.Font("Verdana", 0, 11));
     label.setOpaque(false);
     label.setHorizontalAlignment(SwingConstants.CENTER);
-    label.setText("set this label text");
+    label.setText(MessageManager.getString("label.set_this_label_text"));
     southPanel.setLayout(borderLayout1);
     gridLayout1.setRows(2);
     jPanel2.setLayout(flowLayout1);
     applyButton.setFont(new java.awt.Font("Verdana", 0, 11));
     applyButton.setOpaque(false);
-    applyButton.setText("Apply");
+    applyButton.setText(MessageManager.getString("action.apply"));
     applyButton.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -124,7 +126,7 @@ public class GSliderPanel extends JPanel
     undoButton.setEnabled(false);
     undoButton.setFont(new java.awt.Font("Verdana", 0, 11));
     undoButton.setOpaque(false);
-    undoButton.setText("Undo");
+    undoButton.setText(MessageManager.getString("action.undo"));
     undoButton.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -135,7 +137,7 @@ public class GSliderPanel extends JPanel
     allGroupsCheck.setEnabled(false);
     allGroupsCheck.setFont(new java.awt.Font("Verdana", 0, 11));
     allGroupsCheck.setOpaque(false);
-    allGroupsCheck.setText("Apply to all Groups");
+    allGroupsCheck.setText(MessageManager.getString("action.apply_all_groups"));
     allGroupsCheck.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
index 874b0ed..6769404 100644 (file)
@@ -17,6 +17,8 @@
  */
 package jalview.jbgui;
 
+import jalview.util.MessageManager;
+
 import javax.swing.*;
 import java.awt.event.ActionListener;
 import java.awt.event.ActionEvent;
@@ -37,10 +39,10 @@ public class GStructureViewer extends JInternalFrame
   private void jbInit() throws Exception
   {
     this.setJMenuBar(menuBar);
-    fileMenu.setText("File");
-    savemenu.setActionCommand("Save Image");
-    savemenu.setText("Save As");
-    pdbFile.setText("PDB File");
+    fileMenu.setText(MessageManager.getString("action.file"));
+    savemenu.setActionCommand(MessageManager.getString("action.save_image"));
+    savemenu.setText(MessageManager.getString("action.save_as"));
+    pdbFile.setText(MessageManager.getString("label.pdb_file"));
     pdbFile.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent actionEvent)
@@ -64,7 +66,7 @@ public class GStructureViewer extends JInternalFrame
         eps_actionPerformed(actionEvent);
       }
     });
-    viewMapping.setText("View Mapping");
+    viewMapping.setText(MessageManager.getString("label.view_mapping"));
     viewMapping.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent actionEvent)
@@ -72,10 +74,10 @@ public class GStructureViewer extends JInternalFrame
         viewMapping_actionPerformed(actionEvent);
       }
     });
-    viewMenu.setText("View");
-    chainMenu.setText("Show Chain");
-    colourMenu.setText("Colours");
-    backGround.setText("Background Colour...");
+    viewMenu.setText(MessageManager.getString("action.view"));
+    chainMenu.setText(MessageManager.getString("action.show_chain"));
+    colourMenu.setText(MessageManager.getString("label.colours"));
+    backGround.setText(MessageManager.getString("label.background_colour") + "...");
     backGround.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent actionEvent)
@@ -84,7 +86,7 @@ public class GStructureViewer extends JInternalFrame
       }
     });
     seqColour.setSelected(false);
-    seqColour.setText("By Sequence");
+    seqColour.setText(MessageManager.getString("action.by_sequence"));
     seqColour.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent actionEvent)
@@ -92,7 +94,7 @@ public class GStructureViewer extends JInternalFrame
         seqColour_actionPerformed(actionEvent);
       }
     });
-    chainColour.setText("By Chain");
+    chainColour.setText(MessageManager.getString("action.by_chain"));
     chainColour.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent actionEvent)
@@ -100,7 +102,7 @@ public class GStructureViewer extends JInternalFrame
         chainColour_actionPerformed(actionEvent);
       }
     });
-    chargeColour.setText("Charge & Cysteine");
+    chargeColour.setText(MessageManager.getString("label.charge_cysteine"));
     chargeColour.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent actionEvent)
@@ -108,7 +110,7 @@ public class GStructureViewer extends JInternalFrame
         chargeColour_actionPerformed(actionEvent);
       }
     });
-    zappoColour.setText("Zappo");
+    zappoColour.setText(MessageManager.getString("label.zappo"));
     zappoColour.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent actionEvent)
@@ -116,7 +118,7 @@ public class GStructureViewer extends JInternalFrame
         zappoColour_actionPerformed(actionEvent);
       }
     });
-    taylorColour.setText("Taylor");
+    taylorColour.setText(MessageManager.getString("label.taylor"));
     taylorColour.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent actionEvent)
@@ -124,7 +126,7 @@ public class GStructureViewer extends JInternalFrame
         taylorColour_actionPerformed(actionEvent);
       }
     });
-    hydroColour.setText("Hydro");
+    hydroColour.setText(MessageManager.getString("label.hydrophobicity"));
     hydroColour.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent actionEvent)
@@ -132,7 +134,7 @@ public class GStructureViewer extends JInternalFrame
         hydroColour_actionPerformed(actionEvent);
       }
     });
-    strandColour.setText("Strand");
+    strandColour.setText(MessageManager.getString("label.strand_propensity"));
     strandColour.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent actionEvent)
@@ -140,7 +142,7 @@ public class GStructureViewer extends JInternalFrame
         strandColour_actionPerformed(actionEvent);
       }
     });
-    helixColour.setText("Helix Propensity");
+    helixColour.setText(MessageManager.getString("label.helix_propensity"));
     helixColour.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent actionEvent)
@@ -148,7 +150,7 @@ public class GStructureViewer extends JInternalFrame
         helixColour_actionPerformed(actionEvent);
       }
     });
-    turnColour.setText("Turn Propensity");
+    turnColour.setText(MessageManager.getString("label.turn_propensity"));
     turnColour.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent actionEvent)
@@ -156,7 +158,7 @@ public class GStructureViewer extends JInternalFrame
         turnColour_actionPerformed(actionEvent);
       }
     });
-    buriedColour.setText("Buried Index");
+    buriedColour.setText(MessageManager.getString("label.buried_index"));
     buriedColour.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent actionEvent)
@@ -164,7 +166,7 @@ public class GStructureViewer extends JInternalFrame
         buriedColour_actionPerformed(actionEvent);
       }
     });
-    purinePyrimidineColour.setText("Purine/Pyrimidine");
+    purinePyrimidineColour.setText(MessageManager.getString("label.purine_pyrimidine"));
     purinePyrimidineColour.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent actionEvent)
@@ -173,7 +175,7 @@ public class GStructureViewer extends JInternalFrame
       }
     });
 
-    userColour.setText("User Defined ...");
+    userColour.setText(MessageManager.getString("action.user_defined"));
     userColour.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent actionEvent)
@@ -182,8 +184,8 @@ public class GStructureViewer extends JInternalFrame
       }
     });
     jmolColour.setSelected(false);
-    jmolColour.setText("Colour with Jmol");
-    jmolColour.setToolTipText("Let Jmol manage structure colours.");
+    jmolColour.setText(MessageManager.getString("label.colour_with_jmol"));
+    jmolColour.setToolTipText(MessageManager.getString("label.let_jmol_manage_structure_colours"));
     jmolColour.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent actionEvent)
@@ -191,8 +193,8 @@ public class GStructureViewer extends JInternalFrame
         jmolColour_actionPerformed(actionEvent);
       }
     });
-    helpMenu.setText("Help");
-    jmolHelp.setText("Jmol Help");
+    helpMenu.setText(MessageManager.getString("action.help"));
+    jmolHelp.setText(MessageManager.getString("label.jmol_help"));
     jmolHelp.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent actionEvent)
@@ -200,7 +202,7 @@ public class GStructureViewer extends JInternalFrame
         jmolHelp_actionPerformed(actionEvent);
       }
     });
-    alignStructs.setText("Align structures");
+    alignStructs.setText(MessageManager.getString("label.align_structures"));
     alignStructs.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent actionEvent)
@@ -208,7 +210,7 @@ public class GStructureViewer extends JInternalFrame
         alignStructs_actionPerformed(actionEvent);
       }
     });
-    jmolActionMenu.setText("Jmol");
+    jmolActionMenu.setText(MessageManager.getString("label.jmol"));
     menuBar.add(fileMenu);
     menuBar.add(viewMenu);
     menuBar.add(colourMenu);
index 4710cac..2b27946 100755 (executable)
@@ -17,6 +17,8 @@
  */
 package jalview.jbgui;
 
+import jalview.util.MessageManager;
+
 import java.awt.*;
 import java.awt.event.*;
 import javax.swing.*;
@@ -80,8 +82,8 @@ public class GTreePanel extends JInternalFrame
     this.setBackground(Color.white);
     this.setFont(new java.awt.Font("Verdana", 0, 12));
     scrollPane.setOpaque(false);
-    fileMenu.setText("File");
-    saveAsNewick.setText("Newick Format");
+    fileMenu.setText(MessageManager.getString("action.file"));
+    saveAsNewick.setText(MessageManager.getString("label.newick_format"));
     saveAsNewick.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -89,7 +91,7 @@ public class GTreePanel extends JInternalFrame
         saveAsNewick_actionPerformed(e);
       }
     });
-    printMenu.setText("Print");
+    printMenu.setText(MessageManager.getString("action.print"));
     printMenu.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -97,7 +99,7 @@ public class GTreePanel extends JInternalFrame
         printMenu_actionPerformed(e);
       }
     });
-    viewMenu.setText("View");
+    viewMenu.setText(MessageManager.getString("action.view"));
     viewMenu.addMenuListener(new MenuListener()
     {
       public void menuSelected(MenuEvent e)
@@ -113,7 +115,7 @@ public class GTreePanel extends JInternalFrame
       {
       }
     });
-    sortAssocViews.setText("Sort Alignment By Tree");
+    sortAssocViews.setText(MessageManager.getString("label.sort_alignment_by_tree"));
     sortAssocViews.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -121,7 +123,7 @@ public class GTreePanel extends JInternalFrame
         sortByTree_actionPerformed(e);
       }
     });
-    font.setText("Font...");
+    font.setText(MessageManager.getString("action.font"));
     font.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -129,7 +131,7 @@ public class GTreePanel extends JInternalFrame
         font_actionPerformed(e);
       }
     });
-    bootstrapMenu.setText("Show Bootstrap Values");
+    bootstrapMenu.setText(MessageManager.getString("label.show_bootstrap_values"));
     bootstrapMenu.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -137,7 +139,7 @@ public class GTreePanel extends JInternalFrame
         bootstrapMenu_actionPerformed(e);
       }
     });
-    distanceMenu.setText("Show Distances");
+    distanceMenu.setText(MessageManager.getString("label.show_distances"));
     distanceMenu.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -146,7 +148,7 @@ public class GTreePanel extends JInternalFrame
       }
     });
     fitToWindow.setSelected(true);
-    fitToWindow.setText("Fit To Window");
+    fitToWindow.setText(MessageManager.getString("label.fit_to_window"));
     fitToWindow.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -170,10 +172,10 @@ public class GTreePanel extends JInternalFrame
         pngTree_actionPerformed(e);
       }
     });
-    saveAsMenu.setText("Save as");
+    saveAsMenu.setText(MessageManager.getString("action.save_as"));
     placeholdersMenu
-            .setToolTipText("Marks leaves of tree not associated with a sequence");
-    placeholdersMenu.setText("Mark Unlinked Leaves");
+            .setToolTipText(MessageManager.getString("label.marks_leaves_tree_not_associated_with_sequence"));
+    placeholdersMenu.setText(MessageManager.getString("label.mark_unlinked_leaves"));
     placeholdersMenu.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -181,7 +183,7 @@ public class GTreePanel extends JInternalFrame
         placeholdersMenu_actionPerformed(e);
       }
     });
-    textbox.setText("Output to Textbox...");
+    textbox.setText(MessageManager.getString("label.out_to_textbox") + "...");
     textbox.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -189,7 +191,7 @@ public class GTreePanel extends JInternalFrame
         textbox_actionPerformed(e);
       }
     });
-    originalSeqData.setText("Input Data...");
+    originalSeqData.setText(MessageManager.getString("label.input_data"));
     originalSeqData.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -197,7 +199,7 @@ public class GTreePanel extends JInternalFrame
         originalSeqData_actionPerformed(e);
       }
     });
-    associateLeavesMenu.setText("Associate Leaves With");
+    associateLeavesMenu.setText(MessageManager.getString("label.associate_leaves_with"));
     this.getContentPane().add(scrollPane, BorderLayout.CENTER);
     jMenuBar1.add(fileMenu);
     jMenuBar1.add(viewMenu);
index 288b93d..01fb328 100755 (executable)
@@ -18,6 +18,7 @@
 package jalview.jbgui;
 
 import jalview.gui.JvSwingUtils;
+import jalview.util.MessageManager;
 
 import java.awt.*;
 import java.awt.event.*;
@@ -113,7 +114,7 @@ public class GUserDefinedColours extends JPanel
     gridLayout.setColumns(4);
     gridLayout.setRows(5);
     okButton.setFont(new java.awt.Font("Verdana", 0, 11));
-    okButton.setText("OK");
+    okButton.setText(MessageManager.getString("action.ok"));
     okButton.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -122,7 +123,7 @@ public class GUserDefinedColours extends JPanel
       }
     });
     applyButton.setFont(new java.awt.Font("Verdana", 0, 11));
-    applyButton.setText("Apply");
+    applyButton.setText(MessageManager.getString("action.apply"));
     applyButton.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -131,7 +132,7 @@ public class GUserDefinedColours extends JPanel
       }
     });
     loadbutton.setFont(new java.awt.Font("Verdana", 0, 11));
-    loadbutton.setText("Load scheme");
+    loadbutton.setText(MessageManager.getString("action.load_scheme"));
     loadbutton.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -140,7 +141,7 @@ public class GUserDefinedColours extends JPanel
       }
     });
     savebutton.setFont(new java.awt.Font("Verdana", 0, 11));
-    savebutton.setText("Save scheme");
+    savebutton.setText(MessageManager.getString("action.save_scheme"));
     savebutton.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -149,7 +150,7 @@ public class GUserDefinedColours extends JPanel
       }
     });
     cancelButton.setFont(JvSwingUtils.getLabelFont());
-    cancelButton.setText("Cancel");
+    cancelButton.setText(MessageManager.getString("action.cancel"));
     cancelButton.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -162,7 +163,7 @@ public class GUserDefinedColours extends JPanel
     lowerPanel.setLayout(borderLayout3);
     colorChooser.setOpaque(false);
     jLabel1.setFont(JvSwingUtils.getLabelFont());
-    jLabel1.setText("Name");
+    jLabel1.setText(MessageManager.getString("label.name"));
     namePanel.setMinimumSize(new Dimension(300, 31));
     namePanel.setOpaque(false);
     namePanel.setPreferredSize(new Dimension(240, 25));
@@ -179,9 +180,8 @@ public class GUserDefinedColours extends JPanel
     label.setFont(new java.awt.Font("Verdana", Font.ITALIC, 10));
     label.setOpaque(false);
     label.setPreferredSize(new Dimension(260, 34));
-    label.setText("<html>Save your colour scheme with a unique name and it will be added "
-            + "to the Colour menu.</html>");
-    caseSensitive.setText("Case Sensitive");
+    label.setText(MessageManager.formatMessage("label.html_content", new String[]{MessageManager.getString("label.save_colour_scheme_with_unique_name_added_to_colour_menu")}));
+    caseSensitive.setText(MessageManager.getString("label.case_sensitive"));
     caseSensitive.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -189,7 +189,7 @@ public class GUserDefinedColours extends JPanel
         caseSensitive_actionPerformed(e);
       }
     });
-    lcaseColour.setText("Lower Case Colour");
+    lcaseColour.setText(MessageManager.getString("label.lower_case_colour"));
     lcaseColour.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
index d057429..3672a8c 100755 (executable)
@@ -93,7 +93,7 @@ public class GWebserviceInfo extends JPanel
     jScrollPane1.setBorder(null);
     jScrollPane1.setPreferredSize(new Dimension(400, 70));
     cancel.setFont(new java.awt.Font("Verdana", 0, 11));
-    cancel.setText("Cancel");
+    cancel.setText(MessageManager.getString("action.cancel"));
     cancel.addActionListener(new java.awt.event.ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -103,8 +103,8 @@ public class GWebserviceInfo extends JPanel
     });
     buttonPanel.setLayout(gridBagLayout1);
     buttonPanel.setOpaque(false);
-    showResultsNewFrame.setText("New Window");
-    mergeResults.setText("Merge Results");
+    showResultsNewFrame.setText(MessageManager.getString("label.new_window"));
+    mergeResults.setText(MessageManager.getString("action.merge_results"));
     this.setBackground(Color.white);
     this.add(jPanel1, BorderLayout.NORTH);
     jPanel1.add(jScrollPane1, BorderLayout.CENTER);
index b16aa67..18df903 100644 (file)
@@ -17,6 +17,8 @@
  */
 package jalview.jbgui;
 
+import jalview.util.MessageManager;
+
 import java.awt.BorderLayout;
 import java.awt.Dimension;
 import java.awt.FlowLayout;
@@ -50,7 +52,7 @@ public class GWsPreferences extends JPanel
   protected JList sbrsList = new JList();
 
   protected TitledBorder sbrsListTitleBorder = new TitledBorder(
-          "Simple Bioinformatics Rest Services");
+          MessageManager.getString("label.simple_bioinformatics_rest_services"));
 
   protected JButton newSbrsUrl = new JButton();
 
@@ -62,7 +64,7 @@ public class GWsPreferences extends JPanel
   protected JTable wsList = new JTable();
 
   protected TitledBorder wsListTitleBorder = new TitledBorder(
-          "Web Service Discovery URLS");
+          MessageManager.getString("label.web_service_discovery_urls"));
 
   protected JButton newWsUrl = new JButton();
 
@@ -137,7 +139,7 @@ public class GWsPreferences extends JPanel
   {
 
     refreshWs.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));
-    refreshWs.setText("Refresh Services");
+    refreshWs.setText(MessageManager.getString("action.refresh_services"));
     refreshWs.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -146,7 +148,7 @@ public class GWsPreferences extends JPanel
       }
     });
     resetWs.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));
-    resetWs.setText("Reset Services");
+    resetWs.setText(MessageManager.getString("action.reset_services"));
 
     resetWs.addActionListener(new ActionListener()
     {
@@ -156,9 +158,9 @@ public class GWsPreferences extends JPanel
       }
     });
     indexByHost.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));
-    indexByHost.setText("Index by host");
+    indexByHost.setText(MessageManager.getString("label.index_by_host"));
     indexByHost
-            .setToolTipText("Index web services in menu by the host site.");
+            .setToolTipText(MessageManager.getString("label.index_web_services_menu_by_host_site"));
     indexByHost.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -167,7 +169,7 @@ public class GWsPreferences extends JPanel
       }
     });
     indexByType.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));
-    indexByType.setText("Index by type");
+    indexByType.setText(MessageManager.getString("label.index_by_type"));
     indexByType.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -177,7 +179,7 @@ public class GWsPreferences extends JPanel
     });
     enableEnfinServices
             .setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));
-    enableEnfinServices.setText("Enable Enfin Services");
+    enableEnfinServices.setText(MessageManager.getString("label.enable_enfin_services"));
     enableEnfinServices.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -187,7 +189,7 @@ public class GWsPreferences extends JPanel
     });
     enableJws2Services
             .setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));
-    enableJws2Services.setText("Enable JABAWS Services");
+    enableJws2Services.setText(MessageManager.getString("label.enable_jabaws_services"));
     enableJws2Services.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -196,9 +198,9 @@ public class GWsPreferences extends JPanel
       }
     });
     displayWsWarning.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));
-    displayWsWarning.setText("Display warnings");
+    displayWsWarning.setText(MessageManager.getString("label.display_warnings"));
     displayWsWarning
-            .setToolTipText("<html>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");
+            .setToolTipText("<html>" + MessageManager.getString("label.option_want_informed_web_service_URL_cannot_be_accessed_jalview_when_starts_up"));
     displayWsWarning.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -207,7 +209,7 @@ public class GWsPreferences extends JPanel
       }
     });
     newWsUrl.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));
-    newWsUrl.setText("New Service URL");
+    newWsUrl.setText(MessageManager.getString("label.new_service_url"));
     newWsUrl.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -216,7 +218,7 @@ public class GWsPreferences extends JPanel
       }
     });
     editWsUrl.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));
-    editWsUrl.setText("Edit Service URL");
+    editWsUrl.setText(MessageManager.getString("label.edit_service_url"));
     editWsUrl.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -226,7 +228,7 @@ public class GWsPreferences extends JPanel
     });
 
     deleteWsUrl.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));
-    deleteWsUrl.setText("Delete Service URL");
+    deleteWsUrl.setText(MessageManager.getString("label.delete_service_url"));
     deleteWsUrl.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -235,8 +237,8 @@ public class GWsPreferences extends JPanel
       }
     });
     moveWsUrlUp.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));
-    moveWsUrlUp.setText("Up");
-    moveWsUrlUp.setToolTipText("Move URL up");
+    moveWsUrlUp.setText(MessageManager.getString("action.move_up"));
+    moveWsUrlUp.setToolTipText(MessageManager.getString("label.move_url_up"));
     moveWsUrlUp.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -245,8 +247,8 @@ public class GWsPreferences extends JPanel
       }
     });
     moveWsUrlDown.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));
-    moveWsUrlDown.setText("Down");
-    moveWsUrlDown.setToolTipText("Move URL Down");
+    moveWsUrlDown.setText(MessageManager.getString("action.move_down"));
+    moveWsUrlDown.setToolTipText(MessageManager.getString("label.move_url_down"));
     moveWsUrlDown.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -255,7 +257,7 @@ public class GWsPreferences extends JPanel
       }
     });
     newSbrsUrl.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));
-    newSbrsUrl.setText("Add a SBRS definition");
+    newSbrsUrl.setText(MessageManager.getString("label.add_sbrs_definition"));
     newSbrsUrl.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -264,7 +266,7 @@ public class GWsPreferences extends JPanel
       }
     });
     editSbrsUrl.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));
-    editSbrsUrl.setText("Edit SBRS definition");
+    editSbrsUrl.setText(MessageManager.getString("label.edit_sbrs_definition"));
     editSbrsUrl.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -274,7 +276,7 @@ public class GWsPreferences extends JPanel
     });
 
     deleteSbrsUrl.setFont(new java.awt.Font("Verdana", Font.PLAIN, 10));
-    deleteSbrsUrl.setText("Delete SBRS definition");
+    deleteSbrsUrl.setText(MessageManager.getString("label.delete_sbrs_definition"));
     deleteSbrsUrl.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
index 1c6b92b..842d424 100755 (executable)
@@ -55,7 +55,7 @@ public class ImageMaker
 
       chooser.setFileView(new jalview.io.JalviewFileView());
       chooser.setDialogTitle(title);
-      chooser.setToolTipText("Save");
+      chooser.setToolTipText(MessageManager.getString("action.save"));
 
       int value = chooser.showSaveDialog(parent);
 
index 17c1bc9..1cbc821 100644 (file)
@@ -30,6 +30,7 @@ import jalview.gui.CutAndPasteTransfer;
 import jalview.gui.Desktop;
 import jalview.gui.IProgressIndicator;
 import jalview.gui.OOMWarning;
+import jalview.util.MessageManager;
 import jalview.ws.dbsources.das.api.jalviewSourceI;
 import jalview.ws.seqfetcher.DbSourceProxy;
 
@@ -449,17 +450,15 @@ public class DBRefFetcher implements Runnable
     } // all databases have been queries.
     if (sbuffer.length() > 0)
     {
-      output.setText("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"
+      output.setText(MessageManager.getString("label.your_sequences_have_been_verified")
               + sbuffer.toString());
-      Desktop.addInternalFrame(output, "Sequence names updated ", 600, 300);
+      Desktop.addInternalFrame(output, MessageManager.getString("label.sequence_names_updated"), 600, 300);
       // The above is the dataset, we must now find out the index
       // of the viewed sequence
 
     }
 
-    af.setProgressBar("DBRef search completed", startTime);
+    af.setProgressBar(MessageManager.getString("label.dbref_search_completed"), startTime);
     // promptBeforeBlast();
 
     running = false;
index 4166d3e..5c076e4 100644 (file)
@@ -27,6 +27,7 @@ import jalview.gui.AlignFrame;
 import jalview.gui.Desktop;
 import jalview.gui.WebserviceInfo;
 import jalview.gui.WsJobParameters;
+import jalview.util.MessageManager;
 import jalview.ws.jws2.dm.JabaWsParamSet;
 import jalview.ws.jws2.jabaws2.Jws2Instance;
 import jalview.ws.params.WsParamSetI;
@@ -95,7 +96,7 @@ public abstract class Jws2Client extends jalview.ws.WSClient
               : new WsJobParameters(sh, preset);
       if (adjustingExisting)
       {
-        jobParams.setName("Adjusting parameters for existing Calculation");
+        jobParams.setName(MessageManager.getString("label.adjusting_parameters_for_calculation"));
       }
       if (!jobParams.showRunDialog())
       {
index 896292a..8893825 100644 (file)
@@ -27,6 +27,7 @@ import jalview.datamodel.*;
 import jalview.gui.*;
 import compbio.data.msa.MsaWS;
 import compbio.metadata.Argument;
+import jalview.util.MessageManager;
 import jalview.ws.jws2.jabaws2.Jws2Instance;
 import jalview.ws.params.WsParamSetI;
 
@@ -211,15 +212,15 @@ public class MsaWSClient extends Jws2Client
       if (submitGaps == true)
       {
         action = "Realign ";
-        msawsmenu = new JMenu("Realign with " + svcname);
+        msawsmenu = new JMenu(MessageManager.formatMessage("label.realign_with_params", new String[]{svcname}));
         msawsmenu
-                .setToolTipText("Align sequences to an existing alignment");
+                .setToolTipText(MessageManager.getString("label.align_sequences_to_existing_alignment"));
         rmsawsmenu.add(msawsmenu);
       }
       final boolean withGaps = submitGaps;
 
-      JMenuItem method = new JMenuItem(calcName + "with Defaults");
-      method.setToolTipText(action + "with default settings");
+      JMenuItem method = new JMenuItem(MessageManager.formatMessage("label.calcname_with_default_settings", new String[]{calcName}));
+      method.setToolTipText(MessageManager.formatMessage("label.action_with_default_settings", new String[]{action}));
 
       method.addActionListener(new ActionListener()
       {
@@ -237,8 +238,8 @@ public class MsaWSClient extends Jws2Client
       {
         // only add these menu options if the service has user-modifiable
         // arguments
-        method = new JMenuItem("Edit settings and run ...");
-        method.setToolTipText("View and change the parameters before alignment.");
+        method = new JMenuItem(MessageManager.getString("label.edit_settings_and_run"));
+        method.setToolTipText(MessageManager.getString("label.view_and_change_parameters_before_alignment"));
 
         method.addActionListener(new ActionListener()
         {
@@ -255,7 +256,7 @@ public class MsaWSClient extends Jws2Client
         List<WsParamSetI> presets = service.getParamStore().getPresets();
         if (presets != null && presets.size() > 0)
         {
-          JMenu presetlist = new JMenu("Run " + calcName + "with preset");
+          JMenu presetlist = new JMenu(MessageManager.formatMessage("label.run_with_preset_params", new String[]{calcName}));
 
           for (final WsParamSetI preset : presets)
           {
index 59cc962..e251793 100644 (file)
@@ -22,6 +22,7 @@ import jalview.bin.Cache;
 import jalview.gui.AlignFrame;
 import jalview.gui.Desktop;
 import jalview.gui.JvSwingUtils;
+import jalview.util.MessageManager;
 import jalview.ws.jws2.dm.AAConSettings;
 import jalview.ws.jws2.jabaws2.Jws2Instance;
 import jalview.ws.params.WsParamSetI;
@@ -171,7 +172,7 @@ public class SequenceAnnotationWSClient extends Jws2Client
     String calcName = service.serviceType.substring(0,
             service.serviceType.length() - 2);
 
-    JMenuItem annotservice = new JMenuItem(calcName + " Defaults");
+    JMenuItem annotservice = new JMenuItem(MessageManager.formatMessage("label.calcname_with_default_settings", new String[]{calcName}));
     annotservice.addActionListener(new ActionListener()
     {
 
@@ -186,9 +187,9 @@ public class SequenceAnnotationWSClient extends Jws2Client
     {
       // only add these menu options if the service has user-modifiable
       // arguments
-      annotservice = new JMenuItem("Edit settings and run ...");
+      annotservice = new JMenuItem(MessageManager.getString("label.edit_settings_and_run"));
       annotservice
-              .setToolTipText("View and change parameters before running calculation");
+              .setToolTipText(MessageManager.getString("label.view_and_change_parameters_before_running_calculation"));
 
       annotservice.addActionListener(new ActionListener()
       {
@@ -228,7 +229,7 @@ public class SequenceAnnotationWSClient extends Jws2Client
     }
     else
     {
-      annotservice = new JMenuItem("View documentation");
+      annotservice = new JMenuItem(MessageManager.getString("label.view_documentation"));
       if (service.docUrl != null)
       {
         annotservice.addActionListener(new ActionListener()