/*
* GUISupport.java
* (FScape)
*
* Copyright (c) 2001-2016 Hanns Holger Rutz. All rights reserved.
*
* This software is published under the GNU General Public License v3+
*
*
* For further information, please contact Hanns Holger Rutz at
* contact@sciss.de
*
*
* Changelog:
* 09-Jan-05 killed sleep/wake methods
*/
package de.sciss.fscape.gui;
import de.sciss.gui.PathListener;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.AdjustmentListener;
import java.awt.event.ItemListener;
import java.awt.event.MouseListener;
import java.io.File;
import java.util.Enumeration;
import java.util.EventObject;
import java.util.Hashtable;
/**
* A panel for "easy" adding and administration
* of buttons. This is totally stupid and the
* whole GUI generation should be destroyed and
* put into XML files or so.
*/
public class GUISupport
extends JPanel {
// -------- private variables --------
private final Hashtable<Integer, Component> hObj; // keys = IDs, objects = Gadgets
private final Hashtable<Object , Integer > hID; // keys = Gadgets, objects = IDs
protected final GridBagLayout lay;
protected final GridBagConstraints con;
private int type;
// -------- public methods --------
/**
* @param type GUI-Typ (ID)
*/
public GUISupport(int type) {
hObj = new Hashtable<Integer, Component>();
hID = new Hashtable<Object, Integer>();
lay = new GridBagLayout();
con = new GridBagConstraints();
setLayout( lay );
setType( type );
// setFont( Main.getFont( Main.FONT_GUI ));
}
public GUISupport()
{
this( -1 );
}
/**
* @return GUI-Typ (ID) oder -1, wenn keine festgelegt wurde
*/
public int getType()
{
return type;
}
/**
* @param type neuer GUI-Typ (ID)
*/
public void setType( int type )
{
this.type = type;
}
/**
* @return speziellen LayoutManager vom Typ GridBagLayout
*/
public GridBagLayout getGridBagLayout()
{
return lay;
}
/**
* @return zum Layout gehoerende Constraints; immer _diese_ modifizieren!
*/
public GridBagConstraints getGridBagConstraints()
{
return con;
}
/**
* Gadget-ID ueber gesendetes ComponentEvent
*
* @param e ComponentEvent, das durch Gadgetklick ausgeloest wurde
* @return Gadget-ID, -1 bei Fehler
*/
public int getItemID(EventObject e) {
Integer ID = hID.get(e.getSource());
if (ID != null)
return (ID.intValue());
else
return -1;
}
/**
* Gadget-Object ueber ID-Parameter aus dem Hash ermitteln
*
* @param ID Gadget-ID
* @return Componente, null bei Fehler
*/
public Component getItemObj(int ID) {
return hObj.get(new Integer(ID));
}
/**
* @param lb hinzuzufuegende Componente vom Typ JLabel
*/
public void addLabel(JLabel lb) {
lay.setConstraints(lb, con);
add(lb);
}
public void addLabel(GroupLabel lb) {
lay.setConstraints(lb, con);
add(lb);
}
/**
* @param gg hinzuzufuegende Componente vom Typ JButton
* @param ID ID, ueber die bei JButtonclick das Object identifiziert werden kann
* @param l wo sollen Clicks gemeldet werden?
*/
public void addButton(JButton gg, int ID, ActionListener l) {
addGadget(gg, ID);
if (l != null) gg.addActionListener(l);
}
/**
* @param gg hinzuzufuegende Componente vom Typ Canvas
* @param ID ID, ueber die bei Mausereignissen das Object identifiziert werden kann
* @param l wo sollen Mausereignisse gemeldet werden? darf null sein
*/
public void addCanvas(JComponent gg, int ID, MouseListener l) {
addGadget(gg, ID);
if (l != null) gg.addMouseListener(l);
}
/**
* @param gg hinzuzufuegende Componente vom Typ JCheckBox
* @param ID ID, ueber die bei Buttonclick das Object identifiziert werden kann
* @param l wo sollen Clicks gemeldet werden?
*/
public void addCheckbox(JCheckBox gg, int ID, ItemListener l) {
addGadget(gg, ID);
if (l != null) gg.addItemListener(l);
}
/**
* @param gg hinzuzufuegende Componente vom Typ JComboBox
* @param ID ID, ueber die bei Buttonclick das Object identifiziert werden kann
* @param l wo sollen Clicks gemeldet werden?
*/
public void addChoice(JComboBox gg, int ID, ItemListener l) {
addGadget(gg, ID);
if (l != null) gg.addItemListener(l);
}
/**
* @param gg hinzuzufuegende Componente vom Typ Scrollbar
* @param ID ID, ueber die bei Veraenderungen das Object identifiziert werden kann
* @param l wo sollen Veraenderungen gemeldet werden?
*/
public void addScrollbar(Scrollbar gg, int ID, AdjustmentListener l) {
addGadget(gg, ID);
if (l != null) gg.addAdjustmentListener(l);
}
/**
* @param gg hinzuzufuegende Componente vom Typ ScrollPane
* @param ID ID, ueber die bei Veraenderungen das Object identifiziert werden kann
* @param l wo sollen Veraenderungen gemeldet werden?
*/
public void addScrollPane(JScrollPane gg, int ID, AdjustmentListener l) {
addGadget(gg, ID);
// XXX gg.getHAdjustable().addAdjustmentListener( l );
// XXX gg.getVAdjustable().addAdjustmentListener( l );
}
/**
* @param gg hinzuzufuegende Componente vom Typ Textfield
* @param ID ID, ueber die bei Veraenderung das Object identifiziert werden kann
* @param l wo sollen Veraenderungen gemeldet werden?
*/
public void addTextField(JTextField gg, int ID, ActionListener l) {
addGadget(gg, ID);
if (l != null) gg.addActionListener(l);
}
/**
* @param gg hinzuzufuegende Componente vom Typ ParamField
* @param ID ID, ueber die bei Veraenderung das Object identifiziert werden kann
* @param l wo sollen Veraenderungen gemeldet werden?
*/
public void addParamField(ParamField gg, int ID, ParamListener l) {
addGadget(gg, ID);
if (l != null) gg.addParamListener(l);
}
/**
* @param gg hinzuzufuegende Componente vom Typ PathField
* @param ID ID, ueber die bei Veraenderung das Object identifiziert werden kann
* @param l wo sollen Veraenderungen gemeldet werden?
*/
public void addPathField(PathField gg, int ID, PathListener l) {
addGadget(gg, ID);
if (l != null) gg.addPathListener(l);
}
/**
* Adds a component to the panel
*
* @param hashKey widget identifier, as is used in <code>addCheckbox</code> etc.
*/
public void addGadget(Component gg, int hashKey) {
lay.setConstraints(gg, con);
add(gg);
registerGadget(gg, hashKey);
}
/**
* Registriert eine Componente beim GUI-Panel;
* d.h. sie kann ueber getItemObj/ID identifiziert werden
*
* @param hashKey Gadget-ID wie auch bei addCheckbox etc.
*/
public void registerGadget(Component gg, int hashKey) {
Integer ID = new Integer(hashKey);
hObj.put(ID, gg); // ID = key
hID.put(gg, ID); // ID = value
}
/**
* Haengt alle Strings in einem Array
* als Items an ein JComboBox-Gadget
*/
public static void addItemsToChoice(String items[], JComboBox gg) {
for (int i = 0; i < items.length; i++) {
gg.addItem(items[i]);
}
}
/**
* Haengt alle Elemente einer String-Enumeration
* als Items an ein JComboBox-Gadget
*
* IMPORTANT: auf die Elemente wird ein String-ClassCast ausgefuehrt!!
*
* @param sort true, wenn alphabetisch sortiert werden soll
*/
public static void addItemsToChoice(Enumeration items, JComboBox gg, boolean sort) {
String item;
if (sort) {
String itemUC;
int i;
while (items.hasMoreElements()) {
item = (String) items.nextElement();
itemUC = item.toUpperCase();
for (i = 0; i < gg.getItemCount(); i++) {
if (itemUC.compareTo(gg.getItemAt(i).toString().toUpperCase()) < 0) break;
}
gg.insertItemAt(item, i);
}
} else {
while (items.hasMoreElements()) {
item = (String) items.nextElement();
gg.addItem(item);
}
}
}
/**
* Gibt Warnton aus
*/
public static void beep() {
Toolkit.getDefaultToolkit().beep();
}
/**
* Laesst ein Rechteck von einer Position
* zur anderen "fahren"
*
* @param g sollte im XOR-Modus sein!
*/
public static void rubberGlide(Rectangle src, Rectangle dest, Graphics g) {
int x1, y1, x2, y2, j;
long startTime;
for (int i = 0; i < 17; i++) {
j = 16 - i;
x1 = (src.x * j + dest.x * i) >> 4;
y1 = (src.y * j + dest.y * i) >> 4;
x2 = ((src.x + src.width) * j + (dest.x + dest.width) * i) >> 4;
y2 = ((src.y + src.height) * j + (dest.y + dest.height) * i) >> 4;
startTime = System.currentTimeMillis();
g.drawRect(x1, y1, x2 - x1 - 1, y2 - y1 - 1);
while ((System.currentTimeMillis() - startTime) < 12) ; // Thread.sleep() not accurate
g.drawRect(x1, y1, x2 - x1 - 1, y2 - y1 - 1);
}
}
/**
* Konvertiert einen Font in den Text eines JTextFields
*/
public static void fontToJTextField(Font fnt, JTextField tf) {
tf.setText(fnt.getName() + " (" + fnt.getSize() + " pt)");
tf.setFont(fnt);
}
/**
* Konvertiert String nach Boolean und setzt demenstprechend ein JCheckBox-Gadget
*
* @param s String, der einen Boolean-Wert repraesentiert; darf null sein
* @param ID Gadget-ID einer JCheckBox auf diesem GUI
* @return das Gadget oder null bei Fehler
*/
public JCheckBox stringToCheckbox(String s, int ID) {
boolean selected;
JCheckBox gg = (JCheckBox) getItemObj(ID);
if (gg != null) {
try {
selected = Boolean.valueOf(s).booleanValue();
gg.setSelected(selected);
return gg;
} catch (NumberFormatException ignored) {
}
}
return null;
}
/**
* Konvertiert String nach Integer und setzt demenstprechend ein JComboBox-Gadget
*
* @param s String, der einen Integer-Wert repraesentiert; darf null sein
* @param ID Gadget-ID eines JComboBoxs auf diesem GUI
* @return das Gadget oder null bei Fehler
*/
public JComboBox stringToChoice(String s, int ID) {
int chosen;
JComboBox gg = (JComboBox) getItemObj(ID);
if (gg != null) {
try {
chosen = Integer.parseInt(s);
gg.setSelectedIndex(chosen);
return gg;
} catch (NumberFormatException ignored) {
}
}
return null;
}
/**
* Konvertiert String nach Integer und setzt demenstprechend ein Scrollbar-Gadget
*
* @param s String, der einen Integer-Wert repraesentiert; darf null sein
* @param ID Gadget-ID einer Scrollbar auf diesem GUI
* @return das Gadget oder null bei Fehler
*/
public Scrollbar stringToScrollbar(String s, int ID) {
int position;
Scrollbar gg = (Scrollbar) getItemObj(ID);
if (gg != null) {
try {
position = Integer.parseInt(s);
gg.setValue(position);
return gg;
} catch (NumberFormatException ignored) {
}
}
return null;
}
/**
* Setzt den Inhalt eines JTextField-Gadget
*
* @param s Text, den das Gadget erhalten soll
* @param ID Gadget-ID eines JTextFields auf diesem GUI
* @return das Gadget oder null bei Fehler
*/
public JTextField stringToJTextField(String s, int ID) {
JTextField gg = (JTextField) getItemObj(ID);
if (gg != null) {
gg.setText(s);
return gg;
}
return null;
}
/**
* Setzt den Inhalt eines PathField-Gadget
*
* @param s Text, den das Gadget erhalten soll
* @param ID Gadget-ID eines PathFields auf diesem GUI
* @return das Gadget oder null bei Fehler
*/
public PathField stringToPathField(String s, int ID) {
PathField gg = (PathField) getItemObj(ID);
if (gg != null) {
gg.setPath(new File(s));
return gg;
}
return null;
}
/**
* Setzt den Inhalt eines ParamField-Gadget
*
* @param s Parameter, den das Gadget erhalten soll
* @param ID Gadget-ID eines ParamFields auf diesem GUI
* @return das Gadget oder null bei Fehler
*/
public ParamField stringToParamField(String s, int ID) {
ParamField gg = (ParamField) getItemObj(ID);
if (gg != null) {
// NOT YET gg.setParam( s );
return gg;
}
return null;
}
/**
* Liest JCheckBox-Gadget aus und liefert eine String-Repraesentation von dessen Zustand
*
* @param ID Gadget-ID einer JCheckBox auf diesem GUI
* @return null bei Fehler
*/
public String checkboxToString(int ID) {
JCheckBox gg = (JCheckBox) getItemObj(ID);
if (gg != null) {
return String.valueOf(gg.isSelected());
}
return null;
}
/**
* Liest JComboBox-Gadget aus und liefert eine String-Repraesentation von dessen Zustand
*
* @param ID Gadget-ID eines JComboBoxs auf diesem GUI
* @return null bei Fehler
*/
public String choiceToString(int ID) {
JComboBox gg = (JComboBox) getItemObj(ID);
if (gg != null) {
return String.valueOf(gg.getSelectedIndex());
}
return null;
}
/**
* Liest Scrollbar-Gadget aus und liefert eine String-Repraesentation von dessen Zustand
*
* @param ID Gadget-ID einer Scrollbar auf diesem GUI
* @return null bei Fehler
*/
public String scrollbarToString(int ID) {
Scrollbar gg = (Scrollbar) getItemObj(ID);
if (gg != null) {
return String.valueOf(gg.getValue());
}
return null;
}
/**
* Liest JTextField-Gadget aus
*
* @param ID Gadget-ID eines JTextFields auf diesem GUI
* @return null bei Fehler
*/
public String textFieldToString(int ID) {
JTextField gg = (JTextField) getItemObj(ID);
if (gg != null) {
return gg.getText();
}
return null;
}
/**
* Liest PathField-Gadget aus
*
* @param ID Gadget-ID eines PathFields auf diesem GUI
* @return null bei Fehler
*/
public String pathFieldToString(int ID) {
PathField gg = (PathField) getItemObj(ID);
if (gg != null) {
return gg.getPath().getPath();
}
return null;
}
/**
* Liest ParamField-Gadget aus
*
* @param ID Gadget-ID eines ParamFields auf diesem GUI
* @return null bei Fehler
*/
public String paramFieldToString(int ID) {
// ParamField gg = (ParamField) getItemObj( ID );
//
// XXX NOT YET if( gg != null ) {
// return gg.getParam();
// }
return null;
}
}