import jalview.datamodel.ColumnSelection;
import jalview.datamodel.HiddenColumns;
import jalview.datamodel.SequenceGroup;
-import jalview.datamodel.SequenceI;
import jalview.renderer.ScaleRenderer;
import jalview.renderer.ScaleRenderer.ScaleMark;
import jalview.util.MessageManager;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
+import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
-import javax.swing.SwingUtilities;
import javax.swing.ToolTipManager;
/**
{
x = av.getAlignment().getHiddenColumns().visibleToAbsoluteColumn(x);
}
-
- if (x >= av.getAlignment().getWidth())
- {
- res = av.getAlignment().getWidth() - 1;
- }
- else
- {
- res = x;
- }
+ res = Math.min(x, av.getAlignment().getWidth() - 1);
min = res;
max = res;
if (evt.isPopupTrigger()) // Mac: mousePressed
{
rightMouseButtonPressed(evt, res);
+ return;
}
- else if (SwingUtilities.isRightMouseButton(evt) && !Platform.isAMac())
+ if (Platform.isWinRightButton(evt))
{
/*
* defer right-mouse click handling to mouse up on Windows
*/
return;
}
- else
- {
- leftMouseButtonPressed(evt, res);
- }
+ leftMouseButtonPressed(evt, res);
}
/**
*/
protected void rightMouseButtonPressed(MouseEvent evt, final int res)
{
+ JPopupMenu pop = buildPopupMenu(res);
+ if (pop.getSubElements().length > 0)
+ {
+ pop.show(this, evt.getX(), evt.getY());
+ }
+ }
+
+ /**
+ * Builds a popup menu with 'Hide' or 'Reveal' options, or both, or neither
+ *
+ * @param res
+ * column number (0..)
+ * @return
+ */
+ protected JPopupMenu buildPopupMenu(final int res)
+ {
JPopupMenu pop = new JPopupMenu();
- if (reveal != null)
+
+ /*
+ * logic here depends on 'reveal', set in mouseMoved;
+ * grab the hidden range in case mouseMoved nulls it later
+ */
+ final int[] hiddenRange = reveal;
+ if (hiddenRange != null)
{
JMenuItem item = new JMenuItem(
MessageManager.getString("label.reveal"));
@Override
public void actionPerformed(ActionEvent e)
{
- av.showColumn(reveal[0]);
+ av.showColumn(hiddenRange[0]);
reveal = null;
+ ap.updateLayout();
ap.paintAlignment(true, true);
av.sendSelection();
}
{
av.showAllHiddenColumns();
reveal = null;
+ ap.updateLayout();
ap.paintAlignment(true, true);
av.sendSelection();
}
});
pop.add(item);
}
- pop.show(this, evt.getX(), evt.getY());
}
- else if (av.getColumnSelection().contains(res))
+
+ if (av.getColumnSelection().contains(res))
{
JMenuItem item = new JMenuItem(
MessageManager.getString("label.hide_columns"));
av.setSelectionGroup(null);
}
+ ap.updateLayout();
ap.paintAlignment(true, true);
av.sendSelection();
}
});
pop.add(item);
- pop.show(this, evt.getX(), evt.getY());
}
+ return pop;
}
/**
}
av.getColumnSelection().addElement(res);
- SequenceGroup sg = new SequenceGroup();
- // try to be as quick as possible
- SequenceI[] iVec = av.getAlignment().getSequencesArray();
- for (int i = 0; i < iVec.length; i++)
- {
- sg.addSequence(iVec[i], false);
- iVec[i] = null;
- }
- iVec = null;
+ SequenceGroup sg = new SequenceGroup(av.getAlignment().getSequences());
sg.setStartRes(res);
sg.setEndRes(res);
}
/**
- * DOCUMENT ME!
+ * Action on mouseUp is to set the limit of the current selection group (if
+ * there is one) and broadcast the selection
*
* @param evt
- * DOCUMENT ME!
*/
@Override
public void mouseReleased(MouseEvent evt)
{
+ boolean wasDragging = mouseDragging;
mouseDragging = false;
-
- int res = (evt.getX() / av.getCharWidth())
- + av.getRanges().getStartRes();
-
+ ap.getSeqPanel().stopScrolling();
+
+ // todo res calculation should be a method on AlignViewport
+ int xCords = Math.max(0, evt.getX()); // prevent negative X coordinates
+ ViewportRanges ranges = av.getRanges();
+ int res = (xCords / av.getCharWidth())
+ + ranges.getStartRes();
+ res = Math.min(res, ranges.getEndRes());
if (av.hasHiddenColumns())
{
res = av.getAlignment().getHiddenColumns()
.visibleToAbsoluteColumn(res);
}
-
- if (res >= av.getAlignment().getWidth())
- {
- res = av.getAlignment().getWidth() - 1;
- }
+ res = Math.max(0, res);
if (!stretchingGroup)
{
{
sg.setStartRes(res);
}
+ if (wasDragging)
+ {
+ min = Math.min(res, min);
+ max = Math.max(res, max);
+ av.getColumnSelection().stretchGroup(res, sg, min, max);
+ }
}
stretchingGroup = false;
ap.paintAlignment(false, false);
{
if (mouseDragging)
{
- ap.getSeqPanel().scrollCanvas(null);
+ mouseDragging = false;
+ ap.getSeqPanel().stopScrolling();
}
}
+ /**
+ * Action on leaving the panel bounds with mouse drag in progress is to start
+ * scrolling the alignment in the direction of the mouse. To restrict
+ * scrolling to left-right (not up-down), the y-value of the mouse position is
+ * replaced with zero.
+ */
@Override
public void mouseExited(MouseEvent evt)
{
if (mouseDragging)
{
- ap.getSeqPanel().scrollCanvas(evt);
+ ap.getSeqPanel().startScrolling(new Point(evt.getX(), 0));
}
}
@Override
public void paintComponent(Graphics g)
{
- super.paintComponent(g);
+ //super.paintComponent(g); // BH 2019
/*
* shouldn't get called in wrapped mode as the scale above is