376 lines
8.7 KiB
Java
376 lines
8.7 KiB
Java
/*
|
|
|
|
Copyright 2006 Rene Grothmann, modified by Eric Hakenholz
|
|
|
|
This file is part of C.a.R. software.
|
|
|
|
C.a.R. is a free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, version 3 of the License.
|
|
|
|
C.a.R. is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
|
package rene.dialogs;
|
|
|
|
import java.awt.BorderLayout;
|
|
import java.awt.FlowLayout;
|
|
import java.awt.Frame;
|
|
import java.awt.GridLayout;
|
|
import java.awt.event.ItemEvent;
|
|
import java.awt.event.ItemListener;
|
|
import java.util.Vector;
|
|
|
|
import eric.JEricPanel;
|
|
|
|
import rene.gui.ButtonAction;
|
|
import rene.gui.CloseDialog;
|
|
import rene.gui.Global;
|
|
import rene.gui.MyLabel;
|
|
import rene.gui.MyList;
|
|
import rene.gui.MyPanel;
|
|
import rene.gui.Panel3D;
|
|
|
|
/**
|
|
* This is a general class to one in a list of items (like makros, plugins or
|
|
* tools in the JE editor).
|
|
*/
|
|
|
|
public class ItemEditor extends CloseDialog implements ItemListener {
|
|
/**
|
|
*
|
|
*/
|
|
private static final long serialVersionUID = 1L;
|
|
Frame F;
|
|
/** An AWT list at the left */
|
|
MyList L;
|
|
/** Aborted? */
|
|
boolean Aborted = true;
|
|
/** A vector of ItemEditorElement objects */
|
|
Vector V;
|
|
/** A panel to display the element settings */
|
|
ItemPanel P;
|
|
/** The name of this editor */
|
|
String Name;
|
|
/** The displayed item */
|
|
int Displayed = -1;
|
|
/** possible actions */
|
|
public final static int NONE = 0, SAVE = 1, LOAD = 2;
|
|
/** save or load action */
|
|
int Action = NONE;
|
|
|
|
/**
|
|
* @param p
|
|
* The item editor panel
|
|
* @param v
|
|
* The vector of item editor elements
|
|
* @param prompt
|
|
* The prompt, displayed in the north
|
|
*/
|
|
public ItemEditor(final Frame f, final ItemPanel p, final Vector v,
|
|
final String name, final String prompt) {
|
|
this(f, p, v, name, prompt, true, true, false, "");
|
|
}
|
|
|
|
public ItemEditor(final Frame f, final ItemPanel p, final Vector v,
|
|
final String name, final String prompt, final boolean allowChanges,
|
|
final boolean allowReorder, final boolean allowSave,
|
|
final String extraButton) {
|
|
super(f, Global.name(name + ".title"), true);
|
|
Name = name;
|
|
F = f;
|
|
P = p;
|
|
setLayout(new BorderLayout());
|
|
|
|
// Title String:
|
|
final JEricPanel title = new MyPanel();
|
|
title.add(new MyLabel(prompt));
|
|
add("North", title);
|
|
|
|
// Center panel:
|
|
final JEricPanel center = new MyPanel();
|
|
center.setLayout(new BorderLayout(5, 5));
|
|
|
|
// Element List:
|
|
center.add("West", L = new MyList(10));
|
|
L.addItemListener(this);
|
|
|
|
// Editor JPanel:
|
|
final JEricPanel cp = new MyPanel();
|
|
cp.setLayout(new BorderLayout());
|
|
cp.add("North", P);
|
|
cp.add("Center", new MyPanel());
|
|
center.add("Center", cp);
|
|
|
|
add("Center", new Panel3D(center));
|
|
|
|
// Buttons:
|
|
final JEricPanel buttons = new MyPanel();
|
|
buttons.setLayout(new GridLayout(0, 1));
|
|
|
|
if (allowChanges) {
|
|
final JEricPanel buttons1 = new MyPanel();
|
|
buttons1.add(new ButtonAction(this, Global
|
|
.name("itemeditor.insert"), "Insert"));
|
|
buttons1.add(new ButtonAction(this, Global.name("itemeditor.new"),
|
|
"New"));
|
|
buttons1.add(new ButtonAction(this, Global
|
|
.name("itemeditor.delete"), "Delete"));
|
|
buttons.add(buttons1);
|
|
}
|
|
|
|
if (allowReorder) {
|
|
final JEricPanel buttons2 = new MyPanel();
|
|
buttons2.add(new ButtonAction(this, Global.name("itemeditor.down"),
|
|
"Down"));
|
|
buttons2.add(new ButtonAction(this, Global.name("itemeditor.up"),
|
|
"Up"));
|
|
buttons.add(buttons2);
|
|
}
|
|
|
|
final JEricPanel buttons3 = new MyPanel();
|
|
buttons3.setLayout(new FlowLayout(FlowLayout.RIGHT));
|
|
buttons3.add(new ButtonAction(this, Global.name("OK"), "OK"));
|
|
buttons3.add(new ButtonAction(this, Global.name("abort"), "Close"));
|
|
buttons.add(buttons3);
|
|
|
|
if (allowSave) {
|
|
final JEricPanel buttons4 = new MyPanel();
|
|
buttons4.setLayout(new FlowLayout(FlowLayout.RIGHT));
|
|
buttons4.add(new ButtonAction(this, Global.name("save"), "Save"));
|
|
buttons4.add(new ButtonAction(this, Global.name("load"), "Load"));
|
|
if (!extraButton.equals("")) {
|
|
buttons4.add(new ButtonAction(this, extraButton, "Extra"));
|
|
}
|
|
buttons.add(buttons4);
|
|
}
|
|
|
|
add("South", new Panel3D(buttons));
|
|
|
|
V = new Vector();
|
|
for (int i = 0; i < v.size(); i++)
|
|
V.addElement(v.elementAt(i));
|
|
init();
|
|
|
|
pack();
|
|
}
|
|
|
|
/**
|
|
* @param v
|
|
* A vector of item editor elements.
|
|
*/
|
|
public void init() {
|
|
for (int i = 0; i < V.size(); i++) {
|
|
final ItemEditorElement e = (ItemEditorElement) V.elementAt(i);
|
|
L.add(e.getName());
|
|
}
|
|
if (V.size() > 0) {
|
|
L.select(0);
|
|
select();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* React on Item changes.
|
|
*/
|
|
public void itemStateChanged(final ItemEvent e) {
|
|
if (e.getSource() == L) {
|
|
if (Displayed >= 0)
|
|
define(Displayed);
|
|
select();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Show the currently selected item on the item panel.
|
|
*/
|
|
public void select() {
|
|
final int i = L.getSelectedIndex();
|
|
if (i < 0)
|
|
return;
|
|
P.display((ItemEditorElement) V.elementAt(i));
|
|
Displayed = i;
|
|
}
|
|
|
|
@Override
|
|
public void doAction(final String o) {
|
|
if (o.equals("Delete")) {
|
|
delete();
|
|
} else if (o.equals("Insert")) {
|
|
insert();
|
|
} else if (o.equals("New")) {
|
|
P.newElement();
|
|
} else if (o.equals("Up")) {
|
|
up();
|
|
} else if (o.equals("Down")) {
|
|
down();
|
|
} else if (o.equals("OK")) {
|
|
noteSize(Name);
|
|
define();
|
|
Aborted = false;
|
|
doclose();
|
|
} else if (o.equals("Help")) {
|
|
P.help();
|
|
} else if (o.equals("Save")) {
|
|
define();
|
|
Action = SAVE;
|
|
Aborted = false;
|
|
doclose();
|
|
} else if (o.equals("Load")) {
|
|
define();
|
|
Action = LOAD;
|
|
Aborted = false;
|
|
doclose();
|
|
} else if (o.equals("Extra")) {
|
|
if (P.extra(V)) {
|
|
Aborted = false;
|
|
doclose();
|
|
}
|
|
} else
|
|
super.doAction(o);
|
|
}
|
|
|
|
/**
|
|
* Insert the current element, renaming if necessary.
|
|
*/
|
|
void insert() {
|
|
String name = P.getName();
|
|
int Selected = L.getSelectedIndex();
|
|
if (Selected < 0)
|
|
Selected = 0;
|
|
while (find(name))
|
|
name = name + "*";
|
|
P.setName(name);
|
|
final ItemEditorElement e = P.getElement();
|
|
L.add(e.getName(), Selected);
|
|
L.select(Selected);
|
|
V.insertElementAt(e, Selected);
|
|
}
|
|
|
|
/**
|
|
* Changes an item.
|
|
*/
|
|
void define(final int Selected) {
|
|
final String name = P.getName();
|
|
if (name.equals(""))
|
|
return;
|
|
if (!L.getItem(Selected).equals(name))
|
|
L.replaceItem(name, Selected);
|
|
V.setElementAt(P.getElement(), Selected);
|
|
P.notifyChange(V, Selected);
|
|
}
|
|
|
|
/**
|
|
* Changes the currently selected item.
|
|
*/
|
|
void define() {
|
|
final int Selected = L.getSelectedIndex();
|
|
if (Selected < 0)
|
|
return;
|
|
define(Selected);
|
|
L.select(Selected);
|
|
}
|
|
|
|
/**
|
|
* Find a plugin by name.
|
|
*
|
|
* @return true, if it exists.
|
|
*/
|
|
boolean find(final String name) {
|
|
int i;
|
|
for (i = 0; i < V.size(); i++) {
|
|
final ItemEditorElement t = ((ItemEditorElement) V.elementAt(i));
|
|
if (t.getName().equals(name))
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Delete the current selected item.
|
|
*/
|
|
void delete() {
|
|
int Selected = L.getSelectedIndex();
|
|
if (Selected < 0)
|
|
return;
|
|
V.removeElementAt(Selected);
|
|
L.remove(Selected);
|
|
if (L.getItemCount() == 0)
|
|
return;
|
|
if (Selected >= L.getItemCount())
|
|
Selected--;
|
|
L.select(Selected);
|
|
select();
|
|
}
|
|
|
|
/**
|
|
* Push the selected item one down.
|
|
*/
|
|
void down() {
|
|
define();
|
|
int Selected = L.getSelectedIndex();
|
|
if (Selected < 0 || Selected + 1 >= V.size())
|
|
return;
|
|
final ItemEditorElement now = (ItemEditorElement) V.elementAt(Selected), next = (ItemEditorElement) V
|
|
.elementAt(Selected + 1);
|
|
V.setElementAt(next, Selected);
|
|
V.setElementAt(now, Selected + 1);
|
|
L.replaceItem(next.getName(), Selected);
|
|
L.replaceItem(now.getName(), Selected + 1);
|
|
Selected = Selected + 1;
|
|
L.select(Selected);
|
|
select();
|
|
}
|
|
|
|
/**
|
|
* Push the selected item one up.
|
|
*/
|
|
void up() {
|
|
define();
|
|
int Selected = L.getSelectedIndex();
|
|
if (Selected <= 0)
|
|
return;
|
|
final ItemEditorElement now = (ItemEditorElement) V.elementAt(Selected), prev = (ItemEditorElement) V
|
|
.elementAt(Selected - 1);
|
|
V.setElementAt(prev, Selected);
|
|
V.setElementAt(now, Selected - 1);
|
|
L.replaceItem(prev.getName(), Selected);
|
|
L.replaceItem(now.getName(), Selected - 1);
|
|
Selected = Selected - 1;
|
|
L.select(Selected);
|
|
select();
|
|
}
|
|
|
|
/**
|
|
* @return If aborted.
|
|
*/
|
|
@Override
|
|
public boolean isAborted() {
|
|
return Aborted;
|
|
}
|
|
|
|
/**
|
|
* @return The list of item elements.
|
|
*/
|
|
public Vector getElements() {
|
|
return V;
|
|
}
|
|
|
|
/**
|
|
* Return the action, if there is one
|
|
*
|
|
* @return NONE,LOAD,SAVE
|
|
*/
|
|
public int getAction() {
|
|
return Action;
|
|
}
|
|
}
|