package com.gpl.rpg.atcontentstudio.ui; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import com.gpl.rpg.atcontentstudio.ATContentStudio; import com.gpl.rpg.atcontentstudio.model.GameSource; import com.gpl.rpg.atcontentstudio.model.Project; import com.gpl.rpg.atcontentstudio.model.maps.WorldmapSegment; import com.jidesoft.swing.JideBoxLayout; public class WorldmapCreationWizard extends JDialog { private static final long serialVersionUID = 6491044105090917567L; private WorldmapSegment creation = new WorldmapSegment(null, null, null); final JLabel message; final JTextField idField; final JButton ok; final Project proj; public WorldmapCreationWizard(final Project proj) { super(ATContentStudio.frame); this.proj = proj; setTitle("Create Worldmap segment"); JPanel pane = new JPanel(); pane.setLayout(new JideBoxLayout(pane, JideBoxLayout.PAGE_AXIS, 6)); pane.add(new JLabel("Create a new worldmap segment."), JideBoxLayout.FIX); message = new JLabel("Enter a map segment ID below: "); pane.add(message, JideBoxLayout.FIX); final JPanel idPane = new JPanel(); idPane.setLayout(new BorderLayout()); JLabel idLabel = new JLabel("Internal ID: "); idPane.add(idLabel, BorderLayout.WEST); idField = new JTextField(""); idField.setEditable(true); idPane.add(idField, BorderLayout.CENTER); pane.add(idPane, JideBoxLayout.FIX); JPanel buttonPane = new JPanel(); buttonPane.setLayout(new JideBoxLayout(buttonPane, JideBoxLayout.LINE_AXIS, 6)); buttonPane.add(new JPanel(), JideBoxLayout.VARY); JButton cancel = new JButton("Cancel"); buttonPane.add(cancel, JideBoxLayout.FIX); ok = new JButton("Ok"); buttonPane.add(ok, JideBoxLayout.FIX); pane.add(new JPanel(), JideBoxLayout.VARY); pane.add(buttonPane, JideBoxLayout.FIX); ok.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { creation.id = idField.getText(); WorldmapCreationWizard.this.setVisible(false); WorldmapCreationWizard.this.dispose(); proj.createWorldmapSegment(creation); notifyCreated(); ATContentStudio.frame.selectInTree(creation); ATContentStudio.frame.openEditor(creation); } }); cancel.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { creation = null; WorldmapCreationWizard.this.setVisible(false); WorldmapCreationWizard.this.dispose(); } }); DocumentListener statusUpdater = new DocumentListener() { @Override public void removeUpdate(DocumentEvent e) { updateStatus(); } @Override public void insertUpdate(DocumentEvent e) { updateStatus(); } @Override public void changedUpdate(DocumentEvent e) { updateStatus(); } }; idField.getDocument().addDocumentListener(statusUpdater); getContentPane().setLayout(new BorderLayout()); getContentPane().add(pane, BorderLayout.CENTER); setMinimumSize(new Dimension(350,120)); updateStatus(); pack(); Dimension sdim = Toolkit.getDefaultToolkit().getScreenSize(); Dimension wdim = getSize(); setLocation((sdim.width - wdim.width)/2, (sdim.height - wdim.height)/2); } public void updateStatus() { boolean trouble = false; message.setText("Looks OK to me."); if (idField.getText() == null || idField.getText().length() <= 0) { message.setText("Internal ID must not be empty."); trouble = true; } else if (proj.getWorldmapSegment(idField.getText()) != null) { if (proj.getWorldmapSegment(idField.getText()).getDataType() == GameSource.Type.created) { message.setText("A worldmap segment with the same ID was already created in this project."); trouble = true; } else if (proj.getWorldmapSegment(idField.getText()).getDataType() == GameSource.Type.altered) { message.setText("A worldmap segment with the same ID exists in the game and is already altered in this project."); trouble = true; } else if (proj.getWorldmapSegment(idField.getText()).getDataType() == GameSource.Type.source) { message.setText("A worldmap segment with the same ID exists in the game. It will be added under \"altered\"."); } } ok.setEnabled(!trouble); message.revalidate(); message.repaint(); } public static interface CreationCompletedListener { public void segmentCreated(WorldmapSegment created); } private List listeners = new CopyOnWriteArrayList(); public void addCreationListener(CreationCompletedListener l) { listeners.add(l); } public void notifyCreated() { for (CreationCompletedListener l : listeners) { l.segmentCreated(creation); } } }