/* * 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.core; import java.awt.*; import java.util.ArrayList; public final class Util { private static final Dimension MAX_SIZE = new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE); public static final int DEFAULT_INDENT = 10; public static Dimension getMinimumSize(final Component component, final GridConstraints constraints, final boolean addIndent){ try { final Dimension size = getSize(constraints.myMinimumSize, component.getMinimumSize()); if (addIndent) { size.width += DEFAULT_INDENT * constraints.getIndent(); } return size; } catch (NullPointerException npe) { //IDEA-80722 return new Dimension(0,0); } } public static Dimension getMaximumSize(final Component component, final GridConstraints constraints, final boolean addIndent){ try { //[anton] we use only our property for maximum size. // JButton reports that its max size = pref size, so it is impossible to make a column of same sized buttons. // Probably there are other bad cases... final Dimension size = getSize(constraints.myMaximumSize, MAX_SIZE); if (addIndent && size.width < MAX_SIZE.width) { size.width += DEFAULT_INDENT * constraints.getIndent(); } return size; } catch (NullPointerException e) {//IDEA-80722 return new Dimension(0,0); } } public static Dimension getPreferredSize(final Component component, final GridConstraints constraints, final boolean addIndent) { try { final Dimension size = getSize(constraints.myPreferredSize, component.getPreferredSize()); if (addIndent) { size.width += DEFAULT_INDENT * constraints.getIndent(); } return size; } catch (NullPointerException e) {//IDEA-80722 return new Dimension(0,0); } } private static Dimension getSize(final Dimension overridenSize, final Dimension ownSize){ final int overridenWidth = overridenSize.width >= 0 ? overridenSize.width : ownSize.width; final int overridenHeight = overridenSize.height >= 0 ? overridenSize.height : ownSize.height; return new Dimension(overridenWidth, overridenHeight); } public static void adjustSize(final Component component, final GridConstraints constraints, final Dimension size) { final Dimension minimumSize = getMinimumSize(component, constraints, false); final Dimension maximumSize = getMaximumSize(component, constraints, false); size.width = Math.max(size.width, minimumSize.width); size.height = Math.max(size.height, minimumSize.height); size.width = Math.min(size.width, maximumSize.width); size.height = Math.min(size.height, maximumSize.height); } /** * * @param elimitated output parameter; will be filled indices (Integers) of eliminated cells. May be null. * @return */ public static int eliminate(final int[] cellIndices, final int[] spans, final ArrayList elimitated) { final int size = cellIndices.length; if (size != spans.length){ throw new IllegalArgumentException("size mismatch: " + size + ", " + spans.length); } if (elimitated != null && elimitated.size() != 0) { throw new IllegalArgumentException("eliminated must be empty"); } int cellCount = 0; for (int i = 0; i < size; i++) { cellCount = Math.max(cellCount, cellIndices[i] + spans[i]); } outer: for (int cell=cellCount - 1; cell >= 0; cell--) { // check if we should eliminate cell boolean starts = false; boolean ends = false; for (int i = 0; i < size; i++) { if (cellIndices[i] == cell) { starts = true; } if (cellIndices[i] + spans[i] - 1 == cell) { ends = true; } } if (starts && ends) { continue; } if (elimitated != null){ elimitated.add(new Integer(cell)); } // eliminate cell for (int i = 0; i < size; i++) { final boolean decreaseSpan = cellIndices[i] <= cell && cell < cellIndices[i] + spans[i]; final boolean decreaseIndex = cellIndices[i] > cell; if (decreaseSpan) { spans[i]--; } if (decreaseIndex) { cellIndices[i]--; } } cellCount--; } return cellCount; } }