@@ -0,0 +1,157 @@
package twintro.minecraft.modbuilder.editor.generator;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import twintro.minecraft.modbuilder.editor.Editor;

public class ResourcePackIO {
private static String resourcePackFolderDir;

public static void setResourcePackFolder(String dir){
resourcePackFolderDir = dir;
}

public static String getURL(String dir){
return resourcePackFolderDir + dir;
}

public static void addTexture(Image img, String dir){
try {
RenderedImage bi = (RenderedImage) img;
File outputfile = new File(resourcePackFolderDir + dir);
if (!outputfile.getParentFile().exists()){
outputfile.getParentFile().mkdirs();
}
ImageIO.write(bi, "png", outputfile);
} catch (IOException e) {
e.printStackTrace();
}
}

public static void deleteFile(String dir){
File file = new File(resourcePackFolderDir + dir);
if (file.exists()) file.delete();
}

public static void createFile(Object obj, String dir){
File file = new File(resourcePackFolderDir + dir);
createFile(obj, file);
}

public static void createFile(Object obj, File file){
if (!file.getParentFile().exists())
file.getParentFile().mkdirs();

try{
FileWriter writer = null;
try {
writer = new FileWriter(file);
GsonBuilder builder = new GsonBuilder();
builder.setPrettyPrinting();
Gson gson = builder.create();
gson.toJson(obj, writer);
} finally {
if (writer != null) writer.close();
}
}
catch (IOException e){
e.printStackTrace();
}
}

public static void export(String dir){
try{
ZipOutputStream zos = null;
try{
zos = new ZipOutputStream(new FileOutputStream(dir));
addFile(zos, new File(resourcePackFolderDir));
} finally {
zos.close();
}
}
catch (IOException e){
e.printStackTrace();
}
}

private static void addFile(ZipOutputStream zos, File file){
try{
BufferedInputStream stream = null;
try{
String name = file.getPath().replace("\\", "/").replace(resourcePackFolderDir, "");

if (file.isDirectory()){
if (!name.isEmpty()){
if (!name.endsWith("/"))
name += "/";
ZipEntry entry = new ZipEntry(name);
entry.setTime(file.lastModified());
zos.putNextEntry(entry);
zos.closeEntry();
}
for (File nestedFile : file.listFiles()){
addFile(zos, nestedFile);
}
return;
}

ZipEntry entry = new ZipEntry(name);
entry.setTime(file.lastModified());
zos.putNextEntry(entry);
stream = new BufferedInputStream(new FileInputStream(file));

byte[] buffer = new byte[1024];
while (true){
int count = stream.read(buffer);
if (count == -1)
break;
zos.write(buffer, 0, count);
}
zos.closeEntry();
} finally {
if (stream != null) stream.close();
}
}
catch (IOException e){
e.printStackTrace();
}
}

public static ImageIcon getImage(String name){
return resizeImage(new ImageIcon(ResourcePackIO.getURL("assets/modbuilder/textures/" + name + ".png")), 64, 64);
}

public static ImageIcon resizeImage(ImageIcon icon, int width, int height){
Image img = icon.getImage();
BufferedImage bi = toBufferedImage(img, width, height);
return new ImageIcon(bi);
}

public static BufferedImage toBufferedImage(Image img){
return toBufferedImage(img, img.getWidth(null), img.getHeight(null));
}

public static BufferedImage toBufferedImage(Image img, int width, int height){
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics g = bi.createGraphics();
g.drawImage(img, 0, 0, width, height, null);
return bi;
}
}
@@ -1,4 +1,4 @@
package twintro.minecraft.modbuilder.editor;
package twintro.minecraft.modbuilder.editor.interfaces.activitypanels;

import java.awt.BorderLayout;
import java.awt.Component;
@@ -32,50 +32,18 @@
import javax.swing.ListModel;
import javax.swing.ScrollPaneConstants;

import twintro.minecraft.modbuilder.editor.generator.ResourcePackGenerator;
import twintro.minecraft.modbuilder.editor.ActivityButton;
import twintro.minecraft.modbuilder.editor.generator.ResourcePackIO;
import twintro.minecraft.modbuilder.editor.interfaces.helperclasses.CustomListCellRenderer;
import twintro.minecraft.modbuilder.editor.interfaces.helperclasses.ListPanel;

public abstract class ActivityPanel extends ListPanel {
public JList list;
protected JList list;

public ActivityPanel(String header, String button) {
this.setLayout(new BorderLayout(0, 0));
setLayout(new BorderLayout(0, 0));
elements = new HashMap<String, ImageIcon>();
addElements(header, button);
}

protected void addElement(String name, ImageIcon img){
elements.put(name, resizeImage(img, 64, 64));
list.updateUI();
}

protected void removeElement(String name){
elements.remove(name);
list.updateUI();
}

protected static ImageIcon getImage(String name){
return resizeImage(new ImageIcon(ResourcePackGenerator.getURL(
"assets/modbuilder/textures/" + name + ".png")), 64, 64);
}

public static ImageIcon resizeImage(ImageIcon icon, int width, int height){
Image img = icon.getImage();
BufferedImage bi = toBufferedImage(img, width, height);
return new ImageIcon(bi);
}

public static BufferedImage toBufferedImage(Image img){
return toBufferedImage(img, img.getWidth(null), img.getHeight(null));
}

public static BufferedImage toBufferedImage(Image img, int width, int height){
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics g = bi.createGraphics();
g.drawImage(img, 0, 0, width, height, null);
return bi;
}

private void addElements(String header, String button){

JPanel mainPanel = new JPanel();
this.add(mainPanel, BorderLayout.NORTH);
mainPanel.setLayout(new BorderLayout(0, 0));
@@ -110,36 +78,21 @@ public Object getElementAt(int index) {
});
list.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e){
if (e.getClickCount() == 2){
edit();
}
if (e.getButton() == e.BUTTON3 && list.getSelectedIndex() != -1){
JPopupMenu menu = new JPopupMenu();

JMenuItem deleteItem = new JMenuItem("Delete");
deleteItem.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
delete();
}
});
menu.add(deleteItem);

JMenuItem editItem = new JMenuItem("Edit");
editItem.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
edit();
}
});
menu.add(editItem);

menu.show(ActivityPanel.this, e.getX(), e.getY());
}
clickElement(e);
}
});
}

protected void addElement(String name, ImageIcon img){
elements.put(name, ResourcePackIO.resizeImage(img, 64, 64));
list.updateUI();
}

protected void removeElement(String name){
elements.remove(name);
list.updateUI();
}

protected void createButtonPanel(JPanel buttonPanel, String button){
JButton addButton = new ActivityButton(button);
addButton.addActionListener(new ActionListener() {
@@ -150,9 +103,33 @@ public void actionPerformed(ActionEvent e) {
buttonPanel.add(addButton);
}

public Set<String> getAllElements(){
Set<String> output = elements.keySet();
return output;
private void clickElement(MouseEvent e){
if (e.getClickCount() == 2){
edit();
}
if (e.getButton() == e.BUTTON3 && list.getSelectedIndex() != -1){
JPopupMenu menu = new JPopupMenu();

JMenuItem deleteItem = new JMenuItem("Delete");
deleteItem.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
delete();
}
});
menu.add(deleteItem);

JMenuItem editItem = new JMenuItem("Edit");
editItem.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
edit();
}
});
menu.add(editItem);

menu.show(ActivityPanel.this, e.getX(), e.getY());
}
}

protected abstract void add();
@@ -10,6 +10,7 @@
import java.util.Set;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

import com.google.gson.Gson;
@@ -23,73 +24,36 @@
import twintro.minecraft.modbuilder.data.resources.blocks.BlockType;
import twintro.minecraft.modbuilder.data.resources.items.ItemType;
import twintro.minecraft.modbuilder.data.resources.models.BlockModelResource;
import twintro.minecraft.modbuilder.editor.ActivityPanel;
import twintro.minecraft.modbuilder.editor.Editor;
import twintro.minecraft.modbuilder.editor.generator.ResourcePackGenerator;
import twintro.minecraft.modbuilder.editor.generator.ResourcePackIO;
import twintro.minecraft.modbuilder.editor.interfaces.choosewindows.ObjectRunnable;
import twintro.minecraft.modbuilder.editor.interfaces.editors.BlockEditor;
import twintro.minecraft.modbuilder.editor.resources.BlockElement;
import twintro.minecraft.modbuilder.editor.resources.ItemElement;
import twintro.minecraft.modbuilder.editor.resources.RecipeElement;

