I have made the UI/Editor you can see in the picture below. The Text is displayed by StyledText
s. The black lines are custom borders that are in fact Label
s with lines drawn on them.
Now my goal is to provide a selection that allows the user to select the Control
s to delete them or add others to them. The second image shows a example selection. So started with all kinds of MouseEvent
s this is more complicated than I initially thought.
When the MouseDown
event is fired on any Control
I am not able to track any other Control
s that the user wants to select because the MouseMove
event contains the same control that fired the MouseDown
event until the mouse gets released. I need to track to ongoing selection to provide the visual feedback for the selected Control
s. The code below shows a minimal example to demonstrate the behavior.
public class Tester {
public static void main(String[] args)
{
Display display = new Display();
final Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
shell.setText("Stackoverflow");
Composite comp = new Composite(shell, SWT.NONE);
comp.setLayout(new GridLayout(1, true));
SelectionListener listener = new SelectionListener();
StyledText text = new StyledText(comp, SWT.NONE);
text.setText("first text");
attachListener(text, listener);
text = new StyledText(comp, SWT.NONE);
text.setText("second text");
attachListener(text, listener);
shell.pack();
shell.open();
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
private static void attachListener(Control control, Listener listener) {
if(control != null && !control.isDisposed()){
control.addListener(SWT.MouseDown, listener);
control.addListener(SWT.MouseMove, listener);
control.addListener(SWT.MouseEnter, listener);
control.addListener(SWT.MouseUp, listener);
}
}
static class SelectionListener implements Listener {
Event lastEvent = null;
@Override
public void handleEvent(Event event) {
switch(event.type){
case SWT.MouseDown:
lastEvent = event;
break;
case SWT.MouseMove:
if(lastEvent != null){
if(event.widget == lastEvent.widget)
System.out.println("the same!!!");
else
System.out.println("not the same!!!");
}
break;
case SWT.MouseEnter:
//this also does not fire when MouseDown is fired
System.out.println("entering");
break;
case SWT.MouseUp:
lastEvent = null;
break;
}
}
}
}
So basically I am reaching out for help. Maybe there is a better/simpler way to achieve this. I was also trying to figure out how swt is doing this in tables or other controls that support multiple selection. But its hard to find the specific code or they call native methods for nativ controls such as tables. So if anyone has an idea please share.