Merge branch 'Release_2_8_2_Branch' into
authorgmungoc <g.m.carstairs@dundee.ac.uk>
Wed, 8 Oct 2014 11:15:45 +0000 (12:15 +0100)
committergmungoc <g.m.carstairs@dundee.ac.uk>
Wed, 8 Oct 2014 11:15:45 +0000 (12:15 +0100)
features/JAL-1264_showHideAnnotations

Conflicts:
resources/lang/Messages.properties
src/jalview/datamodel/Alignment.java

1  2 
resources/lang/Messages.properties
src/jalview/datamodel/Alignment.java
src/jalview/gui/AlignFrame.java
src/jalview/gui/AnnotationColourChooser.java
src/jalview/gui/Desktop.java
src/jalview/gui/FeatureSettings.java
src/jalview/gui/IdPanel.java
src/jalview/jbgui/GAlignFrame.java
test/jalview/ws/jabaws/MinJabawsClientTests.java

@@@ -54,11 -54,11 +54,12 @@@ action.right_justify_alignment = Right 
  action.boxes = Boxes\r
  action.text = Text\r
  action.by_pairwise_id = by Pairwise Identity\r
 +action.by_length = by Length\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.remove_redundancy = Remove Redundancy...\r
  action.pairwise_alignment = Pairwise Alignments...\r
  action.by_rna_helixes = by RNA Helices\r
  action.user_defined = User Defined...\r
@@@ -128,11 -128,10 +129,11 @@@ action.deselect_all = Deselect al
  action.invert_selection = Invert selection\r
  action.using_jmol = Using Jmol\r
  action.link = Link\r
 -action.group_link = Group 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
 +action.edit = Edit\r
  action.view_flanking_regions = Show flanking regions\r
  label.view_flanking_regions = Show sequence data either side of the subsequences involved in this alignment\r
  label.str = Str:\r
@@@ -199,9 -198,6 +200,9 @@@ label.tcoffee_scores = T-Coffee Score
  label.average_distance_bloslum62 = Average Distance Using BLOSUM62\r
  label.neighbour_blosum62 = Neighbour Joining Using BLOSUM62\r
  label.show_annotations = Show annotations\r
 +label.hide_annotations = Hide annotations\r
 +label.show_all_annotations = Show all annotations\r
 +label.hide_all_annotations = Hide all annotations\r
  label.colour_text = Colour Text\r
  label.show_non_conversed = Show nonconserved\r
  label.overview_window = Overview Window\r
@@@ -226,7 -222,6 +227,7 @@@ label.all_columns = All Column
  label.all_sequences = All Sequences\r
  label.selected_columns = Selected Columns \r
  label.selected_sequences = Selected Sequences\r
 +label.except_selected_sequences = All except selected sequences\r
  label.all_but_selected_region = All but Selected Region (Shift+Ctrl+H)\r
  label.selected_region = Selected Region\r
  label.all_sequences_columns = All Sequences and Columns\r
@@@ -313,7 -308,7 +314,7 @@@ label.to_file = to Fil
  label.to_textbox = to Textbox\r
  label.jalview = Jalview\r
  label.csv_spreadsheet = CSV (Spreadsheet)\r
 -label.status = Status\r
 +label.status =  [Status]\r
  label.channels = Channels\r
  label.channel_title_item_count = {0} ({1})\r
  label.blog_item_published_on_date = {0} {1} \r
@@@ -370,7 -365,7 +371,7 @@@ label.enter_label = Enter labe
  label.enter_label_for_the_structure = Enter a label for the structure?\r
  label.pdb_entry_is_already_displayed = {0} is already displayed.\nDo you want to re-use this viewer ?\r
  label.map_sequences_to_visible_window = Map Sequences to Visible Window: {0}\r
 -label.add_pdbentry_to_view = Do you want to add {0} to the view called\n{1}\n\r
 +label.add_pdbentry_to_view = Do you want to add {0} to the view called\n'{1}'\n\r
  label.align_to_existing_structure_view = Align to existing structure view\r
  label.pdb_entries_couldnt_be_retrieved = The following pdb entries could not be retrieved from the PDB\:\n{0}\nPlease try downloading them manually.\r
  label.couldnt_load_file = Couldn't load file\r
@@@ -383,7 -378,7 +384,7 @@@ label.you_can_only_edit_or_remove_local
  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.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
  label.url_not_found = URL not found\r
@@@ -460,8 -455,8 +461,8 @@@ label.settings_for_type = Settings for 
  label.view_full_application = View in Full Application\r
  label.load_associated_tree = Load Associated Tree ...\r
  label.load_features_annotations = Load Features/Annotations ...\r
 -label.export_features = Export Features\r
 -label.export_annotations = Export Annotations\r
 +label.export_features = Export Features ...\r
 +label.export_annotations = Export Annotations ...\r
  label.jalview_copy = Copy (Jalview Only)\r
  label.jalview_cut = Cut (Jalview Only)\r
  label.to_upper_case = To Upper Case\r
@@@ -469,6 -464,7 +470,6 @@@ label.to_lower_case = To Lower Cas
  label.toggle_case = Toggle Case\r
  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
@@@ -499,7 -495,7 +500,7 @@@ label.select_colour_maximum_value = Sel
  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.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
@@@ -535,6 -531,7 +536,6 @@@ label.collect_garbage = Collect Garbag
  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.take_snapshot = Take snapshot\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
