package guis; import java.util.ArrayList; import java.util.LinkedHashMap; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StackLayout; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import core.GameState; import core.Main; import entity.FeatEntity; /** * The class that handle Feat wizard interface, input and export. * Feature Wizard don't do random generation. * @author Innocentius Shellingford * */ public class FeatWizard { private static Shell shell; private static Display display; public static boolean cancel = false; private static ArrayList<Composite> wizPages; private static int wizpagenum; public static FeatEntity newfeat; static String featname; static String featprereq; static String featnormal; static String featspecial; static String featbenefit; static String featfighter; static String featscript; public Boolean desfirst; public Boolean desben; public FeatWizard(Display d) { if (GameState.isWindowOpen("Feat")) { return; } display = d; shell = new Shell(d); shell.setImage(new Image(display, "images/bnb_logo.gif")); shell.setText("Create new Feat"); //int width = display.getMonitors()[0].getBounds().width; //shell.setSize(width / 3, width * 2 / 9); wizpagenum = 0; wizPages = new ArrayList<Composite>(); desfirst = false; desben = false; createPageContent(); GameState.windowsOpen.add("Feat"); run(); } public void run() { center(shell); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } GameState.windowsOpen.remove("Feat"); } /** * Set window to be the center. * @param shell the window needed to be in the center */ private static void center(Shell shell) { Rectangle bds = shell.getDisplay().getBounds(); Point p = shell.getSize(); int nLeft = (bds.width - p.x) / 2; int nTop = (bds.height - p.y) / 2; shell.setBounds(nLeft, nTop, p.x, p.y); } /** * To create a feat, we need user input from the following: * NAME * PREREQUISITE * NORMAL * SPECIAL * BENEFIT * FIGHTERBONUS * DESCRIPTION * * We get input of name, prerequisite on the same page. * Then second on normal, special, benefit, fighter bonus. * Description at the third. * We get the inputs, put them into Strings, hash map it, then create a new feat... BUT where should I put it? * TODO verify the storing method */ private void createPageContent() { GridLayout gl = new GridLayout(4, true); gl.verticalSpacing = 5; shell.setLayout(gl); GridData gd; final Label wiz1Label = new Label(shell, SWT.NONE); wiz1Label.setText("Enter Fields"); gd = new GridData(GridData.FILL, GridData.FILL,false, false); gd.horizontalSpan = 4; wiz1Label.setLayoutData(gd); wiz1Label.pack(); Text nameInput = new Text(shell, SWT.BORDER); nameInput.setMessage("Name"); gd = new GridData(GridData.FILL, GridData.FILL, false, false); gd.horizontalSpan = 2; nameInput.setLayoutData(gd); nameInput.pack(); Text typeInput = new Text(shell, SWT.BORDER); typeInput.setMessage("Type"); gd = new GridData(GridData.FILL, GridData.FILL, false, false); gd.horizontalSpan = 2; typeInput.setLayoutData(gd); typeInput.pack(); Text prereqInput = new Text(shell, SWT.BORDER); prereqInput.setMessage("Prerequisite"); gd = new GridData(GridData.FILL, GridData.FILL, false, false); gd.horizontalSpan = 2; prereqInput.setLayoutData(gd); prereqInput.pack(); Text normalInput = new Text(shell, SWT.BORDER); normalInput.setMessage("Normal"); gd = new GridData(GridData.FILL, GridData.FILL, false, false); gd.horizontalSpan = 2; normalInput.setLayoutData(gd); normalInput.pack(); Text specialInput = new Text(shell, SWT.BORDER); specialInput.setMessage("Special"); gd = new GridData(GridData.FILL, GridData.FILL, false, false); gd.horizontalSpan = 2; specialInput.setLayoutData(gd); specialInput.pack(); //Benefit Text benefitInput = new Text(shell, SWT.WRAP | SWT.BORDER); benefitInput.setText("Benefit"); benefitInput.addListener(SWT.Activate, new Listener(){ public void handleEvent(Event event) { if(!desben) { benefitInput.setText(""); desben = true; } } }); gd = new GridData(GridData.FILL, GridData.FILL, false, false); gd.horizontalSpan = 3; gd.verticalSpan = 5; benefitInput.setLayoutData(gd); benefitInput.pack(); //Fighter bonus Label FighterLabel = new Label(shell, SWT.NONE); FighterLabel.setText("Fighter Bonus"); gd = new GridData(GridData.FILL, GridData.FILL, false, false); gd.horizontalSpan = 1; FighterLabel.setLayoutData(gd); FighterLabel.pack(); Button FighterInput = new Button(shell, SWT.CHECK); gd = new GridData(GridData.CENTER, GridData.FILL, true, false); gd.horizontalSpan = 1; FighterInput.setLayoutData(gd); FighterInput.pack(); //Description Text descriptionInput = new Text(shell, SWT.WRAP | SWT.V_SCROLL|SWT.BORDER); descriptionInput.setText("Description (Optional)"); descriptionInput.addListener(SWT.Activate, new Listener(){ public void handleEvent(Event event) { if(!desfirst) { descriptionInput.setText(""); desfirst = true; } } }); gd = new GridData(GridData.FILL, GridData.FILL, true, false); gd.horizontalSpan = 4; gd.verticalSpan = 15; descriptionInput.setLayoutData(gd); descriptionInput.pack(); Label blank = new Label(shell, SWT.NONE); gd = new GridData(GridData.FILL, GridData.FILL, true, true); gd.horizontalSpan = 4; blank.setLayoutData(gd); blank.pack(); Button save = new Button(shell, SWT.PUSH); save.setText("Save"); save.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { Boolean checkfault = false; LinkedHashMap<String, String> a = new LinkedHashMap<String, String>(); if(nameInput.getText().equals("")) { nameInput.setBackground(display.getSystemColor(SWT.COLOR_RED)); checkfault = true; } if(typeInput.getText().equals("")) { typeInput.setBackground(display.getSystemColor(SWT.COLOR_RED)); checkfault = true; } if(benefitInput.getText().equals("")) { benefitInput.setBackground(display.getSystemColor(SWT.COLOR_RED)); checkfault = true; } if(checkfault) { return; } a.put("NAME", nameInput.getText()); a.put("TYPE", typeInput.getText()); a.put("BENEFIT", benefitInput.getText()); if(!prereqInput.getText().equals("")) { a.put("PREREQUISITES", prereqInput.getText()); } if(!normalInput.getText().equals("")) { a.put("NORMAL", normalInput.getText()); } if(!specialInput.getText().equals("")) { a.put("SPECIAL", specialInput.getText()); } if(FighterInput.getSelection()) { featfighter = "Yes"; a.put("FIGHTERBONUS", featfighter); } featname = nameInput.getText(); a.put("DESCRIPTION", descriptionInput.getText()); newfeat = new FeatEntity(a); Main.gameState.feats.put(featname, newfeat); Main.gameState.customContent.put(featname, newfeat); shell.close(); } } ); gd = new GridData(GridData.FILL, GridData.CENTER, false, false); gd.horizontalSpan = 1; save.setLayoutData(gd); save.pack(); shell.layout(); shell.pack(); // //wizard // final Composite wizPanel = new Composite(shell, SWT.BORDER); // wizPanel.setBounds(0,0,GameState.DEFAULT_WIDTH, GameState.DEFAULT_HEIGHT); // final StackLayout wizLayout = new StackLayout(); // wizPanel.setLayout(wizLayout); // // //Page1 -- Name // final Composite wizpage1 = new Composite(wizPanel, SWT.NONE); // wizpage1.setBounds(0,0,GameState.DEFAULT_WIDTH,GameState.DEFAULT_HEIGHT); // // final Label wiz1Label = new Label(wizpage1, SWT.NONE); // wiz1Label.setText("Enter Name (required)"); // wiz1Label.pack(); // final Text wizpage1text = new Text(wizpage1, SWT.BORDER); // wizpage1text.setBounds(50, 50, 150, 50); // wizpage1text.setText("A Normal Human"); // Button next1 = createNextButton(wizpage1);//TODO cancel and previous button // createBackButton(wizpage1, wizPanel, wizLayout); // createCancelButton(wizpage1, wizPanel, wizLayout); // next1.addListener(SWT.Selection, new Listener() // { // public void handleEvent(Event event) // { // if(wizpage1text.getText() != "") // { // featname = wizpage1text.getText(); // if(wizpagenum < wizPages.size() - 1) // { // wizpagenum++; // wizLayout.topControl = wizPages.get(wizpagenum); // wizPanel.layout(); // } // else if(wizpagenum == wizPages.size() - 1) // { // System.out.println("PANIC: ITEM WIZARD PAGE 1 OUT"); // shell.close(); // } // } // else // { // wiz1Label.setBackground(display.getSystemColor(SWT.COLOR_RED)); // } // } // } // ); // // wizPages.add(wizpage1); // //Page2 -- prerequisite // final Composite wizpage2 = new Composite(wizPanel, SWT.NONE); // final Label wiz2Label = new Label(wizpage2, SWT.NONE); // wiz2Label.setText("Enter Prerequisite: (optional)"); // wiz2Label.pack(); // final Text wizpage2text = new Text(wizpage2, SWT.BORDER); // wizpage2text.setBounds(50, 50, 250, 150); // wizpage2text.setText("Prerequisite Here"); // Button next2 = createNextButton(wizpage2); // createBackButton(wizpage2, wizPanel, wizLayout); // createCancelButton(wizpage2, wizPanel, wizLayout); // next2.addListener(SWT.Selection, new Listener() // { // public void handleEvent(Event event) // { // if(wizpage2text.getText() != "") // { // featprereq = wizpage2text.getText(); // } // else // { // featprereq = "<empty>"; // } // if(wizpagenum < wizPages.size() - 1) // { // wizpagenum++; // wizLayout.topControl = wizPages.get(wizpagenum); // wizPanel.layout(); // } // else if(wizpagenum == wizPages.size() - 1) // { // shell.close(); // } // // // } // }); // wizPages.add(wizpage2); // //Page3 -- Normal // final Composite wizpage3 = new Composite(wizPanel, SWT.NONE); // final Label wiz3Label = new Label(wizpage3, SWT.NONE); // wiz3Label.setText("Enter Normal: (required)"); // wiz3Label.pack(); // final Text wizpage3text = new Text(wizpage3, SWT.BORDER); // wizpage3text.setBounds(50, 50, 200, 50); // wizpage3text.setText("No effect"); // Button next3 = createNextButton(wizpage3); // createBackButton(wizpage3, wizPanel, wizLayout); // createCancelButton(wizpage3, wizPanel, wizLayout); // next3.addListener(SWT.Selection, new Listener() // { // public void handleEvent(Event event) // { // if(wizpage3text.getText() != "") // { // featnormal = wizpage3text.getText(); // if(wizpagenum < wizPages.size() - 1) // { // wizpagenum++; // wizLayout.topControl = wizPages.get(wizpagenum); // wizPanel.layout(); // } // else if(wizpagenum == wizPages.size() - 1) // { // shell.close(); // } // } // else // { // wiz3Label.setBackground(display.getSystemColor(SWT.COLOR_RED)); // } // } // }); // wizPages.add(wizpage3); // //Page4 -- Specials // final Composite wizpage4 = new Composite(wizPanel, SWT.NONE); // final Label wiz4Label = new Label(wizpage4, SWT.NONE); // wiz4Label.setText("Enter Special: (required)"); // wiz4Label.pack(); // final Text wizpage4text = new Text(wizpage4, SWT.BORDER); // wizpage4text.setBounds(50, 50, 150, 50); // wizpage4text.setText("No effect"); // Button next4 = createNextButton(wizpage4); // createBackButton(wizpage4, wizPanel, wizLayout); // createCancelButton(wizpage4, wizPanel, wizLayout); // next4.addListener(SWT.Selection, new Listener() // { // public void handleEvent(Event event) // { // if(wizpage4text.getText() != "") // { // featspecial = wizpage4text.getText(); // if(wizpagenum < wizPages.size() - 1) // { // wizpagenum++; // // wizLayout.topControl = wizPages.get(wizpagenum); // wizPanel.layout(); // } // else if(wizpagenum == wizPages.size() - 1) // { // shell.close(); // } // } // else // { // wiz4Label.setBackground(display.getSystemColor(SWT.COLOR_RED)); // } // } // }); // wizPages.add(wizpage4); // //Page5 -- Benefit // final Composite wizpage5 = new Composite(wizPanel, SWT.NONE); // final Label wiz5Label = new Label(wizpage5, SWT.NONE); // final Text wizpage5text = new Text(wizpage5, SWT.BORDER); // wizpage5text.setBounds(50, 50, 150, 50); // wizpage5text.setText("No effect"); // Button next5 = createNextButton(wizpage5); // createBackButton(wizpage5, wizPanel, wizLayout); // createCancelButton(wizpage5, wizPanel, wizLayout); // wiz5Label.setText("Enter Benefit: (required)"); // wiz5Label.pack(); // next5.addListener(SWT.Selection, new Listener() // { // public void handleEvent(Event event) // { // if(wizpage5text.getText() != "") // { // featbenefit = wizpage5text.getText(); // if(wizpagenum < wizPages.size() - 1) // { // wizpagenum++; // // wizLayout.topControl = wizPages.get(wizpagenum); // wizPanel.layout(); // } // else if(wizpagenum == wizPages.size() - 1) // { // shell.close(); // } // } // else // { // wiz5Label.setBackground(display.getSystemColor(SWT.COLOR_RED)); // } // } // }); // wizPages.add(wizpage5); // //Page6 -- Fighter Bonus or not // final Composite wizpage6 = new Composite(wizPanel, SWT.NONE); // final Label wiz6Label = new Label(wizpage6, SWT.NONE); // final Text wizpage6text = new Text(wizpage6, SWT.BORDER); // wizpage6text.setBounds(50, 50, 150, 50); // wizpage6text.setText("Yes"); // Button next6 = createNextButton(wizpage6); // createBackButton(wizpage6, wizPanel, wizLayout); // createCancelButton(wizpage6, wizPanel, wizLayout); // wiz6Label.setText("Enter If Fighter Bonus: (Yes/No)"); // wiz6Label.pack(); // next6.addListener(SWT.Selection, new Listener() // { // public void handleEvent(Event event) // { // if(wizpage6text.getText() != "") // { // featfighter = wizpage6text.getText(); // if(wizpagenum < wizPages.size() - 1) // { // wizpagenum++; // // wizLayout.topControl = wizPages.get(wizpagenum); // wizPanel.layout(); // } // else if(wizpagenum == wizPages.size() - 1) // { // shell.close(); // } // } // else // { // wiz6Label.setBackground(display.getSystemColor(SWT.COLOR_RED)); // } // } // }); // wizPages.add(wizpage6); // //Page7 -- Description // final Composite wizpage7 = new Composite(wizPanel, SWT.NONE); // Label wiz7Label = new Label(wizpage7, SWT.NONE); // wiz7Label.setText("Enter Description (Optional)"); // wiz7Label.pack(); // final Text wizpage7text = new Text(wizpage7, SWT.BORDER); // wizpage7text.setBounds(50, 50, 300, 200); // wizpage7text.setText("Description here"); // Button next7 = createNextButton(wizpage7); // createBackButton(wizpage7, wizPanel, wizLayout); // createCancelButton(wizpage7, wizPanel, wizLayout); // next7.addListener(SWT.Selection, new Listener() // { // public void handleEvent(Event event) // { // if(wizpage7text.getText() != "") // { // featscript = wizpage7text.getText(); // } // else // { // featscript = "<empty>"; // } // CreateVerificationPage(wizPanel, wizLayout); // if(wizpagenum < wizPages.size() - 1) // { // wizpagenum++; // // wizLayout.topControl = wizPages.get(wizpagenum); // wizPanel.layout(); // } // else if(wizpagenum == wizPages.size() - 1) // { // shell.close(); // } // } // // // }); // wizPages.add(wizpage7); // wizLayout.topControl = wizpage1; // wizPanel.layout(); // } // private void CreateVerificationPage(final Composite wizPanel, // final StackLayout wizLayout) { // if(wizPages.size() > wizpagenum + 1) // { // wizPages.remove(wizpagenum + 1); // } // final Composite verific = new Composite(wizPanel, SWT.NONE); // Label wiz8Label = new Label(verific, SWT.NONE); // wiz8Label.setText("Name: " + featname + "\nPrerequisite: " + featprereq // + "\nNormal: " + featnormal + "\nSpecial: " + featspecial + // "\nBenefit: " + featbenefit + "\nFighter Bonus: " + featfighter // + "\nDescription: " + featscript); // wiz8Label.pack(); // Button confirm = new Button(verific, SWT.PUSH); // createBackButton(verific, wizPanel, wizLayout); // createCancelButton(verific, wizPanel, wizLayout); // confirm.setText("Confirm"); // confirm.setBounds(GameState.DEFAULT_WIDTH-117, GameState.DEFAULT_HEIGHT - 90, 100, 50); // confirm.addListener(SWT.Selection, new Listener() // { // public void handleEvent(Event event) // { // //TODO save the item // shell.close(); // } // }); // wizPages.add(verific); // } public static Button createNextButton(Composite c) { Button nextButton = new Button(c, SWT.PUSH); nextButton.setText("Next"); nextButton.setBounds(GameState.DEFAULT_WIDTH - 117, GameState.DEFAULT_HEIGHT - 90, 100, 50); return nextButton; } /** *COPY FROM CHAR WIZARD * creates a back button on composite c in the bottom right corner. * also sets the listener for the created button that changes the top * control page of the layout of the panel to be the previous page * @param c * @param panel * @param layout * @return */ public static Button createBackButton(Composite c, final Composite panel, final StackLayout layout) { Button backButton = new Button(c, SWT.PUSH); backButton.setText("Back"); backButton.setBounds(GameState.DEFAULT_WIDTH - 220, GameState.DEFAULT_HEIGHT - 90, 100, 50); backButton.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { if (wizpagenum > 0) wizpagenum--; layout.topControl = wizPages.get(wizpagenum); panel.layout(); } }); return backButton; } /** * COPY FROM CHAR WIZARD * creates a cancel button on composite c in bottom left corner. * also sets the listener for the created button that changes the homePanel * top control to be home and resets the wizard page counter wizPageNum * @param c * @param home * @param panel * @param layout * @return */ public static Button createCancelButton(Composite c, final Composite panel, final StackLayout layout) { Button cancelButton = new Button(c, SWT.PUSH); cancelButton.setText("Cancel"); cancelButton.setBounds(10, GameState.DEFAULT_HEIGHT - 90, 100, 50); cancelButton.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { cancel = false; final Shell areYouSureShell = new Shell(display); areYouSureShell.setText("Cancel"); areYouSureShell.setSize(300, 200); center(areYouSureShell); Label areYouSure = new Label(areYouSureShell, SWT.NONE); areYouSure.setLocation(40,50); areYouSure.setText("Are you sure you want to cancel?"); areYouSure.pack(); Button yes = new Button(areYouSureShell, SWT.PUSH); yes.setBounds(10,130,130,30); yes.setText("Yes, Cancel"); yes.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { cancel = true; areYouSureShell.dispose(); } }); Button no = new Button(areYouSureShell, SWT.PUSH); no.setBounds(160,130,130,30); no.setText("No, Don't Cancel"); no.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { cancel = false; areYouSureShell.dispose(); } }); areYouSureShell.open(); while (!areYouSureShell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } if (cancel) { shell.close(); } } }); return cancelButton; } /** * simple getter */ public Shell getshell() { return shell; } }