package guis; import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Device; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; 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.*; import core.DnDie; import core.Roll; /* * The class for the Die Window. * @author Ryan Ranney */ public class DieWindow { private Display display; private Shell shell; private Shell saveName; private Shell deleteFile; private Composite dieWin; private static Text dieBox; private static Text dieCountBox; private static Text modText; private static Text nameBox; private static Text total; private static Device dev; public static boolean delete_activated; public static boolean save_activated; private static Label invalidOperation; //private static Label badInputText; //private static Label badSaveText; //private static Label badLoadText; //private static Label badDeleteText; private static Label badSaveFinal; public static Combo favList; private int[] numDie = {0, 0, 0, 0, 0, 0, 0}; public DieWindow(Display d) { display = d; shell = new Shell(d); shell.setText("Die Roller"); //shell.setSize(WIDTH, HEIGHT); dieWin = new Composite(shell, SWT.NONE); //dieWin.setBounds(0, 0, WIDTH, HEIGHT); delete_activated = false; save_activated = false; createPageContent(); shell.pack(); run(); } public void run() { center(shell); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } } 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); } private void createPageContent() { GridLayout layout = new GridLayout(); layout.makeColumnsEqualWidth = false; layout.horizontalSpacing = 3; layout.numColumns = 3; dieWin.setLayout(layout); ArrayList<Button> incButtons = new ArrayList<Button>(); ArrayList<Button> decButtons = new ArrayList<Button>(); // final String [] dieNames = {"d4 ", "d6 ", "d8 ", "d10 ", // "d12 ", "d20 ", "d100"}; final String [] dieNames = {"d4", "d6", "d8", "d10", "d12", "d20", "d100"}; final int [] dieNameNumbers = {4, 6, 8, 10, 12, 20, 100}; //DIE TEXT AND INC/DEC BUTTONS Label[] dieLabels = new Label[7]; //GridData gridData = new GridData(SWT.FILL, SWT.CENTER, true, false); for(int i = 0; i < 7; i++){ // The die X number text that's updated on button push final Label dieText = new Label(dieWin, SWT.NONE); dieLabels[i] = dieText; Font font1 = new Font(display, new FontData(Display.getCurrent().getSystemFont().getFontData()[0].getName(), 24, SWT.NONE)); dieText.setFont(font1); //dieText.setLocation(20, (i*40) + 24); //dieText.setText(dieNames[i] + " x " + numDie[i]); dieText.setText(numDie[i] + dieNames[i]); GridData gridData = new GridData(SWT.RIGHT, SWT.CENTER, false, false); gridData.horizontalIndent = 5; dieText.setLayoutData(gridData); //dieText.pack(); Button inc = new Button(dieWin, SWT.PUSH); inc.setText("+"); //inc.setLocation(145, (i*40) + 20); //inc.setSize(33,33); gridData = new GridData(SWT.BEGINNING, SWT.CENTER, false, false); inc.setLayoutData(gridData); final int index = i; inc.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { if (numDie[index] >= 20) return; numDie[index] ++; dieText.setText(numDie[index] + dieNames[index]); dieWin.layout(); } }); incButtons.add(inc); Button dec = new Button(dieWin, SWT.PUSH); dec.setText("-"); //dec.setBounds(175, (i*40) + 20, 33, 33); gridData = new GridData(SWT.BEGINNING, SWT.CENTER, false, false); dec.setLayoutData(gridData); dec.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { if (numDie[index] <= 0) return; numDie[index] --; dieText.setText(numDie[index] + dieNames[index]); dieWin.layout(); } }); decButtons.add(dec); } // Custom Die text final Label custom = new Label(dieWin, SWT.NONE); Font font2 = new Font(display, new FontData(Display.getCurrent().getSystemFont().getFontData()[0].getName(), 24, SWT.NONE)); custom.setFont(font2); custom.setText("Custom \n (#, die)"); GridData gridData = new GridData(SWT.RIGHT, SWT.CENTER, false, false); gridData.horizontalIndent = 5; custom.setLayoutData(gridData); //mod.pack(); //Custom die Count box dieCountBox = new Text(dieWin, SWT.BORDER); dieCountBox.setText("0"); gridData = new GridData(SWT.FILL, SWT.CENTER, true, false); dieCountBox.setLayoutData(gridData); //Custom die box dieBox = new Text(dieWin, SWT.BORDER); dieBox.setText("0"); gridData = new GridData(SWT.FILL, SWT.CENTER, true, false); dieBox.setLayoutData(gridData); // Mod text final Label mod = new Label(dieWin, SWT.NONE); mod.setFont(font2); mod.setText("Modifier = "); gridData = new GridData(SWT.RIGHT, SWT.CENTER, false, false); gridData.horizontalIndent = 5; mod.setLayoutData(gridData); //mod.pack(); //Mod text box modText = new Text(dieWin, SWT.BORDER); modText.setText("0"); gridData = new GridData(SWT.FILL, SWT.CENTER, true, false); gridData.horizontalSpan = 2; modText.setLayoutData(gridData); // Total text final Label totalText = new Label(dieWin, SWT.NONE); Font font4 = new Font(display, new FontData(Display.getCurrent().getSystemFont().getFontData()[0].getName(), 24, SWT.BOLD)); totalText.setFont(font4); totalText.setText("Total = "); gridData = new GridData(SWT.RIGHT, SWT.CENTER, false, false); gridData.horizontalIndent = 5; totalText.setLayoutData(gridData); // Total's read-only display box total = new Text(dieWin, SWT.BORDER | SWT.READ_ONLY | SWT.CENTER); total.setText("0"); Font font5 = new Font(display, new FontData(Display.getCurrent().getSystemFont().getFontData()[0].getName(), 16, SWT.NONE)); total.setFont(font5); gridData = new GridData(SWT.FILL, SWT.CENTER, true, false); gridData.horizontalSpan = 2; total.setLayoutData(gridData); // ROLL BUTTON Font font3 = new Font(display, new FontData(Display.getCurrent().getSystemFont().getFontData()[0].getName(), 15, SWT.NONE)); Button roll = new Button(dieWin, SWT.PUSH); roll.setText("Roll"); roll.setFont(font3); gridData = new GridData(SWT.FILL, SWT.FILL, true, true); gridData.horizontalIndent = 5; gridData.verticalSpan = 2; roll.setLayoutData(gridData); roll.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { int modInt = 0; int rollTotal = 0; int custDie = 0; int custDieCount = 0; boolean dieRolled = false; try{ invalidOperation.setVisible(false); modInt = Integer.parseInt(modText.getText()); custDie = Integer.parseInt(dieBox.getText()); custDieCount = Integer.parseInt(dieCountBox.getText()); if(modInt <= -100 || modInt >= 100){ invalidOperation.setText("Invalid modifier: -100 < mod < 100"); invalidOperation.setVisible(true); return; } if(custDie < 0 || custDie > 1000 || custDie == 1){ invalidOperation.setText("Invalid Custom Die: 1 < Die <1000"); invalidOperation.setVisible(true); return; } if(custDieCount < 0 || custDieCount > 20){ invalidOperation.setText("Invalid Custom Cnt: 0< count< 21"); invalidOperation.setVisible(true); return; } if(custDie != 0 && custDieCount == 0){ invalidOperation.setText("Invalid Custom #: select die count"); invalidOperation.setVisible(true); return; } if(custDie == 0 && custDieCount != 0){ invalidOperation.setText("Invalid Custom Die: select a die"); invalidOperation.setVisible(true); return; } for(int i = 0; i < 7; i++){ if(numDie[i] != 0) dieRolled = true; } if(!dieRolled && modInt == 0 && custDie == 0 && custDieCount == 0){ invalidOperation.setText("Invalid Roll: must roll at least 1 die."); invalidOperation.setVisible(true); return; } }catch(Exception error){ modText.setText("0"); dieBox.setText("0"); dieCountBox.setText("0"); invalidOperation.setText("Invalid Textbox Input: numbers only"); invalidOperation.setVisible(true); return; } //add the rolling to this for(int i = 0; i < 7; i++){ rollTotal += DnDie.roll(dieNameNumbers[i], numDie[i]); //System.out.println(rollTotal); } rollTotal += modInt; if(custDie != 0 && custDieCount != 0){ rollTotal += DnDie.roll(custDie, custDieCount); } total.setText(Integer.toString(rollTotal)); } }); // SAVE BUTTON Button save = new Button(dieWin, SWT.PUSH); save.setText("Save"); save.setFont(font3); gridData = new GridData(SWT.FILL, SWT.CENTER, true, false); gridData.horizontalSpan = 2; save.setLayoutData(gridData); save.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { if(save_activated) { saveName.forceActive(); return; } int modInt = 0; boolean notUsed = true; int custDie = 0; int custDieCount = 0; boolean dieRolled = false; save_activated = true; try{ invalidOperation.setVisible(false); modInt = Integer.parseInt(modText.getText()); custDie = Integer.parseInt(dieBox.getText()); custDieCount = Integer.parseInt(dieCountBox.getText()); if(modInt <= -100 || modInt >= 100){ invalidOperation.setText("Invalid modifier: -100 < mod < 100"); invalidOperation.setVisible(true); save_activated = false; return; } if(custDie < 0 || custDie > 1000 || custDie == 1){ invalidOperation.setText("Invalid Custom Die: 1 < Die <1000"); invalidOperation.setVisible(true); save_activated = false; return; } if(custDieCount < 0 || custDieCount > 20){ invalidOperation.setText("Invalid Custom Cnt: 0< count< 21"); invalidOperation.setVisible(true); save_activated = false; return; } if(custDie != 0 && custDieCount == 0){ invalidOperation.setText("Invalid Custom #: select die count"); invalidOperation.setVisible(true); save_activated = false; return; } if(custDie == 0 && custDieCount != 0){ invalidOperation.setText("Invalid Custom Die: select a die"); invalidOperation.setVisible(true); save_activated = false; return; } for(int i = 0; i < 7; i++){ if(numDie[i] != 0) dieRolled = true; } if(!dieRolled && modInt == 0 && custDie == 0 && custDieCount == 0){ invalidOperation.setText("Invalid Roll: must roll at least 1 die."); invalidOperation.setVisible(true); save_activated = false; return; } }catch(Exception error){ modText.setText("0"); dieBox.setText("0"); dieCountBox.setText("0"); invalidOperation.setText("Invalid Textbox Input: numbers only"); invalidOperation.setVisible(true); save_activated = false; return; } ArrayList<Roll> roll = new ArrayList<Roll>(9); //add die that were added for(int i = 0; i < 7; i++){ if(numDie[i] > 0){ notUsed = false; roll.add(new Roll(dieNameNumbers[i], numDie[i])); } } if(custDie != 0 && custDieCount != 0){ notUsed = false; roll.add(new Roll(custDie, custDieCount)); } // if a die was added, or a mod was there if(modInt != 0){ roll.add(new Roll(0, 0, modInt)); }else if(notUsed){ invalidOperation.setText("Invalid Save: at least 1 die or mod."); invalidOperation.setVisible(true); save_activated = false; return; } final ArrayList<Roll> rollFinal = roll; notUsed = true; saveName = new Shell(display); saveName.setText("Save"); //saveName.setSize(300, 200); center(saveName); // this appears when there is an empty save badSaveFinal = new Label(saveName, SWT.NONE); badSaveFinal.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED)); badSaveFinal.setLocation(10,110); badSaveFinal.setVisible(false); badSaveFinal.setText("Invalid Save: must be aplhanumeric values only"); badSaveFinal.pack(); Label name = new Label(saveName, SWT.NONE); name.setLocation(77,50); name.setText("Favorite Dice Roll Name"); name.pack(); //Save name text box nameBox = new Text(saveName, SWT.BORDER); nameBox.setText(""); nameBox.setBounds(90,75,120,30); Button cancel = new Button(saveName, SWT.PUSH); cancel.setBounds(10,130,130,30); cancel.setText("Cancel"); cancel.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { save_activated = false; saveName.dispose(); } }); Button saveFinal = new Button(saveName, SWT.PUSH); saveFinal.setBounds(160,130,130,30); saveFinal.setText("Save"); saveFinal.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { badSaveFinal.setVisible(false); Pattern p1 = Pattern.compile(".*\\W+.*"); if(nameBox.getText().equalsIgnoreCase("")){ badSaveFinal.setText("Invalid Save: must have a file name."); badSaveFinal.setVisible(true); return; }else if(nameBox.getText().length() > 20){ badSaveFinal.setText("Invalid Save: file name is capped at 20 chars."); badSaveFinal.setVisible(true); return; } Matcher m = p1.matcher(nameBox.getText()); if(m.find()){ badSaveFinal.setText("Invalid Save: must be alphanumeric values only"); badSaveFinal.setVisible(true); return; } try{ DnDie.saveFavDie(nameBox.getText(), rollFinal); if(favList.indexOf(nameBox.getText()) == -1) favList.add(nameBox.getText()); }catch(Exception e){ badSaveFinal.setText("Invalid Save: start with a letter"); badSaveFinal.setVisible(true); return; } save_activated = false; saveName.dispose(); } }); saveName.pack(); saveName.open(); while (!saveName.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } } }); // Clear BUTTON Button clear = new Button(dieWin, SWT.PUSH); clear.setText("Clear"); clear.setFont(font3); gridData = new GridData(SWT.FILL, SWT.CENTER, true, false); gridData.horizontalSpan = 2; clear.setLayoutData(gridData); clear.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { int clearNum = 0; for(int i = 0; i < dieLabels.length; i ++){ numDie[i] = clearNum; dieLabels[i].setText(numDie[i] + dieNames[i]); } modText.setText("0"); dieBox.setText("0"); dieCountBox.setText("0"); dieWin.layout(); } }); favList = new Combo(dieWin, SWT.DROP_DOWN | SWT.READ_ONLY); //favList.setBounds(250, 90, 200, 30); favList.add("Favorite Die Roll"); gridData = new GridData(SWT.FILL, SWT.CENTER, true, false); gridData.horizontalSpan = 3; gridData.horizontalIndent = 3; favList.setLayoutData(gridData); favList.select(0); DnDie.populateDieList(); // The button that loads the selected file name into the die window. Button load = new Button(dieWin, SWT.PUSH); load.setText("Load"); load.setFont(font3); gridData = new GridData(SWT.FILL, SWT.CENTER, true, false); gridData.horizontalIndent = 5; load.setLayoutData(gridData); load.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { invalidOperation.setVisible(false); if(favList.getSelectionIndex() == 0){ invalidOperation.setText("Invalid Load: must select a file."); invalidOperation.setVisible(true); return; } ArrayList<Roll> loaded = new ArrayList<Roll>(8); loaded = DnDie.loadFavDie(favList.getItem(favList.getSelectionIndex())); boolean d4 = false; boolean d6 = false; boolean d8 = false; boolean d10 = false; boolean d12 = false; boolean d20 = false; boolean d100 = false; boolean custom = false; boolean modded = false; for(int i = 0; i < loaded.size(); i++){ if(loaded.get(i).getDieSize() == 4){ numDie[0] = loaded.get(i).getDieCount(); dieLabels[0].setText(numDie[0] + dieNames[0]); dieWin.layout(); d4 = true; } else if(loaded.get(i).getDieSize() == 6){ numDie[1] = loaded.get(i).getDieCount(); dieLabels[1].setText(numDie[1] + dieNames[1]); dieWin.layout(); d6 = true; } else if(loaded.get(i).getDieSize() == 8){ numDie[2] = loaded.get(i).getDieCount(); dieLabels[2].setText(numDie[2] + dieNames[2]); dieWin.layout(); d8 = true; } else if(loaded.get(i).getDieSize() == 10){ numDie[3] = loaded.get(i).getDieCount(); dieLabels[3].setText(numDie[3] + dieNames[3]); dieWin.layout(); d10 = true; } else if(loaded.get(i).getDieSize() == 12){ numDie[4] = loaded.get(i).getDieCount(); dieLabels[4].setText(numDie[4] + dieNames[4]); dieWin.layout(); d12 = true; } else if(loaded.get(i).getDieSize() == 20){ numDie[5] = loaded.get(i).getDieCount(); dieLabels[5].setText(numDie[5] + dieNames[5]); dieWin.layout(); d20 = true; } else if(loaded.get(i).getDieSize() == 100){ numDie[6] = loaded.get(i).getDieCount(); dieLabels[6].setText(numDie[6] + dieNames[6]); dieWin.layout(); d100 = true; }else if(loaded.get(i).getDieSize() != 0){ custom = true; dieBox.setText(Integer.toString(loaded.get(i).getDieSize())); dieCountBox.setText(Integer.toString(loaded.get(i).getDieCount())); } if(loaded.get(i).getModifier() != 0){ modded = true; modText.setText(Integer.toString(loaded.get(i).getModifier())); } if(!d4){ numDie[0] = 0; dieLabels[0].setText(numDie[0] + dieNames[0]); dieWin.layout(); } if(!d6){ numDie[1] = 0; dieLabels[1].setText(numDie[1] + dieNames[1]); dieWin.layout(); } if(!d8){ numDie[2] = 0; dieLabels[2].setText(numDie[2] + dieNames[2]); dieWin.layout(); } if(!d10){ numDie[3] = 0; dieLabels[3].setText(numDie[3] + dieNames[3]); dieWin.layout(); } if(!d12){ numDie[4] = 0; dieLabels[4].setText(numDie[4] + dieNames[4]); dieWin.layout(); } if(!d20){ numDie[5] = 0; dieLabels[5].setText(numDie[5] + dieNames[5]); dieWin.layout(); } if(!d100){ numDie[6] = 0; dieLabels[6].setText(numDie[6] + dieNames[6]); dieWin.layout(); } if(!modded){ modText.setText("0"); } if(!custom){ dieBox.setText("0"); dieCountBox.setText("0"); } } } }); Button delete = new Button(dieWin, SWT.PUSH); delete.setText("Delete"); delete.setFont(font3); gridData = new GridData(SWT.FILL, SWT.CENTER, true, false); gridData.horizontalSpan = 2; delete.setLayoutData(gridData); delete.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { if(delete_activated) { deleteFile.forceActive(); return; } String deleteMe = favList.getItem(favList.getSelectionIndex()); invalidOperation.setVisible(false); delete_activated = true; if(favList.getSelectionIndex() == 0){ invalidOperation.setText("Invalid Delete: must select a file."); invalidOperation.setVisible(true); delete_activated = false; return; } deleteFile = new Shell(display); deleteFile.setText("Delete"); //deleteFile.setSize(250, 150); center(deleteFile); Label name = new Label(deleteFile, SWT.NONE); name.setLocation(20,40); name.setText("Are you sure you want to delete?"); name.pack(); Button cancel = new Button(deleteFile, SWT.PUSH); cancel.setBounds(10,90,80,30); cancel.setText("Cancel"); cancel.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { delete_activated = false; deleteFile.dispose(); } }); Button saveFinal = new Button(deleteFile, SWT.PUSH); saveFinal.setBounds(160,90,80,30); saveFinal.setText("Delete"); saveFinal.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { delete_activated = false; DnDie.deleteFavDie(deleteMe); favList.remove(deleteMe); favList.select(0); deleteFile.dispose(); } }); deleteFile.pack(); deleteFile.open(); while (!deleteFile.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } } }); // this appears when there is an invalid operation attempt invalidOperation = new Label(dieWin, SWT.NONE); invalidOperation.setForeground(new Color(dev,255,0,0)); invalidOperation.setVisible(false); invalidOperation.setText(""); gridData = new GridData(SWT.FILL, SWT.CENTER, true, false); gridData.horizontalSpan = 3; gridData.verticalSpan = 2; invalidOperation.setLayoutData(gridData); dieWin.pack(); return; } // public static void main(String[] args) { // Display display = new Display(); // DieWindow dw = new DieWindow(display); // display.dispose(); // } }