import gdxstudio.SceneEditor;
import java.awt.Component;
import javax.swing.BorderFactory;
import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JPanel;
import javax.swing.JTable;
import scene2d.ImageJson;
import scene2d.Serializer;
import web.laf.lite.layout.ToolbarLayout;
import web.laf.lite.utils.UIUtils;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.Touchable;
import com.badlogic.gdx.scenes.scene2d.ui.CheckBox;
import com.badlogic.gdx.scenes.scene2d.ui.Dialog;
import com.badlogic.gdx.scenes.scene2d.ui.Label;
import com.badlogic.gdx.scenes.scene2d.ui.Slider;
import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
import com.badlogic.gdx.scenes.scene2d.ui.TextField;
import com.badlogic.gdx.scenes.scene2d.ui.Touchpad;
public class PropertyPanel extends BaseTable {
private static final long serialVersionUID = 1L;
JComboBox<String> fontcombo = createComboBox();
JComboBox<String> texcombo = createComboBox();
static int noOfRows = 16;
super("Properties", null, new PropertyRenderer());
editors.add(createTextFieldEditor()); //Name
editors.add(createIntegerSpinner("X"));
editors.add(createIntegerSpinner("Y"));
editors.add(createIntegerSpinner("Width"));
editors.add(createIntegerSpinner("Height"));
editors.add(createIntegerSpinner("OriginX"));
editors.add(createIntegerSpinner("OriginY"));
editors.add(createIntegerSpinner("Rotation"));
editors.add(createIntegerSpinner("Z-Index"));
editors.add(new ColorEditor());
editors.add(createTouchableEditor()); //Touchable
editors.add(createBooleanEditor()); //Visible
editors.add(createTextFieldEditor());
editors.add(createTextFieldEditor());
editors.add(createTextFieldEditor());
editors.add(createTextFieldEditor());
public void clear(String... names){
super.clear("Name", "X", "Y", "Width", "Height", "OriginX", "OriginY", "Rotation", "Z-Index", "Color", "Touchable", "Visible", "", "", "", "");
public void update(String... names){
super.update("Name", ""+SceneEditor.selectedActor.getName(), "X", ""+SceneEditor.selectedActor.getX(),
"Y", ""+SceneEditor.selectedActor.getY(), "Width", ""+SceneEditor.selectedActor.getWidth(),
"Height", ""+SceneEditor.selectedActor.getHeight(), "OriginX",""+SceneEditor.selectedActor.getOriginX(),
"OriginY",""+SceneEditor.selectedActor.getOriginY(),"Rotation",""+SceneEditor.selectedActor.getRotation(),
"Z-Index", ""+SceneEditor.selectedActor.getZIndex(),
"Color", ""+SceneEditor.selectedActor.getColor().toString(),
"Touchable", ""+SceneEditor.selectedActor.getTouchable().toString(),
"Visible", ""+SceneEditor.selectedActor.isVisible()
editors.set(12, createTextFieldEditor());
editors.set(13, createTextFieldEditor());
editors.set(14, createTextFieldEditor());
editors.set(15, createTextFieldEditor());
/* From here it varies for each type */
if(SceneEditor.selectedActor instanceof ImageJson){
addRow("Texture", ""+((ImageJson)SceneEditor.selectedActor).getTexName()); // row 7
texcombo.removeAllItems();
for(String tex: Asset.texMap.keys())
editors.set(12, new DefaultCellEditor(texcombo));
if(SceneEditor.selectedActor instanceof Label){
addRow("Font", ""+Asset.fontMap.getKey(((Label)SceneEditor.selectedActor).getStyle().font, false)); // row 7
addRow("Text", ""+((Label)SceneEditor.selectedActor).getText());
fontcombo.removeAllItems();
for(String font: Asset.fontMap.keys())
editors.set(12, new DefaultCellEditor(fontcombo));
if(SceneEditor.selectedActor instanceof TextButton){
addRow("Text", ""+((TextButton)SceneEditor.selectedActor).getText());
if(SceneEditor.selectedActor instanceof TextField){
addRow("Text", ""+((TextField)SceneEditor.selectedActor).getText());
addRow("MessageText", ""+((TextField)SceneEditor.selectedActor).getMessageText());
//addRow("Password", ""+((TextFieldJson)Sink.selectedActor).getPasswordMode()});
if(SceneEditor.selectedActor instanceof CheckBox)
addRow("Text", ""+((CheckBox)SceneEditor.selectedActor).getText());
if(SceneEditor.selectedActor instanceof Dialog){
editors.set(12, createBooleanEditor());
editors.set(13, createBooleanEditor());
editors.set(14, createBooleanEditor());
addRow("Modal", ""+((Dialog)SceneEditor.selectedActor).isModal()); //7
addRow("Moveble", ""+((Dialog)SceneEditor.selectedActor).isMovable()); //8
addRow("Resizable", ""+((Dialog)SceneEditor.selectedActor).isResizable()); //9
addRow("Text", ""+((Dialog)SceneEditor.selectedActor).getTitle());
if(SceneEditor.selectedActor instanceof Touchpad){
addRow("Deadzone", ""+Serializer.TouchpadSerializer.deadZoneRadius);
if(SceneEditor.selectedActor instanceof Slider){
Slider slider = ((Slider)SceneEditor.selectedActor);
addRow("Min", ""+slider.getMinValue());
addRow("Max", ""+slider.getMaxValue());
addRow("Step", ""+slider.getStepSize());
addRow("Value", ""+slider.getValue());
if(SceneEditor.selectedActor instanceof Sprite){
Sprite sprite = ((Sprite)SceneEditor.selectedActor);
editors.set(12, createBooleanEditor());
editors.set(13, createBooleanEditor());
addRow("Active", ""+sprite.isAnimationActive);
addRow("Looping", ""+sprite.isAnimationLooping);
addRow("Duration", ""+sprite.getDuration());
addRow("Textures", ""+sprite.toString());
int value = getRowCount();
for(int i=0;i<noOfRows-value;i++)
public void setProperty(String key, String value){
if(key.isEmpty() || value.isEmpty() || SceneEditor.selectedActor == null)
for(Actor actor: Scene.getCurrentScene().getChildren())
if(actor.getName() != null)
if(actor.getName().equals(value)){
// Cant rename set back to old name
updateProperty("Name", SceneEditor.selectedActor.getName(), 0);
Frame.actorPanel.renameActor(SceneEditor.selectedActor.getName(), value);
SceneEditor.selectedActor.setName(value);
case "X": SceneEditor.selectedActor.setX(Float.parseFloat(value));break;
case "Y": SceneEditor.selectedActor.setY(Float.parseFloat(value));break;
case "Width": SceneEditor.selectedActor.setWidth(Float.parseFloat(value));break;
case "Height": SceneEditor.selectedActor.setHeight(Float.parseFloat(value));break;
case "OriginX": SceneEditor.selectedActor.setOriginX(Float.parseFloat(value));break;
case "OriginY": SceneEditor.selectedActor.setOriginY(Float.parseFloat(value));break;
case "Rotation": SceneEditor.selectedActor.setRotation(Float.parseFloat(value));break;
int z = Integer.parseInt(value);
if(z>0 && z<Scene.getCurrentScene().getChildren().size){
SceneEditor.selectedActor.setZIndex(z);
//updateProperty("Z-Index", ""+SceneEditor.selectedActor.getZIndex(), 0);
if(value.length() == 8 && value.matches("[0-9A-Fa-f]+"))
SceneEditor.selectedActor.setColor(Color.valueOf(value));
case "Touchable":SceneEditor.selectedActor.setTouchable(Touchable.valueOf(value));break;
case "Visible":SceneEditor.selectedActor.setVisible(Boolean.parseBoolean(value));break;
if(SceneEditor.selectedActor instanceof Label){
((Label)SceneEditor.selectedActor).setText(value);
((Label)SceneEditor.selectedActor).pack();
if(SceneEditor.selectedActor instanceof TextButton){
((TextButton)SceneEditor.selectedActor).setText(value);
((TextButton)SceneEditor.selectedActor).pack();
if(SceneEditor.selectedActor instanceof TextField)
((TextField)SceneEditor.selectedActor).setText(value);
if(SceneEditor.selectedActor instanceof CheckBox){
((CheckBox)SceneEditor.selectedActor).setText(value);
((CheckBox)SceneEditor.selectedActor).pack();
if(SceneEditor.selectedActor instanceof Dialog){
((Dialog)SceneEditor.selectedActor).setTitle(value);
((Dialog)SceneEditor.selectedActor).pack();
// TextField Related Properties
case "MessageText": ((TextField)SceneEditor.selectedActor).setMessageText(value);break;
case "Password": ((TextField)SceneEditor.selectedActor).setPasswordMode(Boolean.parseBoolean(value));break;
//Slider Related Properties
case "Value":((Slider)SceneEditor.selectedActor).setValue(Float.parseFloat(value));break;
case "Step":((Slider)SceneEditor.selectedActor).setStepSize(Float.parseFloat(value));break;
//Dialog Related Properties
((Dialog)SceneEditor.selectedActor).setModal(Boolean.parseBoolean(value));
((Dialog)SceneEditor.selectedActor).setMovable(Boolean.parseBoolean(value));
((Dialog)SceneEditor.selectedActor).setResizable(Boolean.parseBoolean(value));
//Touchpad Related Properties
case "Deadzone":Serializer.TouchpadSerializer.deadZoneRadius = Float.parseFloat(value);
ImageJson img = (ImageJson)SceneEditor.selectedActor;
ImageJson newimg = new ImageJson(value);
newimg.setName(img.getName());
newimg.setWidth(img.getWidth());
newimg.setHeight(img.getHeight());
newimg.setZIndex(img.getZIndex());
newimg.setColor(img.getColor());
Scene.getCurrentScene().removeActor(img);
Scene.getCurrentScene().addActor(newimg);
SceneEditor.selectedActor = newimg;
Label label = (Label)SceneEditor.selectedActor;
Label.LabelStyle ls = new Label.LabelStyle();
ls.font = Asset.font(value);
((Sprite)SceneEditor.selectedActor).setTextures(value.split(","));
((Sprite)SceneEditor.selectedActor).setDuration(Float.parseFloat((String)value));
((Sprite)SceneEditor.selectedActor).isAnimationActive= Boolean.parseBoolean(value);
((Sprite)SceneEditor.selectedActor).isAnimationLooping = Boolean.parseBoolean(value);
Scene.getCurrentScene().outline(SceneEditor.selectedActor);
Frame.dashPanel.update();
public void updateProperty(String key, String value, int row){
if(SceneEditor.selectedActor != null){
case "Name": super.updateProperty(key, value, 0);break;
case "X": super.updateProperty(key, value, 1);break;
case "Y": super.updateProperty(key, value, 2);break;
case "Width": super.updateProperty(key, value, 3);break;
case "Height": super.updateProperty(key, value, 4);break;
case "Z-Index": super.updateProperty(key, value, 8);break;
class PropertyRenderer extends BaseRenderer {
private static final long serialVersionUID = 1L;
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
/*if(value instanceof Boolean) { // Boolean
checkBox.setSelected(((Boolean) value).booleanValue());
checkBox.setHorizontalAlignment(JLabel.CENTER);
// Boolean.parseBoolean(value.toString());
// } catch ( java.text.ParseException e ) {
setBorder(noFocusBorder);
return new HeaderLabel(value.toString());
if(!value.toString().isEmpty())
spinnerInteger.setValue((int)Float.parseFloat(value.toString()));
spinnerInteger.setValue(new Integer(0));
label.setBorder(BorderFactory.createLineBorder(java.awt.Color.gray));
String colorString = (String) value;
if(colorString.length() == 8 && colorString.matches("[0-9A-Fa-f]+")){
com.badlogic.gdx.graphics.Color cl = com.badlogic.gdx.graphics.Color.valueOf(colorString);
label.setBackground(new java.awt.Color(cl.r, cl.g, cl.b, cl.a));
JPanel pan = new JPanel(new ToolbarLayout());
UIUtils.setMargin(pan, new Insets(2,3,2,3));
return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);