indvdum@9
|
1 |
package ru.indvdum.mywork.vaadin;
|
indvdum@9
|
2 |
|
indvdum@9
|
3 |
import static ru.indvdum.mywork.MyWork.EM;
|
indvdum@9
|
4 |
|
indvdum@9
|
5 |
import java.util.Calendar;
|
indvdum@9
|
6 |
import java.util.List;
|
indvdum@9
|
7 |
|
indvdum@9
|
8 |
import javax.persistence.Query;
|
indvdum@9
|
9 |
|
indvdum@9
|
10 |
import ru.indvdum.mywork.openjpa.model.Day;
|
indvdum@9
|
11 |
import ru.indvdum.mywork.openjpa.model.Task;
|
indvdum@9
|
12 |
import ru.indvdum.mywork.openjpa.model.Work;
|
indvdum@9
|
13 |
|
indvdum@9
|
14 |
import com.vaadin.data.Property.ValueChangeEvent;
|
indvdum@9
|
15 |
import com.vaadin.data.Property.ValueChangeListener;
|
indvdum@9
|
16 |
import com.vaadin.ui.Alignment;
|
indvdum@9
|
17 |
import com.vaadin.ui.Button;
|
indvdum@9
|
18 |
import com.vaadin.ui.ComboBox;
|
indvdum@9
|
19 |
import com.vaadin.ui.HorizontalLayout;
|
indvdum@9
|
20 |
import com.vaadin.ui.Label;
|
indvdum@9
|
21 |
import com.vaadin.ui.RichTextArea;
|
indvdum@9
|
22 |
import com.vaadin.ui.TextField;
|
indvdum@9
|
23 |
import com.vaadin.ui.VerticalLayout;
|
indvdum@9
|
24 |
import com.vaadin.ui.Window;
|
indvdum@9
|
25 |
import com.vaadin.ui.AbstractSelect.Filtering;
|
indvdum@9
|
26 |
import com.vaadin.ui.Button.ClickEvent;
|
indvdum@9
|
27 |
import com.vaadin.ui.Button.ClickListener;
|
indvdum@9
|
28 |
|
indvdum@9
|
29 |
public class EditWorkDialog extends Window implements ClickListener {
|
indvdum@9
|
30 |
|
indvdum@9
|
31 |
private MyWorkApplication myApp = null;
|
indvdum@9
|
32 |
private EditState state = null;
|
indvdum@9
|
33 |
private Work work = null;
|
indvdum@9
|
34 |
private ComboBox workDay = null;
|
indvdum@9
|
35 |
private ComboBox workTask = null;
|
indvdum@9
|
36 |
private TextField workHours = null;
|
indvdum@9
|
37 |
private RichTextArea workResult = null;
|
indvdum@9
|
38 |
|
indvdum@9
|
39 |
public EditWorkDialog(MyWorkApplication myApp, EditState state, Work work) throws Exception {
|
indvdum@9
|
40 |
super();
|
indvdum@9
|
41 |
this.myApp = myApp;
|
indvdum@9
|
42 |
this.state = state;
|
indvdum@9
|
43 |
switch(state){
|
indvdum@9
|
44 |
case CREATE:
|
indvdum@9
|
45 |
setCaption("Creating new work");
|
indvdum@9
|
46 |
if(work != null)
|
indvdum@9
|
47 |
throw new Exception("Illegal argument: work must be null in creating state.");
|
indvdum@9
|
48 |
work = new Work();
|
indvdum@9
|
49 |
work.setHours(0f);
|
indvdum@9
|
50 |
work.setResult("");
|
indvdum@9
|
51 |
this.work = work;
|
indvdum@9
|
52 |
break;
|
indvdum@9
|
53 |
case EDIT:
|
indvdum@9
|
54 |
setCaption("Editing work");
|
indvdum@9
|
55 |
if(work == null)
|
indvdum@9
|
56 |
throw new Exception("Illegal argument: work must be not null in editing state.");
|
indvdum@9
|
57 |
this.work = work;
|
indvdum@9
|
58 |
break;
|
indvdum@9
|
59 |
}
|
indvdum@9
|
60 |
init();
|
indvdum@9
|
61 |
}
|
indvdum@9
|
62 |
|
indvdum@9
|
63 |
private void init(){
|
indvdum@9
|
64 |
setModal(true);
|
indvdum@9
|
65 |
setWidth("640px");
|
indvdum@9
|
66 |
setHeight("480px");
|
indvdum@9
|
67 |
VerticalLayout vl = new VerticalLayout();
|
indvdum@9
|
68 |
vl.setSizeFull();
|
indvdum@9
|
69 |
vl.setSpacing(true);
|
indvdum@9
|
70 |
vl.setMargin(true);
|
indvdum@9
|
71 |
setContent(vl);
|
indvdum@9
|
72 |
|
indvdum@9
|
73 |
HorizontalLayout hlDay = new HorizontalLayout();
|
indvdum@9
|
74 |
hlDay.setWidth("100%");
|
indvdum@9
|
75 |
Label lblDay = new Label("Day:");
|
indvdum@9
|
76 |
lblDay.setWidth("100%");
|
indvdum@9
|
77 |
hlDay.addComponent(lblDay);
|
indvdum@9
|
78 |
hlDay.setExpandRatio(lblDay, 1f);
|
indvdum@9
|
79 |
workDay = new ComboBox();
|
indvdum@9
|
80 |
workDay.setWidth("100%");
|
indvdum@9
|
81 |
workDay.setImmediate(true);
|
indvdum@9
|
82 |
workDay.setFilteringMode(Filtering.FILTERINGMODE_CONTAINS);
|
indvdum@9
|
83 |
updateDays("select d from " + Day.class.getName() + " d order by d.day");
|
indvdum@9
|
84 |
workDay.addListener(new ValueChangeListener(){
|
indvdum@9
|
85 |
|
indvdum@9
|
86 |
@Override
|
indvdum@9
|
87 |
public void valueChange(ValueChangeEvent event) {
|
indvdum@9
|
88 |
Day day = (Day)event.getProperty().getValue();
|
indvdum@9
|
89 |
if(day == null)
|
indvdum@9
|
90 |
updateTasks("select t from " + Task.class.getName() + " t order by t.id desc");
|
indvdum@9
|
91 |
else
|
indvdum@9
|
92 |
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");
|
indvdum@9
|
93 |
}
|
indvdum@9
|
94 |
|
indvdum@9
|
95 |
});
|
indvdum@9
|
96 |
hlDay.addComponent(workDay);
|
indvdum@9
|
97 |
hlDay.setExpandRatio(workDay, 5f);
|
indvdum@9
|
98 |
vl.addComponent(hlDay);
|
indvdum@9
|
99 |
|
indvdum@9
|
100 |
HorizontalLayout hlTask = new HorizontalLayout();
|
indvdum@9
|
101 |
hlTask.setWidth("100%");
|
indvdum@9
|
102 |
Label lblStart = new Label("Task:");
|
indvdum@9
|
103 |
lblStart.setWidth("100%");
|
indvdum@9
|
104 |
hlTask.addComponent(lblStart);
|
indvdum@9
|
105 |
hlTask.setExpandRatio(lblStart, 1f);
|
indvdum@9
|
106 |
workTask = new ComboBox();
|
indvdum@9
|
107 |
workTask.setWidth("100%");
|
indvdum@9
|
108 |
workTask.setImmediate(true);
|
indvdum@9
|
109 |
workTask.setFilteringMode(Filtering.FILTERINGMODE_CONTAINS);
|
indvdum@9
|
110 |
Day day = (Day)workDay.getValue();
|
indvdum@9
|
111 |
if(day == null)
|
indvdum@9
|
112 |
updateTasks("select t from " + Task.class.getName() + " t order by t.id desc");
|
indvdum@9
|
113 |
else
|
indvdum@9
|
114 |
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");
|
indvdum@9
|
115 |
workTask.addListener(new ValueChangeListener(){
|
indvdum@9
|
116 |
|
indvdum@9
|
117 |
@Override
|
indvdum@9
|
118 |
public void valueChange(ValueChangeEvent event) {
|
indvdum@9
|
119 |
Task task = (Task)event.getProperty().getValue();
|
indvdum@9
|
120 |
if(task == null)
|
indvdum@9
|
121 |
updateDays("select d from " + Day.class.getName() + " d order by d.day");
|
indvdum@9
|
122 |
else
|
indvdum@9
|
123 |
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");
|
indvdum@9
|
124 |
}
|
indvdum@9
|
125 |
|
indvdum@9
|
126 |
});
|
indvdum@9
|
127 |
hlTask.addComponent(workTask);
|
indvdum@9
|
128 |
hlTask.setExpandRatio(workTask, 5f);
|
indvdum@9
|
129 |
vl.addComponent(hlTask);
|
indvdum@9
|
130 |
|
indvdum@9
|
131 |
HorizontalLayout hlHours = new HorizontalLayout();
|
indvdum@9
|
132 |
hlHours.setWidth("100%");
|
indvdum@9
|
133 |
Label lblHours = new Label("Hours:");
|
indvdum@9
|
134 |
lblHours.setWidth("100%");
|
indvdum@9
|
135 |
hlHours.addComponent(lblHours);
|
indvdum@9
|
136 |
hlHours.setExpandRatio(lblHours, 1f);
|
indvdum@9
|
137 |
workHours = new TextField();
|
indvdum@9
|
138 |
workHours.setWidth("100%");
|
indvdum@9
|
139 |
workHours.setValue(work.getHours());
|
indvdum@9
|
140 |
workHours.setImmediate(true);
|
indvdum@9
|
141 |
hlHours.addComponent(workHours);
|
indvdum@9
|
142 |
hlHours.setExpandRatio(workHours, 5f);
|
indvdum@9
|
143 |
vl.addComponent(hlHours);
|
indvdum@9
|
144 |
|
indvdum@9
|
145 |
workResult = new RichTextArea("Result");
|
indvdum@9
|
146 |
workResult.setValue(work.getResult());
|
indvdum@9
|
147 |
workResult.setSizeFull();
|
indvdum@9
|
148 |
vl.addComponent(workResult);
|
indvdum@9
|
149 |
vl.setExpandRatio(workResult, 5f);
|
indvdum@9
|
150 |
|
indvdum@9
|
151 |
HorizontalLayout hlOk = new HorizontalLayout();
|
indvdum@9
|
152 |
hlOk.setWidth("100%");
|
indvdum@9
|
153 |
Button okButton = new Button();
|
indvdum@9
|
154 |
switch(state){
|
indvdum@9
|
155 |
case CREATE:
|
indvdum@9
|
156 |
okButton.setCaption("Create");
|
indvdum@9
|
157 |
break;
|
indvdum@9
|
158 |
case EDIT:
|
indvdum@9
|
159 |
okButton.setCaption("Save");
|
indvdum@9
|
160 |
break;
|
indvdum@9
|
161 |
}
|
indvdum@9
|
162 |
okButton.addListener((ClickListener)this);
|
indvdum@9
|
163 |
hlOk.addComponent(okButton);
|
indvdum@9
|
164 |
hlOk.setComponentAlignment(okButton, Alignment.MIDDLE_RIGHT);
|
indvdum@9
|
165 |
vl.addComponent(hlOk);
|
indvdum@9
|
166 |
}
|
indvdum@9
|
167 |
|
indvdum@9
|
168 |
private void updateDays(String jpql){
|
indvdum@9
|
169 |
if(workTask != null && workTask.getValue() != null && workDay != null && workDay.getValue() != null)
|
indvdum@9
|
170 |
return;
|
indvdum@9
|
171 |
workDay.removeAllItems();
|
indvdum@9
|
172 |
Query query = EM.createQuery(jpql);
|
indvdum@9
|
173 |
List list = query.getResultList();
|
indvdum@9
|
174 |
for(Day day: (List<Day>)list){
|
indvdum@9
|
175 |
workDay.addItem(day);
|
indvdum@9
|
176 |
Calendar currCal = Calendar.getInstance();
|
indvdum@9
|
177 |
currCal.set(Calendar.HOUR_OF_DAY, 0);
|
indvdum@9
|
178 |
currCal.set(Calendar.MINUTE, 0);
|
indvdum@9
|
179 |
currCal.set(Calendar.SECOND, 0);
|
indvdum@9
|
180 |
currCal.set(Calendar.MILLISECOND, 0);
|
indvdum@9
|
181 |
if(day.getDay().equals(currCal.getTime()))
|
indvdum@9
|
182 |
workDay.select(day);
|
indvdum@9
|
183 |
}
|
indvdum@9
|
184 |
}
|
indvdum@9
|
185 |
|
indvdum@9
|
186 |
private void updateTasks(String jpql){
|
indvdum@9
|
187 |
if(workTask != null && workTask.getValue() != null && workDay != null && workDay.getValue() != null)
|
indvdum@9
|
188 |
return;
|
indvdum@9
|
189 |
workTask.removeAllItems();
|
indvdum@9
|
190 |
Query query = EM.createQuery(jpql);
|
indvdum@9
|
191 |
List list = query.getResultList();
|
indvdum@9
|
192 |
for(Task task: (List<Task>)list)
|
indvdum@9
|
193 |
workTask.addItem(task);
|
indvdum@9
|
194 |
}
|
indvdum@9
|
195 |
|
indvdum@9
|
196 |
@Override
|
indvdum@9
|
197 |
public void buttonClick(ClickEvent event) {
|
indvdum@9
|
198 |
Object dayObj = workDay.getValue();
|
indvdum@9
|
199 |
Object taskObj = workTask.getValue();
|
indvdum@9
|
200 |
Object hoursObj = workHours.getValue();
|
indvdum@9
|
201 |
String result = workResult.getValue().toString();
|
indvdum@9
|
202 |
if (
|
indvdum@9
|
203 |
!(dayObj instanceof Day)
|
indvdum@9
|
204 |
|| !(taskObj instanceof Task)
|
indvdum@9
|
205 |
|| !(hoursObj.toString().matches("^[0-9]+[\\.]{0,1}[0-9]*"))
|
indvdum@9
|
206 |
) {
|
indvdum@9
|
207 |
getWindow().showNotification("Invalid information entered");
|
indvdum@9
|
208 |
} else {
|
indvdum@9
|
209 |
Day day = (Day)dayObj;
|
indvdum@9
|
210 |
Task task = (Task)taskObj;
|
indvdum@9
|
211 |
Float hours = Float.parseFloat(hoursObj.toString());
|
indvdum@9
|
212 |
work.setDay(day);
|
indvdum@9
|
213 |
work.setTask(task);
|
indvdum@9
|
214 |
work.setHours(hours);
|
indvdum@9
|
215 |
work.setResult(result);
|
indvdum@9
|
216 |
try{
|
indvdum@9
|
217 |
EM.getTransaction().begin();
|
indvdum@9
|
218 |
EM.persist(work);
|
indvdum@9
|
219 |
EM.getTransaction().commit();
|
indvdum@11
|
220 |
EM.clear();
|
indvdum@9
|
221 |
} finally {
|
indvdum@9
|
222 |
if(EM.getTransaction().isActive())
|
indvdum@9
|
223 |
EM.getTransaction().rollback();
|
indvdum@9
|
224 |
}
|
indvdum@9
|
225 |
getParent().removeWindow(this);
|
indvdum@9
|
226 |
myApp.getWorkTable().requestRepaint();
|
indvdum@9
|
227 |
}
|
indvdum@9
|
228 |
}
|
indvdum@9
|
229 |
|
indvdum@9
|
230 |
}
|