package org.apache.maven.diagrams.gui.swing_helpers;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.ListCellRenderer;
import javax.swing.border.TitledBorder;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
/**
* @author <a href="mailto:ptab@newitech.com">Piotr Tabor</a>
* @version $Id$
*/
public class OrderedStringListPanel<Type> extends ObjectEdititingPanel<List<Type>>
implements ActionListener, ListSelectionListener
{
/**
*
*/
private static final long serialVersionUID = -3777125063621150317L;
static final String ACTION_ADD = "ADD";
static final String ACTION_DEL = "DEL";
static final String ACTION_UP = "UP";
static final String ACTION_DOWN = "DOWN";
static final String ACTION_UPDATE = "UPDATE";
private String name;
private List<Type> items;
private JLabel title;
private JList list;
private ListListModel<Type> itemsListModel;
private JButton add, remove, up, down, update;
private ObjectEdititingPanel<Type> editPanel;
private ObjectToStringConverter<Type> objectToStringConverter = null;
public OrderedStringListPanel( List<Type> items, ObjectEdititingPanel<Type> a_editPanel )
{
this( items, a_editPanel, null, null );
}
public OrderedStringListPanel( List<Type> items, ObjectEdititingPanel<Type> a_editPanel,
ObjectToStringConverter<Type> a_ObjectToStringConverter, String a_name )
{
editPanel = a_editPanel;
name = a_name;
this.setBorder( new TitledBorder( name ) );
//
// if ( name != null )
// title = new JLabel( name );
add = new JButton( "add" );
add.setActionCommand( ACTION_ADD );
add.addActionListener( this );
update = new JButton( "apply" );
update.setActionCommand( ACTION_UPDATE );
update.addActionListener( this );
remove = new JButton( "del" );
remove.setActionCommand( ACTION_DEL );
remove.addActionListener( this );
up = new JButton( "up" );
up.setActionCommand( ACTION_UP );
up.addActionListener( this );
down = new JButton( "down" );
down.setActionCommand( ACTION_DOWN );
down.addActionListener( this );
setItems( items );
list = new JList( itemsListModel );
list.addListSelectionListener( this );
objectToStringConverter = a_ObjectToStringConverter;
if ( objectToStringConverter != null )
{
ListCellRenderer defaultCellRenderer = list.getCellRenderer();
list.setCellRenderer( new DelegateClassRenderer( defaultCellRenderer, objectToStringConverter ) );
}
GridBagLayout gbl = new GridBagLayout();
gbl.columnWeights = new double[] { 1.0, 0.0 };
setLayout( gbl );
GridBagConstraints c = new GridBagConstraints();
// c.gridx = 0;
// c.gridy = 0;
// c.gridheight = 1;
// c.gridwidth = 1;
// add( title, c );
c.gridx = 0;
c.gridy = 0;
c.gridheight = 1;
c.gridwidth = 1;
c.fill = GridBagConstraints.BOTH;
add( editPanel, c );
c.fill = GridBagConstraints.BOTH;
c.gridx = 0;
c.gridwidth = 1;
c.gridheight = 5;
c.gridy = 1;
add( new JScrollPane( list ), c );
c.insets = new Insets( 1, 1, 2, 2 );
c.weighty = 1;
c.anchor = GridBagConstraints.NORTH;
c.fill = GridBagConstraints.HORIZONTAL;
c.gridheight = 1;
c.gridx = 1;
c.gridy = 0;
add( update, c );
c.gridy = 1;
add( add, c );
c.gridy = 3;
add( remove, c );
c.gridy = 4;
add( up, c );
c.gridy = 5;
add( down, c );
updateButtons();
}
public List<Type> getItems()
{
return items;
}
public void setItems( List<Type> items )
{
this.items = items;
itemsListModel = new ListListModel<Type>( items );
if ( list != null )
list.setModel( itemsListModel );
updateButtons();
}
public void actionPerformed( ActionEvent e )
{
if ( e.getActionCommand().equals( ACTION_ADD ) )
{
Type new_value = editPanel.getObject();
if ( new_value != null )
{
items.add( new_value );
itemsListModel.notify( new ListDataEvent( this, ListDataEvent.INTERVAL_ADDED, items.size() - 1,
items.size() - 1 ) );
list.setSelectedIndex( items.size() - 1 );
}
}
if ( e.getActionCommand().equals( ACTION_UPDATE ) )
{
int index = list.getSelectedIndex();
if ( index >= 0 )
{
Type new_value = editPanel.getObject();
if ( new_value != null )
{
items.set( index, new_value );
itemsListModel.notify( new ListDataEvent( this, ListDataEvent.INTERVAL_ADDED, index, index ) );
}
}
}
if ( e.getActionCommand().equals( ACTION_DEL ) )
{
int index = list.getSelectedIndex();
if ( index >= 0 && ( index < items.size() ) )
{
items.remove( index );
itemsListModel.notify( new ListDataEvent( this, ListDataEvent.INTERVAL_REMOVED, index, index ) );
}
}
if ( e.getActionCommand().equals( ACTION_DOWN ) )
{
int index = list.getSelectedIndex();
if ( index >= 0 && ( index + 1 < items.size() ) )
{
Type t = items.get( index );
items.remove( index );
items.add( index + 1, t );
itemsListModel.notify( new ListDataEvent( this, ListDataEvent.CONTENTS_CHANGED, index, index + 1 ) );
list.setSelectedIndex( index + 1 );
}
}
if ( e.getActionCommand().equals( ACTION_UP ) )
{
int index = list.getSelectedIndex();
if ( index >= 1 )
{
Type t = items.get( index );
items.remove( index );
items.add( index - 1, t );
itemsListModel.notify( new ListDataEvent( this, ListDataEvent.CONTENTS_CHANGED, index - 1, index ) );
list.setSelectedIndex( index - 1 );
}
}
updateButtons();
}
public void valueChanged( ListSelectionEvent e )
{
int index = list.getSelectedIndex();
if ( index >= 0 )
{
editPanel.setObject( items.get( index ) );
}
updateButtons();
}
private void updateButtons()
{
if ( ( list != null ) && ( items != null ) )
{
boolean hasValidValue = editPanel.getObject() != null;
boolean isSelected = ( list.getSelectedIndex() >= 0 ) && ( list.getSelectedIndex() < items.size() );
add.setEnabled( hasValidValue );
update.setEnabled( hasValidValue && isSelected );
up.setEnabled( list.getSelectedIndex() > 0 );
down.setEnabled( list.getSelectedIndex() + 1 < items.size() );
remove.setEnabled( isSelected );
}
else
{
add.setEnabled( false );
update.setEnabled( false );
up.setEnabled( false );
down.setEnabled( false );
remove.setEnabled( false );
}
}
@Override
public List<Type> getObject()
{
return items;
}
@Override
public void setObject( List<Type> state )
{
setItems( state );
}
// public void setObjectToStringConverter( ObjectToStringConverter<Type> objectToStringConverter )
// {
// this.objectToStringConverter = objectToStringConverter;
// }
//
// public ObjectToStringConverter<Type> getObjectToStringConverter()
// {
// return objectToStringConverter;
// }
}