| /* |
| * Copyright 2000-2009 JetBrains s.r.o. |
| * |
| * 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.intellij.uiDesigner.radComponents; |
| |
| import com.intellij.uiDesigner.UIFormXmlConstants; |
| import com.intellij.uiDesigner.XmlWriter; |
| import com.intellij.uiDesigner.core.AbstractLayout; |
| import com.intellij.uiDesigner.core.GridConstraints; |
| import com.intellij.uiDesigner.designSurface.ComponentDragObject; |
| import com.intellij.uiDesigner.designSurface.ComponentDropLocation; |
| import com.intellij.uiDesigner.designSurface.FeedbackLayer; |
| import com.intellij.uiDesigner.designSurface.GuiEditor; |
| import com.intellij.uiDesigner.propertyInspector.Property; |
| import com.intellij.uiDesigner.propertyInspector.properties.HGapProperty; |
| import com.intellij.uiDesigner.propertyInspector.properties.VGapProperty; |
| import com.intellij.openapi.project.Project; |
| import org.jetbrains.annotations.NonNls; |
| import org.jetbrains.annotations.NotNull; |
| import org.jetbrains.annotations.Nullable; |
| |
| import java.awt.Insets; |
| import java.awt.LayoutManager; |
| import java.awt.Point; |
| |
| /** |
| * @author yole |
| */ |
| public class RadXYLayoutManager extends RadLayoutManager { |
| public static RadXYLayoutManager INSTANCE = new RadXYLayoutManager(); |
| |
| public @NonNls String getName() { |
| return UIFormXmlConstants.LAYOUT_XY; |
| } |
| |
| public LayoutManager createLayout() { |
| return new XYLayoutManagerImpl(); |
| } |
| |
| public void writeLayout(final XmlWriter writer, final RadContainer radContainer) { |
| final AbstractLayout layout = (AbstractLayout)radContainer.getLayout(); |
| // It has sense to save hpap and vgap even for XY layout. The reason is |
| // that XY was previously GRID with non default gaps, so when the user |
| // compose XY into the grid again then he will get the same non default gaps. |
| writer.addAttribute(UIFormXmlConstants.ATTRIBUTE_HGAP, layout.getHGap()); |
| writer.addAttribute(UIFormXmlConstants.ATTRIBUTE_VGAP, layout.getVGap()); |
| |
| // Margins |
| final Insets margin = layout.getMargin(); |
| writer.startElement("margin"); |
| try { |
| writer.writeInsets(margin); |
| } |
| finally { |
| writer.endElement(); // margin |
| } |
| } |
| |
| public void writeChildConstraints(final XmlWriter writer, final RadComponent child) { |
| // Constraints of XY layout |
| writer.startElement("xy"); |
| try{ |
| writer.addAttribute("x", child.getX()); |
| writer.addAttribute("y", child.getY()); |
| writer.addAttribute("width", child.getWidth()); |
| writer.addAttribute("height", child.getHeight()); |
| }finally{ |
| writer.endElement(); // xy |
| } |
| } |
| |
| @NotNull @Override |
| public ComponentDropLocation getDropLocation(RadContainer container, @Nullable final Point location) { |
| return new MyDropLocation(container, location != null ? location : new Point(5, 5)); |
| } |
| |
| public void addComponentToContainer(final RadContainer container, final RadComponent component, final int index) { |
| container.getDelegee().add(component.getDelegee(), component.getConstraints()); |
| } |
| |
| private static class MyDropLocation implements ComponentDropLocation { |
| private final RadContainer myContainer; |
| private final Point myLocation; |
| |
| public MyDropLocation(final RadContainer container, @NotNull final Point location) { |
| myContainer = container; |
| myLocation = location; |
| } |
| |
| public RadContainer getContainer() { |
| return myContainer; |
| } |
| |
| public boolean canDrop(ComponentDragObject dragObject) { |
| if (myLocation == null || dragObject.getComponentCount() != 1) { |
| return false; |
| } |
| for(RadComponent component: myContainer.getComponents()) { |
| if (!component.isDragging()) { |
| return false; |
| } |
| } |
| |
| return true; |
| } |
| |
| public void placeFeedback(FeedbackLayer feedbackLayer, ComponentDragObject dragObject) { |
| } |
| |
| public void processDrop(GuiEditor editor, |
| RadComponent[] components, |
| GridConstraints[] constraintsToAdjust, |
| ComponentDragObject dragObject) { |
| int patchX = 0; |
| int patchY = 0; |
| |
| for (int i = 0; i < components.length; i++) { |
| final RadComponent c = components[i]; |
| |
| final Point p = new Point(myLocation); |
| Point delta = dragObject.getDelta(i); |
| if (delta != null) { |
| p.translate(delta.x, delta.y); |
| } |
| c.setLocation(p); |
| |
| patchX = Math.min(patchX, p.x); |
| patchY = Math.min(patchY, p.y); |
| |
| myContainer.addComponent(c); |
| } |
| |
| // shift components if necessary to make sure that no component has negative x or y |
| if (patchX < 0 || patchY < 0) { |
| for(RadComponent component : components) { |
| component.shift(-patchX, -patchY); |
| } |
| } |
| } |
| |
| @Nullable |
| public ComponentDropLocation getAdjacentLocation(Direction direction) { |
| return null; |
| } |
| } |
| |
| @Override public Property[] getContainerProperties(final Project project) { |
| return new Property[] { |
| HGapProperty.getInstance(project), |
| VGapProperty.getInstance(project) |
| }; |
| } |
| } |