Rework.
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 }