package com.gpl.rpg.atcontentstudio.ui; import java.awt.Component; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.IOException; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import javax.swing.ComboBoxModel; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.ListCellRenderer; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.event.ListDataListener; import com.gpl.rpg.atcontentstudio.ATContentStudio; import com.gpl.rpg.atcontentstudio.model.Project; import com.gpl.rpg.atcontentstudio.model.Project.ResourceSet; import com.gpl.rpg.atcontentstudio.model.Workspace; import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet; import com.gpl.rpg.atcontentstudio.model.maps.TMXMapSet; import com.gpl.rpg.atcontentstudio.model.sprites.SpriteSheetSet; public class ProjectCreationWizard extends JDialog { private static final long serialVersionUID = -2854969975146867119L; final JTextField projectNameField; final JComboBox atSourceSelectionCombo; final JComboBox resourceSetToUse; final JButton browse; final JButton okButton; final JButton cancelButton; final JLabel errorLabel; public ProjectCreationWizard() { super(ATContentStudio.frame); setTitle("Create project"); projectNameField = new JTextField(); atSourceSelectionCombo = new JComboBox(); resourceSetToUse = new JComboBox(new ComboBoxModel() { Project.ResourceSet selected = Project.ResourceSet.gameData; @Override public int getSize() { return Project.ResourceSet.values().length; } @Override public ResourceSet getElementAt(int index) { return Project.ResourceSet.values()[index]; } List listeners = new CopyOnWriteArrayList(); @Override public void addListDataListener(ListDataListener l) { listeners.add(l); } @Override public void removeListDataListener(ListDataListener l) { listeners.remove(l); } @Override public void setSelectedItem(Object anItem) { selected = (ResourceSet) anItem; } @Override public Object getSelectedItem() { return selected; } }); resourceSetToUse.setRenderer(new ListCellRenderer() { @Override public Component getListCellRendererComponent( JList list, ResourceSet value, int index, boolean isSelected, boolean cellHasFocus) { switch (value) { case allFiles: return new JLabel("All available files"); case debugData: return new JLabel("Debug data"); case gameData: return new JLabel("Real game data"); default: return new JLabel(); } } }); browse = new JButton("Browse..."); okButton = new JButton("Ok"); cancelButton = new JButton("Cancel"); errorLabel = new JLabel("Enter the following information about your project."); projectNameField.getDocument().addDocumentListener(new DocumentListener() { @Override public void removeUpdate(DocumentEvent e) { updateOkButtonEnablement(); } @Override public void insertUpdate(DocumentEvent e) { updateOkButtonEnablement(); } @Override public void changedUpdate(DocumentEvent e) { updateOkButtonEnablement(); } }); for (File f : Workspace.activeWorkspace.knownMapSourcesFolders) { atSourceSelectionCombo.addItem(f.getAbsolutePath()); } atSourceSelectionCombo.setEditable(true); atSourceSelectionCombo.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { updateOkButtonEnablement(); } }); browse.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { JFileChooser chooser = new JFileChooser(); boolean keepTrying = true; if (atSourceSelectionCombo.getSelectedItem() != null && ((String)atSourceSelectionCombo.getSelectedItem()).length() > 0) { File f = new File((String)atSourceSelectionCombo.getSelectedItem()); if (f.exists()) { chooser.setCurrentDirectory(f); keepTrying = false; } } if (keepTrying && Workspace.activeWorkspace.knownMapSourcesFolders != null && !Workspace.activeWorkspace.knownMapSourcesFolders.isEmpty()) { chooser.setCurrentDirectory(Workspace.activeWorkspace.knownMapSourcesFolders.iterator().next()); } chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); int result = chooser.showOpenDialog(ProjectCreationWizard.this); if (result == JFileChooser.APPROVE_OPTION) { atSourceSelectionCombo.setSelectedItem(chooser.getSelectedFile().getAbsolutePath()); updateOkButtonEnablement(); } } }); okButton.setEnabled(false); okButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { File atSourceFolder = new File((String) atSourceSelectionCombo.getSelectedItem()); if (!Workspace.activeWorkspace.knownMapSourcesFolders.contains(atSourceFolder)) { Workspace.activeWorkspace.knownMapSourcesFolders.add(atSourceFolder); } Workspace.createProject(projectNameField.getText(), atSourceFolder, (Project.ResourceSet)resourceSetToUse.getSelectedItem()); ProjectCreationWizard.this.dispose(); } }); cancelButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { ProjectCreationWizard.this.dispose(); } }); JPanel panel = new JPanel(); panel.setLayout(new GridBagLayout()); GridBagConstraints c =new GridBagConstraints(); c.anchor = GridBagConstraints.NORTHWEST; c.fill = GridBagConstraints.BOTH; c.gridheight = 1; c.gridwidth = 3; c.gridx = 1; c.gridy = 1; c.weightx = 100; c.weighty = 100; panel.add(errorLabel, c); c.gridy++; c.gridx = 1; c.gridwidth = 1; c.weightx = 20; panel.add(new JLabel("Project name: "), c); c.gridx++; c.gridwidth = 2; c.weightx = 80; panel.add(projectNameField, c); c.gridy++; c.gridx = 1; c.gridwidth = 1; c.weightx = 20; panel.add(new JLabel("AT Source: "), c); c.gridx++; c.weightx = 60; panel.add(atSourceSelectionCombo, c); c.gridx++; c.weightx = 20; panel.add(browse, c); c.gridy++; c.gridx = 1; c.gridwidth = 1; c.weightx = 20; panel.add(new JLabel("Resource set: "), c); c.gridx++; c.weightx = 80; c.gridwidth = 2; panel.add(resourceSetToUse, c); JPanel buttonPane = new JPanel(); buttonPane.setLayout(new GridBagLayout()); GridBagConstraints c2 = new GridBagConstraints(); c2.fill = GridBagConstraints.HORIZONTAL; c2.gridx = 1; c2.weightx = 80; c2.gridx = 1; c2.weightx = 80; buttonPane.add(new JLabel(), c2); c2.gridx++; c2.weightx = 10; c.fill = GridBagConstraints.NONE; buttonPane.add(cancelButton, c2); c2.gridx++; c2.weightx = 10; buttonPane.add(okButton, c2); c.gridy++; c.fill = GridBagConstraints.HORIZONTAL; c.gridwidth = 3; panel.add(buttonPane, c); updateOkButtonEnablement(); setContentPane(panel); pack(); Dimension sdim = Toolkit.getDefaultToolkit().getScreenSize(); Dimension wdim = getSize(); setLocation((sdim.width - wdim.width)/2, (sdim.height - wdim.height)/2); } protected void updateOkButtonEnablement() { if (projectNameField.getText() == null || projectNameField.getText().length() <= 0) { errorLabel.setText("Select a project name."); this.okButton.setEnabled(false); return; } if (atSourceSelectionCombo.getSelectedItem() == null || ((String)atSourceSelectionCombo.getSelectedItem()).length() <= 0) { errorLabel.setText("Select an AT source root folder."); this.okButton.setEnabled(false); return; } File projFolder = new File(Workspace.activeWorkspace.baseFolder, projectNameField.getText()+File.separator); File sourceFolder = new File((String) atSourceSelectionCombo.getSelectedItem()); if (projFolder.exists()) { errorLabel.setText("A project with this name already exists."); this.okButton.setEnabled(false); return; } else { try { projFolder.getCanonicalPath(); } catch (IOException ioe) { errorLabel.setText(""+projectNameField.getText()+" is not a valid project name."); this.okButton.setEnabled(false); return; } } if (!sourceFolder.exists()) { errorLabel.setText("The selected AT source root folder does not exist."); this.okButton.setEnabled(false); return; } else { File res = new File(sourceFolder, GameDataSet.DEFAULT_REL_PATH_IN_SOURCE); if (!res.exists()) { errorLabel.setText("The selected AT source root folder does not contain the \"res\" folder."); this.okButton.setEnabled(false); return; } File drawable = new File(sourceFolder, SpriteSheetSet.DEFAULT_REL_PATH_IN_SOURCE); if (!drawable.exists()) { errorLabel.setText("The selected AT source root folder does not contain the \"drawable\" folder."); this.okButton.setEnabled(false); return; } File xml = new File(sourceFolder, TMXMapSet.DEFAULT_REL_PATH_IN_SOURCE); if (!xml.exists()) { errorLabel.setText("The selected AT source root folder does not contain the \"xml\" folder."); this.okButton.setEnabled(false); return; } } if (!projFolder.exists() && sourceFolder.exists()) { errorLabel.setText("Everything looks good !"); this.okButton.setEnabled(true); return; } } }