public class BlocksActivityPanel extends ActivityPanel {
private Map<String,BlockEditor> openEditors;
public class BlocksActivityPanel extends ObjectActivityPanel {
private final ObjectRunnable runnable = new ObjectRunnable() {
@Override
public void run(Object obj) {
saveBlock((BlockElement) obj);
}
};

public BlocksActivityPanel(String header, String button) {
super(header, button);
this.openEditors = new HashMap<String, BlockEditor>();
openEditors = new HashMap<String, JFrame>();
}

@Override
protected void add() {
String name = JOptionPane.showInputDialog("Block name:");
if (name != null){
if (name.replaceAll(" ", "").length() > 0 && !openEditors.containsKey(name)){
BlockEditor editor = new BlockEditor(name, this);
BlockEditor editor = new BlockEditor(name, runnable, closeHandler);
openEditors.put(name, editor);
}
}

}

public void updateTextureReferences(String old, String newName){
try {
Set<String> names = this.getAllElements();
for (String nameOfElement : names){
BlockElement elementToReReference = BlockElement.getFromName(nameOfElement);
boolean isChanged = false;
if (elementToReReference.block.type == BlockType.regular){
BlockModelResource elementClassed = (BlockModelResource)elementToReReference.blockModel;
for (String texture : elementClassed.textures.values()){
if (texture == old){isChanged = true; texture = newName;}
}
if(isChanged)this.addBlock(elementToReReference);
}
}
}catch(Exception e){}
}

public void addBlock(BlockElement block){
if (block.itemModel != null)
createFile(block.itemModel, "assets/modbuilder/models/item/" + block.name + ".json");
if (block.blockModel != null)
createFile(block.blockModel, "assets/modbuilder/models/block/" + block.name + ".json");
createFile(block.blockstate, "assets/modbuilder/blockstates/" + block.name + ".json");
createFile(block.block, "assets/modbuilder/blocks/" + block.name + ".json");
addElement(block.name, block.getImage());

Editor.metaFile.resource.modbuilder.blocks.add(block.name);
Editor.metaFile.save();

Editor.langFile.list.add("tile.modbuilder_" + block.name + ".name=" + block.name);
Editor.langFile.save();
}

public void createFile(Object model, String dir){
try {
ResourcePackGenerator.createFile(model, dir);
} catch (IOException e) {
e.printStackTrace();
}
}

@Override
@@ -98,7 +62,7 @@ protected void edit() {
try {
if (!openEditors.containsKey(value)){
BlockElement block = BlockElement.getFromName(value);
openEditors.put(value, new BlockEditor(this, block));
openEditors.put(value, new BlockEditor(block, runnable, closeHandler));
}
else {
openEditors.get(value).setVisible(true);
@@ -115,10 +79,10 @@ protected void delete() {
+ "References to this object will not be updated, which might cause problems.",
"Warning", JOptionPane.YES_NO_OPTION);
if (result == JOptionPane.YES_OPTION){
ResourcePackGenerator.deleteFile("assets/modbuilder/blocks/" + value + ".json");
ResourcePackGenerator.deleteFile("assets/modbuilder/blockstates/" + value + ".json");
ResourcePackGenerator.deleteFile("assets/modbuilder/models/block/" + value + ".json");
ResourcePackGenerator.deleteFile("assets/modbuilder/models/item/" + value + ".json");
ResourcePackIO.deleteFile("assets/modbuilder/blocks/" + value + ".json");
ResourcePackIO.deleteFile("assets/modbuilder/blockstates/" + value + ".json");
ResourcePackIO.deleteFile("assets/modbuilder/models/block/" + value + ".json");
ResourcePackIO.deleteFile("assets/modbuilder/models/item/" + value + ".json");
removeElement(value);

Editor.metaFile.resource.modbuilder.blocks.remove(value);
@@ -131,7 +95,7 @@ protected void delete() {

@Override
public void updateList() {
File folder = new File(ResourcePackGenerator.getURL("assets/modbuilder/blocks/"));
File folder = new File(ResourcePackIO.getURL("assets/modbuilder/blocks/"));
if (folder.exists()){
for (File file : folder.listFiles()){
if (file.getAbsolutePath().endsWith(".json")){
@@ -146,8 +110,19 @@ public void updateList() {
}
}

public void closeEditor(String name){
if (openEditors.containsKey(name))
openEditors.remove(name);
private void saveBlock(BlockElement block){
if (block.itemModel != null)
ResourcePackIO.createFile(block.itemModel, "assets/modbuilder/models/item/" + block.name + ".json");
if (block.blockModel != null)
ResourcePackIO.createFile(block.blockModel, "assets/modbuilder/models/block/" + block.name + ".json");
ResourcePackIO.createFile(block.blockstate, "assets/modbuilder/blockstates/" + block.name + ".json");
ResourcePackIO.createFile(block.block, "assets/modbuilder/blocks/" + block.name + ".json");
addElement(block.name, block.getImage());

Editor.metaFile.resource.modbuilder.blocks.add(block.name);
Editor.metaFile.save();

Editor.langFile.list.add("tile.modbuilder_" + block.name + ".name=" + block.name);
Editor.langFile.save();
}
}
@@ -11,6 +11,7 @@
import java.util.Set;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

@@ -21,82 +22,59 @@
import twintro.minecraft.modbuilder.data.resources.models.BlockModelResource;
import twintro.minecraft.modbuilder.data.resources.models.ItemModelResource;
import twintro.minecraft.modbuilder.editor.ActivityButton;
import twintro.minecraft.modbuilder.editor.ActivityPanel;
import twintro.minecraft.modbuilder.editor.Editor;
import twintro.minecraft.modbuilder.editor.generator.ResourcePackGenerator;
import twintro.minecraft.modbuilder.editor.generator.ResourcePackIO;
import twintro.minecraft.modbuilder.editor.interfaces.choosewindows.ObjectRunnable;
import twintro.minecraft.modbuilder.editor.interfaces.editors.FoodItemEditor;
import twintro.minecraft.modbuilder.editor.interfaces.editors.RegularItemEditor;
import twintro.minecraft.modbuilder.editor.interfaces.editors.ToolItemEditor;
import twintro.minecraft.modbuilder.editor.resources.BlockElement;
import twintro.minecraft.modbuilder.editor.resources.ItemElement;

public class ItemsActivityPanel extends ActivityPanel {
private List<String> models;
private Map<String,RegularItemEditor> openEditors;
public class ItemsActivityPanel extends ObjectActivityPanel {
private final ObjectRunnable runnable = new ObjectRunnable() {
@Override
public void run(Object obj) {
saveItem((ItemElement) obj);
}
};

public ItemsActivityPanel(String header, String button) {
super(header, button);
this.models = new ArrayList<String>();
this.openEditors = new HashMap<String,RegularItemEditor>();
}

public ItemsActivityPanel(String header, String button, ArrayList<String> models) {
super(header, button);
this.models = models;
this.openEditors = new HashMap<String,RegularItemEditor>();
openEditors = new HashMap<String, JFrame>();
}

@Override
protected void add() {
String name = JOptionPane.showInputDialog("Item name:");
if (name != null){
if (name.replaceAll(" ", "").length() > 0 && !openEditors.containsKey(name)){
RegularItemEditor editor = new RegularItemEditor(name, this);
RegularItemEditor editor = new RegularItemEditor(name, runnable, closeHandler);
openEditors.put(name, editor);
}
}
}

protected void addFood(){
private void addFood(){
String name = JOptionPane.showInputDialog("Item name:");
if (name != null){
if (name.replaceAll(" ", "").length() > 0 && !openEditors.containsKey(name)){
FoodItemEditor editor = new FoodItemEditor(name, this);
FoodItemEditor editor = new FoodItemEditor(name, runnable, closeHandler);
openEditors.put(name, editor);
}
}
}

protected void addTool(){
private void addTool(){
String name = JOptionPane.showInputDialog("Item name:");
if (name != null){
if (name.replaceAll(" ", "").length() > 0 && !openEditors.containsKey(name)){
RegularItemEditor editor = new ToolItemEditor(name, this);
RegularItemEditor editor = new ToolItemEditor(name, runnable, closeHandler);
openEditors.put(name, editor);
}
}
}

public void addItem(ItemElement item){
createFile(item.itemModel, "assets/modbuilder/models/item/" + item.name + ".json");
createFile(item.item, "assets/modbuilder/items/" + item.name + ".json");
addElement(item.name, item.getImage());

Editor.metaFile.resource.modbuilder.items.add(item.name);
Editor.metaFile.save();

Editor.langFile.list.add("item.modbuilder_" + item.name + ".name=" + item.name);
Editor.langFile.save();
}

public void createFile(Object model, String dir){
try {
ResourcePackGenerator.createFile(model, dir);
} catch (IOException e) {
e.printStackTrace();
}
}

@Override
protected void edit() {
String value = (String) list.getSelectedValue();
@@ -105,9 +83,9 @@ protected void edit() {
ItemElement item = ItemElement.getFromName(value);
ItemType type = item.item.type;
RegularItemEditor editor;
if (type == ItemType.food) editor = new FoodItemEditor(this, item);
else if (type == ItemType.tool) editor = new ToolItemEditor(this, item);
else editor = new RegularItemEditor(this, item);
if (type == ItemType.food) editor = new FoodItemEditor(item, runnable, closeHandler);
else if (type == ItemType.tool) editor = new ToolItemEditor(item, runnable, closeHandler);
else editor = new RegularItemEditor(item, runnable, closeHandler);
openEditors.put(value,editor);
}
else {
@@ -125,8 +103,8 @@ protected void delete() {
+ "References to this object will not be updated, which might cause problems.",
"Warning", JOptionPane.YES_NO_OPTION);
if (result == JOptionPane.YES_OPTION){
ResourcePackGenerator.deleteFile("assets/modbuilder/models/item/" + value + ".json");
ResourcePackGenerator.deleteFile("assets/modbuilder/items/" + value + ".json");
ResourcePackIO.deleteFile("assets/modbuilder/models/item/" + value + ".json");
ResourcePackIO.deleteFile("assets/modbuilder/items/" + value + ".json");
removeElement(value);

Editor.metaFile.resource.modbuilder.items.remove(value);
@@ -136,27 +114,10 @@ protected void delete() {
Editor.langFile.save();
}
}
public void updateTextureReferences(String old, String newName){
try {
Set<String> names = this.getAllElements();
for (String nameOfElement : names){
ItemElement elementToReReference = ItemElement.getFromName(nameOfElement);
boolean isChanged = false;
if (elementToReReference.item.type == ItemType.regular){
ItemModelResource elementClassed = (ItemModelResource)elementToReReference.itemModel;
for (String texture : elementClassed.textures.values()){
if (texture == old){isChanged = true; texture = newName;}
}
if(isChanged)this.addItem(elementToReReference);
}

}
}catch(Exception e){}
}

@Override
public void updateList() {
File folder = new File(ResourcePackGenerator.getURL("assets/modbuilder/items/"));
File folder = new File(ResourcePackIO.getURL("assets/modbuilder/items/"));
if (folder.exists()){
for (File file : folder.listFiles()){
if (file.getAbsolutePath().endsWith(".json")){
@@ -172,11 +133,6 @@ public void updateList() {
}
}

public void closeEditor(String name){
if (openEditors.containsKey(name))
openEditors.remove(name);
}

@Override
protected void createButtonPanel(JPanel buttonPanel, String button) {
JButton toolButton = new ActivityButton("New Tool");
@@ -197,4 +153,16 @@ public void actionPerformed(ActionEvent e) {

super.createButtonPanel(buttonPanel, button);
}

private void saveItem(ItemElement item){
ResourcePackIO.createFile(item.itemModel, "assets/modbuilder/models/item/" + item.name + ".json");
ResourcePackIO.createFile(item.item, "assets/modbuilder/items/" + item.name + ".json");
addElement(item.name, item.getImage());

Editor.metaFile.resource.modbuilder.items.add(item.name);
Editor.metaFile.save();

Editor.langFile.list.add("item.modbuilder_" + item.name + ".name=" + item.name);
Editor.langFile.save();
}
}
@@ -0,0 +1,27 @@
package twintro.minecraft.modbuilder.editor.interfaces.activitypanels;

import java.util.Map;

import javax.swing.JFrame;

import twintro.minecraft.modbuilder.editor.interfaces.choosewindows.ObjectRunnable;

public abstract class ObjectActivityPanel extends ActivityPanel {
protected Map<String, JFrame> openEditors;

protected final ObjectRunnable closeHandler = new ObjectRunnable() {
@Override
public void run(Object obj) {
closeEditor((String) obj);
}
};

public ObjectActivityPanel (String header, String button){
super(header, button);
}

private void closeEditor(String name){
if (openEditors.containsKey(name))
openEditors.remove(name);
}
}
@@ -22,131 +22,62 @@
import twintro.minecraft.modbuilder.data.resources.recipes.ShapelessRecipe;
import twintro.minecraft.modbuilder.data.resources.recipes.SmeltingRecipe;
import twintro.minecraft.modbuilder.editor.ActivityButton;
import twintro.minecraft.modbuilder.editor.ActivityPanel;
import twintro.minecraft.modbuilder.editor.Editor;
import twintro.minecraft.modbuilder.editor.generator.ResourcePackGenerator;
import twintro.minecraft.modbuilder.editor.generator.ResourcePackIO;
import twintro.minecraft.modbuilder.editor.interfaces.choosewindows.ObjectRunnable;
import twintro.minecraft.modbuilder.editor.interfaces.editors.ShapedRecipeEditor;
import twintro.minecraft.modbuilder.editor.interfaces.editors.ShapelessRecipeEditor;
import twintro.minecraft.modbuilder.editor.interfaces.editors.SmeltingRecipeEditor;
import twintro.minecraft.modbuilder.editor.resources.ItemElement;
import twintro.minecraft.modbuilder.editor.resources.RecipeElement;

public class RecipesActivityPanel extends ActivityPanel {
public Map<String, JFrame> openEditors;
public class RecipesActivityPanel extends ObjectActivityPanel {
private final ObjectRunnable runnable = new ObjectRunnable() {
@Override
public void run(Object obj) {
saveRecipe((RecipeElement) obj);
}
};

public RecipesActivityPanel(String header, String button) {
super(header, button);
this.openEditors = new HashMap<String, JFrame>();
}

protected void createButtonPanel(JPanel buttonPanel, String button) {
JButton ShapedButton = new ActivityButton("New Shaped Recipe");
ShapedButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
addShaped();
}
});
buttonPanel.add(ShapedButton);

super.createButtonPanel(buttonPanel, button);

JButton shapedButton = new ActivityButton("New Smelting Recipe");
shapedButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
addSmelting();
}
});
buttonPanel.add(shapedButton);
}

@Override
protected void add() {
String name = JOptionPane.showInputDialog("Recipe name:");
if (name != null){
if (name.replaceAll(" ", "").length() > 0 && !openEditors.containsKey(name)){
ShapelessRecipeEditor editor = new ShapelessRecipeEditor(name, this);
ShapelessRecipeEditor editor = new ShapelessRecipeEditor(name, runnable, closeHandler);
openEditors.put(name, editor);
}
}
}

protected void addSmelting(){
private void addSmelting(){
String name = JOptionPane.showInputDialog("Recipe name:");
if (name != null){
if (name.replaceAll(" ", "").length() > 0 && !openEditors.containsKey(name)){
SmeltingRecipeEditor editor = new SmeltingRecipeEditor(name, this);
SmeltingRecipeEditor editor = new SmeltingRecipeEditor(name, runnable, closeHandler);
openEditors.put(name, editor);
}
}
}

protected void addShaped(){
private void addShaped(){
String name = JOptionPane.showInputDialog("Recipe name:");
if (name != null){
if (name.replaceAll(" ", "").length() > 0 && !openEditors.containsKey(name)){
ShapedRecipeEditor editor = new ShapedRecipeEditor(name, this);
ShapedRecipeEditor editor = new ShapedRecipeEditor(name, runnable, closeHandler);
openEditors.put(name, editor);
}
}
}

public void updateItemAndBlockReferences(String old, String newName, boolean isBlock){
try {
Set<String> names = this.getAllElements();
for (String nameOfElement : names){
RecipeElement elementToReReference = RecipeElement.getFromName(nameOfElement);
boolean isChanged = false;
if (elementToReReference.recipe.type == RecipeType.shaped){
ShapedRecipe elementClassed = (ShapedRecipe)elementToReReference.recipe;
for (ItemStackResource item : elementClassed.input.values()){
if (isBlock && item.block == old) {item.block = newName; isChanged = true;}
if (!isBlock && item.item == old) {item.item = newName; isChanged = true;}
}
if (isBlock && elementClassed.output.block == old){elementClassed.output.block = newName; isChanged=true;}
if (!isBlock && elementClassed.output.item == old){elementClassed.output.item = newName; isChanged=true;}
if (isChanged) this.addRecipe(elementToReReference);
} else if (elementToReReference.recipe.type == RecipeType.shapeless){
ShapelessRecipe elementClassed = (ShapelessRecipe)elementToReReference.recipe;
for (ItemStackResource item : elementClassed.input){
if (isBlock && item.block == old) {item.block = newName; isChanged = true;}
if (!isBlock && item.item == old) {item.item = newName; isChanged = true;}
}
if (isBlock && elementClassed.output.block == old){elementClassed.output.block = newName; isChanged=true;}
if (!isBlock && elementClassed.output.item == old){elementClassed.output.item = newName; isChanged=true;}
if (isChanged) this.addRecipe(elementToReReference);
} else if (elementToReReference.recipe.type == RecipeType.smelting){
SmeltingRecipe elementClassed = (SmeltingRecipe)elementToReReference.recipe;
if (isBlock && elementClassed.input.block == old){elementClassed.input.block = newName; isChanged=true;}
if (!isBlock && elementClassed.input.item == old){elementClassed.input.item = newName; isChanged=true;}
if (isBlock && elementClassed.output.block == old){elementClassed.output.block = newName; isChanged=true;}
if (!isBlock && elementClassed.output.item == old){elementClassed.output.item = newName; isChanged=true;}
if (isChanged) this.addRecipe(elementToReReference);
}
}
} catch (Exception e){}
}

public void addRecipe(RecipeElement recipe){
createFile(recipe.recipe, "assets/modbuilder/recipes/" + recipe.name + ".json");
ImageIcon img = recipe.getImage();
if (img == null) img = new ImageIcon();
addElement(recipe.name, img);

Editor.metaFile.resource.modbuilder.recipes.add(recipe.name);
Editor.metaFile.save();
}

public void createFile(Object model, String dir){
try {
ResourcePackGenerator.createFile(model, dir);
} catch (IOException e) {
e.printStackTrace();
}
}

@Override
protected void edit() {
String value = (String) list.getSelectedValue();
String value = (String) list.getSelectedValue();
try {
if (!openEditors.containsKey(value)){
RecipeElement recipe = RecipeElement.getFromName(value);
@@ -155,13 +86,13 @@ protected void edit() {

switch(type){
case shaped:
editor = new ShapedRecipeEditor(value, this, recipe);
editor = new ShapedRecipeEditor(recipe, runnable, closeHandler);
break;
case smelting:
editor = new SmeltingRecipeEditor(value, this, recipe);
editor = new SmeltingRecipeEditor(recipe, runnable, closeHandler);
break;
default:
editor = new ShapelessRecipeEditor(value, this, recipe);
editor = new ShapelessRecipeEditor(recipe, runnable, closeHandler);
break;
}
openEditors.put(value,editor);
@@ -181,22 +112,17 @@ protected void delete() {
+ "References to this object will not be updated, which might cause problems.",
"Warning", JOptionPane.YES_NO_OPTION);
if (result == JOptionPane.YES_OPTION){
ResourcePackGenerator.deleteFile("assets/modbuilder/recipes/" + value + ".json");
ResourcePackIO.deleteFile("assets/modbuilder/recipes/" + value + ".json");
removeElement(value);

Editor.metaFile.resource.modbuilder.recipes.remove(value);
Editor.metaFile.save();
}
}

public void closeEditor(String name) {
if (openEditors.containsKey(name))
openEditors.remove(name);
}

@Override
public void updateList() {
File folder = new File(ResourcePackGenerator.getURL("assets/modbuilder/recipes/"));
File folder = new File(ResourcePackIO.getURL("assets/modbuilder/recipes/"));
if (folder.exists()){
for (File file : folder.listFiles()){
if (file.getAbsolutePath().endsWith(".json")){
@@ -212,4 +138,35 @@ public void updateList() {
}
}
}

@Override
protected void createButtonPanel(JPanel buttonPanel, String button) {
JButton ShapedButton = new ActivityButton("New Shaped Recipe");
ShapedButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
addShaped();
}
});
buttonPanel.add(ShapedButton);

super.createButtonPanel(buttonPanel, button);

JButton shapedButton = new ActivityButton("New Smelting Recipe");
shapedButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
addSmelting();
}
});
buttonPanel.add(shapedButton);
}

private void saveRecipe(RecipeElement recipe){
ResourcePackIO.createFile(recipe.recipe, "assets/modbuilder/recipes/" + recipe.name + ".json");
ImageIcon img = recipe.getImage();
if (img == null) img = new ImageIcon();
addElement(recipe.name, img);

Editor.metaFile.resource.modbuilder.recipes.add(recipe.name);
Editor.metaFile.save();
}
}
@@ -1,5 +1,7 @@
package twintro.minecraft.modbuilder.editor.interfaces.activitypanels;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
@@ -9,7 +11,10 @@
import java.util.Map;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
@@ -20,64 +25,42 @@
import twintro.minecraft.modbuilder.data.resources.blocks.BaseBlockResource;
import twintro.minecraft.modbuilder.data.resources.blocks.BlockResource;
import twintro.minecraft.modbuilder.data.resources.models.BlockModelResource;
import twintro.minecraft.modbuilder.editor.ActivityPanel;
import twintro.minecraft.modbuilder.editor.ActivityButton;
import twintro.minecraft.modbuilder.editor.Editor;
import twintro.minecraft.modbuilder.editor.generator.ResourcePackGenerator;
import twintro.minecraft.modbuilder.editor.generator.ResourcePackIO;
import twintro.minecraft.modbuilder.editor.interfaces.choosewindows.ObjectRunnable;
import twintro.minecraft.modbuilder.editor.interfaces.editors.GroundStructureEditor;
import twintro.minecraft.modbuilder.editor.interfaces.editors.StructureEditor;
import twintro.minecraft.modbuilder.editor.resources.BlockElement;
import twintro.minecraft.modbuilder.editor.resources.ItemElement;
import twintro.minecraft.modbuilder.editor.resources.RecipeElement;


public class StructureActivityPanel extends ActivityPanel {
public Map<String,StructureEditor> openEditors;
public class StructureActivityPanel extends ObjectActivityPanel {
private final ObjectRunnable runnable = new ObjectRunnable() {
@Override
public void run(Object obj) {
saveStructure();
}
};

public StructureActivityPanel(String header, String button) {
super(header, button);
this.openEditors = new HashMap<String, StructureEditor>();
this.openEditors = new HashMap<String, JFrame>();
}

@Override
protected void add() {
String name = JOptionPane.showInputDialog("Structure name:");
if (name != null){
if (name.replaceAll(" ", "").length() > 0 && !openEditors.containsKey(name)){
StructureEditor editor = new StructureEditor(name, this, null);
openEditors.put(name, editor);
//TODO
}
}

}

public void addStructure(){
/*
if (block.itemModel != null)
createFile(block.itemModel, "assets/modbuilder/models/item/" + block.name + ".json");
if (block.blockModel != null)
createFile(block.blockModel, "assets/modbuilder/models/block/" + block.name + ".json");
createFile(block.blockstate, "assets/modbuilder/blockstates/" + block.name + ".json");
createFile(block.block, "assets/modbuilder/blocks/" + block.name + ".json");
addElement(block.name, block.getImage());
main.metaFile.resource.modbuilder.blocks.add(block.name);
main.metaFile.save();
main.langFile.list.add("tile.modbuilder_" + block.name + ".name=" + block.name);
main.langFile.save();
*/
}

public void createFile(Object model, String dir){
try {
ResourcePackGenerator.createFile(model, dir);
} catch (IOException e) {
e.printStackTrace();
}
}

@Override
protected void edit() {
String value = (String) list.getSelectedValue();
//TODO
}

@Override
@@ -87,24 +70,13 @@ protected void delete() {
+ "References to this object will not be updated, which might cause problems.",
"Warning", JOptionPane.YES_NO_OPTION);
if (result == JOptionPane.YES_OPTION){
/* ResourcePackGenerator.deleteFile("assets/modbuilder/blocks/" + value + ".json");
ResourcePackGenerator.deleteFile("assets/modbuilder/blockstates/" + value + ".json");
ResourcePackGenerator.deleteFile("assets/modbuilder/models/block/" + value + ".json");
ResourcePackGenerator.deleteFile("assets/modbuilder/models/item/" + value + ".json");
*/
removeElement(value);

Editor.metaFile.resource.modbuilder.blocks.remove(value);
Editor.metaFile.save();

Editor.langFile.list.remove("tile.modbuilder_" + value + ".name=" + value);
Editor.langFile.save();
//TODO
}
}

@Override
public void updateList() {
File folder = new File(ResourcePackGenerator.getURL("assets/modbuilder/structures/"));
File folder = new File(ResourcePackIO.getURL("assets/modbuilder/structures/"));
if (folder.exists()){
for (File file : folder.listFiles()){
if (file.getAbsolutePath().endsWith(".json")){
@@ -118,4 +90,14 @@ public void updateList() {
}
}
}

@Override
protected void createButtonPanel(JPanel buttonPanel, String button) {
super.createButtonPanel(buttonPanel, button);
//TODO
}

private void saveStructure(){
//TODO
}
}
@@ -14,52 +14,43 @@
import javax.swing.JPanel;

import twintro.minecraft.modbuilder.editor.ActivityButton;
import twintro.minecraft.modbuilder.editor.ActivityPanel;
import twintro.minecraft.modbuilder.editor.Editor;
import twintro.minecraft.modbuilder.editor.generator.ResourcePackGenerator;
import twintro.minecraft.modbuilder.editor.generator.ResourcePackIO;
import twintro.minecraft.modbuilder.editor.interfaces.choosewindows.ObjectRunnable;
import twintro.minecraft.modbuilder.editor.interfaces.editors.TextureEditor;
import twintro.minecraft.modbuilder.editor.resources.TextureObject;

public class TexturesActivityPanel extends ActivityPanel {
TextureEditor editor;

private final ObjectRunnable runnable = new ObjectRunnable() {
@Override
public void run(Object obj) {
saveImage((TextureObject) obj);
}
};

public TexturesActivityPanel(String header, String button) {
super(header, button);
editor = new TextureEditor(this);
}

@Override
protected void createButtonPanel(JPanel buttonPanel, String button) {
JButton importButton = new ActivityButton("Import Image");
importButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
importImage();
}
});
buttonPanel.add(importButton);
super.createButtonPanel(buttonPanel, button);
}

private void importImage(){
editor.loadImage();
editor = new TextureEditor(runnable);
}

@Override
protected void add() {
String name = JOptionPane.showInputDialog("Texture name:");
if (name != null)
if (name.replaceAll(" ", "").length() > 0)
editor.open(name, toBufferedImage(new ImageIcon().getImage(), 16, 16));
editor.open(name, ResourcePackIO.toBufferedImage(new ImageIcon().getImage(), 16, 16));
}

public void addImage(ImageIcon img, String name){
ResourcePackGenerator.addTexture(toBufferedImage(img.getImage()), "assets/modbuilder/textures/" + name + ".png");
addElement(name, img);
private void importImage(){
editor.loadImage();
}

@Override
protected void edit() {
String value = (String) list.getSelectedValue();
editor.open(value, toBufferedImage(resizeImage(elements.get(value), 16, 16).getImage()));
editor.open(value, ResourcePackIO.toBufferedImage(ResourcePackIO.resizeImage(elements.get(value), 16, 16).getImage()));
}

@Override
@@ -69,14 +60,14 @@ protected void delete() {
+ "References to this object will not be updated, which might cause problems.",
"Warning", JOptionPane.YES_NO_OPTION);
if (result == JOptionPane.YES_OPTION){
ResourcePackGenerator.deleteFile("assets/modbuilder/textures/" + value + ".png");
ResourcePackIO.deleteFile("assets/modbuilder/textures/" + value + ".png");
removeElement(value);
}
}

@Override
public void updateList() {
File folder = new File(ResourcePackGenerator.getURL("assets/modbuilder/textures/"));
File folder = new File(ResourcePackIO.getURL("assets/modbuilder/textures/"));
if (folder.exists()){
for (File file : folder.listFiles()){
if (file.getAbsolutePath().endsWith(".png")){
@@ -87,4 +78,22 @@ public void updateList() {
}
}
}

@Override
protected void createButtonPanel(JPanel buttonPanel, String button) {
JButton importButton = new ActivityButton("Import Image");
importButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
importImage();
}
});
buttonPanel.add(importButton);
super.createButtonPanel(buttonPanel, button);
}

private void saveImage(TextureObject texture){
ResourcePackIO.addTexture(ResourcePackIO.toBufferedImage(texture.image.getImage()),
"assets/modbuilder/textures/" + texture.name + ".png");
addElement(texture.name, texture.image);
}
}
@@ -44,16 +44,16 @@
import javax.swing.event.ListSelectionListener;

import twintro.minecraft.modbuilder.data.resources.models.BlockModelResource;
import twintro.minecraft.modbuilder.editor.ActivityPanel;
import twintro.minecraft.modbuilder.editor.CustomListCellRenderer;
import twintro.minecraft.modbuilder.editor.Editor;
import twintro.minecraft.modbuilder.editor.ListPanel;
import twintro.minecraft.modbuilder.editor.generator.ResourcePackGenerator;
import twintro.minecraft.modbuilder.editor.generator.ResourcePackIO;
import twintro.minecraft.modbuilder.editor.interfaces.activitypanels.ActivityPanel;
import twintro.minecraft.modbuilder.editor.interfaces.helperclasses.CustomListCellRenderer;
import twintro.minecraft.modbuilder.editor.interfaces.helperclasses.IconFrame;
import twintro.minecraft.modbuilder.editor.interfaces.helperclasses.ListPanel;

public class BlockModelChooseWindow extends IconFrame {
public class BlockModelChooseWindow extends JDialog {
ObjectRunnable runnable;
ListPanel listPanel;
BlockModelRunnable main;
int modelType = 1;
ImageIcon selectedImage;
String selectedImageName;
@@ -80,18 +80,28 @@ public class BlockModelChooseWindow extends IconFrame {
new Point(192,160)
};

public BlockModelChooseWindow(BlockModelRunnable main){
//TODO undo lode's accidental change and put shit to the right again
this.main = main;
load();
public BlockModelChooseWindow(ObjectRunnable runnable){
this.runnable = runnable;
initialize();
setVisible(true);
}

public BlockModelChooseWindow(ObjectRunnable runnable, BlockModelResource model){
this.runnable = runnable;
initialize();
load(model);
setVisible(true);
}

private void initialize(){
setModal(true);
setBounds(100, 100, 500, 400);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setTitle("Choose Block Model:");

listPanel = new ListPanel();
listPanel.setLayout(new BorderLayout(0, 0));
listPanel.elements = Editor.TexturePanel.elements;
listPanel.elements = Editor.getTextureList();
getContentPane().add(listPanel, BorderLayout.LINE_END);

JScrollPane scrollPane = new JScrollPane();
@@ -196,8 +206,6 @@ public void mouseDragged(MouseEvent me) {
mousemove(me);
}
});

setVisible(true);
}

public void paint1(Graphics g){
@@ -384,18 +392,17 @@ public void save(){
model.textures.put("cross", "modbuilder:"+textureNames2[0]);
model.textures.put("particle", "modbuilder:"+textureNames2[0]);
}
main.setModel(model);
runnable.run(model);
this.dispose();
}

public void load(){
BlockModelResource model = main.getModel();
if(model==null) return;
public void load(BlockModelResource model){
if(model.parent.equals("block/cube")) {
String[] name = new String[]{"up","west","south","east","north","down"};
for(int i=0;i<6;i++){
if (model.textures.get(name[i]).split(":")[0].equals("modbuilder")) {
String loc=ResourcePackGenerator.resourcePackFolderDir + "assets/modbuilder/textures/" + model.textures.get(name[i]).split(":")[1] + ".png";
String loc=ResourcePackIO.getURL("assets/modbuilder/textures/" +
model.textures.get(name[i]).split(":")[1] + ".png");
try{
Image img = ImageIO.read(new File(loc)).getScaledInstance(64, 64, 0);
BufferedImage bi = new BufferedImage(64,64,BufferedImage.TYPE_INT_ARGB);
@@ -413,7 +420,8 @@ public void load(){
}
if(model.parent.equals("block/cross")) {
if (model.textures.get("cross").split(":")[0].equals("modbuilder")) {
String loc=ResourcePackGenerator.resourcePackFolderDir + "assets/modbuilder/textures/" + model.textures.get("cross").split(":")[1] + ".png";
String loc=ResourcePackIO.getURL("assets/modbuilder/textures/"
+ model.textures.get("cross").split(":")[1] + ".png");
try{
Image img = ImageIO.read(new File(loc)).getScaledInstance(64, 64, 0);
BufferedImage bi = new BufferedImage(64,64,BufferedImage.TYPE_INT_ARGB);
@@ -432,7 +440,8 @@ public void load(){
}
if(model.parent.equals("block/cube_all")) {
if (model.textures.get("all").split(":")[0].equals("modbuilder")) {
String loc=ResourcePackGenerator.resourcePackFolderDir + "assets/modbuilder/textures/" + model.textures.get("all").split(":")[1] + ".png";
String loc=ResourcePackIO.getURL("assets/modbuilder/textures/"
+ model.textures.get("all").split(":")[1] + ".png");
try{
Image img = ImageIO.read(new File(loc)).getScaledInstance(64, 64, 0);
BufferedImage bi = new BufferedImage(64,64,BufferedImage.TYPE_INT_ARGB);
@@ -458,10 +467,4 @@ public void load(){
return;
}
}

@Override
public void dispose() {
main.blockModelChooserDispose();
super.dispose();
}
}

This file was deleted.

@@ -42,23 +42,20 @@ public class ItemStackChooseWindow extends JDialog {
private JSpinner stackSizeSpinner;
private JCheckBox containerCheckBox;

private MaterialChooseWindow materialChooseWindow;
private boolean isProduct;
private ItemStackRunnable runnable;
private ObjectRunnable runnable;

private static final String materialProductTooltip = "The material of the product";
private static final String materialIngredientTooltip = "The material of the ingredient";
private static final String containerTooltip = "<html>The material of the container<br>"
+ "The container is the item or block that will be left behind after crafting</html>";
private static final String stackSizeTooltip = "The amount of the item or block that will be crafted";

public ItemStackChooseWindow(Window parent, boolean isProduct, ItemStackRunnable runnable){
super(parent);
setModal(true);

public ItemStackChooseWindow(boolean isProduct, ObjectRunnable runnable){
this.isProduct = isProduct;
this.runnable = runnable;


setModal(true);
setBounds(100, 100, 300, 130);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
if (isProduct)
@@ -182,8 +179,8 @@ public void actionPerformed(ActionEvent e) {
setVisible(true);
}

public ItemStackChooseWindow(Window parent, boolean isProduct, ItemStackRunnable runnable, ItemStackResource item){
this(parent, isProduct, runnable);
public ItemStackChooseWindow(boolean isProduct, ObjectRunnable runnable, ItemStackResource item){
this(isProduct, runnable);

if (item.item != null)
materialLabel.setText(item.item);
@@ -199,19 +196,12 @@ else if (item.block != null)
}

private void chooseMaterial(){
if (materialChooseWindow == null){
materialChooseWindow = new MaterialChooseWindow(this, MaterialChooseWindow.ITEMS_BLOCKS_NONE, new MaterialRunnable() {
@Override
public void chooseMaterial(String material) {
materialLabel.setText(material);
}

@Override
public void materialChooserDispose() {
materialChooseWindow = null;
}
});
}
new MaterialChooseWindow(MaterialChooseWindow.ITEMS_BLOCKS_NONE, new ObjectRunnable() {
@Override
public void run(Object obj) {
materialLabel.setText((String) obj);
}
});
}

private void useContainer(){
@@ -222,27 +212,19 @@ private void useContainer(){
}

private void chooseContainer(){
if (materialChooseWindow == null){
materialChooseWindow = new MaterialChooseWindow(this, MaterialChooseWindow.ITEMS_BLOCKS_NONE, new MaterialRunnable() {
@Override
public void chooseMaterial(String material) {
containerLabel.setText(material);
}

@Override
public void materialChooserDispose() {
materialChooseWindow = null;
}
});
}
new MaterialChooseWindow(MaterialChooseWindow.ITEMS_BLOCKS_NONE, new ObjectRunnable() {
@Override
public void run(Object obj) {
containerLabel.setText((String) obj);
}
});
}

private void save(){
String material = materialLabel.getText();
if (material != null){
ItemStackResource item = new ItemStackResource();

//TODO material.split":"[1] also in ToolItemEditor 233
if (MaterialResources.isItem(material))
item.item = material;
else
@@ -252,20 +234,12 @@ private void save(){
else if (containerCheckBox.isSelected())
item.container = containerLabel.getText();

runnable.chooseItemStack(item);

runnable.run(item);
dispose();
}
}

private void cancel(){
if (materialChooseWindow != null) materialChooseWindow.dispose();
dispose();
}

@Override
public void dispose() {
runnable.itemStackChooserDispose();
super.dispose();
}
}

This file was deleted.

@@ -0,0 +1,103 @@
package twintro.minecraft.modbuilder.editor.interfaces.choosewindows;

import java.awt.BorderLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Map;

import javax.swing.AbstractListModel;
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;

import twintro.minecraft.modbuilder.editor.interfaces.helperclasses.CustomListCellRenderer;
import twintro.minecraft.modbuilder.editor.interfaces.helperclasses.ListPanel;
import twintro.minecraft.modbuilder.editor.resources.MaterialResources;

public class ListWindow extends JDialog {
private JPanel panel;
private JList list;
private String[] values;
private ObjectRunnable runnable;

private ListWindow(JPanel panel, ObjectRunnable runnable){
this.panel = panel;
this.runnable = runnable;

setModal(true);
setBounds(100, 100, 300, 200);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setTitle("Choose Material");

panel = new ListPanel();
panel.setLayout(new BorderLayout(0, 0));
getContentPane().add(panel, BorderLayout.CENTER);

JScrollPane scrollPane = new JScrollPane();
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
panel.add(scrollPane, BorderLayout.CENTER);

list = new JList();
scrollPane.setViewportView(list);
list.setVisibleRowCount(0);
list.setLayoutOrientation(JList.HORIZONTAL_WRAP);

setVisible(true);
}

public ListWindow(Map<String, ImageIcon> elements, ObjectRunnable runnable){
this(new ListPanel(), runnable);
((ListPanel)panel).elements = elements;

list.setFixedCellWidth(128);
list.setCellRenderer(new CustomListCellRenderer((ListPanel)panel));
list.setModel(new AbstractListModel() {
public int getSize() {
return ((ListPanel)panel).elements.size();
}
public Object getElementAt(int index) {
return ((ListPanel)panel).elements.keySet().toArray()[index];
}
});
list.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e){
if (e.getClickCount() == 2){
String value = (String) ((JList) e.getSource()).getSelectedValue();
choose("modbuilder:" + value);
}
}
});
}

public ListWindow(String[] elements, ObjectRunnable runnable){
this(new JPanel(), runnable);
values = elements;

list.setFixedCellWidth(128);
list.setModel(new AbstractListModel() {
public int getSize() {
return values.length;
}
public Object getElementAt(int index) {
return values[index];
}
});
list.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e){
if (e.getClickCount() == 2){
String value = (String) ((JList) e.getSource()).getSelectedValue();
choose(MaterialResources.getId(value));
}
}
});
}

private void choose(String value){
runnable.run(value);
dispose();
}
}
@@ -21,11 +21,11 @@
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;

import twintro.minecraft.modbuilder.editor.CustomListCellRenderer;
import twintro.minecraft.modbuilder.editor.Editor;
import twintro.minecraft.modbuilder.editor.ListPanel;
import twintro.minecraft.modbuilder.editor.interfaces.editors.RegularItemEditor;
import twintro.minecraft.modbuilder.editor.interfaces.helperclasses.CustomListCellRenderer;
import twintro.minecraft.modbuilder.editor.interfaces.helperclasses.IconFrame;
import twintro.minecraft.modbuilder.editor.interfaces.helperclasses.ListPanel;
import twintro.minecraft.modbuilder.editor.resources.MaterialResources;

public class MaterialChooseWindow extends JDialog {
@@ -41,15 +41,12 @@ public class MaterialChooseWindow extends JDialog {
private static final String otherTooltip = "";//TODO
private static final String noneTooltip = "";//TODO

private MaterialRunnable runnable;
private ListWindow listWindow = null;
private ObjectRunnable runnable;

public MaterialChooseWindow(Window parent, int type, MaterialRunnable runnable){
super(parent);
setModal(true);

public MaterialChooseWindow(int type, ObjectRunnable runnable){
this.runnable = runnable;


setModal(true);
if (type == ITEMS_AND_BLOCKS || type == ITEMS_BLOCKS_NONE)
setBounds(100, 100, 300, 120);
else
@@ -131,145 +128,54 @@ public void actionPerformed(ActionEvent e) {
}

private void customItem(){
if (listWindow == null){
listWindow = new ListWindow(Editor.ItemPanel.elements, this);
}
new ListWindow(Editor.getItemList(), new ObjectRunnable(){
@Override
public void run(Object obj){
choose((String) obj);
}
});
}

private void customBlock(){
if (listWindow == null){
listWindow = new ListWindow(Editor.BlockPanel.elements, this);
}
new ListWindow(Editor.getBlockList(), new ObjectRunnable(){
@Override
public void run(Object obj){
choose((String) obj);
}
});
}

private void vanillaItem(){
if (listWindow == null){
listWindow = new ListWindow(MaterialResources.vanillaItems, this);
}
new ListWindow(MaterialResources.vanillaItems, new ObjectRunnable(){
@Override
public void run(Object obj){
choose((String) obj);
}
});
}

private void vanillaBlock(){
if (listWindow == null){
listWindow = new ListWindow(MaterialResources.vanillaBlocks, this);
}
new ListWindow(MaterialResources.vanillaBlocks, new ObjectRunnable(){
@Override
public void run(Object obj){
choose((String) obj);
}
});
}

private void other(){
if (listWindow == null){
String material = JOptionPane.showInputDialog("Material name:");
if (material != null){
choose(material);
}
String material = JOptionPane.showInputDialog("Material name:");
if (material != null){
choose(material);
}
}

private void none(){
choose("");
}

public void listWindowDispose(){
listWindow = null;
}

public void choose(String value){
runnable.chooseMaterial(value);
private void choose(String value){
runnable.run(value);
dispose();
}

@Override
public void dispose() {
if (listWindow != null) listWindow.dispose();
runnable.materialChooserDispose();
super.dispose();
}

public static class ListWindow extends IconFrame {
JPanel panel;
JList list;
String[] values;
MaterialChooseWindow main;

private ListWindow(JPanel startPanel, MaterialChooseWindow main){
panel = startPanel;
this.main = main;

setBounds(100, 100, 300, 200);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setTitle("Choose Material");

panel = new ListPanel();
panel.setLayout(new BorderLayout(0, 0));
getContentPane().add(panel, BorderLayout.CENTER);

JScrollPane scrollPane = new JScrollPane();
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
panel.add(scrollPane, BorderLayout.CENTER);

list = new JList();
scrollPane.setViewportView(list);
list.setVisibleRowCount(0);
list.setLayoutOrientation(JList.HORIZONTAL_WRAP);

setVisible(true);
}

public ListWindow(Map<String, ImageIcon> elements, MaterialChooseWindow main){
this(new ListPanel(), main);

((ListPanel)panel).elements = elements;

list.setFixedCellWidth(128);
list.setCellRenderer(new CustomListCellRenderer((ListPanel)panel));
list.setModel(new AbstractListModel() {
public int getSize() {
return ((ListPanel)panel).elements.size();
}
public Object getElementAt(int index) {
return ((ListPanel)panel).elements.keySet().toArray()[index];
}
});
list.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e){
if (e.getClickCount() == 2){
String value = (String) ((JList) e.getSource()).getSelectedValue();
choose("modbuilder:" + value);
}
}
});
}

public ListWindow(String[] elements, MaterialChooseWindow main){
this(new JPanel(), main);

values = elements;

list.setFixedCellWidth(128);
list.setModel(new AbstractListModel() {
public int getSize() {
return values.length;
}
public Object getElementAt(int index) {
return values[index];
}
});
list.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e){
if (e.getClickCount() == 2){
String value = (String) ((JList) e.getSource()).getSelectedValue();
choose(MaterialResources.getId(value));
}
}
});
}

private void choose(String value){
main.choose(value);
}

@Override
public void dispose() {
main.listWindowDispose();
super.dispose();
}
}
}

This file was deleted.

@@ -0,0 +1,5 @@
package twintro.minecraft.modbuilder.editor.interfaces.choosewindows;

public interface ObjectRunnable {
public void run(Object obj);
}
@@ -1,6 +1,7 @@
package twintro.minecraft.modbuilder.editor.interfaces.choosewindows;

import java.awt.BorderLayout;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
@@ -17,26 +18,27 @@
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;

import twintro.minecraft.modbuilder.editor.ActivityPanel;
import twintro.minecraft.modbuilder.editor.CustomListCellRenderer;
import twintro.minecraft.modbuilder.editor.Editor;
import twintro.minecraft.modbuilder.editor.ListPanel;
import twintro.minecraft.modbuilder.editor.interfaces.activitypanels.ActivityPanel;
import twintro.minecraft.modbuilder.editor.interfaces.helperclasses.CustomListCellRenderer;
import twintro.minecraft.modbuilder.editor.interfaces.helperclasses.IconFrame;
import twintro.minecraft.modbuilder.editor.interfaces.helperclasses.ListPanel;

public class TextureChooseWindow extends IconFrame {
ListPanel listPanel;
TextureRunnable main;
public class TextureChooseWindow extends JDialog {
private ListPanel listPanel;
private ObjectRunnable runnable;

public TextureChooseWindow(TextureRunnable main){
this.main = main;

public TextureChooseWindow(ObjectRunnable runnable){
this.runnable = runnable;

setModal(true);
setBounds(100, 100, 300, 200);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setTitle("Choose Texture");

listPanel = new ListPanel();
listPanel.setLayout(new BorderLayout(0, 0));
listPanel.elements = Editor.TexturePanel.elements;
listPanel.elements = Editor.getTextureList();
getContentPane().add(listPanel, BorderLayout.CENTER);

JScrollPane scrollPane = new JScrollPane();
@@ -70,13 +72,7 @@ public void mouseClicked(MouseEvent e){
}

public void choose(String texture){
main.chooseTexture(texture);
this.dispose();
}

@Override
public void dispose() {
main.textureChooserDispose();
super.dispose();
runnable.run(texture);
dispose();
}
}

This file was deleted.

@@ -41,50 +41,50 @@
import twintro.minecraft.modbuilder.data.resources.models.ItemModelResource.Display;
import twintro.minecraft.modbuilder.editor.interfaces.activitypanels.BlocksActivityPanel;
import twintro.minecraft.modbuilder.editor.interfaces.choosewindows.BlockModelChooseWindow;
import twintro.minecraft.modbuilder.editor.interfaces.choosewindows.BlockModelRunnable;
import twintro.minecraft.modbuilder.editor.interfaces.choosewindows.ObjectRunnable;
import twintro.minecraft.modbuilder.editor.interfaces.helperclasses.WindowClosingVerifierListener;
import twintro.minecraft.modbuilder.editor.interfaces.helperclasses.WindowClosingVerifierUser;
import twintro.minecraft.modbuilder.editor.resources.BlockElement;

public class BlockEditor extends WindowClosingVerifierUser implements BlockModelRunnable {
protected JPanel buttonPanel;
protected JPanel mainPanel;
protected JPanel labelPanel;
protected JPanel interactionPanel;
protected JPanel modelPanel;
protected JLabel labelCreativeTab;
protected JLabel labelModel;
protected JLabel labelLightness;
protected JLabel labelOpacity;
protected JLabel labelSlipperiness;
protected JLabel labelHardness;
protected JLabel labelResistance;
protected JLabel labelHarvestLevel;
protected JLabel labelBurntime;
protected JLabel labelHarvestType;
protected JLabel labelMaterial;
protected JLabel labelUnbreakable;
protected JLabel modelLabel;
protected JButton renameButton;
protected JButton saveBlockButton;
protected JButton cancelButton;
protected JButton modelChooseButton;
protected JSpinner lightnessSpinner;
protected JSpinner opacitySpinner;
protected JSpinner slipperinessSpinner;
protected JSpinner hardnessSpinner;
protected JSpinner resistanceSpinner;
protected JSpinner harvestLevelSpinner;
protected JSpinner burntimeSpinner;
protected JComboBox creativeTabComboBox;
protected JComboBox harvestTypeComboBox;
protected JComboBox materialComboBox;
protected JCheckBox unbreakableCheckBox;
public class BlockEditor extends WindowClosingVerifierUser {
private JPanel buttonPanel;
private JPanel mainPanel;
private JPanel labelPanel;
private JPanel interactionPanel;
private JPanel modelPanel;
private JLabel labelCreativeTab;
private JLabel labelModel;
private JLabel labelLightness;
private JLabel labelOpacity;
private JLabel labelSlipperiness;
private JLabel labelHardness;
private JLabel labelResistance;
private JLabel labelHarvestLevel;
private JLabel labelBurntime;
private JLabel labelHarvestType;
private JLabel labelMaterial;
private JLabel labelUnbreakable;
private JLabel modelLabel;
private JButton renameButton;
private JButton saveBlockButton;
private JButton cancelButton;
private JButton modelChooseButton;
private JSpinner lightnessSpinner;
private JSpinner opacitySpinner;
private JSpinner slipperinessSpinner;
private JSpinner hardnessSpinner;
private JSpinner resistanceSpinner;
private JSpinner harvestLevelSpinner;
private JSpinner burntimeSpinner;
private JComboBox creativeTabComboBox;
private JComboBox harvestTypeComboBox;
private JComboBox materialComboBox;
private JCheckBox unbreakableCheckBox;

protected boolean modelChooserIsOpen = false;
protected String name;
protected BlocksActivityPanel main;
protected BlockModelResource model;
private String name;
private BlockModelResource model;
private ObjectRunnable runnable;
private ObjectRunnable closeHandler;

private static final String modelTooltip = "The model determines what the block looks like in the game";
private static final String creativeTabTooltip = ""; //TODO
@@ -99,9 +99,17 @@ public class BlockEditor extends WindowClosingVerifierUser implements BlockModel
private static final String materialTooltip = ""; //TODO
private static final String unbreakableTooltip = ""; //TODO

public BlockEditor(String name, BlocksActivityPanel main) {
private final ObjectRunnable modelChooser = new ObjectRunnable(){
@Override
public void run(Object obj){
setModel((BlockModelResource) obj);
}
};

public BlockEditor(String name, ObjectRunnable runnable, ObjectRunnable closeHandler) {
this.name = name;
this.main = main;
this.runnable = runnable;
this.closeHandler = closeHandler;

setBounds(100, 100, 500, 500);
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
@@ -259,15 +267,7 @@ public void actionPerformed(ActionEvent e) {
buttonPanel = new JPanel();
buttonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT, 5, 5));
getContentPane().add(buttonPanel, BorderLayout.SOUTH);
/*
renameButton = new JButton("Rename");
renameButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
rename();
}
});
buttonPanel.add(renameButton);
*/

saveBlockButton = new JButton("Save Block");
saveBlockButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
@@ -287,8 +287,8 @@ public void actionPerformed(ActionEvent e) {
setVisible(true);
}

public BlockEditor(BlocksActivityPanel main, BlockElement block){
this(block.name, main);
public BlockEditor(BlockElement block, ObjectRunnable runnable, ObjectRunnable closeHandler){
this(block.name, runnable, closeHandler);

if (block.blockModel != null)
setModel(block.blockModel);
@@ -317,15 +317,10 @@ public BlockEditor(BlocksActivityPanel main, BlockElement block){

changed = false;
}

protected void cancel(){
for (WindowListener listener : getWindowListeners()){
listener.windowClosing(new WindowEvent(this, WindowEvent.WINDOW_CLOSING));
}
}

@Override
public boolean save(){
if (!modelChooserIsOpen && !(model == null) && materialComboBox.getSelectedIndex() != 0){
if (model != null && materialComboBox.getSelectedIndex() != 0){
BlockElement block = new BlockElement();
block.name = name;
block.blockModel = model;
@@ -358,55 +353,44 @@ public boolean save(){
base.burntime = (Integer) burntimeSpinner.getValue();
block.block = base;

main.addBlock(block);

runnable.run(block);
dispose();
}
else{
int selected = JOptionPane.showConfirmDialog(this, "Not all required properties have been given a value yet.",
String errorMessage = "You haven't given the block a model yet.";
if (model != null) errorMessage = "You haven't given the block a material yet.";
int selected = JOptionPane.showConfirmDialog(this, errorMessage,
"Error", JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE);
if (selected == JOptionPane.OK_OPTION)
return false;
}
return true;
}
/*
protected void rename(){
String name = JOptionPane.showInputDialog("Block name:");
this.name = name;
setTitle("Edit Block: " + this.name);
//refractor
}
*/
protected void chooseModel() {
if (!modelChooserIsOpen){
new BlockModelChooseWindow(this);
modelChooserIsOpen = true;
}
}

@Override
public void dispose() {
main.closeEditor(name);
super.dispose();
private void chooseModel() {
if (model == null)
new BlockModelChooseWindow(modelChooser);
else
new BlockModelChooseWindow(modelChooser, model);
}

@Override
public BlockModelResource getModel() {
return model;
}

@Override
public void setModel(BlockModelResource model) {
private void setModel(BlockModelResource model) {
change();
this.model = model;
if (model.parent == "block/cross") modelLabel.setText("Cross model");
else modelLabel.setText("Block model");
}


private void cancel(){
for (WindowListener listener : getWindowListeners()){
listener.windowClosing(new WindowEvent(this, WindowEvent.WINDOW_CLOSING));
}
}

@Override
public void blockModelChooserDispose() {
modelChooserIsOpen = false;
public void dispose() {
closeHandler.run(name);
super.dispose();
}
}

@@ -17,29 +17,38 @@
import javax.swing.SpinnerNumberModel;

import twintro.minecraft.modbuilder.data.resources.items.FoodItemResource;
import twintro.minecraft.modbuilder.data.resources.models.BlockModelResource;
import twintro.minecraft.modbuilder.editor.interfaces.activitypanels.ItemsActivityPanel;
import twintro.minecraft.modbuilder.editor.interfaces.choosewindows.ObjectRunnable;
import twintro.minecraft.modbuilder.editor.interfaces.helperclasses.EffectPanel;
import twintro.minecraft.modbuilder.editor.resources.ItemElement;

public class FoodItemEditor extends RegularItemEditor {
protected JPanel propertiesPanel;
protected JPanel feedToWolvesPanel;
protected JPanel alwaysEdiblePanel;
protected JPanel effectsListPanel;
protected JPanel effectsListTopPanel;
protected JLabel labelHungerRefill;
protected JLabel labelSaturation;
protected JLabel labelProperties;
protected JLabel labelEffects;
protected JLabel labelEffect;
protected JLabel labelDuration;
protected JLabel labelAmplifier;
protected JSpinner hungerRefillSpinner;
protected JSpinner saturationSpinner;
protected JCheckBox feedToWolvesCheckbox;
protected JCheckBox alwaysEdibleCheckbox;
protected JButton addEffectButton;
protected EffectPanel[] effectPanels;
private JPanel propertiesPanel;
private JPanel feedToWolvesPanel;
private JPanel alwaysEdiblePanel;
private JPanel effectsListPanel;
private JPanel effectsListTopPanel;
private JLabel labelHungerRefill;
private JLabel labelSaturation;
private JLabel labelProperties;
private JLabel labelEffects;
private JLabel labelEffect;
private JLabel labelDuration;
private JLabel labelAmplifier;
private JSpinner hungerRefillSpinner;
private JSpinner saturationSpinner;
private JCheckBox feedToWolvesCheckbox;
private JCheckBox alwaysEdibleCheckbox;
private JButton addEffectButton;
private EffectPanel[] effectPanels;

private final ObjectRunnable closeHandler = new ObjectRunnable(){
@Override
public void run(Object obj){
removeEffect((Integer) obj);
}
};

private static final String hungerRefillTooltip = "<html>The amount of hunger points that will be refilled when the user eats the food<br>"
+ "Two hunger points refill one chicken wing</html>";
@@ -57,8 +66,8 @@ public class FoodItemEditor extends RegularItemEditor {
public static final String removeEffectTooltip = "Remove this effect";
private static final String addEffectTooltip = "Add potion effects that will occur to the user when he eats the food";

public FoodItemEditor(String name, ItemsActivityPanel itemsActivityPanel) {
super(name, itemsActivityPanel);
public FoodItemEditor(String name, ObjectRunnable runnable, ObjectRunnable closeHandler) {
super(name, runnable, closeHandler);
setTitle("Edit Food: " + this.name);

saveButton.setText("Save Food");
@@ -141,17 +150,17 @@ public void actionPerformed(ActionEvent e) {
effectPanels = new EffectPanel[0];
}

public FoodItemEditor(ItemsActivityPanel main, ItemElement item) {
this(item.name, main);
regularSetup(main, item);
public FoodItemEditor(ItemElement item, ObjectRunnable runnable, ObjectRunnable closeHandler) {
this(item.name, runnable, closeHandler);
regularSetup(item);
if (item.item.stacksize != null)
maxStackSizeSpinner.setValue(item.item.stacksize);
foodSetup(item);

changed = false;
}

protected void foodSetup(ItemElement item){
private void foodSetup(ItemElement item){
FoodItemResource resource = (FoodItemResource) item.item;

hungerRefillSpinner.setValue(resource.amount);
@@ -163,12 +172,12 @@ protected void foodSetup(ItemElement item){
alwaysEdibleCheckbox.setSelected(resource.alwaysedible);
if (resource.effects != null)
for (Integer[] effect : resource.effects)
addEffect(new EffectPanel(this, effect));
addEffect(new EffectPanel(closeHandler, this, effect));
}

@Override
public boolean save() {
if (!textureChooserIsOpen && textureLabel.getText().length() > 0){
if (textureLabel.getText().length() > 0){
FoodItemResource base = new FoodItemResource();
base.amount = (Integer) hungerRefillSpinner.getValue();
base.saturation = (Float) saturationSpinner.getValue();
@@ -177,51 +186,49 @@ public boolean save() {

Set<Integer[]> effects = new HashSet<Integer[]>();
for (EffectPanel effect : effectPanels)
if (effect.effectComboBox.getSelectedIndex() > 0)
effects.add(new Integer[]{effect.effectComboBox.getSelectedIndex(),
(Integer) effect.durationSpinner.getValue(), (Integer) effect.amplifierSpinner.getValue()});
if (effect.isProperEffect())
effects.add(effect.getEffect());
base.effects = effects;

ItemElement item = writeItem(base);
main.addItem(item);

runnable.run(item);
dispose();
}
else{
int selected = JOptionPane.showConfirmDialog(this, "Not all required properties have been given a value yet.",
int selected = JOptionPane.showConfirmDialog(this, "You haven't given the item a texture yet.",
"Error", JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE);
if (selected == JOptionPane.OK_OPTION)
return false;
}
return true;
}

protected void addEffect(){
private void addEffect(){
change();
addEffect(new EffectPanel(this));
addEffect(new EffectPanel(closeHandler, this));
}

protected void addEffect(EffectPanel effect){
private void addEffect(EffectPanel effect){
EffectPanel[] newEffectPanels = new EffectPanel[effectPanels.length + 1];
for (int i = 0; i < effectPanels.length; i++)
newEffectPanels[i] = effectPanels[i];
newEffectPanels[effectPanels.length] = effect;
effect.id = effectPanels.length;
effect.setId(effectPanels.length);
effectPanels = newEffectPanels;

effectsListPanel.add(effect);
paintAll(getGraphics());
}

public void removeEffect(int id){
private void removeEffect(int id){
effectsListPanel.remove(effectPanels[id]);

EffectPanel[] newEffectPanels = new EffectPanel[effectPanels.length - 1];
for (int i = 0; i < id; i++)
newEffectPanels[i] = effectPanels[i];
for (int i = id + 1; i < effectPanels.length; i++){
newEffectPanels[i - 1] = effectPanels[i];
effectPanels[i].id = i - 1;
effectPanels[i].setId(i - 1);
}
effectPanels = newEffectPanels;

@@ -6,6 +6,8 @@
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.util.Set;

import javax.swing.JButton;
@@ -20,7 +22,9 @@
import twintro.minecraft.modbuilder.data.resources.structures.StructureType;
import twintro.minecraft.modbuilder.editor.Editor;
import twintro.minecraft.modbuilder.editor.interfaces.activitypanels.StructureActivityPanel;
import twintro.minecraft.modbuilder.editor.interfaces.choosewindows.ObjectRunnable;
import twintro.minecraft.modbuilder.editor.interfaces.helperclasses.WindowClosingVerifierListener;
import twintro.minecraft.modbuilder.editor.interfaces.helperclasses.WindowClosingVerifierUser;
import twintro.minecraft.modbuilder.editor.resources.BlockElement;

import javax.swing.JToggleButton;
@@ -29,12 +33,8 @@
import javax.swing.JSpinner;
import javax.swing.SwingConstants;

public class GroundStructureEditor extends StructureEditor
{

public class GroundStructureEditor extends WindowClosingVerifierUser {
private JPanel contentPane;
private String name;
private StructureActivityPanel main;
private JComboBox dimensionComboBox;
private JSpinner veinSizeSpinner;
private JSpinner minYspinner;
@@ -45,10 +45,14 @@ public class GroundStructureEditor extends StructureEditor
private JButton onBlocksButton;
private JSpinner amountperchunkSpinner;

public GroundStructureEditor(String nameNew, StructureActivityPanel parent, Set<String> blocks) {
super(nameNew, parent, blocks);
this.name = nameNew;
this.main = parent;
private String name;
private ObjectRunnable runnable;
private ObjectRunnable closeHandler;

public GroundStructureEditor(String name, ObjectRunnable runnable, ObjectRunnable closeHandler) {
this.name = name;
this.runnable = runnable;
this.closeHandler = closeHandler;

setBounds(100, 100, 390, 400);
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
@@ -59,19 +63,6 @@ public GroundStructureEditor(String nameNew, StructureActivityPanel parent, Set<
getContentPane().add(panel, BorderLayout.SOUTH);
panel.setLayout(new FlowLayout(FlowLayout.RIGHT, 5, 5));

JButton btnRename = new JButton("Rename");
btnRename.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
String nameNew2 = JOptionPane.showInputDialog("Item name:");
GroundStructureEditor temp = (GroundStructureEditor) main.openEditors.get(name);
main.openEditors.remove(name);
name = nameNew2;
main.openEditors.put(name, temp);
setTitle("Edit structure: " + name);
}
});
panel.add(btnRename);

JButton btnSaveItem = new JButton("Save Item");
panel.add(btnSaveItem);
btnSaveItem.addActionListener(new ActionListener() {
@@ -171,31 +162,15 @@ public void actionPerformed(ActionEvent e) {

setVisible(true);
}




protected void chooseBlocksToCover() {
// TODO Auto-generated method stub

}





protected void chooseBlock() {
//Map<String, ImageIcon> elements = main.main.blocks
//BlockElement.getFromName(block)
}




private void cancel(){
WindowClosingVerifierListener.close(this);

}



protected void saveStructure() {
GroundStructureResource savable = new GroundStructureResource();

@@ -206,6 +181,22 @@ protected void saveStructure() {
}
savable.amountperchunk = (Integer) amountperchunkSpinner.getValue();
savable.type = StructureType.ground;

}

@Override
public boolean save() {
return false;
}

private void cancel(){
for (WindowListener listener : getWindowListeners()){
listener.windowClosing(new WindowEvent(this, WindowEvent.WINDOW_CLOSING));
}
}

@Override
public void dispose() {
closeHandler.run(name);
super.dispose();
}
}

This file was deleted.

@@ -6,6 +6,8 @@
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.util.Set;

import javax.swing.DefaultComboBoxModel;
@@ -19,50 +21,38 @@
import javax.swing.border.EmptyBorder;

import twintro.minecraft.modbuilder.editor.interfaces.activitypanels.StructureActivityPanel;
import twintro.minecraft.modbuilder.editor.interfaces.choosewindows.ObjectRunnable;
import twintro.minecraft.modbuilder.editor.interfaces.helperclasses.WindowClosingVerifierListener;
import twintro.minecraft.modbuilder.editor.interfaces.helperclasses.WindowClosingVerifierUser;

public class OreStructureEditor extends StructureEditor {

public class OreStructureEditor extends WindowClosingVerifierUser {
private JPanel contentPane;
private String name;
private StructureActivityPanel main;
private JSpinner maxYspinner;
private JSpinner minYspinner;
private JSpinner veinSizeSpinner;
private JComboBox dimensionComboBox;
private JButton coverBlockButton;
private JLabel coverBlockLabel;

private String name;
private ObjectRunnable runnable;
private ObjectRunnable closeHandler;

public OreStructureEditor(String nameNew, StructureActivityPanel parent, Set<String> blocks) {
super(nameNew, parent, blocks);

this.main = parent;
public OreStructureEditor(String name, ObjectRunnable runnable, ObjectRunnable closeHandler) {
this.name = name;
this.runnable = runnable;
this.closeHandler = closeHandler;

setBounds(100, 100, 390, 400);
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
this.addWindowListener(new WindowClosingVerifierListener());
setTitle("Edit structure: " + name);

addWindowListener(new WindowClosingVerifierListener());
setTitle("Edit structure: " + this.name);

JPanel panel = new JPanel();
getContentPane().add(panel, BorderLayout.SOUTH);
panel.setLayout(new FlowLayout(FlowLayout.RIGHT, 5, 5));

JButton btnRename = new JButton("Rename");
btnRename.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
String nameNew2 = JOptionPane.showInputDialog("Item name:");
OreStructureEditor temp = (OreStructureEditor) main.openEditors.get(name);
main.openEditors.remove(name);
name = nameNew2;
main.openEditors.put(name, temp);
setTitle("Edit structure: " + name);
}
});
panel.add(btnRename);

JButton btnSaveItem = new JButton("Save Item");
JButton btnSaveItem = new JButton("Save");
panel.add(btnSaveItem);
btnSaveItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
@@ -170,22 +160,30 @@ public void actionPerformed(ActionEvent e) {

maxYspinner = new JSpinner();
panel_9.add(maxYspinner, BorderLayout.NORTH);

}

protected void chooseBlocks() {
// TODO Auto-generated method stub
private void chooseBlocks() {

}

protected void saveStructure() {
// TODO Auto-generated method stub
private void saveStructure() {

}

protected void cancel() {
// TODO Auto-generated method stub

@Override
public boolean save() {
return false;
}

private void cancel(){
for (WindowListener listener : getWindowListeners()){
listener.windowClosing(new WindowEvent(this, WindowEvent.WINDOW_CLOSING));
}
}

@Override
public void dispose() {
closeHandler.run(name);
super.dispose();
}

}
@@ -20,9 +20,8 @@
import twintro.minecraft.modbuilder.editor.Editor;
import twintro.minecraft.modbuilder.editor.interfaces.activitypanels.ItemsActivityPanel;
import twintro.minecraft.modbuilder.editor.interfaces.choosewindows.MaterialChooseWindow;
import twintro.minecraft.modbuilder.editor.interfaces.choosewindows.MaterialRunnable;
import twintro.minecraft.modbuilder.editor.interfaces.choosewindows.ObjectRunnable;
import twintro.minecraft.modbuilder.editor.interfaces.choosewindows.TextureChooseWindow;
import twintro.minecraft.modbuilder.editor.interfaces.choosewindows.TextureRunnable;
import twintro.minecraft.modbuilder.editor.interfaces.helperclasses.WindowClosingVerifierListener;
import twintro.minecraft.modbuilder.editor.interfaces.helperclasses.WindowClosingVerifierUser;
import twintro.minecraft.modbuilder.editor.resources.ItemElement;
@@ -39,7 +38,7 @@
import java.util.HashSet;
import java.awt.event.ActionEvent;

public class RegularItemEditor extends WindowClosingVerifierUser implements TextureRunnable, MaterialRunnable {
public class RegularItemEditor extends WindowClosingVerifierUser {
protected JPanel mainPanel;
protected JPanel buttonPanel;
protected JPanel texturePanel;
@@ -68,11 +67,10 @@ public class RegularItemEditor extends WindowClosingVerifierUser implements Text
protected JComboBox creativeTabsComboBox;
protected JCheckBox containerCheckbox;
protected JCheckBox burntimeCheckbox;

protected boolean textureChooserIsOpen = false;
protected boolean materialChooserIsOpen = false;

protected String name;
protected ItemsActivityPanel main;
protected ObjectRunnable runnable;
private ObjectRunnable closeHandler;

private static final String textureTooltip = "The texture of the item";
private static final String maxStackSizeTooltip = "The maximum amount of the item there can be in a stack";
@@ -82,12 +80,10 @@ public class RegularItemEditor extends WindowClosingVerifierUser implements Text
+ "and when you grab the cake, you will get your buckets back</html>";
private static final String burntimeTooltip = "The amount of items that will get cooked when you use this item as a fuel source in a furnace";

/**
* @wbp.parser.constructor
*/
public RegularItemEditor(String name, ItemsActivityPanel main) {
public RegularItemEditor(String name, ObjectRunnable runnable, ObjectRunnable closeHandler) {
this.name = name;
this.main = main;
this.runnable = runnable;
this.closeHandler = closeHandler;

setBounds(100, 100, 500, 500);
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
@@ -271,18 +267,18 @@ public void actionPerformed(ActionEvent e) {
setVisible(true);
}

public RegularItemEditor(ItemsActivityPanel main, ItemElement item) {
this(item.name, main);
regularSetup(main, item);
public RegularItemEditor(ItemElement item, ObjectRunnable runnable, ObjectRunnable closeHandler) {
this(item.name, runnable, closeHandler);
regularSetup(item);
if (item.item.stacksize != null)
maxStackSizeSpinner.setValue(item.item.stacksize);
changed = false;
}

protected void regularSetup(ItemsActivityPanel main, ItemElement item){
protected void regularSetup(ItemElement item){
if (item.itemModel.textures.containsKey("layer0")) {
textureLabel.setText(item.itemModel.textures.get("layer0"));
setIconImage(Editor.TexturePanel.elements.get(item.itemModel.textures.get("layer0").split(":")[1]).getImage());
setIconImage(Editor.getTextureList().get(item.itemModel.textures.get("layer0").split(":")[1]).getImage());
}
if (item.item.container != null){
containerLabel.setText(item.item.container);
@@ -299,23 +295,17 @@ protected void regularSetup(ItemsActivityPanel main, ItemElement item){
creativeTabsChoose(s.name());
}

protected void cancel() {
for (WindowListener listener : getWindowListeners()){
listener.windowClosing(new WindowEvent(this, WindowEvent.WINDOW_CLOSING));
}
}

@Override
public boolean save() {
if (!textureChooserIsOpen && !materialChooserIsOpen && textureLabel.getText().length() > 0){
if (textureLabel.getText().length() > 0){
ItemResource base = new ItemResource();

ItemElement item = writeItem(base);
main.addItem(item);

runnable.run(item);
dispose();
}
else{
int selected = JOptionPane.showConfirmDialog(this, "Not all required properties have been given a value yet.",
int selected = JOptionPane.showConfirmDialog(this, "You haven't given the item a texture yet.",
"Error", JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE);
if (selected == JOptionPane.OK_OPTION)
return false;
@@ -350,70 +340,61 @@ protected ItemElement writeItem(BaseItemResource base){
return item;
}

protected void burntimeUse() {
private void burntimeUse() {
boolean use = burntimeCheckbox.isSelected();
burntimeSpinner.setEnabled(use);
labelBurnTime.setEnabled(use);
}

protected void containerChoose() {
if (!materialChooserIsOpen){
new MaterialChooseWindow(this, MaterialChooseWindow.ITEMS_AND_BLOCKS, this);
materialChooserIsOpen = true;
}
private void containerChoose() {
new MaterialChooseWindow(MaterialChooseWindow.ITEMS_AND_BLOCKS, new ObjectRunnable() {
@Override
public void run(Object obj) {
change();
containerLabel.setText((String) obj);
}
});
}

protected void containerUse() {
private void containerUse() {
boolean use = containerCheckbox.isSelected();
containerChooseButton.setEnabled(use);
containerLabel.setEnabled(use);
labelContainer.setEnabled(use);
}

protected void creativeTabsReset() {
private void creativeTabsReset() {
change();
creativeTabsLabel.setText("");
}

protected void creativeTabsChoose(String tab) {
private void creativeTabsChoose(String tab) {
change();
if (creativeTabsLabel.getText().length() > 0) creativeTabsLabel.setText(creativeTabsLabel.getText() + ",");
creativeTabsLabel.setText(creativeTabsLabel.getText() + tab);
}

protected void textureChoose() {
if (!textureChooserIsOpen){
new TextureChooseWindow(this);
textureChooserIsOpen = true;
private void textureChoose() {
new TextureChooseWindow(new ObjectRunnable() {
@Override
public void run(Object obj) {
change();
String texture = (String) obj;
textureLabel.setText(texture);
setIconImage(Editor.getTextureList().get(texture.split(":")[1]).getImage());
}
});
}

private void cancel() {
for (WindowListener listener : getWindowListeners()){
listener.windowClosing(new WindowEvent(this, WindowEvent.WINDOW_CLOSING));
}
}

@Override
public void dispose() {
main.closeEditor(name);
closeHandler.run(name);
super.dispose();
}

@Override
public void chooseTexture(String texture) {
change();
textureLabel.setText(texture);
setIconImage(Editor.TexturePanel.elements.get(texture.split(":")[1]).getImage());
}

@Override
public void textureChooserDispose(){
textureChooserIsOpen = false;
}

@Override
public void chooseMaterial(String material) {
change();
containerLabel.setText(material);
}

@Override
public void materialChooserDispose() {
materialChooserIsOpen = false;
}
}
@@ -13,6 +13,7 @@
import twintro.minecraft.modbuilder.data.resources.recipes.ShapelessRecipe;
import twintro.minecraft.modbuilder.editor.Editor;
import twintro.minecraft.modbuilder.editor.interfaces.activitypanels.RecipesActivityPanel;
import twintro.minecraft.modbuilder.editor.interfaces.choosewindows.ObjectRunnable;
import twintro.minecraft.modbuilder.editor.resources.RecipeElement;

import java.awt.GridLayout;
@@ -37,19 +38,14 @@
import java.awt.Font;

public class ShapedRecipeEditor extends ShapelessRecipeEditor {
private JPanel contentPane;

/**
* Create the frame.
*/
public ShapedRecipeEditor(String nameNew, RecipesActivityPanel parent) {
super(nameNew, parent);
public ShapedRecipeEditor(String name, ObjectRunnable runnable, ObjectRunnable closeHandler) {
super(name, runnable, closeHandler);
lblCreateTheShaped.setText("Create the recipe in the desired pattern");
this.name = nameNew;
this.name = name;
}

public ShapedRecipeEditor(String value, RecipesActivityPanel recipesActivityPanel, RecipeElement recipe) {
this(value, recipesActivityPanel);
public ShapedRecipeEditor(RecipeElement recipe, ObjectRunnable runnable, ObjectRunnable closeHandler) {
this(recipe.name, runnable, closeHandler);
ShapedRecipe shpdRcpy = (ShapedRecipe)recipe.recipe;

for(int i = 0; i < 9;i++){
@@ -59,8 +55,6 @@ public ShapedRecipeEditor(String value, RecipesActivityPanel recipesActivityPane
}
buttons[9].chooseItem(shpdRcpy.output);

this.name = value;

changed = false;
}

@@ -108,8 +102,8 @@ public boolean save() {

ItemStackResource outputItem = buttons[9].item;
int outputAmount;
RecipeElement savable = new RecipeElement();
savable.name = this.name;
RecipeElement recipe = new RecipeElement();
recipe.name = this.name;
ShapedRecipe shapedRecipe = new ShapedRecipe();
List<String> recipeListForm = new ArrayList<String>();
for (int i = 0; i < 3; i++)
@@ -118,9 +112,9 @@ public boolean save() {
shapedRecipe.input = ingredients;
shapedRecipe.output = outputItem;
shapedRecipe.type = RecipeType.shaped;
savable.recipe = shapedRecipe;
main.addRecipe(savable);
recipe.recipe = shapedRecipe;

runnable.run(recipe);
dispose();

return true;