package fr.unistra.pelican.interfaces.application.inputs; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; import java.io.File; import java.util.ArrayList; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import fr.unistra.pelican.Image; import fr.unistra.pelican.algorithms.io.ImageLoader; import fr.unistra.pelican.interfaces.application.GlobalController; public class InputImageArray extends JPanel implements InputType, ActionListener { /** * Reference to the view object. */ GlobalController controller; /** * This attribute defines the range of this parameter among the other * parameters. */ int parameterNumber; /** * This attribute defines the number of element contained in the result * array */ int arraySize; /** * This attribute represents the resulting parameter. */ Image[] result; /** * This attribute represents the temporary result (need to be transformed * into an array) */ ArrayList<Image> tmpResult = new ArrayList<Image>(); /** * This frame contains the thumbnails panel */ JDialog thumbnailsFrame; /** * This use to know if the parameter is called as an option or not */ boolean option; /** * Is the number of image already loaded */ int numberOfImageLoaded; /** * This attribute represents the resulting parameter. */ ArrayList<JPanel> panelArray = new ArrayList<JPanel>(); /** * The constraints for the layout manager. */ public GridBagConstraints constraints; /** * Input constructor. * * @param view * Reference to the main panel. * @param algoName * Name of the algorithm which needs this parameter. * @param parameterName * Name of the parameter. * @param parameterNumber * Rank of this parameter between the other parameter of the * algorithm. * @param option * This paramter is an option or not. */ public InputImageArray(GlobalController controller, String algoName, String parameterName, int parameterNumber, boolean option) { super(); this.setLayout(new GridBagLayout()); // Initializes the attributes this.controller = controller; this.parameterNumber = parameterNumber; this.option = option; // Initializes the number of image already loaded if (controller.data.imageList.isEmpty()) { numberOfImageLoaded = 0; } else { numberOfImageLoaded = controller.data.imageList.size(); } parameterSeizing(controller, algoName, parameterName, parameterNumber, option); } /** * This method allows the seize of the parameter by the user. * * @param view * Reference to the main panel. * @param algoName * Name of the algorithm which needs this parameter. * @param parameterName * Name of the parameter. * @param parameterNumber * Rank of this parameter between the other parameter of the * algorithm. * @param option * This paramter is an option or not. */ public void parameterSeizing(GlobalController controller, String algoName, String parameterName, int parameterNumber, boolean option) { arraySize = 1; JPanel line = new JPanel(new GridLayout(1, 6, 10, 10)); constraints.fill = GridBagConstraints.HORIZONTAL; constraints.weightx = 0.5; constraints.gridx = 0; constraints.gridy = arraySize; this.add(line, constraints); JLabel lab = new JLabel(parameterName); line.add(lab); lab.setToolTipText(controller.getJavadoc(algoName, parameterName)); if (numberOfImageLoaded == 0) { JTextField tf = new JTextField(""); ; line.add(tf); } else { // Sets the combobox with all opened images String[] imageString = new String[controller.data.imageList.size()]; for (int i = 0; i < controller.data.imageList.size(); i++) { imageString[i] = controller.data.imageList.get(i).getName(); } // Creates the combo box, select item at index 0. JComboBox imageBox = new JComboBox(imageString); imageBox.setSelectedIndex(0); line.add(imageBox); imageBox .addActionListener(new InputImageArray_BrowseAndCombobox_actionAdapter( controller, 0)); // Sets The pick button JButton pick = new JButton("Pick"); line.add(pick); pick .addActionListener(new InputImageArray_PickButton_actionAdapter( controller, arraySize - 1)); } JButton browse = new JButton("browse"); line.add(browse); browse .addActionListener(new InputImageArray_BrowseAndCombobox_actionAdapter( controller, 0)); JButton plusButton = new JButton("+"); line.add(plusButton); plusButton.addActionListener(this); JButton minusButton = new JButton("-"); line.add(minusButton); minusButton.addActionListener(this); panelArray.add(line); // This instance is added to input instances array if (option == false) { controller.parameterInstanceArray[parameterNumber] = this; } else { controller.parameterInstanceArray[parameterNumber - 1] = this; } } /** * Uses to check if an image is not already present in the combobox list * * @param imageName * Name of the image to be entered into the combobox list. * @param combo * The checked combobox * @return */ private Boolean alreadyPresent(String imageName, JComboBox combo) { Boolean present = false; for (int i = 0; i < combo.getItemCount(); i++) { String name = (String) combo.getItemAt(i); if (name.equals(imageName)) { present = true; } } return present; } /** * Launch effect! */ public void fire() { result = new Image[arraySize]; for (int i = 0; i < arraySize; i++) { if (tmpResult.size() == 1) { System.err.println("premiere condition"); JComboBox combo = (JComboBox) panelArray.get(i).getComponent(1); int selectedIndex = combo.getSelectedIndex(); result[i] = controller.data.imageList.get(selectedIndex); controller.addLoadedImage(result[i]); } else { result[i] = tmpResult.get(i); controller.addLoadedImage(result[i]); } } if (option == false) { controller.parameterArray.add(parameterNumber, result); } else { controller.parameterArray.add(parameterNumber - 1, result); } } public void actionPerformed(ActionEvent arg0) { // The plus button add an element in the array if (arg0.getActionCommand().equals("+")) { arraySize++; tmpResult.add(null); JPanel line2 = new JPanel(new GridLayout(1, 6, 10, 10)); constraints.fill = GridBagConstraints.HORIZONTAL; constraints.weightx = 0.5; constraints.gridx = 0; constraints.gridy = arraySize; this.add(line2, constraints); JLabel lab2 = new JLabel("Element nᅵ" + (arraySize)); line2.add(lab2); if (numberOfImageLoaded == 0) { JTextField tf2 = new JTextField(""); ; line2.add(tf2); } else { // Sets the combobox with all opened images String[] imageString = new String[controller.data.imageList.size()]; for (int i = 0; i < controller.data.imageList.size(); i++) { imageString[i] = controller.data.imageList.get(i).getName(); } // Creates the combo box, select item at index 0. JComboBox imageBox2 = new JComboBox(imageString); imageBox2.setSelectedIndex(0); line2.add(imageBox2); imageBox2 .addActionListener(new InputImageArray_BrowseAndCombobox_actionAdapter( controller, arraySize - 1)); // Sets The pick button JButton pick2 = new JButton("Pick"); line2.add(pick2); pick2 .addActionListener(new InputImageArray_PickButton_actionAdapter( controller, arraySize - 1)); } JButton browse2 = new JButton("browse"); line2.add(browse2); browse2 .addActionListener(new InputImageArray_BrowseAndCombobox_actionAdapter( controller, arraySize - 1)); JLabel lab3 = new JLabel(" "); line2.add(lab3); JLabel lab4 = new JLabel(" "); line2.add(lab4); panelArray.add(line2); controller.parameterBox.pack(); // The minus button remove an element from the array } else { // At leat one element remains if (panelArray.size() > 1) { tmpResult.remove(tmpResult.size() - 1); arraySize--; JPanel line2 = panelArray.get(panelArray.size() - 1); panelArray.remove(panelArray.size() - 1); line2.removeAll(); controller.parameterBox.pack(); } } } /*************************************************************************** * * * Pick button class Listener * * **************************************************************************/ /** * * @author florent * */ public class InputImageArray_PickButton_actionAdapter implements java.awt.event.ActionListener { GlobalController controller; int rank; /** * * @param view */ InputImageArray_PickButton_actionAdapter(GlobalController controller, int rank) { this.controller = controller; this.rank = rank; } /** * */ public void actionPerformed(ActionEvent e) { // This panel displays the available image JButton thumbnail; ImageIcon icon; thumbnailsFrame = new JDialog(); thumbnailsFrame.setModal(true); thumbnailsFrame.setTitle("Choose an image"); thumbnailsFrame.setLocation(370, 70); Dimension dim = new Dimension(600, 200); thumbnailsFrame.setMinimumSize(dim); thumbnailsFrame.setMaximumSize(dim); thumbnailsFrame.setResizable(true); JPanel panel = new JPanel(); for (int i = 0; i < controller.data.imageList.size(); i++) { thumbnail = new JButton(); // thumbnail.se thumbnail.setToolTipText(controller.data.imageList.get(i).getName()); BufferedImage image = fr.unistra.pelican.util.Tools .pelican2Buffered(controller.data.imageList.get(i)); icon = new ImageIcon(image.getScaledInstance(70, 70, java.awt.Image.SCALE_SMOOTH)); thumbnail.setIcon(icon); constraints.fill = GridBagConstraints.HORIZONTAL; constraints.weightx = 2.5; constraints.gridx = i % 4; constraints.gridy = i / 4; panel.add(thumbnail, constraints); thumbnail .addActionListener(new InputImageArray_imageButton_actionAdapter( controller, rank)); } // thumbnailsFrame. thumbnailsFrame.setContentPane(panel); thumbnailsFrame.setVisible(true); thumbnailsFrame.pack(); } } /** * * @author florent * */ public class InputImageArray_imageButton_actionAdapter implements java.awt.event.ActionListener { GlobalController controller; int rank; /** * * @param view */ InputImageArray_imageButton_actionAdapter(GlobalController controller, int rank) { this.controller = controller; this.rank = rank; } /** * */ public void actionPerformed(ActionEvent e) { JButton button = (JButton) e.getSource(); tmpResult.add(rank, controller.getLoadedImage(button.getToolTipText())); JComboBox combo = (JComboBox) panelArray.get(rank) .getComponent(1); if (combo.getItemCount() > numberOfImageLoaded) { controller.data.imageList.remove(controller.data.imageList.size() - 1); controller.data.imageList.add(tmpResult.get(rank)); combo.removeItemAt(combo.getItemCount() - 1); if (alreadyPresent(tmpResult.get(rank).getName(), combo)) { controller.data.imageList.remove(controller.data.imageList.size() - 1); } else { combo.addItem(tmpResult.get(rank).getName()); } combo.setSelectedItem(tmpResult.get(rank).getName()); } else { controller.data.imageList.add(tmpResult.get(rank)); if (alreadyPresent(tmpResult.get(rank).getName(), combo)) { controller.data.imageList.remove(controller.data.imageList.size() - 1); } else { combo.addItem(tmpResult.get(rank).getName()); } combo.setSelectedItem(tmpResult.get(rank).getName()); } thumbnailsFrame.dispose(); } } /*************************************************************************** * * * Browse button and combobox class Listener * * **************************************************************************/ /** * * @author florent * */ public class InputImageArray_BrowseAndCombobox_actionAdapter implements java.awt.event.ActionListener { GlobalController controller; int rank; /** * * @param view */ InputImageArray_BrowseAndCombobox_actionAdapter(GlobalController controller, int rank) { this.controller = controller; this.rank = rank; } /** * */ public void actionPerformed(ActionEvent e) { // Action of the browse button if (e.getActionCommand().equals("browse")) { JFrame openDialogFrame = new JFrame("Open"); JFileChooser fc = new JFileChooser(); controller.parameterBox.getPanel().add(fc); fc.showOpenDialog(openDialogFrame); tmpResult.add(rank, (Image) ImageLoader.exec(fc .getSelectedFile().getPath())); // Sets the image name tmpResult .get(rank) .setName( fc .getSelectedFile() .getPath() .substring( fc.getSelectedFile().getPath() .lastIndexOf( File.separator) + 1, fc.getSelectedFile().getPath() .lastIndexOf("."))); // It uses the combobox if an image was already loaded otherwise // it // uses the jtextfield if (numberOfImageLoaded == 0) { // If an image has already been set to the jtextfield (means // an // image has already been added to the view.imageList), then // this image has first to be remove from the the // view.imageList. if (numberOfImageLoaded < controller.data.imageList.size()) { controller.data.imageList.remove(controller.data.imageList.size() - 1); JTextField textfield = (JTextField) panelArray .get(rank).getComponent(1); textfield.setText(fc.getSelectedFile().getPath()); controller.data.imageList.add(tmpResult.get(rank)); } else { JTextField textfield = (JTextField) panelArray .get(rank).getComponent(1); textfield.setText(fc.getSelectedFile().getPath()); controller.data.imageList.add(tmpResult.get(rank)); } } else { JComboBox combo = (JComboBox) panelArray.get(rank) .getComponent(1); // This test use to only display the current browsed image if (combo.getItemCount() > numberOfImageLoaded) { controller.data.imageList.remove(controller.data.imageList.size() - 1); controller.data.imageList.add(tmpResult.get(rank)); combo.removeItemAt(combo.getItemCount() - 1); if (alreadyPresent(tmpResult.get(rank).getName(), combo)) { controller.data.imageList.remove(controller.data.imageList.size() - 1); } else { combo.addItem(tmpResult.get(rank).getName()); } combo.setSelectedItem(tmpResult.get(rank).getName()); } else { controller.data.imageList.add(tmpResult.get(rank)); if (alreadyPresent(tmpResult.get(rank).getName(), combo)) { controller.data.imageList.remove(controller.data.imageList.size() - 1); } else { combo.addItem(tmpResult.get(rank).getName()); } combo.setSelectedItem(tmpResult.get(rank).getName()); } } } // Action of the combobox if (e.getActionCommand().equals("comboBoxChanged")) { JComboBox combo = (JComboBox) panelArray.get(rank) .getComponent(1); tmpResult.add(rank, controller.data.imageList .get(combo.getSelectedIndex())); } } } }