Merge branch 'develop' into features/JAL-2360colourSchemeApplicability
authorgmungoc <g.m.carstairs@dundee.ac.uk>
Thu, 5 Jan 2017 12:24:37 +0000 (12:24 +0000)
committergmungoc <g.m.carstairs@dundee.ac.uk>
Thu, 5 Jan 2017 12:24:37 +0000 (12:24 +0000)
Conflicts:
src/jalview/gui/PopupMenu.java

1  2 
examples/appletParameters.html
resources/lang/Messages.properties
resources/lang/Messages_es.properties
src/jalview/appletgui/APopupMenu.java
src/jalview/appletgui/AlignFrame.java
src/jalview/bin/JalviewLite.java
src/jalview/gui/PopupMenu.java

@@@ -91,8 -91,9 +91,9 @@@ the applet can be interacted with <em>v
              <td>jnetfile</td>
              <td>fileName</td>
              <td>Secondary structure predictions from a <a
-             href="http://www.compbio.dundee.ac.uk/~www-jpred/">Jnet</a> Concise 
-               file will be added to the first sequence in the alignment.</td>
+             href="http://www.compbio.dundee.ac.uk/~www-jpred/">JPred</a> Concise 
+               file will be added to the first sequence in the alignment.<br/>
+               <em>jpredfile</em> can be used interchangeably with this parameter.</td>
            </tr>
            <tr> 
              <td>PDBfile(x)</td>
              <td>defaultColour</td>
              <td> <em>One of: </em><br>
                Clustal, Blosum62, % Identity, Hydrophobic, Zappo, Taylor, Helix 
 -              Propensity, Strand Propensity, Turn Propensity, Buried Index, Nucleotide, T-Coffee Scores, RNA Helices</td>
 +              Propensity, Strand Propensity, Turn Propensity, Buried Index, Nucleotide, Purine/Pyrimidine, T-Coffee Scores, RNA Helices</td>
              <td>Default is no colour.</td>
            </tr>
            <tr> 
@@@ -61,6 -61,7 +61,6 @@@ action.set_as_reference = Set as Refere
  action.remove = Remove
  action.remove_redundancy = Remove Redundancy...
  action.pairwise_alignment = Pairwise Alignment
 -action.by_rna_helixes = By RNA Helices
  action.user_defined = User Defined...
  action.by_conservation = By Conservation
  action.wrap = Wrap
@@@ -178,30 -179,27 +178,30 @@@ label.score_model_conservation = Physic
  label.score_model_enhconservation = Physicochemical property conservation
  label.status_bar = Status bar
  label.out_to_textbox = Output to Textbox
 -label.clustalx = Clustalx
 +# delete Clustal - use FileFormat name instead
  label.clustal = Clustal
 -label.zappo = Zappo
 -label.taylor = Taylor
 +# label.colourScheme_<schemeName> as in JalviewColourScheme
 +label.colourScheme_clustal = Clustalx
 +label.colourScheme_blosum62 = BLOSUM62 Score
 +label.colourScheme_%_identity = Percentage Identity
 +label.colourScheme_zappo = Zappo
 +label.colourScheme_taylor = Taylor
 +label.colourScheme_hydrophobic = Hydrophobicity
 +label.colourScheme_helix_propensity = Helix Propensity
 +label.colourScheme_strand_propensity = Strand Propensity
 +label.colourScheme_turn_propensity = Turn Propensity
 +label.colourScheme_buried_index = Buried Index
 +label.colourScheme_purine/pyrimidine = Purine/Pyrimidine
 +label.colourScheme_nucleotide = Nucleotide
 +label.colourScheme_t-coffee_scores = T-Coffee Scores
 +label.colourScheme_rna_helices = By RNA Helices
  label.blc = BLC
  label.fasta = Fasta
  label.msf = MSF
  label.pfam = PFAM
  label.pileup = Pileup
  label.pir = PIR
 -label.hydrophobicity = Hydrophobicity
 -label.helix_propensity = Helix Propensity
 -label.strand_propensity = Strand Propensity
 -label.turn_propensity = Turn Propensity
 -label.buried_index = Buried Index
 -label.purine_pyrimidine = Purine/Pyrimidine
 -label.percentage_identity = Percentage Identity
 -label.blosum62 = BLOSUM62
 -label.blosum62_score = BLOSUM62 Score
 -label.tcoffee_scores = T-Coffee Scores
 -label.average_distance_bloslum62 = Average Distance Using BLOSUM62
 +label.average_distance_blosum62 = Average Distance Using BLOSUM62
  label.neighbour_blosum62 = Neighbour Joining Using BLOSUM62
  label.show_annotations = Show annotations
  label.hide_annotations = Hide annotations
@@@ -213,7 -211,7 +213,7 @@@ label.hide_all = Hide al
  label.add_reference_annotations = Add reference annotations
  label.find_tip = Search alignment, selection or sequence ids for a subsequence (ignoring gaps).<br>Accepts regular expressions - search Help for 'regex' for details.
  label.colour_text = Colour Text
 -label.show_non_conversed = Show nonconserved
 +label.show_non_conserved = Show nonconserved
  label.overview_window = Overview Window
  label.none = None
  label.above_identity_threshold = Above Identity Threshold
@@@ -672,6 -670,8 +672,6 @@@ action.set_text_colour = Text Colour..
  label.structure = Structure
  label.show_pdbstruct_dialog = 3D Structure Data...
  label.view_rna_structure = VARNA 2D Structure
 -label.clustalx_colours = Clustalx colours
 -label.above_identity_percentage = Above % Identity
  label.create_sequence_details_report_annotation_for = Annotation for {0}
  label.sequence_details_for = Sequence Details for {0}
  label.sequence_name = Sequence Name
@@@ -770,7 -770,7 +770,7 @@@ label.original_data_for_params = Origin
  label.points_for_params = Points for {0}
  label.transformed_points_for_params = Transformed points for {0}
  label.graduated_color_for_params = Graduated Feature Colour for {0}
 -label.select_backgroud_colour = Select Background Colour
 +label.select_background_colour = Select Background Colour
  label.invalid_font = Invalid Font
  label.separate_multiple_accession_ids = Enter one or more accession IDs separated by a semi-colon ";"
  label.separate_multiple_query_values = Enter one or more {0}s separated by a semi-colon ";"
@@@ -835,7 -835,7 +835,7 @@@ label.colour_by = Colour by..
  label.muscle_multiple_protein_sequence_alignment = Muscle Multiple Protein Sequence Alignment
  label.mafft_multiple_sequence_alignment = MAFFT Multiple Sequence Alignment
  label.clustalw_multiple_sequence_alignment = ClustalW Multiple Sequence Alignment
- label.jnet_secondary_structure_prediction = JNet Secondary Structure Prediction
+ label.jnet_secondary_structure_prediction = JPred Secondary Structure Prediction
  label.multiharmony = Multi-Harmony
  label.unable_start_web_service_analysis = Unable to start web service analysis
  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.
@@@ -960,6 -960,7 +960,6 @@@ error.implementation_error_maplist_is_n
  error.implementation_error_cannot_have_null_alignment = Implementation error: Cannot have null alignment property key
  error.implementation_error_null_fileparse = Implementation error. Null FileParse in copy constructor
  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.
 -error.implementation_error_cannot_duplicate_colour_scheme = Serious implementation error: cannot duplicate colourscheme {0}
  error.implementation_error_structure_selection_manager_null = Implementation error. Structure selection manager's context is 'null'
  exception.ssm_context_is_null = SSM context is null
  error.idstring_seqstrings_only_one_per_sequence = idstrings and seqstrings contain one string each per sequence
@@@ -968,7 -969,7 +968,7 @@@ error.cannot_have_zero_length_vector_re
  error.implementation_error_multiple_single_sequence_prediction_jobs_not_supported = Implementation Error! Multiple single sequence prediction jobs are not yet supported
  error.implementation_error_invalid_msa_index_for_job =Implementation Error! Invalid msaIndex for JPredJob on parent MSA input object!
  error.implementation_error_startjob_called = Implementation error - StartJob(JpredJob) called on {0}
- error.multiple_jnet_subjob_merge_not_implemented = Multiple JNet subjob merging not yet implemented
+ error.multiple_jnet_subjob_merge_not_implemented = Multiple JPred subjob merging not yet implemented
  label.job_never_ran = Job never ran - input returned to user.
  error.implementation_error_minlen_must_be_greater_zero = Implementation error: minlen must be zero or more
  error.implementation_error_msawbjob_called = Implementation error - StartJob(MsaWSJob) called on a WSJobInstance {0}
@@@ -1024,6 -1025,7 +1024,6 @@@ exception.replace_null_regex_pointer = 
  exception.bad_pattern_to_regex_perl_code = bad pattern to Regex.perlCode: {0}
  exception.no_stub_implementation_for_interface = There is no stub implementation for the interface: {0}
  exception.cannot_set_endpoint_address_unknown_port = Cannot set Endpoint Address for Unknown Port {0}
 -exception.querying_matching_opening_parenthesis_for_non_closing_parenthesis = Querying matching opening parenthesis for non-closing parenthesis character {0}
  exception.mismatched_unseen_closing_char = Mismatched (unseen) closing character {0}
  exception.mismatched_closing_char = Mismatched closing character {0}
  exception.mismatched_opening_char = Mismatched opening character {0} at {1}
@@@ -1034,6 -1036,7 +1034,6 @@@ exception.couldnt_parse_responde_from_a
  exception.application_test_npe = Application test: throwing an NullPointerException It should arrive at the console
  exception.overwriting_vamsas_id_binding = Overwriting vamsas id binding
  exception.overwriting_jalview_id_binding = Overwriting jalview id binding
 -error.implementation_error_unknown_file_format_string = Implementation error: Unknown file format string
  exception.failed_to_resolve_gzip_stream = Failed to resolve GZIP stream
  exception.problem_opening_file_also_tried = Problem opening {0} (also tried {1}) : {2}
  exception.problem_opening_file = Problem opening {0} : {1}
