package tk.amberide.ide.gui.dialogs.res; import tk.amberide.Amber; import tk.amberide.ide.data.io.FileIO; import tk.amberide.ide.data.res.Tileset; import tk.amberide.ide.data.state.Scope; import tk.amberide.ide.data.state.State; import tk.amberide.ide.os.filechooser.FileDialogFactory; import tk.amberide.ide.os.filechooser.IFileDialog; import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.image.BufferedImage; import java.io.File; /** * @author Tudor */ public class NewTilesetDialog extends javax.swing.JDialog { private IFileDialog browser; @State(Scope.PROJECT) private static String lastImportLocation; static { Amber.getStateManager().registerStateOwner(NewTilesetDialog.class); } /** * Creates new form NewTilesetDialog */ public NewTilesetDialog(java.awt.Frame parent) { super(parent); initComponents(); browser = FileDialogFactory.newFileDialog("Select tileset image...", Amber.getUI()); browser.setFilter("Image files (*.png; *.jpeg; *.jpg; *.gif)|*.png;*.jpg;*.jpeg;*.gif"); } public NewTilesetDialog(java.awt.Frame parent, File image) { this(parent); nameField.setText(FileIO.getFileName(image)); imageLocationField.setText(image.getAbsolutePath()); updatePreview(); checkCreateableStatus(); } private void checkCreateableStatus() { if (Amber.getResourceManager().getTileset(nameField.getText()) != null) { return; } java.awt.EventQueue.invokeLater(new Runnable() { public void run() { createButton.setEnabled(new File(imageLocationField.getText()).exists() && !nameField.getText().isEmpty()); getRootPane().setDefaultButton(createButton); } }); } private void updatePreview() { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { try { previewLabel.setText(""); previewLabel.setIcon(new ImageIcon(ImageIO.read(new File(imageLocationField.getText())))); return; } catch (Exception e) { e.printStackTrace(); } previewLabel.setIcon(null); previewLabel.setText("No preview available."); previewLabel.setSize(previewLabel.getPreferredSize()); previewGroup.validate(); } }); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { tilesetGroup = new javax.swing.JPanel(); nameLabel = new javax.swing.JLabel(); imageLabel = new javax.swing.JLabel(); browseButton = new javax.swing.JButton(); transparencyBox = new javax.swing.JCheckBox(); colorChooser = new tk.amberide.ide.swing.misc.ColorChooserButton(); nameField = new tk.amberide.ide.swing.textbox.HintTextField(); imageLocationField = new tk.amberide.ide.swing.textbox.HintTextField(); tileSizeGroup = new javax.swing.JPanel(); widthSpinner = new javax.swing.JSpinner(); widthLabel = new javax.swing.JLabel(); heightLabel = new javax.swing.JLabel(); heightSpinner = new javax.swing.JSpinner(); spacingLabel = new javax.swing.JLabel(); spacingSpinner = new javax.swing.JSpinner(); marginSpinner = new javax.swing.JSpinner(); marginLabel = new javax.swing.JLabel(); createButton = new javax.swing.JButton(); cancelButton = new javax.swing.JButton(); previewGroup = new javax.swing.JScrollPane(); previewLabel = new javax.swing.JLabel(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("amber/Bundle"); // NOI18N setTitle(bundle.getString("NewTilesetDialog.title")); // NOI18N setModal(true); setResizable(false); tilesetGroup.setBorder(javax.swing.BorderFactory.createTitledBorder(bundle.getString("NewTilesetDialog.tilesetGroup.border.title"))); // NOI18N tilesetGroup.setMaximumSize(new java.awt.Dimension(348, 107)); tilesetGroup.setMinimumSize(new java.awt.Dimension(348, 107)); nameLabel.setText(bundle.getString("NewTilesetDialog.nameLabel.text")); // NOI18N imageLabel.setText(bundle.getString("NewTilesetDialog.imageLabel.text")); // NOI18N browseButton.setText(bundle.getString("NewTilesetDialog.browseButton.text")); // NOI18N browseButton.setDefaultCapable(false); browseButton.setRequestFocusEnabled(false); browseButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { browseButtonActionPerformed(evt); } }); transparencyBox.setText(bundle.getString("NewTilesetDialog.transparencyBox.text")); // NOI18N transparencyBox.setAlignmentY(0.0F); transparencyBox.setMargin(new java.awt.Insets(0, 0, 0, 0)); transparencyBox.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { transparencyBoxActionPerformed(evt); } }); colorChooser.setBorder(null); colorChooser.setText(bundle.getString("NewTilesetDialog.colorChooser.text")); // NOI18N colorChooser.setDefaultCapable(false); colorChooser.setMargin(new java.awt.Insets(0, 0, 0, 0)); colorChooser.setMaximumSize(new java.awt.Dimension(20, 20)); colorChooser.setMinimumSize(new java.awt.Dimension(20, 20)); colorChooser.setPreferredSize(new java.awt.Dimension(20, 20)); colorChooser.setRequestFocusEnabled(false); nameField.setText(bundle.getString("NewTilesetDialog.nameField.text")); // NOI18N nameField.setHint(bundle.getString("NewTilesetDialog.nameField.hint")); // NOI18N nameField.addKeyListener(new java.awt.event.KeyAdapter() { public void keyTyped(java.awt.event.KeyEvent evt) { nameFieldActionPerformed(evt); } }); imageLocationField.setText(bundle.getString("NewTilesetDialog.imageLocationField.text")); // NOI18N imageLocationField.setHint(bundle.getString("NewTilesetDialog.imageLocationField.hint")); // NOI18N imageLocationField.addKeyListener(new KeyAdapter() { public void keyTyped(KeyEvent evt) { imageLocationFieldActionPerformed(evt); } }); javax.swing.GroupLayout tilesetGroupLayout = new javax.swing.GroupLayout(tilesetGroup); tilesetGroup.setLayout(tilesetGroupLayout); tilesetGroupLayout.setHorizontalGroup( tilesetGroupLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(tilesetGroupLayout.createSequentialGroup() .addContainerGap() .addGroup(tilesetGroupLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(imageLabel) .addComponent(nameLabel)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(tilesetGroupLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(tilesetGroupLayout.createSequentialGroup() .addComponent(imageLocationField, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(browseButton, javax.swing.GroupLayout.PREFERRED_SIZE, 24, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(tilesetGroupLayout.createSequentialGroup() .addComponent(transparencyBox, javax.swing.GroupLayout.PREFERRED_SIZE, 184, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(colorChooser, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(0, 70, Short.MAX_VALUE)) .addComponent(nameField, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addContainerGap()) ); tilesetGroupLayout.setVerticalGroup( tilesetGroupLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(tilesetGroupLayout.createSequentialGroup() .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(tilesetGroupLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addGroup(tilesetGroupLayout.createSequentialGroup() .addGap(26, 26, 26) .addComponent(browseButton)) .addGroup(tilesetGroupLayout.createSequentialGroup() .addGroup(tilesetGroupLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(nameLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(nameField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(tilesetGroupLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(imageLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(imageLocationField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))) .addGap(4, 4, 4) .addGroup(tilesetGroupLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(transparencyBox, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(colorChooser, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) ); tileSizeGroup.setBorder(javax.swing.BorderFactory.createTitledBorder(bundle.getString("NewTilesetDialog.tileSizeGroup.border.title"))); // NOI18N tileSizeGroup.setMaximumSize(new java.awt.Dimension(139, 150)); tileSizeGroup.setMinimumSize(new java.awt.Dimension(139, 150)); widthSpinner.setModel(new javax.swing.SpinnerNumberModel(Integer.valueOf(16), Integer.valueOf(1), null, Integer.valueOf(1))); widthLabel.setText(bundle.getString("NewTilesetDialog.widthLabel.text")); // NOI18N heightLabel.setText(bundle.getString("NewTilesetDialog.heightLabel.text")); // NOI18N heightSpinner.setModel(new javax.swing.SpinnerNumberModel(Integer.valueOf(16), Integer.valueOf(1), null, Integer.valueOf(1))); spacingLabel.setText(bundle.getString("NewTilesetDialog.spacingLabel.text")); // NOI18N spacingSpinner.setModel(new javax.swing.SpinnerNumberModel()); spacingSpinner.setMinimumSize(new java.awt.Dimension(31, 20)); marginSpinner.setModel(new javax.swing.SpinnerNumberModel()); marginSpinner.setMinimumSize(new java.awt.Dimension(31, 20)); marginLabel.setText(bundle.getString("NewTilesetDialog.marginLabel.text")); // NOI18N javax.swing.GroupLayout tileSizeGroupLayout = new javax.swing.GroupLayout(tileSizeGroup); tileSizeGroup.setLayout(tileSizeGroupLayout); tileSizeGroupLayout.setHorizontalGroup( tileSizeGroupLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(tileSizeGroupLayout.createSequentialGroup() .addContainerGap() .addGroup(tileSizeGroupLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(tileSizeGroupLayout.createSequentialGroup() .addGroup(tileSizeGroupLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(widthLabel) .addComponent(heightLabel)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(tileSizeGroupLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(widthSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, 52, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(heightSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, 52, javax.swing.GroupLayout.PREFERRED_SIZE))) .addGroup(tileSizeGroupLayout.createSequentialGroup() .addGroup(tileSizeGroupLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(marginLabel) .addComponent(spacingLabel)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(tileSizeGroupLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(marginSpinner, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(spacingSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, 52, javax.swing.GroupLayout.PREFERRED_SIZE)))) .addGap(20, 20, 20)) ); tileSizeGroupLayout.setVerticalGroup( tileSizeGroupLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(tileSizeGroupLayout.createSequentialGroup() .addGap(6, 6, 6) .addGroup(tileSizeGroupLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(widthLabel) .addComponent(widthSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(tileSizeGroupLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(heightLabel) .addComponent(heightSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(18, 18, 18) .addGroup(tileSizeGroupLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(marginLabel) .addComponent(marginSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(tileSizeGroupLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(spacingLabel) .addComponent(spacingSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap()) ); createButton.setText(bundle.getString("NewTilesetDialog.createButton.text")); // NOI18N createButton.setEnabled(false); createButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { createButtonActionPerformed(evt); } }); cancelButton.setText(bundle.getString("NewTilesetDialog.cancelButton.text")); // NOI18N cancelButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { cancelButtonActionPerformed(evt); } }); previewGroup.setBorder(javax.swing.BorderFactory.createTitledBorder(bundle.getString("NewTilesetDialog.previewGroup.border.title"))); // NOI18N previewGroup.setViewportBorder(javax.swing.BorderFactory.createEtchedBorder()); previewGroup.setAlignmentX(0.0F); previewGroup.setAlignmentY(0.0F); previewGroup.setAutoscrolls(true); previewGroup.setMaximumSize(new java.awt.Dimension(119, 41)); previewGroup.setMinimumSize(new java.awt.Dimension(119, 41)); previewLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); previewLabel.setText(bundle.getString("NewTilesetDialog.previewLabel.text")); // NOI18N previewLabel.setAlignmentY(0.0F); previewLabel.setAutoscrolls(true); previewLabel.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); previewLabel.setMaximumSize(null); previewLabel.setPreferredSize(null); previewGroup.setViewportView(previewLabel); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(10, 10, 10) .addComponent(tileSizeGroup, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(6, 6, 6) .addComponent(previewGroup, javax.swing.GroupLayout.PREFERRED_SIZE, 207, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(layout.createSequentialGroup() .addGap(226, 226, 226) .addComponent(createButton) .addGap(6, 6, 6) .addComponent(cancelButton)) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(tilesetGroup, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) .addGap(10, 10, 10)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(11, 11, 11) .addComponent(tilesetGroup, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(6, 6, 6) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(tileSizeGroup, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(previewGroup, javax.swing.GroupLayout.PREFERRED_SIZE, 150, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(createButton) .addComponent(cancelButton)) .addGap(10, 10, 10)) ); pack(); setLocationRelativeTo(null); }// </editor-fold>//GEN-END:initComponents private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonActionPerformed dispose(); }//GEN-LAST:event_cancelButtonActionPerformed private void browseButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_browseButtonActionPerformed if (lastImportLocation != null) { File dir = new File(lastImportLocation); if (dir.exists() && dir.isDirectory()) { browser.setInitial(dir); } } setEnabled(false); if (browser.show()) { imageLocationField.setText(browser.getFile().getAbsolutePath()); updatePreview(); checkCreateableStatus(); } setEnabled(true); }//GEN-LAST:event_browseButtonActionPerformed private void transparencyBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_transparencyBoxActionPerformed if (transparencyBox.isSelected()) { } }//GEN-LAST:event_transparencyBoxActionPerformed private void createButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_createButtonActionPerformed File file = new File(imageLocationField.getText()); lastImportLocation = file.getParent(); BufferedImage img = (BufferedImage) ((ImageIcon) previewLabel.getIcon()).getImage(); if (img != null) { Amber.getResourceManager().importTileset(nameField.getText(), new Tileset.Parser( new Dimension((Integer) widthSpinner.getValue(), (Integer) heightSpinner.getValue()), (Integer) marginSpinner.getValue(), (Integer) spacingSpinner.getValue()).parse(img), file); } dispose(); }//GEN-LAST:event_createButtonActionPerformed private void nameFieldActionPerformed(KeyEvent evt) {//GEN-FIRST:event_nameFieldActionPerformed checkCreateableStatus(); }//GEN-LAST:event_nameFieldActionPerformed private void imageLocationFieldActionPerformed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_imageLocationFieldActionPerformed updatePreview(); checkCreateableStatus(); }//GEN-LAST:event_imageLocationFieldActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton browseButton; private javax.swing.JButton cancelButton; private tk.amberide.ide.swing.misc.ColorChooserButton colorChooser; private javax.swing.JButton createButton; private javax.swing.JLabel heightLabel; private javax.swing.JSpinner heightSpinner; private javax.swing.JLabel imageLabel; private tk.amberide.ide.swing.textbox.HintTextField imageLocationField; private javax.swing.JLabel marginLabel; private javax.swing.JSpinner marginSpinner; private tk.amberide.ide.swing.textbox.HintTextField nameField; private javax.swing.JLabel nameLabel; private javax.swing.JScrollPane previewGroup; private javax.swing.JLabel previewLabel; private javax.swing.JLabel spacingLabel; private javax.swing.JSpinner spacingSpinner; private javax.swing.JPanel tileSizeGroup; private javax.swing.JPanel tilesetGroup; private javax.swing.JCheckBox transparencyBox; private javax.swing.JLabel widthLabel; private javax.swing.JSpinner widthSpinner; // End of variables declaration//GEN-END:variables }