/******************************************************************************* * 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; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.ui.ImageButton; import com.badlogic.gdx.scenes.scene2d.ui.Skin; import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; import com.badlogic.gdx.utils.Array; import com.bladecoder.engine.model.Dialog; import com.bladecoder.engine.model.DialogOption; import com.bladecoder.engineeditor.Ctx; import com.bladecoder.engineeditor.common.ElementUtils; import com.bladecoder.engineeditor.model.Project; import com.bladecoder.engineeditor.ui.panels.CellRenderer; import com.bladecoder.engineeditor.ui.panels.EditModelDialog; import com.bladecoder.engineeditor.ui.panels.ModelList; import com.bladecoder.engineeditor.undo.UndoDeleteOption; public class OptionList extends ModelList<Dialog, DialogOption> { Skin skin; private ImageButton upBtn; private ImageButton downBtn; public OptionList(Skin skin) { super(skin, false); this.skin = skin; setCellRenderer(listCellRenderer); upBtn = new ImageButton(skin); downBtn = new ImageButton(skin); toolbar.addToolBarButton(upBtn, "ic_up", "Move up", "Move up"); toolbar.addToolBarButton(downBtn, "ic_down", "Move down", "Move down"); toolbar.pack(); list.addListener(new ChangeListener() { @Override public void changed(ChangeEvent event, Actor actor) { int pos = list.getSelectedIndex(); toolbar.disableEdit(pos == -1); upBtn.setDisabled(pos == -1 || pos == 0); downBtn.setDisabled(pos == -1 || pos == list.getItems().size - 1); } }); upBtn.addListener(new ChangeListener() { @Override public void changed(ChangeEvent event, Actor actor) { up(); } }); downBtn.addListener(new ChangeListener() { @Override public void changed(ChangeEvent event, Actor actor) { down(); } }); Ctx.project.addPropertyChangeListener(Project.NOTIFY_ELEMENT_CREATED, new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { if (evt.getNewValue() instanceof DialogOption && !(evt.getSource() instanceof EditOptionDialog)) { addElements(parent, parent.getOptions()); } } }); } @Override protected EditModelDialog<Dialog, DialogOption> getEditElementDialogInstance(DialogOption e) { return new EditOptionDialog(skin, parent, e, list.getSelectedIndex()); } @Override protected void create() { EditOptionDialog dialog = (EditOptionDialog) getEditElementDialogInstance(null); dialog.show(getStage()); dialog.setListener(new ChangeListener() { @Override public void changed(ChangeEvent event, Actor actor) { int pos = list.getSelectedIndex() + 1; DialogOption e = ((EditOptionDialog) actor).getElement(); list.getItems().insert(pos, e); list.setSelectedIndex(pos); list.invalidateHierarchy(); } }); } private void up() { int pos = list.getSelectedIndex(); if (pos == -1 || pos == 0) return; Array<DialogOption> items = list.getItems(); DialogOption e = items.get(pos); DialogOption e2 = items.get(pos - 1); items.set(pos - 1, e); items.set(pos, e2); parent.getOptions().set(pos - 1, e); parent.getOptions().set(pos, e2); list.setSelectedIndex(pos - 1); upBtn.setDisabled(list.getSelectedIndex() == 0); downBtn.setDisabled(list.getSelectedIndex() == list.getItems().size - 1); Ctx.project.setModified(); } private void down() { int pos = list.getSelectedIndex(); Array<DialogOption> items = list.getItems(); if (pos == -1 || pos == items.size - 1) return; DialogOption e = items.get(pos); DialogOption e2 = items.get(pos + 1); parent.getOptions().set(pos + 1, e); parent.getOptions().set(pos, e2); items.set(pos + 1, e); items.set(pos, e2); list.setSelectedIndex(pos + 1); upBtn.setDisabled(list.getSelectedIndex() == 0); downBtn.setDisabled(list.getSelectedIndex() == list.getItems().size - 1); Ctx.project.setModified(); } @Override protected void delete() { DialogOption option = removeSelected(); int idx = parent.getOptions().indexOf(option); parent.getOptions().remove(option); // TRANSLATIONS Ctx.project.getI18N().putTranslationsInElement(option); // UNDO Ctx.project.getUndoStack().add(new UndoDeleteOption(parent, option, idx)); Ctx.project.setModified(); } @Override protected void copy() { DialogOption e = list.getSelected(); if (e == null) return; clipboard = (DialogOption) ElementUtils.cloneElement(e); toolbar.disablePaste(false); // TRANSLATIONS Ctx.project.getI18N().putTranslationsInElement(clipboard); } @Override protected void paste() { DialogOption newElement = (DialogOption) ElementUtils.cloneElement(clipboard); int pos = list.getSelectedIndex() + 1; list.getItems().insert(pos, newElement); parent.addOption(newElement); Ctx.project.getI18N().extractStrings(Ctx.project.getSelectedScene().getId(), Ctx.project.getSelectedActor().getId(), parent.getId(), pos, newElement); list.setSelectedIndex(pos); list.invalidateHierarchy(); Ctx.project.setModified(); } // ------------------------------------------------------------------------- // ListCellRenderer // ------------------------------------------------------------------------- private final CellRenderer<DialogOption> listCellRenderer = new CellRenderer<DialogOption>() { @Override protected String getCellTitle(DialogOption e) { String text = e.getText(); int i = parent.getOptions().indexOf(e); String str = i + ". " + Ctx.project.translate(text); if(e.isOnce()) str = "[[ONCE]" + str; if(!e.isVisible()) str = "[GRAY]" + str + "[]"; return str; } @Override protected String getCellSubTitle(DialogOption e) { StringBuilder sb = new StringBuilder(); String response = e.getResponseText(); if (response != null && !response.isEmpty()) sb.append("R: ").append(Ctx.project.translate(response).replace("\n", "|")).append(' '); if (e.getVerbId() != null) sb.append(" verb: ").append(e.getVerbId()); if (e.getNext() != null) sb.append(" next: ").append(e.getNext()); return sb.toString(); } @Override protected boolean hasSubtitle() { return true; } }; }