package gdxstudio.panel;
import gdxstudio.Content;
import gdxstudio.Export;
import gdxstudio.Frame;
import gdxstudio.SceneEditor;
import gdxstudio.Style;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.event.ListSelectionEvent;
import scene2d.Camera;
import scene2d.Scene;
import scene2d.Serializer;
import web.laf.lite.widget.CenterPanel;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.EventListener;
final public class ScenePanel extends BaseList {
private static final long serialVersionUID = 1L;
public static JComboBox<String> stateComboBox = BaseTable.createComboBox("Scenes", "Maps", "Actors",
"Assets");
private static JButton addscene, updown ,delete, resume, pause;
private final Timer saveTimer = new Timer(20000, new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
Scene.getCurrentScene().save(getSelectedValue());
}
});
private static File classPath;
public ScenePanel(){
super("Scenes", true);
saveTimer.start();
Serializer.registerSerializer(SceneEditor.class, new Serializer.SceneSerializer());
initToolBar();
add(scrollPane);
stateComboBox.addItemListener(new ItemListener(){
@Override
public void itemStateChanged(ItemEvent e) {
clear();
switch(stateComboBox.getSelectedIndex()){
case 0: header.setText("SCENES");break;
case 1: header.setText("MAPS");break;
case 2: header.setText("ACTORS");break;
}
update();
}
});
}
void initToolBar(){
JPanel tools = Style.createButtonToolBarPanel();
addscene = Style.createToolButton("New Scene", "newfile", this);
updown = Style.createToolButton("ScenePriority", "updown", this);
delete = Style.createToolButton("Delete", "trash", this);
resume = Style.createToolButton("Resume", "resume", this);
pause = Style.createToolButton("Pause", "pause", this);
pause.setEnabled(false);
tools.add(addscene);
tools.add(updown);
tools.add(delete);
tools.add(resume);
tools.add(pause);
stateComboBox.setPreferredSize(new Dimension(65, 17));
tools.add(new CenterPanel(stateComboBox, false, true));
add(tools);
}
public void update(){
lock();
listModel.clear();
for(String s: Scene.scenesMap.keys())
listModel.addElement(s.replace(Scene.basePackage, ""));
if(listModel.getSize()>0 && listModel.get(0) != null || !listModel.get(0).isEmpty())
list.setSelectedIndex(0);
Frame.eventPanel.update();
classPath = new File(Content.getProject()+"bin/");
unlock();
}
private void createSceneFile(){
String text = JOptionPane.showInputDialog(Frame.getInstance(), "Create a New Scene", "New Scene",
JOptionPane.OK_CANCEL_OPTION);
if(text == null || text.isEmpty())
return;
String name = text.replace(".json", "").replace(".java", "");
name = Scene.capitalize(name);
if(listModel.contains(name)){
JOptionPane.showConfirmDialog(null, "Error: File already exists: "+name, "Error",
JOptionPane.OK_OPTION);
return;
}
else{
Export.writeFile("source/"+name+".java",
Export.readFileFromClassPath("SceneTemplate.txt").replace("$$$", name));
listModel.addElement(name);
Scene.scenesMap.put(name, "");
Frame.eventPanel.update();
}
list.setSelectedIndex(listModel.indexOf(name));
Scene.isDirty = true;
Scene.getCurrentScene().save(getSelectedValue());
}
@Override
public void actionPerformed(ActionEvent event) {
switch(((JButton)event.getSource()).getToolTipText()){
case "New Scene":
createSceneFile();
break;
case "ScenePriority":
int sceneindex = list.getSelectedIndex();
if(sceneindex+1 < listModel.size()){
lock();
String selected = listModel.getElementAt(sceneindex);
String selectedValue = Scene.scenesMap.getValueAt(sceneindex);
String down = listModel.getElementAt(sceneindex+1);
String downValue = Scene.scenesMap.getValueAt(sceneindex+1);
/* Changing the model of List */
listModel.setElementAt(selected, sceneindex+1);
listModel.setElementAt(down, sceneindex);
/* Changing the sceneMap of Stage */
Scene.scenesMap.setKey(sceneindex+1, selected);
Scene.scenesMap.setValue(sceneindex+1, selectedValue);
Scene.scenesMap.setKey(sceneindex, down);
Scene.scenesMap.setValue(sceneindex, downValue);
list.setSelectedIndex(sceneindex+1);
unlock();
}
break;
case "Delete":
int confirm = JOptionPane.showConfirmDialog(null,
"Are you Sure you want to delete the Scene?", "Delete Scene",
JOptionPane.YES_NO_OPTION);
if(confirm == JOptionPane.YES_OPTION){
lock();
Export.deleteFile("source/"+list.getSelectedValue()+".java");
Export.deleteFile("bin/"+list.getSelectedValue()+".class");
Scene.scenesMap.removeKey(list.getSelectedValue());
int index = listModel.indexOf(list.getSelectedValue())-1;
if(index != -1){
Content.editor.load();
if(Content.currentView.equals("Editor"))
Content.toggleView(1);
}
listModel.removeElement(list.getSelectedValue());
Frame.eventPanel.update();
list.setSelectedValue(listModel.elementAt(index), true);
showStudio();
Scene.isDirty = true;
Scene.getCurrentScene().save(getSelectedValue());
unlock();
}
break;
case "Resume":
Scene.getCurrentScene().save(getSelectedValue());
list.setEnabled(false);
addscene.setEnabled(false);
updown.setEnabled(false);
delete.setEnabled(false);
resume.setEnabled(false);
pause.setEnabled(true);
Frame.sceneEffectPanel.disable();
Frame.propertyPanel.disable();
Frame.effectPanel.disable();
Frame.eventPanel.disable();
Content.widgetPanel.disable();
Content.toggleView(2);
runGame();
break;
case "Pause":
Scene.cl = null;
Scene.debug = true;
list.setEnabled(true);
addscene.setEnabled(true);
updown.setEnabled(true);
delete.setEnabled(true);
resume.setEnabled(true);
pause.setEnabled(false);
Frame.sceneEffectPanel.enable();
Frame.propertyPanel.enable();
Frame.effectPanel.enable();
Frame.eventPanel.enable();
Content.widgetPanel.enable();
Scene.scenesMap.put("gdxstudio.SceneEditor", "");
Scene.setScene("gdxstudio.SceneEditor");
Content.toggleView(2);
showStudio();
break;
}
}
private String prevScene = "";
@Override
public void valueChanged(ListSelectionEvent e) {
if (e.getValueIsAdjusting() == false) {
ConsolePanel.clear();
Content.editor.clearIcons();
Content.editor.save();
Scene.getCurrentScene().save(prevScene);//Warning Only Change
if(list.getSelectedValue() == null)
return;
prevScene = list.getSelectedValue();
if(resume.isEnabled())
showStudio();
Content.editor.load();
Frame.actorPanel.setHeaderText(list.getSelectedValue());
}
}
public void showStudio(){
Frame.actorPanel.clear();
Scene.getRoot().clearChildren();
Scene.getCurrentScene().clear();
Camera.clearAllHud();
Camera.followActor(null);
Camera.reset();
if(selectedValueExists()){
Scene.getCurrentScene().load(getSelectedValue());
for(Actor child: Scene.getCurrentScene().getChildren()){
Frame.actorPanel.addActor(child.getName());
for(EventListener l: child.getListeners())
child.removeListener(l);
}
Scene.getRoot().addActor(Scene.getCurrentScene());
}
Frame.sceneEffectPanel.update();
}
public void runGame() {
try {
ConsolePanel.clear();
Frame.actorPanel.clear();
URL url = classPath.toURI().toURL();
URLClassLoader cl = URLClassLoader.newInstance(new URL[]{url});
Scene.cl = cl;
Scene.debug = false;
Scene.setScene(list.getSelectedValue());
} catch (MalformedURLException me) {
me.printStackTrace();
}
}
public boolean selectedValueExists(){
if(list.getSelectedValue() != null && !list.getSelectedValue().isEmpty())
return true;
return false;
}
public String getSelectedValue(){
return list.getSelectedValue();
}
}