Project

General

Profile

Download (7.95 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.Collection;
7
import java.util.List;
8
import java.util.UUID;
9

    
10
import com.vaadin.data.Property;
11
import com.vaadin.data.Property.ValueChangeEvent;
12
import com.vaadin.data.Property.ValueChangeListener;
13
import com.vaadin.event.ShortcutAction.KeyCode;
14
import com.vaadin.event.ShortcutAction.ModifierKey;
15
import com.vaadin.navigator.View;
16
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
17
import com.vaadin.server.VaadinSession;
18
import com.vaadin.ui.AbsoluteLayout;
19
import com.vaadin.ui.Button;
20
import com.vaadin.ui.Button.ClickEvent;
21
import com.vaadin.ui.Button.ClickListener;
22
import com.vaadin.ui.ComboBox;
23
import com.vaadin.ui.CustomComponent;
24
import com.vaadin.ui.Notification;
25
import com.vaadin.ui.Notification.Type;
26
import com.vaadin.ui.Table;
27
import com.vaadin.ui.Table.ColumnGenerator;
28
import com.vaadin.ui.Window;
29

    
30
import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
31
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
32
import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
33
import eu.etaxonomy.cdm.model.taxon.Taxon;
34
import eu.etaxonomy.cdm.vaadin.component.DetailWindow;
35
import eu.etaxonomy.cdm.vaadin.component.HorizontalToolbar;
36
import eu.etaxonomy.cdm.vaadin.container.CdmSQLContainer;
37
import eu.etaxonomy.cdm.vaadin.container.PresenceAbsenceTermContainer;
38
import eu.etaxonomy.cdm.vaadin.presenter.dbstatus.DistributionTablePresenter;
39
import eu.etaxonomy.cdm.vaadin.util.CdmQueryFactory;
40
import eu.etaxonomy.cdm.vaadin.util.TermCacher;
41

    
42
public class DistributionTableView extends CustomComponent implements View{
43

    
44
	private static final long serialVersionUID = 1L;
45
    private HorizontalToolbar toolbar;
46
	private Table table;
47

    
48
	private DistributionTablePresenter listener;
49

    
50
	private List<String> columnList;
51
	private ArrayList<String> headerList;
52

    
53
	/**
54
	 * The constructor should first build the main layout, set the
55
	 * composition root and then do any custom initialization.
56
	 *
57
	 * The constructor will not be automatically regenerated by the
58
	 * visual editor.
59
	 */
60
	public DistributionTableView() {
61
		AbsoluteLayout mainLayout = initLayout();
62
		setCompositionRoot(mainLayout);
63
		createEditClickListener();
64

    
65
	}
66

    
67
	private AbsoluteLayout initLayout() {
68
		AbsoluteLayout mainLayout = new AbsoluteLayout();
69
		mainLayout.setImmediate(false);
70
		mainLayout.setWidth("100%");
71
		mainLayout.setHeight("100%");
72

    
73
		setWidth("100.0%");
74
		setHeight("100.0%");
75

    
76
		//Horizontal Toolbar
77
		toolbar = new HorizontalToolbar();
78
		mainLayout.addComponent(toolbar, "top:0.0px;right:0.0px;");
79

    
80
		// table
81
		table = new Table();
82
		table.setImmediate(false);
83
		table.setWidth("100.0%");
84
		table.setHeight("100.0%");
85
		mainLayout.addComponent(table, "top:75px;right:0.0px;");
86
		return mainLayout;
87
	}
88

    
89
	public void addListener(DistributionTablePresenter listener) {
90
	   this.listener = listener;
91
	}
92

    
93
	@Override
94
	public void enter(ViewChangeEvent event) {
95
		CdmSQLContainer container = null;
96
		try {
97
			container = listener.getSQLContainer();
98
		} catch (SQLException e) {
99
			Notification.show("Error while accessing data base", Type.ERROR_MESSAGE);
100
			e.printStackTrace();
101
			return;
102
		}
103

    
104
		table.setContainerDataSource(container);
105
		table.setColumnReorderingAllowed(true);
106
		table.setSortEnabled(true);
107

    
108
		columnList = new ArrayList<String>(Arrays.asList(new String[]{CdmQueryFactory.TAXON_COLUMN,CdmQueryFactory.RANK_COLUMN}));
109
		List<String> namedAreas = listener.getNamedAreasLabels(true);
110
		columnList.addAll(namedAreas);
111
		table.setVisibleColumns(columnList.toArray());
112

    
113
		headerList = new ArrayList<String>(Arrays.asList(new String[]{CdmQueryFactory.TAXON_COLUMN,"Rang"}));
114
		headerList.addAll(listener.getNamedAreasLabels(true));
115
		String[] string = new String[headerList.size()];
116
		table.setColumnHeaders(headerList.toArray(string));
117

    
118
//		table.setColumnExpandRatio(propertyId, expandRatio);
119
		table.setColumnCollapsingAllowed(true);
120
		table.setSelectable(true);
121
		table.setPageLength(20);
122
		table.setFooterVisible(true);
123
		table.setColumnFooter(CdmQueryFactory.TAXON_COLUMN, "Total amount of Taxa displayed: " + container.size());
124

    
125
		table.setCacheRate(20);
126

    
127
		//add generated columns for NamedAreas
128
		Collection<?> containerPropertyIds = table.getContainerPropertyIds();
129
		for (Object object : containerPropertyIds) {
130
			if(namedAreas.contains(object)){
131
				table.removeGeneratedColumn(object);
132
				table.addGeneratedColumn(object, new AreaColumnGenerator());
133
			}
134
		}
135
	}
136

    
137
	private void createEditClickListener(){
138
		Button detailButton = toolbar.getDetailButton();
139
		detailButton.setCaption("Detail View");
140
		detailButton.addClickListener(new ClickListener() {
141

    
142
			private static final long serialVersionUID = 1479133195403139547L;
143

    
144
			@Override
145
			public void buttonClick(ClickEvent event) {
146
				Object selectedItemId = DistributionTableView.this.table.getValue();
147
				if(selectedItemId!=null){
148
					final UUID uuid = UUID.fromString(table.getItem(selectedItemId).getItemProperty("uuid").getValue().toString());
149
					Taxon taxon = HibernateProxyHelper.deproxy(listener.getTaxonService().load(uuid), Taxon.class);
150
					List<DescriptionElementBase> listDescriptions = listener.listDescriptionElementsForTaxon(taxon, null);
151
					DetailWindow dw = new DetailWindow(taxon, listDescriptions);
152
					Window window = dw.createWindow();
153
					getUI().addWindow(window);
154
				}
155
				else{
156
					Notification.show("Please select a taxon", Type.HUMANIZED_MESSAGE);
157
				}
158
			}
159
		});
160

    
161
		Button settingsButton = toolbar.getSettingsButton();
162
		settingsButton.addClickListener(new ClickListener() {
163

    
164
			private static final long serialVersionUID = 3834048719431837966L;
165

    
166
			@Override
167
            public void buttonClick(ClickEvent event) {
168
                SettingsConfigWindow cw = new SettingsConfigWindow();
169
                Window window  = cw.createWindow();
170
                getUI().addWindow(window);
171
            }
172
        });
173

    
174
		Button saveButton = toolbar.getSaveButton();
175
		saveButton.setClickShortcut(KeyCode.S, ModifierKey.CTRL);
176
		saveButton.setDescription("Shortcut: CTRL+S");
177
		saveButton.setCaption("Save Data");
178
		saveButton.addClickListener(new ClickListener() {
179
			private static final long serialVersionUID = 1L;
180
			@Override
181
			public void buttonClick(ClickEvent event) {
182
				ConversationHolder conversationHolder = (ConversationHolder) VaadinSession.getCurrent().getAttribute("conversation");
183
				try{
184
					conversationHolder.commit();
185
				}catch(Exception stateException){
186
					//TODO create Table without DTO
187
				}
188
				Notification.show("Data saved", Notification.Type.HUMANIZED_MESSAGE);
189
			}
190
		});
191

    
192
	}
193

    
194
    private final class AreaColumnGenerator implements ColumnGenerator {
195
        private static final long serialVersionUID = 1L;
196

    
197
        @Override
198
        public Object generateCell(Table source, Object itemId, Object columnId) {
199
            Property<?> containerProperty = source.getContainerProperty(itemId, columnId);
200
            Object value = null;
201
            if(containerProperty != null){
202
                value = containerProperty.getValue();
203
            }
204
            final UUID uuid = UUID.fromString(table.getItem(itemId).getItemProperty("uuid").getValue().toString());
205
            final ComboBox box = new ComboBox("Occurrence Status: ", PresenceAbsenceTermContainer.getInstance());
206
            final String area = columnId.toString();
207
            box.setImmediate(true);
208
            box.setBuffered(true);
209
            box.setSizeFull();
210
            box.setValue(TermCacher.getInstance().getPresenceAbsenceTerm((String)value));
211
            box.addValueChangeListener(new ValueChangeListener() {
212
                private static final long serialVersionUID = 6221534597911674067L;
213

    
214
                @Override
215
                public void valueChange(ValueChangeEvent event) {
216
                    Taxon taxon = HibernateProxyHelper.deproxy(listener.getTaxonService().load(uuid), Taxon.class);
217
                    listener.updateDistributionField(area, box.getValue(), taxon);
218
                }
219
            });
220
            return box;
221
        }
222
    }
223

    
224
}
(2-2/3)