/*
* Copyright 2009 Fred Sauer
*
* 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 com.allen_sauer.gwt.dnd.client.drop;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.IndexedPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.allen_sauer.gwt.dnd.client.DragContext;
import com.allen_sauer.gwt.dnd.client.util.DOMUtil;
import com.allen_sauer.gwt.dnd.client.util.DragClientBundle;
import com.allen_sauer.gwt.dnd.client.util.LocationWidgetComparator;
/**
* A {@link DropController} for instances of {@link IndexedPanel}.
*
* @see FlowPanelDropController TODO VerticalPanel performance is slow because of positioner DOM
* manipulation
*
* @deprecated User {@link HorizontalPanelDropController} or {@link VerticalPanelDropController}
* instead.
*/
@Deprecated
public class IndexedDropController extends AbstractIndexedDropController {
/**
* Label for IE quirks mode workaround.
*/
private static final Label DUMMY_LABEL_IE_QUIRKS_MODE_OFFSET_HEIGHT = new Label("x");
/**
* The indexed panel drop target.
*/
private IndexedPanel dropTarget;
/**
* Construct an indexed panel drop controller.
*
* @param dropTarget the indexed panel drop target
*/
public IndexedDropController(IndexedPanel dropTarget) {
super(dropTarget);
if (!(dropTarget instanceof HorizontalPanel) && !(dropTarget instanceof VerticalPanel)) {
throw new IllegalArgumentException(dropTarget.getClass().getName()
+ " is not currently supported by this controller");
}
this.dropTarget = dropTarget;
}
@Override
protected LocationWidgetComparator getLocationWidgetComparator() {
if (dropTarget instanceof HorizontalPanel) {
return LocationWidgetComparator.RIGHT_HALF_COMPARATOR;
} else {
return LocationWidgetComparator.BOTTOM_HALF_COMPARATOR;
}
}
// TODO remove after enhancement for issue 1112 provides InsertPanel interface
// http://code.google.com/p/google-web-toolkit/issues/detail?id=1112
@Override
protected void insert(Widget widget, int beforeIndex) {
if (dropTarget instanceof HorizontalPanel) {
((HorizontalPanel) dropTarget).insert(widget, beforeIndex);
} else {
((VerticalPanel) dropTarget).insert(widget, beforeIndex);
}
}
@Override
protected Widget newPositioner(DragContext context) {
// Use two widgets so that setPixelSize() consistently affects dimensions
// excluding positioner border in quirks and strict modes
SimplePanel outer = new SimplePanel();
outer.addStyleName(DragClientBundle.INSTANCE.css().positioner());
// place off screen for border calculation
RootPanel.get().add(outer, -500, -500);
// Ensure IE quirks mode returns valid outer.offsetHeight, and thus valid
// DOMUtil.getVerticalBorders(outer)
outer.setWidget(DUMMY_LABEL_IE_QUIRKS_MODE_OFFSET_HEIGHT);
int width = 0;
int height = 0;
if (dropTarget instanceof HorizontalPanel) {
for (Widget widget : context.selectedWidgets) {
width += widget.getOffsetWidth();
height = Math.max(height, widget.getOffsetHeight());
}
} else {
for (Widget widget : context.selectedWidgets) {
width = Math.max(width, widget.getOffsetWidth());
height += widget.getOffsetHeight();
}
}
SimplePanel inner = new SimplePanel();
inner.setPixelSize(width - DOMUtil.getHorizontalBorders(outer), height
- DOMUtil.getVerticalBorders(outer));
outer.setWidget(inner);
return outer;
}
}