/* * Copyright 2015 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.uberfire.client.workbench.widgets.dnd; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; import com.allen_sauer.gwt.dnd.client.DragContext; import com.allen_sauer.gwt.dnd.client.PickupDragController; import com.allen_sauer.gwt.dnd.client.util.DOMUtil; import com.allen_sauer.gwt.dnd.client.util.DragClientBundle; import com.google.gwt.user.client.ui.AbsolutePanel; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.IsWidget; import com.google.gwt.user.client.ui.Widget; import org.uberfire.client.resources.WorkbenchResources; import org.uberfire.client.workbench.part.WorkbenchPartPresenter; import org.uberfire.mvp.PlaceRequest; import org.uberfire.workbench.model.PanelDefinition; import org.uberfire.workbench.model.PartDefinition; import static org.uberfire.plugin.PluginUtil.toInteger; /** * A Drag Controller for the Workbench. */ @ApplicationScoped public class WorkbenchPickupDragController extends PickupDragController { private final Image dragProxy = new Image(WorkbenchResources.INSTANCE.images().workbenchPanelDragProxy()); @Inject private WorkbenchDragAndDropManager dndManager; public WorkbenchPickupDragController() { super(new AbsolutePanel(), false); setBehaviorDragProxy(true); setBehaviorDragStartSensitivity(1); } @Override public void dragStart() { final WorkbenchPartPresenter.View sourceView = (WorkbenchPartPresenter.View) super.context.selectedWidgets.get(0); final PartDefinition sourcePart = sourceView.getPresenter().getDefinition(); final PanelDefinition sourcePanel = sourceView.getPresenter().getDefinition().getParentPanel(); final PlaceRequest place = sourcePart.getPlace(); final String title = sourceView.getPresenter().getTitle(); final IsWidget titleDecoration = sourceView.getPresenter().getTitleDecoration(); final String contextId = sourceView.getPresenter().getContextId(); final IsWidget widget = sourceView.getPresenter().getPartView().getWrappedWidget(); final Integer height = toInteger(sourcePanel.getHeightAsInt()); final Integer width = toInteger(sourcePanel.getWidthAsInt()); final Integer minHeight = toInteger(sourcePanel.getMinHeightAsInt()); final Integer minWidth = toInteger(sourcePanel.getMinWidthAsInt()); final WorkbenchDragContext context = new WorkbenchDragContext(place, sourcePart, sourcePanel, sourceView.getPresenter().getMenus(), title, titleDecoration, widget, contextId, height, width, minHeight, minWidth); dndManager.setWorkbenchContext(context); super.dragStart(); final Widget movablePanel = getMoveablePanel(); if (movablePanel != null) { DOMUtil.fastSetElementPosition(movablePanel.getElement(), super.context.mouseX, super.context.mouseY); } } @Override public void dragMove() { super.dragMove(); final Widget movablePanel = getMoveablePanel(); if (movablePanel != null) { DOMUtil.fastSetElementPosition(movablePanel.getElement(), super.context.mouseX, super.context.mouseY); } } @Override protected Widget newDragProxy(DragContext context) { final AbsolutePanel container = new AbsolutePanel(); container.getElement().getStyle().setProperty("overflow", "visible"); container.getElement().getStyle().setOpacity(0.5); container.getElement().getStyle().setZIndex(Integer.MAX_VALUE); //Offset to centre of dragProxy int offsetX = 0 - ((int) (dragProxy.getWidth() * 0.5)); int offsetY = 0 - ((int) (dragProxy.getHeight() * 2)); container.add(dragProxy, offsetX, offsetY); return container; } private Widget getMoveablePanel() { for (int index = 0; index < context.boundaryPanel.getWidgetCount(); index++) { final Widget w = context.boundaryPanel.getWidget(index); if (w.getStyleName().equals(DragClientBundle.INSTANCE.css().movablePanel())) { return w; } } return null; } }