From d1ccee92ce4c1ed023c498b2957bc3a28bc5402d Mon Sep 17 00:00:00 2001 From: slapshot5 Date: Mon, 24 Oct 2011 03:54:52 +0000 Subject: [PATCH] In-Game downloading part 4: 1) add Booster pack image downloading into the quest downloads 2) begin refactor (The only real necessary difference in the downloaders is the getNeededCards(). The rest of the code was duplicate.) (Still work-in-progress) --- .gitattributes | 2 + res/main.properties | 2 + res/quest/booster-images.txt | 52 ++ .../java/forge/GuiDownloadQuestImages.java | 448 +----------------- src/main/java/forge/GuiDownloader.java | 430 +++++++++++++++++ .../java/forge/properties/NewConstants.java | 6 +- .../java/forge/view/swing/OldGuiNewGame.java | 3 +- 7 files changed, 519 insertions(+), 424 deletions(-) create mode 100644 res/quest/booster-images.txt create mode 100644 src/main/java/forge/GuiDownloader.java diff --git a/.gitattributes b/.gitattributes index 99946a458d3..ea4804fab97 100644 --- a/.gitattributes +++ b/.gitattributes @@ -9720,6 +9720,7 @@ res/pics_link/card-pictures_x.txt svneol=native#text/plain res/pics_link/card-pictures_y.txt svneol=native#text/plain res/pics_link/card-pictures_z.txt svneol=native#text/plain res/quest/all-prices.txt svneol=native#text/plain +res/quest/booster-images.txt -text res/quest/booster-prices.txt -text res/quest/decks/Abraham[!!-~]Lincoln[!!-~]3.dck -text res/quest/decks/Albert[!!-~]Einstein[!!-~]2.dck -text @@ -10176,6 +10177,7 @@ src/main/java/forge/GameEntity.java -text src/main/java/forge/GuiDisplay4.java svneol=native#text/plain src/main/java/forge/GuiDisplayUtil.java svneol=native#text/plain src/main/java/forge/GuiDownloadQuestImages.java -text +src/main/java/forge/GuiDownloader.java -text src/main/java/forge/GuiInput.java svneol=native#text/plain src/main/java/forge/Gui_DownloadPictures_LQ.java svneol=native#text/plain src/main/java/forge/Gui_DownloadPrices.java svneol=native#text/plain diff --git a/res/main.properties b/res/main.properties index 36bba05f513..13a4345ae7a 100644 --- a/res/main.properties +++ b/res/main.properties @@ -61,6 +61,8 @@ lang--transparent-properties=lang/lang.properties image/base--file=pics image/token--file=pics/tokens image/icon--file=pics/icons +pics/booster--file=pics/booster +pics/booster/images--file=quest/booster-images.txt symbols/small--file=images/symbols-13 sound/base--file=sound diff --git a/res/quest/booster-images.txt b/res/quest/booster-images.txt new file mode 100644 index 00000000000..2f8a8d05b1e --- /dev/null +++ b/res/quest/booster-images.txt @@ -0,0 +1,52 @@ +http://www.cardforge.org/fpics/booster/10E.png +http://www.cardforge.org/fpics/booster/5DN.png +http://www.cardforge.org/fpics/booster/7E.png +http://www.cardforge.org/fpics/booster/8ED.png +http://www.cardforge.org/fpics/booster/9ED.png +http://www.cardforge.org/fpics/booster/ALA.png +http://www.cardforge.org/fpics/booster/AP.png +http://www.cardforge.org/fpics/booster/ARB.png +http://www.cardforge.org/fpics/booster/BOK.png +http://www.cardforge.org/fpics/booster/CFX.png +http://www.cardforge.org/fpics/booster/CHK.png +http://www.cardforge.org/fpics/booster/CSP.png +http://www.cardforge.org/fpics/booster/DIS.png +http://www.cardforge.org/fpics/booster/DPA.png +http://www.cardforge.org/fpics/booster/DST.png +http://www.cardforge.org/fpics/booster/EVE.png +http://www.cardforge.org/fpics/booster/EX.png +http://www.cardforge.org/fpics/booster/FUT.png +http://www.cardforge.org/fpics/booster/GPT.png +http://www.cardforge.org/fpics/booster/IN.png +http://www.cardforge.org/fpics/booster/JUD.png +http://www.cardforge.org/fpics/booster/LGN.png +http://www.cardforge.org/fpics/booster/LRW.png +http://www.cardforge.org/fpics/booster/M10.png +http://www.cardforge.org/fpics/booster/M11.png +http://www.cardforge.org/fpics/booster/M12.png +http://www.cardforge.org/fpics/booster/MBS.png +http://www.cardforge.org/fpics/booster/MI.png +http://www.cardforge.org/fpics/booster/MOR.png +http://www.cardforge.org/fpics/booster/MRD.png +http://www.cardforge.org/fpics/booster/NPH.png +http://www.cardforge.org/fpics/booster/OD.png +http://www.cardforge.org/fpics/booster/ONS.png +http://www.cardforge.org/fpics/booster/PLC.png +http://www.cardforge.org/fpics/booster/PS.png +http://www.cardforge.org/fpics/booster/RAV.png +http://www.cardforge.org/fpics/booster/ROE.png +http://www.cardforge.org/fpics/booster/SCG.png +http://www.cardforge.org/fpics/booster/SHM.png +http://www.cardforge.org/fpics/booster/SOK.png +http://www.cardforge.org/fpics/booster/SOM.png +http://www.cardforge.org/fpics/booster/ST.png +http://www.cardforge.org/fpics/booster/TE.png +http://www.cardforge.org/fpics/booster/TOR.png +http://www.cardforge.org/fpics/booster/TSP.png +http://www.cardforge.org/fpics/booster/UD.png +http://www.cardforge.org/fpics/booster/UL.png +http://www.cardforge.org/fpics/booster/UZ.png +http://www.cardforge.org/fpics/booster/VI.png +http://www.cardforge.org/fpics/booster/WL.png +http://www.cardforge.org/fpics/booster/WWK.png +http://www.cardforge.org/fpics/booster/ZEN.png \ No newline at end of file diff --git a/src/main/java/forge/GuiDownloadQuestImages.java b/src/main/java/forge/GuiDownloadQuestImages.java index f2f98f2c03f..f06cfb86ddd 100644 --- a/src/main/java/forge/GuiDownloadQuestImages.java +++ b/src/main/java/forge/GuiDownloadQuestImages.java @@ -1,31 +1,13 @@ package forge; -import com.esotericsoftware.minlog.Log; -import forge.error.ErrorViewer; import forge.properties.ForgeProps; -import forge.properties.NewConstants; -import javax.swing.*; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; +import java.io.File; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.*; -import java.net.ConnectException; -import java.net.InetSocketAddress; -import java.net.MalformedURLException; -import java.net.Proxy; -import java.net.URL; import java.util.ArrayList; -import java.util.Random; -import java.util.StringTokenizer; -import static java.lang.Integer.parseInt; -import static javax.swing.JOptionPane.DEFAULT_OPTION; -import static javax.swing.JOptionPane.PLAIN_MESSAGE; +import javax.swing.JFrame; /** @@ -33,431 +15,53 @@ import static javax.swing.JOptionPane.PLAIN_MESSAGE; * * @author Forge */ -public class GuiDownloadQuestImages extends DefaultBoundedRangeModel implements Runnable, NewConstants, NewConstants.LANG.Gui_DownloadPictures { +public class GuiDownloadQuestImages extends GuiDownloader { private static final long serialVersionUID = -8596808503046590349L; - /** Constant types */ - public static final Proxy.Type[] types = Proxy.Type.values(); - - //proxy - private int type; - private JTextField addr, port; - - //progress - private mCard[] cards; - private int card; - private boolean cancel; - private JProgressBar bar; - - private JOptionPane dlg; - private JButton close; - - private long times[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - private int tptr = 0; - private long lTime = System.currentTimeMillis(); - - /** - *

