blob: b467e88452a38182f7f3baee9c8020c192e63238 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2019 Xored Software Inc and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* Xored Software Inc - initial API and implementation and/or initial documentation
*******************************************************************************/
package org.eclipse.rcptt.tesla.canvas;
import org.eclipse.rcptt.tesla.core.context.ContextManagement.Context;
import org.eclipse.rcptt.tesla.core.info.AdvancedInformation;
import org.eclipse.rcptt.tesla.core.info.Q7WaitInfoRoot;
import org.eclipse.rcptt.tesla.core.protocol.ElementKind;
import org.eclipse.rcptt.tesla.core.protocol.IElementProcessorMapper;
import org.eclipse.rcptt.tesla.core.protocol.ProtocolFactory;
import org.eclipse.rcptt.tesla.core.protocol.SelectCommand;
import org.eclipse.rcptt.tesla.core.protocol.SelectResponse;
import org.eclipse.rcptt.tesla.core.protocol.diagram.MouseCommand;
import org.eclipse.rcptt.tesla.core.protocol.raw.Command;
import org.eclipse.rcptt.tesla.core.protocol.raw.Element;
import org.eclipse.rcptt.tesla.core.protocol.raw.Response;
import org.eclipse.rcptt.tesla.internal.core.AbstractTeslaClient;
import org.eclipse.rcptt.tesla.internal.core.processing.ElementGenerator;
import org.eclipse.rcptt.tesla.internal.core.processing.ITeslaCommandProcessor;
import org.eclipse.rcptt.tesla.internal.ui.player.PlayerWrapUtils;
import org.eclipse.rcptt.tesla.internal.ui.player.SWTEvents;
import org.eclipse.rcptt.tesla.internal.ui.player.SWTUIElement;
import org.eclipse.rcptt.tesla.internal.ui.player.SWTUIPlayer;
import org.eclipse.rcptt.tesla.internal.ui.processors.SWTUIProcessor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Event;
public class CanvasProcessor implements ITeslaCommandProcessor {
private AbstractTeslaClient client;
public CanvasProcessor() {
}
@Override
public int getPriority() {
return 275;
}
@Override
public String getFeatureID() {
return "canvas";
}
@Override
public boolean isSelectorSupported(String kind) {
return false;
}
@Override
public SelectResponse select(SelectCommand cmd, ElementGenerator generator,
IElementProcessorMapper mapper) {
return null;
}
@Override
public boolean isCommandSupported(Command cmd) {
if (cmd instanceof MouseCommand) {
return true;
}
return false;
}
@Override
public Response executeCommand(Command command,
IElementProcessorMapper mapper) {
if (command instanceof MouseCommand) {
return handleMouseCommand((MouseCommand) command);
}
return null;
}
private Response handleMouseCommand(final MouseCommand command) {
final SWTUIElement element = getSWTProcessor().getMapper().get(
command.getElement());
final Canvas canvas = (Canvas) PlayerWrapUtils.unwrapWidget(element);
final org.eclipse.swt.graphics.Rectangle oldBounds = canvas.getBounds();
getPlayer().exec("Set bounds and location", new Runnable() {
@Override
public void run() {
if (command.getBoundsHeight() != 0
&& command.getBoundsWidth() != 0) {
canvas.setBounds(0, 0, command.getBoundsWidth(),
command.getBoundsHeight());
}
}
});
getPlayer().exec("Canvas executable", new Runnable() {
@Override
public void run() {
SWTEvents events = getPlayer().getEvents();
final Event e = events.createEvent(element);
e.x = command.getX();
e.y = command.getY();
getPlayer().addMouseWidgetInfo(canvas, e.x, e.y);
e.button = command.getButton();
e.stateMask = command.getStateMask();
switch (command.getKind()) {
case DOWN:
e.type = SWT.MouseDown;
events.sendEvent(element, e);
break;
case ENTER:
e.type = SWT.MouseEnter;
events.sendEvent(element, e);
break;
case EXIT:
e.type = SWT.MouseExit;
events.sendEvent(element, e);
break;
case HOVER:
e.type = SWT.MouseHover;
events.sendEvent(element, e);
break;
case UP:
e.type = SWT.MouseUp;
events.sendEvent(element, e);
break;
case MOVE:
e.type = SWT.MouseMove;
events.sendEvent(element, e);
break;
case DOUBLE_CLICK:
e.type = SWT.MouseDoubleClick;
e.count = 2;
events.sendEvent(element, e);
break;
}
if (!canvas.isDisposed()) {
canvas.setBounds(oldBounds);
}
}
});
return ProtocolFactory.eINSTANCE.createBooleanResponse();
}
private SWTUIPlayer getPlayer() {
return getSWTProcessor().getPlayer();
}
private SWTUIProcessor getSWTProcessor() {
return client.getProcessor(SWTUIProcessor.class);
}
@Override
public PreExecuteStatus preExecute(Command command,
PreExecuteStatus previousStatus, Q7WaitInfoRoot info) {
return null;
}
@Override
public void initialize(AbstractTeslaClient client, String id) {
this.client = client;
}
@Override
public void postSelect(Element element, IElementProcessorMapper mapper) {
// Map text elements to support this processor operations
if (element.getKind().equals(ElementKind.Canvas.name())
// For compatibility alow also windows
|| element.getKind().equals(ElementKind.Window.name())
|| element.getKind().equals(ElementKind.Link.name())
|| element.getKind().equals(ElementKind.Text.name())
|| element.getKind().equals(ElementKind.Expandable.name())) {
mapper.map(element, this);
}
}
@Override
public boolean isInactivityRequired() {
return false;
}
@Override
public boolean canProceed(Context context, Q7WaitInfoRoot info) {
return true;
}
@Override
public void clean() {
}
@Override
public void terminate() {
client = null;
}
@Override
public void checkHang() {
}
@Override
public void collectInformation(AdvancedInformation information,
Command lastCommand) {
}
@Override
public void notifyUI() {
// TODO Auto-generated method stub
}
}