/** * */ package org.korsakow.ide.ui.controller.dnd; import java.awt.Dimension; import java.awt.datatransfer.UnsupportedFlavorException; import java.awt.dnd.DropTargetDragEvent; import java.io.IOException; import java.util.List; import org.apache.log4j.Logger; import org.korsakow.ide.resources.WidgetType; import org.korsakow.ide.resources.widget.WidgetComponent; import org.korsakow.ide.resources.widget.WidgetModel; import org.korsakow.ide.ui.dnd.DataFlavors; import org.korsakow.ide.ui.interfacebuilder.InterfaceBuilderMainPanel; import org.korsakow.ide.ui.interfacebuilder.WidgetCanvas; public class WidgetTypeDropTarget extends AbstractWidgetDropTarget { InterfaceBuilderMainPanel interfaceBuilder; public WidgetTypeDropTarget(InterfaceBuilderMainPanel interfaceBuilder) { super(interfaceBuilder.getCanvas()); this.interfaceBuilder = interfaceBuilder; } @Override protected WidgetModel getTransferWidget(DropTargetDragEvent dtde) { Float aspect = null; if (interfaceBuilder.getGridInfoPanel().isGridAspectLocked()) { if (canvas.getModel().getGridHeight() > 0) aspect = canvas.getModel().getGridWidth() / (float)canvas.getModel().getGridHeight(); } if (aspect!=null && (aspect < 0.2 || aspect > 5)) aspect = 1.0F; try { WidgetType known = (WidgetType)dtde.getTransferable().getTransferData(DataFlavors.WidgetType); WidgetModel widget = known.newInstance(); switch (known) { case MainMedia: case MediaArea: // widget.setHeight((int)(widget.getWidth()/aspect)); // we adjust the width because the default is 16:9, and we want to reduce, if anything the size of the widget if (aspect != null) { final int newWidth = (int)(widget.getHeight()*aspect); if (newWidth > 0) widget.setWidth(newWidth); } break; case SnuAutoLink: case SnuFixedLink: Dimension d = null; List<WidgetComponent> comps = canvas.getWidgetComponents(); WIDGETS: /* woot labels! */ for (int i = comps.size()-1; i >= 0; --i) { WidgetComponent comp = comps.get(i); switch (comp.getWidget().getWidgetType()) { case SnuAutoLink: case SnuFixedLink: d = comp.getSize(); break WIDGETS; } } if (d != null && d.width>0 && d.height>0) { widget.setWidth(d.width); widget.setHeight(d.height); } else // widget.setHeight((int)(widget.getWidth()/aspect)); if (aspect != null) { final int newWidth = (int)(widget.getHeight()*aspect); if (newWidth > 0) widget.setWidth(newWidth); } break; } return widget; } catch (UnsupportedFlavorException e) { Logger.getLogger(WidgetCanvas.class).error(e); return null; } catch (IOException e) { Logger.getLogger(WidgetCanvas.class).error(e); return null; } } }