Mega Code Archive

 
Categories / Java / Swing JFC
 

Table Layout implements LayoutManager2

/* Copyright (c) 2006, 2009, Carl Burch. License information is located in the  * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */   import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.LayoutManager2; import java.util.ArrayList; public class TableLayout implements LayoutManager2 {     private int colCount;     private ArrayList contents; // of Component[]     private int curRow;     private int curCol;     private Dimension prefs;     private int[] prefRow;     private int[] prefCol;     private double[] rowWeight;          public TableLayout(int colCount) {         this.colCount = colCount;         this.contents = new ArrayList();         this.curRow = 0;         this.curCol = 0;     }          public void setRowWeight(int rowIndex, double weight) {         if(weight < 0) {             throw new IllegalArgumentException("weight must be nonnegative");         }         if(rowIndex < 0) {             throw new IllegalArgumentException("row index must be nonnegative");         }         if((rowWeight == null || rowIndex >= rowWeight.length) && weight != 0.0) {             double[] a = new double[rowIndex + 10];             if(rowWeight != null) System.arraycopy(rowWeight, 0, a, 0, rowWeight.length);             rowWeight = a;         }         rowWeight[rowIndex] = weight;     }     public void addLayoutComponent(String name, Component comp) {         while(curRow >= contents.size()) {             contents.add(new Component[colCount]);         }         Component[] rowContents = (Component[]) contents.get(curRow);         rowContents[curCol] = comp;         ++curCol;         if(curCol == colCount) {             ++curRow;             curCol = 0;         }         prefs = null;     }     public void addLayoutComponent(Component comp, Object constraints) {         if(constraints instanceof TableConstraints) {             TableConstraints con = (TableConstraints) constraints;             if(con.getRow() >= 0) curRow = con.getRow();             if(con.getCol() >= 0) curCol = con.getCol();         }         addLayoutComponent("", comp);     }     public void removeLayoutComponent(Component comp) {         for(int i = 0, n = contents.size(); i < n; i++) {             Component[] row = (Component[]) contents.get(i);             for(int j = 0; j < row.length; j++) {                 if(row[j] == comp) {                     row[j] = null;                     return;                 }             }         }         prefs = null;     }     public Dimension preferredLayoutSize(Container parent) {         if(prefs == null) {             int[] prefCol = new int[colCount];             int[] prefRow = new int[contents.size()];              int height = 0;             for(int i = 0; i < prefRow.length; i++) {                 Component[] row = (Component[]) contents.get(i);                 int rowHeight = 0;                 for(int j = 0; j < row.length; j++) {                     if(row[j] != null) {                         Dimension dim = row[j].getPreferredSize();                         if(dim.height > rowHeight) rowHeight = dim.height;                         if(dim.width > prefCol[j]) prefCol[j] = dim.width;                     }                 }                 prefRow[i] = rowHeight;                 height += rowHeight;             }             int width = 0;             for(int i = 0; i < prefCol.length; i++) {                 width += prefCol[i];             }             this.prefs = new Dimension(width, height);             this.prefRow = prefRow;             this.prefCol = prefCol;         }         return new Dimension(prefs);     }     public Dimension minimumLayoutSize(Container parent) {         return preferredLayoutSize(parent);     }     public Dimension maximumLayoutSize(Container parent) {         return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE);     }     public float getLayoutAlignmentX(Container parent) {         return 0.5f;     }     public float getLayoutAlignmentY(Container parent) {         return 0.5f;     }     public void layoutContainer(Container parent) {         Dimension pref = preferredLayoutSize(parent);         int[] prefRow = this.prefRow;         int[] prefCol = this.prefCol;         Dimension size = parent.getSize();                  double y0;         int yRemaining = size.height - pref.height;         double rowWeightTotal = 0.0;         if(yRemaining != 0 && rowWeight != null) {             for(int i = 0; i < rowWeight.length; i++) {                 rowWeightTotal += rowWeight[i];             }         }         if(rowWeightTotal == 0.0 && yRemaining > 0) {             y0 = yRemaining / 2.0;         } else {             y0 = 0;         }                  int x0 = (size.width - pref.width) / 2;         if(x0 < 0) x0 = 0;         double y = y0;         for(int i = 0, n = contents.size(); i < n; i++) {             Component[] row = (Component[]) contents.get(i);             int yRound = (int) (y + 0.5);             int x = x0;             for(int j = 0; j < row.length; j++) {                 Component comp = row[j];                 if(comp != null) {                     row[j].setBounds(x, yRound, prefCol[j], prefRow[i]);                 }                 x += prefCol[j];             }             y += prefRow[i];             if(rowWeightTotal > 0 && i < rowWeight.length) {                 y += yRemaining * rowWeight[i] / rowWeightTotal;             }         }                           // TODO Auto-generated method stub              }     public void invalidateLayout(Container parent) {         prefs = null;     } } /* Copyright (c) 2006, 2009, Carl Burch. License information is located in the  * com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */  class TableConstraints {     public static TableConstraints at(int row, int col) {         return new TableConstraints(row, col);     }          private int col;     private int row;          private TableConstraints(int row, int col) {         this.col = col;         this.row = row;     }          int getRow() {         return row;     }          int getCol() {         return col;     } }