From 3ff011d811289446e5da165c98e43ced5a0fff72 Mon Sep 17 00:00:00 2001 From: Edvin Linge Date: Sat, 7 Sep 2013 10:30:58 +0200 Subject: [PATCH] Had some fun with the Level Editor. Removed the dependency on MiGLayout by creating my own Panel instead. Tried to change as little as possible of the existing code, there should be no functionality changes except for one small thing: The warning text in the population tab did not update when you removed an entry, now it does. Also added what to write in the command line to compile and run the Level Editor, and added some more files to the ignore file --- .gitignore | 7 + LevelEdit/.classpath | 1 - LevelEdit/MiGLayout-License.txt | 27 -- LevelEdit/README.txt | 12 +- LevelEdit/miglayout-4.0-swing.jar | Bin 77291 -> 0 bytes .../src/com/corsixth/leveledit/Emergency.java | 4 +- .../com/corsixth/leveledit/FileChooser.java | 22 +- .../src/com/corsixth/leveledit/GridPanel.java | 232 ++++++++++++++++++ LevelEdit/src/com/corsixth/leveledit/Gui.java | 27 +- .../src/com/corsixth/leveledit/Main.java | 10 +- .../src/com/corsixth/leveledit/Menu.java | 21 +- .../com/corsixth/leveledit/Population.java | 4 +- .../src/com/corsixth/leveledit/Quake.java | 4 +- .../com/corsixth/leveledit/ReaderWriter.java | 7 + .../com/corsixth/leveledit/StaffLevels.java | 5 +- .../com/corsixth/leveledit/StartStaff.java | 4 +- .../src/com/corsixth/leveledit/TabAwards.java | 16 +- .../src/com/corsixth/leveledit/TabBar.java | 37 ++- .../com/corsixth/leveledit/TabDiseases.java | 196 ++++++++------- .../corsixth/leveledit/TabEarthquakes.java | 19 +- .../corsixth/leveledit/TabEmergencies.java | 177 ++++++------- .../com/corsixth/leveledit/TabGeneral.java | 17 +- .../src/com/corsixth/leveledit/TabGoals.java | 21 +- .../com/corsixth/leveledit/TabObjects.java | 52 ++-- .../com/corsixth/leveledit/TabPopulation.java | 44 ++-- .../src/com/corsixth/leveledit/TabStaff.java | 90 +++---- 26 files changed, 666 insertions(+), 390 deletions(-) delete mode 100644 LevelEdit/MiGLayout-License.txt delete mode 100644 LevelEdit/miglayout-4.0-swing.jar create mode 100644 LevelEdit/src/com/corsixth/leveledit/GridPanel.java diff --git a/.gitignore b/.gitignore index 0244a55a8b..a8cd7bbdc6 100644 --- a/.gitignore +++ b/.gitignore @@ -46,3 +46,10 @@ RelWithDebInfo/ !LevelEdit/src/com/MinSizeRel !LevelEdit/src/com/RelWithDebInfo !LevelEdit/src/com/.DS_Store + +# This is for the CMake-generated Visual Studio project +*.vcxproj* +CorsixTH_Top_Level* + +# For the LevelEdit project +*.class diff --git a/LevelEdit/.classpath b/LevelEdit/.classpath index 3cb8c69448..91ee9a52f4 100644 --- a/LevelEdit/.classpath +++ b/LevelEdit/.classpath @@ -2,6 +2,5 @@ - diff --git a/LevelEdit/MiGLayout-License.txt b/LevelEdit/MiGLayout-License.txt deleted file mode 100644 index e48aa127c7..0000000000 --- a/LevelEdit/MiGLayout-License.txt +++ /dev/null @@ -1,27 +0,0 @@ -License (BSD): - ============== - - Copyright (c) 2004, Mikael Grev, MiG InfoCom AB. (miglayout (at) miginfocom (dot) com) - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list - of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this - list of conditions and the following disclaimer in the documentation and/or other - materials provided with the distribution. - Neither the name of the MiG InfoCom AB nor the names of its contributors may be - used to endorse or promote products derived from this software without specific - prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - OF SUCH DAMAGE. \ No newline at end of file diff --git a/LevelEdit/README.txt b/LevelEdit/README.txt index 2f30b3ce1b..a6ef6e0671 100644 --- a/LevelEdit/README.txt +++ b/LevelEdit/README.txt @@ -9,9 +9,15 @@ editing a text file, which can be quite error prone the level creator can use this tool to set all available variables used in CorsixTH and then save it as a .level file. -The tool is written in Java, and a project for Eclipse is supplied here, though -it should work just as well to use any other IDE or command line tool to -compile it. +The tool is written in Java. The supplied project for Eclipse can be used +to compile. An alternative is to issue the following commands while in this +folder: + +Compile: +javac -d bin -sourcepath src src/com/corsixth/leveledit/Main.java + +Run: +java -cp bin com.corsixth.leveledit.Main ------------------------------------------------------------------------------ -- Contact Details diff --git a/LevelEdit/miglayout-4.0-swing.jar b/LevelEdit/miglayout-4.0-swing.jar deleted file mode 100644 index 7b6a22cacdbf72ffb92576dc3f242b6ca0f4d8c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77291 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 diff --git a/LevelEdit/src/com/corsixth/leveledit/Emergency.java b/LevelEdit/src/com/corsixth/leveledit/Emergency.java index 5eb2bdb034..3c0ea40535 100644 --- a/LevelEdit/src/com/corsixth/leveledit/Emergency.java +++ b/LevelEdit/src/com/corsixth/leveledit/Emergency.java @@ -27,8 +27,6 @@ this software and associated documentation files (the "Software"), to deal in import javax.swing.JPanel; import javax.swing.JTextField; -import net.miginfocom.swing.MigLayout; - public class Emergency { static int emergencyMode = 2; // 0 = random; // 1 = semi-random @@ -53,7 +51,7 @@ public class Emergency { "Spare Ribs", "Sweaty Palms", "The Squits", "Transparency", "Uncommon Cold", "Unexpected Swelling" }; - JPanel emergencyPanel = new JPanel(new MigLayout("insets 1")); + JPanel emergencyPanel = new JPanel(); JComboBox illnessCombo = new JComboBox(diseases); JLabel minPatientsLabel = new JLabel("Patients min:"); diff --git a/LevelEdit/src/com/corsixth/leveledit/FileChooser.java b/LevelEdit/src/com/corsixth/leveledit/FileChooser.java index c59c5512b4..c2e57acd58 100644 --- a/LevelEdit/src/com/corsixth/leveledit/FileChooser.java +++ b/LevelEdit/src/com/corsixth/leveledit/FileChooser.java @@ -27,14 +27,22 @@ this software and associated documentation files (the "Software"), to deal in import javax.swing.JDialog; import javax.swing.JFileChooser; +import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.filechooser.FileNameExtensionFilter; -//creates JFileChooser +/** + * A custom JFileChooser + * + * @author Koanxd + * + */ public class FileChooser extends JFileChooser { + // this is insignificant but apparently its needed because JFrame is // serializable - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 2153326271573582591L; + ReaderWriter readerWriter = new ReaderWriter(); FileNameExtensionFilter corsixTH = new FileNameExtensionFilter( @@ -42,15 +50,19 @@ public class FileChooser extends JFileChooser { FileNameExtensionFilter originalTH = new FileNameExtensionFilter( "Theme Hospital Level files (.SAM)", "SAM"); - public FileChooser() { + // Used to get the CorsixTH icon in the top bar of the dialog. + JFrame mainFrame; + + public FileChooser(JFrame frame) { setCurrentDirectory(readerWriter.getLastFilePath()); setFileFilter(corsixTH); + mainFrame = frame; } public File open() { addChoosableFileFilter(originalTH); setAcceptAllFileFilterUsed(true); - int returnVal = showOpenDialog(null); + int returnVal = showOpenDialog(mainFrame); if (returnVal == JFileChooser.APPROVE_OPTION) { readerWriter.saveLastFilePath(getSelectedFile().getPath()); return getSelectedFile(); @@ -63,7 +75,7 @@ public File saveAs() throws IOException { removeChoosableFileFilter(originalTH); setAcceptAllFileFilterUsed(false); setFileFilter(corsixTH); - int returnVal = showSaveDialog(null); + int returnVal = showSaveDialog(mainFrame); if (returnVal == JFileChooser.APPROVE_OPTION) { File file = getSelectedFile(); readerWriter.saveLastFilePath(file.getPath()); diff --git a/LevelEdit/src/com/corsixth/leveledit/GridPanel.java b/LevelEdit/src/com/corsixth/leveledit/GridPanel.java new file mode 100644 index 0000000000..062334bac6 --- /dev/null +++ b/LevelEdit/src/com/corsixth/leveledit/GridPanel.java @@ -0,0 +1,232 @@ +/* +Copyright (c) 2013 Edvin "Lego3" Linge + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + */ + +package com.corsixth.leveledit; + +import java.awt.Component; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.util.ArrayList; + +import javax.swing.BorderFactory; +import javax.swing.JPanel; + +/** + * A panel that uses the GridBagLayout to layout its components. This is a + * rudimentary implementation tailored for the LevelEdit project. It supplies + * similar functionality as MigLayout, but only the parts we need. The + * constructor takes a column argument that specifies the number of columns used + * in the grid. Each added component is put at the end of the grid left to + * right, top to bottom. + * + * @author Edvin "Lego3" Linge + * + */ +public class GridPanel extends JPanel { + + private static final long serialVersionUID = 6388650541048165610L; + private static final int INSETS = 2; + private static final int BORDER = 3; + + private int columns = 0; + private int rows = 0; + + private GridBagConstraints c = new GridBagConstraints(); + + // Used to add a dummy JPanel to the end so that we can achieve top left + // alignment. + private GridBagConstraints fillerC = new GridBagConstraints(); + + private JPanel panelFiller = new JPanel(); + + private ArrayList[] contents; + + @SuppressWarnings("unchecked") + public GridPanel(int noColumns) { + c.insets = new Insets(INSETS, INSETS, INSETS, INSETS); + c.gridx = 0; + c.gridy = 0; + c.anchor = GridBagConstraints.WEST; + columns = noColumns; + + fillerC.gridx = 1; + fillerC.gridy = 1; + fillerC.weighty = 1; + fillerC.weightx = 1; + + setBorder(BorderFactory.createEmptyBorder(BORDER, BORDER, BORDER, + BORDER)); + setLayout(new GridBagLayout()); + + contents = (ArrayList[]) new ArrayList[noColumns]; + for (int i = 0; i < noColumns; i++) { + contents[i] = new ArrayList(); + } + } + + /** + * Set insets in all directions to 'inset' all for each object added in the + * future. + * + * @param inset + * Inset to use in all directions. + */ + public void setInsets(int inset) { + setInsets(inset, inset, inset, inset); + } + + /** + * Set insets in each direction according to the parameters, will be used + * for all objects added to the JGridPanel from this point onwards. + * + * @param top + * Top inset value + * @param left + * Left inset value + * @param bottom + * Bottom inset value + * @param right + * Right inset value + */ + public void setInsets(int top, int left, int bottom, int right) { + c.insets = new Insets(top, left, bottom, right); + } + + @Override + public Component add(Component comp) { + super.remove(panelFiller); + contents[c.gridx].add(comp); + add(comp, c); + next(); + add(panelFiller, fillerC); + + return comp; + } + + /** + * Adds a new component to the container and advances one row i newRow is + * true. If the component is added to the last column in the current row the + * advancement is still only one row. + * + * @param comp + * Component to add. + * @param newRow + * Whether to advance one row after adding the new component. + * @return + */ + public Component add(Component comp, boolean newRow) { + int row = rows; + add(comp); + if (row == rows && newRow) { + nextRow(); + } + return comp; + } + + @Override + public void remove(Component comp) { + boolean found = false; + for (int i = 0; i < columns; i++) { + int index = contents[i].indexOf(comp); + if (index != -1) { + super.remove(comp); + contents[i].remove(comp); + found = true; + break; + } + } + if (found) { + int max = 0; + for (int i = 0; i < columns; i++) { + max = Math.max(max, contents[i].size()); + } + if (max <= rows) { + removeRow(); + } + } + } + + /** + * Finds the oldComp in the grid of added components and swaps it for the + * newComp. + * + * @param oldComp + * @param newComp + */ + public void swap(Component oldComp, Component newComp) { + for (int i = 0; i < columns; i++) { + int index = contents[i].indexOf(oldComp); + if (index != -1) { + contents[i].remove(index); + contents[i].add(index, newComp); + super.remove(oldComp); + int tempX = c.gridx; + int tempY = c.gridy; + c.gridx = i; + c.gridy = index; + add(newComp); + c.gridx = tempX; + c.gridy = tempY; + break; + } + } + } + + /** + * Skips 'times' cells in the grid so that the next component will be added furhter down. + * @param times how many cells to skip. + */ + public void next(int times) { + for (int i = 0; i < times; i++) { + next(); + } + } + + /** + * Skips one cell in the grid. + */ + public void next() { + c.gridx++; + if (c.gridx >= columns) { + nextRow(); + } + fillerC.gridx = columns + 1; + fillerC.gridy = c.gridy + 1; + } + + /** + * Advances the layout one row so that the next added component will be on a new one. + */ + public void nextRow() { + c.gridx = 0; + c.gridy++; + rows++; + } + + private void removeRow() { + c.gridx = 0; + c.gridy--; + rows--; + } + +} diff --git a/LevelEdit/src/com/corsixth/leveledit/Gui.java b/LevelEdit/src/com/corsixth/leveledit/Gui.java index 81fe1c0f0c..372e3d10ab 100644 --- a/LevelEdit/src/com/corsixth/leveledit/Gui.java +++ b/LevelEdit/src/com/corsixth/leveledit/Gui.java @@ -35,17 +35,23 @@ this software and associated documentation files (the "Software"), to deal in import javax.swing.JFrame; import javax.swing.JOptionPane; -//create menu and tabBar, set window size, location and on-exit-behaviour. +/** + * Create menu and tabBar, set window size, location and on-exit-behaviour. + * + * @author Koanxd + * + */ public class Gui extends JFrame { + // this is insignificant but apparently its needed because JFrame is // serializable - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 5696773542922343319L; // this string is changed on every focusGained event. static String tempValue = ""; ReaderWriter readerWriter = new ReaderWriter(); - FileChooser fileChooser = new FileChooser(); + FileChooser fileChooser = new FileChooser(this); public Gui() { List icons = new ArrayList(); @@ -78,15 +84,17 @@ public void windowClosing(WindowEvent event) { // set location to center setLocationRelativeTo(null); - Menu menu = new Menu(); - setJMenuBar(menu); + // The JFrame is just used to get our icon in the filechooser. + setJMenuBar(new Menu(this)); - TabBar tabBar = new TabBar(); - setContentPane(tabBar.tabs); + setContentPane(new TabBar()); } + /** + * Gives the user a chance to save any changes before exiting. + */ protected void onExit() { - JOptionPane exit = new JOptionPane("Save file?"); + JOptionPane exit = new JOptionPane("Would you like to save your level?"); Object[] options = new String[] { "Save", "Don't save", "Cancel" }; exit.setOptions(options); @@ -106,8 +114,7 @@ protected void onExit() { } } else if (exit.getValue() == options[1]) { System.exit(0); - } else - ; + } } diff --git a/LevelEdit/src/com/corsixth/leveledit/Main.java b/LevelEdit/src/com/corsixth/leveledit/Main.java index 6c57d812f4..33efe51573 100644 --- a/LevelEdit/src/com/corsixth/leveledit/Main.java +++ b/LevelEdit/src/com/corsixth/leveledit/Main.java @@ -25,8 +25,16 @@ this software and associated documentation files (the "Software"), to deal in import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; +/** + * The main entry point of the Level Editor that simply sets the L&F and starts + * the {@link Gui}. The source file also contains a list of TODOs for the + * project. + * + * @author Koanxd + * + */ public class Main { - static final double VERSION = 0.14; + public static final double VERSION = 0.14; public static void main(String[] args) { try { diff --git a/LevelEdit/src/com/corsixth/leveledit/Menu.java b/LevelEdit/src/com/corsixth/leveledit/Menu.java index 7e5f85f9d6..9d0ad3e7d3 100644 --- a/LevelEdit/src/com/corsixth/leveledit/Menu.java +++ b/LevelEdit/src/com/corsixth/leveledit/Menu.java @@ -28,6 +28,7 @@ this software and associated documentation files (the "Software"), to deal in import java.io.IOException; import javax.swing.JDialog; +import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; @@ -38,11 +39,11 @@ public class Menu extends JMenuBar { // this is insignificant but apparently its needed because JFrame is // serializable - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 5339035000069193766L; ReaderWriter readerWriter = new ReaderWriter(); VarManipulator var = new VarManipulator(); - FileChooser fileChooser = new FileChooser(); + FileChooser fileChooser; JMenuItem fileNew = new JMenuItem("New"); JMenuItem fileOpen = new JMenuItem("Open"); @@ -51,7 +52,7 @@ public class Menu extends JMenuBar { JMenuItem about = new JMenuItem("About"); - public Menu() { + public Menu(JFrame frame) { JMenu menuFile = new JMenu("File"); menuFile.add(fileNew); menuFile.add(fileOpen); @@ -61,6 +62,9 @@ public Menu() { JMenu menuHelp = new JMenu("Help"); menuHelp.add(about); + fileChooser = new FileChooser(frame); + + // new fileNew.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { @@ -113,13 +117,10 @@ public void actionPerformed(ActionEvent e) { about.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - JOptionPane aboutPane = new JOptionPane( - "Version: " - + Main.VERSION - + "\n\n" - + "Programmers: snowblind\n" - + "Logo Artist: Wolter\n\n" - + "Software includes MigLayout library. (www.miglayout.com)"); + JOptionPane aboutPane = new JOptionPane("Version: " + + Main.VERSION + "\n\n" + + "Programmers: snowblind aka koanxd\n" + + "Logo Artist: Wolter\n"); Object[] options = new String[] { "Ok" }; aboutPane.setOptions(options); diff --git a/LevelEdit/src/com/corsixth/leveledit/Population.java b/LevelEdit/src/com/corsixth/leveledit/Population.java index 1613b64c52..7b6e67bf3f 100644 --- a/LevelEdit/src/com/corsixth/leveledit/Population.java +++ b/LevelEdit/src/com/corsixth/leveledit/Population.java @@ -26,8 +26,6 @@ this software and associated documentation files (the "Software"), to deal in import javax.swing.JPanel; import javax.swing.JTextField; -import net.miginfocom.swing.MigLayout; - public class Population { static final int MONTH = 0; static final int SPAWN = 0; @@ -37,7 +35,7 @@ public class Population { int spawn = SPAWN; int change = CHANGE; - JPanel populationPanel = new JPanel(new MigLayout("insets 1")); + JPanel populationPanel = new JPanel(); JTextField monthTF = new JTextField(Integer.toString(month), 2); JTextField changeTF = new JTextField(Integer.toString(change), 2); diff --git a/LevelEdit/src/com/corsixth/leveledit/Quake.java b/LevelEdit/src/com/corsixth/leveledit/Quake.java index 212e1e257d..8fcabac047 100644 --- a/LevelEdit/src/com/corsixth/leveledit/Quake.java +++ b/LevelEdit/src/com/corsixth/leveledit/Quake.java @@ -25,8 +25,6 @@ this software and associated documentation files (the "Software"), to deal in import javax.swing.JPanel; import javax.swing.JTextField; -import net.miginfocom.swing.MigLayout; - public class Quake { static final int START_MONTH = 6; static final int END_MONTH = 18; @@ -36,7 +34,7 @@ public class Quake { int endMonth = END_MONTH; int severity = SEVERITY; - JPanel quakePanel = new JPanel(new MigLayout("insets 1")); + JPanel quakePanel = new JPanel(); JTextField startMonthTF = new JTextField(Integer.toString(startMonth), 2); JTextField endMonthTF = new JTextField(Integer.toString(endMonth), 2); diff --git a/LevelEdit/src/com/corsixth/leveledit/ReaderWriter.java b/LevelEdit/src/com/corsixth/leveledit/ReaderWriter.java index 2b717cd9e8..473293fa9d 100644 --- a/LevelEdit/src/com/corsixth/leveledit/ReaderWriter.java +++ b/LevelEdit/src/com/corsixth/leveledit/ReaderWriter.java @@ -29,6 +29,13 @@ this software and associated documentation files (the "Software"), to deal in import java.io.FileWriter; import java.io.IOException; +/** + * Reads .level and .SAM files and writes the currently opened data to .level + * files. + * + * @author Koanxd + * + */ public class ReaderWriter { VarManipulator varManipulator = new VarManipulator(); diff --git a/LevelEdit/src/com/corsixth/leveledit/StaffLevels.java b/LevelEdit/src/com/corsixth/leveledit/StaffLevels.java index 5a0f218d90..a01bc87b9f 100644 --- a/LevelEdit/src/com/corsixth/leveledit/StaffLevels.java +++ b/LevelEdit/src/com/corsixth/leveledit/StaffLevels.java @@ -23,11 +23,8 @@ this software and associated documentation files (the "Software"), to deal in package com.corsixth.leveledit; import javax.swing.JLabel; -import javax.swing.JPanel; import javax.swing.JTextField; -import net.miginfocom.swing.MigLayout; - public class StaffLevels { int month = 0; int nurses = 8; @@ -40,7 +37,7 @@ public class StaffLevels { int consultantRate = 10; int juniorRate = 5; - JPanel staffLevelsPanel = new JPanel(new MigLayout()); + GridPanel staffLevelsPanel = new GridPanel(10); JLabel monthLabel = new JLabel("Starting from month:"); JLabel nursesLabel = new JLabel("Nurses:"); diff --git a/LevelEdit/src/com/corsixth/leveledit/StartStaff.java b/LevelEdit/src/com/corsixth/leveledit/StartStaff.java index 77a5428aa2..2a3a929b0a 100644 --- a/LevelEdit/src/com/corsixth/leveledit/StartStaff.java +++ b/LevelEdit/src/com/corsixth/leveledit/StartStaff.java @@ -28,8 +28,6 @@ this software and associated documentation files (the "Software"), to deal in import javax.swing.JPanel; import javax.swing.JTextField; -import net.miginfocom.swing.MigLayout; - public class StartStaff { int doctor = 1; int shrink = 0; @@ -41,7 +39,7 @@ public class StartStaff { int skill = 50; String[] staffChoice = { "Doctor", "Nurse", "Handyman", "Receptionist" }; - JPanel startStaffPanel = new JPanel(new MigLayout("insets 1")); + JPanel startStaffPanel = new JPanel(); JComboBox staffMemberCombo = new JComboBox(staffChoice); JCheckBox shrinkCB = new JCheckBox(); diff --git a/LevelEdit/src/com/corsixth/leveledit/TabAwards.java b/LevelEdit/src/com/corsixth/leveledit/TabAwards.java index b42d03eae0..7b02dc7b29 100644 --- a/LevelEdit/src/com/corsixth/leveledit/TabAwards.java +++ b/LevelEdit/src/com/corsixth/leveledit/TabAwards.java @@ -24,14 +24,14 @@ this software and associated documentation files (the "Software"), to deal in import java.awt.event.FocusEvent; import java.awt.event.FocusListener; + import javax.swing.JLabel; -import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextField; -import net.miginfocom.swing.MigLayout; +public class TabAwards extends JScrollPane { -public class TabAwards { + private static final long serialVersionUID = -244055170654039024L; // variables static final int CANS_OF_COKE = 100; @@ -47,8 +47,7 @@ public class TabAwards { static int noDeathsBonus = NO_DEATHS_BONUS; // components - JPanel awards = new JPanel(new MigLayout("wrap 4")); - JScrollPane scrollPane = new JScrollPane(awards); + GridPanel awards = new GridPanel(4); static JLabel cansOfCokeLabel = new JLabel("Cans of coke:"); static JLabel cansOfCokeBonusLabel = new JLabel("Cans of coke bonus:"); @@ -68,9 +67,12 @@ public class TabAwards { Integer.toString(noDeathsBonus), 5); public TabAwards() { + // set scroll speed - scrollPane.getVerticalScrollBar().setUnitIncrement(20); - scrollPane.getHorizontalScrollBar().setUnitIncrement(20); + getVerticalScrollBar().setUnitIncrement(20); + getHorizontalScrollBar().setUnitIncrement(20); + + setViewportView(awards); // cans of coke awards.add(cansOfCokeLabel); diff --git a/LevelEdit/src/com/corsixth/leveledit/TabBar.java b/LevelEdit/src/com/corsixth/leveledit/TabBar.java index f816ac13ae..a6ac12ddd6 100644 --- a/LevelEdit/src/com/corsixth/leveledit/TabBar.java +++ b/LevelEdit/src/com/corsixth/leveledit/TabBar.java @@ -24,43 +24,36 @@ this software and associated documentation files (the "Software"), to deal in import javax.swing.JTabbedPane; -//creates JTabbedPane, Tabs +/** + * A JTabbedPane and all actual tabs + * @author Koanxd + * + */ public class TabBar extends JTabbedPane { // this is insignificant but apparently its needed because JFrame is // serializable - private static final long serialVersionUID = 1L; - - JTabbedPane tabs = new JTabbedPane(); + private static final long serialVersionUID = 3421838428038605079L; public TabBar() { - TabGeneral tabGeneral = new TabGeneral(); - tabs.addTab("General", tabGeneral.scrollPane); + addTab("General", new TabGeneral()); - TabDiseases tabDiseases = new TabDiseases(); - tabs.addTab("Diseases", tabDiseases.scrollPane); + addTab("Diseases", new TabDiseases()); - TabObjects tabObjects = new TabObjects(); - tabs.addTab("Objects", tabObjects.scrollPane); + addTab("Objects", new TabObjects()); - TabStaff tabStaff = new TabStaff(); - tabs.addTab("Staff", tabStaff.scrollPane); + addTab("Staff", new TabStaff()); - TabEmergencies tabEmergencies = new TabEmergencies(); - tabs.addTab("Emergencies", tabEmergencies.scrollPane); + addTab("Emergencies", new TabEmergencies()); - TabEarthquakes tabEarthquakes = new TabEarthquakes(); - tabs.addTab("Earthquakes", tabEarthquakes.scrollPane); + addTab("Earthquakes", new TabEarthquakes()); - TabPopulation tabPopulation = new TabPopulation(); - tabs.addTab("Population", tabPopulation.scrollPane); + addTab("Population", new TabPopulation()); - TabAwards tabAwards = new TabAwards(); - tabs.addTab("Awards", tabAwards.scrollPane); + addTab("Awards", new TabAwards()); - TabGoals tabGoals = new TabGoals(); - tabs.addTab("Goals", tabGoals.scrollPane); + addTab("Goals", new TabGoals()); } } diff --git a/LevelEdit/src/com/corsixth/leveledit/TabDiseases.java b/LevelEdit/src/com/corsixth/leveledit/TabDiseases.java index fd3c967f25..ea4ffa7059 100644 --- a/LevelEdit/src/com/corsixth/leveledit/TabDiseases.java +++ b/LevelEdit/src/com/corsixth/leveledit/TabDiseases.java @@ -38,9 +38,10 @@ this software and associated documentation files (the "Software"), to deal in import javax.swing.JScrollPane; import javax.swing.JTextField; -import net.miginfocom.swing.MigLayout; -public class TabDiseases { +public class TabDiseases extends JScrollPane { + + private static final long serialVersionUID = 3970826882625493102L; // variables static Disease[] arDiseases = new Disease[36]; // index 0,1 are never used. @@ -59,14 +60,14 @@ public class TabDiseases { static JTextField[] visualsAvailableTF = new JTextField[14]; static JTextField[] expertiseResearchTF = new JTextField[47]; // #expertise[] - JPanel diseases = new JPanel(new MigLayout("wrap 1")); - JScrollPane scrollPane = new JScrollPane(diseases); + GridPanel diseases = new GridPanel(1); JPanel topPanel = new JPanel(); - JPanel drug = new JPanel(new MigLayout("wrap 5", "[]15[]")); // Row gaps - JPanel psych = new JPanel(new MigLayout("wrap 4", "[]15[]")); // Row gaps - JPanel clinic = new JPanel(new MigLayout("wrap 4", "[]15[]")); // Row gaps - JPanel op = new JPanel(new MigLayout("wrap 4", "[]15[]")); // Row gaps + GridPanel drug = new GridPanel(5); + GridPanel psych = new GridPanel(4); + GridPanel clinic = new GridPanel(4); + GridPanel op = new GridPanel(4); + GridPanel selected = drug; // top panel ButtonGroup buttonGroup = new ButtonGroup(); @@ -81,28 +82,28 @@ public class TabDiseases { // column headings for each panel. // they are needed 4 times because they cannot be shared among panels - JLabel existsLabel1 = new JLabel("available"); - JLabel knownLabel1 = new JLabel("known"); - JLabel availableLabel1 = new JLabel("month"); - JLabel researchLabel = new JLabel("research"); + JLabel existsLabel1 = new JLabel("Available"); + JLabel knownLabel1 = new JLabel("Known"); + JLabel availableLabel1 = new JLabel("Month"); + JLabel researchLabel = new JLabel("Research"); static JCheckBox checkAllExistsCB1 = new JCheckBox(); static JCheckBox checkAllKnownCB1 = new JCheckBox(); - JLabel existsLabel2 = new JLabel("available"); - JLabel knownLabel2 = new JLabel("known"); - JLabel availableLabel2 = new JLabel("month"); + JLabel existsLabel2 = new JLabel("Available"); + JLabel knownLabel2 = new JLabel("Known"); + JLabel availableLabel2 = new JLabel("Month"); static JCheckBox checkAllExistsCB2 = new JCheckBox(); static JCheckBox checkAllKnownCB2 = new JCheckBox(); - JLabel existsLabel3 = new JLabel("available"); - JLabel knownLabel3 = new JLabel("known"); - JLabel availableLabel3 = new JLabel("month"); + JLabel existsLabel3 = new JLabel("Available"); + JLabel knownLabel3 = new JLabel("Known"); + JLabel availableLabel3 = new JLabel("Month"); static JCheckBox checkAllExistsCB3 = new JCheckBox(); static JCheckBox checkAllKnownCB3 = new JCheckBox(); - JLabel existsLabel4 = new JLabel("available"); - JLabel knownLabel4 = new JLabel("known"); - JLabel availableLabel4 = new JLabel("month"); + JLabel existsLabel4 = new JLabel("Available"); + JLabel knownLabel4 = new JLabel("Known"); + JLabel availableLabel4 = new JLabel("Month"); static JCheckBox checkAllExistsCB4 = new JCheckBox(); static JCheckBox checkAllKnownCB4 = new JCheckBox(); @@ -145,9 +146,12 @@ public class TabDiseases { JLabel unexpectedSwellingLabel = new JLabel("Unexpected Swelling"); public TabDiseases() { + // set scroll speed - scrollPane.getVerticalScrollBar().setUnitIncrement(20); - scrollPane.getHorizontalScrollBar().setUnitIncrement(20); + getVerticalScrollBar().setUnitIncrement(20); + getHorizontalScrollBar().setUnitIncrement(20); + + setViewportView(diseases); // initializing members of arrays, else they will be null. for (int i = 0; i < visualsCB.length; i++) @@ -168,50 +172,38 @@ public TabDiseases() { buttonGroup.add(opRB); buttonGroup.add(clinicRB); topPanel.add(drugRB); - drugRB.addActionListener(new ActionListener() { + drugRB.setActionCommand("drug"); + psychRB.setActionCommand("psych"); + opRB.setActionCommand("op"); + clinicRB.setActionCommand("clinic"); + ActionListener listener = new ActionListener() { public void actionPerformed(ActionEvent e) { - diseases.remove(psych); - diseases.remove(op); - diseases.remove(clinic); - diseases.add(drug); + GridPanel newSelection; + switch (e.getActionCommand()) { + case "op": newSelection = op; break; + case "clinic": newSelection = clinic; break; + case "psych": newSelection = psych; break; + default: newSelection = drug; + } + + diseases.swap(selected, newSelection); + selected = newSelection; diseases.updateUI(); } - }); + }; + drugRB.addActionListener(listener); topPanel.add(drugLabel); topPanel.add(psychRB); - psychRB.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - diseases.remove(drug); - diseases.remove(op); - diseases.remove(clinic); - diseases.add(psych); - diseases.updateUI(); - } - }); + psychRB.addActionListener(listener); topPanel.add(psychLabel); topPanel.add(opRB); - opRB.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - diseases.remove(psych); - diseases.remove(drug); - diseases.remove(clinic); - diseases.add(op); - diseases.updateUI(); - } - }); + opRB.addActionListener(listener); topPanel.add(opLabel); topPanel.add(clinicRB); - clinicRB.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - diseases.remove(psych); - diseases.remove(op); - diseases.remove(drug); - diseases.add(clinic); - diseases.updateUI(); - } - }); + clinicRB.addActionListener(listener); topPanel.add(clinicLabel); - drugRB.doClick(); + diseases.add(drug); + buttonGroup.setSelected(drugRB.getModel(), true); // create borders for 4 panels drug.setBorder(BorderFactory.createTitledBorder("Pharmacy")); @@ -220,7 +212,7 @@ public void actionPerformed(ActionEvent e) { clinic.setBorder(BorderFactory.createTitledBorder("Clinic")); // drug panel - drug.add(new JLabel("check all")); + drug.add(new JLabel("Check all")); drug.add(checkAllExistsCB1); checkAllExistsCB1.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { @@ -254,7 +246,7 @@ public void itemStateChanged(ItemEvent e) { } } }); - drug.add(checkAllKnownCB1, "wrap"); + drug.add(checkAllKnownCB1); checkAllKnownCB1.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { @@ -287,8 +279,8 @@ public void itemStateChanged(ItemEvent e) { } } }); - - drug.add(existsLabel1, "skip"); + drug.next(3); + drug.add(existsLabel1); existsLabel1 .setToolTipText("Whether the disease should appear at all in this level"); drug.add(knownLabel1); @@ -572,7 +564,8 @@ public void focusLost(FocusEvent e) { drug.add(uncommonColdLabel); drug.add(nonVisualsCB[0]); drug.add(knownCB[16]); - drug.add(expertiseResearchTF[16], "wrap"); + drug.add(expertiseResearchTF[16]); + drug.next(); uncommonColdLabel.setToolTipText("worth $300"); nonVisualsCB[0].addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { @@ -616,7 +609,8 @@ public void focusLost(FocusEvent e) { drug.add(brokenWindLabel); drug.add(nonVisualsCB[1]); drug.add(knownCB[17]); - drug.add(expertiseResearchTF[17], "wrap"); + drug.add(expertiseResearchTF[17]); + drug.next(); brokenWindLabel.setToolTipText("worth $1300"); nonVisualsCB[1].addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { @@ -660,7 +654,8 @@ public void focusLost(FocusEvent e) { drug.add(corrugatedAnklesLabel); drug.add(nonVisualsCB[8]); drug.add(knownCB[24]); - drug.add(expertiseResearchTF[24], "wrap"); + drug.add(expertiseResearchTF[24]); + drug.next(); corrugatedAnklesLabel.setToolTipText("worth $800"); nonVisualsCB[8].addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { @@ -704,7 +699,8 @@ public void focusLost(FocusEvent e) { drug.add(chronicNosehairLabel); drug.add(nonVisualsCB[9]); drug.add(knownCB[25]); - drug.add(expertiseResearchTF[25], "wrap"); + drug.add(expertiseResearchTF[25]); + drug.next(); chronicNosehairLabel.setToolTipText("worth $800"); nonVisualsCB[9].addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { @@ -748,7 +744,8 @@ public void focusLost(FocusEvent e) { drug.add(gastricEjectionsLabel); drug.add(nonVisualsCB[12]); drug.add(knownCB[28]); - drug.add(expertiseResearchTF[28], "wrap"); + drug.add(expertiseResearchTF[28]); + drug.next(); gastricEjectionsLabel.setToolTipText("worth $650"); nonVisualsCB[12].addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { @@ -792,7 +789,8 @@ public void focusLost(FocusEvent e) { drug.add(theSquitsLabel); drug.add(nonVisualsCB[13]); drug.add(knownCB[29]); - drug.add(expertiseResearchTF[29], "wrap"); + drug.add(expertiseResearchTF[29]); + drug.next(); theSquitsLabel.setToolTipText("worth $400"); nonVisualsCB[13].addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { @@ -836,7 +834,8 @@ public void focusLost(FocusEvent e) { drug.add(heapedPilesLabel); drug.add(nonVisualsCB[16]); drug.add(knownCB[32]); - drug.add(expertiseResearchTF[32], "wrap"); + drug.add(expertiseResearchTF[32]); + drug.next(); heapedPilesLabel.setToolTipText("worth $400"); nonVisualsCB[16].addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { @@ -880,7 +879,8 @@ public void focusLost(FocusEvent e) { drug.add(gutRotLabel); drug.add(nonVisualsCB[17]); drug.add(knownCB[33]); - drug.add(expertiseResearchTF[33], "wrap"); + drug.add(expertiseResearchTF[33]); + drug.next(); gutRotLabel.setToolTipText("worth $350"); nonVisualsCB[17].addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { @@ -922,7 +922,7 @@ public void focusLost(FocusEvent e) { }); // psych panel - psych.add(new JLabel("check all")); + psych.add(new JLabel("Check all")); psych.add(checkAllExistsCB2); checkAllExistsCB2.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { @@ -943,7 +943,7 @@ public void itemStateChanged(ItemEvent e) { } } }); - psych.add(checkAllKnownCB2, "wrap"); + psych.add(checkAllKnownCB2); checkAllKnownCB2.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { @@ -963,8 +963,8 @@ public void itemStateChanged(ItemEvent e) { } } }); - - psych.add(existsLabel2, "skip"); + psych.next(2); + psych.add(existsLabel2); existsLabel2 .setToolTipText("Whether the disease should appear at all in this level"); @@ -1022,7 +1022,8 @@ public void focusLost(FocusEvent e) { psych.add(multipleTvPersonalitiesLabel); psych.add(nonVisualsCB[6]); - psych.add(knownCB[22], "wrap"); + psych.add(knownCB[22]); + psych.next(); multipleTvPersonalitiesLabel.setToolTipText("worth $800"); nonVisualsCB[6].addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { @@ -1043,7 +1044,8 @@ public void itemStateChanged(ItemEvent e) { psych.add(infectiousLaughterLabel); psych.add(nonVisualsCB[7]); - psych.add(knownCB[23], "wrap"); + psych.add(knownCB[23]); + psych.next(); infectiousLaughterLabel.setToolTipText("worth $1500"); nonVisualsCB[7].addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { @@ -1064,7 +1066,8 @@ public void itemStateChanged(ItemEvent e) { psych.add(thirdDegreeSideburnsLabel); psych.add(nonVisualsCB[10]); - psych.add(knownCB[26], "wrap"); + psych.add(knownCB[26]); + psych.next(); thirdDegreeSideburnsLabel.setToolTipText("worth $550"); nonVisualsCB[10].addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { @@ -1085,7 +1088,8 @@ public void itemStateChanged(ItemEvent e) { psych.add(fakeBloodLabel); psych.add(nonVisualsCB[11]); - psych.add(knownCB[27], "wrap"); + psych.add(knownCB[27]); + psych.next(); fakeBloodLabel.setToolTipText("worth $800"); nonVisualsCB[11].addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { @@ -1106,7 +1110,8 @@ public void itemStateChanged(ItemEvent e) { psych.add(sweatyPalmsLabel); psych.add(nonVisualsCB[15]); - psych.add(knownCB[31], "wrap"); + psych.add(knownCB[31]); + psych.next(); sweatyPalmsLabel.setToolTipText("worth $600"); nonVisualsCB[15].addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { @@ -1126,7 +1131,7 @@ public void itemStateChanged(ItemEvent e) { }); // op panel - op.add(new JLabel("check all")); + op.add(new JLabel("Check all")); op.add(checkAllExistsCB3); checkAllExistsCB3.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { @@ -1151,7 +1156,7 @@ public void itemStateChanged(ItemEvent e) { } } }); - op.add(checkAllKnownCB3, "wrap"); + op.add(checkAllKnownCB3); checkAllKnownCB3.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { @@ -1175,8 +1180,9 @@ public void itemStateChanged(ItemEvent e) { } } }); + op.next(2); - op.add(existsLabel3, "skip"); + op.add(existsLabel3); existsLabel3 .setToolTipText("Whether the disease should appear at all in this level"); @@ -1234,7 +1240,8 @@ public void focusLost(FocusEvent e) { op.add(spareRibsLabel); op.add(nonVisualsCB[2]); - op.add(knownCB[18], "wrap"); + op.add(knownCB[18]); + op.next(); spareRibsLabel.setToolTipText("worth $1100"); nonVisualsCB[2].addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { @@ -1255,7 +1262,8 @@ public void itemStateChanged(ItemEvent e) { op.add(kidneyBeansLabel); op.add(nonVisualsCB[3]); - op.add(knownCB[19], "wrap"); + op.add(knownCB[19]); + op.next(); kidneyBeansLabel.setToolTipText("worth $1050"); nonVisualsCB[3].addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { @@ -1276,7 +1284,8 @@ public void itemStateChanged(ItemEvent e) { op.add(brokenHeartLabel); op.add(nonVisualsCB[4]); - op.add(knownCB[20], "wrap"); + op.add(knownCB[20]); + op.next(); brokenHeartLabel.setToolTipText("worth $1950"); nonVisualsCB[4].addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { @@ -1297,7 +1306,8 @@ public void itemStateChanged(ItemEvent e) { op.add(rupturedNodulesLabel); op.add(nonVisualsCB[5]); - op.add(knownCB[21], "wrap"); + op.add(knownCB[21]); + op.next(); rupturedNodulesLabel.setToolTipText("worth $1600"); nonVisualsCB[5].addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { @@ -1318,7 +1328,8 @@ public void itemStateChanged(ItemEvent e) { op.add(ironLungsLabel); op.add(nonVisualsCB[14]); - op.add(knownCB[30], "wrap"); + op.add(knownCB[30]); + op.next(); ironLungsLabel.setToolTipText("worth $1700"); nonVisualsCB[14].addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { @@ -1339,7 +1350,8 @@ public void itemStateChanged(ItemEvent e) { op.add(golfStonesLabel); op.add(nonVisualsCB[18]); - op.add(knownCB[34], "wrap"); + op.add(knownCB[34]); + op.next(); golfStonesLabel.setToolTipText("worth $1600"); nonVisualsCB[18].addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { @@ -1360,7 +1372,7 @@ public void itemStateChanged(ItemEvent e) { op.add(unexpectedSwellingLabel); op.add(nonVisualsCB[19]); - op.add(knownCB[35], "wrap"); + op.add(knownCB[35]); unexpectedSwellingLabel.setToolTipText("worth $500"); nonVisualsCB[19].addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { @@ -1380,7 +1392,7 @@ public void itemStateChanged(ItemEvent e) { }); // clinic panel - clinic.add(new JLabel("check all")); + clinic.add(new JLabel("Check all")); clinic.add(checkAllExistsCB4); checkAllExistsCB4.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { @@ -1405,7 +1417,7 @@ public void itemStateChanged(ItemEvent e) { } } }); - clinic.add(checkAllKnownCB4, "wrap"); + clinic.add(checkAllKnownCB4); checkAllKnownCB4.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { @@ -1429,8 +1441,8 @@ public void itemStateChanged(ItemEvent e) { } } }); - - clinic.add(existsLabel4, "skip"); + clinic.next(2); + clinic.add(existsLabel4); existsLabel4 .setToolTipText("Whether the disease should appear at all in this level"); diff --git a/LevelEdit/src/com/corsixth/leveledit/TabEarthquakes.java b/LevelEdit/src/com/corsixth/leveledit/TabEarthquakes.java index da17620117..0978495d4c 100644 --- a/LevelEdit/src/com/corsixth/leveledit/TabEarthquakes.java +++ b/LevelEdit/src/com/corsixth/leveledit/TabEarthquakes.java @@ -34,16 +34,15 @@ this software and associated documentation files (the "Software"), to deal in import javax.swing.JScrollPane; import javax.swing.JTextField; -import net.miginfocom.swing.MigLayout; +public class TabEarthquakes extends JScrollPane { -public class TabEarthquakes { + private static final long serialVersionUID = -5841183676154086892L; // variables static ArrayList quakeList = new ArrayList(); // components - static JPanel earthquakes = new JPanel(new MigLayout()); - JScrollPane scrollPane = new JScrollPane(earthquakes); + static GridPanel earthquakes = new GridPanel(1); JPanel buttonsPanel = new JPanel(); JButton addButt = new JButton("Add"); @@ -54,11 +53,13 @@ public class TabEarthquakes { public TabEarthquakes() { // set scroll speed - scrollPane.getVerticalScrollBar().setUnitIncrement(20); - scrollPane.getHorizontalScrollBar().setUnitIncrement(20); - + getVerticalScrollBar().setUnitIncrement(20); + getHorizontalScrollBar().setUnitIncrement(20); + + setViewportView(earthquakes); + earthquakes.setInsets(0); // earthquakes panel - earthquakes.add(buttonsPanel, "span"); + earthquakes.add(buttonsPanel); earthquakes.add(randomQuakesLabel); buttonsPanel.add(addButt); addButt.addActionListener(new ActionListener() { @@ -180,7 +181,7 @@ public void focusLost(FocusEvent e) { } }); - earthquakes.add(quakeList.get(index).quakePanel, "span"); + earthquakes.add(quakeList.get(index).quakePanel); earthquakes.updateUI(); // increment startMonth, endMonth with each add diff --git a/LevelEdit/src/com/corsixth/leveledit/TabEmergencies.java b/LevelEdit/src/com/corsixth/leveledit/TabEmergencies.java index b1dbb34a7a..507f8ad51a 100644 --- a/LevelEdit/src/com/corsixth/leveledit/TabEmergencies.java +++ b/LevelEdit/src/com/corsixth/leveledit/TabEmergencies.java @@ -39,20 +39,20 @@ this software and associated documentation files (the "Software"), to deal in import javax.swing.JScrollPane; import javax.swing.JTextField; -import net.miginfocom.swing.MigLayout; - -public class TabEmergencies { +public class TabEmergencies extends JScrollPane { + private static final long serialVersionUID = 415938853978498463L; // variables static ArrayList emergencyList = new ArrayList(); static int emergencyInterval = 120; static int emergencyIntervalVariance = 30; // components - static JPanel emergencies = new JPanel(new MigLayout()); + static GridPanel emergencies = new GridPanel(1); JScrollPane scrollPane = new JScrollPane(emergencies); - JPanel emergencyMode = new JPanel(new MigLayout()); - JPanel emergencyButtons = new JPanel(new MigLayout()); + JPanel emergencyMode = new JPanel(); + JPanel semirandom = new JPanel(); + JPanel emergencyButtons = new JPanel(); JButton addEmergencyButt = new JButton("Add"); JButton removeEmergencyButt = new JButton("Remove"); ButtonGroup buttonGroup = new ButtonGroup(); @@ -73,15 +73,17 @@ public class TabEmergencies { public TabEmergencies() { // set scroll speed - scrollPane.getVerticalScrollBar().setUnitIncrement(20); - scrollPane.getHorizontalScrollBar().setUnitIncrement(20); + getVerticalScrollBar().setUnitIncrement(20); + getHorizontalScrollBar().setUnitIncrement(20); + emergencies.setInsets(0); + setViewportView(emergencies); // mode set buttonGroup.add(randomEmergenciesRB); buttonGroup.add(semiRandomEmergenciesRB); buttonGroup.add(controlledEmergenciesRB); - emergencies.add(emergencyMode, "span"); + emergencies.add(emergencyMode); emergencyMode.setBorder(BorderFactory.createTitledBorder("Mode")); emergencyMode.add(randomEmergenciesRB); randomEmergenciesRB.addActionListener(new ActionListener() { @@ -128,6 +130,79 @@ public void actionPerformed(ActionEvent e) { } }); + semirandom.add(emergencyIntervalLabel); + emergencyIntervalLabel + .setToolTipText("Days between emergencies = interval +- variance"); + semirandom.add(emergencyIntervalTF); + emergencyIntervalTF.addFocusListener(new FocusListener() { + public void focusGained(FocusEvent e) { + JTextField tf = (JTextField) e.getComponent(); + tf.selectAll(); + Gui.tempValue = tf.getText(); + } + + public void focusLost(FocusEvent e) { + JTextField tf = (JTextField) e.getComponent(); + try { + int input = Integer.parseInt(tf.getText()); + if (input <= 0) { + tf.setText(Gui.tempValue); + emergencyInterval = Integer.parseInt(Gui.tempValue); + } else + emergencyInterval = input; + } catch (NumberFormatException nfe) { + tf.setText(Gui.tempValue); + emergencyInterval = Integer.parseInt(Gui.tempValue); + } + // if variance is equal or bigger than interval, make variance + // equal to interval -1 + if (emergencyIntervalVariance >= emergencyInterval) { + emergencyIntervalVariance = emergencyInterval - 1; + int intervalMinusOne = Integer.parseInt(emergencyIntervalTF + .getText()) - 1; + emergencyIntervalVarianceTF.setText(Integer + .toString(intervalMinusOne)); + } + + } + }); + semirandom.add(emergencyIntervalVarianceLabel); + emergencyIntervalVarianceLabel + .setToolTipText("Days between emergencies = interval +- variance"); + semirandom.add(emergencyIntervalVarianceTF); + emergencyIntervalVarianceTF.addFocusListener(new FocusListener() { + public void focusGained(FocusEvent e) { + JTextField tf = (JTextField) e.getComponent(); + tf.selectAll(); + Gui.tempValue = tf.getText(); + } + + public void focusLost(FocusEvent e) { + JTextField tf = (JTextField) e.getComponent(); + try { + int input = Integer.parseInt(tf.getText()); + if (input < 0) { + tf.setText(Gui.tempValue); + emergencyIntervalVariance = Integer + .parseInt(Gui.tempValue); + } else + emergencyIntervalVariance = input; + } catch (NumberFormatException nfe) { + tf.setText(Gui.tempValue); + emergencyIntervalVariance = Integer.parseInt(Gui.tempValue); + } + // if variance is equal or bigger than interval, make variance + // equal to interval -1 + if (emergencyIntervalVariance >= emergencyInterval) { + emergencyIntervalVariance = emergencyInterval - 1; + int intervalMinusOne = Integer.parseInt(emergencyIntervalTF + .getText()) - 1; + emergencyIntervalVarianceTF.setText(Integer + .toString(intervalMinusOne)); + } + + } + }); } public static void addEmergency() { @@ -504,7 +579,7 @@ public void focusLost(FocusEvent e) { } }); - emergencies.add(emergencyList.get(index).emergencyPanel, "span"); + emergencies.add(emergencyList.get(index).emergencyPanel); emergencies.updateUI(); // increase month with each add @@ -563,89 +638,15 @@ protected void showSemiRandomEmergencies() { emergencies.remove(randomDescription); emergencies.remove(noEmergenciesDescription); hideControlledEmergencies(); - emergencies.add(emergencyIntervalLabel); - emergencyIntervalLabel - .setToolTipText("Days between emergencies = interval +- variance"); - emergencies.add(emergencyIntervalTF); - emergencyIntervalTF.addFocusListener(new FocusListener() { - public void focusGained(FocusEvent e) { - JTextField tf = (JTextField) e.getComponent(); - tf.selectAll(); - Gui.tempValue = tf.getText(); - } - public void focusLost(FocusEvent e) { - JTextField tf = (JTextField) e.getComponent(); - try { - int input = Integer.parseInt(tf.getText()); - if (input <= 0) { - tf.setText(Gui.tempValue); - emergencyInterval = Integer.parseInt(Gui.tempValue); - } else - emergencyInterval = input; - } catch (NumberFormatException nfe) { - tf.setText(Gui.tempValue); - emergencyInterval = Integer.parseInt(Gui.tempValue); - } - // if variance is equal or bigger than interval, make variance - // equal to interval -1 - if (emergencyIntervalVariance >= emergencyInterval) { - emergencyIntervalVariance = emergencyInterval - 1; - int intervalMinusOne = Integer.parseInt(emergencyIntervalTF - .getText()) - 1; - emergencyIntervalVarianceTF.setText(Integer - .toString(intervalMinusOne)); - } - - } - }); - emergencies.add(emergencyIntervalVarianceLabel); - emergencyIntervalVarianceLabel - .setToolTipText("Days between emergencies = interval +- variance"); - emergencies.add(emergencyIntervalVarianceTF); - emergencyIntervalVarianceTF.addFocusListener(new FocusListener() { - public void focusGained(FocusEvent e) { - JTextField tf = (JTextField) e.getComponent(); - tf.selectAll(); - Gui.tempValue = tf.getText(); - } - - public void focusLost(FocusEvent e) { - JTextField tf = (JTextField) e.getComponent(); - try { - int input = Integer.parseInt(tf.getText()); - if (input < 0) { - tf.setText(Gui.tempValue); - emergencyIntervalVariance = Integer - .parseInt(Gui.tempValue); - } else - emergencyIntervalVariance = input; - } catch (NumberFormatException nfe) { - tf.setText(Gui.tempValue); - emergencyIntervalVariance = Integer.parseInt(Gui.tempValue); - } - // if variance is equal or bigger than interval, make variance - // equal to interval -1 - if (emergencyIntervalVariance >= emergencyInterval) { - emergencyIntervalVariance = emergencyInterval - 1; - int intervalMinusOne = Integer.parseInt(emergencyIntervalTF - .getText()) - 1; - emergencyIntervalVarianceTF.setText(Integer - .toString(intervalMinusOne)); - } - - } - }); + emergencies.add(semirandom); emergencies.updateUI(); } // semi-random protected void hideSemiRandomEmergencies() { - emergencies.remove(emergencyIntervalLabel); - emergencies.remove(emergencyIntervalTF); - emergencies.remove(emergencyIntervalVarianceLabel); - emergencies.remove(emergencyIntervalVarianceTF); + emergencies.remove(semirandom); emergencies.updateUI(); } @@ -654,9 +655,9 @@ protected void showControlledEmergencies() { emergencies.remove(randomDescription); emergencies.remove(noEmergenciesDescription); hideSemiRandomEmergencies(); - emergencies.add(emergencyButtons, "span"); + emergencies.add(emergencyButtons); for (int i = 0; i < emergencyList.size(); i++) - emergencies.add(emergencyList.get(i).emergencyPanel, "span"); + emergencies.add(emergencyList.get(i).emergencyPanel); if (emergencyList.size() <= 0) emergencies.add(noEmergenciesDescription); emergencies.updateUI(); diff --git a/LevelEdit/src/com/corsixth/leveledit/TabGeneral.java b/LevelEdit/src/com/corsixth/leveledit/TabGeneral.java index fe4b6e57d6..aaaaeb0b4a 100644 --- a/LevelEdit/src/com/corsixth/leveledit/TabGeneral.java +++ b/LevelEdit/src/com/corsixth/leveledit/TabGeneral.java @@ -25,7 +25,6 @@ this software and associated documentation files (the "Software"), to deal in import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import javax.swing.JLabel; -import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; @@ -34,10 +33,10 @@ this software and associated documentation files (the "Software"), to deal in import javax.swing.text.BadLocationException; import javax.swing.text.DocumentFilter; -import net.miginfocom.swing.MigLayout; - //creates the general panel -public class TabGeneral { +public class TabGeneral extends JScrollPane { + + private static final long serialVersionUID = -1025120107673788464L; // variables static final String NAME = "Example Town"; @@ -75,8 +74,8 @@ public class TabGeneral { static int maxStrength = MAX_STRENGTH; // components - JPanel general = new JPanel(new MigLayout("wrap 2")); - JScrollPane scrollPane = new JScrollPane(general); + GridPanel general = new GridPanel(2); + // JScrollPane scrollPane = new JScrollPane(general); JLabel nameLabel = new JLabel("Name:"); JLabel mapFileLabel = new JLabel("Map file:"); @@ -114,10 +113,12 @@ public class TabGeneral { static JTextField maxStrengthTF = new JTextField(10); public TabGeneral() { + // set scroll speed - scrollPane.getVerticalScrollBar().setUnitIncrement(20); - scrollPane.getHorizontalScrollBar().setUnitIncrement(20); + getVerticalScrollBar().setUnitIncrement(20); + getHorizontalScrollBar().setUnitIncrement(20); + setViewportView(general); general.add(nameLabel); general.add(nameTF); nameLabel diff --git a/LevelEdit/src/com/corsixth/leveledit/TabGoals.java b/LevelEdit/src/com/corsixth/leveledit/TabGoals.java index 88a0157856..01a9d60b48 100644 --- a/LevelEdit/src/com/corsixth/leveledit/TabGoals.java +++ b/LevelEdit/src/com/corsixth/leveledit/TabGoals.java @@ -22,6 +22,7 @@ this software and associated documentation files (the "Software"), to deal in package com.corsixth.leveledit; +import java.awt.FlowLayout; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.event.ItemEvent; @@ -34,10 +35,9 @@ this software and associated documentation files (the "Software"), to deal in import javax.swing.JScrollPane; import javax.swing.JTextField; -import net.miginfocom.swing.MigLayout; - -public class TabGoals { +public class TabGoals extends JScrollPane { + private static final long serialVersionUID = 1413048579654855631L; // variables static boolean winReputation = false; static boolean winBalance = false; @@ -72,8 +72,8 @@ public class TabGoals { static int warnPercentageKilled; // components - static JPanel winCriteria = new JPanel(new MigLayout("wrap 3")); - static JPanel loseCriteria = new JPanel(new MigLayout("wrap 5")); + static GridPanel winCriteria = new GridPanel(3); + static GridPanel loseCriteria = new GridPanel(5); static JLabel minReputationLabel = new JLabel("Reputation:"); static JLabel minBalanceLabel = new JLabel("Bank balance:"); @@ -118,14 +118,17 @@ public class TabGoals { static JCheckBox loseBalanceCB = new JCheckBox(); static JCheckBox losePercentageKilledCB = new JCheckBox(); - JPanel goals = new JPanel(new MigLayout()); - JScrollPane scrollPane = new JScrollPane(goals); + JPanel goals = new JPanel(); public TabGoals() { // set scroll speed - scrollPane.getVerticalScrollBar().setUnitIncrement(20); - scrollPane.getHorizontalScrollBar().setUnitIncrement(20); + getVerticalScrollBar().setUnitIncrement(20); + getHorizontalScrollBar().setUnitIncrement(20); + FlowLayout layout = new FlowLayout(FlowLayout.LEADING); + layout.setAlignOnBaseline(true); + goals.setLayout(layout); + setViewportView(goals); // win criteria goals.add(winCriteria); winCriteria.setBorder(BorderFactory.createTitledBorder("Win Criteria")); diff --git a/LevelEdit/src/com/corsixth/leveledit/TabObjects.java b/LevelEdit/src/com/corsixth/leveledit/TabObjects.java index 77c9238176..04eac4b5ec 100644 --- a/LevelEdit/src/com/corsixth/leveledit/TabObjects.java +++ b/LevelEdit/src/com/corsixth/leveledit/TabObjects.java @@ -29,14 +29,12 @@ this software and associated documentation files (the "Software"), to deal in import javax.swing.JCheckBox; import javax.swing.JLabel; -import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextField; -import net.miginfocom.swing.MigLayout; - -public class TabObjects { +public class TabObjects extends JScrollPane { + private static final long serialVersionUID = 1176963244482675840L; // variables static int[] objectsAvail = new int[62]; // index [0] is never used. static int[] objectsStartAvail = new int[62]; @@ -44,13 +42,13 @@ public class TabObjects { static int[] objectsResearch = new int[62]; // components - JPanel objects = new JPanel(new MigLayout("wrap 5", "[]15[]")); // Row gaps + GridPanel objects = new GridPanel(5); // Row gaps JScrollPane scrollPane = new JScrollPane(objects); - JLabel availableLabel = new JLabel("available"); - JLabel startLabel = new JLabel("from start"); - JLabel strengthLabel = new JLabel("strength"); - JLabel researchLabel = new JLabel("research"); + JLabel availableLabel = new JLabel("Available"); + JLabel startLabel = new JLabel("From start"); + JLabel strengthLabel = new JLabel("Strength"); + JLabel researchLabel = new JLabel("Research"); JCheckBox checkAllAvailableCB = new JCheckBox(); JCheckBox checkAllStartCB = new JCheckBox(); static JCheckBox[] objectsAvailCB = new JCheckBox[62]; @@ -63,9 +61,11 @@ public class TabObjects { public TabObjects() { // set scroll speed - scrollPane.getVerticalScrollBar().setUnitIncrement(20); - scrollPane.getHorizontalScrollBar().setUnitIncrement(20); + getVerticalScrollBar().setUnitIncrement(20); + getHorizontalScrollBar().setUnitIncrement(20); + setViewportView(objects); + objects.setInsets(2, 7, 2, 7); // initializing members of checkbox and textfield arrays, else they will // be null. for (int i = 0; i < objectsAvailCB.length; i++) @@ -80,7 +80,7 @@ public TabObjects() { // objectsCostTF[i] = new JTextField(5); // column headings - objects.add(new JLabel("check all")); + objects.add(new JLabel("Check all")); objects.add(checkAllAvailableCB); checkAllAvailableCB.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { @@ -133,7 +133,7 @@ public void itemStateChanged(ItemEvent e) { } } }); - objects.add(checkAllStartCB, "wrap"); + objects.add(checkAllStartCB); checkAllStartCB.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { @@ -181,7 +181,8 @@ public void itemStateChanged(ItemEvent e) { } } }); - objects.add(availableLabel, "skip"); + objects.next(3); + objects.add(availableLabel); availableLabel .setToolTipText("Whether the object should appear at all in this level"); @@ -205,7 +206,8 @@ public void itemStateChanged(ItemEvent e) { objects.add(new JLabel("Ward")); objects.add(objectsAvailCB[8]); objects.add(objectsStartAvailCB[8]); - objects.add(objectsResearchTF[8], "wrap"); + objects.add(objectsResearchTF[8]); + objects.next(); objectsAvailCB[8].addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) @@ -248,7 +250,8 @@ public void focusLost(FocusEvent e) { objects.add(new JLabel("Standard Diagnosis")); objects.add(objectsAvailCB[20]); objects.add(objectsStartAvailCB[20]); - objects.add(objectsResearchTF[20], "wrap"); + objects.add(objectsResearchTF[20]); + objects.next(); objectsAvailCB[20].addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) @@ -292,7 +295,8 @@ public void focusLost(FocusEvent e) { objects.add(new JLabel("Psychiatry")); objects.add(objectsAvailCB[18]); objects.add(objectsStartAvailCB[18]); - objects.add(objectsResearchTF[18], "wrap"); + objects.add(objectsResearchTF[18]); + objects.next(); objectsAvailCB[18].addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) @@ -336,7 +340,8 @@ public void focusLost(FocusEvent e) { objects.add(new JLabel("Pharmacy")); objects.add(objectsAvailCB[39]); objects.add(objectsStartAvailCB[39]); - objects.add(objectsResearchTF[39], "wrap"); + objects.add(objectsResearchTF[39]); + objects.next(); objectsAvailCB[39].addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) @@ -1388,7 +1393,8 @@ public void focusLost(FocusEvent e) { objects.add(new JLabel("Research Computer")); objects.add(objectsAvailCB[40]); objects.add(objectsStartAvailCB[40]); - objects.add(objectsResearchTF[40], "wrap"); + objects.add(objectsResearchTF[40]); + objects.next(); objectsAvailCB[40].addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) @@ -1432,7 +1438,8 @@ public void focusLost(FocusEvent e) { objects.add(new JLabel("Atom Analyser")); objects.add(objectsAvailCB[41]); objects.add(objectsStartAvailCB[41]); - objects.add(objectsResearchTF[41], "wrap"); + objects.add(objectsResearchTF[41]); + objects.next(); objectsAvailCB[41].addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) @@ -1474,7 +1481,8 @@ public void focusLost(FocusEvent e) { }); objects.add(new JLabel("Training")); - objects.add(objectsAvailCB[37], "wrap"); + objects.add(objectsAvailCB[37]); + objects.next(3); objectsAvailCB[37].addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) @@ -1485,7 +1493,7 @@ public void itemStateChanged(ItemEvent e) { }); objects.add(new JLabel("Video Game")); - objects.add(objectsAvailCB[57], "wrap"); + objects.add(objectsAvailCB[57]); objectsAvailCB[57].addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) diff --git a/LevelEdit/src/com/corsixth/leveledit/TabPopulation.java b/LevelEdit/src/com/corsixth/leveledit/TabPopulation.java index adbbe2d6bb..a1b930eb0b 100644 --- a/LevelEdit/src/com/corsixth/leveledit/TabPopulation.java +++ b/LevelEdit/src/com/corsixth/leveledit/TabPopulation.java @@ -34,16 +34,15 @@ this software and associated documentation files (the "Software"), to deal in import javax.swing.JScrollPane; import javax.swing.JTextField; -import net.miginfocom.swing.MigLayout; +public class TabPopulation extends JScrollPane { -public class TabPopulation { + private static final long serialVersionUID = -7707325095353711104L; // variables static ArrayList populationList = new ArrayList(); // components - static JPanel populations = new JPanel(new MigLayout()); - JScrollPane scrollPane = new JScrollPane(populations); + static GridPanel populations = new GridPanel(1); JPanel buttonsPanel = new JPanel(); JButton addButt = new JButton("Add"); @@ -52,11 +51,13 @@ public class TabPopulation { public TabPopulation() { // set scroll speed - scrollPane.getVerticalScrollBar().setUnitIncrement(20); - scrollPane.getHorizontalScrollBar().setUnitIncrement(20); + getVerticalScrollBar().setUnitIncrement(20); + getHorizontalScrollBar().setUnitIncrement(20); + populations.setInsets(0); + setViewportView(populations); // population panel - populations.add(buttonsPanel, "span"); + populations.add(buttonsPanel); buttonsPanel.add(addButt); addButt.addActionListener(new ActionListener() { @@ -75,7 +76,7 @@ public void actionPerformed(ActionEvent e) { } public static void addPopulation() { - + populations.remove(overflowWarning); final Population population = new Population(); populationList.add(population); @@ -177,7 +178,7 @@ public void focusLost(FocusEvent e) { .setToolTipText("Number of patients that will arrive in this month. This number is then divided among competing hospitals"); } - populations.add(populationList.get(index).populationPanel, "span"); + populations.add(populationList.get(index).populationPanel); populations.updateUI(); // set default for the first population @@ -200,6 +201,7 @@ public void focusLost(FocusEvent e) { } public static void removePopulation() { + populations.remove(overflowWarning); int lastIndex = populationList.size() - 1; if (lastIndex >= 0) { // remove panel @@ -208,6 +210,7 @@ public static void removePopulation() { // remove object from the arraylist populationList.remove(lastIndex); } + calculateNumberOfPatients(); } public static void calculateNumberOfPatients() { @@ -221,23 +224,26 @@ public static void calculateNumberOfPatients() { populationList.get(i).spawn = spawn; populationList.get(i).spawnLabel.setText("Number of patients: " + Integer.toString(spawn)); - - // give a warning if the last change is not 0. + } + // give a warning if the last change is not 0. + int size = populationList.size(); + if (size > 0) { if (populationList.get(populationList.size() - 1).change > 0) { - populations.add(overflowWarning, "span"); + populations.add(overflowWarning); overflowWarning .setText("Warning: patient count will increase infinitely after month " - + populationList.get(i).month + "!"); + + populationList.get(size - 1).month + "!"); } else if (populationList.get(populationList.size() - 1).change < 0) { - populations.add(overflowWarning, "span"); + populations.add(overflowWarning); overflowWarning .setText("Warning: patient count will decrease infinitely after month " - + populationList.get(i).month + "!"); - } else { - populations.remove(overflowWarning); - populations.updateUI(); + + populationList.get(size - 1).month + "!"); } - + } else { + populations.add(overflowWarning); + overflowWarning + .setText("Warning: You need to define at least one month to get any patients!"); } + populations.updateUI(); } } diff --git a/LevelEdit/src/com/corsixth/leveledit/TabStaff.java b/LevelEdit/src/com/corsixth/leveledit/TabStaff.java index 797232c1df..d5c54cc091 100644 --- a/LevelEdit/src/com/corsixth/leveledit/TabStaff.java +++ b/LevelEdit/src/com/corsixth/leveledit/TabStaff.java @@ -39,9 +39,10 @@ this software and associated documentation files (the "Software"), to deal in import javax.swing.JScrollPane; import javax.swing.JTextField; -import net.miginfocom.swing.MigLayout; +public class TabStaff extends JScrollPane { + + private static final long serialVersionUID = -6211357935747302151L; -public class TabStaff { VarManipulator variableManipulator = new VarManipulator(); // variables @@ -51,31 +52,34 @@ public class TabStaff { static int[] salaryAdd = new int[9]; // index 0,1,2 are not used. // components - JPanel staff = new JPanel(new MigLayout("wrap 1")); + GridPanel staff = new GridPanel(1); JScrollPane scrollPane = new JScrollPane(staff); - JPanel salary = new JPanel(new MigLayout()); + GridPanel salary = new GridPanel(1); JLabel salaryLabel = new JLabel(" Minimum salary"); JLabel salaryAddLabel = new JLabel(" Added salary"); static JTextField[] staffSalaryTF = new JTextField[4]; static JTextField[] salaryAddTF = new JTextField[9];// index 0,1,2 are not // used. - static JPanel levels = new JPanel(new MigLayout()); + static JPanel levels = new GridPanel(1); JPanel levelsButtons = new JPanel(); JButton addLevelsButt = new JButton("Add"); JButton removeLevelsButt = new JButton("Remove"); - static JPanel start = new JPanel(new MigLayout()); + static GridPanel start = new GridPanel(1); JPanel startButtons = new JPanel(); JButton addStartButt = new JButton("Add"); JButton removeStartButt = new JButton("Remove"); public TabStaff() { // set scroll speed - scrollPane.getVerticalScrollBar().setUnitIncrement(20); - scrollPane.getHorizontalScrollBar().setUnitIncrement(20); + getVerticalScrollBar().setUnitIncrement(20); + getHorizontalScrollBar().setUnitIncrement(20); + salary.setInsets(0); + start.setInsets(0); + setViewportView(staff); // initializing members of checkbox and textfield arrays, else they will // be null. for (int i = 0; i < staffSalaryTF.length; i++) @@ -84,13 +88,14 @@ public TabStaff() { salaryAddTF[i] = new JTextField(3); // salary panel - staff.add(salary, "span"); + staff.add(salary); salary.setBorder(BorderFactory.createTitledBorder("Salary")); - salary.add(salaryLabel, "span"); + salary.add(salaryLabel); salaryLabel.setToolTipText("Minimum salary for each staff type"); - salary.add(new JLabel("Nurse:")); - salary.add(staffSalaryTF[0]); + JPanel minSalary = new JPanel(); + minSalary.add(new JLabel("Nurse:")); + minSalary.add(staffSalaryTF[0]); staffSalaryTF[0].addFocusListener(new FocusListener() { public void focusGained(FocusEvent e) { JTextField tf = (JTextField) e.getComponent(); @@ -114,8 +119,8 @@ public void focusLost(FocusEvent e) { } }); - salary.add(new JLabel("Doctor:")); - salary.add(staffSalaryTF[1]); + minSalary.add(new JLabel("Doctor:")); + minSalary.add(staffSalaryTF[1]); staffSalaryTF[1].addFocusListener(new FocusListener() { public void focusGained(FocusEvent e) { JTextField tf = (JTextField) e.getComponent(); @@ -139,8 +144,8 @@ public void focusLost(FocusEvent e) { } }); - salary.add(new JLabel("Handyman:")); - salary.add(staffSalaryTF[2]); + minSalary.add(new JLabel("Handyman:")); + minSalary.add(staffSalaryTF[2]); staffSalaryTF[2].addFocusListener(new FocusListener() { public void focusGained(FocusEvent e) { JTextField tf = (JTextField) e.getComponent(); @@ -164,8 +169,9 @@ public void focusLost(FocusEvent e) { } }); - salary.add(new JLabel("Receptionist:")); - salary.add(staffSalaryTF[3], "wrap"); + minSalary.add(new JLabel("Receptionist:")); + minSalary.add(staffSalaryTF[3]); + salary.add(minSalary); staffSalaryTF[3].addFocusListener(new FocusListener() { public void focusGained(FocusEvent e) { JTextField tf = (JTextField) e.getComponent(); @@ -189,12 +195,13 @@ public void focusLost(FocusEvent e) { } }); - salary.add(salaryAddLabel, "span"); + salary.add(salaryAddLabel); salaryAddLabel .setToolTipText("Salary modifiers for different doctor attributes"); - salary.add(new JLabel("Junior:")); - salary.add(salaryAddTF[3]); + JPanel addSalary = new JPanel(); + addSalary.add(new JLabel("Junior:")); + addSalary.add(salaryAddTF[3]); salaryAddTF[3].addFocusListener(new FocusListener() { public void focusGained(FocusEvent e) { JTextField tf = (JTextField) e.getComponent(); @@ -213,8 +220,8 @@ public void focusLost(FocusEvent e) { } }); - salary.add(new JLabel("Doctor:")); - salary.add(salaryAddTF[4]); + addSalary.add(new JLabel("Doctor:")); + addSalary.add(salaryAddTF[4]); salaryAddTF[4].addFocusListener(new FocusListener() { public void focusGained(FocusEvent e) { JTextField tf = (JTextField) e.getComponent(); @@ -233,8 +240,8 @@ public void focusLost(FocusEvent e) { } }); - salary.add(new JLabel("Consultant:")); - salary.add(salaryAddTF[7]); + addSalary.add(new JLabel("Consultant:")); + addSalary.add(salaryAddTF[7]); salaryAddTF[7].addFocusListener(new FocusListener() { public void focusGained(FocusEvent e) { JTextField tf = (JTextField) e.getComponent(); @@ -253,8 +260,8 @@ public void focusLost(FocusEvent e) { } }); - salary.add(new JLabel("Surgeon:")); - salary.add(salaryAddTF[5]); + addSalary.add(new JLabel("Surgeon:")); + addSalary.add(salaryAddTF[5]); salaryAddTF[5].addFocusListener(new FocusListener() { public void focusGained(FocusEvent e) { JTextField tf = (JTextField) e.getComponent(); @@ -273,8 +280,8 @@ public void focusLost(FocusEvent e) { } }); - salary.add(new JLabel("Psychiatrist:")); - salary.add(salaryAddTF[6]); + addSalary.add(new JLabel("Psychiatrist:")); + addSalary.add(salaryAddTF[6]); salaryAddTF[6].addFocusListener(new FocusListener() { public void focusGained(FocusEvent e) { JTextField tf = (JTextField) e.getComponent(); @@ -293,8 +300,9 @@ public void focusLost(FocusEvent e) { } }); - salary.add(new JLabel("Researcher:")); - salary.add(salaryAddTF[8]); + addSalary.add(new JLabel("Researcher:")); + addSalary.add(salaryAddTF[8]); + salary.add(addSalary); salaryAddTF[8].addFocusListener(new FocusListener() { public void focusGained(FocusEvent e) { JTextField tf = (JTextField) e.getComponent(); @@ -314,8 +322,8 @@ public void focusLost(FocusEvent e) { }); // staff distribution - staff.add(levels, "span"); - levels.add(levelsButtons, "span"); + staff.add(levels); + levels.add(levelsButtons); levels.setBorder(BorderFactory.createTitledBorder("Staff distribution")); levelsButtons.add(addLevelsButt); @@ -335,8 +343,8 @@ public void actionPerformed(ActionEvent e) { }); // starting staff panel - staff.add(start, "span"); - start.add(startButtons, "span"); + staff.add(start); + start.add(startButtons); start.setBorder(BorderFactory.createTitledBorder("Starting staff")); startButtons.add(addStartButt); @@ -393,7 +401,7 @@ public void actionPerformed(ActionEvent e) { startStaffList.get(index).startStaffPanel .add(startStaffList.get(index).skillLabel); startStaffList.get(index).startStaffPanel.add( - startStaffList.get(index).skillTF, "wrap"); + startStaffList.get(index).skillTF); startStaffList.get(index).startStaffPanel .updateUI(); } else { @@ -480,7 +488,7 @@ public void itemStateChanged(ItemEvent e) { startStaffList.get(index).skillLabel .setToolTipText("45 gives doctor, 90 gives consultant"); startStaffList.get(index).startStaffPanel.add( - startStaffList.get(index).skillTF, "wrap"); + startStaffList.get(index).skillTF); startStaffList.get(index).skillTF.addFocusListener(new FocusListener() { public void focusGained(FocusEvent e) { JTextField tf = (JTextField) e.getComponent(); @@ -511,7 +519,7 @@ public void focusLost(FocusEvent e) { startStaffList.get(index).startStaffPanel.updateUI(); - start.add(startStaffList.get(index).startStaffPanel, "span"); + start.add(startStaffList.get(index).startStaffPanel); start.updateUI(); } @@ -687,7 +695,7 @@ public void focusLost(FocusEvent e) { staffLevelsList.get(index).staffLevelsPanel.add(staffLevelsList .get(index).receptionistsLabel); staffLevelsList.get(index).staffLevelsPanel.add( - staffLevelsList.get(index).receptionistsTF, "wrap"); + staffLevelsList.get(index).receptionistsTF); staffLevelsList.get(index).receptionistsTF .addFocusListener(new FocusListener() { public void focusGained(FocusEvent e) { @@ -898,7 +906,7 @@ else if (input.matches("\\d+")) { staffLevelsList.get(index).staffLevelsPanel.add(staffLevelsList .get(index).juniorRateLabel); staffLevelsList.get(index).staffLevelsPanel.add( - staffLevelsList.get(index).juniorRateTF, "wrap"); + staffLevelsList.get(index).juniorRateTF); staffLevelsList.get(index).juniorRateTF .addFocusListener(new FocusListener() { public void focusGained(FocusEvent e) { @@ -941,7 +949,7 @@ else if (input.matches("\\d+")) { }); - levels.add(staffLevelsList.get(index).staffLevelsPanel, "span"); + levels.add(staffLevelsList.get(index).staffLevelsPanel); levels.updateUI(); // increase starting month with each new add