/*
* EditOpDlg.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
*/
package de.sciss.fscape.gui;
import de.sciss.fscape.op.Operator;
import de.sciss.fscape.prop.Presets;
import de.sciss.fscape.prop.PropertyArray;
import de.sciss.fscape.util.Slots;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.util.Iterator;
import java.util.Properties;
/**
* Dialog presenting the parameters of a
* spectral operator.
*/
public class EditOpDlg
extends BasicDialog {
// -------- public variables --------
public static final int GG_PRESETS = 1; // IDs und zugleich Hash-Keys
public static final int GG_ADDPRESET = 2;
public static final int GG_DELPRESET = 3;
public static final int GG_SPECTROGRAM = 4;
public static final int GG_NORMALIZE = 5;
public static final int GG_OPPREFS = 6;
public static final int GG_OK = 7;
public static final int GG_CANCEL = 8;
// -------- private variables --------
private Operator op;
private PropertyGUI opGUI;
private boolean choice = false; // keine Veraenderung bei Cancel noetig
private final EditOpDlg enc_this = this;
// -------- public methods --------
// public boolean getJComboBox();
// public Operator getOperator();
// public GUISupport getOpGUI();
/**
* !! setVisible() und dispose() bleibt dem Aufrufer ueberlassen
*
* @param parent aufrufendes Fenster
*/
public EditOpDlg( Component parent, Operator op )
{
super( parent, "Edit Operator: " + op.getIcon().getName(), true,
op.getClass().getName().substring( op.getClass().getName().lastIndexOf( '.' ) + 1 ));
this.op = op;
GUISupport gui;
GridBagConstraints con;
GridBagLayout lay;
EditOpDlgListener list;
Properties prop;
String val;
JPanel toolBar;
JComboBox ggPresets;
Iterator presetNames;
ToolIcon ggAddPreset, ggDelPreset;
JCheckBox ggSpectrogram;
JPanel buttonBar;
JButton ggOk, ggCancel;
gui = new GUISupport();
con = gui.getGridBagConstraints();
lay = gui.getGridBagLayout();
list = new EditOpDlgListener( this, gui );
con.insets = new Insets( 2, 2, 2, 2 );
// -------- Toolbar --------
con.fill = GridBagConstraints.HORIZONTAL;
toolBar = new JPanel();
toolBar.setLayout( new FlowLayout( FlowLayout.LEFT, 2, 2 ) );
ggAddPreset = new ToolIcon( ToolIcon.ID_ADDPRESET, null );
gui.registerGadget( ggAddPreset, GG_ADDPRESET );
ggAddPreset.addMouseListener( list );
ggDelPreset = new ToolIcon( ToolIcon.ID_DELPRESET, null );
gui.registerGadget( ggDelPreset, GG_DELPRESET );
ggDelPreset.addMouseListener( list );
ggPresets = new JComboBox();
presetNames = op.getPresets().presetNames().iterator();
while( presetNames.hasNext() ) {
ggPresets.addItem( (String) presetNames.next() );
}
ggPresets.setSelectedItem( Presets.DEFAULT ); // default waehlen und
ggDelPreset.setEnabled( false ); // DelPreset deaktivieren
gui.registerGadget( ggPresets, GG_PRESETS );
ggPresets.addItemListener( list );
ggSpectrogram = new JCheckBox( "Spectrogram" );
gui.registerGadget( ggSpectrogram, GG_SPECTROGRAM );
ggSpectrogram.addItemListener( list );
// load spectro property
prop = op.getPropertyArray().superPr.toProperties( true );
val = prop.getProperty( Operator.PRN_SPECTRO );
if( val != null ) {
ggSpectrogram.setSelected( Boolean.valueOf( val ).booleanValue() );
}
if( op.getSlots( Slots.SLOTS_WRITER ).isEmpty() ) {
ggSpectrogram.setVisible( false );
}
toolBar.add( new JLabel( "Preset" ));
toolBar.add( ggAddPreset );
toolBar.add( ggDelPreset );
toolBar.add( ggPresets );
toolBar.add( ggSpectrogram );
con.gridwidth = GridBagConstraints.REMAINDER;
lay.setConstraints( toolBar, con );
gui.add( toolBar );
// -------- Edit-Panel --------
con.fill = GridBagConstraints.BOTH;
// ggOpPrefs = new JScrollPane(); // ScrollPain( ScrollPane.SCROLLBARS_AS_NEEDED );
opGUI = op.createGUI( Operator.GUI_PREFS );
if( opGUI != null ) {
opGUI.fillGUI( op.getPropertyArray() ); // load values
// ggOpPrefs.setViewportView( opGUI );
}
con.weightx = 1.0;
con.weighty = 1.0;
// gui.addScrollPane( ggOpPrefs, GG_OPPREFS, list );
gui.addGadget( opGUI, GG_OPPREFS );
// -------- Ok/Cancel Gadgets --------
con.fill = GridBagConstraints.HORIZONTAL;
buttonBar = new JPanel();
buttonBar.setLayout( new BorderLayout( 2, 2 ));
ggCancel = new JButton( " Cancel " );
gui.registerGadget( ggCancel, GG_CANCEL );
ggCancel.addActionListener( list );
ggOk = new JButton( " OK ");
gui.registerGadget( ggOk, GG_OK );
ggOk.addActionListener( list );
buttonBar.add( ggCancel, "West" );
buttonBar.add( ggOk, "East" );
con.gridwidth = GridBagConstraints.REMAINDER;
con.weightx = 0.0;
con.weighty = 0.0;
lay.setConstraints( buttonBar, con );
gui.add( buttonBar );
getContentPane().add( gui );
// Position und Groesse aus dem Preferences ermitteln
setResizable( true );
addWindowListener( new WindowAdapter() {
public void windowClosing( WindowEvent e )
{
closeMe();
}
});
super.initDialog();
}
// protected boolean alwaysPackSize()
// {
// return true;
// }
protected void closeMe()
{
this.setVisible( false );
try {
op.getPrefs().store(); // Prefs ggf. speichern
op.getPresets().store(); // Presets ggf. speichern
} catch( IOException e2 ) {
// vorerst egal XXX
System.err.println( "error storing presets : "+e2.getLocalizedMessage() );
}
this.dispose();
}
/**
* Dialog-Ergebnis ermitteln
*
* @return true fuer Ok, false fuer Cancel
*/
public boolean getChoice()
{
return choice;
}
/**
* Zugrundeliegenden Operator ermitteln
*/
public Operator getOperator()
{
return op;
}
/**
* Operator-GUI ermitteln
*/
public PropertyGUI getOpGUI()
{
return opGUI;
}
// -------- quasi-protected methods --------
/*
* NUR FUER DEN LISTENER
*/
public void setChoice( boolean choice )
{
this.choice = choice;
}
/*
* Implementation der Listener
*/
private class EditOpDlgListener
implements ActionListener, AdjustmentListener,
ItemListener, MouseListener
{
// -------- private variables --------
private EditOpDlg dlg; // Edit-Dialog, der den Listener installiert
private GUISupport gui; // gui, dessen Objecte hier ueberwacht werden
// -------- public methods --------
/**
* @param dlg Edit-Dialog, der den Listener installiert
* @param gui zu ueberwachendes GUI
*/
public EditOpDlgListener( EditOpDlg dlg, GUISupport gui )
{
this.dlg = dlg;
this.gui = gui;
}
// -------- Action methods --------
public void actionPerformed( ActionEvent e )
{
int ID = gui.getItemID( e );
Component associate;
Properties prop;
switch( ID ) {
case EditOpDlg.GG_OK:
dlg.setChoice( true );
dlg.getOpGUI().fillPropertyArray( op.getPropertyArray() );
// Spectro:
associate = gui.getItemObj( EditOpDlg.GG_SPECTROGRAM );
if( associate != null ) {
prop = new Properties();
prop.put( Operator.PRN_SPECTRO, String.valueOf( ((JCheckBox) associate).isSelected() ));
op.getPropertyArray().superPr.fromProperties( true, prop );
}
// THRU
case EditOpDlg.GG_CANCEL:
dlg.closeMe();
break;
default:
break;
}
}
// -------- Adjustment methods --------
public void adjustmentValueChanged( AdjustmentEvent e ) {}
// -------- Item methods --------
public void itemStateChanged( ItemEvent e )
{
int ID = gui.getItemID( e );
Properties preset;
PropertyArray pa;
Component associate;
String name;
switch( ID ) {
case EditOpDlg.GG_PRESETS: // ------------------------------ Switch Preset ----------------
associate = gui.getItemObj( EditOpDlg.GG_PRESETS );
if( associate != null ) {
name = ((JComboBox) associate).getSelectedItem().toString();
if( name != null ) {
pa = (PropertyArray) op.getPropertyArray().clone();
preset = op.getPresets().getPreset( name );
pa.fromProperties( false, preset );
dlg.getOpGUI().fillGUI( pa );
associate = gui.getItemObj( EditOpDlg.GG_DELPRESET );
if( associate != null ) { // enable or disable del
associate.setEnabled( !name.equals( Presets.DEFAULT ));
}
}
}
break;
case EditOpDlg.GG_SPECTROGRAM:
// selected = (e.getStateChange() == ItemEvent.SELECTED);
// nothing here yet XXX
break;
case EditOpDlg.GG_NORMALIZE:
// selected = (e.getStateChange() == ItemEvent.SELECTED);
// nothing here yet XXX
break;
default:
break;
}
}
// -------- Mouse methods --------
public void mouseClicked( MouseEvent e )
{
int ID = gui.getItemID( e );
Properties preset;
PropertyArray pa;
Component associate;
String name;
// PromptDlg prompt;
// ConfirmDlg confirm;
boolean exists;
int i;
topLevel: switch( ID ) {
case EditOpDlg.GG_ADDPRESET: // ------------------------------ Add Preset -------------------
associate = gui.getItemObj( EditOpDlg.GG_PRESETS );
if( associate != null) {
name = JOptionPane.showInputDialog( this, "Enter preset name" );
if( name != null && name.length() > 0 ) {
if( name.equals( Presets.DEFAULT )) {
JOptionPane.showMessageDialog( enc_this, "Cannot overwrite defaults!" );
break topLevel;
}
for( i = ((JComboBox) associate).getItemCount() - 1, exists = false;
(i >= 0) && !exists; i-- ) {
exists = ((JComboBox) associate).getItemAt( i ).equals( name ); // existiert schon?
}
if( exists ) {
i = JOptionPane.showConfirmDialog( enc_this, "Overwrite existing preset\n\"" +
name + "\"", "Confirm", JOptionPane.YES_NO_OPTION );
if( i != 0 ) break topLevel; // nicht ueberschreiben
}
pa = (PropertyArray) op.getPropertyArray().clone();
dlg.getOpGUI().fillPropertyArray( pa );
preset = pa.toProperties( false );
if( !preset.isEmpty() ) { // erfolgreich?
if( op.getPresets().setPreset( name, preset ) != null ) {
if( !exists ) {
((JComboBox) associate).addItem( name ); // neues JComboBox-Item
}
((JComboBox) associate).setSelectedItem( name );
associate = gui.getItemObj( EditOpDlg.GG_DELPRESET );
if( associate != null ) {
associate.setEnabled( true ); // enable del
}
} else {
// vorerst keine Fehlermeldung XXX
}
} else {
// vorerst keine Fehlermeldung XXX
}
}
}
break;
case EditOpDlg.GG_DELPRESET: // ------------------------------ Delete Preset ----------------
associate = gui.getItemObj( EditOpDlg.GG_PRESETS );
if( associate != null) {
name = ((JComboBox) associate).getSelectedItem().toString();
if( name != null ) {
if( name.equals( Presets.DEFAULT )) {
JOptionPane.showMessageDialog( enc_this, "Cannot delete defaults!" );
break topLevel;
}
if( op.getPresets().removePreset( name ) != null ) {
((JComboBox) associate).removeItem( name );
if( ((JComboBox) associate).getItemCount() == 0 ||
((JComboBox) associate).getSelectedItem().equals( Presets.DEFAULT )) {
associate = gui.getItemObj( EditOpDlg.GG_DELPRESET );
if( associate != null ) {
associate.setEnabled( false ); // cannot del default
}
}
} else {
// vorerst keine Fehlermeldung XXX
}
}
}
break;
default:
break;
}
}
public void mousePressed (MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered (MouseEvent e) {}
public void mouseExited (MouseEvent e) {}
}
// class EditOpDlgListener
}