/*- * Copyright © 2011 Diamond Light Source Ltd. * * This file is part of GDA. * * GDA is free software: you can redistribute it and/or modify it under the * terms of the GNU General Public License version 3 as published by the Free * Software Foundation. * * GDA is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along * with GDA. If not, see <http://www.gnu.org/licenses/>. */ package uk.ac.gda.ui.components; import org.eclipse.draw2d.ColorConstants; import org.eclipse.draw2d.FigureCanvas; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.MouseEvent; import org.eclipse.draw2d.MouseListener; import org.eclipse.draw2d.Panel; import org.eclipse.draw2d.PositionConstants; import org.eclipse.draw2d.Triangle; import org.eclipse.draw2d.XYLayout; import org.eclipse.draw2d.geometry.Dimension; import org.eclipse.draw2d.geometry.Point; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Canvas; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; /** * Slider composite which shows on the tomography alignment view in the right window during profiling. */ public class BottomSliderComposite extends Composite { private Triangle sliderTriangle; public BottomSliderComposite(Composite parent, int style) { super(parent, style); GridLayout gridLayout = new GridLayout(); gridLayout.marginWidth = 0; gridLayout.marginHeight = 0; gridLayout.horizontalSpacing = 0; gridLayout.verticalSpacing = 0; this.setLayout(gridLayout); Canvas canvas = new Canvas(this, SWT.BORDER); canvas.setLayoutData(new GridData(GridData.FILL_BOTH)); canvas.setBackground(ColorConstants.black); /**/ Composite sliderComposite = new Composite(this, SWT.None); sliderComposite.setLayout(new FillLayout()); GridData layoutData = new GridData(GridData.FILL_HORIZONTAL); layoutData.heightHint = 12; sliderComposite.setLayoutData(layoutData); FigureCanvas sliderCanvas = new FigureCanvas(sliderComposite); sliderCanvas.setContents(getContents()); sliderCanvas.getViewport().setContentsTracksHeight(true); sliderCanvas.getViewport().setContentsTracksWidth(true); /**/ } private IFigure getContents() { Panel panel = new Panel(); panel.setSize(10, 10); XYLayout manager = new XYLayout(); panel.setLayoutManager(manager); sliderTriangle = new Triangle(); sliderTriangle.setPreferredSize(12, 12); sliderTriangle.setDirection(PositionConstants.NORTH); sliderTriangle.setFill(true); sliderTriangle.setBackgroundColor(ColorConstants.black); sliderTriangle.setCursor(Display.getCurrent().getSystemCursor(SWT.CURSOR_SIZEWE)); panel.add(sliderTriangle); manager.setConstraint(sliderTriangle, new Rectangle(0, 0, -1, -1)); new Dragger(sliderTriangle); return panel; } class Dragger extends org.eclipse.draw2d.MouseMotionListener.Stub implements MouseListener { public Dragger(IFigure figure) { figure.addMouseMotionListener(this); figure.addMouseListener(this); } Point last; @Override public void mouseReleased(MouseEvent e) { // FIXME-Ravi - Add listener updates. } private void updateListeners() { // for (SliderMidpointListener sliderMidpointListener : sliderMidpointListeners) { // sliderMidpointListener.handleSliderMidpointMoved(last.y + 6, topTriangleFigure.getBounds().y + 5); // } } public void mouseClicked(MouseEvent e) { } @Override public void mouseDoubleClicked(MouseEvent e) { } @Override public void mousePressed(MouseEvent e) { last = e.getLocation(); e.consume(); } @Override public void mouseDragged(MouseEvent e) { Point p = e.getLocation(); Dimension delta = p.getDifference(last); // Restricted drag movement for the triangle Rectangle sliderBounds = sliderTriangle.getBounds(); if (sliderBounds.x + delta.width > 0 && sliderBounds.x + sliderBounds.width + delta.width < sliderTriangle.getParent().getBounds().width) { sliderTriangle.setBounds(sliderBounds.getTranslated(delta.width, 0)); updateListeners(); } last = p; } } public int getSliderMidpointYLocation() { return sliderTriangle.getBounds().y + 5; } public static void main(String[] args) { final Display display = new Display(); final Shell shell = new Shell(display, SWT.SHELL_TRIM); shell.setBounds(new org.eclipse.swt.graphics.Rectangle(0, 0, 100, 400)); shell.setLayout(new GridLayout()); shell.setBackground(ColorConstants.black); BottomSliderComposite zoomedImageComposite = new BottomSliderComposite(shell, SWT.None); shell.setText(zoomedImageComposite.getClass().getName()); zoomedImageComposite.setLayoutData(new GridData(GridData.FILL_BOTH)); shell.pack(); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } display.dispose(); } @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); if (!enabled) { sliderTriangle.setBackgroundColor(ColorConstants.gray); } else { sliderTriangle.setBackgroundColor(ColorConstants.black); } } }