1
/*
2
 * Copyright (C) 2011 Openismus GmbH
3
 *
4
 * This file is part of GWT-Glom.
5
 *
6
 * GWT-Glom is free software: you can redistribute it and/or modify it
7
 * under the terms of the GNU Lesser General Public License as published by the
8
 * Free Software Foundation, either version 3 of the License, or (at your
9
 * option) any later version.
10
 *
11
 * GWT-Glom is distributed in the hope that it will be useful, but WITHOUT
12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
14
 * for more details.
15
 *
16
 * You should have received a copy of the GNU Lesser General Public License
17
 * along with GWT-Glom.  If not, see <http://www.gnu.org/licenses/>.
18
 */
19
20
package org.glom.web.client.activity;
21
22
import org.glom.web.client.StringUtils;
23
import org.glom.web.client.ClientFactory;
24
import org.glom.web.client.OnlineGlomServiceAsync;
25
import org.glom.web.client.Utils;
26
import org.glom.web.client.event.LocaleChangeEvent;
27
import org.glom.web.client.event.LocaleChangeEventHandler;
28
import org.glom.web.client.event.QuickFindChangeEvent;
29
import org.glom.web.client.event.QuickFindChangeEventHandler;
30
import org.glom.web.client.event.TableChangeEvent;
31
import org.glom.web.client.event.TableChangeEventHandler;
32
import org.glom.web.client.place.DocumentSelectionPlace;
33
import org.glom.web.client.place.ListPlace;
34
import org.glom.web.client.ui.AuthenticationPopup;
35
import org.glom.web.client.ui.ListView;
36
import org.glom.web.client.ui.View;
37
import org.glom.web.shared.layout.LayoutGroup;
38
39
import com.google.gwt.activity.shared.AbstractActivity;
40
import com.google.gwt.core.client.GWT;
41
import com.google.gwt.event.dom.client.ClickEvent;
42
import com.google.gwt.event.dom.client.ClickHandler;
43
import com.google.gwt.event.shared.EventBus;
44
import com.google.gwt.place.shared.Place;
45
import com.google.gwt.user.client.rpc.AsyncCallback;
46
import com.google.gwt.user.client.ui.AcceptsOneWidget;
47
48
public class ListActivity extends AbstractActivity implements View.Presenter {
49
50
	private final String documentID;
51
	private final String tableName;
52
	private final String quickFind;
53
	private final ClientFactory clientFactory;
54
	private final ListView listView;
55
	private final AuthenticationPopup authenticationPopup;
56
57
	public ListActivity(final ListPlace place, final ClientFactory clientFactory) {
58
		this.documentID = place.getDocumentID(); // TODO: Just store the place?
59
		this.tableName = place.getTableName();
60
		this.quickFind = place.getQuickFind();
61
		this.clientFactory = clientFactory;
62
		listView = clientFactory.getListView();
63
		authenticationPopup = clientFactory.getAuthenticationPopup();
64
	}
65
66
	@Override
67
	public void start(final AcceptsOneWidget panel, final EventBus eventBus) {
68
		if (StringUtils.isEmpty(documentID))
69
			goTo(new DocumentSelectionPlace());
70
71
		// register this class as the presenter
72
		listView.setPresenter(this);
73
74
		// TODO this should really be it's own Place/Activity
75
		// check if the authentication info has been set for the document
76
		final AsyncCallback<Boolean> isAuthCallback = new AsyncCallback<Boolean>() {
77
			@Override
78
			public void onFailure(final Throwable caught) {
79
				// TODO: create a way to notify users of asynchronous callback failures
80
				GWT.log("AsyncCallback Failed: OnlineGlomService.isAuthenticated()");
81
			}
82
83
			@Override
84
			public void onSuccess(final Boolean result) {
85
				if (!result) {
86
					setUpAuthClickHandler(eventBus);
87
					authenticationPopup.center();
88
				}
89
			}
90
		};
91
		OnlineGlomServiceAsync.Util.getInstance().isAuthenticated(documentID, isAuthCallback);
92
93
		// set the change handler for the table selection widget
94
		eventBus.addHandler(TableChangeEvent.TYPE, new TableChangeEventHandler() {
95
			@Override
96
			public void onTableChange(final TableChangeEvent event) {
97
				goTo(new ListPlace(documentID, event.getNewTableName(), ""));
98
			}
99
		});
100
101
		// populate the cell table with data
102
		final AsyncCallback<LayoutGroup> callback = new AsyncCallback<LayoutGroup>() {
103
			@Override
104
			public void onFailure(final Throwable caught) {
105
				// TODO: create a way to notify users of asynchronous callback failures
106
				GWT.log("AsyncCallback Failed: OnlineGlomService.getListViewLayout()");
107
			}
108
109
			@Override
110
			public void onSuccess(final LayoutGroup result) {
111
				// TODO check if result.getTableName() is the same as the tableName field. Update it if it's not the
112
				// same.
113
				listView.setCellTable(documentID, result, quickFind);
114
			}
115
		};
116
		
117
		final String localeID = Utils.getCurrentLocaleID();
118
		OnlineGlomServiceAsync.Util.getInstance().getListViewLayout(documentID, tableName, localeID, callback);
119
120
		// TODO: Avoid the code duplication with DetailsActivity.
121
		// set the change handler for the quickfind text widget
122
		eventBus.addHandler(QuickFindChangeEvent.TYPE, new QuickFindChangeEventHandler() {
123
			@Override
124
			public void onQuickFindChange(final QuickFindChangeEvent event) {
125
				// We switch to the List view, to show search results.
126
				// TODO: Show the details view if there is only one result.
127
				goTo(new ListPlace(documentID, tableName, event.getNewQuickFindText()));
128
			}
129
		});
130
131
		// Set the change handler for the table selection widget
132
		eventBus.addHandler(LocaleChangeEvent.TYPE, new LocaleChangeEventHandler() {
133
			@Override
134
			public void onLocaleChange(final LocaleChangeEvent event) {
135
				// note the empty primary key item
136
				goTo(new ListPlace(documentID, tableName, quickFind));
137
			}
138
		});
139
140
		// indicate that the view is ready to be displayed
141
		panel.setWidget(listView.asWidget());
142
	}
143
144
	private void setUpAuthClickHandler(final EventBus eventBus) {
145
		authenticationPopup.setClickOkHandler(new ClickHandler() {
146
			@Override
147
			public void onClick(final ClickEvent event) {
148
				authenticationPopup.setTextFieldsEnabled(false);
149
				final AsyncCallback<Boolean> callback = new AsyncCallback<Boolean>() {
150
					@Override
151
					public void onFailure(final Throwable caught) {
152
						// TODO: create a way to notify users of asynchronous callback failures
153
						GWT.log("AsyncCallback Failed: OnlineGlomService.checkAuthentication()");
154
					}
155
156
					@Override
157
					public void onSuccess(final Boolean result) {
158
						if (result) {
159
							authenticationPopup.hide();
160
							eventBus.fireEvent(new TableChangeEvent(clientFactory.getTableSelectionView()
161
									.getSelectedTableName()));
162
						} else {
163
							authenticationPopup.setTextFieldsEnabled(true);
164
							authenticationPopup.setError();
165
						}
166
					}
167
				};
168
				OnlineGlomServiceAsync.Util.getInstance().checkAuthentication(documentID,
169
						authenticationPopup.getUsername(), authenticationPopup.getPassword(), callback);
170
			}
171
172
		});
173
	}
174
175
	private void clearView() {
176
		authenticationPopup.hide();
177
		authenticationPopup.clear();
178
		listView.clear();
179
	}
180
181
	/*
182
	 * (non-Javadoc)
183
	 * 
184
	 * @see com.google.gwt.activity.shared.AbstractActivity#onCancel()
185
	 */
186
	@Override
187
	public void onCancel() {
188
		clearView();
189
	}
190
191
	/*
192
	 * (non-Javadoc)
193
	 * 
194
	 * @see com.google.gwt.activity.shared.AbstractActivity#onStop()
195
	 */
196
	@Override
197
	public void onStop() {
198
		clearView();
199
	}
200
201
	/*
202
	 * (non-Javadoc)
203
	 * 
204
	 * @see org.glom.web.client.ui.View.Presenter#goTo(com.google.gwt.place.shared.Place)
205
	 */
206
	@Override
207
	public void goTo(final Place place) {
208
		clientFactory.getPlaceController().goTo(place);
209
	}
210
211
}