package main; import java.awt.*; import java.awt.event.*; import java.awt.image.*; import java.io.*; import java.text.*; import java.util.*; import java.sql.*; import gamegui.*; import gamegui.Window; import gamegui.Label; import gamegui.Button; import utils.*; public class WineDBClient implements KeyListener, MouseListener { public enum GameState { Main, ChangeBottle, ChangeIcon } public enum AuxState { None, MsgBox } private static final boolean RUNNING_FROM_JAR = false; private static final int RES_X = 1280; private static final int RES_Y = 800; GameState gameState; AuxState auxState; Point playerLoc; boolean started = false; boolean done, showFps, bounds, passable, minimizedGui; int frameCount, lastFrameCount, refreshRate; long lastFpsUpdate; Graphics g; // GUI elements Frame frmMain; Window wndMain, wndEdit, wndDiagnostics; boolean showCharacter, showInventory, showQuests; ScrollList lstSavedGames; Window wndMessage; DynamicImage yellowCursor, cursor; BufferedImage frame, brightFrame, iconEditor, addButton, cancelButton, removeButton, saveButton, nullImage; BufferedImage[][] bottle_icons; Textbox selectedText; Font font11, font12, font14, font24, fontTT, fontCustom11, fontCustom12, fontCustom14, fontCustom16, fontCustom18, fontCustom24, fontCustom30, guiFont12, guiFont14; FontMetrics m; Map wineMap = new HashMap(); Map locationMap = new HashMap(); LinkedList selectedWines = new LinkedList(); Map imageMap = new HashMap(); ArrayList imageNames; int curSize; Cell curCell; String curImageName; static Connection conn; public WineDBClient(GraphicsDevice device) { try { GraphicsConfiguration gc = device.getDefaultConfiguration(); frmMain = new Frame(gc); frmMain.setUndecorated(true); frmMain.setIgnoreRepaint(true); device.setFullScreenWindow(frmMain); if (device.isDisplayChangeSupported()) Utils.chooseBestDisplayMode(device, RES_X, RES_Y); frmMain.addMouseListener(this); frmMain.addKeyListener(this); frmMain.createBufferStrategy(2); BufferStrategy bufferStrategy = frmMain.getBufferStrategy(); g = bufferStrategy.getDrawGraphics(); refreshRate = device.getDisplayMode().getRefreshRate(); Utils.init(gc, RUNNING_FROM_JAR); gameState = GameState.Main; auxState = AuxState.None; done = false; showFps = false; frameCount = 0; lastFrameCount = 0; lastFpsUpdate = System.nanoTime(); playerLoc = new Point(400, 300); selectedText = null; showCharacter = showInventory = showQuests = false; bounds = false; passable = false; minimizedGui = false; Toolkit tk = Toolkit.getDefaultToolkit(); frmMain.setCursor(tk.createCustomCursor(tk.createImage(""),new Point(),null)); loadGUI(bufferStrategy); loadImages(); loadWineList(); started = true; while (!done) { g = bufferStrategy.getDrawGraphics(); handleGameEvents(); render(g); detectMouseOver(g); if(frmMain.getMousePosition() != null) cursor.draw(g, frmMain.getMousePosition().x-5, frmMain.getMousePosition().y-2); g.dispose(); bufferStrategy.show(); frameCount++; if(System.nanoTime()-1000000000 >= lastFpsUpdate) { lastFpsUpdate = System.nanoTime(); lastFrameCount = frameCount; frameCount = 0; } } } catch (Exception e) { e.printStackTrace(); } finally { device.setFullScreenWindow(null); } } private static BufferedImage chopBottle(BufferedImage image) { BufferedImage dimg = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_ARGB); Graphics2D g = dimg.createGraphics(); g.setComposite(AlphaComposite.Src); g.drawImage(image, 0, 0, 24, 19, 0, 0, 24, 19, null); g.dispose(); return dimg; } private void loadGUI(BufferStrategy bufferStrategy) { font11 = new Font("Arial", Font.PLAIN, 11); font12 = new Font("Arial", Font.PLAIN, 12); font14 = new Font("Arial", Font.PLAIN, 14); font24 = new Font("Arial", Font.PLAIN, 24); fontTT = new Font("Courier New", Font.PLAIN, 11); guiFont12 = new Font("Garamond", Font.BOLD, 12); guiFont14 = new Font("Garamond", Font.BOLD, 14); m = g.getFontMetrics(guiFont12); try { Font fontCustom = Utils.loadFont("images/gui/ERASLGHT.TTF"); fontCustom11 = fontCustom.deriveFont(Font.PLAIN, 11); fontCustom12 = fontCustom.deriveFont(Font.PLAIN, 12); fontCustom14 = fontCustom.deriveFont(Font.PLAIN, 14); fontCustom16 = fontCustom.deriveFont(Font.PLAIN, 16); fontCustom18 = fontCustom.deriveFont(Font.PLAIN, 18); fontCustom24 = fontCustom.deriveFont(Font.PLAIN, 24); fontCustom30 = fontCustom.deriveFont(Font.PLAIN, 30); }catch(Exception e) { e.printStackTrace(); } yellowCursor = new DynamicImage("gui/cursor.png"); cursor = yellowCursor; Cell.bg = Utils.loadImg("140x160.png"); Cell.wideBg = Utils.loadImg("220x160.png"); bottle_icons = new BufferedImage[4][2]; iconEditor = Utils.loadImg("IconPopup.png"); bottle_icons[0][0] = Utils.loadImg("size icons/375unchecked.png"); bottle_icons[0][1] = Utils.loadImg("size icons/375checked.png"); bottle_icons[1][0] = Utils.loadImg("size icons/750unchecked.png"); bottle_icons[1][1] = Utils.loadImg("size icons/750checked.png"); bottle_icons[2][0] = Utils.loadImg("size icons/1500unchecked.png"); bottle_icons[2][1] = Utils.loadImg("size icons/1500checked.png"); bottle_icons[3][0] = Utils.loadImg("size icons/3000unchecked.png"); bottle_icons[3][1] = Utils.loadImg("size icons/3000checked.png"); addButton = Utils.loadImg("buttons/AddButton.png"); cancelButton = Utils.loadImg("buttons/CancelButton.png"); removeButton = Utils.loadImg("buttons/RemoveButton.png"); saveButton = Utils.loadImg("buttons/SaveButton.png"); nullImage = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB); wndMain = new Window("main", 0, 0, RES_X, RES_Y, true); wndMain.background = new DynamicImage("Wine GUI 1.png"); Textbox search = new Textbox("search", 1085, 242, 169, 30, "", fontCustom18, false); search.setBorder(false); Button close = new Button("close", RES_X-96, 0, 96, 96, Utils.loadImg("CloseButton.png")); wndMain.add(search); wndMain.add(close); wndEdit = new Window("edit", (RES_X-510)/2, 150, 510, 560, true); wndEdit.background = new DynamicImage("Wine Editor Background.png"); wndEdit.add(new Textbox("name", 102, 62, 120, 21, "", fontCustom16, false)); wndEdit.add(new Textbox("vineyard", 333, 62, 120, 21, "", fontCustom16, false)); wndEdit.add(new Textbox("country", 115, 130, 120, 21, "", fontCustom16, false)); wndEdit.add(new Textbox("region", 319, 130, 120, 21, "", fontCustom16, false)); wndEdit.add(new Textbox("variety", 105, 205, 120, 21, "", fontCustom16, false)); wndEdit.add(new Textbox("vintage", 316, 205, 50, 21, "", fontCustom16, false)); wndEdit.add(new Textbox("price", 110, 270, 50, 21, "", fontCustom16, false)); wndEdit.add(new Label("date added", 369, 268, 50, 21, "", fontCustom16, Color.white)); wndEdit.add(new Button("size1", 113, 392-46, 31, 46, bottle_icons[0][0])); wndEdit.add(new Button("size2", 164, 392-60, 41, 60, bottle_icons[1][0])); wndEdit.add(new Button("size3", 220, 392-74, 51, 74, bottle_icons[2][0])); wndEdit.add(new Button("size4", 283, 392-91, 63, 91, bottle_icons[3][0])); wndEdit.add(new Button("icon", 91, 433, 25, 24, null)); wndEdit.add(new Button("change_icon", 125, 438, 68, 19, Utils.loadImg("buttons/ChangeIcon.png"))); wndEdit.add(new Button("button1", 80, 495, 131, 32, addButton)); wndEdit.add(new Button("button2", 310, 495, 131, 32, cancelButton)); wndEdit.add(new Button("close", 449, 12, 51, 51, Utils.loadImg("SmallCloseButton.png"))); wndMessage = new Window("message", 290, 135, 220, 160); wndMessage.add(new Label("label", 20, 15, 180, 12, "none", font12, Align.Center)); wndMessage.add(new Button("button", 70, 115, 80, 30, "OK", font12, Align.Center)); wndDiagnostics = new Window("diagnostics", 0, 0, 400, 140, true); } private void loadImages() { File imageDir = new File("images/bottles"); File[] images = imageDir.listFiles(); for(int x=0; x 1) y += 24; if(row == 8-section) chopped = true; break; case 4: x = 880+29*(col-1); y = 237+149*(section-1)+24*(row-1); if(row == 6) chopped = true; break; } newBottle = new WineBottle(rs.getString("name"), getIndexedField(rs.getInt("winery_id"), "wineries"), rs.getInt("vintage"), getIndexedField(rs.getInt("country_id"), "countries"), getIndexedField(rs.getInt("region_id"), "regions"), getIndexedField(rs.getInt("variety_id"), "varieties"), rs.getString("date_added"), rs.getInt("size"), rs.getInt("price"), rs.getString("image")); if(!chopped) locationMap.put((x<<12) + y, new Cell(x, y, oldLoc, newBottle, imageMap.get(rs.getString("image"))[0], imageMap.get(rs.getString("image"))[2])); else locationMap.put((x<<12) + y, new Cell(x, y, oldLoc, newBottle, imageMap.get(rs.getString("image"))[1], imageMap.get(rs.getString("image"))[3])); wineMap.put(rs.getInt("id"), newBottle); } }catch(SQLException ex) { System.out.println("SQLException: " + ex.getMessage()); System.out.println("SQLState: " + ex.getSQLState()); System.out.println("VendorError: " + ex.getErrorCode()); ex.printStackTrace(); } } private synchronized void handleGameEvents() { switch(gameState) { } } ; private synchronized void render(Graphics g) { g.setColor(Color.black); g.fillRect(0, 0, RES_X, RES_Y); Point e; Iterator it; Cell cur; switch(gameState) { case Main: wndMain.draw(g); e = frmMain.getMousePosition(); it = locationMap.values().iterator(); Cell selected = null; while(it.hasNext()) { cur = it.next(); if(e != null && cur.getX() <= e.x && e.x < cur.getX()+25 && cur.getY() <= e.y && e.y < cur.getY()+24) { cur.drawBright(g); if(cur.bottle != null) selected = cur; }else cur.draw(g); } if(selected != null) selected.drawDescription(g, e.x, e.y, fontCustom14); break; case ChangeBottle: wndMain.draw(g); e = frmMain.getMousePosition(); it = locationMap.values().iterator(); while(it.hasNext()) { it.next().draw(g); } wndEdit.draw(g); break; case ChangeIcon: wndMain.draw(g); e = frmMain.getMousePosition(); it = locationMap.values().iterator(); while(it.hasNext()) { it.next().draw(g); } wndEdit.draw(g); g.drawImage(iconEditor, (RES_X-480)/2, 578, null); Iterator iter = imageMap.values().iterator(); int i=0, x=(RES_X-480)/2+2, y=580; while(iter.hasNext()) { if(x-2 <= e.x && e.x < x+28 && y-2 <= e.y && e.y < y+27) g.drawImage(iter.next()[2], x, y, null); else g.drawImage(iter.next()[0], x, y, null); x += 30; i ++; if(i >= 16) { x=(RES_X-480)/2+2; y += 29; i = 0; } } break; } switch(auxState) { case None: break; case MsgBox: wndMessage.draw(g); break; } if(showFps) drawDiagnostics(g); } public void showMessage(String text) { auxState = AuxState.MsgBox; ((Label) wndMessage.getMember("label")).setText(text); } private void drawDiagnostics(Graphics g) { wndDiagnostics.draw(g); g.setColor(Color.green); g.setFont(fontTT); g.drawString("Unthrottled FPS: "+lastFrameCount, 0, 15); g.drawString("Monitor Refresh Rate: "+refreshRate, 0, 30); } private void updateSelectedWines(String search) { Connection conn = null; Statement stmt = null; ResultSet rs = null; Iterator it = selectedWines.iterator(); while(it.hasNext()) it.next().unselect(); selectedWines.clear(); if(search.equals("")) return; try { conn = DriverManager.getConnection("jdbc:mysql://localhost/wines", "root", ""); stmt = conn.createStatement(); rs = stmt.executeQuery("SELECT id FROM wines WHERE name LIKE '%" + search + "%' AND cellar_location != 0"); WineBottle cur; while(rs.next()) { cur = wineMap.get(rs.getInt("id")); cur.select(); selectedWines.add(cur); } }catch(SQLException ex) { System.out.println("SQLException: " + ex.getMessage()); System.out.println("SQLState: " + ex.getSQLState()); System.out.println("VendorError: " + ex.getErrorCode()); ex.printStackTrace(); } } private synchronized void detectMouseOver(Graphics g) { Point e = frmMain.getMousePosition(); if(e == null) return; switch(gameState) { case Main: break; } } private synchronized void handleMouseInput(MouseEvent e) { if(!started) return; selectText(null); Iterator it; Cell cur; switch (auxState) { case None: switch (gameState) { case Main: if(wndMain.getMember("search").isClicked(e.getX(), e.getY())) selectText((Textbox)wndMain.getMember("search")); else if(wndMain.getMember("close").isClicked(e.getX(), e.getY())) done = true; it = locationMap.values().iterator(); while(it.hasNext()) { cur = it.next(); if(cur.getX() <= e.getX() && e.getX() < cur.getX()+25 && cur.getY() <= e.getY() && e.getY() < cur.getY()+24) { if(cur.bottle == null) { ((Textbox)wndEdit.getMember("name")).setText(""); ((Textbox)wndEdit.getMember("vineyard")).setText(""); ((Textbox)wndEdit.getMember("country")).setText(""); ((Textbox)wndEdit.getMember("region")).setText(""); ((Textbox)wndEdit.getMember("variety")).setText(""); ((Textbox)wndEdit.getMember("vintage")).setText(""); ((Textbox)wndEdit.getMember("price")).setText(""); if(curSize != -1) ((Button)wndEdit.getMember("size"+(curSize+1))).setImage(bottle_icons[curSize][0]); curSize = -1; Calendar calendar = Calendar.getInstance(); SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy"); ((Label)wndEdit.getMember("date added")).setText(dateFormat.format(calendar.getTime())); curImageName = ""; ((Button)wndEdit.getMember("icon")).setImage(nullImage); ((Button)wndEdit.getMember("button1")).setImage(addButton); ((Button)wndEdit.getMember("button2")).setImage(cancelButton); }else { ((Textbox)wndEdit.getMember("name")).setText(cur.bottle.getName()); ((Textbox)wndEdit.getMember("vineyard")).setText(cur.bottle.getVineyard()); ((Textbox)wndEdit.getMember("country")).setText(cur.bottle.getCountry()); ((Textbox)wndEdit.getMember("region")).setText(cur.bottle.getRegion()); ((Textbox)wndEdit.getMember("variety")).setText(cur.bottle.getVariety()); ((Textbox)wndEdit.getMember("vintage")).setText(Integer.toString(cur.bottle.getVintage())); switch(cur.bottle.getSize()) { case 375: curSize = 0; break; case 750: curSize = 1; break; case 1500: curSize = 2; break; case 3000: curSize = 3; break; } ((Button)wndEdit.getMember("size"+(curSize+1))).setImage(bottle_icons[curSize][1]); ((Textbox)wndEdit.getMember("price")).setText(Integer.toString(cur.bottle.getPrice())); ((Label)wndEdit.getMember("date added")).setText(cur.bottle.getDateAdded()); ((Button)wndEdit.getMember("icon")).setImage(imageMap.get(cur.bottle.getImageName())[0]); curImageName = cur.bottle.getImageName(); ((Button)wndEdit.getMember("button1")).setImage(saveButton); ((Button)wndEdit.getMember("button2")).setImage(removeButton); } curCell = cur; gameState = GameState.ChangeBottle; break; } } break; case ChangeBottle: if(wndEdit.getMember("name").isClicked(e.getX(), e.getY())) selectText((Textbox)wndEdit.getMember("name")); else if(wndEdit.getMember("vineyard").isClicked(e.getX(), e.getY())) selectText((Textbox)wndEdit.getMember("vineyard")); else if(wndEdit.getMember("country").isClicked(e.getX(), e.getY())) selectText((Textbox)wndEdit.getMember("country")); else if(wndEdit.getMember("region").isClicked(e.getX(), e.getY())) selectText((Textbox)wndEdit.getMember("region")); else if(wndEdit.getMember("variety").isClicked(e.getX(), e.getY())) selectText((Textbox)wndEdit.getMember("variety")); else if(wndEdit.getMember("vintage").isClicked(e.getX(), e.getY())) selectText((Textbox)wndEdit.getMember("vintage")); else if(wndEdit.getMember("price").isClicked(e.getX(), e.getY())) selectText((Textbox)wndEdit.getMember("price")); else if(wndEdit.getMember("change_icon").isClicked(e.getX(), e.getY())) gameState = GameState.ChangeIcon; else if(wndEdit.getMember("button1").isClicked(e.getX(), e.getY())) { if(curCell.bottle == null) { String name, winery, vintage, country, region, variety, location, date_added, date_drank, rating, price, image; int loc_num, rack, section, column, row, winery_id, country_id, region_id, variety_id, size; name = ((Textbox)wndEdit.getMember("name")).getText(); name = name.replace("'", "\\'"); if(name.equals("")) { showMessage("Name is blank"); return; } vintage = ((Textbox)wndEdit.getMember("vintage")).getText(); if(vintage.equals("")) { showMessage("No vintage specified"); return; } /*if(line.substring(0, 1).equals("\"")) { winery = line.substring(0, line.indexOf(",", line.lastIndexOf("\""))); line = line.substring(line.indexOf(",", line.lastIndexOf("\""))+1); winery = winery.substring(1, winery.length()-1); }else { winery = line.substring(0, line.indexOf(",")); line = line.substring(line.indexOf(",")+1); winery = winery.trim(); } winery_id = getId(winery, "wineries"); country = line.substring(0, line.indexOf(",")); line = line.substring(line.indexOf(",")+1); if(country.equals("U.S.A.")) country = "USA"; country_id = getId(country, "countries"); if(line.substring(0, 1).equals("\"")) { region = line.substring(0, line.indexOf(",", line.lastIndexOf("\""))); line = line.substring(line.indexOf(",", line.lastIndexOf("\""))+1); region = region.substring(1, region.length()-1); }else { region = line.substring(0, line.indexOf(",")); line = line.substring(line.indexOf(",")+1); region = region.trim(); } region_id = getId(region, "regions"); variety = line.substring(0, line.indexOf(",")); line = line.substring(line.indexOf(",")+1); variety_id = getId(variety, "varieties");*/ location = Integer.toString(curCell.getLocation()); /*rating = line.substring(0, line.indexOf(",")); line = line.substring(line.indexOf(",")+1);*/ date_drank = "0000-00-00"; size = 0; System.out.println("curSize is currently "+curSize); switch(curSize) { case 0: size = 375; break; case 1: size = 750; break; case 2: size = 1500; break; case 3: size = 3000; break; default: showMessage("No bottle size selected"); return; } price = ((Textbox)wndEdit.getMember("price")).getText(); if(price.equals("")) { showMessage("No price specified"); return; } image = curImageName; if(image.equals("")) { showMessage("No image selected"); return; } /*String winery_id_string, country_id_string, region_id_string, variety_id_string; if(winery_id == 0) winery_id_string = "NULL"; else winery_id_string = "'"+winery_id+"'"; if(country_id == 0) country_id_string = "NULL"; else country_id_string = "'"+country_id+"'"; if(region_id == 0) region_id_string = "NULL"; else region_id_string = "'"+region_id+"'"; if(variety_id == 0) variety_id_string = "NULL"; else variety_id_string = "'"+variety_id+"'";*/ System.out.println(location); try { Statement stmt = conn.createStatement(); stmt.executeUpdate("INSERT INTO wines (name, winery_id, vintage, country_id, region_id, variety_id, date_added, date_drank, size, price, image, cellar_location) VALUES ('"+name+"', NULL, '"+vintage+"', NULL, NULL, NULL, CURDATE(), '"+date_drank+"', '"+size+"', '"+price+"', '"+image+"', '"+location+"')"); //stmt.executeUpdate("INSERT INTO wines (name, winery_id, vintage, country_id, region_id, variety_id, date_added, date_drank, size, image, cellar_location) VALUES ('"+name+"', "+winery_id_string+", '"+vintage+"', "+country_id_string+", "+region_id_string+", "+variety_id_string+", '"+date_added+"', '"+date_drank+"', '"+size+"', '"+image+"', '"+loc_num+"')"); }catch(SQLException ex) { // handle any errors System.out.println("SQLException: " + ex.getMessage()); System.out.println("SQLState: " + ex.getSQLState()); System.out.println("VendorError: " + ex.getErrorCode()); } }else gameState = GameState.ChangeIcon; }else if(wndEdit.getMember("button2").isClicked(e.getX(), e.getY())) { if(curCell.bottle == null) { gameState = GameState.Main; }else gameState = GameState.ChangeIcon; }else if(wndEdit.getMember("close").isClicked(e.getX(), e.getY())) gameState = GameState.Main; else { for(int x=0; x<4; x++) { if(wndEdit.getMember("size"+(x+1)).isClicked(e.getX(), e.getY())) { if(curSize != -1) ((Button)wndEdit.getMember("size"+(curSize+1))).setImage(bottle_icons[curSize][0]); ((Button)wndEdit.getMember("size"+(x+1))).setImage(bottle_icons[x][1]); curSize = x; System.out.println("curSize set to "+curSize); } } } break; case ChangeIcon: int i = e.getX()-((RES_X-480)/2), j = e.getY()-578; if(0 <= i && 0 <= i/30 && i/30 < 16) { i /= 30; if(0 <= j && 0 <= j/29 && i+16*(j/29) < imageMap.values().size()) { ((Button)wndEdit.getMember("icon")).setImage(imageMap.values().toArray(new BufferedImage[0][0])[i+16*(j/29)][0]); curImageName = imageMap.keySet().toArray(new String[0])[i+16*(j/29)]; } } gameState = GameState.ChangeBottle; break; } break; case MsgBox: if (wndMessage.getMember("button").isClicked(e.getX(), e.getY())) auxState = AuxState.None; break; } } private synchronized void handleMouseRelease(MouseEvent e) { } private synchronized void handleKeyboardInput(KeyEvent e) { if (selectedText != null) { selectedText.handleEvent(e); if(selectedText == wndMain.getMember("search")) { updateSelectedWines(((Textbox)wndMain.getMember("search")).getText()); } }else if (e.getKeyCode() == KeyEvent.VK_ESCAPE) done = true; else if(e.getKeyCode() == KeyEvent.VK_S) showFps = !showFps; else if(e.getKeyCode() == KeyEvent.VK_X) { if(gameState == GameState.Main) gameState = GameState.ChangeBottle; else gameState = GameState.Main; } } public void mousePressed(MouseEvent e) { handleMouseInput(e); } public void mouseReleased(MouseEvent e) { handleMouseRelease(e); } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mouseClicked(MouseEvent e) { } public void keyTyped(KeyEvent e) { } public synchronized void keyPressed(KeyEvent e) { handleKeyboardInput(e); } public void keyReleased(KeyEvent e) { } private void selectText(Textbox text) { if (selectedText != null) selectedText.setSelected(false); selectedText = text; if (text != null) text.setSelected(true); } public static void main(String[] args) { try { PrintStream st = new PrintStream(new FileOutputStream("err.txt",true)); System.setErr(st); System.setOut(st); System.out.println("-----[ Session started on " + Utils.dateString() + " ]-----"); Class.forName("com.mysql.jdbc.Driver").newInstance(); conn = DriverManager.getConnection("jdbc:mysql://localhost/wines", "root", ""); GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice device = env.getDefaultScreenDevice(); new WineDBClient(device); } catch (Exception e) { e.printStackTrace(); } System.exit(0); } }