# HG changeset patch # User indvdum # Date 1313760206 -10800 # Node ID 6a02cfcc7460d324624b5cd8ad87edfed9c7e71f # Parent 56338d6d58c2d93a391128c7a914187c1c52ab5c Rework. diff -r 56338d6d58c2 -r 6a02cfcc7460 src/main/java/ru/indvdum/mywork/openjpa/model/Day.java --- a/src/main/java/ru/indvdum/mywork/openjpa/model/Day.java Wed Aug 17 17:03:37 2011 +0300 +++ b/src/main/java/ru/indvdum/mywork/openjpa/model/Day.java Fri Aug 19 16:23:26 2011 +0300 @@ -1,6 +1,8 @@ package ru.indvdum.mywork.openjpa.model; import java.sql.Time; +import java.text.DateFormat; +import java.text.SimpleDateFormat; import java.util.Date; import javax.persistence.Column; @@ -22,7 +24,7 @@ private static final long serialVersionUID = 1471705339524132968L; @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) + @GeneratedValue @Column(name = "ID", nullable = false) private Integer id = null; @@ -39,7 +41,7 @@ private Float hours = null; public Day(){ - + } @Override @@ -51,7 +53,20 @@ if (!(obj instanceof Day)) return false; final Day other = (Day) obj; - return (this.id == other.id || (this.id != null && this.id.equals(other.id))); + return (getId() == other.getId() || (getId() != null && getId().equals(other.getId()))); + } + + @Override + public int hashCode() { + if(getId() != null && getId() != 0) + return getId().hashCode(); + else + return super.hashCode(); + } + + @Override + public String toString() { + return getDateFormatter().format(getDay()); } public Integer getId() { @@ -93,4 +108,8 @@ public void setHours(Float hours) { this.hours = hours; } + + protected DateFormat getDateFormatter() { + return new SimpleDateFormat("dd.MM.yyyy"); + } } diff -r 56338d6d58c2 -r 6a02cfcc7460 src/main/java/ru/indvdum/mywork/openjpa/model/Task.java --- a/src/main/java/ru/indvdum/mywork/openjpa/model/Task.java Wed Aug 17 17:03:37 2011 +0300 +++ b/src/main/java/ru/indvdum/mywork/openjpa/model/Task.java Fri Aug 19 16:23:26 2011 +0300 @@ -19,7 +19,7 @@ private static final long serialVersionUID = -4457948503094306717L; @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) + @GeneratedValue @Column(name = "ID", nullable = false) private Integer id = null; @@ -42,7 +42,20 @@ if (!(obj instanceof Task)) return false; final Task other = (Task) obj; - return (this.id == other.id || (this.id != null && this.id.equals(other.id))); + return (getId() == other.getId() || (getId() != null && getId().equals(other.getId()))); + } + + @Override + public int hashCode() { + if(getId() != null && getId() != 0) + return getId().hashCode(); + else + return super.hashCode(); + } + + @Override + public String toString() { + return getName(); } public Integer getId() { diff -r 56338d6d58c2 -r 6a02cfcc7460 src/main/java/ru/indvdum/mywork/openjpa/model/Work.java --- a/src/main/java/ru/indvdum/mywork/openjpa/model/Work.java Wed Aug 17 17:03:37 2011 +0300 +++ b/src/main/java/ru/indvdum/mywork/openjpa/model/Work.java Fri Aug 19 16:23:26 2011 +0300 @@ -4,6 +4,7 @@ import javax.persistence.EmbeddedId; import javax.persistence.Entity; import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; import javax.persistence.ManyToOne; import javax.persistence.MapsId; import javax.persistence.Table; @@ -20,7 +21,7 @@ private static final long serialVersionUID = 7138260708537798813L; @EmbeddedId - WorkId id; + private WorkId id = null; @Column(name = "HOURS") private Float hours = null; @@ -40,27 +41,6 @@ } - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (!(obj instanceof Work)) - return false; - final Work other = (Work) obj; - return ( - this.day == other.day - && this.task == other.task - || ( - this.day != null - && this.day.equals(other.day) - && this.task != null - && this.task.equals(other.task) - ) - ); - } - public Float getHours() { return hours; } @@ -93,12 +73,12 @@ this.task = task; } - public String getDayName() { - return getDay().getDay().toString(); + public WorkId getId() { + return id; } - - public String getTaskName() { - return getTask().getName(); + + public void setId(WorkId id) { + this.id = id; } } diff -r 56338d6d58c2 -r 6a02cfcc7460 src/main/java/ru/indvdum/mywork/vaadin/EditDayDialog.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/ru/indvdum/mywork/vaadin/EditDayDialog.java Fri Aug 19 16:23:26 2011 +0300 @@ -0,0 +1,238 @@ +package ru.indvdum.mywork.vaadin; + +import static ru.indvdum.mywork.MyWork.EM; + +import java.sql.Time; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +import ru.indvdum.mywork.openjpa.model.Day; + +import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Label; +import com.vaadin.ui.PopupDateField; +import com.vaadin.ui.TextField; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; + +public class EditDayDialog extends Window implements ValueChangeListener, ClickListener { + + private MyWorkApplication myApp = null; + private EditState state = null; + private Day day = null; + private PopupDateField dayStartTime = null; + private PopupDateField dayEndTime = null; + private PopupDateField dayDate = null; + private TextField dayHours = null; + + public EditDayDialog(MyWorkApplication myApp, EditState state, Day day) throws Exception { + super(); + this.myApp = myApp; + this.state = state; + switch(state){ + case CREATE: + setCaption("Creating new day"); + if(day != null) + throw new Exception("Illegal argument: day must be null in creating state."); + day = new Day(); + Calendar calDay = Calendar.getInstance(); + calDay.set(Calendar.HOUR_OF_DAY, 0); + calDay.set(Calendar.MINUTE, 0); + calDay.set(Calendar.SECOND, 0); + calDay.set(Calendar.MILLISECOND, 0); + day.setDay(calDay.getTime()); + Calendar calStart = Calendar.getInstance(); + calStart.set(Calendar.HOUR_OF_DAY, 9); + calStart.set(Calendar.MINUTE, 0); + calStart.set(Calendar.SECOND, 0); + calStart.set(Calendar.MILLISECOND, 0); + day.setStartWork(new Time(calStart.getTime().getTime())); + Calendar calEnd = Calendar.getInstance(); + calEnd.set(Calendar.HOUR_OF_DAY, 18); + calEnd.set(Calendar.MINUTE, 0); + calEnd.set(Calendar.SECOND, 0); + calEnd.set(Calendar.MILLISECOND, 0); + day.setEndWork(new Time(calEnd.getTime().getTime())); + day.setHours(8f); + this.day = day; + break; + case EDIT: + setCaption("Editing day"); + if(day == null) + throw new Exception("Illegal argument: day must be not null in editing state."); + this.day = day; + break; + } + init(); + } + + private void init(){ + setModal(true); + setWidth("480px"); + setHeight("300px"); + VerticalLayout vl = new VerticalLayout(); + vl.setSizeFull(); + vl.setSpacing(true); + vl.setMargin(true); + setContent(vl); + + HorizontalLayout hlDay = new HorizontalLayout(); + hlDay.setWidth("100%"); + Label lblDay = new Label("Day:"); + lblDay.setWidth("100%"); + hlDay.addComponent(lblDay); + hlDay.setExpandRatio(lblDay, 1f); + dayDate = new PopupDateField(); + dayDate.setWidth("100%"); + dayDate.setInputPrompt("Enter date"); + dayDate.setResolution(PopupDateField.RESOLUTION_DAY); + dayDate.setImmediate(true); + dayDate.setValue(day.getDay()); + dayDate.addListener(this); + dayDate.setDateFormat("dd.MM.yyyy"); + hlDay.addComponent(dayDate); + hlDay.setExpandRatio(dayDate, 5f); + vl.addComponent(hlDay); + + HorizontalLayout hlStart = new HorizontalLayout(); + hlStart.setWidth("100%"); + Label lblStart = new Label("Start time:"); + lblStart.setWidth("100%"); + hlStart.addComponent(lblStart); + hlStart.setExpandRatio(lblStart, 1f); + dayStartTime = new PopupDateField(); + dayStartTime.setWidth("100%"); + dayStartTime.setInputPrompt("Enter time"); + dayStartTime.setResolution(PopupDateField.RESOLUTION_MIN); + dayStartTime.setImmediate(true); + dayStartTime.setValue(day.getStartWork()); + dayStartTime.setDateFormat("HH:mm"); + hlStart.addComponent(dayStartTime); + hlStart.setExpandRatio(dayStartTime, 5f); + vl.addComponent(hlStart); + + HorizontalLayout hlEnd = new HorizontalLayout(); + hlEnd.setWidth("100%"); + Label lblEnd = new Label("End time:"); + lblEnd.setWidth("100%"); + hlEnd.addComponent(lblEnd); + hlEnd.setExpandRatio(lblEnd, 1f); + dayEndTime = new PopupDateField(); + dayEndTime.setWidth("100%"); + dayEndTime.setInputPrompt("Enter time"); + dayEndTime.setResolution(PopupDateField.RESOLUTION_MIN); + dayEndTime.setImmediate(true); + dayEndTime.setValue(day.getEndWork()); + dayEndTime.setDateFormat("HH:mm"); + hlEnd.addComponent(dayEndTime); + hlEnd.setExpandRatio(dayEndTime, 5f); + vl.addComponent(hlEnd); + + HorizontalLayout hlHours = new HorizontalLayout(); + hlHours.setWidth("100%"); + Label lblHours = new Label("Work hours count:"); + lblHours.setWidth("100%"); + hlHours.addComponent(lblHours); + hlHours.setExpandRatio(lblHours, 1f); + dayHours = new TextField(); + dayHours.setWidth("100%"); + dayHours.setValue(day.getHours()); + dayHours.setImmediate(true); + hlHours.addComponent(dayHours); + hlHours.setExpandRatio(dayHours, 5f); + vl.addComponent(hlHours); + + HorizontalLayout hlOk = new HorizontalLayout(); + hlOk.setSizeFull(); + Button okButton = new Button(); + switch(state){ + case CREATE: + okButton.setCaption("Create"); + break; + case EDIT: + okButton.setCaption("Save"); + break; + } + okButton.addListener((ClickListener)this); + hlOk.addComponent(okButton); + hlOk.setComponentAlignment(okButton, Alignment.BOTTOM_RIGHT); + vl.addComponent(hlOk); + vl.setExpandRatio(hlOk, 1f); + } + + @Override + public void valueChange(ValueChangeEvent event) { + Object value = event.getProperty().getValue(); + Object startValue = dayStartTime.getValue(); + Object endValue = dayEndTime.getValue(); + if (value == null || !(value instanceof Date) || !(startValue instanceof Date) || !(endValue instanceof Date)) { + getWindow().showNotification("Invalid date entered"); + } else { + Date date = (Date)value; + Date start = (Date)startValue; + Date end = (Date)endValue; + Calendar calStart = Calendar.getInstance(); + calStart.setTime(start); + Calendar calEnd = Calendar.getInstance(); + calEnd.setTime(end); + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + calStart.set(Calendar.YEAR, cal.get(Calendar.YEAR)); + calStart.set(Calendar.MONTH, cal.get(Calendar.MONTH)); + calStart.set(Calendar.DAY_OF_MONTH, cal.get(Calendar.DAY_OF_MONTH)); + calStart.set(Calendar.SECOND, cal.get(Calendar.SECOND)); + calStart.set(Calendar.MILLISECOND, cal.get(Calendar.MILLISECOND)); + calEnd.set(Calendar.YEAR, cal.get(Calendar.YEAR)); + calEnd.set(Calendar.MONTH, cal.get(Calendar.MONTH)); + calEnd.set(Calendar.DAY_OF_MONTH, cal.get(Calendar.DAY_OF_MONTH)); + calEnd.set(Calendar.SECOND, cal.get(Calendar.SECOND)); + calEnd.set(Calendar.MILLISECOND, cal.get(Calendar.MILLISECOND)); + dayStartTime.setValue(calStart.getTime()); + dayEndTime.setValue(calEnd.getTime()); + } + } + + @Override + public void buttonClick(ClickEvent event) { + Object value = dayDate.getValue(); + Object startValue = dayStartTime.getValue(); + Object endValue = dayEndTime.getValue(); + Object hoursValue = dayHours.getValue(); + if ( + value == null + || !(value instanceof Date) + || !(startValue instanceof Date) + || !(endValue instanceof Date) + || !(hoursValue.toString().matches("^[0-9]+[\\.]{0,1}[0-9]*")) + ) { + getWindow().showNotification("Invalid information entered"); + } else { + Date date = (Date)value; + Date start = (Date)startValue; + Date end = (Date)endValue; + Float hours = Float.parseFloat(hoursValue.toString()); + day.setDay(date); + day.setStartWork(new Time(start.getTime())); + day.setEndWork(new Time(end.getTime())); + day.setHours(hours); + try{ + EM.getTransaction().begin(); + EM.persist(day); + EM.getTransaction().commit(); + } finally { + if(EM.getTransaction().isActive()) + EM.getTransaction().rollback(); + } + getParent().removeWindow(this); + myApp.getDayTable().requestRepaint(); + } + } + +} diff -r 56338d6d58c2 -r 6a02cfcc7460 src/main/java/ru/indvdum/mywork/vaadin/EditState.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/ru/indvdum/mywork/vaadin/EditState.java Fri Aug 19 16:23:26 2011 +0300 @@ -0,0 +1,6 @@ +package ru.indvdum.mywork.vaadin; + +public enum EditState { + CREATE, + EDIT, +} diff -r 56338d6d58c2 -r 6a02cfcc7460 src/main/java/ru/indvdum/mywork/vaadin/EditTaskDialog.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/ru/indvdum/mywork/vaadin/EditTaskDialog.java Fri Aug 19 16:23:26 2011 +0300 @@ -0,0 +1,111 @@ +package ru.indvdum.mywork.vaadin; + +import static ru.indvdum.mywork.MyWork.EM; +import ru.indvdum.mywork.openjpa.model.Task; + +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Label; +import com.vaadin.ui.RichTextArea; +import com.vaadin.ui.TextField; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; + +public class EditTaskDialog extends Window implements ClickListener { + + private MyWorkApplication myApp = null; + private EditState state = null; + private Task task = null; + private TextField taskName = null; + private RichTextArea taskDescription = null; + + public EditTaskDialog(MyWorkApplication myApp, EditState state, Task task) throws Exception { + super(); + this.myApp = myApp; + this.state = state; + switch(state){ + case CREATE: + setCaption("Creating new task"); + if(task != null) + throw new Exception("Illegal argument: task must be null in creating state."); + task = new Task(); + task.setName(""); + task.setDescription(""); + this.task = task; + break; + case EDIT: + setCaption("Editing task"); + if(task == null) + throw new Exception("Illegal argument: task must be not null in editing state."); + this.task = task; + break; + } + init(); + } + + private void init(){ + setModal(true); + setWidth("640px"); + setHeight("480px"); + VerticalLayout vl = new VerticalLayout(); + vl.setSizeFull(); + vl.setSpacing(true); + vl.setMargin(true); + setContent(vl); + + HorizontalLayout hlName = new HorizontalLayout(); + hlName.setWidth("100%"); + Label lblName = new Label("Name:"); + lblName.setWidth("100%"); + hlName.addComponent(lblName); + hlName.setExpandRatio(lblName, 1f); + taskName = new TextField(); + taskName.setWidth("100%"); + taskName.setValue(task.getName()); + hlName.addComponent(taskName); + hlName.setExpandRatio(taskName, 5f); + vl.addComponent(hlName); + + taskDescription = new RichTextArea("Description"); + taskDescription.setValue(task.getDescription()); + taskDescription.setSizeFull(); + vl.addComponent(taskDescription); + vl.setExpandRatio(taskDescription, 1f); + + HorizontalLayout hlOk = new HorizontalLayout(); + hlOk.setWidth("100%"); + Button okButton = new Button(); + switch(state){ + case CREATE: + okButton.setCaption("Create"); + break; + case EDIT: + okButton.setCaption("Save"); + break; + } + okButton.addListener((ClickListener)this); + hlOk.addComponent(okButton); + hlOk.setComponentAlignment(okButton, Alignment.MIDDLE_RIGHT); + vl.addComponent(hlOk); + } + + @Override + public void buttonClick(ClickEvent event) { + task.setName(taskName.getValue().toString()); + task.setDescription(taskDescription.getValue().toString()); + try{ + EM.getTransaction().begin(); + EM.persist(task); + EM.getTransaction().commit(); + } finally { + if(EM.getTransaction().isActive()) + EM.getTransaction().rollback(); + } + getParent().removeWindow(this); + myApp.getTaskTable().requestRepaint(); + } + +} diff -r 56338d6d58c2 -r 6a02cfcc7460 src/main/java/ru/indvdum/mywork/vaadin/EditWorkDialog.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/ru/indvdum/mywork/vaadin/EditWorkDialog.java Fri Aug 19 16:23:26 2011 +0300 @@ -0,0 +1,229 @@ +package ru.indvdum.mywork.vaadin; + +import static ru.indvdum.mywork.MyWork.EM; + +import java.util.Calendar; +import java.util.List; + +import javax.persistence.Query; + +import ru.indvdum.mywork.openjpa.model.Day; +import ru.indvdum.mywork.openjpa.model.Task; +import ru.indvdum.mywork.openjpa.model.Work; + +import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.ComboBox; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Label; +import com.vaadin.ui.RichTextArea; +import com.vaadin.ui.TextField; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; +import com.vaadin.ui.AbstractSelect.Filtering; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; + +public class EditWorkDialog extends Window implements ClickListener { + + private MyWorkApplication myApp = null; + private EditState state = null; + private Work work = null; + private ComboBox workDay = null; + private ComboBox workTask = null; + private TextField workHours = null; + private RichTextArea workResult = null; + + public EditWorkDialog(MyWorkApplication myApp, EditState state, Work work) throws Exception { + super(); + this.myApp = myApp; + this.state = state; + switch(state){ + case CREATE: + setCaption("Creating new work"); + if(work != null) + throw new Exception("Illegal argument: work must be null in creating state."); + work = new Work(); + work.setHours(0f); + work.setResult(""); + this.work = work; + break; + case EDIT: + setCaption("Editing work"); + if(work == null) + throw new Exception("Illegal argument: work must be not null in editing state."); + this.work = work; + break; + } + init(); + } + + private void init(){ + setModal(true); + setWidth("640px"); + setHeight("480px"); + VerticalLayout vl = new VerticalLayout(); + vl.setSizeFull(); + vl.setSpacing(true); + vl.setMargin(true); + setContent(vl); + + HorizontalLayout hlDay = new HorizontalLayout(); + hlDay.setWidth("100%"); + Label lblDay = new Label("Day:"); + lblDay.setWidth("100%"); + hlDay.addComponent(lblDay); + hlDay.setExpandRatio(lblDay, 1f); + workDay = new ComboBox(); + workDay.setWidth("100%"); + workDay.setImmediate(true); + workDay.setFilteringMode(Filtering.FILTERINGMODE_CONTAINS); + updateDays("select d from " + Day.class.getName() + " d order by d.day"); + workDay.addListener(new ValueChangeListener(){ + + @Override + public void valueChange(ValueChangeEvent event) { + Day day = (Day)event.getProperty().getValue(); + if(day == null) + updateTasks("select t from " + Task.class.getName() + " t order by t.id desc"); + else + 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"); + } + + }); + hlDay.addComponent(workDay); + hlDay.setExpandRatio(workDay, 5f); + vl.addComponent(hlDay); + + HorizontalLayout hlTask = new HorizontalLayout(); + hlTask.setWidth("100%"); + Label lblStart = new Label("Task:"); + lblStart.setWidth("100%"); + hlTask.addComponent(lblStart); + hlTask.setExpandRatio(lblStart, 1f); + workTask = new ComboBox(); + workTask.setWidth("100%"); + workTask.setImmediate(true); + workTask.setFilteringMode(Filtering.FILTERINGMODE_CONTAINS); + Day day = (Day)workDay.getValue(); + if(day == null) + updateTasks("select t from " + Task.class.getName() + " t order by t.id desc"); + else + 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"); + workTask.addListener(new ValueChangeListener(){ + + @Override + public void valueChange(ValueChangeEvent event) { + Task task = (Task)event.getProperty().getValue(); + if(task == null) + updateDays("select d from " + Day.class.getName() + " d order by d.day"); + else + 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"); + } + + }); + hlTask.addComponent(workTask); + hlTask.setExpandRatio(workTask, 5f); + vl.addComponent(hlTask); + + HorizontalLayout hlHours = new HorizontalLayout(); + hlHours.setWidth("100%"); + Label lblHours = new Label("Hours:"); + lblHours.setWidth("100%"); + hlHours.addComponent(lblHours); + hlHours.setExpandRatio(lblHours, 1f); + workHours = new TextField(); + workHours.setWidth("100%"); + workHours.setValue(work.getHours()); + workHours.setImmediate(true); + hlHours.addComponent(workHours); + hlHours.setExpandRatio(workHours, 5f); + vl.addComponent(hlHours); + + workResult = new RichTextArea("Result"); + workResult.setValue(work.getResult()); + workResult.setSizeFull(); + vl.addComponent(workResult); + vl.setExpandRatio(workResult, 5f); + + HorizontalLayout hlOk = new HorizontalLayout(); + hlOk.setWidth("100%"); + Button okButton = new Button(); + switch(state){ + case CREATE: + okButton.setCaption("Create"); + break; + case EDIT: + okButton.setCaption("Save"); + break; + } + okButton.addListener((ClickListener)this); + hlOk.addComponent(okButton); + hlOk.setComponentAlignment(okButton, Alignment.MIDDLE_RIGHT); + vl.addComponent(hlOk); + } + + private void updateDays(String jpql){ + if(workTask != null && workTask.getValue() != null && workDay != null && workDay.getValue() != null) + return; + workDay.removeAllItems(); + Query query = EM.createQuery(jpql); + List list = query.getResultList(); + for(Day day: (List)list){ + workDay.addItem(day); + Calendar currCal = Calendar.getInstance(); + currCal.set(Calendar.HOUR_OF_DAY, 0); + currCal.set(Calendar.MINUTE, 0); + currCal.set(Calendar.SECOND, 0); + currCal.set(Calendar.MILLISECOND, 0); + if(day.getDay().equals(currCal.getTime())) + workDay.select(day); + } + } + + private void updateTasks(String jpql){ + if(workTask != null && workTask.getValue() != null && workDay != null && workDay.getValue() != null) + return; + workTask.removeAllItems(); + Query query = EM.createQuery(jpql); + List list = query.getResultList(); + for(Task task: (List)list) + workTask.addItem(task); + } + + @Override + public void buttonClick(ClickEvent event) { + Object dayObj = workDay.getValue(); + Object taskObj = workTask.getValue(); + Object hoursObj = workHours.getValue(); + String result = workResult.getValue().toString(); + if ( + !(dayObj instanceof Day) + || !(taskObj instanceof Task) + || !(hoursObj.toString().matches("^[0-9]+[\\.]{0,1}[0-9]*")) + ) { + getWindow().showNotification("Invalid information entered"); + } else { + Day day = (Day)dayObj; + Task task = (Task)taskObj; + Float hours = Float.parseFloat(hoursObj.toString()); + work.setDay(day); + work.setTask(task); + work.setHours(hours); + work.setResult(result); + try{ + EM.getTransaction().begin(); + EM.persist(work); + EM.getTransaction().commit(); + } finally { + if(EM.getTransaction().isActive()) + EM.getTransaction().rollback(); + } + getParent().removeWindow(this); + myApp.getWorkTable().requestRepaint(); + } + } + +} diff -r 56338d6d58c2 -r 6a02cfcc7460 src/main/java/ru/indvdum/mywork/vaadin/MyWorkApplication.java --- a/src/main/java/ru/indvdum/mywork/vaadin/MyWorkApplication.java Wed Aug 17 17:03:37 2011 +0300 +++ b/src/main/java/ru/indvdum/mywork/vaadin/MyWorkApplication.java Fri Aug 19 16:23:26 2011 +0300 @@ -11,17 +11,27 @@ import ru.indvdum.mywork.openjpa.model.Work; import com.vaadin.Application; +import com.vaadin.addon.jpacontainer.EntityContainer; +import com.vaadin.addon.jpacontainer.EntityProvider; +import com.vaadin.addon.jpacontainer.HierarchicalEntityContainer; import com.vaadin.addon.jpacontainer.JPAContainer; +import com.vaadin.addon.jpacontainer.provider.BatchableLocalEntityProvider; +import com.vaadin.addon.jpacontainer.provider.CachingBatchableLocalEntityProvider; +import com.vaadin.addon.jpacontainer.provider.CachingLocalEntityProvider; +import com.vaadin.addon.jpacontainer.provider.CachingMutableLocalEntityProvider; import com.vaadin.addon.jpacontainer.provider.LocalEntityProvider; import com.vaadin.ui.Alignment; import com.vaadin.ui.Button; import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.MenuBar; import com.vaadin.ui.TabSheet; import com.vaadin.ui.Table; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.Window; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.MenuBar.Command; +import com.vaadin.ui.MenuBar.MenuItem; /** * @author indvdum @@ -29,6 +39,45 @@ * */ public class MyWorkApplication extends Application { + + private MyWorkApplication thisObject = this; + private Table dayTable = null; + private Table taskTable = null; + private Table workTable = null; + + private Command newDayCommand = new Command() { + public void menuSelected(MenuItem selectedItem) { + EditDayDialog dialog = null; + try { + dialog = new EditDayDialog(thisObject, EditState.CREATE, null); + } catch (Exception e) { + e.printStackTrace(); + } + getMainWindow().addWindow(dialog); + } + }; + private Command newTaskCommand = new Command() { + public void menuSelected(MenuItem selectedItem) { + EditTaskDialog dialog = null; + try { + dialog = new EditTaskDialog(thisObject, EditState.CREATE, null); + } catch (Exception e) { + e.printStackTrace(); + } + getMainWindow().addWindow(dialog); + } + }; + private Command newWorkCommand = new Command() { + public void menuSelected(MenuItem selectedItem) { + EditWorkDialog dialog = null; + try { + dialog = new EditWorkDialog(thisObject, EditState.CREATE, null); + } catch (Exception e) { + e.printStackTrace(); + } + getMainWindow().addWindow(dialog); + } + }; @Override public void init() { @@ -45,12 +94,20 @@ vlMain.setSpacing(true); tabSheet.addTab(vlMain, "Main page", null); - LocalEntityProvider dayProvider = new LocalEntityProvider(Day.class); + MenuBar menubar = new MenuBar(); + MenuItem file = menubar.addItem("File", null); + MenuItem newItem = file.addItem("New", null); + newItem.addItem("Day...", newDayCommand); + newItem.addItem("Task...", newTaskCommand); + newItem.addItem("Work...", newWorkCommand); + vlMain.addComponent(menubar); + + LocalEntityProvider dayProvider = new CachingLocalEntityProvider(Day.class); dayProvider.setEntityManager(EM); JPAContainer dayContainer = new JPAContainer(Day.class); dayContainer.setEntityProvider(dayProvider); - Table dayTable = new Table(); + dayTable = new Table(); dayTable.setSelectable(true); dayTable.setEditable(false); dayTable.setImmediate(true); @@ -65,12 +122,12 @@ vlMain.addComponent(dayTable); vlMain.setExpandRatio(dayTable, 1f); - LocalEntityProvider taskProvider = new LocalEntityProvider(Task.class); + LocalEntityProvider taskProvider = new CachingLocalEntityProvider(Task.class); taskProvider.setEntityManager(EM); JPAContainer taskContainer = new JPAContainer(Task.class); taskContainer.setEntityProvider(taskProvider); - Table taskTable = new Table(); + taskTable = new Table(); taskTable.setSelectable(true); taskTable.setEditable(false); taskTable.setImmediate(true); @@ -84,20 +141,20 @@ vlMain.addComponent(taskTable); vlMain.setExpandRatio(taskTable, 1f); - LocalEntityProvider workProvider = new LocalEntityProvider(Work.class); + LocalEntityProvider workProvider = new CachingLocalEntityProvider(Work.class); workProvider.setEntityManager(EM); JPAContainer workContainer = new JPAContainer(Work.class); workContainer.setEntityProvider(workProvider); - Table workTable = new Table(); + workTable = new Table(); workTable.setSelectable(true); workTable.setEditable(false); workTable.setImmediate(true); workTable.setSizeFull(); workTable.setContainerDataSource(workContainer); workTable.setVisibleColumns(new String[]{ - "dayName", - "taskName", + "day", + "task", "hours", "result", }); @@ -105,4 +162,16 @@ vlMain.addComponent(workTable); vlMain.setExpandRatio(workTable, 1f); } + + public Table getDayTable() { + return dayTable; + } + + public Table getTaskTable() { + return taskTable; + } + + public Table getWorkTable() { + return workTable; + } }