@@@ -1074,7 -1077,7 +1074,7 @@@ exception.unexpected_handling_rnaml_tra
  exception.couldnt_recover_sequence_properties_for_alignment = Couldn't recover sequence properties for alignment
  exception.unknown_format_for_file = Unknown format {0} for file \: \n{1}
  label.remove_gaps = Remove Gaps
- exception.couldnt_recover_sequence_props_for_jnet_query = Couldn't recover sequence properties for JNet Query sequence!
+ exception.couldnt_recover_sequence_props_for_jnet_query = Couldn't recover sequence properties for JPred Query sequence!
  exception.server_timeout_try_later = Server timed out - try again later\n
  exception.web_service_returned_null_try_later= Server at {0} returned null object, it probably cannot be contacted. Try again later.
  exception.cannot_contact_service_endpoint_at = Cannot contact service endpoint at {0}
@@@ -1096,7 -1099,7 +1096,7 @@@ info.job_couldnt_be_run_exceeded_hard_l
  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
  info.no_jobs_ran = No jobs ran
  info.failed_to_submit_prediction = Failed to submit the prediction\:\n{0} {1}
- info.invalid_jnet_job_result_data ={0}\n{1}\nInvalid JNet job result data\!\n{2}
+ info.invalid_jnet_job_result_data ={0}\n{1}\nInvalid JPred job result data\!\n{2}
  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
  info.alignment_object_method_notes = \nAlignment Object Method Notes\n
  info.server_exception = \n{0} Server exception\!\n{1}
@@@ -1229,6 -1232,7 +1229,6 @@@ action.export_hidden_columns = Export H
  action.export_hidden_sequences = Export Hidden Sequences
  action.export_features = Export Features
  label.export_settings = Export Settings
 -label.save_as_biojs_html = Save as BioJs HTML
  label.pdb_web-service_error = PDB Web-service Error
  label.structure_chooser_manual_association = Structure Chooser - Manual association
  label.structure_chooser_filter_time = Structure Chooser - Filter time ({0})
@@@ -59,6 -59,7 +59,6 @@@ action.by_group = Por grup
  action.remove = Eliminar
  action.remove_redundancy = Eliminar redundancia...
  action.pairwise_alignment = Alineamiento de pares...
 -action.by_rna_helixes = Por hélices de RNA
  action.user_defined = Definido por el usuario...
  action.by_conservation = Por conservación
  action.wrap = Envolver
@@@ -175,33 -176,31 +175,33 @@@ label.score_model_conservation = Conser
  label.score_model_enhconservation = Conservación de las propiedades físico-químicas
  label.status_bar = Barra de estado
  label.out_to_textbox = Generar cuadro de texto
 -label.clustalx = Clustalx
  label.clustal = Clustal
 -label.zappo = Zappo
 -label.taylor = Taylor
 +# label.colourScheme_<schemeName> as in JalviewColourScheme
 +label.colourScheme_clustal = Clustalx
 +label.colourScheme_blosum62 = Puntuación del BLOSUM62
 +label.colourScheme_%_identity = Porcentaje de identidad
 +label.colourScheme_zappo = Zappo
 +label.colourScheme_taylor = Taylor
 +label.colourScheme_hydrophobic = Hidrofobicidad
 +label.colourScheme_helix_propensity = Tendencia de la hélice
 +label.colourScheme_strand_propensity = Tendencia de la hebra
 +label.colourScheme_turn_propensity = Tendencia de giro
 +label.colourScheme_buried_index = Índice de encubrimiento
 +label.colourScheme_purine/pyrimidine = Purina/Pirimidina
 +label.colourScheme_nucleotide = Nucleótido
 +label.colourScheme_t-coffee_scores = Puntuación del T-Coffee
 +label.colourScheme_rna_helices = Por hélices de RNA
  label.blc = BLC
  label.fasta = Fasta
  label.msf = MSF
  label.pfam = PFAM
  label.pileup = Pileup
  label.pir = PIR
 -label.hydrophobicity = Hidrofobicidad
 -label.helix_propensity = Tendencia de la hélice
 -label.strand_propensity = Tendencia de la hebra
 -label.turn_propensity = Tendencia de giro
 -label.buried_index = Índice de encubrimiento
 -label.purine_pyrimidine = Purina/Pirimidina
 -label.percentage_identity = Porcentaje de identidad
 -label.blosum62 = BLOSUM62
 -label.blosum62_score = Puntuación del BLOSUM62 
 -label.tcoffee_scores = Puntuación del T-Coffee
 -label.average_distance_bloslum62 = Distancia Media Usando BLOSUM62
 +label.average_distance_blosum62 = Distancia Media Usando BLOSUM62
  label.neighbour_blosum62 = Neighbour Joining usando BLOSUM62
  label.show_annotations = Mostrar anotaciones
  label.colour_text = Color del texto
 -label.show_non_conversed = Mostrar no conservadas
 +label.show_non_conserved = Mostrar no conservadas
  label.overview_window = Ventana resumen
  label.none = Ninguno
  label.above_identity_threshold = Por encima del umbral de identidad
@@@ -623,6 -622,8 +623,6 @@@ label.from_file = desde ficher
  label.enter_pdb_id = Introducir PDB Id
  label.text_colour = Color del texto
  label.structure = Estructura
 -label.clustalx_colours = Colores de Clustalx
 -label.above_identity_percentage = Sobre % identidad
  label.create_sequence_details_report_annotation_for = Anotación para {0}
  label.sequence_details_for = Detalles de la secuencia para {0}
  label.sequence_name = Nombre de la secuencia
@@@ -706,7 -707,7 +706,7 @@@ label.original_data_for_params = Datos 
  label.points_for_params = Puntos de {0}
  label.transformed_points_for_params = Puntos transformados de {0}
  label.graduated_color_for_params = Color graduado para la característica de {0}
 -label.select_backgroud_colour = Seleccionar color de fondo
 +label.select_background_colour = Seleccionar color de fondo
  label.invalid_font = Fuente no válida
  label.separate_multiple_accession_ids = Separar los accession id con un punto y coma ";"
  label.replace_commas_semicolons = Cambiar comas por puntos y comas
@@@ -767,7 -768,7 +767,7 @@@ label.colour_by = Colorear por..
  label.muscle_multiple_protein_sequence_alignment = Alineamiento múltiple de secuencias de proteínas con Muscle
  label.mafft_multiple_sequence_alignment = Alineamiento múltiple de secuencias con MAFFT
  label.clustalw_multiple_sequence_alignment = Alineamiento múltiple de secuencias con ClustalW
- label.jnet_secondary_structure_prediction = Predicción de la estructura secundaria con JNet
+ label.jnet_secondary_structure_prediction = Predicción de la estructura secundaria con JPred
  label.multiharmony = Multi-Harmony
  label.unable_start_web_service_analysis = No es posible iniciar el servicio web de análisis
  label.job_couldnt_be_started_check_input = El trabajo no puede arrancarse. Por favor, compruebe los parámetros de entrada y los mensajes de advertencia de la consola de Jalview.
@@@ -892,6 -893,7 +892,6 @@@ error.implementation_error_maplist_is_n
  error.implementation_error_cannot_have_null_alignment = Error de implementación: no es posible tener una clave nula en el alineamiento
  error.implementation_error_null_fileparse = Error de implementación. FileParse nulo en el construictor de copia
  error.implementation_error_cannot_map_alignment_sequences = Error de implementación: no es posible maper un alineamiento de secuencias desde distintos conjuntos de datos en un único alineamiento en el documento VAMSAS.
 -error.implementation_error_cannot_duplicate_colour_scheme = Error grave de implementación: no es posible duplicar el esquema cromático {0}
  error.implementation_error_structure_selection_manager_null = Error de implementación. El contexto structure selection manager's es nulo
  exception.ssm_context_is_null = El contexto SSM es nulo
  error.idstring_seqstrings_only_one_per_sequence = idstrings y seqstrings contienen una cadena por cada secuencia
@@@ -900,7 -902,7 +900,7 @@@ error.cannot_have_zero_length_vector_re
  error.implementation_error_multiple_single_sequence_prediction_jobs_not_supported = ¡Error de implementación! Todavía no se soportan varios trabajos de predicción asociados a una única secuencia.
  error.implementation_error_invalid_msa_index_for_job = ¡Error de implementación! Valor msaIndex no válido para JPredJob en el objeto de entrada MSA padre!
  error.implementation_error_startjob_called = Error de implementación - StartJob(JpredJob) invocado en {0}
- error.multiple_jnet_subjob_merge_not_implemented = Todavía no se han implementado varios subtrabajos JNet conjuntos.
+ error.multiple_jnet_subjob_merge_not_implemented = Todavía no se han implementado varios subtrabajos JPred conjuntos.
  label.job_never_ran = El trabajo nunca se ejecutó - entrada devuelta al usuario.
  error.implementation_error_minlen_must_be_greater_zero = Error de implementación: minlen debe ser cero o más
  error.implementation_error_msawbjob_called = Error de implementación - StartJob(MsaWSJob) invocado en un WSJobInstance {0}
@@@ -956,6 -958,7 +956,6 @@@ exception.replace_null_regex_pointer = 
  exception.bad_pattern_to_regex_perl_code = patrón erróneo en Regex.perlCode: {0}
  exception.no_stub_implementation_for_interface = No existe una implementación del stub para la interfaz: {0}
  exception.cannot_set_endpoint_address_unknown_port = No es posible estabelcer la dirección de punto final para el puerto desconocido {0}
 -exception.querying_matching_opening_parenthesis_for_non_closing_parenthesis = Consultando la coincidencia de apertura de paréntesis para paréntesis sin cerrar (?)
  exception.mismatched_unseen_closing_char = Discordancia (no vista) en el carácter de cierre {0}
  exception.mismatched_closing_char = Carácter de cierre discordante {0}
  exception.mismatched_opening_char = Carácter de apertura discordante {0} en {1}
