From a4901ca07503a428587e768dc42d86b5d6997af8 Mon Sep 17 00:00:00 2001 From: jprocter Date: Thu, 11 Mar 2010 17:10:45 +0000 Subject: [PATCH] finer column label format control and new 'scale label to column' format for annotation rows. --- src/jalview/gui/AnnotationLabels.java | 96 ++++++++++++++++++++++----------- src/jalview/gui/AnnotationPanel.java | 50 ++++++++++++----- 2 files changed, 101 insertions(+), 45 deletions(-) diff --git a/src/jalview/gui/AnnotationLabels.java b/src/jalview/gui/AnnotationLabels.java index a34f8f5..3ea788b 100755 --- a/src/jalview/gui/AnnotationLabels.java +++ b/src/jalview/gui/AnnotationLabels.java @@ -38,6 +38,8 @@ import jalview.io.*; 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"; @@ -227,6 +229,10 @@ public class AnnotationLabels extends JPanel implements MouseListener, } } + else if (evt.getActionCommand().equals(TOGGLE_LABELSCALE)) + { + aa[selectedRow].scaleColLabel = !aa[selectedRow].scaleColLabel; + } ap.annotationPanel.adjustPanelHeight(); ap.annotationScroller.validate(); @@ -491,46 +497,72 @@ public class AnnotationLabels extends JPanel implements MouseListener, 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()); } diff --git a/src/jalview/gui/AnnotationPanel.java b/src/jalview/gui/AnnotationPanel.java index c3984f2..42ca1b6 100755 --- a/src/jalview/gui/AnnotationPanel.java +++ b/src/jalview/gui/AnnotationPanel.java @@ -335,7 +335,7 @@ public class AnnotationPanel extends JPanel implements MouseListener, || label2.equals(LABEL)) { tlabel = anot[index].description; - if (tlabel == null) + if (tlabel == null || tlabel.length()<1) { if (label2.equals(HELIX) || label2.equals(SHEET)) { @@ -771,8 +771,13 @@ public class AnnotationPanel extends JPanel implements MouseListener, 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++) { @@ -782,7 +787,9 @@ public class AnnotationPanel extends JPanel implements MouseListener, { continue; } - + centreColLabels = row.centreColLabels || centreColLabelsDef; + labelAllCols = row.showAllColLabels; + scaleColLabel = row.scaleColLabel; lastSS = ' '; lastSSX = 0; @@ -899,15 +906,31 @@ public class AnnotationPanel extends JPanel implements MouseListener, && 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 @@ -919,13 +942,14 @@ public class AnnotationPanel extends JPanel implements MouseListener, (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) -- 1.7.10.2