blob: 52a3a96401381a1d6b1bdbdba7e2d71996f4f789 [file] [log] [blame]
/**
*
* Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Florian Pirchner <florian.pirchner@gmail.com> - Initial implementation
*/
package org.eclipse.osbp.vaadin.addons.designer.overlay.client;
import org.eclipse.osbp.vaadin.addons.designer.overlay.DesignerOverlayExtension;
import org.eclipse.osbp.vaadin.addons.designer.overlay.client.widgets.OAlignmentChangedEvent;
import org.eclipse.osbp.vaadin.addons.designer.overlay.client.widgets.OAlignmentChangedHandler;
import org.eclipse.osbp.vaadin.addons.designer.overlay.client.widgets.OButtonClickEvent;
import org.eclipse.osbp.vaadin.addons.designer.overlay.client.widgets.OButtonClickHandler;
import org.eclipse.osbp.vaadin.addons.designer.overlay.client.widgets.OOverlayController;
import com.google.gwt.core.shared.GWT;
import com.google.gwt.dom.client.Element;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.Event.NativePreviewEvent;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.Widget;
import com.vaadin.client.ComponentConnector;
import com.vaadin.client.ServerConnector;
import com.vaadin.client.communication.RpcProxy;
import com.vaadin.client.communication.StateChangeEvent;
import com.vaadin.client.extensions.AbstractExtensionConnector;
import com.vaadin.shared.ui.Connect;
// TODO: Auto-generated Javadoc
/**
* The Class DesignerExtensionConnector.
*/
@Connect(DesignerOverlayExtension.class)
public class DesignerExtensionConnector extends AbstractExtensionConnector implements OAlignmentChangedHandler,
OButtonClickHandler, com.google.gwt.user.client.Event.NativePreviewHandler {
/** The Constant serialVersionUID. */
private static final long serialVersionUID = -3501965859455838012L;
/** The rpc. */
private DesignerExtensionServerRpc rpc = RpcProxy.create(DesignerExtensionServerRpc.class, this);
/** The hreg. */
private HandlerRegistration hreg;
/** The overlay. */
private ODesignerOverlay overlay;
private Widget widget;
/*
* (non-Javadoc)
*
* @see
* com.vaadin.client.extensions.AbstractExtensionConnector#extend(com.vaadin
* .client.ServerConnector)
*/
@Override
protected void extend(ServerConnector target) {
widget = ((ComponentConnector) target).getWidget();
overlay = GWT.create(ODesignerOverlay.class);
overlay.setConnector(DesignerExtensionConnector.this);
overlay.setOwner(widget);
OOverlayController.getInstance().register(widget.getElement(), overlay);
hreg = Event.addNativePreviewHandler(this);
}
/*
* (non-Javadoc)
*
* @see
* com.google.gwt.user.client.ui.PopupPanel#onPreviewNativeEvent(com.google.
* gwt.user.client.Event.NativePreviewEvent)
*/
public void onPreviewNativeEvent(final NativePreviewEvent event) {
Element target = Element.as(event.getNativeEvent().getEventTarget());
int type = event.getTypeInt();
if (type == Event.ONCLICK) {
if (!event.getNativeEvent().getAltKey()) {
return;
}
if (event.isCanceled()) {
return;
}
if (!isEventOnTarget(target)) {
return;
}
if (!overlay.isShowing()) {
int top = widget.getAbsoluteTop() + widget.getOffsetHeight();
int windowHeight = RootPanel.get().getOffsetHeight();
if (windowHeight - top < 30) {
// place the popup above
top = widget.getAbsoluteTop();
}
OOverlayController.getInstance().show(overlay, event.getNativeEvent().getClientX(),
event.getNativeEvent().getClientY());
event.cancel();
}
overlay.setAlignmentInfo(getState().alignment);
} else if (type == Event.ONKEYUP) {
if (event.isCanceled()) {
return;
}
if (!isEventOnTarget(target)) {
return;
}
int keyCode = event.getNativeEvent().getKeyCode();
if (KeyCodes.KEY_UP == keyCode && event.getNativeEvent().getAltKey()) {
OOverlayController.getInstance().navigateUp();
event.cancel();
} else if (KeyCodes.KEY_DOWN == keyCode && event.getNativeEvent().getAltKey()) {
OOverlayController.getInstance().navigateDown();
event.cancel();
} else if (KeyCodes.KEY_ESCAPE == keyCode) {
OOverlayController.getInstance().close();
event.cancel();
}
}
}
/**
* Checks if is mouse on target.
*
* @param target
* the target
* @return true, if is mouse on target
*/
protected boolean isEventOnTarget(Element target) {
// is owner the target?
boolean eventTargetsThis = widget.getElement().isOrHasChild(target);
return eventTargetsThis;
}
/*
* (non-Javadoc)
*
* @see com.vaadin.client.ui.AbstractConnector#getState()
*/
@Override
public DesignerExtensionState getState() {
return (DesignerExtensionState) super.getState();
}
/*
* (non-Javadoc)
*
* @see
* com.vaadin.client.ui.AbstractConnector#onStateChanged(com.vaadin.client.
* communication.StateChangeEvent)
*/
@Override
public void onStateChanged(StateChangeEvent stateChangeEvent) {
super.onStateChanged(stateChangeEvent);
if (overlay != null) {
overlay.setAlignmentInfo(getState().alignment);
}
}
/*
* (non-Javadoc)
*
* @see com.vaadin.client.ui.AbstractConnector#onUnregister()
*/
@Override
public void onUnregister() {
OOverlayController.getInstance().unregister(widget.getElement());
hreg.removeHandler();
hreg = null;
if (overlay != null) {
overlay.destroy();
overlay = null;
}
super.onUnregister();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.osbp.vaadin.addons.designer.overlay.client.widgets.
* OAlignmentChangedHandler#onAlignmentChanged(org.eclipse.osbp.vaadin.
* addons.designer.overlay.client.widgets.OAlignmentChangedEvent)
*/
@Override
public void onAlignmentChanged(OAlignmentChangedEvent event) {
getState().alignment = event.getAlignment();
rpc.alignmentChanged(event.getAlignment());
}
/*
* (non-Javadoc)
*
* @see org.eclipse.osbp.vaadin.addons.designer.overlay.client.widgets.
* OButtonClickHandler#clicked(org.eclipse.osbp.vaadin.addons.designer.
* overlay.client.widgets.OButtonClickEvent)
*/
@Override
public void clicked(OButtonClickEvent event) {
if (event.getCustomEventType().equals(OIConstants.EVENT_TYPE__REMOVE_CHILD)) {
rpc.removeChild();
} else if (event.getCustomEventType().equals(OIConstants.EVENT_TYPE__ADD_CHILD)) {
rpc.addChild();
} else if (event.getCustomEventType().equals(OIConstants.EVENT_TYPE__SWITCH_EDITABLE)) {
rpc.switchEditable();
} else if (event.getCustomEventType().equals(OIConstants.EVENT_TYPE__OPEN_PROPERTIES)) {
rpc.openProperties();
} else if (event.getCustomEventType().equals(OIConstants.EVENT_TYPE__SWITCH_MARGIN)) {
rpc.switchMargin();
} else if (event.getCustomEventType().equals(OIConstants.EVENT_TYPE__SWITCH_SPACING)) {
rpc.switchSpacing();
}
}
}