@@@ -966,6 -969,7 +966,6 @@@ exception.couldnt_parse_responde_from_a
  exception.application_test_npe = Prueba de aplicación: lanzando un NullPointerException que debe aparecer en la consola
  exception.overwriting_vamsas_id_binding = Sobreescribiendo la asociación al VAMSAS id
  exception.overwriting_jalview_id_binding = Sobreescribiendo la asociación al Jalview id
 -error.implementation_error_unknown_file_format_string = Error de implementación: cadena de formato de fichero desconocido
  exception.failed_to_resolve_gzip_stream = Fallo al resolver el flujo GZIP 
  exception.problem_opening_file_also_tried = Problema abriendo {0} (también se intentó {1}) : {2}
  exception.problem_opening_file = Problema abriendo {0} : {1}
@@@ -1006,7 -1010,7 +1006,7 @@@ exception.unexpected_handling_rnaml_tra
  exception.couldnt_recover_sequence_properties_for_alignment = No es posible recuperar las propiedades de la secuencia para el alineamiento
  exception.unknown_format_for_file = Formato desconocido {0} para el fichero \: \n{1}
  label.remove_gaps = Eliminar huecos
- exception.couldnt_recover_sequence_props_for_jnet_query = No ha sido posible recuperar las propiedades de la secuencia para la secuencia JNet Query!
+ exception.couldnt_recover_sequence_props_for_jnet_query = No ha sido posible recuperar las propiedades de la secuencia para la secuencia JPred Query!
  exception.server_timeout_try_later = Tiempo de conexi\u00F3n ha expirado - int\u00E9ntelo de nuevo m\u00E1s tarde\n
  exception.web_service_returned_null_try_later= El servidor {0} ha devuelto un objeto nulo, por lo que probablemente no se haya podido contactar con él. Inténtelo de nuevo más tarde.
  exception.cannot_contact_service_endpoint_at = No es posible contactar por el punto de acceso al servicio en {0}
@@@ -1027,7 -1031,7 +1027,7 @@@ info.job_couldnt_be_run_exceeded_hard_l
  info.job_couldnt_be_run_incorrect_param_setting = No es posible ejecutar el trabjao porque el servidor no soporta algunos de los par\u00E1metros.\n{0}\nPor favor, aseg\u00FArese de que ha usado los par\u00E1metros adecuados para este servicio\n
  info.no_jobs_ran = No se ha ejecutado ningún trabajo
  info.failed_to_submit_prediction = Error al enviar la predicci\u00F3n\:\n{0} {1}
- info.invalid_jnet_job_result_data ={0}\n{1}\nResultados del trabajo JNet no v\u00E1lidos\!\n{2}
+ info.invalid_jnet_job_result_data ={0}\n{1}\nResultados del trabajo JPred no v\u00E1lidos\!\n{2}
  info.failed_to_submit_sequences_for_alignment = Error al enviar la secuencias para el alineamiento.\nLo m\u00E1s probable es que haya un problema en el servidor.\nSimplemente, cierre la ventana\n
  info.alignment_object_method_notes = \nNotas sobre los m\u00E9todos del objeto alineamiento\n
  info.server_exception = \n{0} Excepci\u00F3n del servidor\!\n{1}
@@@ -1229,6 -1233,7 +1229,6 @@@ tooltip.aacon_calculations=Actualizar c
  info.select_filter_option=Escoger Opción de Filtro / Entrada Manual
  info.invalid_msa_input_mininfo=Necesita por lo menos dos secuencias con al menos 3 residuos cada una, sin regiones ocultas entre ellas.
  label.chimera_missing=Visualizador de estructura Chimera no encontrado.<br/>Por favor, introduzca la ruta de Chimera,<br/>o descargar e instalar la UCSF Chimera.
 -label.save_as_biojs_html=Guardar como HTML BioJs
  exception.fts_server_unreachable=Jalview no puede conectar con el servidor {0}. \nPor favor asegúrese de que está conectado a Internet y vuelva a intentarlo.
  exception.outofmemory_loading_mmcif_file=Sin memoria al cargar el fichero mmCIF
  label.hide_columns_not_containing=Ocultar las columnas que no contengan
@@@ -41,11 -41,10 +41,13 @@@ import jalview.io.SequenceAnnotationRep
  import jalview.schemes.Blosum62ColourScheme;
  import jalview.schemes.BuriedColourScheme;
  import jalview.schemes.ClustalxColourScheme;
++import jalview.schemes.ColourSchemeI;
  import jalview.schemes.HelixColourScheme;
  import jalview.schemes.HydrophobicColourScheme;
++import jalview.schemes.JalviewColourScheme;
  import jalview.schemes.NucleotideColourScheme;
  import jalview.schemes.PIDColourScheme;
 +import jalview.schemes.PurinePyrimidineColourScheme;
  import jalview.schemes.StrandColourScheme;
  import jalview.schemes.TaylorColourScheme;
  import jalview.schemes.TurnColourScheme;
@@@ -67,7 -66,6 +69,7 @@@ import java.util.Collections
  import java.util.LinkedHashMap;
  import java.util.List;
  import java.util.Map;
 +import java.util.SortedMap;
  import java.util.TreeMap;
  import java.util.Vector;
  
@@@ -78,33 -76,33 +80,37 @@@ public class APopupMenu extends java.aw
  
    MenuItem editGroupName = new MenuItem();
  
--  protected MenuItem clustalColour = new MenuItem();
++  CheckboxMenuItem noColour = new CheckboxMenuItem();
  
--  protected MenuItem zappoColour = new MenuItem();
++  protected CheckboxMenuItem clustalColour = new CheckboxMenuItem();
  
--  protected MenuItem taylorColour = new MenuItem();
++  protected CheckboxMenuItem zappoColour = new CheckboxMenuItem();
  
--  protected MenuItem hydrophobicityColour = new MenuItem();
++  protected CheckboxMenuItem taylorColour = new CheckboxMenuItem();
  
--  protected MenuItem helixColour = new MenuItem();
++  protected CheckboxMenuItem hydrophobicityColour = new CheckboxMenuItem();
  
--  protected MenuItem strandColour = new MenuItem();
++  protected CheckboxMenuItem helixColour = new CheckboxMenuItem();
  
--  protected MenuItem turnColour = new MenuItem();
++  protected CheckboxMenuItem strandColour = new CheckboxMenuItem();
  
--  protected MenuItem buriedColour = new MenuItem();
++  protected CheckboxMenuItem turnColour = new CheckboxMenuItem();
  
--  protected CheckboxMenuItem abovePIDColour = new CheckboxMenuItem();
++  protected CheckboxMenuItem buriedColour = new CheckboxMenuItem();
  
--  protected MenuItem userDefinedColour = new MenuItem();
++  protected CheckboxMenuItem PIDColour = new CheckboxMenuItem();
  
--  protected MenuItem PIDColour = new MenuItem();
++  protected CheckboxMenuItem BLOSUM62Colour = new CheckboxMenuItem();
  
--  protected MenuItem BLOSUM62Colour = new MenuItem();
++  CheckboxMenuItem nucleotideColour = new CheckboxMenuItem();
  
--  MenuItem noColourmenuItem = new MenuItem();
++  CheckboxMenuItem purinePyrimidineColour = new CheckboxMenuItem();
  
--  protected CheckboxMenuItem conservationMenuItem = new CheckboxMenuItem();
++  protected MenuItem userDefinedColour = new MenuItem();
++
++  protected CheckboxMenuItem abovePIDColour = new CheckboxMenuItem();
++
++  protected CheckboxMenuItem conservationColour = new CheckboxMenuItem();
  
    final AlignmentPanel ap;
  
  
    MenuItem createGroupMenuItem = new MenuItem();
  
--  MenuItem nucleotideMenuItem = new MenuItem();
--
-   MenuItem purinePyrimidineMenuItem = new MenuItem();
    Menu colourMenu = new Menu();
  
    CheckboxMenuItem showBoxes = new CheckboxMenuItem();
        {
          menu1.setLabel(MessageManager.getString("action.edit_group"));
          groupMenu.remove(createGroupMenuItem);
+         if (sg.cs != null)
+         {
+           abovePIDColour.setState(sg.cs.getThreshold() > 0);
 -          conservationMenuItem.setState(sg.cs.conservationApplied());
++          conservationColour.setState(sg.cs.conservationApplied());
+         }
        }
++      setSelectedColour(sg.cs);
      }
      else
      {
    }
  
    /**
++   * Select the menu item (if any) matching the current colour scheme. This
++   * works by matching the menu item name (not display text) to the canonical
++   * name of the colour scheme.
++   * 
++   * @param cs
++   */
++  protected void setSelectedColour(ColourSchemeI cs)
++  {
++    if (cs == null)
++    {
++      noColour.setState(true);
++    }
++    else
++    {
++      for (int i = 0; i < colourMenu.getItemCount(); i++)
++      {
++        MenuItem item = colourMenu.getItem(i);
++        if (item instanceof CheckboxMenuItem)
++        {
++          if (cs.getSchemeName().equals(item.getName()))
++          {
++            ((CheckboxMenuItem) item).setState(true);
++          }
++        }
++      }
++    }
++  }
++
++  /**
     * Adds a 'Link' menu item with a sub-menu item for each hyperlink provided.
     * 
     * @param seq
       * Temporary store to hold distinct calcId / type pairs for the tooltip.
       * Using TreeMap means calcIds are shown in alphabetical order.
       */
 -    Map<String, String> tipEntries = new TreeMap<String, String>();
 +    SortedMap<String, String> tipEntries = new TreeMap<String, String>();
      final Map<SequenceI, List<AlignmentAnnotation>> candidates = new LinkedHashMap<SequenceI, List<AlignmentAnnotation>>();
      AlignmentI al = this.ap.av.getAlignment();
      AlignmentUtils.findAddableReferenceAnnotations(forSequences,
      linkMenu.add(item);
    }
  
