Project

General

Profile

Download (16.7 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2017 EDIT
3
* European Distributed Institute of Taxonomy
4
* http://www.e-taxonomy.eu
5
*
6
* The contents of this file are subject to the Mozilla Public License Version 1.1
7
* See LICENSE.TXT at the top of this package for the full license terms.
8
*/
9
package eu.etaxonomy.cdm.vaadin.view.distributionStatus;
10

    
11
import java.sql.SQLException;
12
import java.util.ArrayList;
13
import java.util.Arrays;
14
import java.util.Collection;
15
import java.util.List;
16
import java.util.UUID;
17

    
18
import org.springframework.beans.factory.annotation.Autowired;
19
import org.springframework.security.core.GrantedAuthority;
20
import org.vaadin.addons.lazyquerycontainer.LazyQueryContainer;
21

    
22
import com.vaadin.data.Item;
23
import com.vaadin.data.Property;
24
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
25
import com.vaadin.spring.annotation.SpringView;
26
import com.vaadin.spring.annotation.ViewScope;
27
import com.vaadin.ui.AbsoluteLayout;
28
import com.vaadin.ui.Button;
29
import com.vaadin.ui.Grid;
30
import com.vaadin.ui.Grid.FooterRow;
31
import com.vaadin.ui.ListSelect;
32
import com.vaadin.ui.Notification;
33
import com.vaadin.ui.Notification.Type;
34
import com.vaadin.ui.Table;
35
import com.vaadin.ui.UI;
36
import com.vaadin.ui.VerticalLayout;
37
import com.vaadin.ui.Window;
38

    
39
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
40
import eu.etaxonomy.cdm.i18n.Messages;
41
import eu.etaxonomy.cdm.model.common.CdmBase;
42
import eu.etaxonomy.cdm.model.common.Language;
43
import eu.etaxonomy.cdm.model.common.Representation;
44
import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
45
import eu.etaxonomy.cdm.model.description.PresenceAbsenceTerm;
46
import eu.etaxonomy.cdm.model.taxon.Taxon;
47
import eu.etaxonomy.cdm.vaadin.component.distributionStatus.AreaAndTaxonSettingsConfigWindow;
48
import eu.etaxonomy.cdm.vaadin.component.distributionStatus.DetailWindow;
49
import eu.etaxonomy.cdm.vaadin.component.distributionStatus.DistributionStatusSettingsConfigWindow;
50
import eu.etaxonomy.cdm.vaadin.component.distributionStatus.DistributionToolbar;
51
import eu.etaxonomy.cdm.vaadin.component.distributionStatus.HelpWindow;
52
import eu.etaxonomy.cdm.vaadin.container.CdmSQLContainer;
53
import eu.etaxonomy.cdm.vaadin.event.error.DelegatingErrorHandler;
54
import eu.etaxonomy.cdm.vaadin.event.error.HibernateExceptionHandler;
55
import eu.etaxonomy.cdm.vaadin.security.AccessRestrictedView;
56
import eu.etaxonomy.cdm.vaadin.util.CdmQueryFactory;
57
import eu.etaxonomy.cdm.vaadin.util.CdmSpringContextHelper;
58
import eu.etaxonomy.cdm.vaadin.util.DistributionEditorUtil;
59
import eu.etaxonomy.cdm.vaadin.view.AbstractPageView;
60

    
61
/**
62
 * @author freimeier
63
 * @since 18.10.2017
64
 *
65
 */
66
@ViewScope
67
@SpringView(name=DistributionTableViewBean.NAME)
68
public class DistributionTableViewBean
69
            extends AbstractPageView<DistributionTablePresenter>
70
            implements IDistributionTableView, AccessRestrictedView {
71

    
72
	private static final long serialVersionUID = 1L;
73
    public static final String NAME = "distGrid"; //$NON-NLS-1$
74

    
75
    @Autowired
76
    private DistributionToolbar toolbar;
77

    
78
	private Table table;
79
	private Grid grid;
80
	private FooterRow footerRow;
81

    
82
    private CdmSQLContainer container;
83
    private LazyQueryContainer gridcontainer;
84
	private AreaAndTaxonSettingsConfigWindow areaAndTaxonConfigWindow;;
85
	private DistributionStatusSettingsConfigWindow distributionStatusConfigWindow;
86
	private HelpWindow helpWindow;
87

    
88
	public DistributionTableViewBean() {
89
		super();
90
	}
91

    
92
	private AbsoluteLayout initLayout() {
93
		AbsoluteLayout mainLayout = new AbsoluteLayout();
94
		mainLayout.setImmediate(false);
95
		mainLayout.setWidth("100%"); //$NON-NLS-1$
96
		mainLayout.setHeight("100%"); //$NON-NLS-1$
97

    
98
		setWidth("100.0%"); //$NON-NLS-1$
99
		setHeight("100.0%"); //$NON-NLS-1$
100

    
101
		//Horizontal Toolbar
102
		mainLayout.addComponent(toolbar, "top:0.0px;right:0.0px;"); //$NON-NLS-1$
103

    
104
		// table + formatting
105
		table = new Table(){
106
			private static final long serialVersionUID = -5148756917468804385L;
107

    
108
			@Override
109
			protected String formatPropertyValue(Object rowId, Object colId, Property<?> property) {
110
				String formattedValue = null;
111
				PresenceAbsenceTerm presenceAbsenceTerm = null;
112
				Object value = property.getValue();
113
				if(value instanceof String){
114
//					presenceAbsenceTerm = TermCacher.getInstance().getPresenceAbsenceTerm((String) value);
115
                    try {
116
                        presenceAbsenceTerm = (PresenceAbsenceTerm)CdmSpringContextHelper.getTermService().load(UUID.fromString((String)value));
117
                    }catch(IllegalArgumentException|ClassCastException e) {
118
                        // Not a PresenceAbsenceTerm Column
119
                    }
120
				}
121
				if(presenceAbsenceTerm != null){
122
					Representation representation = presenceAbsenceTerm.getRepresentation(Language.DEFAULT());
123
					if(representation!=null){
124
						if(DistributionEditorUtil.isAbbreviatedLabels()){
125
							formattedValue = representation.getAbbreviatedLabel();
126
						}
127
						else{
128
							formattedValue = representation.getLabel();
129
						}
130
					}
131
					if(formattedValue==null){
132
						formattedValue = presenceAbsenceTerm.getTitleCache();
133
					}
134
					return formattedValue;
135
				}
136
				return super.formatPropertyValue(rowId, colId, property);
137
			}
138
		};
139
		table.setImmediate(false);
140
		table.setWidth("100.0%");
141
		table.setHeight("100.0%");
142

    
143
        table.setColumnReorderingAllowed(true);
144
        table.setSortEnabled(false);
145

    
146
        table.setColumnCollapsingAllowed(true);
147
        table.setSelectable(true);
148
        table.setPageLength(20);
149
        table.setFooterVisible(true);
150
        table.setCacheRate(20);
151

    
152
		table.addItemClickListener(event -> {
153
            if(!(event.getPropertyId().toString().equalsIgnoreCase(CdmQueryFactory.TAXON_COLUMN))
154
            		&& !(event.getPropertyId().toString().equalsIgnoreCase(CdmQueryFactory.RANK_COLUMN))
155
            		// TODO: HACK FOR RL 2017, REMOVE AS SOON AS POSSIBLE
156
            		&& !(event.getPropertyId().toString().equalsIgnoreCase("DE"))
157
            		&& !(event.getPropertyId().toString().equalsIgnoreCase("Deutschland"))){
158
                final Item item = event.getItem();
159
                Property<?> itemProperty = item.getItemProperty("uuid");
160
                UUID uuid = UUID.fromString(itemProperty.getValue().toString());
161
                final Taxon taxon = CdmBase.deproxy(CdmSpringContextHelper.getTaxonService()
162
                		.load(uuid,Arrays.asList("descriptions.descriptionElements","name.taxonBases","updatedBy")), Taxon.class);
163
                final String areaID = (String)event.getPropertyId();
164
                PresenceAbsenceTerm presenceAbsenceTerm = null;
165
                Object statusValue = item.getItemProperty(areaID).getValue();
166
                if(statusValue instanceof String){
167
//                	presenceAbsenceTerm = TermCacher.getInstance().getPresenceAbsenceTerm((String) statusValue);
168
                    try {
169
                        presenceAbsenceTerm = (PresenceAbsenceTerm)CdmSpringContextHelper.getTermService().load(UUID.fromString((String)statusValue));
170
                    }catch(IllegalArgumentException|ClassCastException e) {
171
                        // Not a PresenceAbsenceTerm Column
172
                    }
173
                }
174
                //popup window
175
                final Window popup = new Window(Messages.getLocalizedString(Messages.DistributionTableViewBean_CHOOSE_DISTRIBUTION_STATUS));
176
                DelegatingErrorHandler errorHandler = new DelegatingErrorHandler();
177
                errorHandler.registerHandler(new HibernateExceptionHandler());
178
                popup.setErrorHandler(errorHandler);
179
                final ListSelect termSelect = new ListSelect();
180
                termSelect.setSizeFull();
181
                termSelect.setContainerDataSource(getPresenter().getPresenceAbsenceTermContainer());
182
                termSelect.setNullSelectionAllowed(presenceAbsenceTerm != null);
183
                if(presenceAbsenceTerm != null){
184
                	termSelect.setNullSelectionItemId(Messages.getLocalizedString(Messages.DistributionTableViewBean_NO_STATUS_SELECT));
185
                }else{
186
                    logger.debug("No distribution status exists yet for area");
187
                }
188
                termSelect.setValue(presenceAbsenceTerm);
189
                termSelect.addValueChangeListener(valueChangeEvent -> {
190
						Object distributionStatus = valueChangeEvent.getProperty().getValue();
191
						getPresenter().updateDistributionField(areaID, distributionStatus, taxon);
192
						container.refresh();
193
						popup.close();
194
				});
195
                VerticalLayout layout = new VerticalLayout(termSelect);
196
                popup.setContent(layout);
197
                popup.setModal(true);
198
                popup.center();
199
                UI.getCurrent().addWindow(popup);
200
            }
201
        });
202

    
203
		mainLayout.addComponent(table, "top:75px;right:10.0px;left:10.0px;");
204

    
205
//		grid = new Grid();
206
//		grid.setSizeFull();
207
//		grid.setEditorEnabled(true);
208
//      grid.setFooterVisible(true);
209
//		mainLayout.addComponent(grid, "top:75px;right:10.0px;left:10.0px;"); //$NON-NLS-1$
210

    
211
		return mainLayout;
212
	}
213

    
214
    /**
215
     * {@inheritDoc}
216
     */
217
	@Override
218
	public void enter(ViewChangeEvent event) {
219
	    update();
220
	}
221

    
222
    /**
223
     * {@inheritDoc}
224
     */
225
	@Override
226
	public void update(){
227
		try {
228
			container = getPresenter().getSQLContainer();
229
		} catch (SQLException e) {
230
			DistributionEditorUtil.showSqlError(e);
231
			return;
232
		}
233
		if(container==null){
234
			return;
235
		}
236

    
237
		table.setContainerDataSource(container);
238

    
239
		List<String> columnHeaders = new ArrayList<>(Arrays.asList(table.getColumnHeaders()));
240
		columnHeaders.remove(CdmQueryFactory.DTYPE_COLUMN);
241
		columnHeaders.remove(CdmQueryFactory.ID_COLUMN);
242
		columnHeaders.remove(CdmQueryFactory.UUID_COLUMN);
243
		columnHeaders.remove(CdmQueryFactory.CLASSIFICATION_COLUMN);
244

    
245
		List<String> columnList = new ArrayList<>(columnHeaders);
246

    
247
		String[] string = new String[columnList.size()];
248

    
249
		table.setVisibleColumns(columnList.toArray());
250
		table.setColumnHeaders(columnList.toArray(string));
251
		table.setColumnFooter(CdmQueryFactory.TAXON_COLUMN, String.format(Messages.getLocalizedString(Messages.DistributionTableViewBean_TOTAL_TAXA), container.size()));
252

    
253
//        gridcontainer = getPresenter().getAreaDistributionStatusContainer();
254
//        if(gridcontainer==null){
255
//            return;
256
//        }
257
//
258
//        if(footerRow != null) {
259
//            grid.removeFooterRow(footerRow);
260
//        }
261
//		grid.removeAllColumns();
262
//
263
//        grid.setContainerDataSource(gridcontainer);
264
//
265
//        Column uuidColumn = grid.getColumn(DistributionStatusQuery.UUID_COLUMN);
266
//        uuidColumn.setEditable(false);
267
//        uuidColumn.setHidden(true);
268
//        Column taxonColumn = grid.getColumn(DistributionStatusQuery.TAXON_COLUMN);
269
//        taxonColumn.setEditable(false);
270
//        taxonColumn.setHeaderCaption(Messages.DistributionTableViewBean_TAXON);
271
//        taxonColumn.setLastFrozenColumn();
272
//
273
//        Converter<String, UUID> displayConverter = new PresenceAbsenceTermUuidTitleStringConverter();
274
//        Converter<Object, UUID> editorConverter = new PresenceAbsenceTermUuidObjectConverter();
275
//        for(Column c : grid.getColumns()) {
276
//            if(c.isEditable()) {
277
//                NamedArea namedArea = (NamedArea) CdmSpringContextHelper.getTermService().load((UUID.fromString(c.getHeaderCaption())));
278
//                String caption = DistributionEditorUtil.isAbbreviatedLabels() ?
279
//                        namedArea.getRepresentation(Language.DEFAULT()).getAbbreviatedLabel() : namedArea.getTitleCache();
280
//                c.setHeaderCaption(caption);
281
//                c.setConverter(displayConverter);
282
//
283
//                NativeSelect termSelect = new NativeSelect();
284
//                termSelect.setSizeFull();
285
//                termSelect.setContainerDataSource(getPresenter().getPresenceAbsenceTermContainer());
286
//                termSelect.setItemCaptionMode(ItemCaptionMode.PROPERTY);
287
//                termSelect.setItemCaptionPropertyId("titleCache"); //$NON-NLS-1$
288
//                termSelect.setConverter(editorConverter);
289
//                termSelect.setImmediate(true);
290
//                c.setEditorField(termSelect);
291
//            }
292
//        }
293
//        grid.getEditorFieldGroup().addCommitHandler(new CommitHandler() {
294
//            private static final long serialVersionUID = 7515807188410712420L;
295
//
296
//            @Override
297
//            public void preCommit(CommitEvent commitEvent) throws CommitException {
298
//
299
//            }
300
//
301
//            @Override
302
//            public void postCommit(CommitEvent commitEvent) throws CommitException {
303
//                gridcontainer.commit();
304
//            }
305
//        });
306
//
307
//        footerRow = grid.appendFooterRow();
308
//        Object[] cells = grid.getColumns().stream().map(c -> c.getPropertyId()).toArray(Object[]::new);
309
//        if(cells.length == 0) {
310
//            return;
311
//        }
312
//        FooterCell footerCell = null;
313
//        if(cells.length > 1) {
314
//            footerCell = footerRow.join(cells);
315
//        }else {
316
//            footerCell = footerRow.getCell(cells[0]);
317
//        }
318
//        footerCell.setText(String.format(Messages.DistributionTableViewBean_TOTAL_TAXA, gridcontainer.size()));
319
	}
320

    
321
	private void createEditClickListener(){
322
		//details
323
	    Button detailButton = toolbar.getDetailButton();
324
		detailButton.setCaption(Messages.getLocalizedString(Messages.DistributionTableViewBean_TAXON_DETAILS));
325
		detailButton.addClickListener(event -> {
326
				Object selectedItemId = DistributionTableViewBean.this.table.getValue();
327
//				Object selectedItemId = DistributionTableViewBean.this.grid.getSelectedRow();
328
				if(selectedItemId!=null){
329
				    final UUID uuid = UUID.fromString(table.getContainerDataSource().getItem(selectedItemId).getItemProperty("uuid").getValue().toString());
330
//					final UUID uuid = (UUID) selectedItemId;
331
					Taxon taxon = HibernateProxyHelper.deproxy(CdmSpringContextHelper.getTaxonService().load(uuid), Taxon.class);
332
//					Taxon taxon = (Taxon) CdmSpringContextHelper.getTaxonService().load(uuid);
333
					List<DescriptionElementBase> listDescriptions = getPresenter().listDescriptionElementsForTaxon(taxon, null);
334
					DetailWindow detailWindow = new DetailWindow(taxon, listDescriptions);
335
					Window window = detailWindow.createWindow();
336
					window.center();
337
					getUI().addWindow(window);
338
				}
339
				else{
340
					Notification.show(Messages.getLocalizedString(Messages.DistributionTableViewBean_SELECT_TAXON), Type.HUMANIZED_MESSAGE);
341
				}
342
			}
343
		);
344

    
345
		//area and taxon
346
		Button areaAndTaxonSettingsButton = toolbar.getDistributionSettingsButton();
347
		areaAndTaxonSettingsButton.addClickListener(event -> openAreaAndTaxonSettings());
348

    
349
		//distr status
350
		Button distrStatusButton = toolbar.getSettingsButton();
351
		distrStatusButton.addClickListener(event -> openStatusSettings());
352

    
353
	    //help
354
        Button helpButton = toolbar.getHelpButton();
355
        helpButton.addClickListener(event -> openHelpWindow());
356
	}
357

    
358
    /**
359
     * {@inheritDoc}
360
     */
361
	@Override
362
	public void openStatusSettings() {
363
        if(distributionStatusConfigWindow==null){
364
            distributionStatusConfigWindow = new DistributionStatusSettingsConfigWindow(this);
365
        }
366
        Window window  = distributionStatusConfigWindow.createWindow(Messages.getLocalizedString(Messages.DistributionTableViewBean_STATUS));
367
        window.setWidth("25%"); //$NON-NLS-1$
368
        window.setHeight("60%"); //$NON-NLS-1$
369
        UI.getCurrent().addWindow(window);
370
	}
371

    
372
    /**
373
     * {@inheritDoc}
374
     */
375
	@Override
376
	public void openAreaAndTaxonSettings() {
377
		if(areaAndTaxonConfigWindow==null){
378
			areaAndTaxonConfigWindow = new AreaAndTaxonSettingsConfigWindow(this);
379
		}
380
        Window window  = areaAndTaxonConfigWindow.createWindow(Messages.getLocalizedString(Messages.DistributionTableViewBean_AREAS_AND_TAXA));
381
        UI.getCurrent().addWindow(window);
382
	}
383

    
384
	public void openHelpWindow() {
385
	       if(helpWindow==null){
386
	           helpWindow = new HelpWindow(this);
387
	        }
388
	        Window window  = helpWindow.createWindow(Messages.getLocalizedString(Messages.DistributionToolbar_HELP));
389
	        UI.getCurrent().addWindow(window);
390
	}
391

    
392
    /**
393
     * {@inheritDoc}
394
     */
395
	@Override
396
	public boolean allowAnonymousAccess() {
397
		// TODO Auto-generated method stub
398
		return false;
399
	}
400

    
401
    /**
402
     * {@inheritDoc}
403
     */
404
	@Override
405
	public Collection<Collection<GrantedAuthority>> allowedGrantedAuthorities() {
406
		// TODO Auto-generated method stub
407
		return null;
408
	}
409

    
410
    /**
411
     * {@inheritDoc}
412
     */
413
	@Override
414
	protected String getHeaderText() {
415
		// TODO Auto-generated method stub
416
		return null;
417
	}
418

    
419
    /**
420
     * {@inheritDoc}
421
     */
422
	@Override
423
	protected String getSubHeaderText() {
424
		// TODO Auto-generated method stub
425
		return null;
426
	}
427

    
428
    /**
429
     * {@inheritDoc}
430
     */
431
	@Override
432
	protected void initContent() {
433
	    // initialize layout
434
        AbsoluteLayout mainLayout = initLayout();
435
        setCompositionRoot(mainLayout);
436
        // add click listener on DistributionToolbar-buttons
437
        createEditClickListener();
438
	}
439
}
(2-2/4)