/*---------------- FILE HEADER ------------------------------------------
This file is part of deegree.
Copyright (C) 2001-2007 by:
Department of Geography, University of Bonn
http://www.giub.uni-bonn.de/deegree/
lat/lon GmbH
http://www.lat-lon.de
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Contact:
Andreas Poth
lat/lon GmbH
Aennchenstr. 19
53177 Bonn
Germany
E-Mail: poth@lat-lon.de
Prof. Dr. Klaus Greve
Department of Geography
University of Bonn
Meckenheimer Allee 166
53115 Bonn
Germany
E-Mail: greve@giub.uni-bonn.de
---------------------------------------------------------------------------*/
package org.deegree.igeo.views.swing.style.component.classification;
import static org.deegree.igeo.i18n.Messages.get;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import java.util.Map;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import org.apache.batik.ext.awt.LinearGradientPaint;
import org.deegree.framework.log.ILogger;
import org.deegree.framework.log.LoggerFactory;
import org.deegree.igeo.ChangeListener;
import org.deegree.igeo.ValueChangedEvent;
import org.deegree.igeo.settings.ColorListEntry;
import org.deegree.igeo.settings.GraphicOptions;
import org.deegree.igeo.style.model.LinearGradient;
import org.deegree.igeo.views.swing.style.renderer.ColorComboBoxItemRenderer;
import org.deegree.igeo.views.swing.util.panels.PanelDialog;
import org.deegree.igeo.views.swing.util.panels.PanelDialog.OkCheck;
import com.jgoodies.forms.builder.ButtonBarBuilder;
import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
/**
* <code>ColorGradientPanel</code>
*
* @author <a href="mailto:buesching@lat-lon.de">Lyn Buesching</a>
* @author last edited by: $Author$
*
* @version $Revision$, $Date$
*
*/
public class ColorGradientPanel extends JPanel {
private static final long serialVersionUID = 8142000920292735146L;
private static final ILogger LOG = LoggerFactory.getLogger( ColorGradientPanel.class );
private JComboBox classesColorPatternCB;
private JButton createColorRampBt;
private JButton editColorRampBt;
private JButton removeColorRampBt;
private GraphicOptions graphicOptions;
private ChangeListener changeListener;
/**
* @param graphicOptions
* the graphic options
* @param changeListener
* the change listener to inform, when selection of gradient changed and selected
* item is not null
*/
public ColorGradientPanel( GraphicOptions graphicOptions, ChangeListener changeListener ) {
this.graphicOptions = graphicOptions;
this.changeListener = changeListener;
init();
}
/**
* @param gradient
* the gradient to set
*/
public void setLinearGradient( LinearGradient gradient ) {
for ( int i = 0; i < classesColorPatternCB.getItemCount(); i++ ) {
if ( ( (LinearGradient) classesColorPatternCB.getItemAt( i ) ).equals( gradient ) ) {
classesColorPatternCB.setSelectedIndex( i );
}
}
}
/**
* @return the gradient
*/
public LinearGradient getLinearGradient() {
return (LinearGradient) classesColorPatternCB.getSelectedItem();
}
private void init() {
classesColorPatternCB = new JComboBox();
classesColorPatternCB.setMinimumSize( new Dimension( 100, 10 ) );
classesColorPatternCB.setRenderer( new ColorComboBoxItemRenderer() );
Map<String, List<ColorListEntry>> cl = graphicOptions.getColorSchemes();
for ( String name : cl.keySet() ) {
try {
LinearGradient newGradient = new LinearGradient( name, cl.get( name ) );
classesColorPatternCB.addItem( newGradient );
} catch ( Exception e1 ) {
LOG.logInfo( "could not create a linear gradient out of the color list entries from the settings" );
}
}
classesColorPatternCB.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent e ) {
if ( classesColorPatternCB.getSelectedItem() != null ) {
editColorRampBt.setEnabled( true );
removeColorRampBt.setEnabled( true );
if ( changeListener != null ) {
changeListener.valueChanged( new ValueChangedEvent() {
@Override
public Object getValue() {
return true;
}
} );
}
} else {
editColorRampBt.setEnabled( false );
removeColorRampBt.setEnabled( false );
}
}
} );
createColorRampBt = new JButton( get( "$MD11030" ) );
createColorRampBt.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent e ) {
openColorRampDlg( true );
}
} );
editColorRampBt = new JButton( get( "$MD11032" ) );
editColorRampBt.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent e ) {
openColorRampDlg( false );
}
} );
if ( classesColorPatternCB.getSelectedItem() == null ) {
editColorRampBt.setEnabled( false );
}
removeColorRampBt = new JButton( get( "$MD11157" ) );
removeColorRampBt.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent e ) {
removeColorRamp();
}
} );
if ( classesColorPatternCB.getSelectedItem() == null ) {
removeColorRampBt.setEnabled( false );
}
ButtonBarBuilder bbBuilder = new ButtonBarBuilder();
bbBuilder.addGriddedButtons( new JButton[] { createColorRampBt, removeColorRampBt } );
FormLayout fl = new FormLayout( "center:pref:grow(1.0)", "$cpheight, $cpheight, $cpheight" );
DefaultFormBuilder builder = new DefaultFormBuilder( fl );
builder.setBorder( BorderFactory.createEmptyBorder( 10, 10, 10, 10 ) );
builder.add( classesColorPatternCB );
builder.nextLine();
builder.add( editColorRampBt );
builder.nextLine();
builder.add( bbBuilder.getPanel() );
add( builder.getPanel() );
}
private void openColorRampDlg( boolean createNew ) {
String title;
LinearGradientPaint gradient = null;
String name = "";
LinearGradient selectedGradient = (LinearGradient) classesColorPatternCB.getSelectedItem();
if ( createNew ) {
title = get( "$MD11029" );
} else {
if ( selectedGradient != null ) {
gradient = selectedGradient.getGradient();
name = selectedGradient.getName();
}
title = get( "$MD11031" );
}
NamedGradientChooser gc = new NamedGradientChooser( gradient, title, name );
PanelDialog dlg = new PanelDialog( gc, true, gc );
dlg.setLocation( getLocationOnScreen() );
dlg.setVisible( true );
if ( dlg.clickedOk ) {
gradient = gc.getGradient();
if ( gradient != null ) {
LinearGradient newGradient = new LinearGradient( gc.getGradientName(), gradient );
if ( !createNew && selectedGradient != null ) {
classesColorPatternCB.removeItem( selectedGradient );
}
classesColorPatternCB.addItem( newGradient );
classesColorPatternCB.setSelectedItem( newGradient );
graphicOptions.addColorScheme( newGradient.getName(), newGradient.getAsColorListEntry() );
}
}
}
private void removeColorRamp() {
if ( classesColorPatternCB.getSelectedItem() != null
&& classesColorPatternCB.getSelectedItem() instanceof LinearGradient ) {
LinearGradient selectedGradient = (LinearGradient) classesColorPatternCB.getSelectedItem();
int result = JOptionPane.showOptionDialog( this, get( "$MD11158", selectedGradient.getName() ),
get( "$MD11159" ), JOptionPane.OK_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE, null, null, null );
if ( result == JOptionPane.OK_OPTION ) {
classesColorPatternCB.removeItem( selectedGradient );
graphicOptions.removeColorScheme( selectedGradient.getName() );
}
}
}
public class NamedGradientChooser extends JPanel implements OkCheck {
private static final long serialVersionUID = -8692214817685337122L;
private GradientChooser gradientChooser;
private JTextField nameTF;
private String title;
public NamedGradientChooser( LinearGradientPaint gradient, String title, String name ) {
this.title = title;
initComponents( gradient, name );
}
private void initComponents( LinearGradientPaint gradient, String name ) {
nameTF = new JTextField();
nameTF.setText( name );
gradientChooser = new GradientChooser();
if ( gradient != null ) {
gradientChooser.setGradient( gradient );
}
FormLayout fl = new FormLayout( "pref, $rgap, fill:pref:grow(1.0)", "$cpheight, $rgap, pref" );
DefaultFormBuilder builder = new DefaultFormBuilder( fl );
builder.setBorder( BorderFactory.createEmptyBorder( 10, 10, 10, 10 ) );
CellConstraints cc = new CellConstraints();
builder.addLabel( get( "$MD11033" ), cc.xy( 1, 1 ) );
builder.add( nameTF, cc.xy( 3, 1 ) );
builder.add( gradientChooser, cc.xyw( 1, 3, 3 ) );
add( builder.getPanel() );
}
/**
* @return the gradient
*/
public LinearGradientPaint getGradient() {
return gradientChooser.getGradient();
}
/**
* @return the nameTF
*/
public String getGradientName() {
return nameTF.getText();
}
/*
* (non-Javadoc)
*
* @see java.awt.Component#toString()
*/
@Override
public String toString() {
return this.title;
}
/*
* (non-Javadoc)
*
* @see org.deegree.igeo.views.swing.util.panels.PanelDialog.OkCheck#isOk()
*/
public boolean isOk() {
if ( getGradientName() != null && getGradientName().length() > 0 ) {
return true;
}
return false;
}
}
}