/* * Copyright 2010 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.sample.dynatablerf.client; import com.google.gwt.event.shared.EventBus; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.event.shared.SimpleEventBus; import com.google.gwt.sample.dynatablerf.client.events.MarkFavoriteEvent; import com.google.gwt.sample.dynatablerf.shared.PersonProxy; import com.google.gwt.user.client.Cookies; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.Window.ClosingEvent; import com.google.gwt.user.client.Window.ClosingHandler; import com.google.web.bindery.requestfactory.shared.EntityProxyId; import com.google.web.bindery.requestfactory.shared.RequestFactory; import java.util.Collections; import java.util.HashSet; import java.util.Set; /** * Manages client-side favorites. */ public class FavoritesManager { private static final String COOKIE_NAME = "Favorites"; private final EventBus eventBus = new SimpleEventBus(); private final Set<EntityProxyId<PersonProxy>> favoriteIds = new HashSet<EntityProxyId<PersonProxy>>(); public FavoritesManager(final RequestFactory requestFactory) { String cookie = Cookies.getCookie(COOKIE_NAME); if (cookie != null) { try { for (String fragment : cookie.split(",")) { if (fragment.length() == 0) { continue; } EntityProxyId<PersonProxy> id = requestFactory.getProxyId(fragment); if (id != null) { favoriteIds.add(id); } } } catch (NumberFormatException e) { // Not a big deal, start up without favorites favoriteIds.clear(); } } Window.addWindowClosingHandler(new ClosingHandler() { public void onWindowClosing(ClosingEvent event) { StringBuilder sb = new StringBuilder(); for (EntityProxyId<PersonProxy> id : favoriteIds) { sb.append(requestFactory.getHistoryToken(id)).append(","); } Cookies.setCookie(COOKIE_NAME, sb.toString()); } }); } public HandlerRegistration addMarkFavoriteHandler( MarkFavoriteEvent.Handler handler) { return eventBus.addHandler(MarkFavoriteEvent.TYPE, handler); } public Set<EntityProxyId<PersonProxy>> getFavoriteIds() { return Collections.unmodifiableSet(favoriteIds); } public boolean isFavorite(PersonProxy person) { return favoriteIds.contains(person.stableId()); } public void setFavorite(EntityProxyId<PersonProxy> id, boolean isFavorite) { if (isFavorite) { favoriteIds.add(id); } else { favoriteIds.remove(id); } eventBus.fireEventFromSource(new MarkFavoriteEvent(id, isFavorite), this); } }