diff --git a/res/token-images.txt b/res/token-images.txt
index 00fedbbf51f..54334d2cd1f 100644
--- a/res/token-images.txt
+++ b/res/token-images.txt
@@ -1,180 +1,174 @@
-[T]b_0_0_germ.jpg http://www.cardforge.org/fpics/tokens/b_0_0_germ.jpg
-[T]b_0_1_insect.jpg http://www.cardforge.org/fpics/tokens/b_0_1_insect.jpg
-[T]b_0_1_serf.jpg http://www.cardforge.org/fpics/tokens/b_0_1_serf.jpg
-[T]b_0_1_thrull.jpg http://www.cardforge.org/fpics/tokens/b_0_1_thrull.jpg
-[T]b_1_1_bat.jpg http://www.cardforge.org/fpics/tokens/b_1_1_bat.jpg
-[T]b_1_1_faerie_rogue.jpg http://www.cardforge.org/fpics/tokens/b_1_1_faerie_rogue.jpg
-[T]b_1_1_festering_goblin.jpg http://www.cardforge.org/fpics/tokens/b_1_1_festering_goblin.jpg
-[T]b_1_1_goblin_rogue.jpg http://www.cardforge.org/fpics/tokens/b_1_1_goblin_rogue.jpg
-[T]b_1_1_minion.jpg http://www.cardforge.org/fpics/tokens/b_1_1_minion.jpg
-[T]b_1_1_rat.jpg http://www.cardforge.org/fpics/tokens/b_1_1_rat.jpg
-[T]b_1_1_skeleton.jpg http://www.cardforge.org/fpics/tokens/b_1_1_skeleton.jpg
-[T]b_1_1_thrull.jpg http://www.cardforge.org/fpics/tokens/b_1_1_thrull.jpg
-[T]b_1_2_bat.jpg http://www.cardforge.org/fpics/tokens/b_1_2_bat.jpg
-[T]b_20_20_marit_lage.jpg http://www.cardforge.org/fpics/tokens/b_20_20_marit_lage.jpg
-[T]b_2_1_cat.jpg http://www.cardforge.org/fpics/tokens/b_2_1_cat.jpg
-[T]b_2_2_zombie.jpg http://www.cardforge.org/fpics/tokens/b_2_2_zombie.jpg
-[T]b_2_4_spider.jpg http://www.cardforge.org/fpics/tokens/b_2_4_spider.jpg
-[T]b_3_3_angel.jpg http://www.cardforge.org/fpics/tokens/b_3_3_angel.jpg
-[T]b_3_3_kavu.jpg http://www.cardforge.org/fpics/tokens/b_3_3_kavu.jpg
-[T]b_4_4_horror.jpg http://www.cardforge.org/fpics/tokens/b_4_4_horror.jpg
-[T]b_5_5_demon.jpg http://www.cardforge.org/fpics/tokens/b_5_5_demon.jpg
-[T]b_5_5_urami.jpg http://www.cardforge.org/fpics/tokens/b_5_5_urami.jpg
-[T]b_5_5_zombie_giant.jpg http://www.cardforge.org/fpics/tokens/b_5_5_zombie_giant.jpg
-[T]b_6_6_wurm.jpg http://www.cardforge.org/fpics/tokens/b_6_6_wurm.jpg
-[T]b_dx_dy_spirit.jpg http://www.cardforge.org/fpics/tokens/b_dx_dy_spirit.jpg
-[T]b_x_x_demon.jpg http://www.cardforge.org/fpics/tokens/b_x_x_demon.jpg
-[T]b_x_x_minion.jpg http://www.cardforge.org/fpics/tokens/b_x_x_minion.jpg
-[T]bg_1_1_worm.jpg http://www.cardforge.org/fpics/tokens/bg_1_1_worm.jpg
-[T]br_1_1_minor_demon.jpg http://www.cardforge.org/fpics/tokens/br_1_1_minor_demon.jpg
-[T]br_3_1_graveborn.jpg http://www.cardforge.org/fpics/tokens/br_3_1_graveborn.jpg
-[T]br_5_5_elemental.jpg http://www.cardforge.org/fpics/tokens/br_5_5_elemental.jpg
-[T]c_0_1_eldrazi_spawn.jpg http://www.cardforge.org/fpics/tokens/c_0_1_eldrazi_spawn.jpg
-[T]c_0_1_pest.jpg http://www.cardforge.org/fpics/tokens/c_0_1_pest.jpg
-[T]c_0_1_prism.jpg http://www.cardforge.org/fpics/tokens/c_0_1_prism.jpg
-[T]c_1_1_hornet.jpg http://www.cardforge.org/fpics/tokens/c_1_1_hornet.jpg
-[T]c_1_1_metallic_sliver.jpg http://www.cardforge.org/fpics/tokens/c_1_1_metallic_sliver.jpg
-[T]c_1_1_myr.jpg http://www.cardforge.org/fpics/tokens/c_1_1_myr.jpg
-[T]c_1_1_pentavite.jpg http://www.cardforge.org/fpics/tokens/c_1_1_pentavite.jpg
-[T]c_1_1_sand.jpg http://www.cardforge.org/fpics/tokens/c_1_1_sand.jpg
-[T]c_1_1_shapeshifter.jpg http://www.cardforge.org/fpics/tokens/c_1_1_shapeshifter.jpg
-[T]c_1_1_sliver.jpg http://www.cardforge.org/fpics/tokens/c_1_1_sliver.jpg
-[T]c_1_1_snake.jpg http://www.cardforge.org/fpics/tokens/c_1_1_snake.jpg
-[T]c_1_1_spirit.jpg http://www.cardforge.org/fpics/tokens/c_1_1_spirit.jpg
-[T]c_1_1_thopter.jpg http://www.cardforge.org/fpics/tokens/c_1_1_thopter.jpg
-[T]c_1_1_triskelavite.jpg http://www.cardforge.org/fpics/tokens/c_1_1_triskelavite.jpg
-[T]c_1_1_wasp.jpg http://www.cardforge.org/fpics/tokens/c_1_1_wasp.jpg
-[T]c_2_2_assembly_worker.jpg http://www.cardforge.org/fpics/tokens/c_2_2_assembly_worker.jpg
-[T]c_2_2_pincher.jpg http://www.cardforge.org/fpics/tokens/c_2_2_pincher.jpg
-[T]c_2_2_spawn.jpg http://www.cardforge.org/fpics/tokens/c_2_2_spawn.jpg
-[T]c_2_2_wirefly.jpg http://www.cardforge.org/fpics/tokens/c_2_2_wirefly.jpg
-[T]c_3_3_golem.jpg http://www.cardforge.org/fpics/tokens/c_3_3_golem.jpg
-[T]c_3_3_wurm_deathtouch.jpg http://www.cardforge.org/fpics/tokens/c_3_3_wurm_deathtouch.jpg
-[T]c_3_3_wurm_lifelink.jpg http://www.cardforge.org/fpics/tokens/c_3_3_wurm_lifelink.jpg
-[T]c_3_4_gargoyle.jpg http://www.cardforge.org/fpics/tokens/c_3_4_gargoyle.jpg
-[T]c_5_5_djinn.jpg http://www.cardforge.org/fpics/tokens/c_5_5_djinn.jpg
-[T]c_5_5_tuktuk_the_returned.jpg http://www.cardforge.org/fpics/tokens/c_5_5_tuktuk_the_returned.jpg
-[T]c_9_9_golem.jpg http://www.cardforge.org/fpics/tokens/c_9_9_golem.jpg
-[T]c_x_x_horror.jpg http://www.cardforge.org/fpics/tokens/c_x_x_horror.jpg
-[T]c_x_x_riptide_replicator.jpg http://www.cardforge.org/fpics/tokens/c_x_x_riptide_replicator.jpg
-[T]c_x_y_twin.jpg http://www.cardforge.org/fpics/tokens/c_x_y_twin.jpg
-[T]g_1_1_butterfly.jpg http://www.cardforge.org/fpics/tokens/g_1_1_butterfly.jpg
-[T]g_0_1_plant.jpg http://www.cardforge.org/fpics/tokens/g_0_1_plant.jpg
-[T]g_0_1_plant_wall.jpg http://www.cardforge.org/fpics/tokens/g_0_1_plant_wall.jpg
-[T]g_0_1_wood.jpg http://www.cardforge.org/fpics/tokens/g_0_1_wood.jpg
-[T]g_0_2_plant_wall.jpg http://www.cardforge.org/fpics/tokens/g_0_2_plant_wall.jpg
-[T]g_0_3_plant_wall.jpg http://www.cardforge.org/fpics/tokens/g_0_3_plant_wall.jpg
-[T]g_1_1_cat.jpg http://www.cardforge.org/fpics/tokens/g_1_1_cat.jpg
-[T]g_1_1_elf_warrior.jpg http://www.cardforge.org/fpics/tokens/g_1_1_elf_warrior.jpg
-[T]g_1_1_hippo.jpg http://www.cardforge.org/fpics/tokens/g_1_1_hippo.jpg
-[T]g_1_1_hound.jpg http://www.cardforge.org/fpics/tokens/g_1_1_hound.jpg
-[T]g_1_1_insect.jpg http://www.cardforge.org/fpics/tokens/g_1_1_insect.jpg
-[T]g_1_1_insect_deathtouch.jpg http://www.cardforge.org/fpics/tokens/g_1_1_insect_deathtouch.jpg
-[T]g_1_1_insect_infect.jpg http://www.cardforge.org/fpics/tokens/g_1_1_insect_infect.jpg
-[T]g_1_1_llanowar_elves.jpg http://www.cardforge.org/fpics/tokens/g_1_1_llanowar_elves.jpg
-[T]g_1_1_ooze.jpg http://www.cardforge.org/fpics/tokens/g_1_1_ooze.jpg
-[T]g_1_1_saproling.jpg http://www.cardforge.org/fpics/tokens/g_1_1_saproling.jpg
-[T]g_1_1_snake.jpg http://www.cardforge.org/fpics/tokens/g_1_1_snake.jpg
-[T]g_1_1_spike.jpg http://www.cardforge.org/fpics/tokens/g_1_1_spike.jpg
-[T]g_1_1_splinter.jpg http://www.cardforge.org/fpics/tokens/g_1_1_splinter.jpg
-[T]g_1_1_squirrel.jpg http://www.cardforge.org/fpics/tokens/g_1_1_squirrel.jpg
-[T]g_1_1_wolf.jpg http://www.cardforge.org/fpics/tokens/g_1_1_wolf.jpg
-[T]g_1_2_spider.jpg http://www.cardforge.org/fpics/tokens/g_1_2_spider.jpg
-[T]g_1_3_plant_wall.jpg http://www.cardforge.org/fpics/tokens/g_1_3_plant_wall.jpg
-[T]g_1_3_plant_wall_deathtouch.jpg http://www.cardforge.org/fpics/tokens/g_1_3_plant_wall_deathtouch.jpg
-[T]g_1_4_plant_wall.jpg http://www.cardforge.org/fpics/tokens/g_1_4_plant_wall.jpg
-[T]g_2_2_ape.jpg http://www.cardforge.org/fpics/tokens/g_2_2_ape.jpg
-[T]g_2_2_bear.jpg http://www.cardforge.org/fpics/tokens/g_2_2_bear.jpg
-[T]g_2_2_cat_warrior.jpg http://www.cardforge.org/fpics/tokens/g_2_2_cat_warrior.jpg
-[T]g_2_2_lizard.jpg http://www.cardforge.org/fpics/tokens/g_2_2_lizard.jpg
-[T]g_2_2_ooze.jpg http://www.cardforge.org/fpics/tokens/g_2_2_ooze.jpg
-[T]g_2_2_wolf.jpg http://www.cardforge.org/fpics/tokens/g_2_2_wolf.jpg
-[T]g_2_5_treefolk_shaman.jpg http://www.cardforge.org/fpics/tokens/g_2_5_treefolk_shaman.jpg
-[T]g_3_3_ape.jpg http://www.cardforge.org/fpics/tokens/g_3_3_ape.jpg
-[T]g_3_3_beast.jpg http://www.cardforge.org/fpics/tokens/g_3_3_beast.jpg
-[T]g_3_3_centaur.jpg http://www.cardforge.org/fpics/tokens/g_3_3_centaur.jpg
-[T]g_3_3_centaur_pro_black.jpg http://www.cardforge.org/fpics/tokens/g_3_3_centaur_pro_black.jpg
-[T]g_3_3_elephant.jpg http://www.cardforge.org/fpics/tokens/g_3_3_elephant.jpg
-[T]g_4_4_beast.jpg http://www.cardforge.org/fpics/tokens/g_4_4_beast.jpg
-[T]g_4_4_elemental.jpg http://www.cardforge.org/fpics/tokens/g_4_4_elemental.jpg
-[T]g_5_5_beast.jpg http://www.cardforge.org/fpics/tokens/g_5_5_beast.jpg
-[T]g_6_1_insect.jpg http://www.cardforge.org/fpics/tokens/g_6_1_insect.jpg
-[T]g_6_6_wurm.jpg http://www.cardforge.org/fpics/tokens/g_6_6_wurm.jpg
-[T]g_7_7_elemental.jpg http://www.cardforge.org/fpics/tokens/g_7_7_elemental.jpg
-[T]g_x_x_elephant.jpg http://www.cardforge.org/fpics/tokens/g_x_x_elephant.jpg
-[T]g_x_x_ooze.jpg http://www.cardforge.org/fpics/tokens/g_x_x_ooze.jpg
-[T]g_x_x_wurm.jpg http://www.cardforge.org/fpics/tokens/g_x_x_wurm.jpg
-[T]gr_1_1_dragon.jpg http://www.cardforge.org/fpics/tokens/gr_1_1_dragon.jpg
-[T]grw_1_1_sand_warrior.jpg http://www.cardforge.org/fpics/tokens/grw_1_1_sand_warrior.jpg
-[T]gu_2_2_drake.jpg http://www.cardforge.org/fpics/tokens/gu_2_2_drake.jpg
-[T]gu_1_1_snake.jpg http://www.cardforge.org/fpics/tokens/gu_1_1_snake.jpg
-[T]gw_1_1_elf_warrior.jpg http://www.cardforge.org/fpics/tokens/gw_1_1_elf_warrior.jpg
-[T]gw_2_2_voja.jpg http://www.cardforge.org/fpics/tokens/gw_2_2_voja.jpg
-[T]r_0_1_kobolds_of_kher_keep.jpg http://www.cardforge.org/fpics/tokens/r_0_1_kobolds_of_kher_keep.jpg
-[T]r_1_1_elemental_cat.jpg http://www.cardforge.org/fpics/tokens/r_1_1_elemental_cat.jpg
-[T]r_1_1_elemental.jpg http://www.cardforge.org/fpics/tokens/r_1_1_elemental.jpg
-[T]r_1_1_goblin.jpg http://www.cardforge.org/fpics/tokens/r_1_1_goblin.jpg
-[T]r_1_1_goblin_scout.jpg http://www.cardforge.org/fpics/tokens/r_1_1_goblin_scout.jpg
-[T]r_2_1_goblin.jpg http://www.cardforge.org/fpics/tokens/r_2_1_goblin.jpg
-[T]r_3_1_elemental.jpg http://www.cardforge.org/fpics/tokens/r_3_1_elemental.jpg
-[T]r_3_1_elemental_shaman.jpg http://www.cardforge.org/fpics/tokens/r_3_1_elemental_shaman.jpg
-[T]r_3_1_spark_elemental.jpg http://www.cardforge.org/fpics/tokens/r_3_1_spark_elemental.jpg
-[T]r_3_3_elemental.jpg http://www.cardforge.org/fpics/tokens/r_3_3_elemental.jpg
-[T]r_3_3_ogre.jpg http://www.cardforge.org/fpics/tokens/r_3_3_ogre.jpg
-[T]r_4_4_bird.jpg http://www.cardforge.org/fpics/tokens/r_4_4_bird.jpg
-[T]r_4_4_dragon.jpg http://www.cardforge.org/fpics/tokens/r_4_4_dragon.jpg
-[T]r_4_4_giant.jpg http://www.cardforge.org/fpics/tokens/r_4_4_giant.jpg
-[T]r_4_4_hellion.jpg http://www.cardforge.org/fpics/tokens/r_4_4_hellion.jpg
-[T]r_5_5_dragon.jpg http://www.cardforge.org/fpics/tokens/r_5_5_dragon.jpg
-[T]r_7_1_elemental.jpg http://www.cardforge.org/fpics/tokens/r_7_1_elemental.jpg
-[T]r_x_x_elemental.jpg http://www.cardforge.org/fpics/tokens/r_x_x_elemental.jpg
-[T]rg_3_4_stangg_twin.jpg http://www.cardforge.org/fpics/tokens/rg_3_4_stangg_twin.jpg
-[T]rw_1_1_goblin_soldier.jpg http://www.cardforge.org/fpics/tokens/rw_1_1_goblin_soldier.jpg
-[T]u_0_1_homunculus.jpg http://www.cardforge.org/fpics/tokens/u_0_1_homunculus.jpg
-[T]u_0_1_plant_wall.jpg http://www.cardforge.org/fpics/tokens/u_0_1_plant_wall.jpg
-[T]u_1_1_bird.jpg http://www.cardforge.org/fpics/tokens/u_1_1_bird.jpg
-[T]u_1_1_camarid.jpg http://www.cardforge.org/fpics/tokens/u_1_1_camarid.jpg
-[T]u_1_1_cloud_sprite.jpg http://www.cardforge.org/fpics/tokens/u_1_1_cloud_sprite.jpg
-[T]u_1_1_faerie.jpg http://www.cardforge.org/fpics/tokens/u_1_1_faerie.jpg
-[T]u_1_1_illusion.jpg http://www.cardforge.org/fpics/tokens/u_1_1_illusion.jpg
-[T]u_1_1_merfolk_wizard.jpg http://www.cardforge.org/fpics/tokens/u_1_1_merfolk_wizard.jpg
-[T]u_1_1_thopter.jpg http://www.cardforge.org/fpics/tokens/u_1_1_thopter.jpg
-[T]u_2_2_elemental_flying.jpg http://www.cardforge.org/fpics/tokens/u_2_2_elemental_flying.jpg
-[T]u_2_2_homunculus.jpg http://www.cardforge.org/fpics/tokens/u_2_2_homunculus.jpg
-[T]u_2_2_illusion.jpg http://www.cardforge.org/fpics/tokens/u_2_2_illusion.jpg
-[T]u_3_3_weird.jpg http://www.cardforge.org/fpics/tokens/u_3_3_weird.jpg
-[T]u_5_5_wall.jpg http://www.cardforge.org/fpics/tokens/u_5_5_wall.jpg
-[T]ub_1_1_faerie_rogue.jpg http://www.cardforge.org/fpics/tokens/ub_1_1_faerie_rogue.jpg
-[T]ub_1_1_zombie_wizard.jpg http://www.cardforge.org/fpics/tokens/ub_1_1_zombie_wizard.jpg
-[T]ur_5_5_elemental.jpg http://www.cardforge.org/fpics/tokens/ur_5_5_elemental.jpg
-[T]w_0_1_caribou.jpg http://www.cardforge.org/fpics/tokens/w_0_1_caribou.jpg
-[T]w_0_1_deserter.jpg http://www.cardforge.org/fpics/tokens/w_0_1_deserter.jpg
-[T]w_0_1_goat.jpg http://www.cardforge.org/fpics/tokens/w_0_1_goat.jpg
-[T]w_1_1_bird.jpg http://www.cardforge.org/fpics/tokens/w_1_1_bird.jpg
-[T]w_1_1_bird_flying.jpg http://www.cardforge.org/fpics/tokens/w_1_1_bird_flying.jpg
-[T]w_1_1_bird_soldier.jpg http://www.cardforge.org/fpics/tokens/w_1_1_bird_soldier.jpg
-[T]w_1_1_citizen.jpg http://www.cardforge.org/fpics/tokens/w_1_1_citizen.jpg
-[T]w_1_1_goldmeadow_harrier.jpg http://www.cardforge.org/fpics/tokens/w_1_1_goldmeadow_harrier.jpg
-[T]w_1_1_kithkin_soldier.jpg http://www.cardforge.org/fpics/tokens/w_1_1_kithkin_soldier.jpg
-[T]w_1_1_kor_soldier.jpg http://www.cardforge.org/fpics/tokens/w_1_1_kor_soldier.jpg
-[T]w_1_1_pegasus.jpg http://www.cardforge.org/fpics/tokens/w_1_1_pegasus.jpg
-[T]w_1_1_soldier.jpg http://www.cardforge.org/fpics/tokens/w_1_1_soldier.jpg
-[T]w_1_1_soldier_ally.jpg http://www.cardforge.org/fpics/tokens/w_1_1_soldier_ally.jpg
-[T]w_1_1_spirit.jpg http://www.cardforge.org/fpics/tokens/w_1_1_spirit.jpg
-[T]w_2_2_cat.jpg http://www.cardforge.org/fpics/tokens/w_2_2_cat.jpg
-[T]w_2_2_griffin.jpg http://www.cardforge.org/fpics/tokens/w_2_2_griffin.jpg
-[T]w_2_2_knight.jpg http://www.cardforge.org/fpics/tokens/w_2_2_knight.jpg
-[T]w_2_2_knight_first_strike.jpg http://www.cardforge.org/fpics/tokens/w_2_2_knight_first_strike.jpg
-[T]w_3_3_bird.jpg http://www.cardforge.org/fpics/tokens/w_3_3_bird.jpg
-[T]w_3_3_spirit.jpg http://www.cardforge.org/fpics/tokens/w_3_3_spirit.jpg
-[T]w_4_4_angel.jpg http://www.cardforge.org/fpics/tokens/w_4_4_angel.jpg
-[T]w_4_4_elemental.jpg http://www.cardforge.org/fpics/tokens/w_4_4_elemental.jpg
-[T]w_5_5_giant_warrior.jpg http://www.cardforge.org/fpics/tokens/w_5_5_giant_warrior.jpg
-[T]w_n_n_avatar.jpg http://www.cardforge.org/fpics/tokens/w_n_n_avatar.jpg
-[T]wb_1_1_spirit.jpg http://www.cardforge.org/fpics/tokens/wb_1_1_spirit.jpg
-[T]wrg_8_8_beast.jpg http://www.cardforge.org/fpics/tokens/wrg_8_8_beast.jpg
-[T]wr_1_1_goblin_soldier.jpg http://www.cardforge.org/fpics/tokens/wr_1_1_goblin_soldier.jpg
-[T]wu_1_1_bird.jpg http://www.cardforge.org/fpics/tokens/wu_1_1_bird.jpg
+b_0_0_germ.jpg http://www.cardforge.org/fpics/tokens/b_0_0_germ.jpg
+b_0_1_insect.jpg http://www.cardforge.org/fpics/tokens/b_0_1_insect.jpg
+b_0_1_serf.jpg http://www.cardforge.org/fpics/tokens/b_0_1_serf.jpg
+b_0_1_thrull.jpg http://www.cardforge.org/fpics/tokens/b_0_1_thrull.jpg
+b_1_1_bat.jpg http://www.cardforge.org/fpics/tokens/b_1_1_bat.jpg
+b_1_1_faerie_rogue.jpg http://www.cardforge.org/fpics/tokens/b_1_1_faerie_rogue.jpg
+b_1_1_festering_goblin.jpg http://www.cardforge.org/fpics/tokens/b_1_1_festering_goblin.jpg
+b_1_1_goblin_rogue.jpg http://www.cardforge.org/fpics/tokens/b_1_1_goblin_rogue.jpg
+b_1_1_minion.jpg http://www.cardforge.org/fpics/tokens/b_1_1_minion.jpg
+b_1_1_rat.jpg http://www.cardforge.org/fpics/tokens/b_1_1_rat.jpg
+b_1_1_skeleton.jpg http://www.cardforge.org/fpics/tokens/b_1_1_skeleton.jpg
+b_1_1_thrull.jpg http://www.cardforge.org/fpics/tokens/b_1_1_thrull.jpg
+b_1_2_bat.jpg http://www.cardforge.org/fpics/tokens/b_1_2_bat.jpg
+b_20_20_marit_lage.jpg http://www.cardforge.org/fpics/tokens/b_20_20_marit_lage.jpg
+b_2_1_cat.jpg http://www.cardforge.org/fpics/tokens/b_2_1_cat.jpg
+b_2_2_zombie.jpg http://www.cardforge.org/fpics/tokens/b_2_2_zombie.jpg
+b_2_4_spider.jpg http://www.cardforge.org/fpics/tokens/b_2_4_spider.jpg
+b_3_3_angel.jpg http://www.cardforge.org/fpics/tokens/b_3_3_angel.jpg
+b_3_3_kavu.jpg http://www.cardforge.org/fpics/tokens/b_3_3_kavu.jpg
+b_4_4_horror.jpg http://www.cardforge.org/fpics/tokens/b_4_4_horror.jpg
+b_5_5_demon.jpg http://www.cardforge.org/fpics/tokens/b_5_5_demon.jpg
+b_5_5_urami.jpg http://www.cardforge.org/fpics/tokens/b_5_5_urami.jpg
+b_5_5_zombie_giant.jpg http://www.cardforge.org/fpics/tokens/b_5_5_zombie_giant.jpg
+b_6_6_wurm.jpg http://www.cardforge.org/fpics/tokens/b_6_6_wurm.jpg
+b_dx_dy_spirit.jpg http://www.cardforge.org/fpics/tokens/b_dx_dy_spirit.jpg
+b_x_x_demon.jpg http://www.cardforge.org/fpics/tokens/b_x_x_demon.jpg
+b_x_x_minion.jpg http://www.cardforge.org/fpics/tokens/b_x_x_minion.jpg
+bg_1_1_worm.jpg http://www.cardforge.org/fpics/tokens/bg_1_1_worm.jpg
+br_1_1_minor_demon.jpg http://www.cardforge.org/fpics/tokens/br_1_1_minor_demon.jpg
+br_3_1_graveborn.jpg http://www.cardforge.org/fpics/tokens/br_3_1_graveborn.jpg
+br_5_5_elemental.jpg http://www.cardforge.org/fpics/tokens/br_5_5_elemental.jpg
+c_0_1_eldrazi_spawn.jpg http://www.cardforge.org/fpics/tokens/c_0_1_eldrazi_spawn.jpg
+c_0_1_pest.jpg http://www.cardforge.org/fpics/tokens/c_0_1_pest.jpg
+c_0_1_prism.jpg http://www.cardforge.org/fpics/tokens/c_0_1_prism.jpg
+c_1_1_hornet.jpg http://www.cardforge.org/fpics/tokens/c_1_1_hornet.jpg
+c_1_1_metallic_sliver.jpg http://www.cardforge.org/fpics/tokens/c_1_1_metallic_sliver.jpg
+c_1_1_myr.jpg http://www.cardforge.org/fpics/tokens/c_1_1_myr.jpg
+c_1_1_pentavite.jpg http://www.cardforge.org/fpics/tokens/c_1_1_pentavite.jpg
+c_1_1_sand.jpg http://www.cardforge.org/fpics/tokens/c_1_1_sand.jpg
+c_1_1_shapeshifter.jpg http://www.cardforge.org/fpics/tokens/c_1_1_shapeshifter.jpg
+c_1_1_sliver.jpg http://www.cardforge.org/fpics/tokens/c_1_1_sliver.jpg
+c_1_1_snake.jpg http://www.cardforge.org/fpics/tokens/c_1_1_snake.jpg
+c_1_1_spirit.jpg http://www.cardforge.org/fpics/tokens/c_1_1_spirit.jpg
+c_1_1_thopter.jpg http://www.cardforge.org/fpics/tokens/c_1_1_thopter.jpg
+c_1_1_triskelavite.jpg http://www.cardforge.org/fpics/tokens/c_1_1_triskelavite.jpg
+c_1_1_wasp.jpg http://www.cardforge.org/fpics/tokens/c_1_1_wasp.jpg
+c_2_2_assembly_worker.jpg http://www.cardforge.org/fpics/tokens/c_2_2_assembly_worker.jpg
+c_2_2_pincher.jpg http://www.cardforge.org/fpics/tokens/c_2_2_pincher.jpg
+c_2_2_spawn.jpg http://www.cardforge.org/fpics/tokens/c_2_2_spawn.jpg
+c_2_2_wirefly.jpg http://www.cardforge.org/fpics/tokens/c_2_2_wirefly.jpg
+c_3_3_golem.jpg http://www.cardforge.org/fpics/tokens/c_3_3_golem.jpg
+c_3_3_wurm_deathtouch.jpg http://www.cardforge.org/fpics/tokens/c_3_3_wurm_deathtouch.jpg
+c_3_3_wurm_lifelink.jpg http://www.cardforge.org/fpics/tokens/c_3_3_wurm_lifelink.jpg
+c_3_4_gargoyle.jpg http://www.cardforge.org/fpics/tokens/c_3_4_gargoyle.jpg
+c_5_5_djinn.jpg http://www.cardforge.org/fpics/tokens/c_5_5_djinn.jpg
+c_5_5_tuktuk_the_returned.jpg http://www.cardforge.org/fpics/tokens/c_5_5_tuktuk_the_returned.jpg
+c_9_9_golem.jpg http://www.cardforge.org/fpics/tokens/c_9_9_golem.jpg
+c_x_x_horror.jpg http://www.cardforge.org/fpics/tokens/c_x_x_horror.jpg
+c_x_x_riptide_replicator.jpg http://www.cardforge.org/fpics/tokens/c_x_x_riptide_replicator.jpg
+c_x_y_twin.jpg http://www.cardforge.org/fpics/tokens/c_x_y_twin.jpg
+g_1_1_butterfly.jpg http://www.cardforge.org/fpics/tokens/g_1_1_butterfly.jpg
+g_0_1_plant.jpg http://www.cardforge.org/fpics/tokens/g_0_1_plant.jpg
+g_0_1_wood.jpg http://www.cardforge.org/fpics/tokens/g_0_1_wood.jpg
+g_1_1_cat.jpg http://www.cardforge.org/fpics/tokens/g_1_1_cat.jpg
+g_1_1_elf_warrior.jpg http://www.cardforge.org/fpics/tokens/g_1_1_elf_warrior.jpg
+g_1_1_hippo.jpg http://www.cardforge.org/fpics/tokens/g_1_1_hippo.jpg
+g_1_1_hound.jpg http://www.cardforge.org/fpics/tokens/g_1_1_hound.jpg
+g_1_1_insect.jpg http://www.cardforge.org/fpics/tokens/g_1_1_insect.jpg
+g_1_1_insect_deathtouch.jpg http://www.cardforge.org/fpics/tokens/g_1_1_insect_deathtouch.jpg
+g_1_1_insect_infect.jpg http://www.cardforge.org/fpics/tokens/g_1_1_insect_infect.jpg
+g_1_1_llanowar_elves.jpg http://www.cardforge.org/fpics/tokens/g_1_1_llanowar_elves.jpg
+g_1_1_ooze.jpg http://www.cardforge.org/fpics/tokens/g_1_1_ooze.jpg
+g_1_1_saproling.jpg http://www.cardforge.org/fpics/tokens/g_1_1_saproling.jpg
+g_1_1_snake.jpg http://www.cardforge.org/fpics/tokens/g_1_1_snake.jpg
+g_1_1_spike.jpg http://www.cardforge.org/fpics/tokens/g_1_1_spike.jpg
+g_1_1_splinter.jpg http://www.cardforge.org/fpics/tokens/g_1_1_splinter.jpg
+g_1_1_squirrel.jpg http://www.cardforge.org/fpics/tokens/g_1_1_squirrel.jpg
+g_1_1_wolf.jpg http://www.cardforge.org/fpics/tokens/g_1_1_wolf.jpg
+g_1_2_spider.jpg http://www.cardforge.org/fpics/tokens/g_1_2_spider.jpg
+g_2_2_ape.jpg http://www.cardforge.org/fpics/tokens/g_2_2_ape.jpg
+g_2_2_bear.jpg http://www.cardforge.org/fpics/tokens/g_2_2_bear.jpg
+g_2_2_cat_warrior.jpg http://www.cardforge.org/fpics/tokens/g_2_2_cat_warrior.jpg
+g_2_2_lizard.jpg http://www.cardforge.org/fpics/tokens/g_2_2_lizard.jpg
+g_2_2_ooze.jpg http://www.cardforge.org/fpics/tokens/g_2_2_ooze.jpg
+g_2_2_wolf.jpg http://www.cardforge.org/fpics/tokens/g_2_2_wolf.jpg
+g_2_5_treefolk_shaman.jpg http://www.cardforge.org/fpics/tokens/g_2_5_treefolk_shaman.jpg
+g_3_3_ape.jpg http://www.cardforge.org/fpics/tokens/g_3_3_ape.jpg
+g_3_3_beast.jpg http://www.cardforge.org/fpics/tokens/g_3_3_beast.jpg
+g_3_3_centaur.jpg http://www.cardforge.org/fpics/tokens/g_3_3_centaur.jpg
+g_3_3_centaur_pro_black.jpg http://www.cardforge.org/fpics/tokens/g_3_3_centaur_pro_black.jpg
+g_3_3_elephant.jpg http://www.cardforge.org/fpics/tokens/g_3_3_elephant.jpg
+g_4_4_beast.jpg http://www.cardforge.org/fpics/tokens/g_4_4_beast.jpg
+g_4_4_elemental.jpg http://www.cardforge.org/fpics/tokens/g_4_4_elemental.jpg
+g_5_5_beast.jpg http://www.cardforge.org/fpics/tokens/g_5_5_beast.jpg
+g_6_1_insect.jpg http://www.cardforge.org/fpics/tokens/g_6_1_insect.jpg
+g_6_6_wurm.jpg http://www.cardforge.org/fpics/tokens/g_6_6_wurm.jpg
+g_7_7_elemental.jpg http://www.cardforge.org/fpics/tokens/g_7_7_elemental.jpg
+g_x_x_elephant.jpg http://www.cardforge.org/fpics/tokens/g_x_x_elephant.jpg
+g_x_x_ooze.jpg http://www.cardforge.org/fpics/tokens/g_x_x_ooze.jpg
+g_x_x_wurm.jpg http://www.cardforge.org/fpics/tokens/g_x_x_wurm.jpg
+gr_1_1_dragon.jpg http://www.cardforge.org/fpics/tokens/gr_1_1_dragon.jpg
+grw_1_1_sand_warrior.jpg http://www.cardforge.org/fpics/tokens/grw_1_1_sand_warrior.jpg
+gu_2_2_drake.jpg http://www.cardforge.org/fpics/tokens/gu_2_2_drake.jpg
+gu_1_1_snake.jpg http://www.cardforge.org/fpics/tokens/gu_1_1_snake.jpg
+gw_1_1_elf_warrior.jpg http://www.cardforge.org/fpics/tokens/gw_1_1_elf_warrior.jpg
+gw_2_2_voja.jpg http://www.cardforge.org/fpics/tokens/gw_2_2_voja.jpg
+r_0_1_kobolds_of_kher_keep.jpg http://www.cardforge.org/fpics/tokens/r_0_1_kobolds_of_kher_keep.jpg
+r_1_1_elemental_cat.jpg http://www.cardforge.org/fpics/tokens/r_1_1_elemental_cat.jpg
+r_1_1_elemental.jpg http://www.cardforge.org/fpics/tokens/r_1_1_elemental.jpg
+r_1_1_goblin.jpg http://www.cardforge.org/fpics/tokens/r_1_1_goblin.jpg
+r_1_1_goblin_scout.jpg http://www.cardforge.org/fpics/tokens/r_1_1_goblin_scout.jpg
+r_2_1_goblin.jpg http://www.cardforge.org/fpics/tokens/r_2_1_goblin.jpg
+r_3_1_elemental.jpg http://www.cardforge.org/fpics/tokens/r_3_1_elemental.jpg
+r_3_1_elemental_shaman.jpg http://www.cardforge.org/fpics/tokens/r_3_1_elemental_shaman.jpg
+r_3_1_spark_elemental.jpg http://www.cardforge.org/fpics/tokens/r_3_1_spark_elemental.jpg
+r_3_3_elemental.jpg http://www.cardforge.org/fpics/tokens/r_3_3_elemental.jpg
+r_3_3_ogre.jpg http://www.cardforge.org/fpics/tokens/r_3_3_ogre.jpg
+r_4_4_bird.jpg http://www.cardforge.org/fpics/tokens/r_4_4_bird.jpg
+r_4_4_dragon.jpg http://www.cardforge.org/fpics/tokens/r_4_4_dragon.jpg
+r_4_4_giant.jpg http://www.cardforge.org/fpics/tokens/r_4_4_giant.jpg
+r_4_4_hellion.jpg http://www.cardforge.org/fpics/tokens/r_4_4_hellion.jpg
+r_5_5_dragon.jpg http://www.cardforge.org/fpics/tokens/r_5_5_dragon.jpg
+r_7_1_elemental.jpg http://www.cardforge.org/fpics/tokens/r_7_1_elemental.jpg
+r_x_x_elemental.jpg http://www.cardforge.org/fpics/tokens/r_x_x_elemental.jpg
+rg_3_4_stangg_twin.jpg http://www.cardforge.org/fpics/tokens/rg_3_4_stangg_twin.jpg
+rw_1_1_goblin_soldier.jpg http://www.cardforge.org/fpics/tokens/rw_1_1_goblin_soldier.jpg
+u_0_1_homunculus.jpg http://www.cardforge.org/fpics/tokens/u_0_1_homunculus.jpg
+u_0_1_plant_wall.jpg http://www.cardforge.org/fpics/tokens/u_0_1_plant_wall.jpg
+u_1_1_bird.jpg http://www.cardforge.org/fpics/tokens/u_1_1_bird.jpg
+u_1_1_camarid.jpg http://www.cardforge.org/fpics/tokens/u_1_1_camarid.jpg
+u_1_1_cloud_sprite.jpg http://www.cardforge.org/fpics/tokens/u_1_1_cloud_sprite.jpg
+u_1_1_faerie.jpg http://www.cardforge.org/fpics/tokens/u_1_1_faerie.jpg
+u_1_1_illusion.jpg http://www.cardforge.org/fpics/tokens/u_1_1_illusion.jpg
+u_1_1_merfolk_wizard.jpg http://www.cardforge.org/fpics/tokens/u_1_1_merfolk_wizard.jpg
+u_1_1_thopter.jpg http://www.cardforge.org/fpics/tokens/u_1_1_thopter.jpg
+u_2_2_elemental_flying.jpg http://www.cardforge.org/fpics/tokens/u_2_2_elemental_flying.jpg
+u_2_2_homunculus.jpg http://www.cardforge.org/fpics/tokens/u_2_2_homunculus.jpg
+u_2_2_illusion.jpg http://www.cardforge.org/fpics/tokens/u_2_2_illusion.jpg
+u_3_3_weird.jpg http://www.cardforge.org/fpics/tokens/u_3_3_weird.jpg
+u_5_5_wall.jpg http://www.cardforge.org/fpics/tokens/u_5_5_wall.jpg
+ub_1_1_faerie_rogue.jpg http://www.cardforge.org/fpics/tokens/ub_1_1_faerie_rogue.jpg
+ub_1_1_zombie_wizard.jpg http://www.cardforge.org/fpics/tokens/ub_1_1_zombie_wizard.jpg
+ur_5_5_elemental.jpg http://www.cardforge.org/fpics/tokens/ur_5_5_elemental.jpg
+w_0_1_caribou.jpg http://www.cardforge.org/fpics/tokens/w_0_1_caribou.jpg
+w_0_1_deserter.jpg http://www.cardforge.org/fpics/tokens/w_0_1_deserter.jpg
+w_0_1_goat.jpg http://www.cardforge.org/fpics/tokens/w_0_1_goat.jpg
+w_1_1_bird.jpg http://www.cardforge.org/fpics/tokens/w_1_1_bird.jpg
+w_1_1_bird_flying.jpg http://www.cardforge.org/fpics/tokens/w_1_1_bird_flying.jpg
+w_1_1_bird_soldier.jpg http://www.cardforge.org/fpics/tokens/w_1_1_bird_soldier.jpg
+w_1_1_citizen.jpg http://www.cardforge.org/fpics/tokens/w_1_1_citizen.jpg
+w_1_1_goldmeadow_harrier.jpg http://www.cardforge.org/fpics/tokens/w_1_1_goldmeadow_harrier.jpg
+w_1_1_kithkin_soldier.jpg http://www.cardforge.org/fpics/tokens/w_1_1_kithkin_soldier.jpg
+w_1_1_kor_soldier.jpg http://www.cardforge.org/fpics/tokens/w_1_1_kor_soldier.jpg
+w_1_1_pegasus.jpg http://www.cardforge.org/fpics/tokens/w_1_1_pegasus.jpg
+w_1_1_soldier.jpg http://www.cardforge.org/fpics/tokens/w_1_1_soldier.jpg
+w_1_1_soldier_ally.jpg http://www.cardforge.org/fpics/tokens/w_1_1_soldier_ally.jpg
+w_1_1_spirit.jpg http://www.cardforge.org/fpics/tokens/w_1_1_spirit.jpg
+w_2_2_cat.jpg http://www.cardforge.org/fpics/tokens/w_2_2_cat.jpg
+w_2_2_griffin.jpg http://www.cardforge.org/fpics/tokens/w_2_2_griffin.jpg
+w_2_2_knight.jpg http://www.cardforge.org/fpics/tokens/w_2_2_knight.jpg
+w_2_2_knight_first_strike.jpg http://www.cardforge.org/fpics/tokens/w_2_2_knight_first_strike.jpg
+w_3_3_bird.jpg http://www.cardforge.org/fpics/tokens/w_3_3_bird.jpg
+w_3_3_spirit.jpg http://www.cardforge.org/fpics/tokens/w_3_3_spirit.jpg
+w_4_4_angel.jpg http://www.cardforge.org/fpics/tokens/w_4_4_angel.jpg
+w_4_4_elemental.jpg http://www.cardforge.org/fpics/tokens/w_4_4_elemental.jpg
+w_5_5_giant_warrior.jpg http://www.cardforge.org/fpics/tokens/w_5_5_giant_warrior.jpg
+w_n_n_avatar.jpg http://www.cardforge.org/fpics/tokens/w_n_n_avatar.jpg
+wb_1_1_spirit.jpg http://www.cardforge.org/fpics/tokens/wb_1_1_spirit.jpg
+wrg_8_8_beast.jpg http://www.cardforge.org/fpics/tokens/wrg_8_8_beast.jpg
+wr_1_1_goblin_soldier.jpg http://www.cardforge.org/fpics/tokens/wr_1_1_goblin_soldier.jpg
+wu_1_1_bird.jpg http://www.cardforge.org/fpics/tokens/wu_1_1_bird.jpg
# //These tokens are not currently used by any cards in Forge, but links provided should they be scripted so the correct name is used:
diff --git a/src/main/java/forge/Gui_DownloadPictures_LQ.java b/src/main/java/forge/Gui_DownloadPictures_LQ.java
index 60ea94be896..06d1b0c7b74 100644
--- a/src/main/java/forge/Gui_DownloadPictures_LQ.java
+++ b/src/main/java/forge/Gui_DownloadPictures_LQ.java
@@ -1,28 +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.awt.*;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.io.*;
-import java.net.InetSocketAddress;
-import java.net.MalformedURLException;
-import java.net.Proxy;
-import java.net.URL;
+import java.io.File;
+
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;
/**
@@ -31,303 +16,49 @@ import static javax.swing.JOptionPane.PLAIN_MESSAGE;
* @author Forge
* @version $Id$
*/
-public class Gui_DownloadPictures_LQ extends DefaultBoundedRangeModel implements Runnable, NewConstants, NewConstants.LANG.Gui_DownloadPictures {
+public class Gui_DownloadPictures_LQ extends GuiDownloader {
- /** Constant serialVersionUID=-7890794857949935256L. */
- private static final long serialVersionUID = -7890794857949935256L;
-
- /** 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 static final long serialVersionUID = -2839597792999139007L;
/**
- *
Constructor for Gui_DownloadPictures_LQ.
+ *Constructor for GuiDownloadQuestImages.
* - * @param c an array of {@link forge.Gui_DownloadPictures_LQ.mCard} objects. + * @param frame a array of {@link javax.swing.JFrame} objects. */ - private Gui_DownloadPictures_LQ(final 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(final ActionEvent e) { - new Thread(Gui_DownloadPictures_LQ.this).start(); - b.setEnabled(false); - } - }); - - p0.add(Box.createVerticalStrut(5)); - - //Progress - p0.add(bar); - bar.setStringPainted(true); - 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 Gui_DownloadPictures_LQ(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(final int card) { - this.card = card; - final class Worker implements Runnable { - private int card; - - Worker(int card) { - this.card = card; - } - - public void run() { - fireStateChanged(); - bar.setString(String.format(ForgeProps.getLocalized(card == cards.length ? BAR_CLOSE : BAR_WAIT), card, - cards.length)); - System.out.println(card + "/" + cards.length); - } - } - - EventQueue.invokeLater(new Worker(card)); - } - - /** - *Getter for the field dlg.
Setter for the field cancel.
run.
- */ - public void run() { - BufferedInputStream in; - BufferedOutputStream out; - - File base = ForgeProps.getFile(IMAGE_BASE); - File tokenBase = ForgeProps.getFile(IMAGE_TOKEN); - if (!tokenBase.exists()) { - tokenBase.mkdirs(); - } - - 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; - - if (cards[card].name.substring(0, 3).equals("[T]")) { - base = ForgeProps.getFile(IMAGE_TOKEN); - cName = cards[card].name.substring(3, cards[card].name.length()); - } else { - base = ForgeProps.getFile(IMAGE_BASE); - cName = cards[card].name; - } - - - File f = new File(base, cName); - - 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 (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."); - } catch (Exception ex) { - System.out.println("General error - downloading LQ picture for " + cards[card].name); - Log.error("LQ Pictures", "Error downloading pictures", ex); - } - - try { - Thread.sleep(r.nextInt(750) + 420); - } catch (InterruptedException e) { - Log.error("LQ Set Pictures", "Sleep Error", e); - } - } //for - } - close.setText(ForgeProps.getLocalized(BUTTONS.CLOSE)); - } //run - - /** - *startDownload.
- * - * @param frame a {@link javax.swing.JFrame} object. - */ - public static void startDownload(final JFrame frame) { - final mCard[] card = getNeededCards(); - - if (card.length == 0) { - JOptionPane.showMessageDialog(frame, ForgeProps.getLocalized(NO_MORE)); - return; - } - - Gui_DownloadPictures_LQ download = new Gui_DownloadPictures_LQ(card); - JDialog dlg = download.getDlg(frame); - dlg.setVisible(true); - dlg.dispose(); - download.setCancel(true); - } //startDownload() - /** *getNeededCards.
* - * @return an array of {@link forge.Gui_DownloadPictures_LQ.mCard} objects. + * @return an array of {@link forge.GuiDownloader.DownloadObject} objects. */ - private static mCard[] getNeededCards() { + protected final DownloadObject[] getNeededImages() { //read token names and urls - mCard[] cardTokenLQ = readFile(TOKEN_IMAGES); - - ArrayListreadFile.
- * - * @param ABC a {@link java.lang.String} object. - * @return an array of {@link forge.Gui_DownloadPictures_LQ.mCard} objects. - */ - private static mCard[] readFile(String ABC) { - try { - FileReader zrc = new FileReader(ForgeProps.getFile(ABC)); - BufferedReader in = new BufferedReader(zrc); - String line; - ArrayListserialVersionUID=-7890794857949935256L */
private static final long serialVersionUID = -7890794857949935256L;
- /** 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 Gui_DownloadSetPictures_LQ.
* - * @param c an array of {@link forge.Gui_DownloadSetPictures_LQ.mCard} objects. - */ - private Gui_DownloadSetPictures_LQ(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(Gui_DownloadSetPictures_LQ.this).start(); - b.setEnabled(false); - } - }); - - p0.add(Box.createVerticalStrut(5)); - - //Progress - p0.add(bar); - bar.setStringPainted(true); - bar.setString(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]); - } - - /** {@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()); - System.out.println(card + "/" + cards.length + " - " + a); - } - } - ; - EventQueue.invokeLater(new Worker(card)); - } - - /** - *Getter for the field dlg.
Setter for the field cancel.
run.
- */ - public void run() { - BufferedInputStream in; - BufferedOutputStream out; - - File base = ForgeProps.getFile(IMAGE_BASE); - File tokenBase = ForgeProps.getFile(IMAGE_TOKEN); - if (!tokenBase.exists()) { - tokenBase.mkdirs(); - } - - 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; - - if (cards[card].name.substring(0, 3).equals("[T]")) { - base = ForgeProps.getFile(IMAGE_TOKEN); - cName = cards[card].name.substring(3, cards[card].name.length()); - } else { - base = ForgeProps.getFile(IMAGE_BASE); - cName = cards[card].name; - } - if (Constant.Runtime.DevMode[0]) - System.out.println(cName + " - " + url); - - File f = new File(base, cName); - - //test for folder existence - File test = new File(base, cards[card].folder); - if (!test.exists()) { - // create folder - if (!test.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); - } - } 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("LQ Set Pictures", "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 = getNeededCards(); - - if (card.length == 0) { - JOptionPane.showMessageDialog(frame, ForgeProps.getLocalized(NO_MORE)); - return; - } - - Gui_DownloadSetPictures_LQ download = new Gui_DownloadSetPictures_LQ(card); - JDialog dlg = download.getDlg(frame); - dlg.setVisible(true); - dlg.dispose(); - download.setCancel(true); - }//startDownload() + public Gui_DownloadSetPictures_LQ(JFrame frame) { + super(frame); + } /** *getNeededCards.
* - * @return an array of {@link forge.Gui_DownloadSetPictures_LQ.mCard} objects. + * @return an array of {@link forge.GuiDownloader.DownloadObject} objects. */ - private static mCard[] getNeededCards() { + protected final DownloadObject[] getNeededImages() { //read token names and urls - mCard[] cardTokenLQ = readFile(TOKEN_IMAGES); + DownloadObject[] cardTokenLQ = readFileWithNames(TOKEN_IMAGES, ForgeProps.getFile(IMAGE_TOKEN)); + ArrayListreadFile.
- * - * @param ABC a {@link java.lang.String} object. - * @return an array of {@link forge.Gui_DownloadSetPictures_LQ.mCard} objects. - */ - private static mCard[] readFile(String ABC) { - try { - FileReader zrc = new FileReader(ForgeProps.getFile(ABC)); - BufferedReader in = new BufferedReader(zrc); - String line; - ArrayList