@@@ -731,23 -728,399 +732,23 @@@ label.invalid_font = Invalid Fon
  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.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.wswublast_client_credits = To display sequence features an exact Uniprot id with 100% sequence identity match must be entered.\nIn order to display these features, try changing the names of your sequences to the ids suggested below.\n\nRunning WSWUBlast at EBI.\nPlease quote Pillai S., Silventoinen V., Kallio K., Senger M., Sobhany S., Tate J., Velankar S., Golovin A., Henrick K., Rice P., Stoehr P., Lopez R.\nSOAP-based services provided by the European Bioinformatics Institute.\nNucleic Acids Res. 33(1):W25-W28 (2005));\r
  label.blasting_for_unidentified_sequence = BLASTing for unidentified sequences
  label.select_columns_containing = Select columns containing\r
  label.select_columns_not_containing = Select columns that do not contain\r
  option.trim_retrieved_seqs = Trim retrieved sequences\r
  label.trim_retrieved_sequences = When the reference sequence is longer than the sequence that you are working with, only keep the relevant subsequences.\r
 -label.use_sequence_id_1 = Use $SEQUENCE_ID$ or $SEQUENCE_ID=/<regex>/=$\r
 -label.use_sequence_id_2 = \nto embed sequence id in URL\r
 -label.ws_parameters_for = Parameters for {0}\r
 -label.switch_server = Switch server\r
 -label.open_jabaws_web_page = Opens the JABAWS server's homepage in web browser\r
 -label.choose_jabaws_server = Choose a server for running this service\r
 -label.services_at = Services at {0}\r
 -label.rest_client_submit = {0} using {1}\r
 -label.fetch_retrieve_from =Retrieve from {0}</html>\r
 -label.fetch_retrieve_from_all_sources = Retrieve from all {0} sources in {1}<br>First is :{2}<html> \r
 -label.feature_settings_click_drag = <html>Click/drag feature types up or down to change render order.<br/>Double click to select columns containing feature in alignment/current selection<br/>Pressing Alt will select columns outside features rather than inside<br/>Pressing Shift to modify current selection (rather than clear current selection)<br/>Press CTRL or Command/Meta to toggle columns in/outside features<br/></html>\r
 -label.opt_and_params_further_details = see further details by right-clicking\r
 -label.opt_and_params_show_brief_desc_image_link = <html>Click to show brief description<br><img src="{0}"/> Right click for further information.</html> \r
 -label.opt_and_params_show_brief_desc = <html>Click to show brief description<br></html>\r
 -label.adjusts_width_generated_eps_png = <html>Adjusts the width of the generated EPS or PNG file to ensure even the longest sequence ID or annotation label is displayed</html>\r
 -label.manually_specify_width_left_column = <html>Manually specify the width of the left hand column where sequence IDs and annotation labels will be rendered in exported alignment figures. This setting will be ignored if 'Automatically set ID width' is set</html>\r
 -label.job_created_when_checked = <html>When checked, a job is created for every sequence in the current selection.</html>\r
 -label.when_checked_job_visible_region_and_results = <html>When checked, a single job is created for the visible region and results mapped back onto their location in the alignment. Otherwise, a job would be created for every contiguous region visible in the alignment or current selection (e.g. a multiple alignment).</html>\r
 -label.flat_file_representation = <html>Flat file representation of this rest service using the Really Simple Bioinformatics Service formalism</html>\r
 -label.result_of_parsing_rsbs = <html>Results of parsing the RSBS representation</html>\r
 -label.user_preset = User Preset\r
 -label.service_preset = Service Preset\r
 -label.run_with_preset = Run {0} with preset\r
 -label.view_service_doc_url = <html>View <a href="{0}">{1}</a></html>\r
 -label.submit_sequence = <html>Submit {0} {1} {2} {3} to<br/>{4}</html>\r
 -action.by_title_param = by {0}\r
 -label.alignment = Alignment\r
 -label.secondary_structure_prediction = Secondary Structure Prediction\r
 -label.sequence_database_search = Sequence Database Search\r
 -label.analysis = Analysis\r
 -label.protein_disorder = Protein Disorder \r
 -label.source_from_db_source = Sources from {0}\r
 -label.from_msname = from {0}\r
 -label.superpose_with = Superpose with ...\r
 -action.do = Do\r
 -label.scale_label_to_column = Scale Label to Column\r
 -label.add_new_row = Add New Row\r
 -label.edit_label_description = Edit Label/Description\r
 -label.hide_row = Hide This Row\r
 -label.delete_row = Delete This Row\r
 -label.show_all_hidden_rows = Show All Hidden Rows\r
 -label.export_annotation = Export Annotation\r
 -label.copy_consensus_sequence = Copy Consensus Sequence\r
 -label.helix = Helix\r
 -label.sheet = Sheet\r
 -label.rna_helix = RNA Helix\r
 -label.remove_annotation = Remove Annotation\r
 -label.colour_by = Colour by...\r
 -label.muscle_multiple_protein_sequence_alignment = Muscle Multiple Protein Sequence Alignment\r
 -label.mafft_multiple_sequence_alignment = MAFFT Multiple Sequence Alignment\r
 -label.clustalw_multiple_sequence_alignment = ClustalW Multiple Sequence Alignment\r
 -label.jnet_secondary_structure_prediction = JNet Secondary Structure Prediction\r
 -label.multiharmony = Multi-Harmony\r
 -label.unable_start_web_service_analysis = Unable to start web service analysis\r
 -label.job_couldnt_be_started_check_input = The Job couldn't be started. Please check your input, and the Jalview console for any warning messages.\r
 -label.prompt_each_time = Prompt each time\r
 -label.use_source = Use Source\r
 -label.couldnt_save_project = Couldn't save project\r
 -label.error_whilst_saving_current_state_to = Error whilst saving current state to {0}\r
 -label.error_whilst_loading_project_from = Error whilst loading project from {0}\r
 -label.couldnt_load_project = Couldn't load project\r
 -label.pca_sequences_not_aligned = The sequences must be aligned before calculating PCA.\nTry using the Pad function in the edit menu,\nor one of the multiple sequence alignment web services.\r
 -label.invalid_name_preset_exists = Invalid name - preset already exists.\r
 -label.invalid_name = Invalid name\r
 -label.set_proxy_settings = Please set up your proxy settings in the 'Connections' tab of the Preferences window\r
 -label.proxy_authorization_failed = Proxy Authorization Failed\r
 -label.internal_jalview_error = Internal Jalview Error\r
 -label.secondary_structure_prediction_service_couldnt_be_located = The Secondary Structure Prediction Service named {0} at {1} couldn't be located.\r
 -label.service_called_is_not_msa_service = The Service called \n{0}\nis not a \nMultiple Sequence Alignment Service\!\r
 -label.msa_service_is_unknown = The Multiple Sequence Alignment Service named {0} is unknown\r
 -label.service_called_is_not_seq_search_service = The Service called \n{0}\nis not a \nSequence Search Service\!\r
 -label.seq_search_service_is_unknown = The Sequence Search Service named {0} is unknown\r
 -label.feature_type = Feature Type\r
 -label.display = Display\r
 -label.service_url = Service URL\r
 -label.copied_sequences = Copied sequences\r
 -label.cut_sequences = Cut Sequences\r
 -label.conservation_colour_increment = Conservation Colour Increment ({0})\r
 -label.percentage_identity_thereshold = Percentage Identity Thereshold ({0})\r
 -label.error_unsupported_owwner_user_colour_scheme = Unsupported owner for User Colour scheme dialog\r
 -label.save_alignment_to_file = Save Alignment to file\r
 -label.save_features_to_file = Save Features to File\r
 -label.save_annotation_to_file = Save Annotation to File\r
 -label.no_features_on_alignment = No features found on alignment\r
 -label.save_pdb_file = Save PDB File\r
 -label.save_text_to_file = Save Text to File\r
 -label.save_state = Save State\r
 -label.restore_state = Restore State\r
 -label.saving_jalview_project = Saving jalview project {0}\r
 -label.loading_jalview_project = Loading jalview project {0}\r
 -label.save_vamsas_document_archive = Save Vamsas Document Archive\r
 -label.saving_vamsas_doc = Saving VAMSAS Document to {0}\r
 -label.load_feature_colours = Load Feature Colours\r
 -label.save_feature_colours = Save Feature Colour Scheme\r
 -label.dataset_for = {0} Dataset for {1}\r
 -label.select_startup_file = Select startup file\r
 -label.select_default_browser = Select default web browser\r
 -label.save_tree_as_newick = Save tree as newick file\r
 -label.create_eps_from_tree = Create EPS file from tree\r
 -label.create_png_from_tree = Create PNG image from tree\r
 -label.save_colour_scheme = Save colour scheme\r
 -label.edit_params_for = Edit parameters for {0}\r
 -label.choose_filename_for_param_file = Choose a filename for this parameter file\r
 -label.save_as_html = Save as HTML\r
 -label.recently_opened = Recently Opened\r
 -label.blasting_for_unidentified_sequence_jobs_running = BLASTing for unidentified sequences - {0}  jobs running.\r
 -label.tree_from = Tree from {0}\r
 -label.webservice_job_title = {0} using {1}\r
 -label.select_visible_region_of = selected {0} region of {1}\r
 -label.visible = Visible\r
 -label.select_unselect_visible_regions_from = select and unselected {0} regions from {1}\r
 -label.visible_region_of = visible region of\r
 -label.webservice_job_title_on = {0} using {1} on {2}\r
 -label.updating_vamsas_session = Updating vamsas session\r
 -label.loading_file = Loading File: {0}\r
 -label.edit_params = Edit {0}\r
 -error.not_implemented = Not implemented\r
 -error.no_such_method_as_clone1_for = No such method as clone1 for {0}\r
 -error.null_from_clone1 = Null from clone1!\r
 -error.implementation_error_sortbyfeature = Implementation Error - sortByFeature method must be one of FEATURE_SCORE, FEATURE_LABEL or FEATURE_DENSITY.\r
 -error.not_yet_implemented = Not yet implemented\r
 -error.unknown_type_dna_or_pep = Unknown Type {0} - dna or pep are the only allowed values.\r
 -error.implementation_error_dont_know_thereshold_annotationcolourgradient = Implementation error: don't know about threshold setting for current AnnotationColourGradient.\r
 -error.implementation_error_embeddedpopup_not_null = Implementation error - embeddedPopup must be non-null\r
 -error.invalid_colour_for_mycheckbox = Invalid color for MyCheckBox\r
 -error.implementation_error_unrecognised_render_object_for_features_type = Implementation Error: Unrecognised render object {0} for features of type {1}\r
 -error.implementation_error_unsupported_feature_colour_object = Implementation error: Unsupported feature colour object.\r
 -error.invalid_separator_parameter = Invalid separator parameter - must be non-zero length\r
 -error.alignment_cigararray_not_implemented = Alignment(CigarArray) not yet implemented\r
 -error.weak_sequencei_equivalence_not_yet_implemented = Weak sequenceI equivalence not yet implemented.\r
 -error.implementation_error_can_only_make_alignmnet_from_cigararray = Implementation Error - can only make an alignment view from a CigarArray of sequences.\r
 -error.empty_view_cannot_be_updated = empty view cannot be updated.\r
 -error.mismatch_between_number_of_sequences_in_block = Mismatch between number of sequences in block {0} ({1}) and the original view ({2})\r
 -error.padding_not_yet_implemented = Padding not yet implemented\r
 -error.mismatch_between_visible_blocks_to_update_and_number_of_contigs_in_view = Mismatch between visible blocks to update and number of contigs in view (contigs=0,blocks={0})\r
 -error.unknown_seq_cigar_operation = Unknown SeqCigar operation {0}\r
 -error.implementation_bug_parse_cigar_string = Implementation bug in parseCigarString\r
 -error.implementation_error_invalid_operation_string = Implementation error. Invalid operation string.\r
 -error.invalid_range_string = Invalid range string (must be zero or positive number)\r
 -error.implementation_error_delete_range_out_of_bounds = Implementation Error: deleteRange out of bounds: start must be non-negative and less than end.\r
 -error.implementation_error = Implementation error\r
 -error.implementation_error_unknown_operation = Implementation Error! Unknown operation {0}\r
 -error.implementation_error_unexpected_null_from_get_sequence_and_deletions = Implementation Error - unexpected null from getSequenceAndDeletions\r
 -error.implementation_error_set_seq_null = Implementation Error - _setSeq(null,...)\r
 -error.implementation_error_s = Implementation Error: _s= {0}\r
 -error.implementation_error_seqcigar_possible = SeqCigar: Possible implementation error: sequence is longer than dataset sequence\r
 -error.implmentation_bug_seq_null = Implementation Bug. Null seq\r
 -error.implementation_bug_cigar_operation_list_range_list = Implementation Bug. Cigar Operation list!= range list\r
 -error.not_yet_implemented_cigar_object_from_cigar_string = NOT YET Implemented: Constructing a Cigar object from a cigar string and a gapped sequence.\r
 -error.implementation_bug_cigar_operation = Implementation Bug. Cigar Operation {0} {1} not one of {2}, {3}, or {4}.\r
 -error.implementation_error_for_new_cigar = Implementation error for new Cigar(SequenceI)\r
 -error.implementation_error_cigar_seq_no_operations = Implementation error: {0}th sequence Cigar has no operations.\r
 -error.implementation_error_jmol_getting_data = Implementation error - Jmol seems to be still working on getting its data - report at http://issues.jalview.org/browse/JAL-1016\r
 -error.implementation_error_no_pdbentry_from_index = Implementation error - no corresponding pdbentry (for index {0}) to add sequences mappings to\r
 -error.jmol_version_not_compatible_with_jalview_version = Jmol version {0} is not compatible with this version of Jalview. Report this problem at issues.jalview.org\r
 -error.not_implemented_remove = Remove: Not implemented\r
 -error.not_implemented_clone = Clone: Not implemented\r
 -error.implementation_error_chimera_getting_data = Implementation error - Chimera seems to be still working on getting its data - report at http://issues.jalview.org/browse/JAL-1016\r
 -error.call_setprogressbar_before_registering_handler = call setProgressBar before registering the progress bar's handler.\r
 -label.cancelled_params = Cancelled {0}\r
 -error.implementation_error_cannot_show_view_alignment_frame = Implementation error: cannot show a view from another alignment in an AlignFrame.\r
 -error.implementation_error_dont_know_about_thereshold_setting = Implementation error: don't know about threshold setting for current AnnotationColourGradient.\r
 -error.eps_generation_not_implemented = EPS Generation not yet implemented\r
 -error.png_generation_not_implemented = PNG Generation not yet implemented\r
 -error.try_join_vamsas_session_another = Trying to join a vamsas session when another is already connected\r
 -error.invalid_vamsas_session_id = Invalid vamsas session id\r
 -error.implementation_error_cannot_create_groovyshell = Implementation Error. Cannot create groovyShell without Groovy on the classpath!\r
 -label.groovy_support_failed = Jalview Groovy Support Failed\r
 -label.couldnt_create_groovy_shell = Couldn't create the groovy Shell. Check the error log for the details of what went wrong.\r
 -error.unsupported_version_calcIdparam = Unsupported Version for calcIdparam {0}\r
 -error.implementation_error_cant_reorder_tree = Implementation Error: Can't reorder this tree. Not DefaultMutableTreeNode.\r
 -error.invalid_value_for_option = Invalid value {0} for option {1}\r
 -error.implementation_error_cannot_import_vamsas_doc = Implementation Error - cannot import existing vamsas document into an existing session, Yet!\r
 -label.vamsas_doc_couldnt_be_opened_as_new_session = VAMSAS Document could not be opened as a new session - please choose another\r
 -error.implementation_error_vamsas_operation_not_init = Impementation error! Vamsas Operations when client not initialised and connected\r
 -error.jalview_no_connected_vamsas_session = Jalview not connected to Vamsas session\r
 -error.implementation_error_cannot_recover_vamsas_object_mappings = IMPLEMENTATION ERROR: Cannot recover vamsas object mappings - no backup was made\r
 -error.setstatus_called_non_existent_job_pane = setStatus called for non-existent job pane {0}\r
 -error.implementation_error_cannot_find_marshaller_for_param_set =Implementation error: Can't find a marshaller for the parameter set\r
 -error.implementation_error_old_jalview_object_not_bound =IMPLEMENTATION ERROR: old jalview object is not bound ! ({0})\r
 -error.implementation_error_vamsas_doc_class_should_bind_to_type = Implementation Error: Vamsas Document Class {0} should bind to a {1} (found a {2})\r
 -error.implementation_error_jalview_class_should_bind_to_type = Implementation Error: Jalview Class {0} should bind to a {1} (found a {2})\r
 -error.invalid_vamsas_rangetype_cannot_resolve_lists = Invalid vamsas RangeType - cannot resolve both lists of Pos and Seg from choice!\r
 -error.implementation_error_maplist_is_null = Implementation error. MapList is null for initMapType.\r
 -error.implementation_error_cannot_have_null_alignment = Implementation error: Cannot have null alignment property key\r
 -error.implementation_error_null_fileparse = Implementation error. Null FileParse in copy constructor\r
 -error.implementation_error_cannot_map_alignment_sequences = IMPLEMENTATION ERROR: Cannot map an alignment of sequences from different datasets into a single alignment in the vamsas document.\r
 -error.implementation_error_cannot_duplicate_colour_scheme = Serious implementation error: cannot duplicate colourscheme {0}\r
 -error.implementation_error_structure_selection_manager_null = Implementation error. Structure selection manager's context is 'null'\r
 -exception.ssm_context_is_null = SSM context is null\r
 -error.idstring_seqstrings_only_one_per_sequence = idstrings and seqstrings contain one string each per sequence\r
 -error.cannot_have_mixed_length_replacement_vectors = Cannot have mixed length replacement vectors. Replacement vector for {0} is {1} strings long, and have already seen a {2} length vector.\r
 -error.cannot_have_zero_length_vector_replacement_strings = Cannot have zero length vector of replacement strings - either 1 value or n values.\r
 -error.implementation_error_multiple_single_sequence_prediction_jobs_not_supported = Implementation Error! Multiple single sequence prediction jobs are not yet supported\r
 -error.implementation_error_invalid_msa_index_for_job =Implementation Error! Invalid msaIndex for JPredJob on parent MSA input object!\r
 -error.implementation_error_startjob_called = Implementation error - StartJob(JpredJob) called on {0}\r
 -error.multiple_jnet_subjob_merge_not_implemented = Multiple JNet subjob merging not yet implemented\r
 -label.job_never_ran = Job never ran - input returned to user.\r
 -error.implementation_error_minlen_must_be_greater_zero = Implementation error: minlen must be zero or more\r
 -error.implementation_error_msawbjob_called = Implementation error - StartJob(MsaWSJob) called on a WSJobInstance {0}\r
 -error.implementation_error_cannot_attach_ws_menu_entry = IMPLEMENTATION ERROR: cannot attach WS Menu Entry without service handle reference!\r
 -error.parameter_migration_not_implemented_yet = Parameter migration not implemented yet\r
 -error.implementation_error_cannot_set_jaba_option = Implementation error: cannot set Jaba Option to a value outside its allowed value range!\r
 -error.implementation_error_valuetype_doesnt_support_jabaws_type = IMPLEMENTATION ERROR: jalview.ws.params.ValueConstrainI.ValueType does not support the JABAWS type : {0}\r
 -error.cannot_create_jabaws_param_set = Cannot create a JabaWSParamSet from non-JabaWS parameters\r
 -error.cannot_set_arguments_to_jabaws_param_set = Cannot set arguments to a JabaWSParamSet that are not JabaWS arguments\r
 -error.implementation_error_runner_config_not_available = Implementation Error: Runner Config not available for a JABAWS service of type {0} ({1})\r
 -error.implementation_error_cannot_handle_jaba_param = Implementation Error: Cannot handle Jaba parameter object {0}\r
 -error.implementation_error_attempt_to_delete_service_preset = Implementation error: Attempt to delete a service preset!\r
 -error.implementation_error_cannot_locate_oldname_presetname = Implementation error: Can't locate either oldname ({0}) or presetName ({1}in the datastore!"\r
 -error.implementation_error_jabaws_param_set_only_handled_by = Implementation error: JabaWsParamSets can only be handled by JabaParamStore\r
 -error.cannot_set_source_file_for = Cannot set source file for {0}\r
 -error.mismatch_service_instance_preset = Probable mismatch between service instance and preset!\r
 -error.cannot_set_params_for_ws_preset = Cannot set Parameters for a Jaba Web service's preset\r
 -error.implementation_error_can_only_instantiate_jaba_param_sets = Implementation error: Can only instantiate Jaba parameter sets\r
 -error.no_aacon_service_found = No AACon service found\r
 -error.implementation_error_couldnt_copy_value_constraint = Implementation error: could not copy ValueConstrain!\r
 -error.couldnt_encode_as_utf8 = Couldn't encode {0} as UTF-8.\r
 -error.tree_inputtype_not_yet_implemented = Tree InputType not yet implemented\r
 -error.implementation_error_need_to_have_httpresponse = Implementation Error: need to have an HttpResponse to process\r
 -error.dbrefsource_implementation_exception =DBRefSource Implementation Exception\r
 -error.implementation_error_dbinstance_must_implement_interface = Implmentation Error - getDbInstances must be given a class that implements jalview.ws.seqfetcher.DbSourceProxy (was given{0})\r
 -error.implementation_error_must_init_dbsources =Implementation error. Must initialise dbSources\r
 -label.view_controller_toggled_marked = {0} {1} columns {2} containing features of type {3}  across {4} sequence(s)\r
 -label.toggled = Toggled\r
 -label.marked = Marked\r
 -label.not = not\r
 -label.no_feature_of_type_found = No features of type {0} found.\r
 -label.submission_params = Submission {0}\r
 -label.empty_alignment_job = Empty Alignment Job\r
 -label.add_new_sbrs_service = Add a new Simple Bioinformatics Rest Service\r
 -label.edit_sbrs_entry = Edit Simple Bioinformatics Rest Service entry\r
 -label.pca_recalculating = Recalculating PCA\r
 -label.pca_calculating = Calculating PCA\r
 -label.select_foreground_colour = Choose foreground colour\r
 -label.select_colour_for_text = Select Colour for Text\r
 -label.adjunst_foreground_text_colour_thereshold = Adjust Foreground Text Colour Threshold\r
 -label.select_subtree_colour = Select Sub-Tree Colour\r
 -label.create_new_sequence_features = Create New Sequence Feature(s)\r
 -label.amend_delete_features = Amend/Delete Features for {0}\r
 -exception.out_of_bounds_for_file = Out of bounds for file: i={0}, Final Buffer: i0={1} iend={2}\r
 -exception.null_string_given_to_regex_search = Null String Given to Regex.search\r
 -exception.null_string_like_given_to_regex_search = Null StringLike Given to Regex.search\r
 -exception.null_string_given_to_regex_reverse_search = Null String Given to Regex.reverseSearch\r
 -exception.null_string_like_given_to_regex_reverse_search = Null StringLike Given to Regex.reverseSearch\r
 -exception.null_string_like_given_to_regex_search_from = Null String Given to Regex.searchFrom\r
 -exception.null_string_like_given_to_regex_search_region = Null String Given to Regex.searchRegion\r
 -exception.replace_null_regex_pointer = Replacer has null Regex pointer\r
 -exception.bad_pattern_to_regex_perl_code = bad pattern to Regex.perlCode: {0}\r
 -exception.no_stub_implementation_for_interface = There is no stub implementation for the interface: {0}\r
 -exception.cannot_set_endpoint_address_unknown_port = Cannot set Endpoint Address for Unknown Port {0}\r
 -exception.querying_matching_opening_parenthesis_for_non_closing_parenthesis = Querying matching opening parenthesis for non-closing parenthesis character {0}\r
 -exception.mismatched_unseen_closing_char = Mismatched (unseen) closing character {0}\r
 -exception.mismatched_closing_char = Mismatched closing character {0}\r
 -exception.mismatched_opening_char = Mismatched opening character {0} at {1}\r
 -exception.invalid_datasource_couldnt_obtain_reader = Invalid datasource. Could not obtain Reader\r
 -exception.index_value_not_in_range = {0}: Index value {1} not in range [0..{2}]\r
 -exception.unterminated_cigar_string = Unterminated cigar string\r
 -exception.unexpected_operation_cigar_string_pos = Unexpected operation {0} in cigar string (position {1} in {2}\r
 -exception.couldnt_parse_responde_from_annotated3d_server = Couldn't parse response from Annotate3d server\r
 -exception.application_test_npe = Application test: throwing an NullPointerException It should arrive at the console\r
 -exception.overwriting_vamsas_id_binding = Overwriting vamsas id binding\r
 -exception.overwriting_jalview_id_binding = Overwriting jalview id binding\r
 -error.implementation_error_unknown_file_format_string = Implementation error: Unknown file format string\r
 -exception.failed_to_resolve_gzip_stream = Failed to resolve GZIP stream\r
 -exception.problem_opening_file_also_tried = Problem opening {0} (also tried {1}) : {2}\r
 -exception.problem_opening_file = Problem opening {0} : {1}\r
 -exception.failed_to_read_data_from_source = Failed to read data from source: {0}\r
 -exception.no_init_source_stream = Unitialised Source Stream\r
 -exception.invalid_source_stream = Invalid Source Stream: {0}\r
 -error.implementation_error_reset_called_for_invalid_source = Implementation Error: Reset called for invalid source.\r
 -exception.number_of_residues_in_query_sequence_differ_from_prediction = Number of residues in {0} supposed query sequence ({1}\n{2})\ndiffer from number of prediction sites in prediction ({3})\r
 -label.mapped = mapped\r
 -exception.jpredconcide_entry_has_unexpected_number_of_columns = JPredConcise: Entry ({0}) has an unexpected number of columns\r
 -exception.couldnt_parse_concise_annotation_for_prediction = Couldn't parse concise annotation for prediction profile.\n{0}\r
 -exception.newfile = NewickFile\: {0}\n\r
 -label.no_tree_read_in = No Tree read in\r
 -exception.rnaml_couldnt_access_datasource = Couldn't access datasource ({0})\r
 -exception.ranml_couldnt_process_data = Couldn't process data as RNAML file ({0})\r
 -exception.ranml_invalid_file = Invalid RNAML file ({0})\r
 -exception.ranml_problem_parsing_data = Problem parsing data as RNAML ({0})\r
 -exception.pfam_no_sequences_found = No sequences found (PFAM input)\r
 -exception.stockholm_invalid_format = This file is not in valid STOCKHOLM format: First line does not contain '# STOCKHOLM'\r
 -exception.couldnt_parse_sequence_line = Could not parse sequence line: {0}\r
 -exception.error_parsing_line = Error parsing {0}\r
 -exception.unknown_annotation_detected = Unknown annotation detected: {0} {1}\r
 -exception.couldnt_store_sequence_mappings = Couldn't store sequence mappings for {0}\r
 -exception.matrix_too_many_iteration = Too many iterations in {0} (max is {1})\r
 -exception.browser_not_found = Exception in finding browser: {0}\r
 -exception.browser_unable_to_locate = Unable to locate browser: {0}\r
 -exception.invocation_target_exception_creating_aedesc = InvocationTargetException while creating AEDesc: {0}\r
 -exception.illegal_access_building_apple_evt= IllegalAccessException while building AppleEvent: {0}\r
 -exception.instantiation_creating_aedesc = InstantiationException while creating AEDesc: {0}\r
 -exception.unable_to_launch_url = Unable to launch URL: {0}\r
 -exception.unable_to_create_internet_config = Unable to create an Internet Config instance: {0}\r
 -exception.invocation_target_calling_url = InvocationTargetException while calling openURL: {0}\r
 -exception.illegal_access_calling_url = IllegalAccessException while calling openURL: {0}\r
 -exception.interrupted_launching_browser = InterruptedException while launching browser: {0}\r
 -exception.das_source_doesnt_support_sequence_command = Source {0} does not support the sequence command.\r
 -exception.invalid_das_source = Invalid das source: {0}\r
 -exception.ebiembl_retrieval_failed_on = EBI EMBL XML retrieval failed on {0}:{1}\r
 -label.no_embl_record_found = # No EMBL record retrieved for {0}:{1}\r
 -label.embl_successfully_parsed = # Successfully parsed the {0} queries into an Alignment\r
 -exception.no_pdb_records_for_chain = No PDB Records for {0} chain {1}\r
 -exception.unexpected_handling_rnaml_translation_for_pdb = Unexpected exception when handling RNAML translation of PDB data\r
 -exception.couldnt_recover_sequence_properties_for_alignment = Couldn't recover sequence properties for alignment\r
 -exception.unknown_format_for_file = Unknown format {0} for file \: \n{1}\r
 -label.remove_gaps = Remove Gaps\r
 -exception.couldnt_recover_sequence_props_for_jnet_query = Couldn't recover sequence properties for JNet Query sequence!\r
 -exception.server_timeout_try_later = Server timed out - try again later\n\r
 -exception.web_service_returned_null_try_later= Server at {0} returned null object, it probably cannot be contacted. Try again later.\r
 -exception.cannot_contact_service_endpoint_at = Cannot contact service endpoint at {0}\r
 -error.implementation_error_cannot_find_service_url_in_given_set = Implementation error: Cannot find service url in the given url set!\r
 -error.implementation_error_cannot_find_service_url_in_given_set_param_store = Implementation error: Cannot find service url in the given url set for this service parameter store ({0}}\r
 -exception.jobsubmission_invalid_params_set = Invalid parameter set. Check Jalview implementation\r
 -exception.notvaliddata_group_contains_less_than_min_seqs = Group contains less than {0} sequences.\r
 -exception.outofmemory_loading_pdb_file = Out of memory loading PDB File\r
 -exception.eps_coudnt_write_output_file = Could not write to the output file: {0}\r
 -exception.eps_method_not_supported = Method not currently supported by EpsGraphics2D version {0}\r
 -exception.eps_unable_to_get_inverse_matrix = Unable to get inverse of matrix: {0}\r
 -warn.job_cannot_be_cancelled_close_window = This job cannot be cancelled.\nJust close the window.\r
 -warn.service_not_supported = Service not supported!\r
 -warn.input_is_too_big = Input is too big!\r
 -warn.invalid_job_param_set = Invalid job parameter set!\r
 -info.job_couldnt_be_run_server_doesnt_support_program = Job could not be run because the server doesn't support this program.\n{0}\r
 -info.job_couldnt_be_run_exceeded_hard_limit = Job could not be run because it exceeded a hard limit on the server.\n{0}\r
 -info.job_couldnt_be_run_incorrect_param_setting = Job could not be run because some of the parameter settings are not supported by the server.\n{0}\nPlease check to make sure you have used the correct parameter set for this service\!\n\r
 -info.no_jobs_ran = No jobs ran\r
 -info.failed_to_submit_prediction = Failed to submit the prediction\:\n{0} {1}\r
 -info.invalid_jnet_job_result_data ={0}\n{1}\nInvalid JNet job result data\!\n{2}\r
 -info.failed_to_submit_sequences_for_alignment = Failed to submit sequences for alignment.\nIt is most likely that there is a problem with the server.\nJust close the window\n\r
 -info.alignment_object_method_notes = \nAlignment Object Method Notes\n\r
 -info.server_exception = \n{0} Server exception\!\n{1}\r
 -status.processing_commandline_args = Processing commandline arguments...\r
 -status.das_features_being_retrived = DAS features being retrieved...\r
 -status.searching_for_sequences_from = Searching for sequences from {0}\r
 -status.finished_searching_for_sequences_from = Finished searching for sequences from {0}\r
 -label.eps_file = EPS file\r
 -label.png_image = PNG image\r
 -status.saving_file = Saving {0}\r
 -status.export_complete = Export complete.\r
 -status.fetching_pdb = Fetching PDB {0}\r
 -status.refreshing_news = Refreshing news\r
 -status.importing_vamsas_session_from = Importing VAMSAS session from {0}\r
 -status.opening_params = Opening {0}\r
 -status.waiting_sequence_database_fetchers_init = Waiting for Sequence Database Fetchers to initialise\r
 -status.init_sequence_database_fetchers = Initialising Sequence Database Fetchers\r
 -status.fetching_sequence_queries_from = Fetching {0} sequence queries from {1}\r
 -status.finshed_querying = Finished querying\r
 -status.parsing_results = Parsing results.\r
 -status.processing = Processing...\r
 -status.refreshing_web_service_menus = Refreshing Web Service Menus\r
 -status.collecting_job_results = Collecting job results.\r
 -status.fetching_das_sequence_features = Fetching DAS Sequence Features\r
 -status.no_das_sources_active = No DAS Sources Active\r
 -status.das_feature_fetching_cancelled = DAS Feature Fetching Cancelled\r
 -status.das_feature_fetching_complete = DAS Feature Fetching Complete\r
 -status.fetching_db_refs = Fetching db refs\r
 -label.font_doesnt_have_letters_defined = Font doesn't have letters defined\nso cannot be used\nwith alignment data\r
 -label.error_loading_file_params = Error loading file {0}\r
 -label.error_loading_jalview_file = Error loading Jalview file\r
 -warn.out_of_memory_when_action = Out of memory when {0}\!\!\nSee help files for increasing Java Virtual Machine memory.\r
 -warn.out_of_memory_loading_file = Out of memory loading file {0}\!\!\nSee help files for increasing Java Virtual Machine memory.\r
 -label.out_of_memory = Out of memory\r
 -label.invalid_id_column_width = Invalid ID Column width\r
 -warn.user_defined_width_requirements = The user defined width for the\nannotation and sequence ID columns\nin exported figures must be\nat least 12 pixels wide.\r
 -label.couldnt_create_sequence_fetcher = Couldn't create SequenceFetcher\r
 -warn.couldnt_create_sequence_fetcher_client = Could not create the sequence fetcher client. Check error logs for details.\r
 -warn.server_didnt_pass_validation = Service did not pass validation.\nCheck the Jalview Console for more details.\r
 -warn.url_must_contain = Sequence URL must contain $SEQUENCE_ID$ or a regex $SEQUENCE_ID=/<regex>/=$\r
 -info.validate_jabaws_server = Validate JabaWS Server ?\n(Look in console output for results)\r
 -label.test_server = Test Server?\r
 -info.you_want_jalview_to_find_uniprot_accessions = Do you want Jalview to find\nUniprot Accession ids for given sequence names?\r
 -label.find_uniprot_accession_ids = Find Uniprot Accession Ids\r
 -label.new_sequence_fetcher = New Sequence Fetcher\r
 -label.additional_sequence_fetcher = Additional Sequence Fetcher\r
 -label.select_database_retrieval_source = Select Database Retrieval Source\r
 -label.overwrite_existing_file = Overwrite existing file?\r
 -label.file_already_exists = File exists\r
 -label.edit_jabaws_url = Edit JABAWS URL\r
 -label.add_jabaws_url = Add new JABAWS URL\r
 -label.news_from_jalview = News from http://www.jalview.org\r
 -label.cut_paste_alignmen_file = Cut & Paste Alignment File\r
 -label.enter_redundancy_thereshold = Enter the redundancy thereshold\r
 -label.select_dark_light_set_thereshold = <html><i>Select a dark and light text colour, then set the threshold to<br>switch between colours, based on background colour</i></html>\r
 -label.select_feature_colour = Select Feature Colour
 +label.choose_annotations = Choose annotations to show or hide\r
 +label.show_selected_annotations = Show selected annotation types\r
 +label.hide_selected_annotations = Hide selected annotation types\r
 +label.add_reference_annotations = Add reference annotations\r
 +label.find = Find\r
 +error.invalid_regex = Invalid regular expression\r
 +label.invalid_search = Search string invalid\r
 +label.find_tip = <html>Search alignment, selection or sequence ids for a subsequence (ignoring gaps).<br>Accepts regular expressions - search Help for 'regex' for details.\r
 +label.delete_all = Delete all sequences\r
 +warn.delete_all = <html>Deleting all sequences will close the alignment window.<br>Confirm deletion or Cancel.\r
   */
  package jalview.datamodel;
  
+ import jalview.util.MessageManager;
 -import java.util.*;
 +import java.util.ArrayList;
 +import java.util.Enumeration;
 +import java.util.Hashtable;
 +import java.util.List;
 +import java.util.Map;
 +import java.util.Vector;
  
  /**
   * Data structure to hold and manipulate a multiple sequence alignment
@@@ -117,7 -114,7 +119,7 @@@ public class Alignment implements Align
     */
    public static AlignmentI createAlignment(CigarArray compactAlignment)
    {
-     throw new Error("Alignment(CigarArray) not yet implemented");
+     throw new Error(MessageManager.getString("error.alignment_cigararray_not_implemented"));
      // this(compactAlignment.refCigars);
    }
  
    {
      return dataset;
    }
 +
 +  /**
 +   * Returns an iterable collection of annotations on this alignment which match
 +   * the given criteria.
 +   */
 +  @Override
 +  public Iterable<AlignmentAnnotation> findAnnotation(SequenceI datasequence,
 +          String calcId, String label)
 +  {
 +    List<AlignmentAnnotation> result = new ArrayList<AlignmentAnnotation>();
 +    for (AlignmentAnnotation ann : annotations)
 +    {
 +      // only sequence-linked annotations can qualify (have a datasequence)
 +      if (ann.sequenceRef == null)
 +      {
 +        continue;
 +      }
 +      boolean matchDatasequence = (ann.sequenceRef.getDatasetSequence() == datasequence);
 +      final String annCalcId = ann.getCalcId();
 +      boolean matchCalcId = (annCalcId != null && annCalcId.equals(calcId));
 +      boolean matchLabel = (ann.label != null && ann.label.equals(label));
 +      if (matchDatasequence && matchCalcId && matchLabel)
 +      {
 +        result.add(ann);
 +      }
 +    }
 +    return result;
 +  }
  }
