Source code: org/meowers/cide/edcide/EdCide.java
1 /*
2 * EdCide.java
3 *
4 * Created on January 17, 2002, 3:37 PM
5 */
6
7 package org.meowers.cide.edcide;
8
9 import org.meowers.cide.data.*;
10 import org.meowers.cide.edcide.tile.*;
11 import org.meowers.cide.edcide.gamedata.*;
12 import org.meowers.cide.edcide.map.*;
13 import org.meowers.cide.edcide.tileset.*;
14 import javax.swing.*;
15 import javax.swing.tree.*;
16 import java.awt.event.*;
17 import java.awt.*;
18 import javax.swing.filechooser.*;
19 import java.io.*;
20
21 /**
22 *
23 * @author adam
24 */
25 public class EdCide extends javax.swing.JFrame {
26
27 private EdCideTreeNode menuNode; // the node on which the menu was popped-up
28 private int newNumber; // number appended to new objects
29 private final JFileChooser fileChooser = new JFileChooser();
30 private GameData gd;
31 private File gdFile; // file used to save as
32 private EditorPanel editorPanel = new EditorPanel();
33 private static final String VERSION = "alpha-20212";
34
35 /** Creates new form EdCide */
36 public EdCide() {
37 gd = new GameData();
38 initComponents();
39 mainSplitter.setRightComponent(editorPanel);
40 }
41
42 /** This method is called from within the constructor to
43 * initialize the form.
44 * WARNING: Do NOT modify this code. The content of this method is
45 * always regenerated by the Form Editor.
46 */
47 private void initComponents() {//GEN-BEGIN:initComponents
48 mainMenuBar = new javax.swing.JMenuBar();
49 fileMenu = new javax.swing.JMenu();
50 fileNewMenuItem = new javax.swing.JMenuItem();
51 fileOpenMenuItem = new javax.swing.JMenuItem();
52 fileSaveMenuItem = new javax.swing.JMenuItem();
53 fileSaveAsMenuItem = new javax.swing.JMenuItem();
54 fileSep1 = new javax.swing.JSeparator();
55 fileExitMenuItem = new javax.swing.JMenuItem();
56 helpMenu = new javax.swing.JMenu();
57 helpAboutMenuItem = new javax.swing.JMenuItem();
58 popupGroupTreeMenu = new javax.swing.JPopupMenu();
59 newGroupTreeMenuItem = new javax.swing.JMenuItem();
60 popupTreeMenu = new javax.swing.JPopupMenu();
61 deleteTreeMenuItem = new javax.swing.JMenuItem();
62 mainSplitter = new javax.swing.JSplitPane();
63 treeScrollPane = new javax.swing.JScrollPane();
64 dataTree = new javax.swing.JTree();
65
66 fileMenu.setText("File");
67 fileNewMenuItem.setText("New");
68 fileNewMenuItem.addActionListener(new java.awt.event.ActionListener() {
69 public void actionPerformed(java.awt.event.ActionEvent evt) {
70 fileNewMenuItemActionPerformed(evt);
71 }
72 });
73
74 fileMenu.add(fileNewMenuItem);
75 fileOpenMenuItem.setText("Open...");
76 fileOpenMenuItem.addActionListener(new java.awt.event.ActionListener() {
77 public void actionPerformed(java.awt.event.ActionEvent evt) {
78 fileOpenMenuItemActionPerformed(evt);
79 }
80 });
81
82 fileMenu.add(fileOpenMenuItem);
83 fileSaveMenuItem.setText("Save");
84 fileSaveMenuItem.addActionListener(new java.awt.event.ActionListener() {
85 public void actionPerformed(java.awt.event.ActionEvent evt) {
86 fileSaveMenuItemActionPerformed(evt);
87 }
88 });
89
90 fileMenu.add(fileSaveMenuItem);
91 fileSaveAsMenuItem.setText("Save As...");
92 fileSaveAsMenuItem.addActionListener(new java.awt.event.ActionListener() {
93 public void actionPerformed(java.awt.event.ActionEvent evt) {
94 fileSaveAsMenuItemActionPerformed(evt);
95 }
96 });
97
98 fileMenu.add(fileSaveAsMenuItem);
99 fileMenu.add(fileSep1);
100 fileExitMenuItem.setToolTipText("Exit Editor");
101 fileExitMenuItem.setText("Exit");
102 fileExitMenuItem.addActionListener(new java.awt.event.ActionListener() {
103 public void actionPerformed(java.awt.event.ActionEvent evt) {
104 fileExitMenuItemActionPerformed(evt);
105 }
106 });
107
108 fileMenu.add(fileExitMenuItem);
109 mainMenuBar.add(fileMenu);
110 helpMenu.setText("Help");
111 helpAboutMenuItem.setText("About...");
112 helpAboutMenuItem.addActionListener(new java.awt.event.ActionListener() {
113 public void actionPerformed(java.awt.event.ActionEvent evt) {
114 helpAboutMenuItemActionPerformed(evt);
115 }
116 });
117
118 helpMenu.add(helpAboutMenuItem);
119 mainMenuBar.add(helpMenu);
120 newGroupTreeMenuItem.setText("New");
121 newGroupTreeMenuItem.addActionListener(new java.awt.event.ActionListener() {
122 public void actionPerformed(java.awt.event.ActionEvent evt) {
123 newGroupTreeMenuItemActionPerformed(evt);
124 }
125 });
126
127 popupGroupTreeMenu.add(newGroupTreeMenuItem);
128 deleteTreeMenuItem.setText("Delete");
129 popupTreeMenu.add(deleteTreeMenuItem);
130
131 setTitle("EdCide");
132 setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
133 addWindowListener(new java.awt.event.WindowAdapter() {
134 public void windowClosing(java.awt.event.WindowEvent evt) {
135 exitForm(evt);
136 }
137 });
138
139 mainSplitter.setPreferredSize(new java.awt.Dimension(600, 400));
140 mainSplitter.setOneTouchExpandable(true);
141 mainSplitter.setRightComponent(new org.meowers.cide.edcide.EditorPanel());
142 dataTree.setModel(buildTree(gd));
143 dataTree.addMouseListener(new java.awt.event.MouseAdapter() {
144 public void mouseClicked(java.awt.event.MouseEvent evt) {
145 dataTreeMouseClicked(evt);
146 }
147 });
148
149 dataTree.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() {
150 public void valueChanged(javax.swing.event.TreeSelectionEvent evt) {
151 dataTreeValueChanged(evt);
152 }
153 });
154
155 treeScrollPane.setViewportView(dataTree);
156
157 mainSplitter.setLeftComponent(treeScrollPane);
158
159 getContentPane().add(mainSplitter, java.awt.BorderLayout.CENTER);
160
161 setJMenuBar(mainMenuBar);
162 pack();
163 }//GEN-END:initComponents
164
165 private void helpAboutMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_helpAboutMenuItemActionPerformed
166 AboutDialog ad = new AboutDialog(this, true, VERSION);
167 ad.show();
168 }//GEN-LAST:event_helpAboutMenuItemActionPerformed
169
170 private void fileSaveAsMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fileSaveAsMenuItemActionPerformed
171 if (getFilename())
172 doSave();
173 }//GEN-LAST:event_fileSaveAsMenuItemActionPerformed
174
175 private boolean getFilename() {
176 int ret = 0;
177 ret = fileChooser.showSaveDialog(this);
178 if (ret == JFileChooser.APPROVE_OPTION) {
179 gdFile = fileChooser.getSelectedFile();
180 EdCideTreeNode n = (EdCideTreeNode) dataTree.getModel().getRoot();
181 n.setUserObject(gdFile.getName());
182 return (true);
183 }
184
185 return (false);
186 }
187
188 private boolean doSave() {
189 int ret = 0;
190 if (gdFile == null) {
191 if (!getFilename())
192 return (false);
193 }
194
195 if (!GameDataIO.save(gdFile, gd)) {
196 // TODO: Better error handling
197 System.out.println("Error saving.");
198 return (false);
199 }
200
201 return (true);
202 }
203
204 private void fileOpenMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fileOpenMenuItemActionPerformed
205 if (checkDirty()) {
206 GameData newGD;
207
208 int ret = fileChooser.showOpenDialog(this);
209 if (ret == JFileChooser.APPROVE_OPTION) {
210 File newGDFile = fileChooser.getSelectedFile();
211 newGD = GameDataIO.load(newGDFile);
212 if (newGD != null) {
213 gd = newGD;
214 gdFile = newGDFile;
215 dataTree.setModel(buildTree(gd));
216 } else {
217 System.out.println("Error opening.");
218 }
219 }
220 }
221 }//GEN-LAST:event_fileOpenMenuItemActionPerformed
222
223 private void fileSaveMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fileSaveMenuItemActionPerformed
224 doSave();
225 }//GEN-LAST:event_fileSaveMenuItemActionPerformed
226
227 private void newGroupTreeMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newGroupTreeMenuItemActionPerformed
228 int newGameDataType = menuNode.getGameDataType();
229 EdCideTreeNode newNode = null;
230
231 switch (newGameDataType) {
232 case GameObject.TILE:
233 if (gd.getTileSize() > 0) {
234 Tile t = new Tile();
235 t.setName("tile" + (new Integer(newNumber++)).toString());
236 gd.addGameObject(t);
237 newNode = new EdCideTreeNode(t);
238 } else {
239 JOptionPane.showMessageDialog(this,
240 "Please set tile size in GameData (root of tree) first.",
241 "No tile size", JOptionPane.INFORMATION_MESSAGE);
242 }
243 break;
244 case GameObject.MAP:
245 Map m = new Map();
246 m.setName("map" + (new Integer(newNumber++)).toString());
247 gd.addGameObject(m);
248 newNode = new EdCideTreeNode(m);
249 break;
250 case GameObject.TILE_SET:
251 TileSet tileSet = new TileSet();
252 tileSet.setName("tileset" + (new Integer(newNumber++)).toString());
253 gd.addGameObject(tileSet);
254 newNode = new EdCideTreeNode(tileSet);
255 break;
256 default:
257 }
258
259 //dataTree.invalidate();
260 if (newNode != null)
261 ((DefaultTreeModel) dataTree.getModel()).insertNodeInto(newNode, menuNode, menuNode.getChildCount());;
262 }//GEN-LAST:event_newGroupTreeMenuItemActionPerformed
263
264 /**
265 * Shows the popup menu when the right mouse button is clicked on the
266 * dataTree
267 */
268 private void dataTreeMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_dataTreeMouseClicked
269 if (SwingUtilities.isRightMouseButton(evt)) {
270 //if ((evt.getModifiers() & InputEvent.BUTTON3_MASK) > 0) {
271
272 TreePath tp = dataTree.getPathForLocation(evt.getX(), evt.getY());
273 if (tp != null) {
274 EdCideTreeNode n = (EdCideTreeNode) tp.getPathComponent(tp.getPathCount() - 1);
275
276 menuNode = n;
277
278 if (n.isGroup()) {
279 popupGroupTreeMenu.show(dataTree, evt.getX(), evt.getY());
280 } else if (n.getGameDataType() != GameObject.GAME_DATA) {
281 popupTreeMenu.show(dataTree, evt.getX(), evt.getY());
282 }
283 }
284 }
285 }//GEN-LAST:event_dataTreeMouseClicked
286
287 private void dataTreeValueChanged(javax.swing.event.TreeSelectionEvent evt) {//GEN-FIRST:event_dataTreeValueChanged
288 TreePath tp = evt.getNewLeadSelectionPath();
289 if (tp != null && tp.getPathCount() == 3) {
290 EdCideTreeNode leaf = (EdCideTreeNode) tp.getPathComponent(2);
291
292 switch (leaf.getGameDataType()) {
293 case GameObject.TILE:
294 editorPanel.setEditor(new TileEditor(gd, leaf));
295 break;
296 case GameObject.MAP:
297 editorPanel.setEditor(new MapEditor(gd, leaf));
298 break;
299 case GameObject.TILE_SET:
300 editorPanel.setEditor(new TileSetEditor(gd, leaf));
301 break;
302 default:
303 break;
304 }
305 } else if (tp != null && tp.getPathCount() == 1) {
306 EdCideTreeNode type = (EdCideTreeNode) tp.getPathComponent(0);
307 if (type.getGameDataType() == GameObject.GAME_DATA) {
308 editorPanel.setEditor(new GameDataEditor(gd, type));
309 }
310 } else { // not a valid object, display blank editor
311 editorPanel.setEditor(new BlankEditor());
312 }
313 }//GEN-LAST:event_dataTreeValueChanged
314
315 private void fileNewMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fileNewMenuItemActionPerformed
316 // TODO: Check here for existing data that will be overwritten
317 if (checkDirty()) {
318 gd = new GameData();
319 dataTree.setModel(buildTree(gd));
320 gdFile = null;
321 }
322 }//GEN-LAST:event_fileNewMenuItemActionPerformed
323
324 private void fileExitMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fileExitMenuItemActionPerformed
325 if (checkDirty()) {
326 System.exit(0);
327 }
328 }//GEN-LAST:event_fileExitMenuItemActionPerformed
329
330 /** Exit the Application */
331 private void exitForm(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_exitForm
332 if (checkDirty()) {
333 System.exit(0);
334 } else {
335 System.out.println("blah");
336 }
337 }//GEN-LAST:event_exitForm
338
339 /**
340 * @param args the command line arguments
341 */
342 public static void main(String args[]) {
343 new EdCide().show();
344 }
345
346 private DefaultTreeModel buildTree(GameData g) {
347 DefaultMutableTreeNode root;
348 DefaultMutableTreeNode child;
349 DefaultMutableTreeNode subchild;
350 int i;
351
352 // create the root node
353 String rootString = null;
354 if (gdFile == null)
355 rootString = "Game Data";
356 else
357 rootString = gdFile.getName();
358 root = new EdCideTreeNode(gd);
359
360 // create the tile group
361 child = new EdCideTreeNode("Tiles", GameObject.TILE);
362 for (i = 0; i < gd.getGameObjectCount(GameObject.TILE); i++) {
363 Tile t = (Tile) gd.getGameObject(GameObject.TILE, i);
364 subchild = new EdCideTreeNode(t);
365 child.add(subchild);
366 }
367 root.add(child);
368
369 // create tileset group
370 child = new EdCideTreeNode("Tile Sets", GameObject.TILE_SET);
371 for (i = 0; i < gd.getGameObjectCount(GameObject.TILE_SET); i++) {
372 TileSet tileSet = (TileSet) gd.getGameObject(GameObject.TILE_SET, i);
373 subchild = new EdCideTreeNode(tileSet);
374 child.add(subchild);
375 }
376 root.add(child);
377
378 // create the map group
379 child = new EdCideTreeNode("Maps", GameObject.MAP);
380 for (i = 0; i < gd.getGameObjectCount(GameObject.MAP); i++) {
381 Map m = (Map) gd.getGameObject(GameObject.MAP, i);
382 subchild = new EdCideTreeNode(m);
383 child.add(subchild);
384 }
385 root.add(child);
386
387 // return the tree model
388 return (new DefaultTreeModel(root));
389 }
390
391 protected boolean checkDirty() {
392 if (gd.isDirty()) {
393 int ans = JOptionPane.showConfirmDialog(this,
394 "Current data is not saved. Do you wish to save it now?",
395 "Save?", JOptionPane.YES_NO_CANCEL_OPTION,
396 JOptionPane.WARNING_MESSAGE);
397 if (ans == JOptionPane.YES_OPTION) {
398 doSave();
399 }
400 if (ans == JOptionPane.CANCEL_OPTION)
401 return (false);
402 }
403 return (true);
404 }
405
406
407
408 // Variables declaration - do not modify//GEN-BEGIN:variables
409 private javax.swing.JMenuBar mainMenuBar;
410 private javax.swing.JMenu fileMenu;
411 private javax.swing.JMenuItem fileNewMenuItem;
412 private javax.swing.JMenuItem fileOpenMenuItem;
413 private javax.swing.JMenuItem fileSaveMenuItem;
414 private javax.swing.JMenuItem fileSaveAsMenuItem;
415 private javax.swing.JSeparator fileSep1;
416 private javax.swing.JMenuItem fileExitMenuItem;
417 private javax.swing.JMenu helpMenu;
418 private javax.swing.JMenuItem helpAboutMenuItem;
419 private javax.swing.JPopupMenu popupGroupTreeMenu;
420 private javax.swing.JMenuItem newGroupTreeMenuItem;
421 private javax.swing.JPopupMenu popupTreeMenu;
422 private javax.swing.JMenuItem deleteTreeMenuItem;
423 private javax.swing.JSplitPane mainSplitter;
424 private javax.swing.JScrollPane treeScrollPane;
425 private javax.swing.JTree dataTree;
426 // End of variables declaration//GEN-END:variables
427
428 }