Rework.
authorindvdum
Fri, 19 Aug 2011 16:23:26 +0300
changeset 96a02cfcc7460
parent 8 56338d6d58c2
child 10 b062ed9a28f1
Rework.
src/main/java/ru/indvdum/mywork/openjpa/model/Day.java
src/main/java/ru/indvdum/mywork/openjpa/model/Task.java
src/main/java/ru/indvdum/mywork/openjpa/model/Work.java
src/main/java/ru/indvdum/mywork/vaadin/EditDayDialog.java
src/main/java/ru/indvdum/mywork/vaadin/EditState.java
src/main/java/ru/indvdum/mywork/vaadin/EditTaskDialog.java
src/main/java/ru/indvdum/mywork/vaadin/EditWorkDialog.java
src/main/java/ru/indvdum/mywork/vaadin/MyWorkApplication.java
     1.1 --- a/src/main/java/ru/indvdum/mywork/openjpa/model/Day.java	Wed Aug 17 17:03:37 2011 +0300
     1.2 +++ b/src/main/java/ru/indvdum/mywork/openjpa/model/Day.java	Fri Aug 19 16:23:26 2011 +0300
     1.3 @@ -1,6 +1,8 @@
     1.4  package ru.indvdum.mywork.openjpa.model;
     1.5  
     1.6  import java.sql.Time;
     1.7 +import java.text.DateFormat;
     1.8 +import java.text.SimpleDateFormat;
     1.9  import java.util.Date;
    1.10  
    1.11  import javax.persistence.Column;
    1.12 @@ -22,7 +24,7 @@
    1.13  	private static final long serialVersionUID = 1471705339524132968L;
    1.14  	
    1.15  	@Id
    1.16 -	@GeneratedValue(strategy = GenerationType.IDENTITY)
    1.17 +	@GeneratedValue
    1.18  	@Column(name = "ID", nullable = false)
    1.19  	private Integer id = null;
    1.20  	
    1.21 @@ -39,7 +41,7 @@
    1.22  	private Float hours = null;
    1.23  	
    1.24  	public Day(){
    1.25 -		
    1.26 +
    1.27  	}
    1.28  
    1.29  	@Override
    1.30 @@ -51,7 +53,20 @@
    1.31  		if (!(obj instanceof Day))
    1.32  			return false;
    1.33  		final Day other = (Day) obj;
    1.34 -		return (this.id == other.id || (this.id != null && this.id.equals(other.id)));
    1.35 +		return (getId() == other.getId() || (getId() != null && getId().equals(other.getId())));
    1.36 +	}
    1.37 +	
    1.38 +	@Override
    1.39 +	public int hashCode() {
    1.40 +		if(getId() != null && getId() != 0)
    1.41 +			return getId().hashCode();
    1.42 +		else
    1.43 +			return super.hashCode();
    1.44 +	}
    1.45 +
    1.46 +	@Override
    1.47 +	public String toString() {
    1.48 +		return getDateFormatter().format(getDay());
    1.49  	}
    1.50  
    1.51  	public Integer getId() {
    1.52 @@ -93,4 +108,8 @@
    1.53  	public void setHours(Float hours) {
    1.54  		this.hours = hours;
    1.55  	}
    1.56 +
    1.57 +	protected DateFormat getDateFormatter() {
    1.58 +		return new SimpleDateFormat("dd.MM.yyyy");
    1.59 +	}
    1.60  }
     2.1 --- a/src/main/java/ru/indvdum/mywork/openjpa/model/Task.java	Wed Aug 17 17:03:37 2011 +0300
     2.2 +++ b/src/main/java/ru/indvdum/mywork/openjpa/model/Task.java	Fri Aug 19 16:23:26 2011 +0300
     2.3 @@ -19,7 +19,7 @@
     2.4  	private static final long serialVersionUID = -4457948503094306717L;
     2.5  	
     2.6  	@Id
     2.7 -	@GeneratedValue(strategy = GenerationType.IDENTITY)
     2.8 +	@GeneratedValue
     2.9  	@Column(name = "ID", nullable = false)
    2.10  	private Integer id = null;
    2.11  	
    2.12 @@ -42,7 +42,20 @@
    2.13  		if (!(obj instanceof Task))
    2.14  			return false;
    2.15  		final Task other = (Task) obj;
    2.16 -		return (this.id == other.id || (this.id != null && this.id.equals(other.id)));
    2.17 +		return (getId() == other.getId() || (getId() != null && getId().equals(other.getId())));
    2.18 +	}
    2.19 +
    2.20 +	@Override
    2.21 +	public int hashCode() {
    2.22 +		if(getId() != null && getId() != 0)
    2.23 +			return getId().hashCode();
    2.24 +		else
    2.25 +			return super.hashCode();
    2.26 +	}
    2.27 +
    2.28 +	@Override
    2.29 +	public String toString() {
    2.30 +		return getName();
    2.31  	}
    2.32  
    2.33  	public Integer getId() {
     3.1 --- a/src/main/java/ru/indvdum/mywork/openjpa/model/Work.java	Wed Aug 17 17:03:37 2011 +0300
     3.2 +++ b/src/main/java/ru/indvdum/mywork/openjpa/model/Work.java	Fri Aug 19 16:23:26 2011 +0300
     3.3 @@ -4,6 +4,7 @@
     3.4  import javax.persistence.EmbeddedId;
     3.5  import javax.persistence.Entity;
     3.6  import javax.persistence.FetchType;
     3.7 +import javax.persistence.GeneratedValue;
     3.8  import javax.persistence.ManyToOne;
     3.9  import javax.persistence.MapsId;
    3.10  import javax.persistence.Table;
    3.11 @@ -20,7 +21,7 @@
    3.12  	private static final long serialVersionUID = 7138260708537798813L;
    3.13  	
    3.14  	@EmbeddedId
    3.15 -	WorkId id;
    3.16 +	private WorkId id = null;
    3.17  	
    3.18  	@Column(name = "HOURS")
    3.19  	private Float hours = null;
    3.20 @@ -40,27 +41,6 @@
    3.21  		
    3.22  	}
    3.23  
    3.24 -	@Override
    3.25 -	public boolean equals(Object obj) {
    3.26 -		if (this == obj)
    3.27 -			return true;
    3.28 -		if (obj == null)
    3.29 -			return false;
    3.30 -		if (!(obj instanceof Work))
    3.31 -			return false;
    3.32 -		final Work other = (Work) obj;
    3.33 -		return (
    3.34 -				this.day == other.day 
    3.35 -				&& this.task == other.task 
    3.36 -				|| (
    3.37 -						this.day != null 
    3.38 -						&& this.day.equals(other.day) 
    3.39 -						&& this.task != null 
    3.40 -						&& this.task.equals(other.task)
    3.41 -						)
    3.42 -				);
    3.43 -	}
    3.44 -
    3.45  	public Float getHours() {
    3.46  		return hours;
    3.47  	}
    3.48 @@ -93,12 +73,12 @@
    3.49  		this.task = task;
    3.50  	}
    3.51  
    3.52 -	public String getDayName() {
    3.53 -		return getDay().getDay().toString();
    3.54 +	public WorkId getId() {
    3.55 +		return id;
    3.56  	}
    3.57 -	
    3.58 -	public String getTaskName() {
    3.59 -		return getTask().getName();
    3.60 +
    3.61 +	public void setId(WorkId id) {
    3.62 +		this.id = id;
    3.63  	}
    3.64  
    3.65  }
     4.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     4.2 +++ b/src/main/java/ru/indvdum/mywork/vaadin/EditDayDialog.java	Fri Aug 19 16:23:26 2011 +0300
     4.3 @@ -0,0 +1,238 @@
     4.4 +package ru.indvdum.mywork.vaadin;
     4.5 +
     4.6 +import static ru.indvdum.mywork.MyWork.EM;
     4.7 +
     4.8 +import java.sql.Time;
     4.9 +import java.text.SimpleDateFormat;
    4.10 +import java.util.Calendar;
    4.11 +import java.util.Date;
    4.12 +
    4.13 +import ru.indvdum.mywork.openjpa.model.Day;
    4.14 +
    4.15 +import com.vaadin.data.Property.ValueChangeEvent;
    4.16 +import com.vaadin.data.Property.ValueChangeListener;
    4.17 +import com.vaadin.ui.Alignment;
    4.18 +import com.vaadin.ui.Button;
    4.19 +import com.vaadin.ui.HorizontalLayout;
    4.20 +import com.vaadin.ui.Label;
    4.21 +import com.vaadin.ui.PopupDateField;
    4.22 +import com.vaadin.ui.TextField;
    4.23 +import com.vaadin.ui.VerticalLayout;
    4.24 +import com.vaadin.ui.Window;
    4.25 +import com.vaadin.ui.Button.ClickEvent;
    4.26 +import com.vaadin.ui.Button.ClickListener;
    4.27 +
    4.28 +public class EditDayDialog extends Window implements ValueChangeListener, ClickListener {
    4.29 +	
    4.30 +	private MyWorkApplication myApp = null;
    4.31 +	private EditState state = null;
    4.32 +	private Day day = null;
    4.33 +	private PopupDateField dayStartTime = null;
    4.34 +	private PopupDateField dayEndTime = null;
    4.35 +	private PopupDateField dayDate = null;
    4.36 +	private TextField dayHours = null;
    4.37 +
    4.38 +	public EditDayDialog(MyWorkApplication myApp, EditState state, Day day) throws Exception {
    4.39 +		super();
    4.40 +		this.myApp = myApp;
    4.41 +		this.state = state;
    4.42 +		switch(state){
    4.43 +		case CREATE:
    4.44 +			setCaption("Creating new day");
    4.45 +			if(day != null)
    4.46 +				throw new Exception("Illegal argument: day must be null in creating state.");
    4.47 +			day = new Day();
    4.48 +			Calendar calDay = Calendar.getInstance();
    4.49 +			calDay.set(Calendar.HOUR_OF_DAY, 0);
    4.50 +			calDay.set(Calendar.MINUTE, 0);
    4.51 +			calDay.set(Calendar.SECOND, 0);
    4.52 +			calDay.set(Calendar.MILLISECOND, 0);
    4.53 +			day.setDay(calDay.getTime());
    4.54 +			Calendar calStart = Calendar.getInstance();
    4.55 +			calStart.set(Calendar.HOUR_OF_DAY, 9);
    4.56 +			calStart.set(Calendar.MINUTE, 0);
    4.57 +			calStart.set(Calendar.SECOND, 0);
    4.58 +			calStart.set(Calendar.MILLISECOND, 0);
    4.59 +			day.setStartWork(new Time(calStart.getTime().getTime()));
    4.60 +			Calendar calEnd = Calendar.getInstance();
    4.61 +			calEnd.set(Calendar.HOUR_OF_DAY, 18);
    4.62 +			calEnd.set(Calendar.MINUTE, 0);
    4.63 +			calEnd.set(Calendar.SECOND, 0);
    4.64 +			calEnd.set(Calendar.MILLISECOND, 0);
    4.65 +			day.setEndWork(new Time(calEnd.getTime().getTime()));
    4.66 +			day.setHours(8f);
    4.67 +			this.day = day;
    4.68 +			break;
    4.69 +		case EDIT:
    4.70 +			setCaption("Editing day");
    4.71 +			if(day == null)
    4.72 +				throw new Exception("Illegal argument: day must be not null in editing state.");
    4.73 +			this.day = day;
    4.74 +			break;
    4.75 +		}
    4.76 +		init();
    4.77 +	}
    4.78 +	
    4.79 +	private void init(){
    4.80 +		setModal(true);
    4.81 +		setWidth("480px");
    4.82 +		setHeight("300px");
    4.83 +		VerticalLayout vl = new VerticalLayout();
    4.84 +		vl.setSizeFull();
    4.85 +		vl.setSpacing(true);
    4.86 +		vl.setMargin(true);
    4.87 +		setContent(vl);
    4.88 +		
    4.89 +		HorizontalLayout hlDay = new HorizontalLayout();
    4.90 +		hlDay.setWidth("100%");
    4.91 +		Label lblDay = new Label("Day:");
    4.92 +		lblDay.setWidth("100%");
    4.93 +		hlDay.addComponent(lblDay);
    4.94 +		hlDay.setExpandRatio(lblDay, 1f);
    4.95 +		dayDate = new PopupDateField();
    4.96 +		dayDate.setWidth("100%");
    4.97 +		dayDate.setInputPrompt("Enter date");
    4.98 +		dayDate.setResolution(PopupDateField.RESOLUTION_DAY);
    4.99 +		dayDate.setImmediate(true);
   4.100 +		dayDate.setValue(day.getDay());
   4.101 +		dayDate.addListener(this);
   4.102 +		dayDate.setDateFormat("dd.MM.yyyy");
   4.103 +		hlDay.addComponent(dayDate);
   4.104 +		hlDay.setExpandRatio(dayDate, 5f);
   4.105 +		vl.addComponent(hlDay);
   4.106 +		
   4.107 +		HorizontalLayout hlStart = new HorizontalLayout();
   4.108 +		hlStart.setWidth("100%");
   4.109 +		Label lblStart = new Label("Start time:");
   4.110 +		lblStart.setWidth("100%");
   4.111 +		hlStart.addComponent(lblStart);
   4.112 +		hlStart.setExpandRatio(lblStart, 1f);
   4.113 +		dayStartTime = new PopupDateField();
   4.114 +		dayStartTime.setWidth("100%");
   4.115 +		dayStartTime.setInputPrompt("Enter time");
   4.116 +		dayStartTime.setResolution(PopupDateField.RESOLUTION_MIN);
   4.117 +		dayStartTime.setImmediate(true);
   4.118 +		dayStartTime.setValue(day.getStartWork());
   4.119 +		dayStartTime.setDateFormat("HH:mm");
   4.120 +		hlStart.addComponent(dayStartTime);
   4.121 +		hlStart.setExpandRatio(dayStartTime, 5f);
   4.122 +		vl.addComponent(hlStart);
   4.123 +		
   4.124 +		HorizontalLayout hlEnd = new HorizontalLayout();
   4.125 +		hlEnd.setWidth("100%");
   4.126 +		Label lblEnd = new Label("End time:");
   4.127 +		lblEnd.setWidth("100%");
   4.128 +		hlEnd.addComponent(lblEnd);
   4.129 +		hlEnd.setExpandRatio(lblEnd, 1f);
   4.130 +		dayEndTime = new PopupDateField();
   4.131 +		dayEndTime.setWidth("100%");
   4.132 +		dayEndTime.setInputPrompt("Enter time");
   4.133 +		dayEndTime.setResolution(PopupDateField.RESOLUTION_MIN);
   4.134 +		dayEndTime.setImmediate(true);
   4.135 +		dayEndTime.setValue(day.getEndWork());
   4.136 +		dayEndTime.setDateFormat("HH:mm");
   4.137 +		hlEnd.addComponent(dayEndTime);
   4.138 +		hlEnd.setExpandRatio(dayEndTime, 5f);
   4.139 +		vl.addComponent(hlEnd);
   4.140 +		
   4.141 +		HorizontalLayout hlHours = new HorizontalLayout();
   4.142 +		hlHours.setWidth("100%");
   4.143 +		Label lblHours = new Label("Work hours count:");
   4.144 +		lblHours.setWidth("100%");
   4.145 +		hlHours.addComponent(lblHours);
   4.146 +		hlHours.setExpandRatio(lblHours, 1f);
   4.147 +		dayHours = new TextField();
   4.148 +		dayHours.setWidth("100%");
   4.149 +		dayHours.setValue(day.getHours());
   4.150 +		dayHours.setImmediate(true);
   4.151 +		hlHours.addComponent(dayHours);
   4.152 +		hlHours.setExpandRatio(dayHours, 5f);
   4.153 +		vl.addComponent(hlHours);
   4.154 +		
   4.155 +		HorizontalLayout hlOk = new HorizontalLayout();
   4.156 +		hlOk.setSizeFull();
   4.157 +		Button okButton = new Button();
   4.158 +		switch(state){
   4.159 +		case CREATE:
   4.160 +			okButton.setCaption("Create");
   4.161 +			break;
   4.162 +		case EDIT:
   4.163 +			okButton.setCaption("Save");
   4.164 +			break;
   4.165 +		}
   4.166 +		okButton.addListener((ClickListener)this);
   4.167 +		hlOk.addComponent(okButton);
   4.168 +		hlOk.setComponentAlignment(okButton, Alignment.BOTTOM_RIGHT);
   4.169 +		vl.addComponent(hlOk);
   4.170 +		vl.setExpandRatio(hlOk, 1f);
   4.171 +	}
   4.172 +
   4.173 +	@Override
   4.174 +	public void valueChange(ValueChangeEvent event) {
   4.175 +		Object value = event.getProperty().getValue();
   4.176 +		Object startValue = dayStartTime.getValue();
   4.177 +		Object endValue = dayEndTime.getValue();
   4.178 +		if (value == null || !(value instanceof Date) || !(startValue instanceof Date) || !(endValue instanceof Date)) {
   4.179 +			getWindow().showNotification("Invalid date entered");
   4.180 +		} else {
   4.181 +			Date date = (Date)value;
   4.182 +			Date start = (Date)startValue;
   4.183 +			Date end = (Date)endValue;
   4.184 +			Calendar calStart = Calendar.getInstance();
   4.185 +			calStart.setTime(start);
   4.186 +			Calendar calEnd = Calendar.getInstance();
   4.187 +			calEnd.setTime(end);
   4.188 +			Calendar cal = Calendar.getInstance();
   4.189 +			cal.setTime(date);
   4.190 +			calStart.set(Calendar.YEAR, cal.get(Calendar.YEAR));
   4.191 +			calStart.set(Calendar.MONTH, cal.get(Calendar.MONTH));
   4.192 +			calStart.set(Calendar.DAY_OF_MONTH, cal.get(Calendar.DAY_OF_MONTH));
   4.193 +			calStart.set(Calendar.SECOND, cal.get(Calendar.SECOND));
   4.194 +			calStart.set(Calendar.MILLISECOND, cal.get(Calendar.MILLISECOND));
   4.195 +			calEnd.set(Calendar.YEAR, cal.get(Calendar.YEAR));
   4.196 +			calEnd.set(Calendar.MONTH, cal.get(Calendar.MONTH));
   4.197 +			calEnd.set(Calendar.DAY_OF_MONTH, cal.get(Calendar.DAY_OF_MONTH));
   4.198 +			calEnd.set(Calendar.SECOND, cal.get(Calendar.SECOND));
   4.199 +			calEnd.set(Calendar.MILLISECOND, cal.get(Calendar.MILLISECOND));
   4.200 +			dayStartTime.setValue(calStart.getTime());
   4.201 +			dayEndTime.setValue(calEnd.getTime());
   4.202 +		}
   4.203 +	}
   4.204 +
   4.205 +	@Override
   4.206 +	public void buttonClick(ClickEvent event) {
   4.207 +		Object value = dayDate.getValue();
   4.208 +		Object startValue = dayStartTime.getValue();
   4.209 +		Object endValue = dayEndTime.getValue();
   4.210 +		Object hoursValue = dayHours.getValue();
   4.211 +		if (
   4.212 +				value == null 
   4.213 +				|| !(value instanceof Date) 
   4.214 +				|| !(startValue instanceof Date) 
   4.215 +				|| !(endValue instanceof Date)
   4.216 +				|| !(hoursValue.toString().matches("^[0-9]+[\\.]{0,1}[0-9]*"))
   4.217 +				) {
   4.218 +			getWindow().showNotification("Invalid information entered");
   4.219 +		} else {
   4.220 +			Date date = (Date)value;
   4.221 +			Date start = (Date)startValue;
   4.222 +			Date end = (Date)endValue;
   4.223 +			Float hours = Float.parseFloat(hoursValue.toString());
   4.224 +			day.setDay(date);
   4.225 +			day.setStartWork(new Time(start.getTime()));
   4.226 +			day.setEndWork(new Time(end.getTime()));
   4.227 +			day.setHours(hours);
   4.228 +			try{
   4.229 +				EM.getTransaction().begin();
   4.230 +				EM.persist(day);
   4.231 +				EM.getTransaction().commit();
   4.232 +			} finally {
   4.233 +				if(EM.getTransaction().isActive())
   4.234 +					EM.getTransaction().rollback();
   4.235 +			}
   4.236 +			getParent().removeWindow(this);
   4.237 +			myApp.getDayTable().requestRepaint();
   4.238 +		}
   4.239 +	}
   4.240 +
   4.241 +}
     5.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     5.2 +++ b/src/main/java/ru/indvdum/mywork/vaadin/EditState.java	Fri Aug 19 16:23:26 2011 +0300
     5.3 @@ -0,0 +1,6 @@
     5.4 +package ru.indvdum.mywork.vaadin;
     5.5 +
     5.6 +public enum EditState {
     5.7 +	CREATE,
     5.8 +	EDIT,
     5.9 +}
     6.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     6.2 +++ b/src/main/java/ru/indvdum/mywork/vaadin/EditTaskDialog.java	Fri Aug 19 16:23:26 2011 +0300
     6.3 @@ -0,0 +1,111 @@
     6.4 +package ru.indvdum.mywork.vaadin;
     6.5 +
     6.6 +import static ru.indvdum.mywork.MyWork.EM;
     6.7 +import ru.indvdum.mywork.openjpa.model.Task;
     6.8 +
     6.9 +import com.vaadin.ui.Alignment;
    6.10 +import com.vaadin.ui.Button;
    6.11 +import com.vaadin.ui.HorizontalLayout;
    6.12 +import com.vaadin.ui.Label;
    6.13 +import com.vaadin.ui.RichTextArea;
    6.14 +import com.vaadin.ui.TextField;
    6.15 +import com.vaadin.ui.VerticalLayout;
    6.16 +import com.vaadin.ui.Window;
    6.17 +import com.vaadin.ui.Button.ClickEvent;
    6.18 +import com.vaadin.ui.Button.ClickListener;
    6.19 +
    6.20 +public class EditTaskDialog extends Window implements ClickListener {
    6.21 +	
    6.22 +	private MyWorkApplication myApp = null;
    6.23 +	private EditState state = null;
    6.24 +	private Task task = null;
    6.25 +	private TextField taskName = null;
    6.26 +	private RichTextArea taskDescription = null;
    6.27 +
    6.28 +	public EditTaskDialog(MyWorkApplication myApp, EditState state, Task task) throws Exception {
    6.29 +		super();
    6.30 +		this.myApp = myApp;
    6.31 +		this.state = state;
    6.32 +		switch(state){
    6.33 +		case CREATE:
    6.34 +			setCaption("Creating new task");
    6.35 +			if(task != null)
    6.36 +				throw new Exception("Illegal argument: task must be null in creating state.");
    6.37 +			task = new Task();
    6.38 +			task.setName("");
    6.39 +			task.setDescription("");
    6.40 +			this.task = task;
    6.41 +			break;
    6.42 +		case EDIT:
    6.43 +			setCaption("Editing task");
    6.44 +			if(task == null)
    6.45 +				throw new Exception("Illegal argument: task must be not null in editing state.");
    6.46 +			this.task = task;
    6.47 +			break;
    6.48 +		}
    6.49 +		init();
    6.50 +	}
    6.51 +	
    6.52 +	private void init(){
    6.53 +		setModal(true);
    6.54 +		setWidth("640px");
    6.55 +		setHeight("480px");
    6.56 +		VerticalLayout vl = new VerticalLayout();
    6.57 +		vl.setSizeFull();
    6.58 +		vl.setSpacing(true);
    6.59 +		vl.setMargin(true);
    6.60 +		setContent(vl);
    6.61 +		
    6.62 +		HorizontalLayout hlName = new HorizontalLayout();
    6.63 +		hlName.setWidth("100%");
    6.64 +		Label lblName = new Label("Name:");
    6.65 +		lblName.setWidth("100%");
    6.66 +		hlName.addComponent(lblName);
    6.67 +		hlName.setExpandRatio(lblName, 1f);
    6.68 +		taskName = new TextField();
    6.69 +		taskName.setWidth("100%");
    6.70 +		taskName.setValue(task.getName());
    6.71 +		hlName.addComponent(taskName);
    6.72 +		hlName.setExpandRatio(taskName, 5f);
    6.73 +		vl.addComponent(hlName);
    6.74 +		
    6.75 +		taskDescription = new RichTextArea("Description");
    6.76 +		taskDescription.setValue(task.getDescription());
    6.77 +		taskDescription.setSizeFull();
    6.78 +		vl.addComponent(taskDescription);
    6.79 +		vl.setExpandRatio(taskDescription, 1f);
    6.80 +		
    6.81 +		HorizontalLayout hlOk = new HorizontalLayout();
    6.82 +		hlOk.setWidth("100%");
    6.83 +		Button okButton = new Button();
    6.84 +		switch(state){
    6.85 +		case CREATE:
    6.86 +			okButton.setCaption("Create");
    6.87 +			break;
    6.88 +		case EDIT:
    6.89 +			okButton.setCaption("Save");
    6.90 +			break;
    6.91 +		}
    6.92 +		okButton.addListener((ClickListener)this);
    6.93 +		hlOk.addComponent(okButton);
    6.94 +		hlOk.setComponentAlignment(okButton, Alignment.MIDDLE_RIGHT);
    6.95 +		vl.addComponent(hlOk);
    6.96 +	}
    6.97 +
    6.98 +	@Override
    6.99 +	public void buttonClick(ClickEvent event) {
   6.100 +		task.setName(taskName.getValue().toString());
   6.101 +		task.setDescription(taskDescription.getValue().toString());
   6.102 +		try{
   6.103 +			EM.getTransaction().begin();
   6.104 +			EM.persist(task);
   6.105 +			EM.getTransaction().commit();
   6.106 +		} finally {
   6.107 +			if(EM.getTransaction().isActive())
   6.108 +				EM.getTransaction().rollback();
   6.109 +		}
   6.110 +		getParent().removeWindow(this);
   6.111 +		myApp.getTaskTable().requestRepaint();
   6.112 +	}
   6.113 +
   6.114 +}
     7.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     7.2 +++ b/src/main/java/ru/indvdum/mywork/vaadin/EditWorkDialog.java	Fri Aug 19 16:23:26 2011 +0300
     7.3 @@ -0,0 +1,229 @@
     7.4 +package ru.indvdum.mywork.vaadin;
     7.5 +
     7.6 +import static ru.indvdum.mywork.MyWork.EM;
     7.7 +
     7.8 +import java.util.Calendar;
     7.9 +import java.util.List;
    7.10 +
    7.11 +import javax.persistence.Query;
    7.12 +
    7.13 +import ru.indvdum.mywork.openjpa.model.Day;
    7.14 +import ru.indvdum.mywork.openjpa.model.Task;
    7.15 +import ru.indvdum.mywork.openjpa.model.Work;
    7.16 +
    7.17 +import com.vaadin.data.Property.ValueChangeEvent;
    7.18 +import com.vaadin.data.Property.ValueChangeListener;
    7.19 +import com.vaadin.ui.Alignment;
    7.20 +import com.vaadin.ui.Button;
    7.21 +import com.vaadin.ui.ComboBox;
    7.22 +import com.vaadin.ui.HorizontalLayout;
    7.23 +import com.vaadin.ui.Label;
    7.24 +import com.vaadin.ui.RichTextArea;
    7.25 +import com.vaadin.ui.TextField;
    7.26 +import com.vaadin.ui.VerticalLayout;
    7.27 +import com.vaadin.ui.Window;
    7.28 +import com.vaadin.ui.AbstractSelect.Filtering;
    7.29 +import com.vaadin.ui.Button.ClickEvent;
    7.30 +import com.vaadin.ui.Button.ClickListener;
    7.31 +
    7.32 +public class EditWorkDialog extends Window implements ClickListener {
    7.33 +	
    7.34 +	private MyWorkApplication myApp = null;
    7.35 +	private EditState state = null;
    7.36 +	private Work work = null;
    7.37 +	private ComboBox workDay = null;
    7.38 +	private ComboBox workTask = null;
    7.39 +	private TextField workHours = null;
    7.40 +	private RichTextArea workResult = null;
    7.41 +
    7.42 +	public EditWorkDialog(MyWorkApplication myApp, EditState state, Work work) throws Exception {
    7.43 +		super();
    7.44 +		this.myApp = myApp;
    7.45 +		this.state = state;
    7.46 +		switch(state){
    7.47 +		case CREATE:
    7.48 +			setCaption("Creating new work");
    7.49 +			if(work != null)
    7.50 +				throw new Exception("Illegal argument: work must be null in creating state.");
    7.51 +			work = new Work();
    7.52 +			work.setHours(0f);
    7.53 +			work.setResult("");
    7.54 +			this.work = work;
    7.55 +			break;
    7.56 +		case EDIT:
    7.57 +			setCaption("Editing work");
    7.58 +			if(work == null)
    7.59 +				throw new Exception("Illegal argument: work must be not null in editing state.");
    7.60 +			this.work = work;
    7.61 +			break;
    7.62 +		}
    7.63 +		init();
    7.64 +	}
    7.65 +	
    7.66 +	private void init(){
    7.67 +		setModal(true);
    7.68 +		setWidth("640px");
    7.69 +		setHeight("480px");
    7.70 +		VerticalLayout vl = new VerticalLayout();
    7.71 +		vl.setSizeFull();
    7.72 +		vl.setSpacing(true);
    7.73 +		vl.setMargin(true);
    7.74 +		setContent(vl);
    7.75 +		
    7.76 +		HorizontalLayout hlDay = new HorizontalLayout();
    7.77 +		hlDay.setWidth("100%");
    7.78 +		Label lblDay = new Label("Day:");
    7.79 +		lblDay.setWidth("100%");
    7.80 +		hlDay.addComponent(lblDay);
    7.81 +		hlDay.setExpandRatio(lblDay, 1f);
    7.82 +		workDay = new ComboBox();
    7.83 +		workDay.setWidth("100%");
    7.84 +		workDay.setImmediate(true);
    7.85 +		workDay.setFilteringMode(Filtering.FILTERINGMODE_CONTAINS);
    7.86 +		updateDays("select d from " + Day.class.getName() + " d order by d.day");
    7.87 +		workDay.addListener(new ValueChangeListener(){
    7.88 +
    7.89 +			@Override
    7.90 +			public void valueChange(ValueChangeEvent event) {
    7.91 +				Day day = (Day)event.getProperty().getValue();
    7.92 +				if(day == null)
    7.93 +					updateTasks("select t from " + Task.class.getName() + " t order by t.id desc");
    7.94 +				else
    7.95 +					updateTasks("select t from " + Task.class.getName() + " t where t.id not in (select w.task.id from " + Work.class.getName() + " w where w.day.id = " + day.getId() + ") order by t.id desc");
    7.96 +			}
    7.97 +			
    7.98 +		});
    7.99 +		hlDay.addComponent(workDay);
   7.100 +		hlDay.setExpandRatio(workDay, 5f);
   7.101 +		vl.addComponent(hlDay);
   7.102 +		
   7.103 +		HorizontalLayout hlTask = new HorizontalLayout();
   7.104 +		hlTask.setWidth("100%");
   7.105 +		Label lblStart = new Label("Task:");
   7.106 +		lblStart.setWidth("100%");
   7.107 +		hlTask.addComponent(lblStart);
   7.108 +		hlTask.setExpandRatio(lblStart, 1f);
   7.109 +		workTask = new ComboBox();
   7.110 +		workTask.setWidth("100%");
   7.111 +		workTask.setImmediate(true);
   7.112 +		workTask.setFilteringMode(Filtering.FILTERINGMODE_CONTAINS);
   7.113 +		Day day = (Day)workDay.getValue();
   7.114 +		if(day == null)
   7.115 +			updateTasks("select t from " + Task.class.getName() + " t order by t.id desc");
   7.116 +		else
   7.117 +			updateTasks("select t from " + Task.class.getName() + " t where t.id not in (select w.task.id from " + Work.class.getName() + " w where w.day.id = " + day.getId() + ") order by t.id desc");
   7.118 +		workTask.addListener(new ValueChangeListener(){
   7.119 +
   7.120 +			@Override
   7.121 +			public void valueChange(ValueChangeEvent event) {
   7.122 +				Task task = (Task)event.getProperty().getValue();
   7.123 +				if(task == null)
   7.124 +					updateDays("select d from " + Day.class.getName() + " d order by d.day");
   7.125 +				else
   7.126 +					updateDays("select d from " + Day.class.getName() + " d where d.id not in (select w.day.id from " + Work.class.getName() + " w where w.task.id = " + task.getId() + ") order by d.day");
   7.127 +			}
   7.128 +			
   7.129 +		});
   7.130 +		hlTask.addComponent(workTask);
   7.131 +		hlTask.setExpandRatio(workTask, 5f);
   7.132 +		vl.addComponent(hlTask);
   7.133 +		
   7.134 +		HorizontalLayout hlHours = new HorizontalLayout();
   7.135 +		hlHours.setWidth("100%");
   7.136 +		Label lblHours = new Label("Hours:");
   7.137 +		lblHours.setWidth("100%");
   7.138 +		hlHours.addComponent(lblHours);
   7.139 +		hlHours.setExpandRatio(lblHours, 1f);
   7.140 +		workHours = new TextField();
   7.141 +		workHours.setWidth("100%");
   7.142 +		workHours.setValue(work.getHours());
   7.143 +		workHours.setImmediate(true);
   7.144 +		hlHours.addComponent(workHours);
   7.145 +		hlHours.setExpandRatio(workHours, 5f);
   7.146 +		vl.addComponent(hlHours);
   7.147 +		
   7.148 +		workResult = new RichTextArea("Result");
   7.149 +		workResult.setValue(work.getResult());
   7.150 +		workResult.setSizeFull();
   7.151 +		vl.addComponent(workResult);
   7.152 +		vl.setExpandRatio(workResult, 5f);
   7.153 +		
   7.154 +		HorizontalLayout hlOk = new HorizontalLayout();
   7.155 +		hlOk.setWidth("100%");
   7.156 +		Button okButton = new Button();
   7.157 +		switch(state){
   7.158 +		case CREATE:
   7.159 +			okButton.setCaption("Create");
   7.160 +			break;
   7.161 +		case EDIT:
   7.162 +			okButton.setCaption("Save");
   7.163 +			break;
   7.164 +		}
   7.165 +		okButton.addListener((ClickListener)this);
   7.166 +		hlOk.addComponent(okButton);
   7.167 +		hlOk.setComponentAlignment(okButton, Alignment.MIDDLE_RIGHT);
   7.168 +		vl.addComponent(hlOk);
   7.169 +	}
   7.170 +	
   7.171 +	private void updateDays(String jpql){
   7.172 +		if(workTask != null && workTask.getValue() != null && workDay != null && workDay.getValue() != null)
   7.173 +			return;
   7.174 +		workDay.removeAllItems();
   7.175 +		Query query = EM.createQuery(jpql);
   7.176 +		List list = query.getResultList();
   7.177 +		for(Day day: (List<Day>)list){
   7.178 +			workDay.addItem(day);
   7.179 +			Calendar currCal = Calendar.getInstance();
   7.180 +			currCal.set(Calendar.HOUR_OF_DAY, 0);
   7.181 +			currCal.set(Calendar.MINUTE, 0);
   7.182 +			currCal.set(Calendar.SECOND, 0);
   7.183 +			currCal.set(Calendar.MILLISECOND, 0);
   7.184 +			if(day.getDay().equals(currCal.getTime()))
   7.185 +				workDay.select(day);
   7.186 +		}
   7.187 +	}
   7.188 +	
   7.189 +	private void updateTasks(String jpql){
   7.190 +		if(workTask != null && workTask.getValue() != null && workDay != null && workDay.getValue() != null)
   7.191 +			return;
   7.192 +		workTask.removeAllItems();
   7.193 +		Query query = EM.createQuery(jpql);
   7.194 +		List list = query.getResultList();
   7.195 +		for(Task task: (List<Task>)list)
   7.196 +			workTask.addItem(task);
   7.197 +	}
   7.198 +
   7.199 +	@Override
   7.200 +	public void buttonClick(ClickEvent event) {
   7.201 +		Object dayObj = workDay.getValue();
   7.202 +		Object taskObj = workTask.getValue();
   7.203 +		Object hoursObj = workHours.getValue();
   7.204 +		String result = workResult.getValue().toString();
   7.205 +		if (
   7.206 +				!(dayObj instanceof Day) 
   7.207 +				|| !(taskObj instanceof Task) 
   7.208 +				|| !(hoursObj.toString().matches("^[0-9]+[\\.]{0,1}[0-9]*"))
   7.209 +				) {
   7.210 +			getWindow().showNotification("Invalid information entered");
   7.211 +		} else {
   7.212 +			Day day = (Day)dayObj;
   7.213 +			Task task = (Task)taskObj;
   7.214 +			Float hours = Float.parseFloat(hoursObj.toString());
   7.215 +			work.setDay(day);
   7.216 +			work.setTask(task);
   7.217 +			work.setHours(hours);
   7.218 +			work.setResult(result);
   7.219 +			try{
   7.220 +				EM.getTransaction().begin();
   7.221 +				EM.persist(work);
   7.222 +				EM.getTransaction().commit();
   7.223 +			} finally {
   7.224 +				if(EM.getTransaction().isActive())
   7.225 +					EM.getTransaction().rollback();
   7.226 +			}
   7.227 +			getParent().removeWindow(this);
   7.228 +			myApp.getWorkTable().requestRepaint();
   7.229 +		}
   7.230 +	}
   7.231 +
   7.232 +}
     8.1 --- a/src/main/java/ru/indvdum/mywork/vaadin/MyWorkApplication.java	Wed Aug 17 17:03:37 2011 +0300
     8.2 +++ b/src/main/java/ru/indvdum/mywork/vaadin/MyWorkApplication.java	Fri Aug 19 16:23:26 2011 +0300
     8.3 @@ -11,17 +11,27 @@
     8.4  import ru.indvdum.mywork.openjpa.model.Work;
     8.5  
     8.6  import com.vaadin.Application;
     8.7 +import com.vaadin.addon.jpacontainer.EntityContainer;
     8.8 +import com.vaadin.addon.jpacontainer.EntityProvider;
     8.9 +import com.vaadin.addon.jpacontainer.HierarchicalEntityContainer;
    8.10  import com.vaadin.addon.jpacontainer.JPAContainer;
    8.11 +import com.vaadin.addon.jpacontainer.provider.BatchableLocalEntityProvider;
    8.12 +import com.vaadin.addon.jpacontainer.provider.CachingBatchableLocalEntityProvider;
    8.13 +import com.vaadin.addon.jpacontainer.provider.CachingLocalEntityProvider;
    8.14 +import com.vaadin.addon.jpacontainer.provider.CachingMutableLocalEntityProvider;
    8.15  import com.vaadin.addon.jpacontainer.provider.LocalEntityProvider;
    8.16  import com.vaadin.ui.Alignment;
    8.17  import com.vaadin.ui.Button;
    8.18  import com.vaadin.ui.HorizontalLayout;
    8.19 +import com.vaadin.ui.MenuBar;
    8.20  import com.vaadin.ui.TabSheet;
    8.21  import com.vaadin.ui.Table;
    8.22  import com.vaadin.ui.VerticalLayout;
    8.23  import com.vaadin.ui.Window;
    8.24  import com.vaadin.ui.Button.ClickEvent;
    8.25  import com.vaadin.ui.Button.ClickListener;
    8.26 +import com.vaadin.ui.MenuBar.Command;
    8.27 +import com.vaadin.ui.MenuBar.MenuItem;
    8.28  
    8.29  /**
    8.30   * @author indvdum
    8.31 @@ -29,6 +39,45 @@
    8.32   *
    8.33   */
    8.34  public class MyWorkApplication extends Application {
    8.35 +	
    8.36 +	private MyWorkApplication thisObject = this;
    8.37 +	private Table dayTable = null;
    8.38 +	private Table taskTable = null;
    8.39 +	private Table workTable = null;
    8.40 +	
    8.41 +	private Command newDayCommand = new Command() {
    8.42 +        public void menuSelected(MenuItem selectedItem) {
    8.43 +        	EditDayDialog dialog = null;
    8.44 +			try {
    8.45 +				dialog = new EditDayDialog(thisObject, EditState.CREATE, null);
    8.46 +			} catch (Exception e) {
    8.47 +				e.printStackTrace();
    8.48 +			}
    8.49 +            getMainWindow().addWindow(dialog);
    8.50 +        }
    8.51 +    };
    8.52 +    private Command newTaskCommand = new Command() {
    8.53 +    	public void menuSelected(MenuItem selectedItem) {
    8.54 +    		EditTaskDialog dialog = null;
    8.55 +    		try {
    8.56 +    			dialog = new EditTaskDialog(thisObject, EditState.CREATE, null);
    8.57 +    		} catch (Exception e) {
    8.58 +    			e.printStackTrace();
    8.59 +    		}
    8.60 +    		getMainWindow().addWindow(dialog);
    8.61 +    	}
    8.62 +    };
    8.63 +    private Command newWorkCommand = new Command() {
    8.64 +    	public void menuSelected(MenuItem selectedItem) {
    8.65 +    		EditWorkDialog dialog = null;
    8.66 +    		try {
    8.67 +    			dialog = new EditWorkDialog(thisObject, EditState.CREATE, null);
    8.68 +    		} catch (Exception e) {
    8.69 +    			e.printStackTrace();
    8.70 +    		}
    8.71 +    		getMainWindow().addWindow(dialog);
    8.72 +    	}
    8.73 +    };
    8.74  
    8.75  	@Override
    8.76  	public void init() {
    8.77 @@ -45,12 +94,20 @@
    8.78  		vlMain.setSpacing(true);
    8.79  		tabSheet.addTab(vlMain, "Main page", null);
    8.80  		
    8.81 -		LocalEntityProvider dayProvider = new LocalEntityProvider(Day.class);
    8.82 +		MenuBar menubar = new MenuBar();
    8.83 +		MenuItem file = menubar.addItem("File", null);
    8.84 +		MenuItem newItem = file.addItem("New", null);
    8.85 +		newItem.addItem("Day...", newDayCommand);
    8.86 +        newItem.addItem("Task...", newTaskCommand);
    8.87 +        newItem.addItem("Work...", newWorkCommand);
    8.88 +        vlMain.addComponent(menubar);
    8.89 +		
    8.90 +		LocalEntityProvider dayProvider = new CachingLocalEntityProvider(Day.class);
    8.91  		dayProvider.setEntityManager(EM);
    8.92  		JPAContainer<Day> dayContainer = new JPAContainer(Day.class);
    8.93  		dayContainer.setEntityProvider(dayProvider);
    8.94  		
    8.95 -		Table dayTable = new Table();
    8.96 +		dayTable = new Table();
    8.97  		dayTable.setSelectable(true);
    8.98  		dayTable.setEditable(false);
    8.99  		dayTable.setImmediate(true);
   8.100 @@ -65,12 +122,12 @@
   8.101  		vlMain.addComponent(dayTable);
   8.102  		vlMain.setExpandRatio(dayTable, 1f);
   8.103  		
   8.104 -		LocalEntityProvider taskProvider = new LocalEntityProvider(Task.class);
   8.105 +		LocalEntityProvider taskProvider = new CachingLocalEntityProvider(Task.class);
   8.106  		taskProvider.setEntityManager(EM);
   8.107  		JPAContainer<Task> taskContainer = new JPAContainer(Task.class);
   8.108  		taskContainer.setEntityProvider(taskProvider);
   8.109  		
   8.110 -		Table taskTable = new Table();
   8.111 +		taskTable = new Table();
   8.112  		taskTable.setSelectable(true);
   8.113  		taskTable.setEditable(false);
   8.114  		taskTable.setImmediate(true);
   8.115 @@ -84,20 +141,20 @@
   8.116  		vlMain.addComponent(taskTable);
   8.117  		vlMain.setExpandRatio(taskTable, 1f);
   8.118  		
   8.119 -		LocalEntityProvider workProvider = new LocalEntityProvider(Work.class);
   8.120 +		LocalEntityProvider workProvider = new CachingLocalEntityProvider(Work.class);
   8.121  		workProvider.setEntityManager(EM);
   8.122  		JPAContainer<Task> workContainer = new JPAContainer(Work.class);
   8.123  		workContainer.setEntityProvider(workProvider);
   8.124  		
   8.125 -		Table workTable = new Table();
   8.126 +		workTable = new Table();
   8.127  		workTable.setSelectable(true);
   8.128  		workTable.setEditable(false);
   8.129  		workTable.setImmediate(true);
   8.130  		workTable.setSizeFull();
   8.131  		workTable.setContainerDataSource(workContainer);
   8.132  		workTable.setVisibleColumns(new String[]{
   8.133 -				"dayName",
   8.134 -				"taskName",
   8.135 +				"day",
   8.136 +				"task",
   8.137  				"hours",
   8.138  				"result",
   8.139  		});
   8.140 @@ -105,4 +162,16 @@
   8.141  		vlMain.addComponent(workTable);
   8.142  		vlMain.setExpandRatio(workTable, 1f);
   8.143  	}
   8.144 +
   8.145 +	public Table getDayTable() {
   8.146 +		return dayTable;
   8.147 +	}
   8.148 +
   8.149 +	public Table getTaskTable() {
   8.150 +		return taskTable;
   8.151 +	}
   8.152 +
   8.153 +	public Table getWorkTable() {
   8.154 +		return workTable;
   8.155 +	}
   8.156  }