public TransferFrame() {
    prefs = new ASPPreferences();
    setTitle("ASP seed data Transfer V" + serialVersionUID);
    setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);

    // Create panel for channel list and file list
    movePanel = createMovePanel();

    // Create panel for text fields
    entryPanel = createEntryPanel();

    // Create panel for time span
    timeSpanPanel = createTimeSpanPanel();

    // Status message box
    msgBox = new JTextArea();
    // msgBox.setFont(new Font("Serif", Font.PLAIN, 16));
    msgBox.setLineWrap(true);
    msgBox.setWrapStyleWord(true);
    msgBox.setEditable(false);
    scrollMsgBox = new JScrollPane(msgBox);
    scrollMsgBox.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    scrollMsgBox.setPreferredSize(new Dimension(250, 250));
    scrollMsgBox.setBorder(
        BorderFactory.createCompoundBorder(
            BorderFactory.createCompoundBorder(
                BorderFactory.createTitledBorder("Status display"),
                BorderFactory.createEmptyBorder(5, 5, 5, 5)),
            scrollMsgBox.getBorder()));

    // Build panel
    JPanel panel = new JPanel();
    SpringLayout layout = new SpringLayout();
    panel.setLayout(layout);

    Spring s = Spring.constant(0, 20, 10000);
    Spring s0 = Spring.constant(0, 0, 0);

    layout.putConstraint(SpringLayout.EAST, timeSpanPanel, s0, SpringLayout.EAST, panel);
    layout.putConstraint(SpringLayout.EAST, scrollMsgBox, s0, SpringLayout.EAST, panel);
    layout.putConstraint(SpringLayout.EAST, movePanel, s0, SpringLayout.EAST, panel);

    layout.putConstraint(SpringLayout.WEST, entryPanel, s0, SpringLayout.WEST, panel);
    layout.putConstraint(SpringLayout.WEST, movePanel, s0, SpringLayout.WEST, entryPanel);
    layout.putConstraint(SpringLayout.WEST, scrollMsgBox, s0, SpringLayout.WEST, movePanel);

    layout.putConstraint(SpringLayout.NORTH, movePanel, s, SpringLayout.NORTH, panel);
    layout.putConstraint(SpringLayout.NORTH, entryPanel, s, SpringLayout.SOUTH, movePanel);

    layout.putConstraint(SpringLayout.NORTH, timeSpanPanel, s0, SpringLayout.NORTH, entryPanel);
    layout.putConstraint(SpringLayout.NORTH, scrollMsgBox, s, SpringLayout.SOUTH, timeSpanPanel);
    layout.putConstraint(SpringLayout.SOUTH, panel, s, SpringLayout.SOUTH, scrollMsgBox);
    panel.add(movePanel);
    panel.add(entryPanel);
    panel.add(timeSpanPanel);
    panel.add(scrollMsgBox);

    getContentPane().add(panel);
  } // constructor TransferFrame()
  protected JComponent createListPanel() {
    JPanel panel = new JPanel(new SpringLayout());

    // Channel list window
    channelListModel = new DefaultListModel();
    channelListBox = new JList(channelListModel);
    channelListBox.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
    channelListBox.setLayoutOrientation(JList.VERTICAL);
    channelListBox.setVisibleRowCount(12);
    channelListBox.setPrototypeCellValue("00-BHZ 2008/01/01 00:00:00 2008/12/31 24:00:00 200000");

    JScrollPane scrollChannelListBox = new JScrollPane(channelListBox);
    scrollChannelListBox.setName("Channel List");
    scrollChannelListBox.setPreferredSize(new Dimension(350, 210));
    scrollChannelListBox.setVisible(true);

    // ListAll button
    ActionListener listAction = this;
    listAllButton = new JButton("List All");
    listAllButton.addActionListener(listAction);

    // ListFiltered button
    listFilteredButton = new JButton("List Filtered");
    listFilteredButton.addActionListener(listAction);

    SpringLayout layout = (SpringLayout) panel.getLayout();
    Spring s = Spring.constant(0, 20, 10000);
    Spring s0 = Spring.constant(0, 0, 0);
    layout.putConstraint(SpringLayout.WEST, listAllButton, s, SpringLayout.WEST, panel);
    layout.putConstraint(
        SpringLayout.WEST, scrollChannelListBox, s0, SpringLayout.WEST, listAllButton);
    layout.putConstraint(
        SpringLayout.EAST, listFilteredButton, s0, SpringLayout.EAST, scrollChannelListBox);
    layout.putConstraint(SpringLayout.EAST, panel, s, SpringLayout.EAST, listFilteredButton);

    layout.putConstraint(SpringLayout.NORTH, scrollChannelListBox, s, SpringLayout.NORTH, panel);
    layout.putConstraint(
        SpringLayout.NORTH, listAllButton, s, SpringLayout.SOUTH, scrollChannelListBox);
    layout.putConstraint(
        SpringLayout.NORTH, listFilteredButton, s0, SpringLayout.NORTH, listAllButton);
    layout.putConstraint(SpringLayout.SOUTH, panel, s, SpringLayout.SOUTH, listFilteredButton);
    layout.putConstraint(SpringLayout.SOUTH, panel, s, SpringLayout.SOUTH, listAllButton);

    panel.add(scrollChannelListBox);
    panel.add(listAllButton);
    panel.add(listFilteredButton);

    panel.setBorder(
        BorderFactory.createCompoundBorder(
            BorderFactory.createCompoundBorder(
                BorderFactory.createTitledBorder("Channel List"),
                BorderFactory.createEmptyBorder(5, 5, 5, 5)),
            panel.getBorder()));
    return panel;
  } // createListPanel()
  /**
   * Aligns the widths of all columns and handles the spanned components.
   *
   * @param layout
   * @param grid
   * @param cols
   * @param rows
   * @param spannedComponents
   * @return
   */
  private Spring alignColumns(
      SpringLayout layout,
      List<List<Component>> grid,
      int cols,
      int rows,
      Map<Component, int[]> spannedComponents) {
    // Align all cells in each column and make them the same width.
    Spring x = Spring.constant(this.leftMargin);
    Spring[] colWidths = new Spring[cols], colXs = new Spring[cols];
    for (int c = 0; c < cols; c++) {
      colXs[c] = x;
      colWidths[c] = Spring.constant(0);
      for (int r = 0; r < rows; r++) {
        final Component cell = grid.get(r).get(c);
        if (cell != null && !spannedComponents.containsKey(cell))
          colWidths[c] = Spring.max(colWidths[c], layout.getConstraints(cell).getWidth());
      }

      for (int r = 0; r < rows; r++) {
        final Component cell = grid.get(r).get(c);
        if (cell != null && !spannedComponents.containsKey(cell)) {
          SpringLayout.Constraints constraints = layout.getConstraints(grid.get(r).get(c));
          constraints.setX(x);
          constraints.setWidth(colWidths[c]);
        }
      }
      x =
          Spring.sum(
              x,
              Spring.sum(
                  colWidths[c], Spring.constant(c == cols - 1 ? this.rightMargin : this.xPad)));
    }
    for (Entry<Component, int[]> spans : spannedComponents.entrySet()) {
      SpringLayout.Constraints constraints = layout.getConstraints(spans.getKey());
      final int[] colRange = spans.getValue();
      constraints.setX(colXs[colRange[0]]);
      Spring width = colWidths[colRange[0]];
      for (int col = colRange[0] + 1; col <= colRange[1]; col++)
        width = Spring.sum(Spring.sum(width, colWidths[col]), Spring.constant(this.xPad));
      constraints.setWidth(width);
    }
    return x;
  }
  protected JComponent createMovePanel() {
    JPanel panel = new JPanel(new SpringLayout());

    // List panel
    listPanel = createListPanel();

    // Action panel
    actionPanel = createActionPanel();

    // Set up local file system window to show transfered seed data
    localSeedFileFrame = new JFileChooser();
    localSeedFileFrame.setCurrentDirectory(new File(prefs.GetLocalDir()));

    // This is a navigate and list only file frame
    localSeedFileFrame.setControlButtonsAreShown(false);
    localSeedFileFrame.getComponent(localSeedFileFrame.getComponentCount() - 1).setVisible(false);

    panel.add(listPanel);
    panel.add(actionPanel);
    panel.add(localSeedFileFrame);

    SpringLayout layout = (SpringLayout) panel.getLayout();
    Spring s0 = Spring.constant(0, 0, 0);
    layout.putConstraint(SpringLayout.WEST, listPanel, s0, SpringLayout.WEST, panel);
    layout.putConstraint(SpringLayout.WEST, actionPanel, s0, SpringLayout.EAST, listPanel);
    layout.putConstraint(SpringLayout.WEST, localSeedFileFrame, s0, SpringLayout.EAST, actionPanel);
    layout.putConstraint(SpringLayout.EAST, panel, s0, SpringLayout.EAST, localSeedFileFrame);

    layout.putConstraint(SpringLayout.NORTH, localSeedFileFrame, s0, SpringLayout.NORTH, panel);
    layout.putConstraint(
        SpringLayout.NORTH, actionPanel, s0, SpringLayout.NORTH, localSeedFileFrame);
    layout.putConstraint(SpringLayout.NORTH, listPanel, s0, SpringLayout.NORTH, actionPanel);
    layout.putConstraint(SpringLayout.SOUTH, listPanel, s0, SpringLayout.SOUTH, actionPanel);
    layout.putConstraint(
        SpringLayout.SOUTH, actionPanel, s0, SpringLayout.SOUTH, localSeedFileFrame);
    layout.putConstraint(SpringLayout.SOUTH, panel, s0, SpringLayout.SOUTH, localSeedFileFrame);

    return panel;
  } // createMovePanel()
 /**
  * Aligns the height of all cells in a row.
  *
  * @param layout
  * @param grid
  * @param cols
  * @param rows
  * @return
  */
 private Spring alignRows(SpringLayout layout, List<List<Component>> grid, int cols, int rows) {
   // Align all cells in each row and make them the same height.
   Spring y = Spring.constant(this.topMargin);
   int[] rowSpacing = new int[rows];
   Arrays.fill(rowSpacing, this.yPad);
   // no space above filler line
   rowSpacing[rows - 2] = 0;
   rowSpacing[rows - 1] = this.bottomMargin;
   for (int r = 0; r < rows; r++) {
     Spring height = Spring.constant(0);
     for (int c = 0; c < cols; c++)
       if (grid.get(r).get(c) != null)
         height = Spring.max(height, layout.getConstraints(grid.get(r).get(c)).getHeight());
     for (int c = 0; c < cols; c++)
       if (grid.get(r).get(c) != null) {
         SpringLayout.Constraints constraints = layout.getConstraints(grid.get(r).get(c));
         constraints.setY(y);
         constraints.setHeight(height);
       }
     y = Spring.sum(y, Spring.sum(height, Spring.constant(rowSpacing[r])));
   }
   return y;
 }
  /**
   * Aligns the first <code>rows</code> * <code>cols</code> components of <code>parent</code> in a
   * grid. Each component is as big as the maximum preferred width and height of the components. The
   * parent is made just big enough to fit them all.
   *
   * @param rows number of rows
   * @param cols number of columns
   * @param initialX x location to start the grid at
   * @param initialY y location to start the grid at
   * @param xPad x padding between cells
   * @param yPad y padding between cells
   */
  public static void makeGrid(
      Container parent, int rows, int cols, int initialX, int initialY, int xPad, int yPad) {
    SpringLayout layout;
    try {
      layout = (SpringLayout) parent.getLayout();
    } catch (ClassCastException exc) {
      System.err.println("The first argument to makeGrid must use SpringLayout.");
      return;
    }

    Spring xPadSpring = Spring.constant(xPad);
    Spring yPadSpring = Spring.constant(yPad);
    Spring initialXSpring = Spring.constant(initialX);
    Spring initialYSpring = Spring.constant(initialY);
    int max = rows * cols;

    // Calculate Springs that are the max of the width/height so that all
    // cells have the same size.
    Spring maxWidthSpring = layout.getConstraints(parent.getComponent(0)).getWidth();
    Spring maxHeightSpring = layout.getConstraints(parent.getComponent(0)).getWidth();
    for (int i = 1; i < max; i++) {
      SpringLayout.Constraints cons = layout.getConstraints(parent.getComponent(i));

      maxWidthSpring = Spring.max(maxWidthSpring, cons.getWidth());
      maxHeightSpring = Spring.max(maxHeightSpring, cons.getHeight());
    }

    // Apply the new width/height Spring. This forces all the
    // components to have the same size.
    for (int i = 0; i < max; i++) {
      SpringLayout.Constraints cons = layout.getConstraints(parent.getComponent(i));

      cons.setWidth(maxWidthSpring);
      cons.setHeight(maxHeightSpring);
    }

    // Then adjust the x/y constraints of all the cells so that they
    // are aligned in a grid.
    SpringLayout.Constraints lastCons = null;
    SpringLayout.Constraints lastRowCons = null;
    for (int i = 0; i < max; i++) {
      SpringLayout.Constraints cons = layout.getConstraints(parent.getComponent(i));
      if (i % cols == 0) { // start of new row
        lastRowCons = lastCons;
        cons.setX(initialXSpring);
      } else { // x position depends on previous component
        cons.setX(Spring.sum(lastCons.getConstraint(SpringLayout.EAST), xPadSpring));
      }

      if (i / cols == 0) { // first row
        cons.setY(initialYSpring);
      } else { // y position depends on previous row
        cons.setY(Spring.sum(lastRowCons.getConstraint(SpringLayout.SOUTH), yPadSpring));
      }
      lastCons = cons;
    }

    // Set the parent's size.
    SpringLayout.Constraints pCons = layout.getConstraints(parent);
    pCons.setConstraint(
        SpringLayout.SOUTH,
        Spring.sum(Spring.constant(yPad), lastCons.getConstraint(SpringLayout.SOUTH)));
    pCons.setConstraint(
        SpringLayout.EAST,
        Spring.sum(Spring.constant(xPad), lastCons.getConstraint(SpringLayout.EAST)));
  }
  /**
   * Aligns the first <code>rows</code> * <code>cols</code> components of <code>parent</code> in a
   * grid. Each component in a column is as wide as the maximum preferred width of the components in
   * that column; height is similarly determined for each row. The parent is made just big enough to
   * fit them all.
   *
   * @param rows number of rows
   * @param cols number of columns
   * @param initialX x location to start the grid at
   * @param initialY y location to start the grid at
   * @param xPad x padding between cells
   * @param yPad y padding between cells
   */
  public static void makeCompactGrid(
      Container parent, int rows, int cols, int initialX, int initialY, int xPad, int yPad) {
    SpringLayout layout;
    try {
      layout = (SpringLayout) parent.getLayout();
    } catch (ClassCastException exc) {
      System.err.println("The first argument to makeCompactGrid must use SpringLayout.");
      return;
    }

    // Align all cells in each column and make them the same width.
    Spring x = Spring.constant(initialX);
    for (int c = 0; c < cols; c++) {
      Spring width = Spring.constant(0);
      for (int r = 0; r < rows; r++) {
        width = Spring.max(width, getConstraintsForCell(r, c, parent, cols).getWidth());
      }
      for (int r = 0; r < rows; r++) {
        SpringLayout.Constraints constraints = getConstraintsForCell(r, c, parent, cols);
        constraints.setX(x);
        constraints.setWidth(width);
      }
      x = Spring.sum(x, Spring.sum(width, Spring.constant(xPad)));
    }

    // Align all cells in each row and make them the same height.
    Spring y = Spring.constant(initialY);
    for (int r = 0; r < rows; r++) {
      Spring height = Spring.constant(0);
      for (int c = 0; c < cols; c++) {
        height = Spring.max(height, getConstraintsForCell(r, c, parent, cols).getHeight());
      }
      for (int c = 0; c < cols; c++) {
        SpringLayout.Constraints constraints = getConstraintsForCell(r, c, parent, cols);
        constraints.setY(y);
        constraints.setHeight(height);
      }
      y = Spring.sum(y, Spring.sum(height, Spring.constant(yPad)));
    }

    // Set the parent's size.
    SpringLayout.Constraints pCons = layout.getConstraints(parent);
    pCons.setConstraint(SpringLayout.SOUTH, y);
    pCons.setConstraint(SpringLayout.EAST, x);
  }
  private void setupGui() {
    setIconImage(
        Toolkit.getDefaultToolkit().getImage(this.getClass().getResource("/image/logo_ftb.png")));
    setTitle(I18N.getLocaleString("FILTER_TITLE"));
    setResizable(false);

    Container panel = getContentPane();
    SpringLayout layout = new SpringLayout();
    panel.setLayout(layout);

    originLbl = new JLabel(I18N.getLocaleString("FILTER_ORIGIN"));
    availabilityLbl = new JLabel(I18N.getLocaleString("FILTER_MODPACKAVALIABILITY"));
    mcVersionLbl = new JLabel(I18N.getLocaleString("FILTER_MCVERSION"));
    origin = new JComboBox();
    mcVersion = new JComboBox();
    availability = new JComboBox();
    apply = new JButton(I18N.getLocaleString("FILTER_APPLY"));
    cancel = new JButton(I18N.getLocaleString("MAIN_CANCEL"));
    search = new JButton(I18N.getLocaleString("FILTER_SEARCHPACK"));

    origin.setPrototypeDisplayValue("xxxxxxxxxxxx");
    mcVersion.setPrototypeDisplayValue("xxxxxxxxxxxx");
    availability.setPrototypeDisplayValue("xxxxxxxxxxxx");

    panel.add(mcVersionLbl);
    panel.add(mcVersion);
    panel.add(originLbl);
    panel.add(origin);
    panel.add(availability);
    panel.add(availabilityLbl);
    panel.add(apply);
    panel.add(cancel);
    panel.add(search);

    Spring hSpring;
    Spring columnWidth;

    hSpring = Spring.constant(10);

    layout.putConstraint(SpringLayout.WEST, mcVersionLbl, hSpring, SpringLayout.WEST, panel);
    layout.putConstraint(SpringLayout.WEST, originLbl, hSpring, SpringLayout.WEST, panel);
    layout.putConstraint(SpringLayout.WEST, availabilityLbl, hSpring, SpringLayout.WEST, panel);

    columnWidth = Spring.width(mcVersionLbl);
    columnWidth = Spring.max(columnWidth, Spring.width(originLbl));
    columnWidth = Spring.max(columnWidth, Spring.width(availabilityLbl));

    hSpring = Spring.sum(hSpring, columnWidth);
    hSpring = Spring.sum(hSpring, Spring.constant(10));

    layout.putConstraint(SpringLayout.WEST, mcVersion, hSpring, SpringLayout.WEST, panel);
    layout.putConstraint(SpringLayout.WEST, origin, hSpring, SpringLayout.WEST, panel);
    layout.putConstraint(SpringLayout.WEST, availability, hSpring, SpringLayout.WEST, panel);

    columnWidth = Spring.width(mcVersion);
    columnWidth = Spring.max(columnWidth, Spring.width(origin));
    columnWidth = Spring.max(columnWidth, Spring.width(availability));

    hSpring = Spring.sum(hSpring, columnWidth);

    layout.putConstraint(SpringLayout.EAST, mcVersion, hSpring, SpringLayout.WEST, panel);
    layout.putConstraint(SpringLayout.EAST, origin, hSpring, SpringLayout.WEST, panel);
    layout.putConstraint(SpringLayout.EAST, availability, hSpring, SpringLayout.WEST, panel);

    hSpring = Spring.sum(hSpring, Spring.constant(10));

    layout.putConstraint(SpringLayout.EAST, panel, hSpring, SpringLayout.WEST, panel);

    layout.putConstraint(SpringLayout.WEST, search, 10, SpringLayout.WEST, panel);
    layout.putConstraint(SpringLayout.EAST, search, -5, SpringLayout.HORIZONTAL_CENTER, panel);
    layout.putConstraint(SpringLayout.WEST, cancel, 5, SpringLayout.HORIZONTAL_CENTER, panel);
    layout.putConstraint(SpringLayout.EAST, cancel, -10, SpringLayout.EAST, panel);

    layout.putConstraint(SpringLayout.WEST, apply, 10, SpringLayout.WEST, panel);
    layout.putConstraint(SpringLayout.EAST, apply, -10, SpringLayout.EAST, panel);

    Spring vSpring;
    Spring rowHeight;

    vSpring = Spring.constant(10);

    layout.putConstraint(SpringLayout.BASELINE, mcVersionLbl, 0, SpringLayout.BASELINE, mcVersion);
    layout.putConstraint(SpringLayout.NORTH, mcVersion, vSpring, SpringLayout.NORTH, panel);

    rowHeight = Spring.height(mcVersionLbl);
    rowHeight = Spring.max(rowHeight, Spring.height(mcVersion));

    vSpring = Spring.sum(vSpring, rowHeight);
    vSpring = Spring.sum(vSpring, Spring.constant(5));

    layout.putConstraint(SpringLayout.BASELINE, originLbl, 0, SpringLayout.BASELINE, origin);
    layout.putConstraint(SpringLayout.NORTH, origin, vSpring, SpringLayout.NORTH, panel);

    rowHeight = Spring.height(originLbl);
    rowHeight = Spring.max(rowHeight, Spring.height(origin));

    vSpring = Spring.sum(vSpring, rowHeight);
    vSpring = Spring.sum(vSpring, Spring.constant(5));

    layout.putConstraint(
        SpringLayout.BASELINE, availabilityLbl, 0, SpringLayout.BASELINE, availability);
    layout.putConstraint(SpringLayout.NORTH, availability, vSpring, SpringLayout.NORTH, panel);

    rowHeight = Spring.height(availabilityLbl);
    rowHeight = Spring.max(rowHeight, Spring.height(availability));

    vSpring = Spring.sum(vSpring, rowHeight);
    vSpring = Spring.sum(vSpring, Spring.constant(10));

    layout.putConstraint(SpringLayout.NORTH, search, vSpring, SpringLayout.NORTH, panel);
    layout.putConstraint(SpringLayout.NORTH, cancel, vSpring, SpringLayout.NORTH, panel);

    rowHeight = Spring.height(search);
    rowHeight = Spring.max(rowHeight, Spring.height(cancel));

    vSpring = Spring.sum(vSpring, rowHeight);
    vSpring = Spring.sum(vSpring, Spring.constant(5));

    layout.putConstraint(SpringLayout.NORTH, apply, vSpring, SpringLayout.NORTH, panel);

    vSpring = Spring.sum(vSpring, Spring.height(apply));
    vSpring = Spring.sum(vSpring, Spring.constant(10));

    layout.putConstraint(SpringLayout.SOUTH, panel, vSpring, SpringLayout.NORTH, panel);

    pack();
    setLocationRelativeTo(this.getOwner());
  }
  private void setupGui() {
    setIconImage(
        Toolkit.getDefaultToolkit().getImage(this.getClass().getResource("/image/logo_ftb.png")));
    setTitle(I18N.getLocaleString("FILTER_TITLE"));
    setResizable(false);

    Container panel = getContentPane();
    SpringLayout layout = new SpringLayout();
    panel.setLayout(layout);

    originLbl = new JLabel(I18N.getLocaleString("FILTER_ORIGIN"));
    typeLbl = new JLabel(I18N.getLocaleString("FILTER_PACKTYPE"));
    compatiblePackLbl = new JLabel(I18N.getLocaleString("FILTER_COMPERTIBLEPACK"));
    origin = new JComboBox();
    type = new JComboBox();
    compatiblePack = new JComboBox();
    apply = new JButton(I18N.getLocaleString("FILTER_APPLY"));
    cancel = new JButton(I18N.getLocaleString("MAIN_CANCEL"));
    search = new JButton(I18N.getLocaleString("FILTER_SEARCHMAP"));

    origin.setPrototypeDisplayValue("xxxxxxxxxxxxxxxxxxxxxxxxxx");
    type.setPrototypeDisplayValue("xxxxxxxxxxxxxxxxxxxxxxxxxx");
    compatiblePack.setPrototypeDisplayValue("xxxxxxxxxxxxxxxxxxxxxxxxxx");

    panel.add(typeLbl);
    panel.add(type);
    panel.add(originLbl);
    panel.add(origin);
    panel.add(compatiblePackLbl);
    panel.add(compatiblePack);
    panel.add(apply);
    panel.add(cancel);
    panel.add(search);

    Spring hSpring;
    Spring columnWidth;

    hSpring = Spring.constant(10);

    layout.putConstraint(SpringLayout.WEST, typeLbl, hSpring, SpringLayout.WEST, panel);
    layout.putConstraint(SpringLayout.WEST, originLbl, hSpring, SpringLayout.WEST, panel);
    layout.putConstraint(SpringLayout.WEST, compatiblePackLbl, hSpring, SpringLayout.WEST, panel);

    columnWidth =
        SwingUtils.springMax(
            Spring.width(typeLbl), Spring.width(originLbl), Spring.width(compatiblePackLbl));

    hSpring = SwingUtils.springSum(hSpring, columnWidth, Spring.constant(10));

    layout.putConstraint(SpringLayout.WEST, type, hSpring, SpringLayout.WEST, panel);
    layout.putConstraint(SpringLayout.WEST, origin, hSpring, SpringLayout.WEST, panel);
    layout.putConstraint(SpringLayout.WEST, compatiblePack, hSpring, SpringLayout.WEST, panel);

    columnWidth =
        SwingUtils.springMax(
            Spring.width(type), Spring.width(origin), Spring.width(compatiblePack));

    hSpring = Spring.sum(hSpring, columnWidth);

    layout.putConstraint(SpringLayout.EAST, type, hSpring, SpringLayout.WEST, panel);
    layout.putConstraint(SpringLayout.EAST, origin, hSpring, SpringLayout.WEST, panel);
    layout.putConstraint(SpringLayout.EAST, compatiblePack, hSpring, SpringLayout.WEST, panel);

    hSpring = Spring.sum(hSpring, Spring.constant(10));

    layout.putConstraint(SpringLayout.EAST, panel, hSpring, SpringLayout.WEST, panel);

    layout.putConstraint(SpringLayout.WEST, search, 10, SpringLayout.WEST, panel);
    layout.putConstraint(SpringLayout.EAST, search, -5, SpringLayout.HORIZONTAL_CENTER, panel);
    layout.putConstraint(SpringLayout.WEST, cancel, 5, SpringLayout.HORIZONTAL_CENTER, panel);
    layout.putConstraint(SpringLayout.EAST, cancel, -10, SpringLayout.EAST, panel);

    layout.putConstraint(SpringLayout.WEST, apply, 10, SpringLayout.WEST, panel);
    layout.putConstraint(SpringLayout.EAST, apply, -10, SpringLayout.EAST, panel);

    Spring vSpring;
    Spring rowHeight;

    vSpring = Spring.constant(10);

    layout.putConstraint(SpringLayout.BASELINE, typeLbl, 0, SpringLayout.BASELINE, type);
    layout.putConstraint(SpringLayout.NORTH, type, vSpring, SpringLayout.NORTH, panel);

    rowHeight = Spring.max(Spring.height(typeLbl), Spring.height(type));

    vSpring = SwingUtils.springSum(vSpring, rowHeight, Spring.constant(5));

    layout.putConstraint(SpringLayout.BASELINE, originLbl, 0, SpringLayout.BASELINE, origin);
    layout.putConstraint(SpringLayout.NORTH, origin, vSpring, SpringLayout.NORTH, panel);

    rowHeight = Spring.max(Spring.height(originLbl), Spring.height(origin));

    vSpring = SwingUtils.springSum(vSpring, rowHeight, Spring.constant(5));

    layout.putConstraint(
        SpringLayout.BASELINE, compatiblePackLbl, 0, SpringLayout.BASELINE, compatiblePack);
    layout.putConstraint(SpringLayout.NORTH, compatiblePack, vSpring, SpringLayout.NORTH, panel);

    rowHeight = Spring.height(compatiblePackLbl);
    rowHeight = Spring.max(rowHeight, Spring.height(compatiblePack));

    vSpring = SwingUtils.springSum(vSpring, rowHeight, Spring.constant(10));

    layout.putConstraint(SpringLayout.NORTH, search, vSpring, SpringLayout.NORTH, panel);
    layout.putConstraint(SpringLayout.NORTH, cancel, vSpring, SpringLayout.NORTH, panel);

    rowHeight = Spring.max(Spring.height(search), Spring.height(cancel));

    vSpring = SwingUtils.springSum(vSpring, rowHeight, Spring.constant(5));

    layout.putConstraint(SpringLayout.NORTH, apply, vSpring, SpringLayout.NORTH, panel);

    vSpring = SwingUtils.springSum(vSpring, Spring.height(apply), Spring.constant(10));

    layout.putConstraint(SpringLayout.SOUTH, panel, vSpring, SpringLayout.NORTH, panel);

    pack();
    setLocationRelativeTo(this.getOwner());
  }
  public static void makeGrid(
      Container parent, int rows, int cols, int initialX, int initialY, int xPad, int yPad) {
    SpringLayout layout;
    try {
      layout = (SpringLayout) parent.getLayout();
    } catch (ClassCastException exc) {
      System.err.println("The first argument to makeGrid must use SpringLayout.");
      return;
    }

    Spring xPadSpring = Spring.constant(xPad);
    Spring yPadSpring = Spring.constant(yPad);
    Spring initialXSpring = Spring.constant(initialX);
    Spring initialYSpring = Spring.constant(initialY);
    int max = rows * cols;

    Spring maxWidthSpring = layout.getConstraints(parent.getComponent(0)).getWidth();
    Spring maxHeightSpring = layout.getConstraints(parent.getComponent(0)).getWidth();
    for (int i = 1; i < max; i++) {
      SpringLayout.Constraints cons = layout.getConstraints(parent.getComponent(i));
      maxWidthSpring = Spring.max(maxWidthSpring, cons.getWidth());
      maxHeightSpring = Spring.max(maxHeightSpring, cons.getHeight());
    }

    for (int i = 0; i < max; i++) {
      SpringLayout.Constraints cons = layout.getConstraints(parent.getComponent(i));
      cons.setWidth(maxWidthSpring);
      cons.setHeight(maxHeightSpring);
    }

    SpringLayout.Constraints lastCons = null;
    SpringLayout.Constraints lastRowCons = null;
    for (int i = 0; i < max; i++) {
      SpringLayout.Constraints cons = layout.getConstraints(parent.getComponent(i));
      if (i % cols == 0) {
        lastRowCons = lastCons;
        cons.setX(initialXSpring);
      } else {
        cons.setX(Spring.sum(lastCons.getConstraint(SpringLayout.EAST), xPadSpring));
      }

      if (i / cols == 0) {
        cons.setY(initialYSpring);
      } else {
        cons.setY(Spring.sum(lastRowCons.getConstraint(SpringLayout.SOUTH), yPadSpring));
      }
      lastCons = cons;
    }

    SpringLayout.Constraints pCons = layout.getConstraints(parent);
    pCons.setConstraint(
        SpringLayout.SOUTH,
        Spring.sum(Spring.constant(yPad), lastCons.getConstraint(SpringLayout.SOUTH)));
    pCons.setConstraint(
        SpringLayout.EAST,
        Spring.sum(Spring.constant(xPad), lastCons.getConstraint(SpringLayout.EAST)));
  }
  private void setupGui() {
    setIconImage(
        Toolkit.getDefaultToolkit().getImage(this.getClass().getResource("/image/logo_ftb.png")));
    setTitle(I18N.getLocaleString("UPDATEMODPACK_TITLE"));
    setResizable(false);

    Container panel = getContentPane();
    SpringLayout layout = new SpringLayout();
    panel.setLayout(layout);

    messageLbl = new JLabel(I18N.getLocaleString("UPDATEMODPACK_ISAVALIBLE"));
    updateLbl = new JLabel(I18N.getLocaleString("UPDATE_WICHUPDATE"));
    backup = new JCheckBox(I18N.getLocaleString("UPDATEMODPACK_BACKUP"));
    update = new JButton(I18N.getLocaleString("MAIN_YES"));
    abort = new JButton(I18N.getLocaleString("MAIN_NO"));

    messageLbl.setHorizontalAlignment(SwingConstants.CENTER);
    updateLbl.setHorizontalAlignment(SwingConstants.CENTER);
    backup.setHorizontalAlignment(SwingConstants.CENTER);

    panel.add(messageLbl);
    panel.add(updateLbl);
    panel.add(backup);
    panel.add(update);
    panel.add(abort);

    Spring hSpring;
    Spring columnWidth;

    hSpring = Spring.constant(10);

    layout.putConstraint(SpringLayout.WEST, messageLbl, hSpring, SpringLayout.WEST, panel);
    layout.putConstraint(SpringLayout.WEST, updateLbl, hSpring, SpringLayout.WEST, panel);
    layout.putConstraint(SpringLayout.WEST, backup, hSpring, SpringLayout.WEST, panel);

    columnWidth = Spring.width(messageLbl);
    columnWidth = Spring.max(columnWidth, Spring.width(updateLbl));
    columnWidth = Spring.max(columnWidth, Spring.width(backup));

    hSpring = Spring.sum(hSpring, columnWidth);

    layout.putConstraint(SpringLayout.EAST, messageLbl, hSpring, SpringLayout.WEST, panel);
    layout.putConstraint(SpringLayout.EAST, updateLbl, hSpring, SpringLayout.WEST, panel);
    layout.putConstraint(SpringLayout.EAST, backup, hSpring, SpringLayout.WEST, panel);

    hSpring = Spring.sum(hSpring, Spring.constant(10));

    layout.putConstraint(SpringLayout.EAST, panel, hSpring, SpringLayout.WEST, panel);

    layout.putConstraint(
        SpringLayout.HORIZONTAL_CENTER, backup, 0, SpringLayout.HORIZONTAL_CENTER, panel);
    layout.putConstraint(SpringLayout.EAST, update, -5, SpringLayout.HORIZONTAL_CENTER, panel);
    layout.putConstraint(SpringLayout.WEST, abort, 5, SpringLayout.HORIZONTAL_CENTER, panel);

    Spring vSpring;
    Spring rowHeight;

    vSpring = Spring.constant(10);

    layout.putConstraint(SpringLayout.NORTH, messageLbl, vSpring, SpringLayout.NORTH, panel);

    vSpring = Spring.sum(vSpring, Spring.height(messageLbl));
    vSpring = Spring.sum(vSpring, Spring.constant(5));

    layout.putConstraint(SpringLayout.NORTH, updateLbl, vSpring, SpringLayout.NORTH, panel);

    vSpring = Spring.sum(vSpring, Spring.height(updateLbl));
    vSpring = Spring.sum(vSpring, Spring.constant(10));

    layout.putConstraint(SpringLayout.NORTH, backup, vSpring, SpringLayout.NORTH, panel);

    vSpring = Spring.sum(vSpring, Spring.height(backup));
    vSpring = Spring.sum(vSpring, Spring.constant(10));

    layout.putConstraint(SpringLayout.NORTH, update, vSpring, SpringLayout.NORTH, panel);
    layout.putConstraint(SpringLayout.NORTH, abort, vSpring, SpringLayout.NORTH, panel);

    rowHeight = Spring.height(update);
    rowHeight = Spring.max(rowHeight, Spring.height(abort));

    vSpring = Spring.sum(vSpring, rowHeight);
    vSpring = Spring.sum(vSpring, Spring.constant(10));

    layout.putConstraint(SpringLayout.SOUTH, panel, vSpring, SpringLayout.NORTH, panel);

    pack();
    setLocationRelativeTo(getOwner());
  }
  protected JComponent createActionPanel() {
    JPanel panel = new JPanel(new SpringLayout());
    ActionListener buttonAction = this;

    // Transfer button
    transferButton = new JButton("Transfer ");
    transferButton.addActionListener(buttonAction);

    // Cancel button
    cancelButton = new JButton("Cancel");
    cancelButton.addActionListener(buttonAction);

    // Quit button
    quitButton = new JButton("Quit");
    quitButton.addActionListener(buttonAction);

    // Extended filename format checkbox
    extendFilenameCheckBox = new JCheckBox("Old names");
    extendFilenameCheckBox.setSelected(prefs.GetExtendFilename() == 0);
    extendFilenameCheckBox.addActionListener(buttonAction);

    panel.add(quitButton);
    panel.add(cancelButton);
    panel.add(extendFilenameCheckBox);
    panel.add(transferButton);

    SpringLayout layout = (SpringLayout) panel.getLayout();

    // Set button width to max of all items
    Spring maxWidthSpring = layout.getConstraints(quitButton).getWidth();
    maxWidthSpring = Spring.max(maxWidthSpring, layout.getConstraints(cancelButton).getWidth());
    maxWidthSpring =
        Spring.max(maxWidthSpring, layout.getConstraints(extendFilenameCheckBox).getWidth());
    maxWidthSpring = Spring.max(maxWidthSpring, layout.getConstraints(transferButton).getWidth());
    layout.getConstraints(quitButton).setWidth(maxWidthSpring);
    layout.getConstraints(cancelButton).setWidth(maxWidthSpring);
    layout.getConstraints(extendFilenameCheckBox).setWidth(maxWidthSpring);
    layout.getConstraints(transferButton).setWidth(maxWidthSpring);

    // Now link up the buttons
    Spring s = Spring.constant(8, 20, 20);
    Spring s0 = Spring.constant(0, 0, 0);
    Spring s1 = Spring.constant(10, 40, 40);
    layout.putConstraint(SpringLayout.NORTH, quitButton, s1, SpringLayout.NORTH, panel);
    layout.putConstraint(SpringLayout.NORTH, cancelButton, s1, SpringLayout.SOUTH, quitButton);
    layout.putConstraint(
        SpringLayout.NORTH, extendFilenameCheckBox, s1, SpringLayout.SOUTH, cancelButton);
    layout.putConstraint(
        SpringLayout.NORTH, transferButton, s1, SpringLayout.SOUTH, extendFilenameCheckBox);
    layout.putConstraint(SpringLayout.SOUTH, panel, s1, SpringLayout.SOUTH, transferButton);

    layout.putConstraint(SpringLayout.EAST, quitButton, s0, SpringLayout.EAST, transferButton);
    layout.putConstraint(SpringLayout.EAST, cancelButton, s0, SpringLayout.EAST, quitButton);
    layout.putConstraint(
        SpringLayout.EAST, extendFilenameCheckBox, s0, SpringLayout.EAST, cancelButton);
    layout.putConstraint(SpringLayout.EAST, panel, s0, SpringLayout.EAST, extendFilenameCheckBox);

    layout.putConstraint(SpringLayout.WEST, transferButton, s0, SpringLayout.WEST, quitButton);
    layout.putConstraint(SpringLayout.WEST, quitButton, s0, SpringLayout.WEST, cancelButton);
    layout.putConstraint(
        SpringLayout.WEST, cancelButton, s0, SpringLayout.WEST, extendFilenameCheckBox);
    layout.putConstraint(SpringLayout.WEST, extendFilenameCheckBox, s, SpringLayout.WEST, panel);

    return panel;
  } // createActionPanel()
  private void setupGui() {
    setIconImage(
        Toolkit.getDefaultToolkit().getImage(this.getClass().getResource("/image/logo_ftb.png")));
    setTitle(I18N.getLocaleString("PROFILEADDER_TITLE"));
    setResizable(false);

    Container panel = getContentPane();
    SpringLayout layout = new SpringLayout();
    panel.setLayout(layout);

    usernameLbl = new JLabel(I18N.getLocaleString("PROFILEADDER_USERNAME"));
    username = new JTextField(16);
    passwordLbl = new JLabel(I18N.getLocaleString("PROFILEADDER_PASSWORD"));
    password = new JPasswordField(16);
    nameLbl = new JLabel(I18N.getLocaleString("PROFILEADDER_NAME"));
    name = new JTextField(16);
    savePassword = new JCheckBox(I18N.getLocaleString("PROFILEADDER_SAVEPASSWORD"));
    add = new JButton(I18N.getLocaleString("MAIN_ADD"));

    usernameLbl.setLabelFor(username);
    passwordLbl.setLabelFor(password);
    nameLbl.setLabelFor(name);

    panel.add(usernameLbl);
    panel.add(username);
    panel.add(passwordLbl);
    panel.add(password);
    panel.add(nameLbl);
    panel.add(name);
    panel.add(savePassword);
    panel.add(add);

    Spring hSpring;
    Spring columnWidth;

    hSpring = Spring.constant(10);

    layout.putConstraint(SpringLayout.WEST, usernameLbl, hSpring, SpringLayout.WEST, panel);
    layout.putConstraint(SpringLayout.WEST, passwordLbl, hSpring, SpringLayout.WEST, panel);
    layout.putConstraint(SpringLayout.WEST, nameLbl, hSpring, SpringLayout.WEST, panel);

    columnWidth = Spring.width(usernameLbl);
    columnWidth = Spring.max(columnWidth, Spring.width(passwordLbl));
    columnWidth = Spring.max(columnWidth, Spring.width(nameLbl));

    hSpring = Spring.sum(hSpring, columnWidth);
    hSpring = Spring.sum(hSpring, Spring.constant(10));

    layout.putConstraint(SpringLayout.WEST, username, hSpring, SpringLayout.WEST, panel);
    layout.putConstraint(SpringLayout.WEST, password, hSpring, SpringLayout.WEST, panel);
    layout.putConstraint(SpringLayout.WEST, name, hSpring, SpringLayout.WEST, panel);
    layout.putConstraint(SpringLayout.WEST, savePassword, hSpring, SpringLayout.WEST, panel);

    columnWidth = Spring.width(username);
    columnWidth = Spring.max(columnWidth, Spring.width(password));
    columnWidth = Spring.max(columnWidth, Spring.width(name));
    columnWidth = Spring.max(columnWidth, Spring.width(savePassword));

    hSpring = Spring.sum(hSpring, columnWidth);
    hSpring = Spring.sum(hSpring, Spring.constant(10));

    layout.putConstraint(SpringLayout.EAST, panel, hSpring, SpringLayout.WEST, panel);

    layout.putConstraint(
        SpringLayout.HORIZONTAL_CENTER, add, 0, SpringLayout.HORIZONTAL_CENTER, panel);

    Spring vSpring;
    Spring rowHeight;

    vSpring = Spring.constant(10);

    layout.putConstraint(SpringLayout.BASELINE, usernameLbl, 0, SpringLayout.BASELINE, username);
    layout.putConstraint(SpringLayout.NORTH, username, vSpring, SpringLayout.NORTH, panel);

    rowHeight = Spring.height(usernameLbl);
    rowHeight = Spring.max(rowHeight, Spring.height(username));

    vSpring = Spring.sum(vSpring, rowHeight);
    vSpring = Spring.sum(vSpring, Spring.constant(5));

    layout.putConstraint(SpringLayout.BASELINE, passwordLbl, 0, SpringLayout.BASELINE, password);
    layout.putConstraint(SpringLayout.NORTH, password, vSpring, SpringLayout.NORTH, panel);

    rowHeight = Spring.height(passwordLbl);
    rowHeight = Spring.max(rowHeight, Spring.height(password));

    vSpring = Spring.sum(vSpring, rowHeight);
    vSpring = Spring.sum(vSpring, Spring.constant(5));

    layout.putConstraint(SpringLayout.BASELINE, nameLbl, 0, SpringLayout.BASELINE, name);
    layout.putConstraint(SpringLayout.NORTH, name, vSpring, SpringLayout.NORTH, panel);

    rowHeight = Spring.height(nameLbl);
    rowHeight = Spring.max(rowHeight, Spring.height(name));

    vSpring = Spring.sum(vSpring, rowHeight);
    vSpring = Spring.sum(vSpring, Spring.constant(5));

    layout.putConstraint(SpringLayout.NORTH, savePassword, vSpring, SpringLayout.NORTH, panel);

    vSpring = Spring.sum(vSpring, Spring.height(savePassword));
    vSpring = Spring.sum(vSpring, Spring.constant(10));

    layout.putConstraint(SpringLayout.NORTH, add, vSpring, SpringLayout.NORTH, panel);

    vSpring = Spring.sum(vSpring, Spring.height(add));
    vSpring = Spring.sum(vSpring, Spring.constant(10));

    layout.putConstraint(SpringLayout.SOUTH, panel, vSpring, SpringLayout.NORTH, panel);

    pack();
    setLocationRelativeTo(getOwner());
  }