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