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