Project

General

Profile

Download (12.7 KB) Statistics
| Branch: | Tag: | Revision:
1
package eu.etaxonomy.cdm.vaadin.view.dbstatus;
2

    
3
import java.sql.SQLException;
4
import java.util.ArrayList;
5
import java.util.Arrays;
6
import java.util.HashSet;
7
import java.util.List;
8
import java.util.UUID;
9

    
10
import com.vaadin.annotations.AutoGenerated;
11
import com.vaadin.data.Container;
12
import com.vaadin.data.Item;
13
import com.vaadin.data.Property;
14
import com.vaadin.data.Property.ValueChangeEvent;
15
import com.vaadin.data.Property.ValueChangeListener;
16
import com.vaadin.event.ItemClickEvent;
17
import com.vaadin.event.ItemClickEvent.ItemClickListener;
18
import com.vaadin.event.ShortcutAction.KeyCode;
19
import com.vaadin.event.ShortcutAction.ModifierKey;
20
import com.vaadin.navigator.View;
21
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
22
import com.vaadin.server.VaadinSession;
23
import com.vaadin.ui.AbsoluteLayout;
24
import com.vaadin.ui.Button;
25
import com.vaadin.ui.Button.ClickEvent;
26
import com.vaadin.ui.Button.ClickListener;
27
import com.vaadin.ui.ComboBox;
28
import com.vaadin.ui.Component;
29
import com.vaadin.ui.CustomComponent;
30
import com.vaadin.ui.Field;
31
import com.vaadin.ui.Notification;
32
import com.vaadin.ui.PopupView;
33
import com.vaadin.ui.PopupView.PopupVisibilityEvent;
34
import com.vaadin.ui.PopupView.PopupVisibilityListener;
35
import com.vaadin.ui.Table;
36
import com.vaadin.ui.Table.ColumnGenerator;
37
import com.vaadin.ui.Window;
38

    
39
import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
40
import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
41
import eu.etaxonomy.cdm.model.description.Feature;
42
import eu.etaxonomy.cdm.model.description.PresenceAbsenceTerm;
43
import eu.etaxonomy.cdm.model.taxon.Taxon;
44
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
45
import eu.etaxonomy.cdm.vaadin.component.ConfigWindow;
46
import eu.etaxonomy.cdm.vaadin.component.DetailWindow;
47
import eu.etaxonomy.cdm.vaadin.component.HorizontalToolbar;
48
import eu.etaxonomy.cdm.vaadin.container.CdmSQLContainer;
49

    
50
public class DistributionTableView<E> extends CustomComponent implements IDistributionTableComponent, View{
51

    
52
    private static final long serialVersionUID = 1L;
53
    @AutoGenerated
54
	private AbsoluteLayout mainLayout;
55
	@AutoGenerated
56
	private Table table;
57

    
58
	private Taxon currentTaxon;
59

    
60
	private ArrayList<Object> propertyList = new ArrayList<Object>();
61

    
62
	private DistributionTableComponentListener listener;
63

    
64
	protected List<Field> fields = new ArrayList<Field>();
65

    
66
	List<String> columnList;
67
	ArrayList<String> headerList;
68
	private HorizontalToolbar toolbar;
69

    
70
	/**
71
	 * The constructor should first build the main layout, set the
72
	 * composition root and then do any custom initialization.
73
	 *
74
	 * The constructor will not be automatically regenerated by the
75
	 * visual editor.
76
	 */
77
	public DistributionTableView() {
78
		buildMainLayout();
79
		setCompositionRoot(mainLayout);
80
		createEditClickListener();
81

    
82
	}
83

    
84
	@Override
85
	public void addListener(DistributionTableComponentListener listener) {
86
	   this.listener = listener;
87
	}
88

    
89
	@AutoGenerated
90
	private AbsoluteLayout buildMainLayout() {
91
		// common part: create layout
92
		mainLayout = new AbsoluteLayout();
93
		mainLayout.setImmediate(false);
94
		mainLayout.setWidth("100%");
95
		mainLayout.setHeight("100%");
96

    
97
		// top-level component properties
98
		setWidth("100.0%");
99
		setHeight("100.0%");
100
		//Horizontal Toolbar
101
		toolbar = new HorizontalToolbar();
102
		mainLayout.addComponent(toolbar, "top:0.0px;right:0.0px;");
103

    
104
		// table_1
105
		table = new Table();
106
		table.setImmediate(false);
107
		table.setWidth("100.0%");
108
		table.setHeight("100.0%");
109
		mainLayout.addComponent(table, "top:75px;right:0.0px;");
110

    
111
		return mainLayout;
112
	}
113

    
114
    /* (non-Javadoc)
115
     * @see com.vaadin.navigator.View#enter(com.vaadin.navigator.ViewChangeListener.ViewChangeEvent)
116
     */
117
    @Override
118
    public void enter(ViewChangeEvent event) {
119
        // TODO Auto-generated method stub
120

    
121
    }
122

    
123

    
124

    
125
	public void dataBinding() throws SQLException{
126
		CdmSQLContainer container = listener.getSQLContainer();
127

    
128
		table.setContainerDataSource(container);
129
		table.setColumnReorderingAllowed(true);
130
		table.setSortEnabled(true);
131

    
132
		columnList = new ArrayList<String>(Arrays.asList(new String[]{"Taxon","Rank"}));
133
		columnList.addAll(listener.getTermList());
134
		Object[] visibleColumns = columnList.toArray();
135
		table.setVisibleColumns(visibleColumns);
136

    
137
		headerList = new ArrayList<String>(Arrays.asList(new String[]{"Taxon","Rang"}));
138
		headerList.addAll(listener.getAbbreviatedTermList());
139
//		table.setColumnHeaders(headerList.toArray(new String[headerList.size()]));//new String[]{"Taxon", "Rang"});// ,"Deutschland"
140

    
141
		table.setColumnCollapsingAllowed(true);
142
		table.setSelectable(true);
143
		table.setPageLength(20);
144
		table.setFooterVisible(true);
145
		table.setColumnFooter("Taxon", "Total amount of Taxa displayed: " + container.size());
146

    
147
		table.setCacheRate(20);
148
	}
149

    
150

    
151
	private void createEditClickListener(){
152
		Button detailButton = toolbar.getDetailButton();
153
		detailButton.setCaption("Detail View");
154
		detailButton.addClickListener(new ClickListener() {
155

    
156
			@Override
157
			public void buttonClick(ClickEvent event) {
158
				try{
159
					HashSet<Feature> featureSet = new HashSet<Feature>(Arrays.asList(Feature.DESCRIPTION(), Feature.DISTRIBUTION()));
160
				if(currentTaxon != null){
161
					List<DescriptionElementBase> listDescriptions = listener.listDescriptionElementsForTaxon(currentTaxon, null);
162
					DetailWindow dw = new DetailWindow(currentTaxon, listDescriptions);
163
					Window window = dw.createWindow();
164
					getUI().addWindow(window);
165
				}else{
166
					Notification.show("Please select a Taxon.", Notification.Type.HUMANIZED_MESSAGE);
167
				}
168
				}catch(Exception e){
169
					Notification.show("Unexpected Error, \n\n Please log in again!", Notification.Type.WARNING_MESSAGE);
170
				}
171
			}
172
		});
173

    
174
		Button settingsButton = toolbar.getSettingsButton();
175
		settingsButton.addClickListener(new ClickListener() {
176

    
177
            @Override
178
            public void buttonClick(ClickEvent event) {
179
                ConfigWindow cw = new ConfigWindow();
180
                Window window  = cw.createWindow();
181
                getUI().addWindow(window);
182
            }
183
        });
184

    
185
		Button saveButton = toolbar.getSaveButton();
186
		saveButton.setClickShortcut(KeyCode.S, ModifierKey.CTRL);
187
		saveButton.setDescription("Shortcut: CTRL+S");
188
		saveButton.setCaption("Save Data");
189
		saveButton.addClickListener(new ClickListener() {
190
			private static final long serialVersionUID = 1L;
191
			@Override
192
			public void buttonClick(ClickEvent event) {
193
				ConversationHolder conversationHolder = (ConversationHolder) VaadinSession.getCurrent().getAttribute("conversation");
194
				try{
195
					conversationHolder.commit();
196
				}catch(Exception stateException){
197
					//TODO create Table without DTO
198
				}
199
				if(propertyList != null){
200
					for(Object propertyId:propertyList){
201
						table.removeGeneratedColumn(propertyId);
202
					}
203
					redrawTable();
204
				}
205
				Notification.show("Data saved", Notification.Type.HUMANIZED_MESSAGE);
206
				propertyList = null;
207
				propertyList = new ArrayList<Object>();
208
				table.setEditable(false);
209
				toolbar.getSaveButton().setCaption("Save Data");
210
			}
211
		});
212

    
213

    
214
		//FIXME: Due lack of time needs to be properly done
215

    
216
//		Button editButton = toolbar.getEditButton();
217
//		editButton.setClickShortcut(KeyCode.E, ModifierKey.CTRL);
218
//		editButton.setDescription("Shortcut: CTRL+e");
219
//		editButton.addClickListener(new ClickListener() {
220
//			private static final long serialVersionUID = 1L;
221
//			@Override
222
//			public void buttonClick(ClickEvent event) {
223
//			    //				if(table.isEditable() == false){
224
//			    //					table.setEditable(true);
225
//			    for(Object prop:table.getContainerPropertyIds()){
226
//			            if(!prop.equals("Taxon")&&!prop.equals("Rank")){
227
//			                table.addGeneratedColumn(prop, createTableColumnGenerator());
228
//			            }
229
//			    }
230
////				}//else{
231
////					table.setEditable(false);
232
////					table.refreshRowCache();
233
////				}
234
//			}
235
//		});
236

    
237
		/**Double Click listener for Table*/
238
		table.addItemClickListener(new ItemClickListener() {
239
		    private static final long serialVersionUID = 1L;
240

    
241
		    @Override
242
		    public void itemClick(ItemClickEvent event) {
243
		        TaxonBase taxonBase = loadTaxonFromSelection(event);
244
		        currentTaxon = (Taxon)taxonBase;
245
		        if(event.isDoubleClick()){
246
		            if(!(event.getPropertyId().toString().equalsIgnoreCase("Taxon")) && !(event.getPropertyId().toString().equalsIgnoreCase("Rank"))){
247
		                if(!table.removeGeneratedColumn(event.getPropertyId())){
248
		                    table.addGeneratedColumn(event.getPropertyId(), createTableColumnGenerator());
249
		                    propertyList.add(event.getPropertyId());
250
		                }else{
251
		                    table.removeGeneratedColumn(event.getPropertyId());
252
		                    propertyList.remove(event.getPropertyId());
253
		                    redrawTable();
254
		                }
255
		            }
256
		        }
257
		    }
258
		});
259
	}
260

    
261
	private TaxonBase loadTaxonFromSelection(ItemClickEvent event) {
262
	    Item item = event.getItem();
263
	    Property itemProperty = item.getItemProperty("uuid");
264
	    UUID uuid = UUID.fromString(itemProperty.getValue().toString());
265
	    TaxonBase taxonBase = listener.getTaxonService().load(uuid);
266
	    return taxonBase;
267
	}
268

    
269
	private String refreshValue(ComboBox box, Object value){
270
	    if(box.getValue() == null){
271
	        if(value != null){
272
	            return value.toString();
273
	        }else{
274
	            return "click me for new Distribution Status";
275
	        }
276
	    }else{
277
	        return box.getValue().toString();
278
	    }
279
	}
280

    
281
	private ColumnGenerator createTableColumnGenerator(){
282

    
283
	    ColumnGenerator generator = new ColumnGenerator() {
284

    
285
	        private static final long serialVersionUID = 1L;
286

    
287
	        @Override
288
	        public Object generateCell(Table source, Object itemId, Object columnId) {
289
	            Property containerProperty = source.getContainerProperty(itemId, columnId);
290
	            Object item = itemId;
291
	            final Object value = containerProperty.getValue();
292
	            Container containerDataSource = source.getContainerDataSource();
293
	            final UUID uuid = UUID.fromString(table.getItem(itemId).getItemProperty("uuid").getValue().toString());
294
	            final ComboBox box = new ComboBox("Occurrence Status: ", listener.getPresenceAbsenceContainer());
295
	            final String area = columnId.toString();
296
	            box.setImmediate(true);
297
	            box.addValueChangeListener(new ValueChangeListener() {
298
	                @Override
299
	                public void valueChange(ValueChangeEvent event) {
300
	                    Taxon taxon = (Taxon)listener.getTaxonService().load(uuid);
301
	                    if(value==null){
302
	                        listener.createDistributionField(taxon, box.getValue(), area);
303
	                        Notification.show("Create Status", Notification.Type.TRAY_NOTIFICATION);
304
	                    }else{
305
	                        int result = listener.updateDistributionField(area, box.getValue(), taxon);
306
	                        if(result == 1){
307
	                            Notification.show("Delete Status", Notification.Type.TRAY_NOTIFICATION);
308
	                        }else if(result == 0){
309
	                            Notification.show("DescriptionService wrote", Notification.Type.TRAY_NOTIFICATION);
310
	                        }
311
	                    }
312
	                }
313
	            });
314
	            final PopupView popup = new PopupView(new PopupView.Content() {
315
	                private static final long serialVersionUID = 1L;
316
	                @Override
317
	                public String getMinimizedValueAsHTML() {
318
	                    return refreshValue(box, value);
319
	                }
320
	                @Override
321
	                public Component getPopupComponent() {
322
	                    //FIXME: find a better solution
323
	                    box.setValue(compareObjectToPAT(value));
324
	                    box.setBuffered(true);
325
	                    return box;
326
	                }
327
	            });
328
	            popup.addPopupVisibilityListener(new PopupVisibilityListener() {
329

    
330
	                @Override
331
	                public void popupVisibilityChange(PopupVisibilityEvent event) {
332

    
333
	                }
334
	            });
335
	            popup.setHideOnMouseOut(true);
336
	            return popup;
337
	        }
338
	    };
339
	    return generator;
340
	}
341

    
342
	private PresenceAbsenceTerm compareObjectToPAT(Object object){
343
	    List<PresenceAbsenceTerm> presenceAbsenceTerms = listener.getPresenceAbsenceTerms();
344
	    for(PresenceAbsenceTerm term:presenceAbsenceTerms){
345
	        if(term.getTitleCache().equals(object)){
346
	            return term;
347
	        }
348
	    }
349
	    return null;
350
	}
351

    
352
	private void redrawTable(){
353
	    try {
354
	        CdmSQLContainer sqlContainer = listener.getSQLContainer();
355
	        sqlContainer.refresh();
356
	        table.setContainerDataSource(sqlContainer);
357
	        table.setVisibleColumns(columnList.toArray());
358
	    } catch (SQLException e) {
359
	        e.printStackTrace();
360
	    }
361
	}
362

    
363

    
364
}
(2-2/4)