blob: 3c88999ecb603fd7c58f63b23884dc65223f1a9d [file] [log] [blame]
/*
* 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;
}
}