@@@ -334,7 -334,6 +334,7 @@@ public class AlignFrame extends GAlignF
      setMenusFromViewport(viewport);
      buildSortByAnnotationScoresMenu();
      buildTreeMenu();
 +    
      if (viewport.wrapAlignment)
      {
        wrapMenuItem_actionPerformed(null);
          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);
 +            Help.showHelpWindow();
            } catch (Exception ex)
            {
              ex.printStackTrace();
      scaleLeft.setVisible(av.wrapAlignment);
      scaleRight.setVisible(av.wrapAlignment);
      annotationPanelMenuItem.setState(av.showAnnotation);
 +    /*
 +     * Show/hide all annotations only enabled if annotation panel is shown
 +     */
 +    showAllAnnotations.setEnabled(annotationPanelMenuItem.getState());
 +    hideAllAnnotations.setEnabled(annotationPanelMenuItem.getState());
      viewBoxesMenuItem.setSelected(av.showBoxes);
      viewTextMenuItem.setSelected(av.showText);
      showNonconservedMenuItem.setSelected(av.getShowUnconserved());
    {
      if (progressBarHandlers == null || !progressBars.contains(new Long(id)))
      {
-       throw new Error(
-               "call setProgressBar before registering the progress bar's handler.");
+       throw new Error(MessageManager.getString("error.call_setprogressbar_before_registering_handler"));
      }
      progressBarHandlers.put(new Long(id), handler);
      final JPanel progressPanel = (JPanel) progressBars.get(new Long(id));
          public void actionPerformed(ActionEvent e)
          {
            handler.cancelActivity(id);
-           us.setProgressBar(
-                   "Cancelled "
-                           + ((JLabel) progressPanel.getComponent(0))
-                                   .getText(), id);
+           us.setProgressBar(MessageManager.formatMessage("label.cancelled_params", new String[]{((JLabel) progressPanel.getComponent(0)).getText()}), id);
          }
        });
        progressPanel.add(cancel, BorderLayout.EAST);
              currentFileFormat, false);
  
      chooser.setFileView(new JalviewFileView());
