summaryrefslogblamecommitdiffstats
path: root/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/LectureCreationPage.java
blob: 9bb9140922bb7383a9584634d036ddf9f8cd8816 (plain) (tree)
1
2
3
4
5
6
7
8
9

                                           
                      

                                     



                                        
 
                               
                                                    
                                                        
                                            
                                                                      
                                                   

                                            
 



                                                       
                           
                                                                    
 
                                                                                         
 

                                                

                                     
           
                                                                             
                                                                                   
                                   
 
                                               
                                                                                 
                                 
                                               


                                                   
 

                                                                              

                                                 
                                                                            





                                                                    
                                                                            




                                                                 



                                                               
                                      
         





                                              




                                                                             

                                            
                                      



                                   
           

                                                                       

                                            

                                                                                    



                                                                                            
                                                                       
                                                                                         


                 
                                       
                                                  
                                                                                      

                                     
                                                       
                 
                                                         
                                                                                 
                                     
                        
                                                                     
                 
                                            

                                                                                          
 
                                       
                                                                         

                                            
                                                                                 
                                     



                                                                                                                             
                                                                                                      





                                                                                                               
                 
                                

                                                                                            
                                                                       
                            
         
 
package org.openslx.dozmod.gui.wizard.page;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;

import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import org.apache.log4j.Logger;
import org.openslx.dozmod.gui.helper.DateTimeHelper;
import org.openslx.dozmod.gui.helper.TextChangeListener;
import org.openslx.dozmod.gui.wizard.Wizard;
import org.openslx.dozmod.gui.wizard.layout.LectureCreationPageLayout;
import org.openslx.dozmod.state.LectureWizardState;
import org.openslx.dozmod.thrift.Session;
import org.openslx.dozmod.util.FormatHelper;

/**
 * First page for creating a new lecture.
 * Used to set name, description and start- and endtime
 */
@SuppressWarnings("serial")
public class LectureCreationPage extends LectureCreationPageLayout {

	private final static Logger LOGGER = Logger.getLogger(LectureCreationPage.class);

	private LectureWizardState state = null;

	/**
	 * Page for creating lectures
	 */
	public LectureCreationPage(Wizard wizard, LectureWizardState state) {
		super(wizard, state.image != null ? state.image.imageName : "Neu");
		this.state = state;

		// listener for the text fields
		final TextChangeListener docListener = new TextChangeListener() {
			@Override
			public void changed() {
				reactToUserInput();
			}
		};

		txtName.getDocument().addDocumentListener(docListener);
		txtDescription.getDocument().addDocumentListener(docListener);

		// listeners for the date pickers
		final ActionListener actionListener = new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				reactToUserInput();
			}
		};
		// listeners for the time pickers
		final ChangeListener changeListener = new ChangeListener() {
			@Override
			public void stateChanged(ChangeEvent e) {
				reactToUserInput();
			}
		};
		spnStartTime.addChangeListener(changeListener);
		spnEndTime.addChangeListener(changeListener);
		dtpStartDate.addActionListener(actionListener);
		dtpEndDate.addActionListener(actionListener);
		calculateDatePeriod();
	}

	@Override
	protected boolean wantNextOrFinish() {
		return reactToUserInput();
	}

	/**
	 * Called by event listeners. This will set guidance message or error
	 * message and call setPageComplete(bool) accordingly.
	 * The state will be updated if the fields are valid.
	 */
	private boolean reactToUserInput() {
		boolean b = isPageValid();
		calculateDatePeriod();
		setPageComplete(b);
		return b;
	}

	/**
	 * Calculate the days between the selected dates and update the
	 * corresponding label.
	 */
	private void calculateDatePeriod() {
		Date start = DateTimeHelper.getDateFrom(dtpStartDate, spnStartTime);
		Date end = DateTimeHelper.getDateFrom(dtpEndDate, spnEndTime);
		if (end.before(start)) {
			lblCalcPeriod.setText("Endzeitpunkt ist vor Startzeitpunkt!");
		} else {
			int numberOfDays = DateTimeHelper.calculatePeriodInDays(start, end);
			lblCalcPeriod.setText(numberOfDays + "Tag(e)");
			lblCalcPeriod.setForeground(numberOfDays < 7 ? Color.RED : null);
		}
	}

	private boolean isPageValid() {
		if (txtName.getText().isEmpty()) {
			setWarningMessage("Geben Sie einen Veranstaltungsnamen ein.");
			return false;
		} else {
			state.name = txtName.getText();
		}
		if (txtDescription.getText().isEmpty()) {
			setWarningMessage("Fügen Sie eine Beschreibung hinzu.");
			return false;
		} else {
			state.description = txtDescription.getText();
		}
		final Date now = new Date();
		final Date start = DateTimeHelper.getDateFrom(dtpStartDate, spnStartTime);
		final Date end = DateTimeHelper.getDateFrom(dtpEndDate, spnEndTime);

		if (start.after(end)) {
			setWarningMessage("Startzeit ist nach Endzeit!");
			return false;
		} else if (now.after(end)) {
			setWarningMessage("Endzeit liegt in die Vergangenheit!");
			return false;
		} else {
			int validityPeriod = Session.getSatelliteConfig().getMaxLectureValidityDays();
			Date validityPeriodEnd = DateTimeHelper.addDaysTo(start, validityPeriod); // all good, save them both
			if (end.after(validityPeriodEnd)) {
				setWarningMessage("Endzeit liegt nach dem spätest möglichen Datum: "
						+ FormatHelper.shortDate(validityPeriodEnd.getTime() / 1000L));
				return false;
			} else {
				state.start = start;
				state.end = end;
			}
		}
		String nextText;
		nextText = state.image == null ? ", um eine Virtuelle Maschine auszuwählen"
				: " für Berechtigungen oder 'Fertigstellen'.";
		setDescription("Klicken Sie auf 'Weiter' " + nextText);
		return true;
	}
}