package net.bunnie.uva.cs101; // import things for window import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; import java.util.regex.*; public class ProblemSolverGUI extends JFrame implements MouseListener { int x = 7; int y = 7; int i; int j; ImageIcon[][] geekIcon = new ImageIcon[x][y]; JLabel[][] geekIconLabel = new JLabel[x][y]; String dir = "net\\bunnie\\uva\\cs101\\geek\\"; GridBagLayout gbl = new GridBagLayout(); GridBagConstraints gbc = new GridBagConstraints(); JPanel all; boolean[][] hoverable = new boolean[x][y]; boolean[][] selected = new boolean[x][y]; boolean[][] needsMouseListener = new boolean[x][y]; // images that don't need mouselistener int[] nI = {0,0,1,1,2,2,4,4,4,5,5,6,6,6,6}; int[] nJ = {0,1,0,1,0,1,0,1,3,0,1,0,1,2,6}; //regex: returned with getComponent.toString from mouseEvent //to see which image triggered it String regex = "defaultIcon=H([0-9])V([0-9])"; Matcher m; int[] hV = new int[2]; //this array denotes which pics go with each box int[][][] pics = { {{0, 2}, {0, 3}}, {{0, 4}, {0, 5}}, {{1, 5}}, {{1, 2}, {1, 3}}, {{2, 2}, {2, 3}, {3, 3}, {3, 4}}, {{3, 1}, {3 ,2}, {4, 2}}, {{1, 4}, {2, 4}, {3, 4}, {4, 4}, {5, 4}}, {{2, 5}}, {{3, 5}}, {{4, 5}, {5, 3}, {5, 5}, {6, 3}, {6, 4}, {6, 5}}, //up=questions, down=answers, starts at 10 {{3, 0}}, {{5, 2}}, {{0, 6}}, {{1, 6}}, {{2, 6}}, {{4, 6}, {5, 6}}, {{3, 6}} }; //this array gives keys from the previous arrays for each yes/no pair //assocPics[i] corresponds to pics[i] int[][] assocPics = { {3, 1}, {12, 2}, {7, 13}, {4, 6}, {8, 5}, {11, 10}, {9, 7}, {8, 14}, {9, 16}, {15, 11} }; int box; int pi; int pj; boolean needToHide; char ab = 'z'; public ProblemSolverGUI() { super("Geek Gift Guide"); Container c = getContentPane(); c.setBackground(Color.white); all = new JPanel(); all.setBackground(Color.white); all.setBorder(BorderFactory.createLineBorder(Color.white, 5)); all.setLayout(gbl); //initial images and mouse listeners needsMouseListener = needMI(needsMouseListener); for (i = 0; i < x; i++) { gbc.gridy = i; for (j = 0; j < y; j++) { geekIcon[i][j] = new ImageIcon(dir + "blankH" + i + "V" + j + ".jpg"); geekIconLabel[i][j] = new JLabel(geekIcon[i][j]); gbc.gridx = j; gbl.setConstraints(geekIconLabel[i][j], gbc); geekIcon[i][j].setDescription("H" + i + "V" + j); all.add(geekIconLabel[i][j]); if (needsMouseListener[i][j] == true) { geekIconLabel[i][j].addMouseListener(this); } } } setAllBlank(true); c.add(all); } public void setAllBlank(boolean firstTime) { if (firstTime == false) { //blank images for (i = 0; i < x; i++) { for (j = 0; j < y; j++) { geekIcon[i][j].setImage((new ImageIcon(dir + "blankH" + i + "V" + j + ".jpg")).getImage()); } } hoverable = new boolean[x][y]; selected = new boolean[x][y]; } else { //directions geekIcon[1][0].setImage((new ImageIcon(dir + "geekH1V0b.jpg")).getImage()); needToHide = true; } geekIcon[0][0].setImage((new ImageIcon(dir + "geekH0V0.jpg")).getImage()); geekIcon[0][1].setImage((new ImageIcon(dir + "geekH0V1.jpg")).getImage()); //corresp w/ arrays?? //would need to create mouse-event?? geekIcon[0][2].setImage((new ImageIcon(dir + "geekH0V2.jpg")).getImage()); geekIcon[0][3].setImage((new ImageIcon(dir + "geekH0V3.jpg")).getImage()); selected[0][2] = true; selected[0][3] = true; hoverable[0][2] = true; hoverable[0][3] = true; hoverable[0][4] = true; hoverable[0][5] = true; hoverable[1][2] = true; hoverable[1][3] = true; repaint(); } public boolean[][] needMI (boolean[][] needsMouseListener) { for (i = 0; i < x; i++) { for (j = 0; j < y; j++) { needsMouseListener[i][j] = true; } } for (i = 0; i < nI.length; i++) { needsMouseListener[nI[i]][nJ[i]] = false; } return needsMouseListener; } public int[] getDefaultIcon(MouseEvent e) { try { m = Pattern.compile(regex).matcher(e.getComponent().toString()); m.find(); hV[0] = Integer.parseInt(m.group(1)); hV[1] = Integer.parseInt(m.group(2)); } catch (NumberFormatException nfe) { System.out.println("Error with hover icon numbers"); System.exit(0); } return hV; } //return which "box" the image belongs to when mouseEvent is triggered //by searching through pics array public int whichPic(int[] hV) { if ((hV[0] == 3) && (hV[1] == 4)) { box = (ab == 'a') ? 6 : 4; } else { for (i = 0; i