/*
* 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.Dependent;
import javax.enterprise.event.Event;
import javax.inject.Inject;
import com.allen_sauer.gwt.dnd.client.DragContext;
import com.allen_sauer.gwt.dnd.client.VetoDragException;
import com.allen_sauer.gwt.dnd.client.drop.DropController;
import com.google.gwt.user.client.ui.Widget;
import org.uberfire.client.mvp.UIPart;
import org.uberfire.client.workbench.PanelManager;
import org.uberfire.client.workbench.events.DropPlaceEvent;
import org.uberfire.client.workbench.panels.WorkbenchPanelView;
import org.uberfire.mvp.PlaceRequest;
import org.uberfire.workbench.model.CompassPosition;
import org.uberfire.workbench.model.PanelDefinition;
import org.uberfire.workbench.model.PartDefinition;
import org.uberfire.workbench.model.Position;
import org.uberfire.workbench.model.menu.Menus;
/**
* A Drop Controller covering the entire DecoratedWorkbenchPanel that renders a Compass
* with which to select the target position of the drag operation.
*/
@Dependent
public class CompassDropController implements DropController {
@Inject
CompassWidget compass;
WorkbenchPanelView<?> dropTarget;
@Inject
PanelManager panelManager;
@Inject
WorkbenchDragAndDropManager dndManager;
@Inject
private Event<DropPlaceEvent> workbenchPartDroppedEvent;
public void setup(final WorkbenchPanelView<?> view) {
dropTarget = view;
}
@Override
//When entering a DecoratedWorkbenchPanel show the Compass
public void onEnter(DragContext context) {
compass.onEnter(context);
}
@Override
//Hide the DecoratedWorkbenchPanel's Compass
public void onLeave(DragContext context) {
compass.onLeave(context);
}
@Override
public void onMove(DragContext context) {
compass.onMove(context);
}
@Override
public void onDrop(DragContext context) {
//If not dropTarget has been identified do nothing
Position p = compass.getDropPosition();
if (p == CompassPosition.NONE) {
return;
}
compass.onDrop(context);
//Move Part from source to target
final WorkbenchDragContext workbenchContext = dndManager.getWorkbenchContext();
final Menus menus = workbenchContext.getMenus();
final PanelDefinition sourcePanel = workbenchContext.getSourcePanel();
final PanelDefinition dropPanel = dropTarget.getPresenter().getDefinition();
//If the Target Panel is the same as the Source we're trying to reposition the
//Source's tab within itself. If the Source Panel has only one Tab there is no
//net effect. If we're trying to drop as a new tab there is no net effect.
if (sourcePanel.equals(dropPanel)) {
if (sourcePanel.getParts() != null && sourcePanel.getParts().size() == 1) {
return;
}
if (p == CompassPosition.SELF) {
return;
}
}
final PlaceRequest place = workbenchContext.getPlace();
firePartDroppedEvent(place);
final Integer height = null;
final Integer width = null;
final Integer minHeight = workbenchContext.getMinHeight();
final Integer minWidth = workbenchContext.getMinWidth();
final PanelDefinition targetPanel = panelManager.addWorkbenchPanel(dropPanel,
p,
height,
width,
minHeight,
minWidth);
final UIPart uiPart = workbenchContext.getUiPart();
final PartDefinition sourcePart = workbenchContext.getSourcePart();
panelManager.addWorkbenchPart(place,
sourcePart,
targetPanel,
menus,
uiPart,
workbenchContext.getContextId(),
null,
null);
}
void firePartDroppedEvent(PlaceRequest place) {
workbenchPartDroppedEvent.fire(new DropPlaceEvent(place));
}
@Override
public Widget getDropTarget() {
return this.dropTarget.getPartDropRegion();
}
@Override
public void onPreviewDrop(DragContext context) throws VetoDragException {
}
}