++  /**
++   * Actions on selecting / unselecting a checkbox menu item
++   */
    @Override
    public void itemStateChanged(ItemEvent evt)
    {
-     if (evt.getSource() == abovePIDColour)
-     {
-       abovePIDColour_itemStateChanged();
-     }
-     else if (evt.getSource() == showColourText)
-     {
-       showColourText_itemStateChanged();
-     }
-     else if (evt.getSource() == showText)
+     Object source = evt.getSource();
 -    if (source == abovePIDColour)
 -    {
 -      abovePIDColour_itemStateChanged();
 -    }
 -    else if (source == conservationMenuItem)
++    if (source == noColour)
      {
-       showText_itemStateChanged();
 -      conservationMenuItem_itemStateChanged();
 -    }
 -    else if (source == showColourText)
 -    {
 -      showColourText_itemStateChanged();
 -    }
 -    else if (source == showText)
 -    {
 -      showText_itemStateChanged();
++      noColourmenuItem_actionPerformed();
      }
-     else if (evt.getSource() == showBoxes)
 -    else if (source == showBoxes)
++    else if (source == clustalColour)
      {
--      showBoxes_itemStateChanged();
++      clustalColour_actionPerformed();
      }
-     else if (evt.getSource() == displayNonconserved)
 -    else if (source == displayNonconserved)
++    else if (source == BLOSUM62Colour)
      {
--      this.showNonconserved_itemStateChanged();
++      BLOSUM62Colour_actionPerformed();
      }
--  }
--
--  @Override
--  public void actionPerformed(ActionEvent evt)
--  {
--    Object source = evt.getSource();
--    if (source == clustalColour)
++    else if (source == PIDColour)
      {
--      clustalColour_actionPerformed();
++      PIDColour_actionPerformed();
      }
      else if (source == zappoColour)
      {
      {
        buriedColour_actionPerformed();
      }
--    else if (source == nucleotideMenuItem)
++    else if (source == nucleotideColour)
      {
        nucleotideMenuItem_actionPerformed();
      }
-     else if (source == purinePyrimidineMenuItem)
 -
 -    else if (source == userDefinedColour)
++    else if (source == purinePyrimidineColour)
      {
 -      userDefinedColour_actionPerformed();
 +      purinePyrimidineColour_actionPerformed();
      }
-     else if (source == userDefinedColour)
 -    else if (source == PIDColour)
++    else if (source == abovePIDColour)
      {
-       userDefinedColour_actionPerformed();
 -      PIDColour_actionPerformed();
++      abovePIDColour_itemStateChanged();
      }
-     else if (source == PIDColour)
 -    else if (source == BLOSUM62Colour)
++    else if (source == conservationColour)
      {
-       PIDColour_actionPerformed();
 -      BLOSUM62Colour_actionPerformed();
++      conservationMenuItem_itemStateChanged();
      }
-     else if (source == BLOSUM62Colour)
 -    else if (source == noColourmenuItem)
++    else if (source == showColourText)
      {
-       BLOSUM62Colour_actionPerformed();
 -      noColourmenuItem_actionPerformed();
++      showColourText_itemStateChanged();
 +    }
-     else if (source == noColourmenuItem)
++    else if (source == showText)
 +    {
-       noColourmenuItem_actionPerformed();
++      showText_itemStateChanged();
 +    }
-     else if (source == conservationMenuItem)
++    else if (source == showBoxes)
 +    {
-       conservationMenuItem_itemStateChanged();
++      showBoxes_itemStateChanged();
++    }
++    else if (source == displayNonconserved)
++    {
++      this.showNonconserved_itemStateChanged();
++    }
++  }
++
++  /**
++   * Actions on clicking a menu item
++   */
++  @Override
++  public void actionPerformed(ActionEvent evt)
++  {
++    Object source = evt.getSource();
++    if (source == userDefinedColour)
++    {
++      userDefinedColour_actionPerformed();
      }
      else if (source == unGroupMenuItem)
      {
              .getString("action.create_group"));
      createGroupMenuItem.addActionListener(this);
  
 -    nucleotideMenuItem.setLabel(MessageManager
 -            .getString("label.nucleotide"));
 -    nucleotideMenuItem.addActionListener(this);
 -    conservationMenuItem.addItemListener(this);
 -    abovePIDColour.addItemListener(this);
      colourMenu.setLabel(MessageManager.getString("label.group_colour"));
      showBoxes.setLabel(MessageManager.getString("action.boxes"));
      showBoxes.setState(true);
      sequenceDetails.addActionListener(this);
      selSeqDetails.addActionListener(this);
      displayNonconserved.setLabel(MessageManager
 -            .getString("label.show_non_conversed"));
 +            .getString("label.show_non_conserved"));
      displayNonconserved.setState(false);
      displayNonconserved.addItemListener(this);
      showText.setLabel(MessageManager.getString("action.text"));
      groupMenu.add(unGroupMenuItem);
      groupMenu.add(menu1);
  
--    colourMenu.add(noColourmenuItem);
++    colourMenu.add(noColour);
      colourMenu.add(clustalColour);
      colourMenu.add(BLOSUM62Colour);
      colourMenu.add(PIDColour);
      colourMenu.add(strandColour);
      colourMenu.add(turnColour);
      colourMenu.add(buriedColour);
--    colourMenu.add(nucleotideMenuItem);
-     colourMenu.add(purinePyrimidineMenuItem);
++    colourMenu.add(nucleotideColour);
++    colourMenu.add(purinePyrimidineColour);
      colourMenu.add(userDefinedColour);
      colourMenu.addSeparator();
      colourMenu.add(abovePIDColour);
--    colourMenu.add(conservationMenuItem);
++    colourMenu.add(conservationColour);
  
--    noColourmenuItem.setLabel(MessageManager.getString("label.none"));
--    noColourmenuItem.addActionListener(this);
++    noColour.setLabel(MessageManager.getString("label.none"));
++    noColour.addItemListener(this);
  
++    /*
++     * setName allows setSelectedColour to do its thing
++     */
      clustalColour.setLabel(MessageManager
 -            .getString("label.clustalx_colours"));
 -    clustalColour.addActionListener(this);
 -    zappoColour.setLabel(MessageManager.getString("label.zappo"));
 -    zappoColour.addActionListener(this);
 -    taylorColour.setLabel(MessageManager.getString("label.taylor"));
 -    taylorColour.addActionListener(this);
 +            .getString("label.colourScheme_clustal"));
-     clustalColour.addActionListener(this);
++    clustalColour.setName(JalviewColourScheme.Clustal.toString());
++    clustalColour.addItemListener(this);
++    BLOSUM62Colour.setLabel(MessageManager
++            .getString("label.colourScheme_blosum62"));
++    BLOSUM62Colour.setName(JalviewColourScheme.Blosum62.toString());
++    BLOSUM62Colour.addItemListener(this);
++    PIDColour.setLabel(MessageManager
++            .getString("label.colourScheme_%_identity"));
++    PIDColour.setName(JalviewColourScheme.PID.toString());
++    PIDColour.addItemListener(this);
 +    zappoColour.setLabel(MessageManager
 +            .getString("label.colourScheme_zappo"));
-     zappoColour.addActionListener(this);
++    zappoColour.setName(JalviewColourScheme.Zappo.toString());
++    zappoColour.addItemListener(this);
 +    taylorColour.setLabel(MessageManager
 +            .getString("label.colourScheme_taylor"));
-     taylorColour.addActionListener(this);
++    taylorColour.setName(JalviewColourScheme.Taylor.toString());
++    taylorColour.addItemListener(this);
      hydrophobicityColour.setLabel(MessageManager
 -            .getString("label.hydrophobicity"));
 -    hydrophobicityColour.addActionListener(this);
 -    helixColour
 -            .setLabel(MessageManager.getString("label.helix_propensity"));
 -    helixColour.addActionListener(this);
 +            .getString("label.colourScheme_hydrophobic"));
-     hydrophobicityColour.addActionListener(this);
++    hydrophobicityColour
++            .setName(JalviewColourScheme.Hydrophobic.toString());
++    hydrophobicityColour.addItemListener(this);
 +    helixColour.setLabel(MessageManager
 +            .getString("label.colourScheme_helix_propensity"));
-     helixColour.addActionListener(this);
++    helixColour.setName(JalviewColourScheme.Helix.toString());
++    helixColour.addItemListener(this);
      strandColour.setLabel(MessageManager
 -            .getString("label.strand_propensity"));
 -    strandColour.addActionListener(this);
 -    turnColour.setLabel(MessageManager.getString("label.turn_propensity"));
 -    turnColour.addActionListener(this);
 -    buriedColour.setLabel(MessageManager.getString("label.buried_index"));
 -    buriedColour.addActionListener(this);
 -    abovePIDColour.setLabel(MessageManager
 -            .getString("label.above_identity_percentage"));
 +            .getString("label.colourScheme_strand_propensity"));
-     strandColour.addActionListener(this);
++    strandColour.setName(JalviewColourScheme.Strand.toString());
++    strandColour.addItemListener(this);
 +    turnColour.setLabel(MessageManager
 +            .getString("label.colourScheme_turn_propensity"));
-     turnColour.addActionListener(this);
++    turnColour.setName(JalviewColourScheme.Turn.toString());
++    turnColour.addItemListener(this);
 +    buriedColour.setLabel(MessageManager
 +            .getString("label.colourScheme_buried_index"));
-     buriedColour.addActionListener(this);
-     abovePIDColour.setLabel(MessageManager
-             .getString("label.above_identity_threshold"));
++    buriedColour.setName(JalviewColourScheme.Buried.toString());
++    buriedColour.addItemListener(this);
++    nucleotideColour.setLabel(MessageManager
++            .getString("label.colourScheme_nucleotide"));
++    nucleotideColour.setName(JalviewColourScheme.Nucleotide.toString());
++    nucleotideColour.addItemListener(this);
++    purinePyrimidineColour.setLabel(MessageManager
++            .getString("label.colourScheme_purine/pyrimidine"));
++    purinePyrimidineColour.setName(JalviewColourScheme.PurinePyrimidine
++            .toString());
++    purinePyrimidineColour.addItemListener(this);
  
      userDefinedColour.setLabel(MessageManager
              .getString("action.user_defined"));
      userDefinedColour.addActionListener(this);
