public class AnnotationLabels extends JPanel implements MouseListener,
MouseMotionListener, ActionListener
{
+ static String TOGGLE_LABELSCALE = "Scale Label to Column";
+
static String ADDNEW = "Add New Row";
static String EDITNAME = "Edit Label/Description";
}
}
+ else if (evt.getActionCommand().equals(TOGGLE_LABELSCALE))
+ {
+ aa[selectedRow].scaleColLabel = !aa[selectedRow].scaleColLabel;
+ }
ap.annotationPanel.adjustPanelHeight();
ap.annotationScroller.validate();
item.addActionListener(this);
pop.add(item);
// TODO: annotation object should be typed for autocalculated/derived property methods
- if (selectedRow < aa.length && aa[selectedRow].autoCalculated && aa[selectedRow].label.indexOf("Consensus")>-1)
- {
- pop.addSeparator();
- // av and sequencegroup need to implement same interface for
- final JCheckBoxMenuItem cbmi = new JCheckBoxMenuItem(
- "Ignore Gaps In Consensus", (aa[selectedRow].groupRef!=null) ? aa[selectedRow].groupRef.getIgnoreGapsConsensus() : ap.av.getIgnoreGapsConsensus());
- final AlignmentAnnotation aaa = aa[selectedRow];
- cbmi.addActionListener(new ActionListener()
+ if (selectedRow < aa.length)
+ {
+ if (!aa[selectedRow].autoCalculated)
{
- public void actionPerformed(ActionEvent e)
- {
- if (aaa.groupRef!=null)
- {
- aaa.groupRef.setIgnoreGapsConsensus(cbmi.getState()); // TODO: pass on reference to ap so the view can be updated.
- ap.annotationPanel.paint(ap.annotationPanel.getGraphics());
- } else {
- ap.av.setIgnoreGapsConsensus(cbmi.getState(), ap);
- }
- }
- });
- pop.add(cbmi);
- // av and sequencegroup need to implement same interface for
- if (aaa.groupRef!=null) {
- final JCheckBoxMenuItem cprof = new JCheckBoxMenuItem(
- "Show Full Profile", aa[selectedRow].groupRef.isIncludeAllConsSymbols());
- cprof.addActionListener(new ActionListener()
+ // display settings for this row.
+ pop.addSeparator();
+ // av and sequencegroup need to implement same interface for
+ item = new JCheckBoxMenuItem(TOGGLE_LABELSCALE,
+ aa[selectedRow].scaleColLabel);
+ item.addActionListener(this);
+ pop.add(item);
+ }
+ else if (aa[selectedRow].label.indexOf("Consensus") > -1)
+ {
+ pop.addSeparator();
+ // av and sequencegroup need to implement same interface for
+ final JCheckBoxMenuItem cbmi = new JCheckBoxMenuItem(
+ "Ignore Gaps In Consensus",
+ (aa[selectedRow].groupRef != null) ? aa[selectedRow].groupRef
+ .getIgnoreGapsConsensus()
+ : ap.av.getIgnoreGapsConsensus());
+ final AlignmentAnnotation aaa = aa[selectedRow];
+ cbmi.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
- aaa.groupRef.setIncludeAllConsSymbols(cprof.getState()); // TODO: pass on reference to ap so the view can be updated.
- ap.annotationPanel.paint(ap.annotationPanel.getGraphics());
+ if (aaa.groupRef != null)
+ {
+ // TODO: pass on reference to ap so the view can be updated.
+ aaa.groupRef.setIgnoreGapsConsensus(cbmi.getState());
+ ap.annotationPanel.paint(ap.annotationPanel.getGraphics());
+ }
+ else
+ {
+ ap.av.setIgnoreGapsConsensus(cbmi.getState(), ap);
+ }
}
});
- pop.add(cprof);
+ pop.add(cbmi);
+ // av and sequencegroup need to implement same interface for
+ if (aaa.groupRef != null)
+ {
+ final JCheckBoxMenuItem cprof = new JCheckBoxMenuItem(
+ "Show Full Profile", aa[selectedRow].groupRef
+ .isIncludeAllConsSymbols());
+ cprof.addActionListener(new ActionListener()
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ // TODO: pass on reference
+ // to ap
+ // so the
+ // view
+ // can be
+ // updated.
+ aaa.groupRef.setIncludeAllConsSymbols(cprof.getState());
+ ap.annotationPanel.paint(ap.annotationPanel.getGraphics());
+ }
+ });
+ pop.add(cprof);
+ }
+ final JMenuItem consclipbrd = new JMenuItem(COPYCONS_SEQ);
+ consclipbrd.addActionListener(this);
+ pop.add(consclipbrd);
}
- final JMenuItem consclipbrd = new JMenuItem(COPYCONS_SEQ);
- consclipbrd.addActionListener(this);
- pop.add(consclipbrd);
}
-
pop.show(this, evt.getX(), evt.getY());
}
|| label2.equals(LABEL))
{
tlabel = anot[index].description;
- if (tlabel == null)
+ if (tlabel == null || tlabel.length()<1)
{
if (label2.equals(HELIX) || label2.equals(SHEET))
{
int iconOffset = 0;
boolean validRes = false;
boolean validEnd = false;
+ boolean labelAllCols = false;
+ boolean centreColLabels,centreColLabelsDef = av.getCentreColumnLabels();
+ boolean scaleColLabel=false;
boolean[] graphGroupDrawn = new boolean[aa.length];
-
+ int charOffset = 0; // offset for a label
+ float fmWidth, fmScaling = 1f; // scaling for a label to fit it into a column.
+ Font ofont = g.getFont();
// \u03B2 \u03B1
for (int i = 0; i < aa.length; i++)
{
{
continue;
}
-
+ centreColLabels = row.centreColLabels || centreColLabelsDef;
+ labelAllCols = row.showAllColLabels;
+ scaleColLabel = row.scaleColLabel;
lastSS = ' ';
lastSSX = 0;
&& row.annotations[column].displayCharacter != null
&& (row.annotations[column].displayCharacter.length() > 0))
{
-
- int charOffset = (av.getCentreColumnLabels()) ? ((av.charWidth - fm
- .charsWidth(row.annotations[column].displayCharacter
- .toCharArray(), 0,
- row.annotations[column].displayCharacter.length())) / 2)
- : (av.charWidth - fm
- .charWidth(row.annotations[column].displayCharacter
- .charAt(0))) / 2;
-
+
+ if (centreColLabels || scaleColLabel)
+ {
+ fmWidth = (float) fm
+ .charsWidth(row.annotations[column].displayCharacter
+ .toCharArray(), 0,
+ row.annotations[column].displayCharacter.length());
+
+ if ( scaleColLabel ) {
+ // justify the label and scale to fit in column
+ if (fmWidth > av.charWidth) {
+ // scale only if the current font isn't already small enough
+ fmScaling = av.charWidth;
+ fmScaling /= fmWidth;
+ g.setFont(ofont.deriveFont(AffineTransform.getScaleInstance(fmScaling, 1.0)));
+ // and update the label's width to reflect the scaling.
+ fmWidth = av.charWidth;
+ }
+ }
+ } else {
+ fmWidth = (float) fm
+ .charWidth(row.annotations[column].displayCharacter.charAt(0));
+ }
+ charOffset = (int) ((av.charWidth - fmWidth) / 2f);
+
if (row.annotations[column].colour == null)
g.setColor(Color.black);
else
(x * av.charWidth) + charOffset, y + iconOffset);
}
else if (row.annotations[column - 1] == null
- || (!row.annotations[column].displayCharacter
+ || (labelAllCols||!row.annotations[column].displayCharacter
.equals(row.annotations[column - 1].displayCharacter) || (row.annotations[column].displayCharacter
.length() < 2 && row.annotations[column].secondaryStructure == ' ')))
{
g.drawString(row.annotations[column].displayCharacter, x
* av.charWidth + charOffset, y + iconOffset);
}
+ g.setFont(ofont);
}
if (row.hasIcons)