/*******************************************************************************
* Copyright 2014 Rafael Garcia Moreno.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package com.bladecoder.engineeditor.ui.panels;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.ui.Container;
import com.badlogic.gdx.scenes.scene2d.ui.ImageButton;
import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane;
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
import com.badlogic.gdx.scenes.scene2d.ui.Table;
import com.badlogic.gdx.scenes.scene2d.ui.Tree;
import com.badlogic.gdx.scenes.scene2d.ui.Tree.Node;
import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener;
import com.badlogic.gdx.scenes.scene2d.utils.Selection;
import com.badlogic.gdx.utils.Array;
public abstract class EditTree extends Table {
protected EditToolbar toolbar;
protected Tree tree;
protected Skin skin;
protected Container<ScrollPane> container;
private ImageButton upBtn;
private ImageButton downBtn;
private ImageButton leftBtn;
private ImageButton rightBtn;
public EditTree(Skin skin) {
super(skin);
this.skin = skin;
upBtn = new ImageButton(skin);
downBtn = new ImageButton(skin);
leftBtn = new ImageButton(skin);
rightBtn = new ImageButton(skin);
tree = new Tree(skin);
ScrollPane scrollPane = new ScrollPane(tree, skin);
container = new Container<ScrollPane>(scrollPane);
container.fill();
container.prefHeight(1000);
toolbar = new EditToolbar(skin);
// debug();
add(toolbar).expandX().fillX();
row().fill();
add(container).expandY().fill();
toolbar.addToolBarButton(upBtn, "ic_up", "Move up", "Move up");
toolbar.addToolBarButton(downBtn, "ic_down", "Move down", "Move down");
toolbar.addToolBarButton(leftBtn, "ic_left", "Child",
"Move to child option");
toolbar.addToolBarButton(rightBtn, "ic_right", "Parent",
"Move to parent option");
toolbar.addCreateListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
create();
}
});
toolbar.addEditListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
edit();
}
});
toolbar.addDeleteListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
delete();
}
});
toolbar.addCopyListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
copy();
}
});
toolbar.addPasteListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
paste();
}
});
upBtn.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
upNode();
}
});
downBtn.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
downNode();
}
});
leftBtn.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
leftNode();
}
});
rightBtn.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
rightNode();
}
});
tree.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
Selection<Node> selection = tree.getSelection();
if (selection.isEmpty()) {
upBtn.setDisabled(true);
downBtn.setDisabled(true);
leftBtn.setDisabled(true);
rightBtn.setDisabled(true);
} else {
Node nodeSel = selection.first();
int level = nodeSel.getLevel();
Array<Node> siblings = getSiblings();
upBtn.setDisabled(siblings.get(0) == nodeSel);
downBtn.setDisabled(siblings.get(siblings.size - 1) == nodeSel);
leftBtn.setDisabled(level==1);
rightBtn.setDisabled(siblings.get(0) == nodeSel);
}
toolbar.disableEdit(selection == null);
}
});
}
public Array<Node> getSiblings() {
Selection<Node> selection = tree.getSelection();
Node nodeSel = selection.first();
int level = nodeSel.getLevel();
Array<Node> siblings = (level == 1) ? tree.getRootNodes(): nodeSel.getParent().getChildren();
return siblings;
}
abstract protected void create();
abstract protected void edit();
abstract protected void delete();
abstract protected void copy();
abstract protected void paste();
abstract protected void upNode();
abstract protected void downNode();
abstract protected void leftNode();
abstract protected void rightNode();
}