| /* |
| * 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.openapi.actionSystem.ActionGroup; |
| import com.intellij.openapi.actionSystem.DefaultActionGroup; |
| import com.intellij.openapi.project.Project; |
| import com.intellij.uiDesigner.UIFormXmlConstants; |
| import com.intellij.uiDesigner.XmlWriter; |
| import com.intellij.uiDesigner.actions.DeleteAction; |
| import com.intellij.uiDesigner.actions.InsertAfterAction; |
| import com.intellij.uiDesigner.actions.InsertBeforeAction; |
| import com.intellij.uiDesigner.actions.SplitAction; |
| import com.intellij.uiDesigner.core.GridConstraints; |
| import com.intellij.uiDesigner.core.GridLayoutManager; |
| import com.intellij.uiDesigner.propertyInspector.Property; |
| import com.intellij.uiDesigner.propertyInspector.properties.*; |
| |
| import javax.swing.*; |
| import java.awt.*; |
| import java.util.List; |
| |
| /** |
| * @author yole |
| */ |
| public class RadGridLayoutManager extends RadAbstractGridLayoutManager { |
| private GridLayoutColumnProperties myPropertiesPanel; |
| |
| public String getName() { |
| return UIFormXmlConstants.LAYOUT_INTELLIJ; |
| } |
| |
| public LayoutManager createLayout() { |
| return new GridLayoutManager(1, 1); |
| } |
| |
| @Override |
| protected void changeLayoutFromGrid(final RadContainer container, final List<RadComponent> contents, final List<Boolean> canRowsGrow, |
| final List<Boolean> canColumnsGrow) { |
| int rowCount = Math.max(1, canRowsGrow.size()); |
| int columnCount = Math.max(1, canColumnsGrow.size()); |
| container.setLayoutManager(this, new GridLayoutManager(rowCount, columnCount)); |
| } |
| |
| @Override |
| protected void changeLayoutFromIndexed(final RadContainer container, final List<RadComponent> components) { |
| container.setLayoutManager(this, new GridLayoutManager(1, Math.max(1, components.size()))); |
| } |
| |
| public void writeLayout(final XmlWriter writer, final RadContainer radContainer) { |
| GridLayoutManager layout = (GridLayoutManager) radContainer.getLayout(); |
| |
| writer.addAttribute("row-count", layout.getRowCount()); |
| writer.addAttribute("column-count", layout.getColumnCount()); |
| |
| writer.addAttribute(UIFormXmlConstants.ATTRIBUTE_SAME_SIZE_HORIZONTALLY, layout.isSameSizeHorizontally()); |
| writer.addAttribute(UIFormXmlConstants.ATTRIBUTE_SAME_SIZE_VERTICALLY, layout.isSameSizeVertically()); |
| |
| RadXYLayoutManager.INSTANCE.writeLayout(writer, radContainer); |
| } |
| |
| public void addComponentToContainer(final RadContainer container, final RadComponent component, final int index) { |
| super.addComponentToContainer(container, component, index); |
| container.getDelegee().add(component.getDelegee(), component.getConstraints()); |
| } |
| |
| @Override |
| protected void updateConstraints(RadComponent component) { |
| GridLayoutManager layout = (GridLayoutManager) component.getParent().getLayout(); |
| final GridConstraints radConstraints = component.getConstraints(); |
| final GridConstraints delegeeConstraints = layout.getConstraintsForComponent(component.getDelegee()); |
| if (radConstraints != delegeeConstraints) { |
| delegeeConstraints.restore(radConstraints); |
| } |
| super.updateConstraints(component); |
| } |
| |
| public void writeChildConstraints(final XmlWriter writer, final RadComponent child) { |
| writeGridConstraints(writer, child); |
| } |
| |
| @Override public Property[] getContainerProperties(final Project project) { |
| return new Property[] { |
| MarginProperty.getInstance(project), |
| HGapProperty.getInstance(project), |
| VGapProperty.getInstance(project), |
| SameSizeHorizontallyProperty.getInstance(project), |
| SameSizeVerticallyProperty.getInstance(project) |
| }; |
| } |
| |
| @Override public Property[] getComponentProperties(final Project project, final RadComponent component) { |
| return new Property[] { |
| HSizePolicyProperty.getInstance(project), |
| VSizePolicyProperty.getInstance(project), |
| HorzAlignProperty.getInstance(project), |
| VertAlignProperty.getInstance(project), |
| IndentProperty.getInstance(project), |
| UseParentLayoutProperty.getInstance(project), |
| MinimumSizeProperty.getInstance(project), |
| PreferredSizeProperty.getInstance(project), |
| MaximumSizeProperty.getInstance(project) |
| }; |
| } |
| |
| @Override public int getGridRowCount(RadContainer container) { |
| return ((GridLayoutManager) container.getLayout()).getRowCount(); |
| } |
| |
| @Override public int getGridColumnCount(RadContainer container) { |
| return ((GridLayoutManager) container.getLayout()).getColumnCount(); |
| } |
| |
| @Override public int[] getHorizontalGridLines(RadContainer container) { |
| GridLayoutManager grid = (GridLayoutManager) container.getLayout(); |
| return grid.getHorizontalGridLines(); |
| } |
| |
| @Override public int[] getVerticalGridLines(RadContainer container) { |
| GridLayoutManager grid = (GridLayoutManager) container.getLayout(); |
| return grid.getVerticalGridLines(); |
| } |
| |
| public int[] getGridCellCoords(RadContainer container, boolean isRow) { |
| GridLayoutManager grid = (GridLayoutManager) container.getLayout(); |
| return isRow ? grid.getYs() : grid.getXs(); |
| } |
| |
| public int[] getGridCellSizes(RadContainer container, boolean isRow) { |
| GridLayoutManager grid = (GridLayoutManager) container.getLayout(); |
| return isRow ? grid.getHeights() : grid.getWidths(); |
| } |
| |
| @Override |
| public CustomPropertiesPanel getRowColumnPropertiesPanel(RadContainer container, boolean isRow, int[] selectedIndices) { |
| if (myPropertiesPanel == null) { |
| myPropertiesPanel = new GridLayoutColumnProperties(); |
| } |
| myPropertiesPanel.showProperties(container, isRow, selectedIndices); |
| return myPropertiesPanel; |
| } |
| |
| @Override |
| public ActionGroup getCaptionActions() { |
| DefaultActionGroup group = new DefaultActionGroup(); |
| group.add(new InsertBeforeAction()); |
| group.add(new InsertAfterAction()); |
| group.add(new SplitAction()); |
| group.add(new DeleteAction()); |
| return group; |
| } |
| |
| @Override |
| public boolean canCellGrow(RadContainer container, boolean isRow, int cellIndex) { |
| final GridLayoutManager gridLayoutManager = ((GridLayoutManager)container.getLayout()); |
| int maxSizePolicy = 0; |
| for(int i=0; i<gridLayoutManager.getCellCount(isRow); i++) { |
| maxSizePolicy = Math.max(maxSizePolicy, gridLayoutManager.getCellSizePolicy(isRow, i)); |
| } |
| return gridLayoutManager.getCellSizePolicy(isRow, cellIndex) == maxSizePolicy; |
| } |
| |
| public void processCellResized(RadContainer container, final boolean isRow, final int cell, final int newSize) { |
| int cellCount = isRow ? container.getGridRowCount() : container.getGridColumnCount(); |
| if (container.getParent().isXY() && cell == cellCount-1) { |
| processRootContainerResize(container, isRow, newSize); |
| } |
| else { |
| for(RadComponent component: container.getComponents()) { |
| GridConstraints c = component.getConstraints(); |
| if (c.getCell(isRow) == cell && c.getSpan(isRow) == 1) { |
| Dimension preferredSize = new Dimension(c.myPreferredSize); |
| if (isRow) { |
| preferredSize.height = newSize; |
| if (preferredSize.width == -1) { |
| preferredSize.width = component.getDelegee().getPreferredSize().width; |
| } |
| } |
| else { |
| preferredSize.width = newSize; |
| if (preferredSize.height == -1) { |
| preferredSize.height = component.getDelegee().getPreferredSize().height; |
| } |
| } |
| PreferredSizeProperty.getInstance(container.getProject()).setValueEx(component, preferredSize); |
| } |
| } |
| } |
| } |
| |
| private static void processRootContainerResize(final RadContainer container, final boolean isRow, final int newSize) { |
| final JComponent parentDelegee = container.getDelegee(); |
| Dimension containerSize = parentDelegee.getSize(); |
| if (isRow) { |
| containerSize.height = newSize + parentDelegee.getBounds().y; |
| } |
| else { |
| containerSize.width = newSize + parentDelegee.getBounds().x; |
| } |
| parentDelegee.setSize(containerSize); |
| parentDelegee.revalidate(); |
| } |
| |
| public void copyGridSection(final RadContainer source, final RadContainer destination, final Rectangle rc) { |
| destination.setLayout(new GridLayoutManager(rc.height, rc.width)); |
| } |
| |
| @Override |
| public LayoutManager copyLayout(LayoutManager layout, int rowDelta, int columnDelta) { |
| GridLayoutManager oldLayout = (GridLayoutManager) layout; |
| final GridLayoutManager newLayout = new GridLayoutManager(oldLayout.getRowCount() + rowDelta, oldLayout.getColumnCount() + columnDelta); |
| newLayout.setMargin(oldLayout.getMargin()); |
| newLayout.setHGap(oldLayout.getHGap()); |
| newLayout.setVGap(oldLayout.getVGap()); |
| return newLayout; |
| } |
| } |