import java.io.PrintWriter;
import java.util.List;
+import javax.swing.BoundedRangeModel;
import javax.swing.SwingUtilities;
import jalview.analysis.AnnotationSorter;
/**
* Calculates the width of the alignment labels based on the displayed names
- * and any bounds on label width set in preferences. The calculated width is
- * also set as a property of the viewport.
+ * and any bounds on label width set in preferences.
+ *
+ * The calculated width is set as a property of the viewport and the layout is
+ * updated.
*
* @return Dimension giving the maximum width of the alignment label panel
* that should be used.
public Dimension calculateDefaultAlignmentIdWidth()
{
+ return calculateIdWidth(-1, false, false);
+ }
+
+ /**
+ * pre 2.11.3 Id width calculation - used when importing old projects only
+ *
+ * @return
+ */
+ public int getLegacyIdWidth()
+ {
int afwidth = (alignFrame != null ? alignFrame.getWidth() : 300);
int idWidth = Math.min(afwidth - 200, 2 * afwidth / 3);
int maxwidth = Math.max(IdwidthAdjuster.MIN_ID_WIDTH, idWidth);
- return calculateIdWidth(-1, false, false);
+ Dimension w = calculateIdWidthOrLegacy(true, maxwidth, false, false);
+ return w.width;
}
/**
* Calculate the width of the alignment labels based on the displayed names
- * and any bounds on label width set in preferences.
+ * and any bounds on label width set in preferences. Also includes annotations
+ * not actually visible.
+ *
+ * FIXME JAL-244 JAL-4091 - doesn't include sequence associated annotation
+ * label decorators and only called during tests
*
* @param maxwidth
* -1 or maximum width allowed for IdWidth
return calculateIdWidth(maxwidth, true, false);
}
+ /**
+ * Calculate the width of the alignment labels based on the displayed names
+ * and any bounds on label width set in preferences.
+ *
+ * @param maxwidth
+ * -1 or maximum width allowed for IdWidth
+ * @param includeAnnotations
+ * - when true includes width of any additional marks in annotation
+ * id panel
+ * @param visibleOnly
+ * - when true, ignore label widths for hidden annotation rows
+ * @return Dimension giving the maximum width of the alignment label panel
+ * that should be used.
+ */
public Dimension calculateIdWidth(int maxwidth,
boolean includeAnnotations, boolean visibleOnly)
{
+ return calculateIdWidthOrLegacy(false, maxwidth, includeAnnotations,
+ visibleOnly);
+ }
+
+ /**
+ * legacy mode or post 2.11.3 ID width calculation
+ *
+ * @param legacy
+ * - uses annotation labels, not rendered label width (excludes
+ * additional decorators)
+ * @param maxwidth
+ * @param includeAnnotations
+ * @param visibleOnly
+ * @return
+ */
+ private Dimension calculateIdWidthOrLegacy(boolean legacy, int maxwidth,
+ boolean includeAnnotations, boolean visibleOnly)
+ {
Container c = new Container();
FontMetrics fm = c.getFontMetrics(
// Also check annotation label widths
if (includeAnnotations && al.getAlignmentAnnotation() != null)
{
- if (Jalview.isHeadlessMode())
+ fm = c.getFontMetrics(getAlabels().getFont());
+
+ if (!legacy || Jalview.isHeadlessMode())
{
AnnotationLabels aal = getAlabels();
int stringWidth = aal.drawLabels(null, false, idWidth, false, false,
- fm);
+ fm, !visibleOnly);
idWidth = Math.max(idWidth, stringWidth);
}
else
{
- fm = c.getFontMetrics(getAlabels().getFont());
-
for (i = 0; i < al.getAlignmentAnnotation().length; i++)
{
AlignmentAnnotation aa = al.getAlignmentAnnotation()[i];
// this is called after loading new annotation onto alignment
if (alignFrame.getHeight() == 0)
{
- jalview.bin.Console.outPrintln("NEEDS FIXING");
+ jalview.bin.Console.error(
+ "adjustAnnotationHeight called with zero height alignment window");
}
validateAnnotationDimensions(true);
addNotify();
Dimension e = idPanel.getSize();
int idWidth = e.width;
boolean manuallyAdjusted = this.getIdPanel().getIdCanvas()
- .manuallyAdjusted();
+ .isManuallyAdjusted();
annotationScroller.setPreferredSize(new Dimension(
manuallyAdjusted ? idWidth : annotationScroller.getWidth(),
annotationHeight));
}
/**
+ * Answers true if the panel has no horizontal scrollbar, or the scrollbar is
+ * at its rightmost position, else false.
+ *
+ * @return
+ */
+ boolean isScrolledFullyRight()
+ {
+ if (hscroll == null)
+ {
+ return true;
+ }
+ BoundedRangeModel model = hscroll.getModel();
+ return (model.getExtent() + model.getValue() >= model.getMaximum());
+ }
+
+ /**
* Respond to adjustment event when horizontal or vertical scrollbar is
* changed
*
Graphics idGraphics, Graphics alignmentGraphics)
throws PrinterException
{
- final int idWidth = getVisibleIdWidth(false);
-
+ final int idWidth, idWidthForGui;
+ // otherwise calculate it
+ idWidth = getVisibleIdWidth(false);
+ // if (getIdPanel()!=null && getIdPanel().getWidth()>0)
+ // {
+ // // use the current IdPanel's width, if its set and non-zero
+ // idWidthForGui = getIdPanel().getWidth();
+ // } else {
+ // idWidthForGui=0;
+ // }
/*
* Get the horizontal offset to where we draw the sequences.
* This is idWidth if using a single Graphics context, else zero.
}
final int alignmentDrawnHeight = (endSeq - startSeq) * charHeight + 3;
+ alignmentGraphics.setColor(Color.white);
+ alignmentGraphics.fillRect(0, 0, pageWidth, pageHeight + scaleHeight);
+
/*
* draw the Scale at horizontal offset, then reset to top left (0, 0)
*/
IdCanvas idCanvas = getIdPanel().getIdCanvas();
List<SequenceI> selection = av.getSelectionGroup() == null ? null
: av.getSelectionGroup().getSequences(null);
+
idCanvas.drawIds((Graphics2D) idGraphics, av, startSeq, endSeq - 1,
- selection, false);
+ selection, false, idWidth);
idGraphics.setFont(av.getFont());
idGraphics.translate(0, -scaleHeight);
// see if rendering offscreen - check preferences and calc width accordingly
if (!onscreen && Cache.getDefault("FIGURE_AUTOIDWIDTH", false))
{
- return calculateIdWidth(-1).width;
+ return calculateIdWidth(-1, true, true).width;
}
Integer idwidth = onscreen ? null
: Cache.getIntegerProperty("FIGURE_FIXEDIDWIDTH");
}
int w = getIdPanel().getWidth();
- w = this.calculateIdWidth(-1, true, true).width;
+ w = calculateIdWidth(-1, true, true).width;
return (w > 0 ? w : calculateIdWidth().width);
}
// need to obtain default alignment width and then add in any
// additional allowance for id margin
// this duplicates the calculation in getWrappedHeight but adjusts for
- // offscreen idWith
+ // offscreen idWidth
width = alignFrame.getWidth() - vscroll.getPreferredSize().width
- alignFrame.getInsets().left - alignFrame.getInsets().right
- getVisibleIdWidth() + getVisibleIdWidth(false);
overviewPanel = null;
}
}
-
}