-     chooser.setDialogTitle("Save Alignment to file");
+     chooser.setDialogTitle(MessageManager.getString("label.save_alignment_to_file"));
      chooser.setToolTipText(MessageManager.getString("action.save"));
  
      int value = chooser.showSaveDialog(this);
          // /////
          // ADD HISTORY ITEM
          //
-         addHistoryItem(new EditCommand("Add sequences", EditCommand.PASTE,
+         addHistoryItem(new EditCommand(MessageManager.getString("label.add_sequences"), EditCommand.PASTE,
                  sequences, 0, alignment.getWidth(), alignment));
        }
        // Add any annotations attached to sequences
        return;
      }
  
 -    Vector seqs = new Vector();
 +    List<SequenceI> seqs = new ArrayList<SequenceI>(sg.getSize());
      SequenceI seq;
      for (int i = 0; i < sg.getSize(); i++)
      {
        seq = sg.getSequenceAt(i);
 -      seqs.addElement(seq);
 +      seqs.add(seq);
      }
  
 -    // If the cut affects all sequences, remove highlighted columns
 +    // If the cut affects all sequences, warn, remove highlighted columns
      if (sg.getSize() == viewport.getAlignment().getHeight())
      {
 +      int confirm = JOptionPane.showConfirmDialog(this,
 +              MessageManager.getString("warn.delete_all"), // $NON-NLS-1$
 +              MessageManager.getString("label.delete_all"), // $NON-NLS-1$
 +              JOptionPane.OK_CANCEL_OPTION);
 +
 +      if (confirm == JOptionPane.CANCEL_OPTION
 +              || confirm == JOptionPane.CLOSED_OPTION)
 +      {
 +        return;
 +      }
        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);
 +      cut[i] = seqs.get(i);
      }
  
      /*
       * //ADD HISTORY ITEM
       */
-     addHistoryItem(new EditCommand("Cut Sequences", EditCommand.CUT, cut,
+     addHistoryItem(new EditCommand(MessageManager.getString("label.cut_sequences"), EditCommand.CUT, cut,
              sg.getStartRes(), sg.getEndRes() - sg.getStartRes() + 1,
              viewport.getAlignment()));
  
      boolean addFirstIndex = false;
      if (viewTitle == null || viewTitle.trim().length() == 0)
      {
-       viewTitle = "View";
+       viewTitle = MessageManager.getString("action.view");
        addFirstIndex = true;
      }
      else
    }
  
    /**
 -   * DOCUMENT ME!
 +   * Action on toggle of the 'Show annotations' menu item. This shows or hides
 +   * the annotations panel as a whole.
 +   * 
 +   * The options to show/hide all annotations should be enabled when the panel
 +   * is shown, and disabled when the panel is hidden.
     * 
     * @param e
 -   *          DOCUMENT ME!
     */
    @Override
    public void annotationPanelMenuItem_actionPerformed(ActionEvent e)
    {
 -    viewport.setShowAnnotation(annotationPanelMenuItem.isSelected());
 -    alignPanel.setAnnotationVisible(annotationPanelMenuItem.isSelected());
 +    final boolean setVisible = annotationPanelMenuItem.isSelected();
 +    viewport.setShowAnnotation(setVisible);
 +    alignPanel.setAnnotationVisible(setVisible);
 +    this.showAllAnnotations.setEnabled(setVisible);
 +    this.hideAllAnnotations.setEnabled(setVisible);
    }
  
    @Override
    public void addSortByOrderMenuItem(String title,
            final AlignmentOrder order)
    {
-     final JMenuItem item = new JMenuItem("by " + title);
+     final JMenuItem item = new JMenuItem(MessageManager.formatMessage("action.by_title_param", new String[]{title}));
      sort.add(item);
      item.addActionListener(new java.awt.event.ActionListener()
      {
            tm.setText(title);//
            tm.addActionListener(new java.awt.event.ActionListener()
            {
 +            @Override
              public void actionPerformed(ActionEvent e)
              {
                NewTreePanel(type, (String) pwtype, title);
            // 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");
+           final JMenu msawsmenu = new JMenu(MessageManager.getString("label.alignment"));
+           final JMenu secstrmenu = new JMenu(MessageManager.getString("label.secondary_structure_prediction"));
+           final JMenu seqsrchmenu = new JMenu(MessageManager.getString("label.sequence_database_search"));
+           final JMenu analymenu = new JMenu(MessageManager.getString("label.analysis"));
+           final JMenu dismenu = new JMenu(MessageManager.getString("label.protein_disorder"));
            // JAL-940 - only show secondary structure prediction services from
            // the legacy server
            if (// Cache.getDefault("SHOW_JWS1_SERVICES", true)
        public void run()
        {
          final long sttime = System.currentTimeMillis();
-         ths.setProgressBar("Searching for sequences from " + fsrc, sttime);
+         ths.setProgressBar(MessageManager.formatMessage("status.searching_for_sequences_from", new String[]{fsrc}), sttime);
          try
          {
            Alignment ds = ths.getViewport().getAlignment().getDataset(); // update
            jalview.bin.Cache.log.error("Error when finding crossreferences",
                    e);
          }
-         ths.setProgressBar("Finished searching for sequences from " + fsrc,
+         ths.setProgressBar(MessageManager.formatMessage("status.finished_searching_for_sequences_from", new String[]{fsrc}),
                  sttime);
        }
  
      trimrs.setSelected(Cache.getDefault("TRIM_FETCHED_DATASET_SEQS", true));
      trimrs.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          trimrs.setSelected(trimrs.isSelected());
                    }
  
                  });
-                 fetchr.setToolTipText("<html>"
-                         + JvSwingUtils.wrapTooltip("Retrieve from "
-                                 + src.getDbName()) + "<html>");
+                 fetchr.setToolTipText(JvSwingUtils.wrapTooltip(true, MessageManager.formatMessage("label.fetch_retrieve_from", new String[]{src.getDbName()})));
                  dfetch.add(fetchr);
                  comp++;
                }
                    }
                  });
  
-                 fetchr.setToolTipText("<html>"
-                         + JvSwingUtils.wrapTooltip("Retrieve from all "
-                                 + otherdb.size() + " sources in "
-                                 + src.getDbSource() + "<br>First is :"
-                                 + src.getDbName()) + "<html>");
+                 fetchr.setToolTipText(JvSwingUtils.wrapTooltip(true, MessageManager.formatMessage("label.fetch_retrieve_from_all_sources", new String[]{Integer.valueOf(otherdb.size()).toString(), src.getDbSource(), src.getDbName()})));
                  dfetch.add(fetchr);
                  comp++;
                  // and then build the rest of the individual menus
-                 ifetch = new JMenu("Sources from " + src.getDbSource());
+                 ifetch = new JMenu(MessageManager.formatMessage("label.source_from_db_source", new String[]{src.getDbSource()}));
                  icomp = 0;
                  String imname = null;
                  int i = 0;
                            0, 10) + "..." : dbname;
                    if (imname == null)
                    {
-                     imname = "from '" + sname + "'";
+                     imname = MessageManager.formatMessage("label.from_msname", new String[]{sname});
                    }
                    fetchr = new JMenuItem(msname);
                    final DbSourceProxy[] dassrc =
  
                    });
                    fetchr.setToolTipText("<html>"
-                           + JvSwingUtils.wrapTooltip("Retrieve from "
-                                   + dbname) + "</html>");
+                           + MessageManager.formatMessage("label.fetch_retrieve_from", new String[]{dbname}));
                    ifetch.add(fetchr);
                    ++i;
                    if (++icomp >= mcomp || i == (otherdb.size()))
      if (!viewport.getSequenceSetId().equals(
              alignmentPanel.av.getSequenceSetId()))
      {
-       throw new Error(
-               "Implementation error: cannot show a view from another alignment in an AlignFrame.");
+       throw new Error(MessageManager.getString("error.implementation_error_cannot_show_view_alignment_frame"));
      }
      if (tabbedPane != null
              & alignPanels.indexOf(alignmentPanel) != tabbedPane
        tabbedPane.setSelectedIndex(alignPanels.indexOf(alignmentPanel));
      }
    }
 +
 +  /**
 +   * Action on selection of menu option to Show or Hide all annotations.
 +   * 
 +   * @param visibile
 +   */
 +  @Override
 +  protected void setAllAnnotationsVisibility(boolean visible)
 +  {
 +    for (AlignmentAnnotation aa : alignPanel.getAlignment()
 +            .getAlignmentAnnotation())
 +    {
 +      aa.visible = visible;
 +    }
 +    this.alignPanel.paintAlignment(true);
 +  }
  }
  
  class PrintThread extends Thread
   */
  package jalview.gui;
  
 -import java.util.*;
 -
 -import java.awt.*;
 -import java.awt.event.*;
 -
 -import javax.swing.*;
 -import javax.swing.event.*;
 -
 -import net.miginfocom.swing.MigLayout;
 -
  import jalview.bin.Cache;
 -import jalview.datamodel.*;
 -import jalview.schemes.*;
 +import jalview.datamodel.AlignmentAnnotation;
 +import jalview.datamodel.SequenceGroup;
 +import jalview.schemes.AnnotationColourGradient;
 +import jalview.schemes.ColourSchemeI;
  import jalview.util.MessageManager;
  
 +import java.awt.BorderLayout;
 +import java.awt.Color;
  import java.awt.Dimension;
 +import java.awt.FlowLayout;
 +import java.awt.event.ActionEvent;
 +import java.awt.event.ActionListener;
 +import java.awt.event.MouseAdapter;
 +import java.awt.event.MouseEvent;
 +import java.util.Hashtable;
 +import java.util.Vector;
 +
 +import javax.swing.BorderFactory;
 +import javax.swing.JButton;
 +import javax.swing.JCheckBox;
 +import javax.swing.JColorChooser;
 +import javax.swing.JComboBox;
 +import javax.swing.JInternalFrame;
 +import javax.swing.JLayeredPane;
 +import javax.swing.JPanel;
 +import javax.swing.JSlider;
 +import javax.swing.JTextField;
 +import javax.swing.event.ChangeEvent;
 +import javax.swing.event.ChangeListener;
 +
 +import net.miginfocom.swing.MigLayout;
  
  public class AnnotationColourChooser extends JPanel
  {
  
      slider.addChangeListener(new ChangeListener()
      {
 +      @Override
        public void stateChanged(ChangeEvent evt)
        {
          if (!adjusting)
          {
 -          thresholdValue.setText(((float) slider.getValue() / 1000f) + "");
 +          thresholdValue.setText((slider.getValue() / 1000f) + "");
            valueChanged(!sliderDragging);
          }
        }
          super.mouseDragged(e);
        }
  
 +      @Override
        public void mouseReleased(MouseEvent evt)
        {
          if (sliderDragging)
          threshold.setSelectedIndex(2);
          break;
        default:
-         throw new Error(
-                 "Implementation error: don't know about threshold setting for current AnnotationColourGradient.");
+         throw new Error(MessageManager.getString("error.implementation_error_dont_know_about_thereshold_setting"));
        }
        thresholdIsMin.setSelected(acg.thresholdIsMinMax);
        thresholdValue.setText("" + acg.getAnnotationThreshold());
        if (!list.contains(label))
        {
          anmap[list.size()] = i;
 -        list.addElement(label);
 +        list.add(label);
  
        }
        else
          if (!isSeqAssociated)
          {
            anmap[list.size()] = i;
 -          list.addElement(label + "_" + (index++));
 +          list.add(label + "_" + (index++));
          }
        }
      }
      seqAssociated.setEnabled(enableSeqAss);
 -    annmap = new int[list.size()];
 -    System.arraycopy(anmap, 0, annmap, 0, annmap.length);
 +    this.annmap = new int[list.size()];
 +    System.arraycopy(anmap, 0, this.annmap, 0, this.annmap.length);
      return list;
    }
  
      minColour.setToolTipText(MessageManager.getString("label.min_colour"));
      minColour.addMouseListener(new MouseAdapter()
      {
 +      @Override
        public void mousePressed(MouseEvent e)
        {
          if (minColour.isEnabled())
      maxColour.setToolTipText(MessageManager.getString("label.max_colour"));
      maxColour.addMouseListener(new MouseAdapter()
      {
 +      @Override
        public void mousePressed(MouseEvent e)
        {
          if (maxColour.isEnabled())
      ok.setText(MessageManager.getString("action.ok"));
      ok.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          ok_actionPerformed(e);
      cancel.setText(MessageManager.getString("action.cancel"));
      cancel.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          cancel_actionPerformed(e);
  
      annotations.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          annotations_actionPerformed(e);
      });
      threshold.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          threshold_actionPerformed(e);
      });
      thresholdValue.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          thresholdValue_actionPerformed(e);
              .getString("label.use_original_colours"));
      currentColours.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          currentColours_actionPerformed(e);
              .getString("label.threshold_minmax"));
      thresholdIsMin.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent actionEvent)
        {
          thresholdIsMin_actionPerformed(actionEvent);
    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);
    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);
      {
        changeColour();
      }
 -    currentAnnotation.threshold.value = (float) slider.getValue() / 1000f;
 +    currentAnnotation.threshold.value = slider.getValue() / 1000f;
      propagateSeqAssociatedThreshold(updateAllAnnotation);
      ap.paintAlignment(false);
    }
