/* CPSComplexFilterDialog.java - created: Jan 31, 2008
* Copyright (C) *** Jan 31, 2008 *** kendrajm ***
*
* This file is part of the project "Crop Planning Software". For more
* information:
* website: https://github.com/claytonrcarter/cropplanning
* email: cropplanning@gmail.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package CPS.UI.Swing;
import CPS.Data.CPSComplexPlantingFilter;
import CPS.Data.CPSDateValidator;
import com.toedter.calendar.JDateChooser;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Date;
import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import net.miginfocom.swing.MigLayout;
public class CPSComplexFilterDialog extends CPSDialog implements ItemListener,
ActionListener,
WindowListener {
private final String migDefaults = "gapy 0px!, insets 2px";
private static final String SHOW_ALL = "Show all";
private JPanel jplStatus, jplDates;
JRadioButton rdoNoLimit, rdoLimit;
JLabel lblPlantingMethod;
JRadioButton rdoDS, rdoTP, rdoDSAndTP;
JLabel lblPlanted;
JRadioButton rdoPlantYes, rdoPlantNo, rdoPlantAll;
JLabel lblTPed;
JRadioButton rdoTPYes, rdoTPNo, rdoTPAll;
JLabel lblHarvested;
JRadioButton rdoHarvestYes, rdoHarvestNo, rdoHarvestAll;
JLabel lblPlantDate, lblPlantDateRange;
JButton btnPlantDateRange;
DateRangeDialog dlgPlantRange;
JLabel lblTPDate, lblTPDateRange;
JButton btnTPDateRange;
DateRangeDialog dlgTPRange;
JLabel lblHarvestDate, lblHarvestDateRange;
JButton btnHarvestDateRange;
DateRangeDialog dlgHarvestRange;
JButton btnSetView, btnCancel;
CPSComplexPlantingFilter savedFilter;
CPSDateValidator dateValidator;
public CPSComplexFilterDialog( Component parent ) {
super( parent, "Set View Limit" );
setDescription( "Use these controls to define a<br>" +
"default view filter. View filters are<br>" +
"used to \"limit\" the data which is<br>" +
"displayed in the maintable." );
addWindowListener( this );
savedFilter = new CPSComplexPlantingFilter();
dateValidator = new CPSDateValidator();
}
public CPSComplexPlantingFilter getFilter() {
return savedFilter;
}
public void resetFilter() {
savedFilter = new CPSComplexPlantingFilter();
}
public void setFilter( CPSComplexPlantingFilter f ) {
savedFilter = f;
// TODO, update the state of the dialog to display this filter
}
private CPSComplexPlantingFilter asFilter() {
CPSComplexPlantingFilter f = new CPSComplexPlantingFilter();
updateFilter( f );
return f;
}
public void updateFilter ( CPSComplexPlantingFilter f ) {
f.reset();
if ( ! rdoNoLimit.isSelected() ) {
f.setViewLimited(true);
if ( f.setFilterOnPlantingMethod( ! rdoDSAndTP.isSelected() ))
f.setFilterMethodDirectSeed( rdoDS.isSelected() );
/* status */
if ( f.setFilterOnPlanting( ! rdoPlantAll.isSelected() ))
f.setDonePlanting( rdoPlantYes.isSelected() );
if ( f.setFilterOnTransplanting( ! rdoTPAll.isSelected() ))
f.setDoneTransplanting( rdoTPYes.isSelected() );
if ( f.setFilterOnHarvest( ! rdoHarvestAll.isSelected() ))
f.setDoneHarvesting( rdoHarvestYes.isSelected() );
/* dates */
if ( f.setFilterOnPlantingDate( dlgPlantRange.isDateRangeSet() ) ) {
f.setPlantingRangeStart( dlgPlantRange.getStartDate() );
f.setPlantingRangeEnd( dlgPlantRange.getEndDate() ) ;
}
if ( f.setFilterOnTPDate( dlgTPRange.isDateRangeSet() ) ) {
f.setTpRangeStart( dlgTPRange.getStartDate() );
f.setTpRangeEnd( dlgTPRange.getEndDate() ) ;
}
if ( f.setFilterOnHarvestDate( dlgHarvestRange.isDateRangeSet() ) ) {
f.setHarvestRangeStart( dlgHarvestRange.getStartDate() );
f.setHarvestRangeEnd( dlgHarvestRange.getEndDate() ) ;
}
}
f.changed();
}
private void fromFilter( CPSComplexPlantingFilter f ) {
boolean y, n, a;
y = n = a = false;
if ( ! f.filterOnPlantingMethod() )
a = true;
else if ( f.filterMethodDirectSeed() )
y = true;
else
n = true;
rdoDSAndTP.setSelected(a);
rdoDS.setSelected(y);
rdoTP.setSelected(n);
if ( ! f.filterOnPlanting() )
a = true;
else if ( f.isDonePlanting() )
y = true;
else
n = true;
rdoPlantAll.setSelected(a);
rdoPlantYes.setSelected(y);
rdoPlantNo.setSelected(n);
y = n = a = false;
if ( ! f.filterOnTransplanting() )
a = true;
else if ( f.isDoneTransplanting() )
y = true;
else
n = true;
rdoTPAll.setSelected(a);
rdoTPYes.setSelected(y);
rdoTPNo.setSelected(n);
y = n = a = false;
if ( ! f.filterOnHarvest() )
a = true;
else if ( f.isDoneHarvesting() )
y = true;
else
n = true;
rdoHarvestAll.setSelected(a);
rdoHarvestYes.setSelected(y);
rdoHarvestNo.setSelected(n);
if ( f.filterOnPlantingDate() ) {
dlgPlantRange.setDateRangeSet(true);
dlgPlantRange.setStartDate( f.getPlantingRangeStart() );
dlgPlantRange.setEndDate( f.getPlantingRangeEnd() );
}
if ( f.filterOnTPDate() ) {
dlgTPRange.setDateRangeSet(true);
dlgTPRange.setStartDate( f.getTpRangeStart() );
dlgTPRange.setEndDate( f.getTpRangeEnd() );
}
if ( f.filterOnHarvestDate() ) {
dlgHarvestRange.setDateRangeSet(true);
dlgHarvestRange.setStartDate( f.getHarvestRangeStart() );
dlgHarvestRange.setEndDate( f.getHarvestRangeEnd() );
}
if ( f.isViewLimited() )
rdoLimit.doClick();
else
rdoNoLimit.doClick();
}
@Override
protected void fillButtonPanel() {
btnSetView = new JButton( "Set View" );
btnCancel = new JButton( "Cancel" );
btnSetView.addActionListener(this);
btnCancel.addActionListener(this);
addButton( btnSetView );
addButton( btnCancel );
}
@Override
protected void buildContentsPanel() {
rdoNoLimit = new JRadioButton( "Do not limit; show everything.", false );
rdoLimit = new JRadioButton( "<html>Limit view based upon the<br>following criteria:</html>", false );
rdoNoLimit.setSelected(true);
rdoNoLimit.addItemListener(this);
rdoLimit.addItemListener(this);
ButtonGroup bgLimit = new ButtonGroup();
bgLimit.add( rdoNoLimit );
bgLimit.add( rdoLimit );
JPanel jplMethod = new JPanel( new MigLayout( migDefaults + ", align center", "[align right][]" ));
jplMethod.setBorder( BorderFactory.createTitledBorder( "Planting Method" ));
rdoDSAndTP = new JRadioButton( "all", true );
rdoDS = new JRadioButton( "direct seeded", false );
rdoTP = new JRadioButton( "transplanted", false );
ButtonGroup bgMethod = new ButtonGroup();
bgMethod.add( rdoDSAndTP );
bgMethod.add( rdoDS );
bgMethod.add( rdoTP );
jplMethod.add( new JLabel( "Show only:"), "align right" );
jplMethod.add( rdoDS, "wrap" );
jplMethod.add( rdoTP, "skip 1, wrap" );
jplMethod.add( rdoDSAndTP, "skip 1, wrap" );
jplStatus = new JPanel( new MigLayout( migDefaults + ", align center", "[align right][align center]" ));
jplStatus.setBorder( BorderFactory.createTitledBorder( "Status of Planting" ));
jplStatus.add( new JLabel("Done"), "skip 1, aligny bottom" );
jplStatus.add( new JLabel("<html><center>Not<br>Done</center></html>") );
jplStatus.add( new JLabel("<html><center>Show<br>All</center></html>"), "wrap" );
rdoPlantYes = new JRadioButton();
rdoPlantNo = new JRadioButton();
rdoPlantAll = new JRadioButton();
rdoPlantAll.setSelected(true);
rdoPlantYes.addItemListener(this);
rdoPlantNo.addItemListener( this );
rdoPlantAll.addItemListener(this);
ButtonGroup bgPlant = new ButtonGroup();
bgPlant.add( rdoPlantYes );
bgPlant.add( rdoPlantNo );
bgPlant.add( rdoPlantAll );
jplStatus.add( new JLabel( "Planting" ));
jplStatus.add( rdoPlantYes );
jplStatus.add( rdoPlantNo );
jplStatus.add( rdoPlantAll, "wrap" );
rdoTPYes = new JRadioButton();
rdoTPNo = new JRadioButton();
rdoTPAll = new JRadioButton();
rdoTPAll.setSelected(true);
rdoTPYes.addItemListener(this);
rdoTPNo.addItemListener( this );
rdoTPAll.addItemListener(this);
ButtonGroup bgTP = new ButtonGroup();
bgTP.add( rdoTPYes );
bgTP.add( rdoTPNo );
bgTP.add( rdoTPAll );
jplStatus.add( new JLabel( "Transplanting" ));
jplStatus.add( rdoTPYes );
jplStatus.add( rdoTPNo );
jplStatus.add( rdoTPAll, "wrap" );
rdoHarvestYes = new JRadioButton();
rdoHarvestNo = new JRadioButton();
rdoHarvestAll = new JRadioButton();
rdoHarvestAll.setSelected(true);
rdoHarvestYes.addItemListener(this);
rdoHarvestNo.addItemListener( this );
rdoHarvestAll.addItemListener(this);
ButtonGroup bgHarvest = new ButtonGroup();
bgHarvest.add( rdoHarvestYes );
bgHarvest.add( rdoHarvestNo );
bgHarvest.add( rdoHarvestAll );
jplStatus.add( new JLabel( "Harvest" ));
jplStatus.add( rdoHarvestYes );
jplStatus.add( rdoHarvestNo );
jplStatus.add( rdoHarvestAll, "wrap" );
jplDates = new JPanel( new MigLayout( migDefaults + ", align center", "[align right][align center]" ));
jplDates.setBorder( BorderFactory.createTitledBorder( "Date Ranges" ));
lblPlantDateRange = new JLabel( "Show all" );
btnPlantDateRange = new JButton( "Set" );
btnPlantDateRange.setActionCommand( btnPlantDateRange.getText() + "-Plant" );
btnPlantDateRange.addActionListener(this);
dlgPlantRange = new DateRangeDialog( btnPlantDateRange, "Planting date range" );
jplDates.add( new JLabel( "Planting date:" ) );
jplDates.add( lblPlantDateRange );
jplDates.add( btnPlantDateRange, "wrap" );
lblTPDateRange = new JLabel( "Show all" );
btnTPDateRange = new JButton( "Set" );
btnTPDateRange.setActionCommand( btnTPDateRange.getText() + "-TP" );
btnTPDateRange.addActionListener(this);
dlgTPRange = new DateRangeDialog( btnTPDateRange, "TP date range" );
jplDates.add( new JLabel( "Transplant date:" ) );
jplDates.add( lblTPDateRange );
jplDates.add( btnTPDateRange, "wrap" );
lblHarvestDateRange = new JLabel( "Show all" );
btnHarvestDateRange = new JButton( "Set" );
btnHarvestDateRange.setActionCommand( btnHarvestDateRange.getText() + "-Harvest" );
btnHarvestDateRange.addActionListener(this);
dlgHarvestRange = new DateRangeDialog( btnHarvestDateRange, "Harvest date range" );
jplDates.add( new JLabel( "Harvest date:" ) );
jplDates.add( lblHarvestDateRange );
jplDates.add( btnHarvestDateRange, "wrap" );
rdoNoLimit.setAlignmentX(Component.LEFT_ALIGNMENT);
add( rdoNoLimit );
rdoLimit.setAlignmentX(Component.LEFT_ALIGNMENT);
add( rdoLimit );
add( jplMethod );
add( jplStatus );
add( jplDates );
setComponentsEnabled( false );
contentsPanelBuilt = true;
}
private void setComponentsEnabled( boolean enable ) {
rdoDSAndTP.setEnabled(enable);
rdoDS.setEnabled(enable);
rdoTP.setEnabled(enable);
rdoPlantYes.setEnabled(enable);
rdoPlantNo.setEnabled( enable );
rdoPlantAll.setEnabled( enable );
rdoTPYes.setEnabled( enable );
rdoTPNo.setEnabled( enable );
rdoTPAll.setEnabled( enable );
rdoHarvestYes.setEnabled( enable );
rdoHarvestNo.setEnabled( enable );
rdoHarvestAll.setEnabled( enable );
btnPlantDateRange.setEnabled( enable );
btnTPDateRange.setEnabled( enable );
btnHarvestDateRange.setEnabled( enable );
}
/* ***************************************************************************************** */
/* Interface Methods */
/* ***************************************************************************************** */
public void actionPerformed( ActionEvent arg0 ) {
String action = arg0.getActionCommand();
if ( action.equalsIgnoreCase( btnSetView.getText() )) {
savedFilter = this.asFilter();
setVisible(false);
}
else if ( action.equalsIgnoreCase( btnCancel.getText() )) {
setVisible(false);
this.fromFilter( savedFilter );
}
else if ( action.equalsIgnoreCase( btnPlantDateRange.getActionCommand() )) {
dlgPlantRange.setVisible(true);
if ( dlgPlantRange.isDateRangeSet() )
this.lblPlantDateRange.setText( CPSDateValidator.format( dlgPlantRange.getStartDate() ) + " - " +
CPSDateValidator.format( dlgPlantRange.getEndDate() ) );
else
this.lblPlantDateRange.setText( SHOW_ALL );
this.pack();
}
else if ( action.equalsIgnoreCase( btnTPDateRange.getActionCommand() )) {
dlgTPRange.setVisible(true);
if ( dlgTPRange.isDateRangeSet() )
this.lblTPDateRange.setText( CPSDateValidator.format( dlgTPRange.getStartDate() ) + " - " +
CPSDateValidator.format( dlgTPRange.getEndDate() ) );
else
this.lblTPDateRange.setText( SHOW_ALL );
this.pack();
}
else if ( action.equalsIgnoreCase( btnHarvestDateRange.getActionCommand() )) {
dlgHarvestRange.setVisible(true);
if ( dlgHarvestRange.isDateRangeSet() )
this.lblHarvestDateRange.setText( CPSDateValidator.format( dlgHarvestRange.getStartDate() ) + " - " +
CPSDateValidator.format( dlgHarvestRange.getEndDate() ) );
else
this.lblHarvestDateRange.setText( SHOW_ALL );
this.pack();
}
}
public void itemStateChanged( ItemEvent arg0 ) {
Object source = arg0.getSource();
if ( source == rdoNoLimit || source == rdoLimit ) {
setComponentsEnabled( ! rdoNoLimit.isSelected() );
}
}
// if the window is closed w/ the filter being "set", we should go ahead and "reset" in case
// some of the buttons and what not have been altered
public void windowClosed( WindowEvent e ) {
if ( contentsPanelBuilt )
fromFilter( savedFilter );
}
public void windowActivated( WindowEvent e ) { /* do nothing */ }
public void windowClosing( WindowEvent e ) { /* do nothing */ }
public void windowDeactivated( WindowEvent e ) { /* do nothing */ }
public void windowDeiconified( WindowEvent e ) { /* do nothing */ }
public void windowIconified( WindowEvent e ) { /* do nothing */ }
public void windowOpened( WindowEvent e ) { /* do nothing */ }
/* ***************************************************************************************** */
/* Inner Class Def'n
/* ***************************************************************************************** */
public class DateRangeDialog extends CPSDialog
implements ItemListener,
ActionListener,
PropertyChangeListener {
private Date startDate, endDate;
private boolean dateRangeSet = false;
private JRadioButton rdoAllDates, rdoLimitDates;
private JDateChooser startDateChooser, endDateChooser;
private JButton btnSetRange, btnCancel;
public DateRangeDialog( Component parent, String title ) {
super( parent, title );
setDateRangeSet( false );
}
public boolean isDateRangeSet() { return dateRangeSet; }
private void setDateRangeSet( boolean dateRangeSet ) { this.dateRangeSet = dateRangeSet; }
public void setEndDate( Date endDate ) { this.endDate = endDate; }
private Date getEndDate() { return endDate; }
public void setStartDate( Date startDate ) { this.startDate = startDate; }
private Date getStartDate() { return startDate; }
protected void fillButtonPanel() {
btnSetRange = new JButton( "Set Range" );
btnCancel = new JButton( "Cancel" );
btnSetRange.addActionListener( this );
btnCancel.addActionListener( this );
addButton( btnSetRange );
addButton( btnCancel );
}
protected void buildContentsPanel() {
rdoAllDates = new JRadioButton( "Display all dates.", false );
rdoLimitDates = new JRadioButton( "Limit view to the following date range:", false );
rdoAllDates.addItemListener(this);
rdoLimitDates.addItemListener(this);
ButtonGroup bg = new ButtonGroup();
bg.add( rdoAllDates );
bg.add( rdoLimitDates );
startDateChooser = new JDateChooser();
endDateChooser = new JDateChooser();
startDateChooser.addPropertyChangeListener(this);
endDateChooser.addPropertyChangeListener(this);
JPanel jp = new JPanel( new MigLayout( migDefaults ));
jp.add( rdoAllDates, "wrap, span 2" );
jp.add( rdoLimitDates, "wrap, span 2" );
jp.add( new JLabel( "Show dates after" ), "align right" );
jp.add( startDateChooser, "wrap" );
jp.add( new JLabel( "Show dates before" ), "align right" );
jp.add( endDateChooser, "wrap" );
contentsPanelBuilt = true;
rdoAllDates.setSelected(true);
add(jp);
}
public void itemStateChanged( ItemEvent arg0 ) {
Object source = arg0.getSource();
if ( source == rdoAllDates || source == rdoLimitDates ) {
setDateRangeSet( rdoLimitDates.isSelected() );
setComponentsEnabled( rdoLimitDates.isSelected() );
}
}
private void setComponentsEnabled( boolean enable ) {
startDateChooser.setEnabled( enable );
endDateChooser.setEnabled( enable );
}
public void actionPerformed( ActionEvent arg0 ) {
String action = arg0.getActionCommand();
if ( action.equalsIgnoreCase( btnSetRange.getText() ) ) {
setStartDate( startDateChooser.getDate() );
setEndDate( endDateChooser.getDate() );
setVisible( false );
}
else if ( action.equalsIgnoreCase( btnCancel.getText() ) ) {
setVisible( false );
// TODO revert to initial state
}
}
public void propertyChange( PropertyChangeEvent arg0 ) {
if ( arg0.getSource() == startDateChooser ) {
endDateChooser.setMinSelectableDate( startDateChooser.getDate() );
}
else if ( arg0.getSource() == endDateChooser ) {
startDateChooser.setMaxSelectableDate( endDateChooser.getDate() );
}
}
}
// For testing.
public static void main(String[] args) {
new CPSComplexFilterDialog( new JPanel() ).setVisible(true);
System.exit( 0 );
}
}