forked from Coded/SIPRP
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
181 lines
4.5 KiB
181 lines
4.5 KiB
package leaf.ui;
|
|
|
|
import info.clearthought.layout.TableLayout;
|
|
import info.clearthought.layout.TableLayoutConstraints;
|
|
|
|
import java.awt.Insets;
|
|
import java.awt.event.ActionEvent;
|
|
import java.awt.event.ActionListener;
|
|
|
|
import javax.swing.JPanel;
|
|
import javax.swing.JScrollPane;
|
|
import javax.swing.JTextArea;
|
|
import javax.swing.JTextField;
|
|
import javax.swing.event.CaretEvent;
|
|
import javax.swing.event.CaretListener;
|
|
import javax.swing.text.JTextComponent;
|
|
|
|
import siprp.SIPRPSpellChecker;
|
|
|
|
import com.evolute.utils.ui.text.CopyPasteHandler;
|
|
|
|
import leaf.data.Validator;
|
|
|
|
public class LeafTextAreaEditor extends JPanel
|
|
{
|
|
|
|
public static final String ACTION_SAVE = "ACTION_SAVE";
|
|
|
|
public static final String ACTION_REVERT = "ACTION_REVERT";
|
|
|
|
private static final long serialVersionUID = 1L;
|
|
|
|
private static final String ICON_NAME_SAVE = "leaf/ui/icons/save.png";
|
|
|
|
private static final String ICON_NAME_REVERT = "leaf/ui/icons/revert.png";
|
|
|
|
private final LeafButton buttonSave = LeafIconButton.createButton( ICON_NAME_SAVE );
|
|
|
|
private final LeafButton buttonRevert = LeafIconButton.createButton( ICON_NAME_REVERT );
|
|
|
|
private final JTextComponent fieldText;
|
|
|
|
private final JScrollPane scroll;
|
|
|
|
private final Validator<String> validator;
|
|
|
|
private String initialValue = "";
|
|
|
|
public LeafTextAreaEditor( Validator<String> validator )
|
|
{
|
|
|
|
this( validator, false );
|
|
}
|
|
|
|
public LeafTextAreaEditor( Validator<String> validator, boolean textField )
|
|
{
|
|
this.validator = validator;
|
|
fieldText = textField ? new JTextField() : new JTextArea();
|
|
scroll = new JScrollPane(fieldText);
|
|
startupComponents( textField );
|
|
startupLayout( textField );
|
|
placeComponents( textField );
|
|
setupListeners();
|
|
enableButtons( false );
|
|
}
|
|
|
|
public void setValue( String value )
|
|
{
|
|
this.initialValue = value == null ? "" : value;
|
|
fieldText.setText( initialValue );
|
|
}
|
|
|
|
private void startupComponents( boolean textField )
|
|
{
|
|
if( !textField )
|
|
{
|
|
((JTextArea) fieldText).setWrapStyleWord( true );
|
|
((JTextArea) fieldText).setLineWrap( true );
|
|
}
|
|
new CopyPasteHandler(fieldText);
|
|
scroll.setHorizontalScrollBarPolicy( JScrollPane.HORIZONTAL_SCROLLBAR_NEVER );
|
|
scroll.setVerticalScrollBarPolicy( JScrollPane.VERTICAL_SCROLLBAR_ALWAYS );
|
|
buttonSave.setMargin( new Insets(0,0,0,0) );
|
|
buttonRevert.setMargin( new Insets(0,0,0,0) );
|
|
SIPRPSpellChecker.getInstance().attachSpellCheckToComponent( fieldText );
|
|
}
|
|
|
|
private void startupLayout( boolean textField )
|
|
{
|
|
TableLayout layout;
|
|
if( !textField )
|
|
{
|
|
layout = new TableLayout(
|
|
new double[]{ TableLayout.FILL, TableLayout.MINIMUM, TableLayout.MINIMUM },
|
|
new double[]{ TableLayout.MINIMUM, TableLayout.FILL } );
|
|
}
|
|
else
|
|
{
|
|
layout = new TableLayout(
|
|
new double[]{ TableLayout.FILL, TableLayout.MINIMUM, TableLayout.MINIMUM },
|
|
new double[]{ TableLayout.MINIMUM } );
|
|
}
|
|
this.setLayout( layout );
|
|
}
|
|
|
|
private void placeComponents( boolean textField )
|
|
{
|
|
if( ! textField )
|
|
{
|
|
this.add( scroll, new TableLayoutConstraints( 0, 1, 2, 1) );
|
|
this.add( buttonSave, new TableLayoutConstraints( 1, 0 ) );
|
|
this.add( buttonRevert, new TableLayoutConstraints( 2, 0 ) );
|
|
}
|
|
else
|
|
{
|
|
this.add( fieldText, new TableLayoutConstraints( 0, 0 ) );
|
|
this.add( buttonSave, new TableLayoutConstraints( 1, 0 ) );
|
|
this.add( buttonRevert, new TableLayoutConstraints( 2, 0 ) );
|
|
}
|
|
}
|
|
|
|
private void setupListeners()
|
|
{
|
|
buttonSave.addActionListener( new ActionListener()
|
|
{
|
|
@Override
|
|
public void actionPerformed( ActionEvent e )
|
|
{
|
|
save();
|
|
}
|
|
} );
|
|
buttonRevert.addActionListener( new ActionListener()
|
|
{
|
|
@Override
|
|
public void actionPerformed( ActionEvent e )
|
|
{
|
|
revert();
|
|
}
|
|
} );
|
|
fieldText.addCaretListener( new CaretListener()
|
|
{
|
|
@Override
|
|
public void caretUpdate( CaretEvent e )
|
|
{
|
|
enableButtons( !initialValue.equals( fieldText.getText() ) && ( validator == null || validator.isValid( fieldText.getText() ) ) );
|
|
}
|
|
} );
|
|
}
|
|
|
|
private void enableButtons( boolean enable )
|
|
{
|
|
buttonRevert.setEnabled( enable );
|
|
buttonSave.setEnabled( enable );
|
|
}
|
|
|
|
private void save()
|
|
{
|
|
enableButtons( false );
|
|
firePropertyChange( ACTION_SAVE, initialValue, fieldText.getText() );
|
|
initialValue = fieldText.getText();
|
|
}
|
|
|
|
private void revert()
|
|
{
|
|
fieldText.setText( initialValue );
|
|
enableButtons( false );
|
|
firePropertyChange( ACTION_REVERT, fieldText.getText(), initialValue );
|
|
}
|
|
|
|
@Override
|
|
public void setEnabled( boolean enabled )
|
|
{
|
|
fieldText.setEnabled( enabled );
|
|
if( enabled )
|
|
{
|
|
fieldText.requestFocusInWindow();
|
|
}
|
|
}
|
|
|
|
}
|