/*
* The University of Wales, Cardiff Triana Project Software License (Based
* on the Apache Software License Version 1.1)
*
* Copyright (c) 2007 University of Wales, Cardiff. All rights reserved.
*
* Redistribution and use of the software in source and binary forms, with
* or without modification, are permitted provided that the following
* conditions are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. The end-user documentation included with the redistribution, if any,
* must include the following acknowledgment: "This product includes
* software developed by the University of Wales, Cardiff for the Triana
* Project (http://www.trianacode.org)." Alternately, this
* acknowledgment may appear in the software itself, if and wherever
* such third-party acknowledgments normally appear.
*
* 4. The names "Triana" and "University of Wales, Cardiff" must not be
* used to endorse or promote products derived from this software
* without prior written permission. For written permission, please
* contact triana@trianacode.org.
*
* 5. Products derived from this software may not be called "Triana," nor
* may Triana appear in their name, without prior written permission of
* the University of Wales, Cardiff.
*
* 6. This software may not be sold, used or incorporated into any product
* for sale to third parties.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
* NO EVENT SHALL UNIVERSITY OF WALES, CARDIFF OR ITS CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*
* ------------------------------------------------------------------------
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Triana Project. For more information on the
* Triana Project, please see. http://www.trianacode.org.
*
* This license is based on the BSD license as adopted by the Apache
* Foundation and is governed by the laws of England and Wales.
*
*/
package org.trianacode.gui.toolmaker.guibuilder;
import org.trianacode.gui.panels.ParameterPanelImp;
import org.trianacode.gui.util.Env;
import org.trianacode.gui.windows.ParameterWindow;
import org.trianacode.gui.windows.WindowButtonConstants;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
* The panel for defining a gui builder choice component
*
* @author Ian Wang
* @version $Revision: 4048 $
*/
public class ChoicePanel extends JPanel implements ActionListener, ComponentPanelInterface {
/**
* input fields
*/
private JTextField title = new JTextField(15);
private JList choices = new JList(new DefaultListModel());
/**
* add/remove choice buttons
*/
private JButton add = new JButton(Env.getString("add"));
private JButton remove = new JButton(Env.getString("remove"));
public ChoicePanel() {
initLayout();
}
/**
* intialise the layout
*/
private void initLayout() {
setLayout(new BorderLayout());
JPanel labelpanel = new JPanel(new GridLayout(2, 1));
labelpanel.add(new JLabel(Env.getString("title")));
labelpanel.add(new JLabel(Env.getString("choices")));
labelpanel.setBorder(new EmptyBorder(0, 0, 0, 3));
JPanel titlepanel = new JPanel(new BorderLayout());
titlepanel.add(title, BorderLayout.WEST);
JPanel fieldpanel = new JPanel(new GridLayout(2, 1));
fieldpanel.add(titlepanel);
JPanel fieldcont = new JPanel(new BorderLayout());
fieldcont.add(labelpanel, BorderLayout.WEST);
fieldcont.add(fieldpanel, BorderLayout.CENTER);
JPanel buttonpanel = new JPanel(new FlowLayout());
buttonpanel.add(add);
buttonpanel.add(remove);
add.addActionListener(this);
remove.addActionListener(this);
JScrollPane scroll = new JScrollPane(choices, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
choices.setPrototypeCellValue("1234567890123456789012345");
choices.setVisibleRowCount(6);
JPanel choicepanel = new JPanel(new BorderLayout());
choicepanel.add(scroll, BorderLayout.CENTER);
choicepanel.add(buttonpanel, BorderLayout.SOUTH);
JPanel listpanel = new JPanel(new BorderLayout());
listpanel.add(choicepanel, BorderLayout.WEST);
JPanel listcont = new JPanel(new BorderLayout());
listcont.add(fieldcont, BorderLayout.NORTH);
listcont.add(listpanel, BorderLayout.CENTER);
JPanel cont = new JPanel(new BorderLayout());
cont.add(listcont, BorderLayout.WEST);
add(cont, BorderLayout.NORTH);
}
/**
* @return the gui builder string for the defined component
*/
public String getGUIBuilderStr(String param) {
String str = title.getText() + " $title " + param + " Choice";
DefaultListModel model = (DefaultListModel) choices.getModel();
for (int count = 0; count < model.getSize(); count++) {
str += " [" + model.elementAt(count) + "]";
}
return str;
}
/**
* Sets the defined component given the specified gui builder string
*/
public void setGUIBuilderStr(String line) {
DefaultListModel model = ((DefaultListModel) choices.getModel());
String[] strs = BuilderPanel.splitString(line);
String choice = "";
title.setText(strs[0]);
for (int count = 3; count < strs.length; count++) {
if (!(choice.equals(""))) {
choice += " ";
}
choice += strs[count];
if (choice.endsWith("]")) {
choice = choice.substring(1, choice.length() - 1);
model.addElement(choice);
choice = "";
}
}
}
/**
* Resets the defined component to default values
*/
public void reset(String param) {
title.setText(param);
((DefaultListModel) choices.getModel()).clear();
}
public void actionPerformed(ActionEvent event) {
if (event.getSource() == add) {
addChoice();
} else if (event.getSource() == remove) {
if (choices.getSelectedValue() != null) {
((DefaultListModel) choices.getModel()).removeElement(choices.getSelectedValue());
}
}
}
/**
* pop a dialog to add a item to the choices box
*/
public void addChoice() {
Component parent = getParent();
while ((parent != null) && (!(parent instanceof Frame)) && (!(parent instanceof Dialog))) {
parent = parent.getParent();
}
if (parent != null) {
JTextField value = new JTextField(15);
ParameterPanelImp valuepanel = new ParameterPanelImp();
valuepanel.setLayout(new FlowLayout());
valuepanel.add(new JLabel(Env.getString("value")));
valuepanel.add(value);
ParameterWindow window;
if (parent instanceof Frame) {
window = new ParameterWindow((Frame) parent, WindowButtonConstants.OK_CANCEL_BUTTONS, true);
} else {
window = new ParameterWindow((Dialog) parent, WindowButtonConstants.OK_CANCEL_BUTTONS, true);
}
window.setParameterPanel(valuepanel);
window.setLocation(getLocationOnScreen().x + 150, getLocationOnScreen().y + 40);
window.setTitle(Env.getString("addChoice"));
window.setVisible(true);
if ((window.isAccepted()) && (!value.getText().equals(""))) {
String valstr = value.getText();
valstr.replace('[', '{');
valstr.replace(']', '}');
((DefaultListModel) choices.getModel()).addElement(valstr);
}
}
}
/**
* notifies the panel of the default parameter value
*/
public void notifyDefaultValue(String value) {
if ((value != null) && (!value.equals("")) && (!((DefaultListModel) choices.getModel()).contains(value))) {
((DefaultListModel) choices.getModel()).addElement(value);
}
}
}