add sliuder variant

This commit is contained in:
2022-01-03 14:15:59 +01:00
parent 5a372d0f90
commit 93a8c067fc
20 changed files with 1737 additions and 444 deletions

View File

@ -56,13 +56,13 @@ import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.graphics.TextLayout;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
@ -71,7 +71,6 @@ import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.ScrollBar;
import org.eclipse.swt.widgets.Slider;
import org.eclipse.swt.widgets.Widget;
import org.eclipse.wb.swt.SWTResourceManager;
@ -94,6 +93,8 @@ import com.minres.scviewer.database.ui.IWaveformStyleProvider;
import com.minres.scviewer.database.ui.IWaveformView;
import com.minres.scviewer.database.ui.IWaveformZoom;
import com.minres.scviewer.database.ui.TrackEntry;
import com.minres.scviewer.database.ui.swt.internal.slider.ImageButton;
import com.minres.scviewer.database.ui.swt.internal.slider.RangeSlider;
import com.minres.scviewer.database.ui.swt.sb.FlatScrollBar;
public class WaveformView implements IWaveformView {
@ -345,11 +346,37 @@ public class WaveformView implements IWaveformView {
waveformCanvas = new WaveformCanvas(waveformPane, SWT.NONE | SWT.V_SCROLL /*| SWT.H_SCROLL*/, styleProvider);
waveformCanvas.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
Composite timeSliderPane = new WaveformSlider(waveformPane, SWT.NONE);
GridData gd_timeSlider = new GridData(SWT.FILL, SWT.BOTTOM, false, false, 1, 1);
gd_timeSlider.heightHint = 18;
timeSliderPane.setLayoutData(gd_timeSlider);
//Composite timeSliderPane = new WaveformSlider(waveformPane, SWT.NONE);
Composite timeSliderPane = new Composite(waveformPane, SWT.NONE);
// timeSliderPane.setBackground(SWTResourceManager.getColor(SWT.COLOR_RED));
GridData gd_timeSliderPane = new GridData(SWT.FILL, SWT.BOTTOM, false, false, 1, 1);
// gd_timeSliderPane.heightHint = 22;
timeSliderPane.setLayoutData(gd_timeSliderPane);
GridLayout gl_timeSliderPane = new GridLayout(3, false);
gl_timeSliderPane.marginHeight=0;
gl_timeSliderPane.marginWidth=0;
gl_timeSliderPane.horizontalSpacing=0;
gl_timeSliderPane.verticalSpacing=0;
timeSliderPane.setLayout(gl_timeSliderPane);
ImageButton b1 = new ImageButton(timeSliderPane, SWT.NONE);
GridData gd_b1 = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
gd_b1.widthHint=18;
gd_b1.heightHint=18;
b1.setLayoutData(gd_b1);
b1.setImage(SWTResourceManager.getImage(RangeSlider.class, "bullet_left.png"));
Composite timeSlider = new RangeSlider(timeSliderPane, SWT.ON|SWT.HIGH|SWT.SMOOTH|SWT.CONTROL);
GridData gd_timeSlide = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1);
timeSlider.setLayoutData(gd_timeSlide);
ImageButton b2 = new ImageButton(timeSliderPane, SWT.NONE);
GridData gd_b2 = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
gd_b2.widthHint=18;
gd_b2.heightHint=18;
b2.setLayoutData(gd_b2);
b2.setImage(SWTResourceManager.getImage(RangeSlider.class, "bullet_right.png"));
// create the name pane
createTextPane(namePane, "Name");

View File

@ -0,0 +1,129 @@
package com.minres.scviewer.database.ui.swt.internal.slider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.graphics.Transform;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
public class ImageButton extends Composite
{
private Color textColor;
private Image image;
private Image grayImage;
private ImageData imageData;
private String text = "";
private int width;
private int height;
private boolean hover;
public ImageButton(Composite parent, int style)
{
super(parent, style);
textColor = Display.getDefault().getSystemColor(SWT.COLOR_WHITE);
/* Add dispose listener for the image */
addListener(SWT.Dispose, event -> {
if (image != null)
image.dispose();
});
/* Add custom paint listener that paints the stars */
addListener(SWT.Paint, event -> {
paintControl(event);
});
/* Listen for click events */
addListener(SWT.MouseDown, event -> {
System.out.println("Click");
});
addListener(SWT.MouseDown, event -> {
});
addListener(SWT.MouseUp, event -> {
});
addListener(SWT.MouseMove, event -> {
hover=false;
redraw();
});
addListener(SWT.MouseWheel, event -> {
});
addListener(SWT.MouseHover, event -> {
hover=true;
redraw();
});
addListener(SWT.MouseDoubleClick, event -> {
});
}
private void paintControl(Event event) {
GC gc = event.gc;
if (image != null)
{
// gc.drawImage(image, 1, 1);
// if(hover) {
// Rectangle rect = image.getBounds ();
// Transform tr = new Transform (event.display);
// tr.setElements (1, 0, 0, -1, 1, 2*(1+rect.height));
// gc.setTransform (tr);
// gc.drawImage (image, 1, 1);
// gc.setTransform (null);
// }
if(hover) {
gc.drawImage(image, 1, 1);
} else {
gc.drawImage(grayImage, 1, 1);
}
Point textSize = gc.textExtent(text);
gc.setForeground(textColor);
gc.drawText(text, (width - textSize.x) / 2 + 1, (height - textSize.y) / 2 + 1, true);
}
}
public void setImage(Image img)
{
image = new Image(Display.getDefault(), img, SWT.IMAGE_COPY);
grayImage = new Image(Display.getDefault(),img,SWT.IMAGE_GRAY);
width = img.getBounds().width;
height = img.getBounds().height;
imageData = img.getImageData();
redraw();
}
public void setText(String text)
{
this.text = text;
redraw();
}
@Override
public Point computeSize(int wHint, int hHint, boolean changed)
{
int overallWidth = width;
int overallHeight = height;
/* Consider hints */
if (wHint != SWT.DEFAULT && wHint < overallWidth)
overallWidth = wHint;
if (hHint != SWT.DEFAULT && hHint < overallHeight)
overallHeight = hHint;
/* Return computed dimensions plus border */
return new Point(overallWidth + 2, overallHeight + 2);
}
}

View File

@ -0,0 +1,48 @@
package com.minres.scviewer.database.ui.swt.internal.slider;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class ReflectionUtils {
/**
* Call a method using introspection (so ones can call a private or protected method)
* @param object object on which the method will be called
* @param methodName method name
* @param args arguments of this method (can be null)
* @return the value returned by this method (if this method returns a value)
*/
public static Object callMethod(final Object object, final String methodName, final Object... args) {
if (object == null) {
return null;
}
final Class<?>[] array = new Class<?>[args == null ? 0 : args.length];
int index = 0;
if (args != null) {
for (final Object o : args) {
array[index++] = o == null ? Object.class : o.getClass();
}
}
return callMethodWithClassType(object, methodName, array, args);
}
private static Object callMethodWithClassType(final Object object, final String methodName, final Class<?>[] array, final Object... args) {
Class<?> currentClass = object.getClass();
Method method = null;
while (currentClass != null) {
try {
method = currentClass.getDeclaredMethod(methodName, array);
break;
} catch (final NoSuchMethodException nsme) {
currentClass = currentClass.getSuperclass();
}
}
try {
method.setAccessible(true);
return method.invoke(object, args);
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
e.printStackTrace();
return null;
}
}
}

View File

@ -0,0 +1,74 @@
package com.minres.scviewer.database.ui.swt.internal.slider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.TypedListener;
public class SelectionListenerUtil {
/**
* Add a <code>SelectionListener</code> to a given Control
*
* @param control control on which the selection listener is added
* @param listener listener to add
*/
public static void addSelectionListener(final Control control, final SelectionListener listener) {
if (listener == null) {
SWT.error(SWT.ERROR_NULL_ARGUMENT);
}
TypedListener typedListener = new TypedListener(listener);
control.addListener(SWT.Selection, typedListener);
}
/**
* Remove a <code>SelectionListener</code> of a given Control
*
* @param control control on which the selection listener is removed
* @param listener listener to remove
*/
public static void removeSelectionListener(final Control control, final SelectionListener listener) {
if (listener == null) {
SWT.error(SWT.ERROR_NULL_ARGUMENT);
}
final Listener[] listeners = control.getListeners(SWT.Selection);
for (Listener l : listeners) {
if (l instanceof TypedListener) {
TypedListener typedListener = (TypedListener) l;
if (typedListener.getEventListener() == listener) {
ReflectionUtils.callMethod(control, "removeListener", SWT.Selection, ((TypedListener) l).getEventListener());
return;
}
}
}
}
/**
* Fire the selection listeners of a given control
*
* @param control the control that fires the event
* @param sourceEvent mouse event
* @return true if the selection could be changed, false otherwise
*/
public static boolean fireSelectionListeners(final Control control, final Event sourceEvent) {
for (final Listener listener : control.getListeners(SWT.Selection)) {
final Event event = new Event();
event.button = sourceEvent==null?1:sourceEvent.button;
event.display = control.getDisplay();
event.item = null;
event.widget = control;
event.data = sourceEvent == null ? null : sourceEvent.data;
event.time = sourceEvent == null ? 0 : sourceEvent.time;
event.x = sourceEvent == null ? 0 : sourceEvent.x;
event.y = sourceEvent == null ? 0 : sourceEvent.y;
event.type = SWT.Selection;
listener.handleEvent(event);
if (!event.doit) {
return false;
}
}
return true;
}
}