@@@ -89,9 -89,9 +89,9 @@@ import javax.swing.JPopupMenu
  import javax.swing.JProgressBar;
  import javax.swing.SwingUtilities;
  import javax.swing.event.HyperlinkEvent;
 +import javax.swing.event.HyperlinkEvent.EventType;
  import javax.swing.event.MenuEvent;
  import javax.swing.event.MenuListener;
 -import javax.swing.event.HyperlinkEvent.EventType;
  
  /**
   * Jalview Desktop
@@@ -317,8 -317,8 +317,8 @@@ public class Desktop extends jalview.jb
      else
      {
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
 -      setBounds((int) (screenSize.width - 900) / 2,
 -              (int) (screenSize.height - 650) / 2, 900, 650);
 +      setBounds((screenSize.width - 900) / 2,
 +              (screenSize.height - 650) / 2, 900, 650);
      }
      jconsole = new Console(this, showjconsole);
      // add essential build information
            public void run()
            {
              long instance = System.currentTimeMillis();
-             Desktop.instance.setProgressBar("Refreshing news", instance);
+             Desktop.instance.setProgressBar(MessageManager.getString("status.refreshing_news"), instance);
              jvnews.refreshNews();
              Desktop.instance.setProgressBar(null, instance);
              jvnews.showNews();
        if (format.equals("URL NOT FOUND"))
        {
          JOptionPane.showInternalMessageDialog(Desktop.desktop,
-                 "Couldn't locate " + url, "URL not found",
+                 MessageManager.formatMessage("label.couldnt_locate", new String[]{url}), MessageManager.getString("label.url_not_found"),
                  JOptionPane.WARNING_MESSAGE);
  
          return;
    {
      CutAndPasteTransfer cap = new CutAndPasteTransfer();
      cap.setForInput(viewport);
-     Desktop.addInternalFrame(cap, "Cut & Paste Alignment File", 600, 500);
+     Desktop.addInternalFrame(cap, MessageManager.getString("label.cut_paste_alignmen_file"), 600, 500);
    }
  
    /*
    {
      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);
 +      Help.showHelpWindow();
      } catch (Exception ex)
      {
      }
              { "Jalview Project" }, "Jalview Project");
  
      chooser.setFileView(new JalviewFileView());
-     chooser.setDialogTitle("Save State");
+     chooser.setDialogTitle(MessageManager.getString("label.save_state"));
  
      int value = chooser.showSaveDialog(this);
  
          public void run()
          {
  
-           setProgressBar("Saving jalview project " + choice.getName(),
+           setProgressBar(MessageManager.formatMessage("label.saving_jalview_project", new String[]{choice.getName()}),
                    choice.hashCode());
            jalview.bin.Cache.setProperty("LAST_DIRECTORY",
                    choice.getParent());
                      ex);
              JOptionPane.showMessageDialog(
                      me,
-                     "Error whilst saving current state to "
-                             + choice.getName(), "Couldn't save project",
+                     MessageManager.formatMessage("label.error_whilst_saving_current_state_to", new String[]{ choice.getName()}),
+                     MessageManager.getString("label.couldnt_save_project"),
                      JOptionPane.WARNING_MESSAGE);
            }
            setProgressBar(null, choice.hashCode());
              { "Jalview Project", "Jalview Project (old)" },
              "Jalview Project");
      chooser.setFileView(new JalviewFileView());
-     chooser.setDialogTitle("Restore state");
+     chooser.setDialogTitle(MessageManager.getString("label.restore_state"));
  
      int value = chooser.showOpenDialog(this);
  
        {
          public void run()
          {
-           setProgressBar("loading jalview project " + choice,
+           setProgressBar(MessageManager.formatMessage("label.loading_jalview_project", new String[]{choice}),
                    choice.hashCode());
            try
            {
              Cache.log.error("Problems whilst loading project from "
                      + choice, ex);
              JOptionPane.showMessageDialog(Desktop.desktop,
-                     "Error whilst loading project from " + choice,
-                     "Couldn't load project", JOptionPane.WARNING_MESSAGE);
+                       MessageManager.formatMessage("label.error_whilst_loading_project_from", new String[]{choice}),
+                     MessageManager.getString("label.couldnt_load_project"), JOptionPane.WARNING_MESSAGE);
            }
            setProgressBar(null, choice.hashCode());
          }
    {
      if (fileLoadingCount == 0)
      {
-       fileLoadingPanels.add(addProgressPanel("Loading File: " + fileName
-               + "   "));
+       fileLoadingPanels.add(addProgressPanel(MessageManager.formatMessage("label.loading_file", new String[]{fileName})));
      }
      fileLoadingCount++;
    }
                jalview.bin.Cache.getProperty("LAST_DIRECTORY"));
  
        chooser.setFileView(new JalviewFileView());
-       chooser.setDialogTitle("Open a saved VAMSAS session");
+       chooser.setDialogTitle(MessageManager.getString("label.open_saved_vamsas_session"));
        chooser.setToolTipText(MessageManager
                .getString("label.select_vamsas_session_opened_as_new_vamsas_session"));
  
        return false;
      }
  
-     setProgressBar("Importing VAMSAS session from " + file.getName(),
+     setProgressBar(MessageManager.formatMessage("status.importing_vamsas_session_from", new String[]{file.getName()}),
              file.hashCode());
      try
      {
        v_client = new jalview.gui.VamsasApplication(this, file, null);
      } catch (Exception ex)
      {
-       setProgressBar("Importing VAMSAS session from " + file.getName(),
-               file.hashCode());
+         setProgressBar(MessageManager.formatMessage("status.importing_vamsas_session_from", new String[]{file.getName()}),
+                 file.hashCode());
        jalview.bin.Cache.log.error(
                "New vamsas session from existing session file failed:", ex);
        return false;
      }
      setupVamsasConnectedGui();
      v_client.initial_update(); // TODO: thread ?
-     setProgressBar("Importing VAMSAS session from " + file.getName(),
+     setProgressBar(MessageManager.formatMessage("status.importing_vamsas_session_from", new String[]{file.getName()}),
              file.hashCode());
      return v_client.inSession();
    }
    {
      if (v_client != null)
      {
-       throw new Error(
-               "Trying to join a vamsas session when another is already connected.");
+       throw new Error(MessageManager.getString("error.try_join_vamsas_session_another"));
      }
      if (mysesid == null)
      {
-       throw new Error("Invalid vamsas session id.");
+       throw new Error(MessageManager.getString("error.invalid_vamsas_session_id"));
      }
      v_client = new VamsasApplication(this, mysesid);
      setupVamsasConnectedGui();
                { "Vamsas Document" }, "Vamsas Document");
  
        chooser.setFileView(new JalviewFileView());
-       chooser.setDialogTitle("Save Vamsas Document Archive");
+       chooser.setDialogTitle(MessageManager.getString("label.save_vamsas_document_archive"));
  
        int value = chooser.showSaveDialog(this);
  
        if (value == JalviewFileChooser.APPROVE_OPTION)
        {
          java.io.File choice = chooser.getSelectedFile();
-         JPanel progpanel = addProgressPanel("Saving VAMSAS Document to "
-                 + choice.getName());
+         JPanel progpanel = addProgressPanel(MessageManager.formatMessage("label.saving_vamsas_doc", new String[]{choice.getName()}));
          jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice.getParent());
          String warnmsg = null;
          String warnttl = null;
      }
      if (b)
      {
-       vamUpdate = this.addProgressPanel("Updating vamsas session");
+       vamUpdate = this.addProgressPanel(MessageManager.getString("label.updating_vamsas_session"));
      }
      vamsasStart.setVisible(!b);
      vamsasStop.setVisible(!b);
      // use reflection to avoid creating compilation dependency.
      if (!jalview.bin.Cache.groovyJarsPresent())
      {
-       throw new Error(
-               "Implementation Error. Cannot create groovyShell without Groovy on the classpath!");
+       throw new Error(MessageManager.getString("error.implementation_error_cannot_create_groovyshell"));
      }
      try
      {
                .showInternalMessageDialog(
                        Desktop.desktop,
  
-                       "Couldn't create the groovy Shell. Check the error log for the details of what went wrong.",
-                       "Jalview Groovy Support Failed",
+                       MessageManager.getString("label.couldnt_create_groovy_shell"),
+                       MessageManager.getString("label.groovy_support_failed"),
                        JOptionPane.ERROR_MESSAGE);
      }
    }
    {
      if (progressBarHandlers == null || !progressBars.contains(new Long(id)))
      {
-       throw new Error(
-               "call setProgressBar before registering the progress bar's handler.");
+       throw new Error(MessageManager.getString("error.call_setprogressbar_before_registering_handler"));
      }
      progressBarHandlers.put(new Long(id), handler);
 -    final JPanel progressPanel = (JPanel) progressBars.get(new Long(id));
 +    final JPanel progressPanel = progressBars.get(new Long(id));
      if (handler.canCancel())
      {
        JButton cancel = new JButton(
          public void actionPerformed(ActionEvent e)
          {
            handler.cancelActivity(id);
-           us.setProgressBar(
-                   "Cancelled "
-                           + ((JLabel) progressPanel.getComponent(0))
-                                   .getText(), id);
+           us.setProgressBar(MessageManager.formatMessage("label.cancelled_params", new String[]{((JLabel) progressPanel.getComponent(0)).getText()}), id);
          }
        });
        progressPanel.add(cancel, BorderLayout.EAST);
          {
            if (progress != null)
            {
-             progress.setProgressBar("Opening " + url, this.hashCode());
+             progress.setProgressBar(MessageManager.formatMessage("status.opening_params", new String[]{url}), this.hashCode());
            }
            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",
+                           MessageManager.getString("label.web_browser_not_found_unix"),
+                           MessageManager.getString("label.web_browser_not_found"),
                            JOptionPane.WARNING_MESSAGE);
  
            ex.printStackTrace();
   */
  package jalview.gui;
  
  import jalview.analysis.AlignmentSorter;
  import jalview.bin.Cache;
  import jalview.commands.OrderCommand;
