/* * This library is part of OpenCms - * the Open Source Content Management System * * Copyright (c) Alkacon Software GmbH (http://www.alkacon.com) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * For further information about Alkacon Software GmbH, please see the * company website: http://www.alkacon.com * * For further information about OpenCms, please see the * project website: http://www.opencms.org * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package org.opencms.util.ant; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JScrollPane; import javax.swing.JToggleButton; import javax.swing.border.Border; /** * This is a highly configurable Swing GUI dialog for selection. * <p> * * @since 6.0.0 * * @see CmsAntTaskSelectionPrompt */ public class CmsAntTaskSelectionDialog extends JDialog implements ActionListener { /** Constant for border width. */ private static final int C_BORDER_SIZE = 10; /** Serial version UID required for safe serialization. */ private static final long serialVersionUID = -8439685952987222098L; /** Aborted flag. */ protected boolean m_aborted = true; /** Array of all entries. */ private String[] m_allList; /** Border. */ private final Border m_border = BorderFactory.createEmptyBorder(C_BORDER_SIZE, C_BORDER_SIZE, 0, C_BORDER_SIZE); /** Panel for buttons. */ private final JPanel m_buttons = new JPanel(); /** Cancel button. */ private final JButton m_cancel = new JButton("Cancel"); /** Main Panel. */ private final JPanel m_content = new JPanel(); /** Array of by default selected items. */ private String[] m_defList; /** Label for prompt. */ private JLabel m_label; /** Ok button. */ private final JButton m_ok = new JButton("Ok"); /** Associated ant task. */ private final CmsAntTaskSelectionPrompt m_promptTask; /** Select all button. */ private final JButton m_selAll = new JButton("All"); /** Array of selection buttons, check boxes or radio buttons. */ private JToggleButton[] m_selections; /** Select none button. */ private final JButton m_selNone = new JButton("None"); /** Scrollable view. */ private final JScrollPane m_view = new JScrollPane(m_content); /** * Default Constructor. * <p> * * @param promptTask the <code>{@link CmsAntTaskSelectionPrompt}</code> object. * <p> */ public CmsAntTaskSelectionDialog(CmsAntTaskSelectionPrompt promptTask) { super((JFrame)null, promptTask.getTitle(), true); m_promptTask = promptTask; m_allList = m_promptTask.getAllValues().split(CmsAntTaskSelectionPrompt.LIST_SEPARATOR); m_defList = getDefaultList(); m_label = new JLabel(m_promptTask.getPrompt()); addWindowListener(new WindowAdapter() { public void windowClosed(WindowEvent e) { m_aborted = true; setVisible(false); } }); getRootPane().setDefaultButton(m_ok); m_label.setBorder(m_border); if (!m_promptTask.isSingleSelection()) { JPanel p1 = new JPanel(); p1.add(new JLabel("Select: ")); m_selAll.addActionListener(this); p1.add(m_selAll); m_selNone.addActionListener(this); p1.add(m_selNone); JPanel p = new JPanel(new BorderLayout()); p.add(m_label, BorderLayout.NORTH); p.add(p1, BorderLayout.SOUTH); getContentPane().add(p, BorderLayout.NORTH); } else { getContentPane().add(m_label, BorderLayout.NORTH); } m_view.setBorder(m_border); m_selections = new JToggleButton[m_promptTask.getAllValues().split(CmsAntTaskSelectionPrompt.LIST_SEPARATOR).length]; // layout of selection elements int elements = m_selections.length; GridLayout layout = new GridLayout(elements / m_promptTask.getColumns() + 1, m_promptTask.getColumns()); layout.setHgap(20); m_content.setLayout(layout); for (int i = 0; i < m_selections.length; i++) { if (m_promptTask.isSingleSelection()) { m_selections[i] = new JRadioButton(m_allList[i].trim(), firstPositionOfItemInArray( m_defList, m_allList[i]) != -1); } else { m_selections[i] = new JCheckBox( m_allList[i].trim(), firstPositionOfItemInArray(m_defList, m_allList[i]) != -1); } m_content.add(m_selections[i]); } if (m_promptTask.isSingleSelection()) { ButtonGroup group = new ButtonGroup(); for (int i = 0; i < m_selections.length; i++) { group.add(m_selections[i]); } } getContentPane().add(m_view, BorderLayout.CENTER); m_buttons.setBorder(BorderFactory.createEmptyBorder( C_BORDER_SIZE, C_BORDER_SIZE, C_BORDER_SIZE / 2, C_BORDER_SIZE)); m_ok.addActionListener(this); m_buttons.add(m_ok); m_cancel.addActionListener(this); m_buttons.add(m_cancel); getContentPane().add(m_buttons, BorderLayout.SOUTH); pack(); } /** * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) */ public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals(m_ok.getText()) || e.getActionCommand().equals(m_cancel.getText())) { m_aborted = !e.getActionCommand().equals(m_ok.getText()); setVisible(false); } else if (e.getActionCommand().equals(m_selAll.getText())) { for (int i = 0; i < m_selections.length; i++) { m_selections[i].setSelected(true); } } else if (e.getActionCommand().equals(m_selNone.getText())) { for (int i = 0; i < m_selections.length; i++) { m_selections[i].setSelected(false); } } } /** * Returns <code>null</code> if the dialog was canceled, or a list of selected items if not. * <p> * * @return the user selection */ public String getSelection() { center(); setVisible(true); String ret = ""; for (int i = 0; i < m_selections.length; i++) { if (m_selections[i].isSelected()) { ret += m_selections[i].getText() + CmsAntTaskSelectionPrompt.LIST_SEPARATOR; } } if (m_aborted || (ret.trim().length() < CmsAntTaskSelectionPrompt.LIST_SEPARATOR.length())) { dispose(); return null; } dispose(); return ret.substring(0, ret.length() - CmsAntTaskSelectionPrompt.LIST_SEPARATOR.length()); } /** * Centers the dialog on the screen. * <p> * * If the size of the dialog exceeds that of the screen, then the size of the dialog is reset to * the size of the screen. * <p> */ private void center() { Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); Dimension window = getSize(); // ensure that no parts of the dialog will be off-screen int height = window.height; int width = window.width; if (window.height > screen.height) { window.height = screen.height; height = screen.height - 50; width = width + 50; } if (window.width > screen.width) { window.width = screen.width; } int xCoord = (screen.width / 2 - window.width / 2); int yCoord = (screen.height / 2 - window.height / 2); setLocation(xCoord, yCoord); setSize(width, height); } /** * Looks for the position of a string in an array of string, performing triming and taking into * account the null cases. * <p> * * @param array the string array to search in * @param item the item to search for * * @return the position of the item in the array or -1 if not found */ private int firstPositionOfItemInArray(String[] array, String item) { for (int i = 0; i < array.length; i++) { if (array[i] == null) { if (item == null) { return i; } } else { if ((item != null) && array[i].trim().equals(item.trim())) { return i; } } } return -1; } /** * Returns the array of items selected by default, if no one is given all items will be * considered. * <p> * * @return the array of items selected by default */ private String[] getDefaultList() { if ((m_promptTask.getDefaultValue() == null) || m_promptTask.getDefaultValue().trim().equals("")) { return m_allList; } return m_promptTask.getDefaultValue().split(CmsAntTaskSelectionPrompt.LIST_SEPARATOR); } }