/*
* This is part of Geomajas, a GIS framework, http://www.geomajas.org/.
*
* Copyright 2008-2011 Geosparc nv, http://www.geosparc.com/, Belgium.
*
* The program is available in open source according to the GNU Affero
* General Public License. All contributions in this program are covered
* by the Geomajas Contributors License Agreement. For full licensing
* details, see LICENSE.txt in the project root.
*/
package org.geomajas.widget.searchandfilter.client.widget.search;
import java.util.HashSet;
import java.util.Set;
import org.geomajas.widget.featureinfo.client.widget.DockableWindow;
import org.geomajas.widget.searchandfilter.client.SearchAndFilterMessages;
import org.geomajas.widget.searchandfilter.client.util.DataCallback;
import org.geomajas.widget.searchandfilter.client.util.FavouritesCommService;
import org.geomajas.widget.searchandfilter.client.widget.search.SearchWidget.FavouriteRequestHandler;
import org.geomajas.widget.searchandfilter.search.dto.SearchFavourite;
import com.google.gwt.core.client.GWT;
import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.IButton;
import com.smartgwt.client.widgets.Window;
import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.events.ClickHandler;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.CheckboxItem;
import com.smartgwt.client.widgets.form.fields.TextItem;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.LayoutSpacer;
import com.smartgwt.client.widgets.layout.VLayout;
/**
* Controller to handle the searches.
*
* @see {@link SearchWidgetRegistry}.
* @author Kristof Heirwegh
*/
public class FavouritesController implements FavouriteRequestHandler {
private final SearchAndFilterMessages messages = GWT.create(SearchAndFilterMessages.class);
// private static final String BTN_SAVE_IMG = "[ISOMORPHIC]/geomajas/osgeo/save1.png";
private static final String BTN_ADD_IMG = "[SKIN]/actions/add.png";
private static final String BTN_CANCEL_IMG = "[ISOMORPHIC]/geomajas/osgeo/undo.png";
private final Set<FavouriteChangeHandler> favouriteHandlers = new HashSet<FavouriteChangeHandler>();
// ----------------------------------------------------------
public void onAddRequested(final FavouriteEvent event) {
final SearchFavourite fav = event.getNewFavourite();
final Window addWindow = new DockableWindow();
addWindow.setTitle(messages.favouritesControllerAddTitle());
addWindow.setWidth(310);
addWindow.setHeight(145);
addWindow.setAutoCenter(true);
addWindow.setShowMinimizeButton(false);
addWindow.setIsModal(true);
addWindow.setKeepInParentRect(true);
//addWindow.setShowModalMask(true);
VLayout mainLayout = new VLayout(10);
mainLayout.setMargin(10);
// ----------------------------------------------------------
final DynamicForm form = new DynamicForm();
form.setGroupTitle(messages.favouritesControllerAddGroupTitle());
form.setIsGroup(true);
final TextItem nameItem = new TextItem();
nameItem.setWidth(190);
nameItem.setTitle(messages.favouritesControllerAddName());
nameItem.setTooltip(messages.favouritesControllerAddNameTooltip());
nameItem.setRequired(true);
final CheckboxItem sharedItem = new CheckboxItem();
sharedItem.setTitle(messages.favouritesControllerAddShared());
sharedItem.setTooltip(messages.favouritesControllerAddSharedTooltip());
form.setFields(nameItem, sharedItem);
// ----------------------------------------------------------
HLayout buttonLayout = new HLayout(10);
buttonLayout.setHeight(20);
buttonLayout.setWidth100();
IButton addBtn = new IButton(messages.favouritesControllerAddAdd());
addBtn.setIcon(BTN_ADD_IMG);
addBtn.setAutoFit(true);
addBtn.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
if (form.validate()) {
addWindow.hide();
fav.setName(nameItem.getValueAsString());
fav.setShared(sharedItem.getValueAsBoolean());
FavouritesCommService.saveSearchFavourite(fav, new DataCallback<SearchFavourite>() {
public void execute(SearchFavourite result) {
fireAddEvent(new FavouriteEvent(null, result, FavouritesController.this));
addWindow.destroy();
}
});
}
}
});
IButton cancelBtn = new IButton(messages.favouritesControllerAddCancel());
cancelBtn.setIcon(BTN_CANCEL_IMG);
cancelBtn.setAutoFit(true);
cancelBtn.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
addWindow.destroy();
}
});
LayoutSpacer lsr = new LayoutSpacer();
lsr.setWidth("*");
// ----------------------------------------------------------
buttonLayout.addMember(lsr);
buttonLayout.addMember(addBtn);
buttonLayout.addMember(cancelBtn);
mainLayout.addMember(form);
mainLayout.addMember(buttonLayout);
addWindow.addItem(mainLayout);
addWindow.show();
}
public void onDeleteRequested(final FavouriteEvent event) {
FavouritesCommService.deleteSearchFavourite(event.getOldFavourite(), new DataCallback<Boolean>() {
public void execute(Boolean result) {
if (result) {
fireDeleteEvent(new FavouriteEvent(event.getOldFavourite(), null, FavouritesController.this));
} else {
SC.say(messages.favouritesControllerAddCrudError());
}
}
});
}
public void onChangeRequested(final FavouriteEvent event) {
FavouritesCommService.saveSearchFavourite(event.getNewFavourite(), new DataCallback<SearchFavourite>() {
public void execute(SearchFavourite result) {
if (result != null) {
fireChangeEvent(new FavouriteEvent(event.getOldFavourite(), result, FavouritesController.this));
} else {
SC.say(messages.favouritesControllerAddCrudError());
}
}
});
}
// ----------------------------------------------------------
public void addFavouriteChangeHandler(FavouriteChangeHandler handler) {
favouriteHandlers.add(handler);
}
public void removeFavouriteChangeHandler(FavouriteChangeHandler handler) {
favouriteHandlers.remove(handler);
}
// ----------------------------------------------------------
private void fireAddEvent(FavouriteEvent event) {
for (FavouriteChangeHandler handler : favouriteHandlers) {
handler.onAdd(event);
}
}
private void fireDeleteEvent(FavouriteEvent event) {
for (FavouriteChangeHandler handler : favouriteHandlers) {
handler.onDelete(event);
}
}
private void fireChangeEvent(FavouriteEvent event) {
for (FavouriteChangeHandler handler : favouriteHandlers) {
handler.onChange(event);
}
}
// ----------------------------------------------------------
/**
* Change handler for favourites.
*
* @author Kristof Heirwegh
*/
public interface FavouriteChangeHandler {
void onAdd(FavouriteEvent event);
void onDelete(FavouriteEvent event);
void onChange(FavouriteEvent event);
}
/**
* Event container for changes in favourites.
*
* @author Kristof Heirwegh
*/
public static class FavouriteEvent {
private SearchFavourite oldFavourite;
private SearchFavourite newFavourite;
private Object source;
public FavouriteEvent(SearchFavourite oldFavourite, SearchFavourite newFavourite, Object source) {
this.oldFavourite = oldFavourite;
this.newFavourite = newFavourite;
this.source = source;
}
public SearchFavourite getOldFavourite() {
return oldFavourite;
}
public SearchFavourite getNewFavourite() {
return newFavourite;
}
public Object getSource() {
return source;
}
}
}