| /** |
| * |
| * 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(); |
| } |
| } |
| } |