--import jalview.datamodel.*;
--import jalview.io.*;
++import jalview.datamodel.AlignmentI;
++import jalview.datamodel.SequenceFeature;
++import jalview.datamodel.SequenceGroup;
++import jalview.datamodel.SequenceI;
++import jalview.io.JalviewFileChooser;
  import jalview.schemes.AnnotationColourGradient;
  import jalview.schemes.GraduatedColor;
  import jalview.util.MessageManager;
  import jalview.ws.dbsources.das.api.jalviewSourceI;
  
++import java.awt.BorderLayout;
++import java.awt.Color;
++import java.awt.Component;
++import java.awt.Font;
++import java.awt.Graphics;
++import java.awt.GridLayout;
++import java.awt.Rectangle;
++import java.awt.event.ActionEvent;
++import java.awt.event.ActionListener;
++import java.awt.event.ItemEvent;
++import java.awt.event.ItemListener;
++import java.awt.event.MouseAdapter;
++import java.awt.event.MouseEvent;
++import java.awt.event.MouseMotionAdapter;
++import java.beans.PropertyChangeEvent;
++import java.beans.PropertyChangeListener;
++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.ArrayList;
++import java.util.Hashtable;
++import java.util.Iterator;
++import java.util.List;
++import java.util.Vector;
++
++import javax.swing.AbstractCellEditor;
++import javax.swing.BorderFactory;
++import javax.swing.Icon;
++import javax.swing.JButton;
++import javax.swing.JCheckBox;
++import javax.swing.JCheckBoxMenuItem;
++import javax.swing.JColorChooser;
++import javax.swing.JDialog;
++import javax.swing.JInternalFrame;
++import javax.swing.JLabel;
++import javax.swing.JLayeredPane;
++import javax.swing.JMenuItem;
++import javax.swing.JOptionPane;
++import javax.swing.JPanel;
++import javax.swing.JPopupMenu;
++import javax.swing.JScrollPane;
++import javax.swing.JSlider;
++import javax.swing.JTabbedPane;
++import javax.swing.JTable;
++import javax.swing.ListSelectionModel;
++import javax.swing.SwingConstants;
++import javax.swing.SwingUtilities;
++import javax.swing.event.ChangeEvent;
++import javax.swing.event.ChangeListener;
++import javax.swing.table.AbstractTableModel;
++import javax.swing.table.TableCellEditor;
++import javax.swing.table.TableCellRenderer;
++
  public class FeatureSettings extends JPanel
  {
    DasSourceBrowser dassourceBrowser;
                    (String) table.getValueAt(selectedRow, 0));
          }
        }
++
++      // isPopupTrigger fires on mouseReleased on Mac
++      @Override
++      public void mouseReleased(MouseEvent evt)
++      {
++        selectedRow = table.rowAtPoint(evt.getPoint());
++        if (evt.isPopupTrigger())
++        {
++          popupSort(selectedRow, (String) table.getValueAt(selectedRow, 0),
++                  table.getValueAt(selectedRow, 1), fr.minmax, evt.getX(),
++                  evt.getY());
++        }
++      }
      });
  
      table.addMouseMotionListener(new MouseMotionAdapter()
          }
        }
      });
-     table.setToolTipText("<html>"
-             + JvSwingUtils
-                     .wrapTooltip("Click/drag feature types up or down to change render order.<br/>Double click to select columns containing feature in alignment/current selection<br/>Pressing Alt will select columns outside features rather than inside<br/>Pressing Shift to modify current selection (rather than clear current selection)<br/>Press CTRL or Command/Meta to toggle columns in/outside features<br/>")
-             + "</html>");
+     table.setToolTipText(JvSwingUtils
+                     .wrapTooltip(true, MessageManager.getString("label.feature_settings_click_drag")));
      scrollPane.setViewportView(table);
  
      dassourceBrowser = new DasSourceBrowser(this);
              { "fc" }, new String[]
              { "Sequence Feature Colours" }, "Sequence Feature Colours");
      chooser.setFileView(new jalview.io.JalviewFileView());
-     chooser.setDialogTitle("Load Feature Colours");
+     chooser.setDialogTitle(MessageManager.getString("label.load_feature_colours"));
      chooser.setToolTipText(MessageManager.getString("action.load"));
  
      int value = chooser.showOpenDialog(this);
                  file), "UTF-8");
  
          jalview.schemabinding.version2.JalviewUserColours jucs = new jalview.schemabinding.version2.JalviewUserColours();
--        jucs = (jalview.schemabinding.version2.JalviewUserColours) jucs
++        jucs = jucs
                  .unmarshal(in);
  
          for (int i = jucs.getColourCount() - 1; i >= 0; i--)
              { "fc" }, new String[]
              { "Sequence Feature Colours" }, "Sequence Feature Colours");
      chooser.setFileView(new jalview.io.JalviewFileView());
-     chooser.setDialogTitle("Save Feature Colour Scheme");
+     chooser.setDialogTitle(MessageManager.getString("label.save_feature_colours"));
      chooser.setToolTipText(MessageManager.getString("action.save"));
  
      int value = chooser.showSaveDialog(this);
      {
        public void stateChanged(ChangeEvent evt)
        {
--        fr.setTransparency((float) (100 - transparency.getValue()) / 100f);
++        fr.setTransparency((100 - transparency.getValue()) / 100f);
          af.alignPanel.paintAlignment(true);
        }
      });
        }
      });
      this.add(tabbedPane, java.awt.BorderLayout.CENTER);
-     tabbedPane.addTab("Feature Settings", settingsPane);
-     tabbedPane.addTab("DAS Settings", dasSettingsPane);
+     tabbedPane.addTab(MessageManager.getString("label.feature_settings"), settingsPane);
+     tabbedPane.addTab(MessageManager.getString("label.das_settings"), dasSettingsPane);
      bigPanel.add(transPanel, java.awt.BorderLayout.SOUTH);
      transbuttons.add(optimizeOrder);
      transbuttons.add(invert);
      }
  
      private String[] columnNames =
-     { "Feature Type", "Colour", "Display" };
+     { MessageManager.getString("label.feature_type"), MessageManager.getString("action.colour"), MessageManager.getString("label.display") };
  
      private Object[][] data;
  
   */
  package jalview.gui;
  
 -import java.awt.*;
 -import java.awt.event.*;
 -import java.util.List;
 -import java.util.Vector;
 -
 -import javax.swing.*;
 -
 -import jalview.datamodel.*;
 +import jalview.datamodel.Sequence;
 +import jalview.datamodel.SequenceFeature;
 +import jalview.datamodel.SequenceGroup;
 +import jalview.datamodel.SequenceI;
  import jalview.io.SequenceAnnotationReport;