getAverageTimePerCard.

- * - * @return a int. - */ - private int getAverageTimePerCard() { - int aTime = 0; - int nz = 10; - - if (tptr > 9) - tptr = 0; - - times[tptr] = System.currentTimeMillis() - lTime; - lTime = System.currentTimeMillis(); - - int tTime = 0; - for (int i = 0; i < 10; i++) { - tTime += times[i]; - if (times[i] == 0) - nz--; - } - aTime = tTime / nz; - - tptr++; - - return aTime; - } - /** *

Constructor for GuiDownloadQuestImages.

* - * @param c an array of {@link forge.Gui_DownloadSetPictures_LQ.mCard} objects. + * @param frame a array of {@link javax.swing.JFrame} objects. */ - private GuiDownloadQuestImages(mCard[] c) { - this.cards = c; - addr = new JTextField(ForgeProps.getLocalized(PROXY_ADDRESS)); - port = new JTextField(ForgeProps.getLocalized(PROXY_PORT)); - bar = new JProgressBar(this); - - JPanel p0 = new JPanel(); - p0.setLayout(new BoxLayout(p0, BoxLayout.Y_AXIS)); - - //Proxy Choice - ButtonGroup bg = new ButtonGroup(); - String[] labels = { - ForgeProps.getLocalized(NO_PROXY), ForgeProps.getLocalized(HTTP_PROXY), - ForgeProps.getLocalized(SOCKS_PROXY)}; - for (int i = 0; i < types.length; i++) { - JRadioButton rb = new JRadioButton(labels[i]); - rb.addChangeListener(new ProxyHandler(i)); - bg.add(rb); - p0.add(rb); - if (i == 0) rb.setSelected(true); - } - - //Proxy config - p0.add(addr); - p0.add(port); - - //Start - final JButton b = new JButton(ForgeProps.getLocalized(BUTTONS.START)); - b.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - new Thread(GuiDownloadQuestImages.this).start(); - b.setEnabled(false); - } - }); - - p0.add(Box.createVerticalStrut(5)); - - //Progress - p0.add(bar); - bar.setStringPainted(true); - //bar.setString(ForgeProps.getLocalized(BAR_BEFORE_START)); - bar.setString(card + "/" + cards.length); - //bar.setString(String.format(ForgeProps.getLocalized(card == cards.length? BAR_CLOSE:BAR_WAIT), this.card, cards.length)); - Dimension d = bar.getPreferredSize(); - d.width = 300; - bar.setPreferredSize(d); - - //JOptionPane - Object[] options = {b, close = new JButton(ForgeProps.getLocalized(BUTTONS.CANCEL))}; - dlg = new JOptionPane(p0, DEFAULT_OPTION, PLAIN_MESSAGE, null, options, options[1]); + public GuiDownloadQuestImages(final JFrame frame) { + super(frame); } - /** {@inheritDoc} */ - @Override - public int getMinimum() { - return 0; - } - - /** {@inheritDoc} */ - @Override - public int getValue() { - return card; - } - - /** {@inheritDoc} */ - @Override - public int getExtent() { - return 0; - } - - /** {@inheritDoc} */ - @Override - public int getMaximum() { - return cards == null ? 0 : cards.length; - } - - /** - *

update.

- * - * @param card a int. - */ - private void update(int card) { - this.card = card; - - final class Worker implements Runnable { - private int card; - - Worker(int card) { - this.card = card; - } - - public void run() { - fireStateChanged(); - - StringBuilder sb = new StringBuilder(); - - int a = getAverageTimePerCard(); - - if (card != cards.length) { - sb.append(card + "/" + cards.length + " - "); - - long t2Go = (cards.length - card) * a; - - boolean secOnly = true; - if (t2Go > 3600000) { - sb.append(String.format("%02d:", t2Go / 3600000)); - t2Go = t2Go % 3600000; - secOnly = false; - } - if (t2Go > 60000) { - sb.append(String.format("%02d:", t2Go / 60000)); - t2Go = t2Go % 60000; - secOnly = false; - } - if (!secOnly) - sb.append(String.format("%02d remaining.", t2Go / 1000)); - else - sb.append(String.format("0:%02d remaining.", t2Go / 1000)); - } else - sb.append(String.format(ForgeProps.getLocalized(BAR_CLOSE), card, cards.length)); - - bar.setString(sb.toString()); - //bar.setString(String.format(ForgeProps.getLocalized(card == cards.length? BAR_CLOSE:BAR_WAIT), card, - // cards.length)); - System.out.println(card + "/" + cards.length + " - " + a); - } - } - ; - EventQueue.invokeLater(new Worker(card)); - } - - /** - *

Getter for the field dlg.

- * - * @param frame a {@link javax.swing.JFrame} object. - * @return a {@link javax.swing.JDialog} object. - */ - public JDialog getDlg(JFrame frame) { - final JDialog dlg = this.dlg.createDialog(frame, ForgeProps.getLocalized(TITLE)); - close.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - dlg.setVisible(false); - } - }); - return dlg; - } - - /** - *

Setter for the field cancel.

- * - * @param cancel a boolean. - */ - public void setCancel(boolean cancel) { - this.cancel = cancel; - } - - - /** - *

run.

- */ - public void run() { - BufferedInputStream in; - BufferedOutputStream out; - - //File base = ForgeProps.getFile(QUEST.OPPONENT_DIR); - - Random r = MyRandom.random; - - Proxy p = null; - if (type == 0) p = Proxy.NO_PROXY; - else try { - p = new Proxy(types[type], new InetSocketAddress(addr.getText(), parseInt(port.getText()))); - } catch (Exception ex) { - ErrorViewer.showError(ex, ForgeProps.getLocalized(ERRORS.PROXY_CONNECT), addr.getText(), - port.getText()); - return; - } - - if (p != null) { - byte[] buf = new byte[1024]; - int len; - //System.out.println("basedir: " + base); - for (update(0); card < cards.length && !cancel; update(card + 1)) { - try { - String url = cards[card].url; - String cName; - //base = ForgeProps.getFile(IMAGE_BASE); - cName = cards[card].name; - //if (Constant.Runtime.DevMode[0]) - // System.out.println(cName + " - " + url); - cName = cName.replace("%20"," "); - - File base = new File(cards[card].folder); - File f = new File(base, cName); - - System.out.println("Trying to download: "+cName+" "+cards[card].folder+" "+url); - - //test for folder existenceFile test = new File(base, cards[card].folder); - if (!base.exists()) { - // create folder - if (!base.mkdir()) - System.out.println("Can't create folder" + cards[card].folder); - } - - try { - in = new BufferedInputStream(new URL(url).openConnection(p).getInputStream()); - out = new BufferedOutputStream(new FileOutputStream(f)); - - while ((len = in.read(buf)) != -1) { - //user cancelled - if (cancel) { - in.close(); - out.flush(); - out.close(); - - //delete what was written so far - f.delete(); - - return; - }//if - cancel - - out.write(buf, 0, len); - }//while - read and write file - - in.close(); - out.flush(); - out.close(); - } - catch (ConnectException ce) { - System.out.println("Connection refused for url: " + url); - } - catch (MalformedURLException mURLe) { - System.out.println("Error - possibly missing URL for: " + cards[card].name); - //Log.error("LQ Pictures", "Malformed URL for: "+cards[card].name, mURLe); - } - } catch (FileNotFoundException fnfe) { - System.out.println("Error - the LQ picture for " + cards[card].name + " could not be found on the server. [" + cards[card].url + "] - " + fnfe.getMessage()); - } catch (Exception ex) { - Log.error("LQ Pictures", "Error downloading pictures", ex); - } - - // pause - - try { - Thread.sleep(r.nextInt(750) + 420); - } catch (InterruptedException e) { - Log.error("Quest Image Download", "Sleep Error", e); - } - }//for - } - close.setText(ForgeProps.getLocalized(BUTTONS.CLOSE)); - }//run - - /** - *

startDownload.

- * - * @param frame a {@link javax.swing.JFrame} object. - */ - public static void startDownload(JFrame frame) { - final mCard[] card = getNeededImages(); - - if (card.length == 0) { - JOptionPane.showMessageDialog(frame, ForgeProps.getLocalized(NO_MORE)); - return; - } - - GuiDownloadQuestImages download = new GuiDownloadQuestImages(card); - JDialog dlg = download.getDlg(frame); - dlg.setVisible(true); - dlg.dispose(); - download.setCancel(true); - }//startDownload() - /** *

getNeededCards.

* * @return an array of {@link forge.Gui_DownloadSetPictures_LQ.mCard} objects. */ - private static mCard[] getNeededImages() { + protected final DownloadObject[] getNeededImages() { //read all card names and urls - mCard[] questOpponents = readFile(QUEST.OPPONENT_ICONS, ForgeProps.getFile(QUEST.OPPONENT_DIR)); - ArrayList urls = new ArrayList(); + DownloadObject[] questOpponents = readFile(QUEST.OPPONENT_ICONS, ForgeProps.getFile(QUEST.OPPONENT_DIR)); + DownloadObject[] boosterImages = readFile(PICS_BOOSTER_IMAGES, ForgeProps.getFile(PICS_BOOSTER)); + ArrayList urls = new ArrayList(); - //File imgBase = ForgeProps.getFile(NewConstants.IMAGE_BASE); - //File opponents = ForgeProps.getFile(NewConstants.QUEST.OPPONENTS); - File file; - File base = ForgeProps.getFile(QUEST.OPPONENT_DIR); + File dir = ForgeProps.getFile(QUEST.OPPONENT_DIR); for (int i = 0; i < questOpponents.length; i++) { - file = new File(base, questOpponents[i].name); - if (!file.exists()) urls.add(questOpponents[i]); + file = new File(dir, questOpponents[i].name.replace("%20", " ")); + if (!file.exists()) { + urls.add(questOpponents[i]); + } + } + + dir = ForgeProps.getFile(PICS_BOOSTER); + for (int i = 0; i < boosterImages.length; i++) { + file = new File(dir, boosterImages[i].name.replace("%20", " ")); + if (!file.exists()) { + urls.add(boosterImages[i]); + } } //return all card names and urls that are needed - mCard[] out = new mCard[urls.size()]; + DownloadObject[] out = new DownloadObject[urls.size()]; urls.toArray(out); - for (int i = 0; i < out.length; i++) { System.out.println(out[i].name + " " + out[i].url); } - return out; - }//getNeededCards() + } //getNeededCards() - /** - *

readFile.

- * - * @param ABC a {@link java.lang.String} object. - * @return an array of {@link forge.Gui_DownloadSetPictures_LQ.mCard} objects. - */ - private static mCard[] readFile(String filename, File dir) { - try { - FileReader zrc = new FileReader(ForgeProps.getFile(filename)); - BufferedReader in = new BufferedReader(zrc); - String line; - ArrayList list = new ArrayList(); - StringTokenizer tok; - - line = in.readLine(); - while (line != null && (!line.equals("")) && !line.startsWith("#")) { - tok = new StringTokenizer(line, "/"); - String last = null; - while(tok.hasMoreTokens()) { - last = tok.nextToken(); - } - list.add(new mCard(last, line, dir.getPath())); - //URL url = new URL(line); - System.out.println("Creating new mCard with: "+last+" "+line+" "+dir.getPath()); - //list.add(new mCard(url.getFile(), url.toString(), dir.getPath())); - - line = in.readLine(); - } - - mCard[] out = new mCard[list.size()]; - list.toArray(out); - return out; - - } catch (Exception ex) { - ErrorViewer.showError(ex, "Gui_DownloadPictures: readFile() error"); - throw new RuntimeException("Gui_DownloadPictures : readFile() error"); - } - }//readFile() - - private class ProxyHandler implements ChangeListener { - private int type; - - public ProxyHandler(int type) { - this.type = type; - } - - public void stateChanged(ChangeEvent e) { - if (((AbstractButton) e.getSource()).isSelected()) { - GuiDownloadQuestImages.this.type = type; - addr.setEnabled(type != 0); - port.setEnabled(type != 0); - } - } - } - - private static class mCard { - final public String name; - final public String url; - final public String folder; - - mCard(String cardName, String cardURL, String cardFolder) { - name = cardName; - url = cardURL; - folder = cardFolder; - } - }//mCard -} +} //end class GuiDownloadQuestImages diff --git a/src/main/java/forge/GuiDownloader.java b/src/main/java/forge/GuiDownloader.java new file mode 100644 index 00000000000..6460a16ef14 --- /dev/null +++ b/src/main/java/forge/GuiDownloader.java @@ -0,0 +1,430 @@ +package forge; + +import com.esotericsoftware.minlog.Log; + +import forge.error.ErrorViewer; +import forge.properties.ForgeProps; +import forge.properties.NewConstants; + +import javax.swing.*; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; + +import java.awt.Dimension; +import java.awt.EventQueue; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.net.ConnectException; +import java.net.InetSocketAddress; +import java.net.MalformedURLException; +import java.net.Proxy; +import java.net.URL; +import java.util.ArrayList; +import java.util.Random; +import java.util.StringTokenizer; + +import static java.lang.Integer.parseInt; +import static javax.swing.JOptionPane.DEFAULT_OPTION; +import static javax.swing.JOptionPane.PLAIN_MESSAGE; + + +/** + *

GuiDownloadQuestImages class.

+ * + * @author Forge + */ +public abstract class GuiDownloader extends DefaultBoundedRangeModel implements Runnable, NewConstants, NewConstants.LANG.Gui_DownloadPictures { + + private static final long serialVersionUID = -8596808503046590349L; + + /** Constant types */ + public static final Proxy.Type[] types = Proxy.Type.values(); + + //proxy + protected int type; + protected JTextField addr, port; + + //progress + protected DownloadObject[] cards; + protected int card; + protected boolean cancel; + protected JProgressBar bar; + + protected JOptionPane dlg; + protected JButton close; + + protected long times[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + protected int tptr = 0; + protected long lTime = System.currentTimeMillis(); + + /** + *

getAverageTimePerObject.

+ * + * @return a int. + */ + protected int getAverageTimePerObject() { + int aTime = 0; + int nz = 10; + + if (tptr > 9) + tptr = 0; + + times[tptr] = System.currentTimeMillis() - lTime; + lTime = System.currentTimeMillis(); + + int tTime = 0; + for (int i = 0; i < 10; i++) { + tTime += times[i]; + if (times[i] == 0) + nz--; + } + aTime = tTime / nz; + + tptr++; + + return aTime; + } + + + /** + *

Constructor for GuiDownloader.

+ * + * @param frame a {@link javax.swing.JFrame} object. + */ + protected GuiDownloader(final JFrame frame) { + + cards = getNeededImages(); + + if (cards.length == 0) { + JOptionPane.showMessageDialog(frame, ForgeProps.getLocalized(NO_MORE)); + return; + } + + addr = new JTextField(ForgeProps.getLocalized(PROXY_ADDRESS)); + port = new JTextField(ForgeProps.getLocalized(PROXY_PORT)); + bar = new JProgressBar(this); + + JPanel p0 = new JPanel(); + p0.setLayout(new BoxLayout(p0, BoxLayout.Y_AXIS)); + + //Proxy Choice + ButtonGroup bg = new ButtonGroup(); + String[] labels = { + ForgeProps.getLocalized(NO_PROXY), ForgeProps.getLocalized(HTTP_PROXY), + ForgeProps.getLocalized(SOCKS_PROXY)}; + for (int i = 0; i < types.length; i++) { + JRadioButton rb = new JRadioButton(labels[i]); + rb.addChangeListener(new ProxyHandler(i)); + bg.add(rb); + p0.add(rb); + if (i == 0) rb.setSelected(true); + } + + //Proxy config + p0.add(addr); + p0.add(port); + + //Start + final JButton b = new JButton(ForgeProps.getLocalized(BUTTONS.START)); + b.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) { + new Thread(GuiDownloader.this).start(); + b.setEnabled(false); + } + }); + + p0.add(Box.createVerticalStrut(5)); + + //Progress + p0.add(bar); + bar.setStringPainted(true); + //bar.setString(ForgeProps.getLocalized(BAR_BEFORE_START)); + bar.setString(card + "/" + cards.length); + //bar.setString(String.format(ForgeProps.getLocalized(card == cards.length? BAR_CLOSE:BAR_WAIT), this.card, cards.length)); + Dimension d = bar.getPreferredSize(); + d.width = 300; + bar.setPreferredSize(d); + + //JOptionPane + Object[] options = {b, close = new JButton(ForgeProps.getLocalized(BUTTONS.CANCEL))}; + dlg = new JOptionPane(p0, DEFAULT_OPTION, PLAIN_MESSAGE, null, options, options[1]); + + JDialog jdlg = getDlg(frame); + jdlg.setVisible(true); + jdlg.dispose(); + setCancel(true); + } + + /** {@inheritDoc} */ + @Override + public int getMinimum() { + return 0; + } + + /** {@inheritDoc} */ + @Override + public int getValue() { + return card; + } + + /** {@inheritDoc} */ + @Override + public int getExtent() { + return 0; + } + + /** {@inheritDoc} */ + @Override + public int getMaximum() { + return cards == null ? 0 : cards.length; + } + + /** + *

update.

+ * + * @param card a int. + */ + private void update(int card) { + this.card = card; + + final class Worker implements Runnable { + private int card; + + Worker(int card) { + this.card = card; + } + + public void run() { + fireStateChanged(); + + StringBuilder sb = new StringBuilder(); + + int a = getAverageTimePerObject(); + + if (card != cards.length) { + sb.append(card + "/" + cards.length + " - "); + + long t2Go = (cards.length - card) * a; + + boolean secOnly = true; + if (t2Go > 3600000) { + sb.append(String.format("%02d:", t2Go / 3600000)); + t2Go = t2Go % 3600000; + secOnly = false; + } + if (t2Go > 60000) { + sb.append(String.format("%02d:", t2Go / 60000)); + t2Go = t2Go % 60000; + secOnly = false; + } + if (!secOnly) + sb.append(String.format("%02d remaining.", t2Go / 1000)); + else + sb.append(String.format("0:%02d remaining.", t2Go / 1000)); + } else + sb.append(String.format(ForgeProps.getLocalized(BAR_CLOSE), card, cards.length)); + + bar.setString(sb.toString()); + System.out.println(card + "/" + cards.length + " - " + a); + } + } + ; + EventQueue.invokeLater(new Worker(card)); + } + + /** + *

Getter for the field dlg.

+ * + * @param frame a {@link javax.swing.JFrame} object. + * @return a {@link javax.swing.JDialog} object. + */ + private JDialog getDlg(JFrame frame) { + final JDialog dlg = this.dlg.createDialog(frame, ForgeProps.getLocalized(TITLE)); + close.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + dlg.setVisible(false); + } + }); + return dlg; + } + + /** + *

Setter for the field cancel.

+ * + * @param cancel a boolean. + */ + public void setCancel(boolean cancel) { + this.cancel = cancel; + } + + + /** + *

run.

+ */ + public void run() { + BufferedInputStream in; + BufferedOutputStream out; + + Random r = MyRandom.random; + + Proxy p = null; + if (type == 0) p = Proxy.NO_PROXY; + else try { + p = new Proxy(types[type], new InetSocketAddress(addr.getText(), parseInt(port.getText()))); + } catch (Exception ex) { + ErrorViewer.showError(ex, ForgeProps.getLocalized(ERRORS.PROXY_CONNECT), addr.getText(), + port.getText()); + return; + } + + if (p != null) { + byte[] buf = new byte[1024]; + int len; + for (update(0); card < cards.length && !cancel; update(card + 1)) { + try { + String url = cards[card].url; + String cName; + cName = cards[card].name; + cName = cName.replace("%20"," "); + + File base = new File(cards[card].dir); + File f = new File(base, cName); + + //test for folder existence + if (!base.exists()) { + // create folder + if (!base.mkdir()) { + System.out.println("Can't create folder" + cards[card].dir); + } + } + + try { + in = new BufferedInputStream(new URL(url).openConnection(p).getInputStream()); + out = new BufferedOutputStream(new FileOutputStream(f)); + + while ((len = in.read(buf)) != -1) { + //user cancelled + if (cancel) { + in.close(); + out.flush(); + out.close(); + + //delete what was written so far + f.delete(); + + return; + }//if - cancel + + out.write(buf, 0, len); + }//while - read and write file + + in.close(); + out.flush(); + out.close(); + } + catch (ConnectException ce) { + System.out.println("Connection refused for url: " + url); + } + catch (MalformedURLException mURLe) { + System.out.println("Error - possibly missing URL for: " + cards[card].name); + } + } catch (FileNotFoundException fnfe) { + System.out.println("Error - the LQ picture for " + cards[card].name + " could not be found on the server. [" + cards[card].url + "] - " + fnfe.getMessage()); + } catch (Exception ex) { + Log.error("LQ Pictures", "Error downloading pictures", ex); + } + + // throttle + try { + Thread.sleep(r.nextInt(750) + 420); + } catch (InterruptedException e) { + Log.error("GuiDownloader", "Sleep Error", e); + } + }//for + } + close.setText(ForgeProps.getLocalized(BUTTONS.CLOSE)); + }//run + + /** + *

getNeededCards.

+ * + * @return an array of {@link forge.GuiDownloader.DownloadObject} objects. + */ + protected abstract DownloadObject[] getNeededImages(); + + /** + *

readFile.

+ * + * @param filename a {@link java.lang.String} object. + * @param dir a {@link java.util.File} object. + * @return an array of {@link forge.GuiDownloader.DownloadObject} objects. + */ + protected static DownloadObject[] readFile(String filename, File dir) { + try { + FileReader zrc = new FileReader(ForgeProps.getFile(filename)); + BufferedReader in = new BufferedReader(zrc); + ArrayList list = new ArrayList(); + + String line; + StringTokenizer tok; + + line = in.readLine(); + while (line != null && (!line.equals("")) && !line.startsWith("#")) { + tok = new StringTokenizer(line, "/"); + + //Maybe there's a better way to do this, but I just want the filename from a URL + String last = null; + while(tok.hasMoreTokens()) { + last = tok.nextToken(); + } + list.add(new DownloadObject(last, line, dir.getPath())); + + line = in.readLine(); + } + + DownloadObject[] out = new DownloadObject[list.size()]; + list.toArray(out); + return out; + + } catch (Exception ex) { + ErrorViewer.showError(ex, "GuiDownloader: readFile() error"); + throw new RuntimeException("GuiDownloader : readFile() error"); + } + }//readFile() + + protected class ProxyHandler implements ChangeListener { + private int type; + + public ProxyHandler(int type) { + this.type = type; + } + + public void stateChanged(ChangeEvent e) { + if (((AbstractButton) e.getSource()).isSelected()) { + GuiDownloader.this.type = type; + addr.setEnabled(type != 0); + port.setEnabled(type != 0); + } + } + } + + protected static class DownloadObject { + final public String name; + final public String url; + final public String dir; + + DownloadObject(String nameIn, String urlIn, String dirIn) { + name = nameIn; + url = urlIn; + dir = dirIn; + } + }//DownloadObject +} diff --git a/src/main/java/forge/properties/NewConstants.java b/src/main/java/forge/properties/NewConstants.java index 35a1078f3e0..65c5f294649 100644 --- a/src/main/java/forge/properties/NewConstants.java +++ b/src/main/java/forge/properties/NewConstants.java @@ -88,7 +88,7 @@ public interface NewConstants { String CARD_PICTURES_OTHER = "card-pictures_other"; /** Constant CARD_PICTURES_TOKEN_HQ="card-pictures_token_hq". */ String CARD_PICTURES_TOKEN_HQ = "card-pictures_token_hq"; - /** Constant CARD_PICTURES_TOKEN_HQ="card-pictures_token_hq". */ + /** Constant TOKEN_IMAGES="token-images". */ String TOKEN_IMAGES = "token-images"; /** Constant CARDS="cards". */ String CARDS = "cards"; @@ -110,6 +110,10 @@ public interface NewConstants { String IMAGE_TOKEN = "image/token"; /** Constant IMAGE_ICON="image/icon". */ String IMAGE_ICON = "image/icon"; + /** Constant PICS_BOOSTER="pics/booster". */ + String PICS_BOOSTER = "pics/booster"; + /** Constant PICS_BOOSTER_IMAGES="pics/booster/images". */ + String PICS_BOOSTER_IMAGES = "pics/booster/images"; /** Constant SOUND_BASE="sound/base". */ String SOUND_BASE = "sound/base"; diff --git a/src/main/java/forge/view/swing/OldGuiNewGame.java b/src/main/java/forge/view/swing/OldGuiNewGame.java index 7691f2b54b9..a1fd75a4d83 100644 --- a/src/main/java/forge/view/swing/OldGuiNewGame.java +++ b/src/main/java/forge/view/swing/OldGuiNewGame.java @@ -1139,7 +1139,8 @@ public class OldGuiNewGame extends JFrame implements NewConstants, NewConstants. * */ public final void actionPerformed(final ActionEvent e) { - GuiDownloadQuestImages.startDownload(null); + //GuiDownloadQuestImages.startDownload(null); + new GuiDownloadQuestImages(null); } }