+
+ /**
+ * change node labels to the annotation referred to by labelClass TODO:
+ * promote to a datamodel modification that can be undone TODO: make argument
+ * one case of a generic transformation function ie { undoStep = apply(Tree,
+ * TransformFunction)};
+ *
+ * @param labelClass
+ */
+ public void changeNames(final String labelClass)
+ {
+ tree.applyToNodes(new NodeTransformI()
+ {
+
+ @Override
+ public void transform(BinaryNode node)
+ {
+ if (node instanceof SequenceNode
+ && !((SequenceNode) node).isPlaceholder()
+ && !((SequenceNode) node).isDummy())
+ {
+ String newname = null;
+ SequenceI sq = (SequenceI) ((SequenceNode) node).element();
+ if (sq != null)
+ {
+ // search dbrefs, features and annotation
+ DBRefEntry[] refs = jalview.util.DBRefUtils.selectRefs(
+ sq.getDBRefs(),
+ new String[] { labelClass.toUpperCase() });
+ if (refs != null)
+ {
+ for (int i = 0; i < refs.length; i++)
+ {
+ if (newname == null)
+ {
+ newname = new String(refs[i].getAccessionId());
+ }
+ else
+ {
+ newname = newname + "; " + refs[i].getAccessionId();
+ }
+ }
+ }
+ if (newname == null)
+ {
+ SequenceFeature sf[] = sq.getSequenceFeatures();
+ for (int i = 0; sf != null && i < sf.length; i++)
+ {
+ if (sf[i].getType().equals(labelClass))
+ {
+ if (newname == null)
+ {
+ newname = new String(sf[i].getDescription());
+ }
+ else
+ {
+ newname = newname + "; " + sf[i].getDescription();
+ }
+ }
+ }
+ }
+ }
+ if (newname != null)
+ {
+ String oldname = ((SequenceNode) node).getName();
+ // TODO : save in the undo object for this modification.
+ ((SequenceNode) node).setName(newname);
+ }
+ }
+ }
+ });
+ }
+
+ /**
+ * Formats a localised title for the tree panel, like
+ * <p>
+ * Neighbour Joining Using BLOSUM62
+ * <p>
+ * For a tree loaded from file, just uses the file name
+ *
+ * @param treeType
+ * NJ or AV or FromFile
+ * @param modelOrFileName
+ * @return
+ */
+ public static String getPanelTitle(String treeType, String modelOrFileName)
+ {
+ if (NJTree.FROM_FILE.equals(treeType))
+ {
+ return modelOrFileName;
+ }
+
+ /*
+ * i18n description of Neighbour Joining or Average Distance method
+ */
+ String treecalcnm = MessageManager.getString("label.tree_calc_"
+ + treeType.toLowerCase());
+
+ /*
+ * i18n description (if any) of score model used
+ */
+ String smn = MessageManager.getStringOrReturn("label.score_model_",
+ modelOrFileName);
+
+ /*
+ * put them together as <method> Using <model>
+ */
+ final String ttl = MessageManager.formatMessage("label.treecalc_title",
+ treecalcnm, smn);
+ return ttl;
+ }
+
+ /**
+ * Gets the score model for the given name. If the score model is one that
+ * requires to get state data from the current view, allow it to do so
+ *
+ * @param sm
+ * @return
+ */
+ protected ScoreModelI configureScoreModel(String modelName)
+ {
+ ScoreModelI sm = ScoreModels.getInstance().forName(modelName);
+ if (sm instanceof ViewBasedAnalysisI)
+ {
+ try
+ {
+ sm = sm.getClass().newInstance();
+ ((ViewBasedAnalysisI) sm).configureFromAlignmentView(treeCanvas.ap);
+ } catch (Exception q)
+ {
+ Cache.log.error("Couldn't create a scoremodel instance for "
+ + sm.getName());
+ }
+ }
+ return sm;
+ }