--    PIDColour.setLabel(MessageManager
-             .getString("label.colourScheme_%_identity"));
-     PIDColour.addActionListener(this);
-     BLOSUM62Colour.setLabel(MessageManager
-             .getString("label.colourScheme_blosum62"));
-     BLOSUM62Colour.addActionListener(this);
-     conservationMenuItem.setLabel(MessageManager
-             .getString("label.conservation"));
-     nucleotideMenuItem.setLabel(MessageManager
-             .getString("label.colourScheme_nucleotide"));
-     nucleotideMenuItem.addActionListener(this);
-     purinePyrimidineMenuItem.setLabel(MessageManager
-             .getString("label.colourScheme_purine/pyrimidine"));
-     purinePyrimidineMenuItem.addActionListener(this);
-     conservationMenuItem.addItemListener(this);
 -            .getString("label.percentage_identity"));
 -    PIDColour.addActionListener(this);
 -    BLOSUM62Colour.setLabel("BLOSUM62");
 -    BLOSUM62Colour.addActionListener(this);
 -    conservationMenuItem.setLabel(MessageManager
++
++    abovePIDColour.setLabel(MessageManager
++            .getString("label.above_identity_threshold"));
 +    abovePIDColour.addItemListener(this);
++    conservationColour.setLabel(MessageManager
+             .getString("label.conservation"));
++    conservationColour.addItemListener(this);
  
      editMenu.add(copy);
      copy.addActionListener(this);
      refresh();
    }
  
 +  public void purinePyrimidineColour_actionPerformed()
 +  {
 +    getGroup().cs = new PurinePyrimidineColourScheme();
 +    refresh();
 +  }
 +
    protected void abovePIDColour_itemStateChanged()
    {
      SequenceGroup sg = getGroup();
        return;
      }
  
--    if (conservationMenuItem.getState())
++    if (conservationColour.getState())
      {
        sg.cs.setConservation(Conservation.calculateConservation("Group", sg
                .getSequences(ap.av.getHiddenRepSequences()), 0, ap.av
@@@ -62,7 -62,6 +62,7 @@@ import jalview.schemes.HydrophobicColou
  import jalview.schemes.NucleotideColourScheme;
  import jalview.schemes.PIDColourScheme;
  import jalview.schemes.PurinePyrimidineColourScheme;
 +import jalview.schemes.RNAHelicesColour;
  import jalview.schemes.RNAHelicesColourChooser;
  import jalview.schemes.StrandColourScheme;
  import jalview.schemes.TCoffeeColourScheme;
@@@ -297,7 -296,6 +297,7 @@@ public class AlignFrame extends Embmenu
      {
        RNAHelixColour.setEnabled(false);
        purinePyrimidineColour.setEnabled(false);
 +      nucleotideColour.setEnabled(false);
      }
      // Some JVMS send keyevents to Top frame or lowest panel,
      // Havent worked out why yet. So add to both this frame and seqCanvas for
      // }
      else if (source == RNAHelixColour)
      {
 -      new RNAHelicesColourChooser(viewport, alignPanel);
 +      changeColour(new RNAHelicesColour(viewport.getAlignment()));
 +      // new RNAHelicesColourChooser(viewport, alignPanel);
      }
      else if (source == modifyPID)
      {
        url.append(appendProtocol(viewport.applet.getParameter("annotations")));
      }
  
-     if (viewport.applet.getParameter("jnetfile") != null)
+     if (viewport.applet.getParameter("jnetfile") != null
+             || viewport.applet.getParameter("jpredfile") != null)
      {
        url.append("&annotations=");
-       url.append(appendProtocol(viewport.applet.getParameter("jnetfile")));
+       url.append(appendProtocol(viewport.applet.getParameter("jnetfile") != null ? viewport.applet
+               .getParameter("jnetfile") : viewport.applet
+               .getParameter("jpredfile")));
      }
  
      if (viewport.applet.getParameter("defaultColour") != null)
              .getString("label.colour_text"));
      colourTextMenuItem.addItemListener(this);
      displayNonconservedMenuItem.setLabel(MessageManager
 -            .getString("label.show_non_conversed"));
 +            .getString("label.show_non_conserved"));
      displayNonconservedMenuItem.addItemListener(this);
      wrapMenuItem.setLabel(MessageManager.getString("action.wrap"));
      wrapMenuItem.addItemListener(this);
              .getString("label.apply_colour_to_all_groups"));
      applyToAllGroups.setState(true);
      applyToAllGroups.addItemListener(this);
 -    clustalColour.setLabel(MessageManager.getString("label.clustalx"));
 +    clustalColour.setLabel(MessageManager
 +            .getString("label.colourScheme_clustal"));
      clustalColour.addActionListener(this);
 -    zappoColour.setLabel(MessageManager.getString("label.zappo"));
 +    zappoColour.setLabel(MessageManager
 +            .getString("label.colourScheme_zappo"));
      zappoColour.addActionListener(this);
 -    taylorColour.setLabel(MessageManager.getString("label.taylor"));
 +    taylorColour.setLabel(MessageManager
 +            .getString("label.colourScheme_taylor"));
      taylorColour.addActionListener(this);
      hydrophobicityColour.setLabel(MessageManager
 -            .getString("label.hydrophobicity"));
 +            .getString("label.colourScheme_hydrophobic"));
      hydrophobicityColour.addActionListener(this);
 -    helixColour
 -            .setLabel(MessageManager.getString("label.helix_propensity"));
 +    helixColour.setLabel(MessageManager
 +            .getString("label.colourScheme_helix_propensity"));
      helixColour.addActionListener(this);
      strandColour.setLabel(MessageManager
 -            .getString("label.strand_propensity"));
 +            .getString("label.colourScheme_strand_propensity"));
      strandColour.addActionListener(this);
 -    turnColour.setLabel(MessageManager.getString("label.turn_propensity"));
 +    turnColour.setLabel(MessageManager
 +            .getString("label.colourScheme_turn_propensity"));
      turnColour.addActionListener(this);
 -    buriedColour.setLabel(MessageManager.getString("label.buried_index"));
 +    buriedColour.setLabel(MessageManager
 +            .getString("label.colourScheme_buried_index"));
      buriedColour.addActionListener(this);
      purinePyrimidineColour.setLabel(MessageManager
 -            .getString("label.purine_pyrimidine"));
 +            .getString("label.colourScheme_purine/pyrimidine"));
      purinePyrimidineColour.addActionListener(this);
      // RNAInteractionColour.setLabel(MessageManager
      // .getString("label.rna_interaction"));
      // RNAInteractionColour.addActionListener(this);
      RNAHelixColour.setLabel(MessageManager
 -            .getString("action.by_rna_helixes"));
 +            .getString("label.colourScheme_rna_helices"));
      RNAHelixColour.addActionListener(this);
      userDefinedColour.setLabel(MessageManager
              .getString("action.user_defined"));
      userDefinedColour.addActionListener(this);
      PIDColour.setLabel(MessageManager
 -            .getString("label.percentage_identity"));
 +            .getString("label.colourScheme_%_identity"));
      PIDColour.addActionListener(this);
      BLOSUM62Colour.setLabel(MessageManager
 -            .getString("label.blosum62_score"));
 +            .getString("label.colourScheme_blosum62"));
      BLOSUM62Colour.addActionListener(this);
 -    tcoffeeColour
 -            .setLabel(MessageManager.getString("label.tcoffee_scores"));
 +    tcoffeeColour.setLabel(MessageManager
 +            .getString("label.colourScheme_t-coffee_scores"));
      // it will be enabled only if a score file is provided
      tcoffeeColour.setEnabled(false);
      tcoffeeColour.addActionListener(this);
      abovePIDThreshold.setLabel(MessageManager
              .getString("label.above_identity_threshold"));
      abovePIDThreshold.addItemListener(this);
 -    nucleotideColour.setLabel(MessageManager.getString("label.nucleotide"));
 +    nucleotideColour.setLabel(MessageManager
 +            .getString("label.colourScheme_nucleotide"));
      nucleotideColour.addActionListener(this);
      modifyPID.setLabel(MessageManager
              .getString("label.modify_identity_threshold"));
              .getString("label.neighbour_joining_identity"));
      neighbourTreeMenuItem.addActionListener(this);
      avDistanceTreeBlosumMenuItem.setLabel(MessageManager
 -            .getString("label.average_distance_bloslum62"));
 +            .getString("label.average_distance_blosum62"));
      avDistanceTreeBlosumMenuItem.addActionListener(this);
      njTreeBlosumMenuItem.setLabel(MessageManager
              .getString("label.neighbour_blosum62"));
@@@ -51,7 -51,6 +51,7 @@@ import jalview.javascript.JsCallBack
  import jalview.javascript.MouseOverStructureListener;
  import jalview.structure.SelectionListener;
  import jalview.structure.StructureSelectionManager;
 +import jalview.util.ColorUtils;
  import jalview.util.HttpUtils;
  import jalview.util.MessageManager;
  