+ import jalview.util.MessageManager;
  import jalview.util.UrlLink;
  
 +import java.awt.BorderLayout;
 +import java.awt.event.MouseEvent;
 +import java.awt.event.MouseListener;
 +import java.awt.event.MouseMotionListener;
 +import java.awt.event.MouseWheelEvent;
 +import java.awt.event.MouseWheelListener;
 +import java.util.List;
 +import java.util.Vector;
 +
 +import javax.swing.JOptionPane;
 +import javax.swing.JPanel;
 +import javax.swing.SwingUtilities;
 +import javax.swing.ToolTipManager;
 +
  /**
 - * DOCUMENT ME!
 + * This panel hosts alignment sequence ids and responds to mouse clicks on them,
 + * as well as highlighting ids matched by a search from the Find menu.
   * 
   * @author $author$
   * @version $Revision$
@@@ -74,7 -64,9 +75,7 @@@ public class IdPanel extends JPanel imp
     * Creates a new IdPanel object.
     * 
     * @param av
 -   *          DOCUMENT ME!
     * @param parent
 -   *          DOCUMENT ME!
     */
    public IdPanel(AlignViewport av, AlignmentPanel parent)
    {
@@@ -92,8 -84,7 +93,8 @@@
    }
  
    /**
 -   * DOCUMENT ME!
 +   * Respond to mouse movement by constructing tooltip text for the sequence id
 +   * under the mouse.
     * 
     * @param e
     *          DOCUMENT ME!
      if (seq > -1 && seq < av.getAlignment().getHeight())
      {
        SequenceI sequence = av.getAlignment().getSequenceAt(seq);
 -      StringBuffer tip = new StringBuffer();
 +      StringBuffer tip = new StringBuffer(64);
        seqAnnotReport
                .createSequenceAnnotationReport(tip, sequence,
                        av.isShowDbRefs(), av.isShowNpFeats(),
    }
  
    /**
 -   * DOCUMENT ME!
 +   * Responds to a mouse drag by selecting the sequences under the dragged
 +   * region.
     * 
     * @param e
 -   *          DOCUMENT ME!
     */
    @Override
    public void mouseDragged(MouseEvent e)
      alignPanel.paintAlignment(true);
    }
  
 +  /**
 +   * Response to the mouse wheel by scrolling the alignment panel.
 +   */
    @Override
    public void mouseWheelMoved(MouseWheelEvent e)
    {
        if (e.isShiftDown())
        {
          alignPanel.scrollRight(true);
 -
        }
        else
        {
    }
  
    /**
 -   * DOCUMENT ME!
 +   * Handle a mouse click event. Currently only responds to a double-click. The
 +   * action is to try to open a browser window at a URL that searches for the
 +   * selected sequence id. The search URL is configured in Preferences |
 +   * Connections | URL link from Sequence ID. For example:
 +   * 
 +   * http://www.ebi.ac.uk/ebisearch/search.ebi?db=allebi&query=$SEQUENCE_ID$
     * 
     * @param e
 -   *          DOCUMENT ME!
     */
    @Override
    public void mouseClicked(MouseEvent e)
    {
 -    if (e.getClickCount() < 2)
 +    /*
 +     * Ignore single click. Ignore 'left' click followed by 'right' click (user
 +     * selects a row then its pop-up menu).
 +     */
 +    if (e.getClickCount() < 2 || SwingUtilities.isRightMouseButton(e))
      {
        return;
      }
  
 -    java.util.Vector links = Preferences.sequenceURLLinks;
 +    Vector links = Preferences.sequenceURLLinks;
      if (links == null || links.size() < 1)
      {
        return;
        JOptionPane
                .showInternalMessageDialog(
                        Desktop.desktop,
-                       "Unixers: Couldn't find default web browser."
-                               + "\nAdd the full path to your browser in Preferences.",
-                       "Web browser not found", JOptionPane.WARNING_MESSAGE);
+                       MessageManager.getString("label.web_browser_not_found_unix"),
+                       MessageManager.getString("label.web_browser_not_found"), JOptionPane.WARNING_MESSAGE);
        ex.printStackTrace();
      }
 -
    }
  
    /**
    }
  
    /**
 -   * DOCUMENT ME!
 +   * Respond to a mouse press. Does nothing for (left) double-click as this is
 +   * handled by mouseClicked().
 +   * 
 +   * Right mouse down - construct and show context menu.
 +   * 
 +   * Ctrl-down or Shift-down - add to or expand current selection group if there
 +   * is one.
 +   * 
 +   * Mouse down - select this sequence.
     * 
     * @param e
 -   *          DOCUMENT ME!
     */
    @Override
    public void mousePressed(MouseEvent e)
    {
 -    if (e.getClickCount() == 2)
 +    if (e.getClickCount() == 2 && SwingUtilities.isLeftMouseButton(e))
      {
        return;
      }
  
      int seq = alignPanel.seqPanel.findSeq(e);
  
 -    if (javax.swing.SwingUtilities.isRightMouseButton(e))
 +    if (SwingUtilities.isRightMouseButton(e))
      {
        Sequence sq = (Sequence) av.getAlignment().getSequenceAt(seq);
        // build a new links menu based on the current links + any non-positional
    }
  
    /**
 -   * DOCUMENT ME!
 +   * Toggle whether the sequence is part of the current selection group.
     * 
     * @param seq
 -   *          DOCUMENT ME!
     */
    void selectSeq(int seq)
    {
    }
  
    /**
 -   * DOCUMENT ME!
 +   * Add contiguous rows of the alignment to the current selection group. Does
 +   * nothing if there is no selection group.
     * 
     * @param start
 -   *          DOCUMENT ME!
     * @param end
 -   *          DOCUMENT ME!
     */
    void selectSeqs(int start, int end)
    {
    }
  
    /**
 -   * DOCUMENT ME!
 +   * Respond to mouse released. Refreshes the display and triggers broadcast of
 +   * the new selection group to any listeners.
     * 
     * @param e
 -   *          DOCUMENT ME!
     */
    @Override
    public void mouseReleased(MouseEvent e)
    }
  
    /**
 -   * DOCUMENT ME!
 +   * Highlight sequence ids that match the given list, and if necessary scroll
 +   * to the start sequence of the list.
     * 
     * @param list
 -   *          DOCUMENT ME!
     */
    public void highlightSearchResults(List<SequenceI> list)
    {
@@@ -20,7 -20,6 +20,7 @@@
   */
  package jalview.jbgui;
  
 +import jalview.bin.Cache;
  import jalview.schemes.ColourSchemeProperty;
  import jalview.util.MessageManager;
  
@@@ -303,10 -302,6 +303,10 @@@ public class GAlignFrame extends JInter
  
    JMenuItem showAllhidden = new JMenuItem();
  
 +  protected JMenuItem showAllAnnotations = new JMenuItem();
 +
 +  protected JMenuItem hideAllAnnotations = new JMenuItem();
 +
    protected JCheckBoxMenuItem hiddenMarkers = new JCheckBoxMenuItem();
  
    JMenuItem invertColSel = new JMenuItem();
  
          item.addActionListener(new java.awt.event.ActionListener()
          {
 +          @Override
            public void actionPerformed(ActionEvent e)
            {
              outputText_actionPerformed(e);
        }
      } catch (Exception e)
      {
 +      System.err.println(e.toString());
      }
  
      if (!new jalview.util.Platform().isAMac())
          radioItem.setName("USER_DEFINED");
          radioItem.addMouseListener(new MouseAdapter()
          {
 +          @Override
            public void mousePressed(MouseEvent evt)
            {
              if (evt.isControlDown()
                {
                  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);
                      | java.awt.event.KeyEvent.SHIFT_MASK, false));
      saveAs.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          saveAs_actionPerformed(e);
                      .getMenuShortcutKeyMask(), false));
      closeMenuItem.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          closeMenuItem_actionPerformed(false);
      selectAllSequenceMenuItem
              .addActionListener(new java.awt.event.ActionListener()
              {
 +              @Override
                public void actionPerformed(ActionEvent e)
                {
                  selectAllSequenceMenuItem_actionPerformed(e);
      deselectAllSequenceMenuItem
              .addActionListener(new java.awt.event.ActionListener()
              {
 +              @Override
                public void actionPerformed(ActionEvent e)
                {
                  deselectAllSequenceMenuItem_actionPerformed(e);
      invertSequenceMenuItem
              .addActionListener(new java.awt.event.ActionListener()
              {
 +              @Override
                public void actionPerformed(ActionEvent e)
                {
                  invertSequenceMenuItem_actionPerformed(e);
              .getString("action.make_groups_selection"));
      grpsFromSelection.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          makeGrpsFromSelection_actionPerformed(e);
      remove2LeftMenuItem
              .addActionListener(new java.awt.event.ActionListener()
              {
 +              @Override
                public void actionPerformed(ActionEvent e)
                {
                  remove2LeftMenuItem_actionPerformed(e);
      remove2RightMenuItem
              .addActionListener(new java.awt.event.ActionListener()
              {
 +              @Override
                public void actionPerformed(ActionEvent e)
                {
                  remove2RightMenuItem_actionPerformed(e);
      removeGappedColumnMenuItem
              .addActionListener(new java.awt.event.ActionListener()
              {
 +              @Override
                public void actionPerformed(ActionEvent e)
                {
                  removeGappedColumnMenuItem_actionPerformed(e);
      removeAllGapsMenuItem
              .addActionListener(new java.awt.event.ActionListener()
              {
 +              @Override
                public void actionPerformed(ActionEvent e)
                {
                  removeAllGapsMenuItem_actionPerformed(e);
      justifyLeftMenuItem
              .addActionListener(new java.awt.event.ActionListener()
              {
 +              @Override
                public void actionPerformed(ActionEvent e)
                {
                  justifyLeftMenuItem_actionPerformed(e);
      justifyRightMenuItem
              .addActionListener(new java.awt.event.ActionListener()
              {
 +              @Override
                public void actionPerformed(ActionEvent e)
                {
                  justifyRightMenuItem_actionPerformed(e);
      viewBoxesMenuItem.setState(true);
      viewBoxesMenuItem.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          viewBoxesMenuItem_actionPerformed(e);
      viewTextMenuItem.setState(true);
      viewTextMenuItem.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          viewTextMenuItem_actionPerformed(e);
      showNonconservedMenuItem
              .addActionListener(new java.awt.event.ActionListener()
              {
 +              @Override
                public void actionPerformed(ActionEvent e)
                {
                  showUnconservedMenuItem_actionPerformed(e);
      sortPairwiseMenuItem
              .addActionListener(new java.awt.event.ActionListener()
              {
 +              @Override
                public void actionPerformed(ActionEvent e)
                {
                  sortPairwiseMenuItem_actionPerformed(e);
      sortIDMenuItem.setText(MessageManager.getString("action.by_id"));
      sortIDMenuItem.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          sortIDMenuItem_actionPerformed(e);
      sortLengthMenuItem
              .addActionListener(new java.awt.event.ActionListener()
              {
 +              @Override
                public void actionPerformed(ActionEvent e)
                {
                  sortLengthMenuItem_actionPerformed(e);
      sortGroupMenuItem.setText(MessageManager.getString("action.by_group"));
      sortGroupMenuItem.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          sortGroupMenuItem_actionPerformed(e);
        }
      });
      removeRedundancyMenuItem.setText(MessageManager
-             .getString("action.remove_redundancy"));
+             .getString("action.remove_redundancy").concat("..."));
      removeRedundancyMenuItem.setAccelerator(javax.swing.KeyStroke
              .getKeyStroke(java.awt.event.KeyEvent.VK_D, Toolkit
                      .getDefaultToolkit().getMenuShortcutKeyMask(), false));
      removeRedundancyMenuItem
              .addActionListener(new java.awt.event.ActionListener()
              {
 +              @Override
                public void actionPerformed(ActionEvent e)
                {
                  removeRedundancyMenuItem_actionPerformed(e);
      pairwiseAlignmentMenuItem
              .addActionListener(new java.awt.event.ActionListener()
              {
 +              @Override
                public void actionPerformed(ActionEvent e)
                {
                  pairwiseAlignmentMenuItem_actionPerformed(e);
              .getString("label.principal_component_analysis"));
      PCAMenuItem.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          PCAMenuItem_actionPerformed(e);
      averageDistanceTreeMenuItem
              .addActionListener(new java.awt.event.ActionListener()
              {
 +              @Override
                public void actionPerformed(ActionEvent e)
                {
                  averageDistanceTreeMenuItem_actionPerformed(e);
      neighbourTreeMenuItem
              .addActionListener(new java.awt.event.ActionListener()
              {
 +              @Override
                public void actionPerformed(ActionEvent e)
                {
                  neighbourTreeMenuItem_actionPerformed(e);
  
      clustalColour.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          clustalColour_actionPerformed(e);
      zappoColour.setText(MessageManager.getString("label.zappo"));
      zappoColour.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          zappoColour_actionPerformed(e);
      taylorColour.setText(MessageManager.getString("label.taylor"));
      taylorColour.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          taylorColour_actionPerformed(e);
      hydrophobicityColour
              .addActionListener(new java.awt.event.ActionListener()
              {
 +              @Override
                public void actionPerformed(ActionEvent e)
                {
                  hydrophobicityColour_actionPerformed(e);
      helixColour.setText(MessageManager.getString("label.helix_propensity"));
      helixColour.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          helixColour_actionPerformed(e);
              .getString("label.strand_propensity"));
      strandColour.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          strandColour_actionPerformed(e);
      turnColour.setText(MessageManager.getString("label.turn_propensity"));
      turnColour.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          turnColour_actionPerformed(e);
      buriedColour.setText(MessageManager.getString("label.buried_index"));
      buriedColour.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          buriedColour_actionPerformed(e);
              .getString("action.user_defined"));
      userDefinedColour.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          userDefinedColour_actionPerformed(e);
              .setText(MessageManager.getString("label.percentage_identity"));
      PIDColour.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          PIDColour_actionPerformed(e);
              .setText(MessageManager.getString("label.blosum62_score"));
      BLOSUM62Colour.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          BLOSUM62Colour_actionPerformed(e);
      nucleotideColour.setText(MessageManager.getString("label.nucleotide"));
      nucleotideColour.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          nucleotideColour_actionPerformed(e);
      purinePyrimidineColour
              .addActionListener(new java.awt.event.ActionListener()
              {
 +              @Override
                public void actionPerformed(ActionEvent e)
                {
                  purinePyrimidineColour_actionPerformed(e);
      RNAInteractionColour
              .addActionListener(new java.awt.event.ActionListener()
              {
 +              @Override
                public void actionPerformed(ActionEvent e)
                {
                  RNAInteractionColour_actionPerformed(e);
      avDistanceTreeBlosumMenuItem
              .addActionListener(new java.awt.event.ActionListener()
              {
 +              @Override
                public void actionPerformed(ActionEvent e)
                {
                  avTreeBlosumMenuItem_actionPerformed(e);
      njTreeBlosumMenuItem
              .addActionListener(new java.awt.event.ActionListener()
              {
 +              @Override
                public void actionPerformed(ActionEvent e)
                {
                  njTreeBlosumMenuItem_actionPerformed(e);
      annotationPanelMenuItem.setActionCommand("");
      annotationPanelMenuItem.setText(MessageManager
              .getString("label.show_annotations"));
 -    annotationPanelMenuItem.setState(jalview.bin.Cache.getDefault(
 -            "SHOW_ANNOTATIONS", true));
 -    annotationPanelMenuItem
 -            .addActionListener(new java.awt.event.ActionListener()
 -            {
 -              public void actionPerformed(ActionEvent e)
 -              {
 -                annotationPanelMenuItem_actionPerformed(e);
 -              }
 -            });
 +    annotationPanelMenuItem.setState(Cache.getDefault("SHOW_ANNOTATIONS",
 +            true));
 +    annotationPanelMenuItem.addActionListener(new ActionListener()
 +    {
 +      @Override
 +      public void actionPerformed(ActionEvent e)
 +      {
 +        annotationPanelMenuItem_actionPerformed(e);
 +      }
 +    });
 +    /*
 +     * Show/hide all annotations only enabled if annotation panel is shown
 +     */
 +    showAllAnnotations.setText(MessageManager
 +            .getString("label.show_all_annotations"));
 +    showAllAnnotations.setEnabled(annotationPanelMenuItem.getState());
 +    showAllAnnotations.addActionListener(new ActionListener()
 +    {
 +      @Override
 +      public void actionPerformed(ActionEvent e)
 +      {
 +        showAllAnnotations_actionPerformed();
 +      }
 +    });
 +    hideAllAnnotations.setText(MessageManager
 +            .getString("label.hide_all_annotations"));
 +    hideAllAnnotations.setEnabled(annotationPanelMenuItem.getState());
 +    hideAllAnnotations.addActionListener(new ActionListener()
 +    {
 +      @Override
 +      public void actionPerformed(ActionEvent e)
 +      {
 +        hideAllAnnotations_actionPerformed();
 +      }
 +    });
      colourTextMenuItem.setText(MessageManager
              .getString("label.colour_text"));
      colourTextMenuItem
              .addActionListener(new java.awt.event.ActionListener()
              {
 +              @Override
                public void actionPerformed(ActionEvent e)
                {
                  colourTextMenuItem_actionPerformed(e);
      htmlMenuItem.setText(MessageManager.getString("label.html"));
      htmlMenuItem.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          htmlMenuItem_actionPerformed(e);
              .getString("label.overview_window"));
      overviewMenuItem.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          overviewMenuItem_actionPerformed(e);
                      .getMenuShortcutKeyMask(), false));
      undoMenuItem.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          undoMenuItem_actionPerformed(e);
                      .getMenuShortcutKeyMask(), false));
      redoMenuItem.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          redoMenuItem_actionPerformed(e);
      conservationMenuItem
              .addActionListener(new java.awt.event.ActionListener()
              {
 +              @Override
                public void actionPerformed(ActionEvent e)
                {
                  conservationMenuItem_actionPerformed(e);
      noColourmenuItem.setText(MessageManager.getString("label.none"));
      noColourmenuItem.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          noColourmenuItem_actionPerformed(e);
      wrapMenuItem.setText(MessageManager.getString("label.wrap"));
      wrapMenuItem.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          wrapMenuItem_actionPerformed(e);
                      .getMenuShortcutKeyMask(), false));
      printMenuItem.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          printMenuItem_actionPerformed(e);
      renderGapsMenuItem
              .addActionListener(new java.awt.event.ActionListener()
              {
 +              @Override
                public void actionPerformed(ActionEvent e)
                {
                  renderGapsMenuItem_actionPerformed(e);
      findMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
              java.awt.event.KeyEvent.VK_F, Toolkit.getDefaultToolkit()
                      .getMenuShortcutKeyMask(), false));
 +    findMenuItem.setToolTipText(MessageManager.getString("label.find_tip"));
      findMenuItem.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          findMenuItem_actionPerformed(e);
              .getString("label.above_identity_threshold"));
      abovePIDThreshold.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          abovePIDThreshold_actionPerformed(e);
              .getString("label.show_sequence_features"));
      showSeqFeatures.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent actionEvent)
        {
          showSeqFeatures_actionPerformed(actionEvent);
      showDbRefsMenuitem.addActionListener(new ActionListener()
      {
  
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          showDbRefs_actionPerformed(e);
      showNpFeatsMenuitem.addActionListener(new ActionListener()
      {
  
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          showNpFeats_actionPerformed(e);
      showGroupConservation.addActionListener(new ActionListener()
      {
  
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          showGroupConservation_actionPerformed(e);
      showGroupConsensus.addActionListener(new ActionListener()
      {
  
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          showGroupConsensus_actionPerformed(e);
      showConsensusHistogram.addActionListener(new ActionListener()
      {
  
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          showConsensusHistogram_actionPerformed(e);
      showSequenceLogo.addActionListener(new ActionListener()
      {
  
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          showSequenceLogo_actionPerformed(e);
      normaliseSequenceLogo.addActionListener(new ActionListener()
      {
  
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          normaliseSequenceLogo_actionPerformed(e);
      applyAutoAnnotationSettings.addActionListener(new ActionListener()
      {
  
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          applyAutoAnnotationSettings_actionPerformed(e);
      nucleotideColour.setText(MessageManager.getString("label.nucleotide"));
      nucleotideColour.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          nucleotideColour_actionPerformed(e);
                      .getMenuShortcutKeyMask(), false));
      deleteGroups.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          deleteGroups_actionPerformed(e);
                      .getMenuShortcutKeyMask(), false));
      createGroup.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          createGroup_actionPerformed(e);
                      | java.awt.event.KeyEvent.SHIFT_MASK, false));
      unGroup.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          unGroup_actionPerformed(e);
  
      copy.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          copy_actionPerformed(e);
                      .getMenuShortcutKeyMask(), false));
      cut.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          cut_actionPerformed(e);
        }
      });
      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()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          delete_actionPerformed(e);
                      | java.awt.event.KeyEvent.SHIFT_MASK, false));
      pasteNew.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          pasteNew_actionPerformed(e);
                      .getMenuShortcutKeyMask(), false));
      pasteThis.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          pasteThis_actionPerformed(e);
              .getString("label.apply_colour_to_all_groups"));
      applyToAllGroups.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          applyToAllGroups_actionPerformed(e);
      });
      createPNG.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          createPNG(null);
      font.setText(MessageManager.getString("action.font"));
      font.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          font_actionPerformed(e);
      seqLimits.setState(jalview.bin.Cache.getDefault("SHOW_JVSUFFIX", true));
      seqLimits.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          seqLimit_actionPerformed(e);
      epsFile.setText("EPS");
      epsFile.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          createEPS(null);
              .getString("label.load_associated_tree"));
      LoadtreeMenuItem.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          LoadtreeMenuItem_actionPerformed(e);
      scaleAbove.setText(MessageManager.getString("action.scale_above"));
      scaleAbove.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          scaleAbove_actionPerformed(e);
      scaleLeft.setText(MessageManager.getString("action.scale_left"));
      scaleLeft.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          scaleLeft_actionPerformed(e);
      scaleRight.setText(MessageManager.getString("action.scale_right"));
      scaleRight.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          scaleRight_actionPerformed(e);
      centreColumnLabelsMenuItem
              .addActionListener(new java.awt.event.ActionListener()
              {
 +              @Override
                public void actionPerformed(ActionEvent e)
                {
                  centreColumnLabels_actionPerformed(e);
      followHighlightMenuItem.addActionListener(new ActionListener()
      {
  
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          followHighlight_actionPerformed();
              .getString("label.modify_identity_thereshold"));
      modifyPID.addActionListener(new java.awt.event.ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          modifyPID_actionPerformed(e);
      modifyConservation
              .addActionListener(new java.awt.event.ActionListener()
              {
 +              @Override
                public void actionPerformed(ActionEvent e)
                {
                  modifyConservation_actionPerformed(e);
      sort.setText(MessageManager.getString("action.sort"));
      sort.addMenuListener(new MenuListener()
      {
 +      @Override
        public void menuSelected(MenuEvent e)
        {
          buildTreeMenu();
        }
  
 +      @Override
        public void menuDeselected(MenuEvent e)
        {
        }
  
 +      @Override
        public void menuCanceled(MenuEvent e)
        {
        }
      sortByAnnotScore.addMenuListener(new javax.swing.event.MenuListener()
      {
  
 +      @Override
        public void menuCanceled(MenuEvent e)
        {
        }
  
 +      @Override
        public void menuDeselected(MenuEvent e)
        {
        }
  
 +      @Override
        public void menuSelected(MenuEvent e)
        {
          buildSortByAnnotationScoresMenu();
              .getDefault("PAD_GAPS", false));
      padGapsMenuitem.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          padGapsMenuitem_actionPerformed(e);
      vamsasStore.setText(MessageManager.getString("label.vamsas_store"));
      vamsasStore.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          vamsasStore_actionPerformed(e);
              .getString("label.translate_cDNA"));
      showTranslation.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          showTranslation_actionPerformed(e);
              + "...");
      extractScores.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          extractScores_actionPerformed(e);
              .getString("label.feature_settings"));
      openFeatureSettings.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          featureSettings_actionPerformed(e);
              .setText(MessageManager.getString("label.fetch_sequences"));
      fetchSequence.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          fetchSequence_actionPerformed(e);
              .getString("action.by_annotation"));
      annotationColour.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          annotationColour_actionPerformed(e);
              .getString("action.by_rna_helixes"));
      rnahelicesColour.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          rnahelicesColour_actionPerformed(e);
              .getString("label.load_features_annotations"));
      associatedData.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          associatedData_actionPerformed(e);
              "AUTO_CALC_CONSENSUS", true));
      autoCalculate.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          autoCalculate_actionPerformed(e);
              .setState(jalview.bin.Cache.getDefault("SORT_BY_TREE", false));
      sortByTree.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          sortByTreeOption_actionPerformed(e);
      listenToViewSelections.setState(false);
      listenToViewSelections.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          listenToViewSelections_actionPerformed(e);
      addFromFile.setText(MessageManager.getString("label.from_file"));
      addFromFile.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          addFromFile_actionPerformed(e);
      addFromText.setText(MessageManager.getString("label.from_textbox"));
      addFromText.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          addFromText_actionPerformed(e);
      addFromURL.setText(MessageManager.getString("label.from_url"));
      addFromURL.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          addFromURL_actionPerformed(e);
              .getString("label.export_features"));
      exportFeatures.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          exportFeatures_actionPerformed(e);
              .getString("label.export_annotations"));
      exportAnnotations.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          exportAnnotations_actionPerformed(e);
              .getString("label.toggle_sequence_visibility"));
      showAllSeqs.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          showAllSeqs_actionPerformed(e);
              .getString("label.toggle_columns_visibility"));
      showAllColumns.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          showAllColumns_actionPerformed(e);
              .getString("label.toggle_sequence_visibility"));
      hideSelSequences.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          hideSelSequences_actionPerformed(e);
              .getString("label.toggle_columns_visibility"));
      hideSelColumns.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          hideSelColumns_actionPerformed(e);
              .getString("label.selected_region"));
      hideAllSelection.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          hideAllSelection_actionPerformed(e);
              .getString("label.all_but_selected_region"));
      hideAllButSelection.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          hideAllButSelection_actionPerformed(e);
              .getString("label.toggles_visibility_hidden_selected_regions"));
      showAllhidden.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          showAllhidden_actionPerformed(e);
        }
      });
 -
      hiddenMarkers.setText(MessageManager
              .getString("action.show_hidden_markers"));
      hiddenMarkers.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          hiddenMarkers_actionPerformed(e);
                      | java.awt.event.KeyEvent.ALT_MASK, false));
      invertColSel.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          invertColSel_actionPerformed(e);
      });
      tabbedPane.addChangeListener(new javax.swing.event.ChangeListener()
      {
 +      @Override
        public void stateChanged(ChangeEvent evt)
        {
          JTabbedPane pane = (JTabbedPane) evt.getSource();
      });
      tabbedPane.addMouseListener(new MouseAdapter()
      {
 +      @Override
        public void mousePressed(MouseEvent e)
        {
          tabbedPane_mousePressed(e);
      });
      tabbedPane.addFocusListener(new FocusAdapter()
      {
 +      @Override
        public void focusGained(FocusEvent e)
        {
          tabbedPane_focusGained(e);
                      .getMenuShortcutKeyMask(), false));
      save.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          save_actionPerformed(e);
      reload.setText(MessageManager.getString("action.reload"));
      reload.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          reload_actionPerformed(e);
                      .getMenuShortcutKeyMask(), false));
      newView.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          newView_actionPerformed(e);
              + "...");
      textColour.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          textColour_actionPerformed(e);
              .getString("label.right_align_sequence_id"));
      idRightAlign.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          idRightAlign_actionPerformed(e);
              java.awt.event.KeyEvent.VK_G, 0, false));
      gatherViews.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          gatherViews_actionPerformed(e);
              java.awt.event.KeyEvent.VK_X, 0, false));
      expandViews.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          expandViews_actionPerformed(e);
              .setText(MessageManager.getString("action.page_setup") + "...");
      pageSetup.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          pageSetup_actionPerformed(e);
              .getString("label.alignment_props") + "...");
      alignmentProperties.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent actionEvent)
        {
          alignmentProperties();
      viewMenu.addSeparator();
      viewMenu.add(followHighlightMenuItem);
      viewMenu.add(annotationPanelMenuItem);
 +    viewMenu.add(showAllAnnotations);
 +    viewMenu.add(hideAllAnnotations);
      autoAnnMenu.add(applyAutoAnnotationSettings);
      autoAnnMenu.add(showConsensusHistogram);
      autoAnnMenu.add(showSequenceLogo);
      // selectMenu.add(listenToViewSelections);
    }
  
 +  /**
 +   * Action on clicking Show all annotations.
 +   */
 +  protected void showAllAnnotations_actionPerformed()
 +  {
 +    setAllAnnotationsVisibility(true);
 +  }
 +
 +  /**
 +   * Action on clicking Hide all annotations.
 +   */
 +  protected void hideAllAnnotations_actionPerformed()
 +  {
 +    setAllAnnotationsVisibility(false);
 +  }
 +
 +  /**
 +   * Set the visibility of all annotations to true or false.
 +   * 
 +   * @param visible
 +   */
 +  protected void setAllAnnotationsVisibility(boolean visible)
 +  {
 +
 +  }
 +
    protected void normaliseSequenceLogo_actionPerformed(ActionEvent e)
    {
      // TODO Auto-generated method stub
index 0000000,a938dd6..0c25cdb
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,84 +1,91 @@@
+ package jalview.ws.jabaws;
+ import static org.junit.Assert.assertEquals;
+ import static org.junit.Assert.fail;
+ import java.util.ArrayList;
+ import java.util.List;
 -import java.util.function.Consumer;
+ import org.junit.Test;
+ import compbio.data.msa.MsaWS;
+ import compbio.data.msa.RegistryWS;
+ import compbio.data.sequence.FastaSequence;
+ import compbio.metadata.JobStatus;
+ import compbio.ws.client.Jws2Client;
+ import compbio.ws.client.Services;
+ public class MinJabawsClientTests {
+       /**
+        * simple test for the benefit of JAL-1338
+        * @throws Exception
+        */
+       @SuppressWarnings("rawtypes")
+       @Test
+       public void msaTest() throws Exception {
+               String url;
+               RegistryWS registry = Jws2Client
+                               .connectToRegistry(url = "http://www.compbio.dundee.ac.uk/jabaws");
+               if (registry != null) {
+                       MsaWS msaservice = null;
+                       for (Services service : registry.getSupportedServices()) {
+                               if (service.equals(Services.ClustalOWS)) {
+                                       msaservice = (MsaWS) Jws2Client.connect(url, service);
+                                       if (msaservice != null) {
+                                               break;
+                                       }
+                               }
+                       }
+                       if (msaservice == null) {
+                               fail("couldn't find a clustalO service on the public registry");
+                       }
+                       FastaSequence fsq = new FastaSequence("seqA",
+                                       "SESESESESESESESSESESSESESESESESESESESESEEEEEESSESESESESSSSESESESESESESE");
+                       List<FastaSequence> iseqs = new ArrayList<FastaSequence>();
+                       for (int i = 0; i < 9; i++) {
+                               iseqs.add(new FastaSequence(fsq.getId() + i, fsq.getSequence()
+                                               + fsq.getSequence().substring(i + 3, i + 3 + i)));
+                       }
+                       String jobid = msaservice.align(iseqs);
 -                      if (jobid != null) {
 -                              JobStatus js = null;
 -                              do {
 -                                      try {
 -                                              Thread.sleep(500);
 -                                      } catch (InterruptedException q) {
 -                                      }
 -                                      ;
 -                                      js = msaservice.getJobStatus(jobid);
 -                              } while (!js.equals(JobStatus.FAILED)
 -                                              && !js.equals(JobStatus.CANCELLED)
 -                                              && !js.equals(JobStatus.FINISHED));
 -                              assertEquals("Trial alignment failed. State was " + js.name(),
 -                                              js, JobStatus.FINISHED);
 -                              assertEquals(
 -                                              "Mismatch in number of input and result sequences - assume alignment service wasn't interacted with correctly",
 -                                              msaservice.getResult(jobid).getSequences().size(),
 -                                              iseqs.size());
 -                              msaservice.getResult(jobid).getSequences()
 -                                              .forEach(new Consumer<FastaSequence>() {
 -                                                      @Override
 -                                                      public void accept(FastaSequence t) {
 -                                                              System.out.println(">"+t.getId());
 -                                                              System.out.println(t.getFormattedFasta());
 -                                                      }
 -                                              });
++      if (jobid != null)
++      {
++        JobStatus js = null;
++        do
++        {
++          try
++          {
++            Thread.sleep(500);
++          } catch (InterruptedException q)
++          {
++          }
++          ;
++          js = msaservice.getJobStatus(jobid);
++        } while (!js.equals(JobStatus.FAILED)
++                && !js.equals(JobStatus.CANCELLED)
++                && !js.equals(JobStatus.FINISHED));
++        assertEquals("Trial alignment failed. State was " + js.name(), js,
++                JobStatus.FINISHED);
++        assertEquals(
++                "Mismatch in number of input and result sequences - assume alignment service wasn't interacted with correctly",
++                msaservice.getResult(jobid).getSequences().size(),
++                iseqs.size());
++        for (FastaSequence t : msaservice.getResult(jobid).getSequences())
++        {
++          System.out.println(">" + t.getId());
++          System.out.println(t.getFormattedFasta());
++        }
++        // .forEach(new Consumer<FastaSequence>() {
++        // @Override
++        // public void accept(FastaSequence t) {
++        // System.out.println(">"+t.getId());
++        // System.out.println(t.getFormattedFasta());
++        // }
++        // });
+                       }
+               }
+       }
+ }