@@@ -2256,6 -2255,11 +2256,11 @@@ public class JalviewLite extends Apple
      {
        boolean result = false;
        String param = applet.getParameter("jnetfile");
+       if (param == null)
+       {
+         // jnet became jpred around 2016
+         param = applet.getParameter("jpredfile");
+       }
        if (param != null)
        {
          try
      {
        return defcolour;
      }
 -    Color col = jalview.schemes.ColourSchemeProperty
 -            .getAWTColorFromName(colprop);
 +    Color col = ColorUtils.parseColourString(colprop);
      if (col == null)
      {
 -      try
 -      {
 -        col = new jalview.schemes.UserColourScheme(colprop).findColour('A');
 -      } catch (Exception ex)
 -      {
 -        System.err.println("Couldn't parse '" + colprop
 -                + "' as a colour for " + colparam);
 -        col = null;
 -      }
 +      System.err.println("Couldn't parse '" + colprop
 +              + "' as a colour for " + colparam);
      }
      return (col == null) ? defcolour : col;
 -
    }
  
    public void openJalviewHelpUrl()
@@@ -38,16 -38,24 +38,16 @@@ import jalview.datamodel.Sequence
  import jalview.datamodel.SequenceFeature;
  import jalview.datamodel.SequenceGroup;
  import jalview.datamodel.SequenceI;
 +import jalview.gui.ColourMenuHelper.ColourChangeListener;
  import jalview.io.FileFormat;
  import jalview.io.FileFormatI;
  import jalview.io.FormatAdapter;
  import jalview.io.SequenceAnnotationReport;
  import jalview.schemes.AnnotationColourGradient;
  import jalview.schemes.Blosum62ColourScheme;
 -import jalview.schemes.BuriedColourScheme;
 -import jalview.schemes.ClustalxColourScheme;
 -import jalview.schemes.HelixColourScheme;
 -import jalview.schemes.HydrophobicColourScheme;
 -import jalview.schemes.NucleotideColourScheme;
 +import jalview.schemes.ColourSchemes;
  import jalview.schemes.PIDColourScheme;
 -import jalview.schemes.PurinePyrimidineColourScheme;
 -import jalview.schemes.StrandColourScheme;
 -import jalview.schemes.TaylorColourScheme;
 -import jalview.schemes.TurnColourScheme;
 -import jalview.schemes.UserColourScheme;
 -import jalview.schemes.ZappoColourScheme;
 +import jalview.schemes.ResidueColourScheme;
  import jalview.util.GroupUrlLink;
  import jalview.util.GroupUrlLink.UrlStringTooLongException;
  import jalview.util.MessageManager;
@@@ -63,15 -71,16 +63,15 @@@ import java.util.Hashtable
  import java.util.LinkedHashMap;
  import java.util.List;
  import java.util.Map;
 +import java.util.SortedMap;
  import java.util.TreeMap;
  import java.util.Vector;
  
 -import javax.swing.ButtonGroup;
  import javax.swing.JCheckBoxMenuItem;
  import javax.swing.JColorChooser;
  import javax.swing.JMenu;
  import javax.swing.JMenuItem;
  import javax.swing.JPopupMenu;
 -import javax.swing.JRadioButtonMenuItem;
  
  /**
   * DOCUMENT ME!
   * @author $author$
   * @version $Revision: 1.118 $
   */
 -public class PopupMenu extends JPopupMenu
 +public class PopupMenu extends JPopupMenu implements ColourChangeListener
  {
    JMenu groupMenu = new JMenu();
  
    JMenuItem groupName = new JMenuItem();
  
 -  protected JRadioButtonMenuItem clustalColour = new JRadioButtonMenuItem();
 -
 -  protected JRadioButtonMenuItem zappoColour = new JRadioButtonMenuItem();
 -
 -  protected JRadioButtonMenuItem taylorColour = new JRadioButtonMenuItem();
 -
 -  protected JRadioButtonMenuItem hydrophobicityColour = new JRadioButtonMenuItem();
 -
 -  protected JRadioButtonMenuItem helixColour = new JRadioButtonMenuItem();
 -
 -  protected JRadioButtonMenuItem strandColour = new JRadioButtonMenuItem();
 -
 -  protected JRadioButtonMenuItem turnColour = new JRadioButtonMenuItem();
 -
 -  protected JRadioButtonMenuItem buriedColour = new JRadioButtonMenuItem();
 -
    protected JCheckBoxMenuItem abovePIDColour = new JCheckBoxMenuItem();
  
 -  protected JRadioButtonMenuItem userDefinedColour = new JRadioButtonMenuItem();
 -
 -  protected JRadioButtonMenuItem PIDColour = new JRadioButtonMenuItem();
 -
 -  protected JRadioButtonMenuItem BLOSUM62Colour = new JRadioButtonMenuItem();
 -
 -  protected JRadioButtonMenuItem purinePyrimidineColour = new JRadioButtonMenuItem();
 -
 -  protected JRadioButtonMenuItem RNAInteractionColour = new JRadioButtonMenuItem();
 -
 -  JRadioButtonMenuItem noColourmenuItem = new JRadioButtonMenuItem();
 -
    protected JCheckBoxMenuItem conservationMenuItem = new JCheckBoxMenuItem();
  
    AlignmentPanel ap;
  
    JMenuItem outline = new JMenuItem();
  
 -  JRadioButtonMenuItem nucleotideMenuItem = new JRadioButtonMenuItem();
 -
    JMenu colourMenu = new JMenu();
  
    JCheckBoxMenuItem showBoxes = new JCheckBoxMenuItem();
      this.ap = ap;
      sequence = seq;
  
 -    ButtonGroup colours = new ButtonGroup();
 -    colours.add(noColourmenuItem);
 -    colours.add(clustalColour);
 -    colours.add(zappoColour);
 -    colours.add(taylorColour);
 -    colours.add(hydrophobicityColour);
 -    colours.add(helixColour);
 -    colours.add(strandColour);
 -    colours.add(turnColour);
 -    colours.add(buriedColour);
 -    colours.add(userDefinedColour);
 -    colours.add(PIDColour);
 -    colours.add(BLOSUM62Colour);
 -    colours.add(purinePyrimidineColour);
 -    colours.add(RNAInteractionColour);
 -
      for (String ff : FileFormat.getWritableFormats(true))
      {
        JMenuItem item = new JMenuItem(ff);
  
 -      item.addActionListener(new java.awt.event.ActionListener()
 +      item.addActionListener(new ActionListener()
        {
          @Override
          public void actionPerformed(ActionEvent e)
                menuItem.setText(MessageManager.formatMessage(
                        "label.2d_rna_structure_line",
                        new Object[] { aa.label }));
 -              menuItem.addActionListener(new java.awt.event.ActionListener()
 +              menuItem.addActionListener(new ActionListener()
                {
                  @Override
                  public void actionPerformed(ActionEvent e)
                menuItem.setText(MessageManager.formatMessage(
                        "label.2d_rna_sequence_name",
                        new Object[] { seq.getName() }));
 -              menuItem.addActionListener(new java.awt.event.ActionListener()
 +              menuItem.addActionListener(new ActionListener()
                {
                  @Override
                  public void actionPerformed(ActionEvent e)
  
        menuItem = new JMenuItem(
                MessageManager.getString("action.hide_sequences"));
 -      menuItem.addActionListener(new java.awt.event.ActionListener()
 +      menuItem.addActionListener(new ActionListener()
        {
          @Override
          public void actionPerformed(ActionEvent e)
          menuItem = new JMenuItem(MessageManager.formatMessage(
                  "label.represent_group_with",
                  new Object[] { seq.getName() }));
 -        menuItem.addActionListener(new java.awt.event.ActionListener()
 +        menuItem.addActionListener(new ActionListener()
          {
            @Override
            public void actionPerformed(ActionEvent e)
        groupName.setText(MessageManager
                .getString("label.edit_name_and_description_current_group"));
  
 -      if (sg.cs instanceof ZappoColourScheme)
 -      {
 -        zappoColour.setSelected(true);
 -      }
 -      else if (sg.cs instanceof TaylorColourScheme)
 -      {
 -        taylorColour.setSelected(true);
 -      }
 -      else if (sg.cs instanceof PIDColourScheme)
 -      {
 -        PIDColour.setSelected(true);
 -      }
 -      else if (sg.cs instanceof Blosum62ColourScheme)
 -      {
 -        BLOSUM62Colour.setSelected(true);
 -      }
 -      else if (sg.cs instanceof UserColourScheme)
 -      {
 -        userDefinedColour.setSelected(true);
 -      }
 -      else if (sg.cs instanceof HydrophobicColourScheme)
 -      {
 -        hydrophobicityColour.setSelected(true);
 -      }
 -      else if (sg.cs instanceof HelixColourScheme)
 -      {
 -        helixColour.setSelected(true);
 -      }
 -      else if (sg.cs instanceof StrandColourScheme)
 -      {
 -        strandColour.setSelected(true);
 -      }
 -      else if (sg.cs instanceof TurnColourScheme)
 -      {
 -        turnColour.setSelected(true);
 -      }
 -      else if (sg.cs instanceof BuriedColourScheme)
 -      {
 -        buriedColour.setSelected(true);
 -      }
 -      else if (sg.cs instanceof ClustalxColourScheme)
 -      {
 -        clustalColour.setSelected(true);
 -      }
 -      else if (sg.cs instanceof PurinePyrimidineColourScheme)
 -      {
 -        purinePyrimidineColour.setSelected(true);
 -      }
 -
 -      /*
 -       * else if (sg.cs instanceof CovariationColourScheme) {
 -       * covariationColour.setSelected(true); }
 -       */
 -      else
 -      {
 -        noColourmenuItem.setSelected(true);
 -      }
 +      ColourMenuHelper.setColourSelected(colourMenu, sg.cs);
  
-       if (sg.cs != null && sg.cs.conservationApplied())
+       if (sg.cs != null)
        {
-         conservationMenuItem.setSelected(true);
+         if (sg.cs.conservationApplied())
+         {
 -        conservationMenuItem.setSelected(true);
++          conservationMenuItem.setSelected(true);
+         }
+         if (sg.cs.getThreshold() > 0)
+         {
+           abovePIDColour.setSelected(true);
+         }
        }
        displayNonconserved.setSelected(sg.getShowNonconserved());
        showText.setSelected(sg.getDisplayText());
      label = label.substring(1, label.length() - 1); // a, b, c
      final JMenuItem item = new JMenuItem(label);
      item.setToolTipText(calcId);
 -    item.addActionListener(new java.awt.event.ActionListener()
 +    item.addActionListener(new ActionListener()
      {
        @Override
        public void actionPerformed(ActionEvent e)
      JMenuItem item = new JMenuItem(label);
      item.setToolTipText(MessageManager.formatMessage(
              "label.open_url_param", new Object[] { url }));
 -    item.addActionListener(new java.awt.event.ActionListener()
 +    item.addActionListener(new ActionListener()
      {
        @Override
        public void actionPerformed(ActionEvent e)
    {
      groupMenu.setText(MessageManager.getString("label.selection"));
      groupName.setText(MessageManager.getString("label.name"));
 -    groupName.addActionListener(new java.awt.event.ActionListener()
 +    groupName.addActionListener(new ActionListener()
      {
        @Override
        public void actionPerformed(ActionEvent e)
      sequenceMenu.setText(MessageManager.getString("label.sequence"));
      sequenceName.setText(MessageManager
              .getString("label.edit_name_description"));
 -    sequenceName.addActionListener(new java.awt.event.ActionListener()
 +    sequenceName.addActionListener(new ActionListener()
      {
        @Override
        public void actionPerformed(ActionEvent e)
      });
      chooseAnnotations.setText(MessageManager
              .getString("action.choose_annotations"));
 -    chooseAnnotations.addActionListener(new java.awt.event.ActionListener()
 +    chooseAnnotations.addActionListener(new ActionListener()
      {
        @Override
        public void actionPerformed(ActionEvent e)
      });
      sequenceDetails.setText(MessageManager
              .getString("label.sequence_details"));
 -    sequenceDetails.addActionListener(new java.awt.event.ActionListener()
 +    sequenceDetails.addActionListener(new ActionListener()
      {
        @Override
        public void actionPerformed(ActionEvent e)
      });
      sequenceSelDetails.setText(MessageManager
              .getString("label.sequence_details"));
 -    sequenceSelDetails
 -            .addActionListener(new java.awt.event.ActionListener()
 -            {
 -              @Override
 -              public void actionPerformed(ActionEvent e)
 -              {
 -                sequenceSelectionDetails_actionPerformed();
 -              }
 -            });
 -    PIDColour.setFocusPainted(false);
 +    sequenceSelDetails.addActionListener(new ActionListener()
 +    {
 +      @Override
 +      public void actionPerformed(ActionEvent e)
 +      {
 +        sequenceSelectionDetails_actionPerformed();
 +      }
 +    });
      unGroupMenuItem
              .setText(MessageManager.getString("action.remove_group"));
 -    unGroupMenuItem.addActionListener(new java.awt.event.ActionListener()
 +    unGroupMenuItem.addActionListener(new ActionListener()
      {
        @Override
        public void actionPerformed(ActionEvent e)
      });
      createGroupMenuItem.setText(MessageManager
              .getString("action.create_group"));
 -    createGroupMenuItem
 -            .addActionListener(new java.awt.event.ActionListener()
 -            {
 -              @Override
 -              public void actionPerformed(ActionEvent e)
 -              {
 -                createGroupMenuItem_actionPerformed();
 -              }
 -            });
 -
 -    outline.setText(MessageManager.getString("action.border_colour"));
 -    outline.addActionListener(new java.awt.event.ActionListener()
 +    createGroupMenuItem.addActionListener(new ActionListener()
      {
        @Override
        public void actionPerformed(ActionEvent e)
        {
 -        outline_actionPerformed();
 +        createGroupMenuItem_actionPerformed();
        }
      });
 -    nucleotideMenuItem
 -            .setText(MessageManager.getString("label.nucleotide"));
 -    nucleotideMenuItem.addActionListener(new ActionListener()
 +
 +    outline.setText(MessageManager.getString("action.border_colour"));
 +    outline.addActionListener(new ActionListener()
      {
        @Override
        public void actionPerformed(ActionEvent e)
        {
 -        nucleotideMenuItem_actionPerformed();
 +        outline_actionPerformed();
        }
      });
 -    colourMenu.setText(MessageManager.getString("label.group_colour"));
      showBoxes.setText(MessageManager.getString("action.boxes"));
      showBoxes.setState(true);
      showBoxes.addActionListener(new ActionListener()
        }
      });
      displayNonconserved.setText(MessageManager
 -            .getString("label.show_non_conversed"));
 +            .getString("label.show_non_conserved"));
      displayNonconserved.setState(true);
      displayNonconserved.addActionListener(new ActionListener()
      {
          sequenceFeature_actionPerformed();
        }
      });
 -    textColour.setText(MessageManager.getString("label.text_colour"));
 -    textColour.addActionListener(new ActionListener()
 -    {
 -      @Override
 -      public void actionPerformed(ActionEvent e)
 -      {
 -        textColour_actionPerformed();
 -      }
 -    });
      jMenu1.setText(MessageManager.getString("label.group"));
      pdbStructureDialog.setText(MessageManager
              .getString("label.show_pdbstruct_dialog"));
      sequenceMenu.add(sequenceName);
      sequenceMenu.add(sequenceDetails);
      sequenceMenu.add(makeReferenceSeq);
 -    colourMenu.add(textColour);
 -    colourMenu.add(noColourmenuItem);
 -    colourMenu.add(clustalColour);
 -    colourMenu.add(BLOSUM62Colour);
 -    colourMenu.add(PIDColour);
 -    colourMenu.add(zappoColour);
 -    colourMenu.add(taylorColour);
 -    colourMenu.add(hydrophobicityColour);
 -    colourMenu.add(helixColour);
 -    colourMenu.add(strandColour);
 -    colourMenu.add(turnColour);
 -    colourMenu.add(buriedColour);
 -    colourMenu.add(nucleotideMenuItem);
 -    if (ap.getAlignment().isNucleotide())
 -    {
 -      // JBPNote - commented since the colourscheme isn't functional
 -      colourMenu.add(purinePyrimidineColour);
 -    }
 -    colourMenu.add(userDefinedColour);
  
 -    if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
 -    {
 -      java.util.Enumeration userColours = jalview.gui.UserDefinedColours
 -              .getUserColourSchemes().keys();
 +    initColourMenu();
 +    buildColourMenu();
  
 -      while (userColours.hasMoreElements())
 -      {
 -        JMenuItem item = new JMenuItem(userColours.nextElement().toString());
 -        item.addActionListener(new ActionListener()
 -        {
 -          @Override
 -          public void actionPerformed(ActionEvent evt)
 -          {
 -            userDefinedColour_actionPerformed(evt);
 -          }
 -        });
 -        colourMenu.add(item);
 -      }
 -    }
 -
 -    colourMenu.addSeparator();
 -    colourMenu.add(abovePIDColour);
 -    colourMenu.add(conservationMenuItem);
      editMenu.add(copy);
      editMenu.add(cut);
      editMenu.add(editSequence);
      jMenu1.add(showColourText);
      jMenu1.add(outline);
      jMenu1.add(displayNonconserved);
 -    noColourmenuItem.setText(MessageManager.getString("label.none"));
 -    noColourmenuItem.addActionListener(new java.awt.event.ActionListener()
 -    {
 -      @Override
 -      public void actionPerformed(ActionEvent e)
 -      {
 -        noColourmenuItem_actionPerformed();
 -      }
 -    });
 +  }
  
 -    clustalColour.setText(MessageManager
 -            .getString("label.clustalx_colours"));
 -    clustalColour.addActionListener(new java.awt.event.ActionListener()
 -    {
 -      @Override
 -      public void actionPerformed(ActionEvent e)
 -      {
 -        clustalColour_actionPerformed();
 -      }
 -    });
 -    zappoColour.setText(MessageManager.getString("label.zappo"));
 -    zappoColour.addActionListener(new java.awt.event.ActionListener()
 -    {
 -      @Override
 -      public void actionPerformed(ActionEvent e)
 -      {
 -        zappoColour_actionPerformed();
 -      }
 -    });
 -    taylorColour.setText(MessageManager.getString("label.taylor"));
 -    taylorColour.addActionListener(new java.awt.event.ActionListener()
 -    {
 -      @Override
 -      public void actionPerformed(ActionEvent e)
 -      {
 -        taylorColour_actionPerformed();
 -      }
 -    });
 -    hydrophobicityColour.setText(MessageManager
 -            .getString("label.hydrophobicity"));
 -    hydrophobicityColour
 -            .addActionListener(new java.awt.event.ActionListener()
 -            {
 -              @Override
 -              public void actionPerformed(ActionEvent e)
 -              {
 -                hydrophobicityColour_actionPerformed();
 -              }
 -            });
 -    helixColour.setText(MessageManager.getString("label.helix_propensity"));
 -    helixColour.addActionListener(new java.awt.event.ActionListener()
 -    {
 -      @Override
 -      public void actionPerformed(ActionEvent e)
 -      {
 -        helixColour_actionPerformed();
 -      }
 -    });
 -    strandColour.setText(MessageManager
 -            .getString("label.strand_propensity"));
 -    strandColour.addActionListener(new java.awt.event.ActionListener()
 -    {
 -      @Override
 -      public void actionPerformed(ActionEvent e)
 -      {
 -        strandColour_actionPerformed();
 -      }
 -    });
 -    turnColour.setText(MessageManager.getString("label.turn_propensity"));
 -    turnColour.addActionListener(new java.awt.event.ActionListener()
 -    {
 -      @Override
 -      public void actionPerformed(ActionEvent e)
 -      {
 -        turnColour_actionPerformed();
 -      }
 -    });
 -    buriedColour.setText(MessageManager.getString("label.buried_index"));
 -    buriedColour.addActionListener(new java.awt.event.ActionListener()
 +  /**
 +   * Constructs the entries for the colour menu
 +   */
 +  protected void initColourMenu()
 +  {
 +    colourMenu.setText(MessageManager.getString("label.group_colour"));
 +    textColour.setText(MessageManager.getString("label.text_colour"));
 +    textColour.addActionListener(new ActionListener()
      {
        @Override
        public void actionPerformed(ActionEvent e)
        {
 -        buriedColour_actionPerformed();
 +        textColour_actionPerformed();
        }
      });
      abovePIDColour.setText(MessageManager
 -            .getString("label.above_identity_percentage"));
 -    abovePIDColour.addActionListener(new java.awt.event.ActionListener()
 +            .getString("label.above_identity_threshold"));
 +    abovePIDColour.addActionListener(new ActionListener()
      {
        @Override
        public void actionPerformed(ActionEvent e)
          abovePIDColour_actionPerformed();
        }
      });
 -    userDefinedColour.setText(MessageManager
 -            .getString("action.user_defined"));
 -    userDefinedColour.addActionListener(new java.awt.event.ActionListener()
 -    {
 -      @Override
 -      public void actionPerformed(ActionEvent e)
 -      {
 -        userDefinedColour_actionPerformed(e);
 -      }
 -    });
 -    PIDColour
 -            .setText(MessageManager.getString("label.percentage_identity"));
 -    PIDColour.addActionListener(new java.awt.event.ActionListener()
 +
 +    conservationMenuItem.setText(MessageManager
 +            .getString("action.by_conservation"));
 +    conservationMenuItem.addActionListener(new ActionListener()
      {
        @Override
        public void actionPerformed(ActionEvent e)
        {
 -        PIDColour_actionPerformed();
 +        conservationMenuItem_actionPerformed();
        }
      });
 -    BLOSUM62Colour.setText(MessageManager.getString("label.blosum62"));
 -    BLOSUM62Colour.addActionListener(new java.awt.event.ActionListener()
 +  }
 +
 +  /**
 +   * Builds the group colour sub-menu, including any user-defined colours which
 +   * were loaded at startup or during the Jalview session
 +   */
 +  protected void buildColourMenu()
 +  {
 +    SequenceGroup sg = ap.av.getSelectionGroup();
 +    if (sg == null)
      {
 -      @Override
 -      public void actionPerformed(ActionEvent e)
 -      {
 -        BLOSUM62Colour_actionPerformed();
 -      }
 -    });
 -    purinePyrimidineColour.setText(MessageManager
 -            .getString("label.purine_pyrimidine"));
 -    purinePyrimidineColour
 -            .addActionListener(new java.awt.event.ActionListener()
 -            {
 -              @Override
 -              public void actionPerformed(ActionEvent e)
 -              {
 -                purinePyrimidineColour_actionPerformed();
 -              }
 -            });
 +      /*
 +       * popup menu with no sequence group scope
 +       */
 +      return;
 +    }
 +    colourMenu.removeAll();
 +    colourMenu.add(textColour);
 +    colourMenu.addSeparator();
  
 -    /*
 -     * covariationColour.addActionListener(new java.awt.event.ActionListener() {
 -     * public void actionPerformed(ActionEvent e) {
 -     * covariationColour_actionPerformed(); } });
 -     */
 +    ColourMenuHelper.addMenuItems(colourMenu, this, sg, false);
  
 -    conservationMenuItem.setText(MessageManager
 -            .getString("label.conservation"));
 -    conservationMenuItem
 -            .addActionListener(new java.awt.event.ActionListener()
 -            {
 -              @Override
 -              public void actionPerformed(ActionEvent e)
 -              {
 -                conservationMenuItem_actionPerformed();
 -              }
 -            });
 +    colourMenu.addSeparator();
 +    colourMenu.add(conservationMenuItem);
 +    colourMenu.add(abovePIDColour);
    }
  
    /**
       * Temporary store to hold distinct calcId / type pairs for the tooltip.
       * Using TreeMap means calcIds are shown in alphabetical order.
       */
 -    Map<String, String> tipEntries = new TreeMap<String, String>();
 +    SortedMap<String, String> tipEntries = new TreeMap<String, String>();
      final Map<SequenceI, List<AlignmentAnnotation>> candidates = new LinkedHashMap<SequenceI, List<AlignmentAnnotation>>();
      AlignmentI al = this.ap.av.getAlignment();
      AlignmentUtils.findAddableReferenceAnnotations(forSequences,
      PaintRefresher.Refresh(this, ap.av.getSequenceSetId());
    }
  
 -  /**
 -   * DOCUMENT ME!
 -   * 
 -   * @param e
 -   *          DOCUMENT ME!
 -   */
 -  protected void clustalColour_actionPerformed()
 -  {
 -    SequenceGroup sg = getGroup();
 -    sg.cs = new ClustalxColourScheme(sg, ap.av.getHiddenRepSequences());
 -    refresh();
 -  }
 -
 -  /**
 -   * DOCUMENT ME!
 -   * 
 -   * @param e
 -   *          DOCUMENT ME!
 -   */
 -  protected void zappoColour_actionPerformed()
 -  {
 -    getGroup().cs = new ZappoColourScheme();
 -    refresh();
 -  }
 -
 -  /**
 -   * DOCUMENT ME!
 -   * 
 -   * @param e
 -   *          DOCUMENT ME!
 -   */
 -  protected void taylorColour_actionPerformed()
 -  {
 -    getGroup().cs = new TaylorColourScheme();
 -    refresh();
 -  }
 -
 -  /**
 -   * DOCUMENT ME!
 -   * 
 -   * @param e
 -   *          DOCUMENT ME!
 -   */
 -  protected void hydrophobicityColour_actionPerformed()
 -  {
 -    getGroup().cs = new HydrophobicColourScheme();
 -    refresh();
 -  }
 -
 -  /**
 -   * DOCUMENT ME!
 -   * 
 -   * @param e
 -   *          DOCUMENT ME!
 -   */
 -  protected void helixColour_actionPerformed()
 -  {
 -    getGroup().cs = new HelixColourScheme();
 -    refresh();
 -  }
 -
 -  /**
 -   * DOCUMENT ME!
 -   * 
 -   * @param e
 -   *          DOCUMENT ME!
 -   */
 -  protected void strandColour_actionPerformed()
 -  {
 -    getGroup().cs = new StrandColourScheme();
 -    refresh();
 -  }
 -
 -  /**
 -   * DOCUMENT ME!
 -   * 
 -   * @param e
 -   *          DOCUMENT ME!
 -   */
 -  protected void turnColour_actionPerformed()
 -  {
 -    getGroup().cs = new TurnColourScheme();
 -    refresh();
 -  }
 -
 -  /**
 -   * DOCUMENT ME!
 -   * 
 -   * @param e
 -   *          DOCUMENT ME!
 -   */
 -  protected void buriedColour_actionPerformed()
 -  {
 -    getGroup().cs = new BuriedColourScheme();
 -    refresh();
 -  }
 -
 -  /**
 -   * DOCUMENT ME!
 -   * 
 -   * @param e
 -   *          DOCUMENT ME!
 -   */
 -  public void nucleotideMenuItem_actionPerformed()
 -  {
 -    getGroup().cs = new NucleotideColourScheme();
 -    refresh();
 -  }
 -
 -  protected void purinePyrimidineColour_actionPerformed()
 -  {
 -    getGroup().cs = new PurinePyrimidineColourScheme();
 -    refresh();
 -  }
 -
    /*
     * protected void covariationColour_actionPerformed() { getGroup().cs = new
     * CovariationColourScheme(sequence.getAnnotation()[0]); refresh(); }
    }
  
    /**
 -   * DOCUMENT ME!
 -   * 
 -   * @param e
 -   *          DOCUMENT ME!
 -   */
 -  protected void userDefinedColour_actionPerformed(ActionEvent e)
 -  {
 -    SequenceGroup sg = getGroup();
 -
 -    if (e.getSource().equals(userDefinedColour))
 -    {
 -      new UserDefinedColours(ap, sg);
 -    }
 -    else
 -    {
 -      UserColourScheme udc = (UserColourScheme) UserDefinedColours
 -              .getUserColourSchemes().get(e.getActionCommand());
 -
 -      sg.cs = udc;
 -    }
 -    refresh();
 -  }
 -
 -  /**
     * Open a panel where the user can choose which types of sequence annotation
     * to show or hide.
     * 
     * @param e
     *          DOCUMENT ME!
     */
 -  protected void PIDColour_actionPerformed()
 -  {
 -    SequenceGroup sg = getGroup();
 -    sg.cs = new PIDColourScheme();
 -    sg.cs.setConsensus(AAFrequency.calculate(
 -            sg.getSequences(ap.av.getHiddenRepSequences()),
 -            sg.getStartRes(), sg.getEndRes() + 1));
 -    refresh();
 -  }
 -
 -  /**
 -   * DOCUMENT ME!
 -   * 
 -   * @param e
 -   *          DOCUMENT ME!
 -   */
 -  protected void BLOSUM62Colour_actionPerformed()
 -  {
 -    SequenceGroup sg = getGroup();
 -
 -    sg.cs = new Blosum62ColourScheme();
 -
 -    sg.cs.setConsensus(AAFrequency.calculate(
 -            sg.getSequences(ap.av.getHiddenRepSequences()),
 -            sg.getStartRes(), sg.getEndRes() + 1));
 -
 -    refresh();
 -  }
 -
 -  /**
 -   * DOCUMENT ME!
 -   * 
 -   * @param e
 -   *          DOCUMENT ME!
 -   */
 -  protected void noColourmenuItem_actionPerformed()
 -  {
 -    getGroup().cs = null;
 -    refresh();
 -  }
 -
 -  /**
 -   * DOCUMENT ME!
 -   * 
 -   * @param e
 -   *          DOCUMENT ME!
 -   */
    protected void conservationMenuItem_actionPerformed()
    {
      SequenceGroup sg = getGroup();
      }
    }
  
 +  /**
 +   * Action on user selecting an item from the colour menu (that does not have
 +   * its bespoke action handler)
 +   */
 +  @Override
 +  public void changeColour_actionPerformed(String colourSchemeName)
 +  {
 +    SequenceGroup sg = getGroup();
 +    if (ResidueColourScheme.USER_DEFINED.equals(colourSchemeName))
 +    {
 +      /*
 +       * open a panel to load or configure a user-defined colour scheme
 +       */
 +      new UserDefinedColours(ap, sg);
 +    }
 +    else
 +    {
 +      /*
 +       * switch to the chosen colour scheme (or null for None)
 +       */
 +      sg.cs = ColourSchemes.getInstance().getColourScheme(colourSchemeName,
 +              sg, ap.av.getHiddenRepSequences());
 +      if (sg.cs instanceof Blosum62ColourScheme
 +              || sg.cs instanceof PIDColourScheme)
 +      {
 +        sg.cs.setConsensus(AAFrequency.calculate(
 +                sg.getSequences(ap.av.getHiddenRepSequences()),
 +                sg.getStartRes(), sg.getEndRes() + 1));
 +      }
 +    }
 +
 +    refresh();
 +  }
 +
  }