/*
* Copyright (c) 2009-2010 Lockheed Martin Corporation
*
* 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 org.eurekastreams.web.client.ui.pages.start.gallery;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import org.eurekastreams.server.action.request.gallery.GetGalleryItemsRequest;
import org.eurekastreams.server.domain.Page;
import org.eurekastreams.server.domain.PagedSet;
import org.eurekastreams.server.domain.gadgetspec.GadgetMetaDataDTO;
import org.eurekastreams.server.search.modelview.PersonModelView.Role;
import org.eurekastreams.web.client.events.GalleryPageLoadedEvent;
import org.eurekastreams.web.client.events.GotGadgetMetaDataEvent;
import org.eurekastreams.web.client.events.HideNotificationEvent;
import org.eurekastreams.web.client.events.Observer;
import org.eurekastreams.web.client.events.ShowNotificationEvent;
import org.eurekastreams.web.client.events.ThemeChangedEvent;
import org.eurekastreams.web.client.events.UpdateHistoryEvent;
import org.eurekastreams.web.client.events.UpdatedHistoryParametersEvent;
import org.eurekastreams.web.client.events.UserLoggedInEvent;
import org.eurekastreams.web.client.events.data.GotGadgetDefinitionCategoriesResponseEvent;
import org.eurekastreams.web.client.events.data.GotGadgetDefinitionsResponseEvent;
import org.eurekastreams.web.client.events.data.GotStartPageTabsResponseEvent;
import org.eurekastreams.web.client.events.data.GotThemeDefinitionCategoriesResponseEvent;
import org.eurekastreams.web.client.events.data.GotThemeDefinitionsResponseEvent;
import org.eurekastreams.web.client.events.data.InsertedGadgetDefinitionResponseEvent;
import org.eurekastreams.web.client.events.data.InsertedThemeResponseEvent;
import org.eurekastreams.web.client.events.data.UpdatedGadgetDefinitionResponseEvent;
import org.eurekastreams.web.client.events.data.UpdatedThemeResponseEvent;
import org.eurekastreams.web.client.history.CreateUrlRequest;
import org.eurekastreams.web.client.jsni.GadgetMetaDataFetcher;
import org.eurekastreams.web.client.jsni.WidgetJSNIFacadeImpl;
import org.eurekastreams.web.client.model.GadgetDefinitionCategoriesModel;
import org.eurekastreams.web.client.model.GadgetDefinitionModel;
import org.eurekastreams.web.client.model.StartTabsModel;
import org.eurekastreams.web.client.model.ThemeDefinitionCategoriesModel;
import org.eurekastreams.web.client.model.ThemeModel;
import org.eurekastreams.web.client.ui.Session;
import org.eurekastreams.web.client.ui.common.Pager;
import org.eurekastreams.web.client.ui.common.SettingsPanel;
import org.eurekastreams.web.client.ui.common.form.FormBuilder;
import org.eurekastreams.web.client.ui.common.form.FormBuilder.Method;
import org.eurekastreams.web.client.ui.common.form.elements.BasicDropDownFormElement;
import org.eurekastreams.web.client.ui.common.form.elements.BasicTextBoxFormElement;
import org.eurekastreams.web.client.ui.common.form.elements.ValueOnlyFormElement;
import org.eurekastreams.web.client.ui.common.notifier.Notification;
import org.eurekastreams.web.client.ui.common.notifier.UINotifier;
import org.eurekastreams.web.client.ui.common.pagedlist.GadgetMetaDataRenderer;
import org.eurekastreams.web.client.ui.common.pagedlist.PagedListPanel;
import org.eurekastreams.web.client.ui.common.pagedlist.SingleColumnPagedListRenderer;
import org.eurekastreams.web.client.ui.common.pagedlist.ThemeRenderer;
import org.eurekastreams.web.client.ui.common.tabs.SimpleTab;
import org.eurekastreams.web.client.ui.common.tabs.TabContainerPanel;
import org.eurekastreams.web.client.ui.pages.master.MasterComposite;
import org.eurekastreams.web.client.ui.pages.master.StaticResourceBundle;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Hyperlink;
import com.google.gwt.user.client.ui.RootPanel;
/**
* The content page for the gallery.
*
*/
public class GalleryContent extends SettingsPanel
{
/**
* The tab container.
*/
private TabContainerPanel portalPage;
/**
* JSNI Facade.
*/
WidgetJSNIFacadeImpl jsniFacade = new WidgetJSNIFacadeImpl();
/**
* The panel.
*/
static FlowPanel panel = new FlowPanel();
/**
* JSNI Facade.
*/
private WidgetJSNIFacadeImpl jSNIFacade = new WidgetJSNIFacadeImpl();
/**
* Gadget tab.
*/
private PagedListPanel gadgetTab = null;
/**
* Theme tab.
*/
private PagedListPanel themeTab = null;
/**
* Gadget from index.
*/
private int gadgetsFrom = 0;
/**
* Gadget to index.
*/
private int gadgetsTo = 0;
/**
* Gadget total number.
*/
private int gadgetsTotal = 0;
/**
* Add Gadget button.
*/
private Hyperlink addGadget = new Hyperlink("Add App", Session.getInstance().generateUrl(
new CreateUrlRequest("action", "newApp", false)));
/**
* Add theme button.
*/
private Hyperlink addTheme = new Hyperlink("Add Theme", Session.getInstance().generateUrl(
new CreateUrlRequest("action", "newTheme", false)));
/**
* Container for the gallery tabs.
*/
private FlowPanel galleryPortalContainer = new FlowPanel();
/**
* Container for the add/edit panels.
*/
private FlowPanel galleryAddOrEditContainer = new FlowPanel();
/**
* Default constructor.
*
*/
public GalleryContent()
{
super(panel, "Configure");
this.clearContentPanel();
RootPanel.get().addStyleName(StaticResourceBundle.INSTANCE.coreCss().gallery());
panel.addStyleName(StaticResourceBundle.INSTANCE.coreCss().galleryMaster());
addGadget.addStyleName(StaticResourceBundle.INSTANCE.coreCss().addGadget());
addGadget.setVisible(false);
addTheme.addStyleName(StaticResourceBundle.INSTANCE.coreCss().addTheme());
addTheme.setVisible(false);
panel.add(galleryPortalContainer);
panel.add(galleryAddOrEditContainer);
if (Session.getInstance().getCurrentPersonRoles().contains(Role.ORG_COORDINATOR))
{
galleryPortalContainer.add(addGadget);
galleryPortalContainer.add(addTheme);
}
gadgetTab = new PagedListPanel("gadgets", new SingleColumnPagedListRenderer());
themeTab = new PagedListPanel("themes", new SingleColumnPagedListRenderer());
portalPage = new TabContainerPanel("galleryTab");
// setup the params to set when the tab is activated
Map<String, String> gadgetTabParams = new HashMap<String, String>();
gadgetTabParams.put(PagedListPanel.URL_PARAM_LIST_ID, "gadgets");
gadgetTabParams.put(Pager.URL_PARAM_START_INDEX, "0");
SimpleTab gadgetSimpleTab = new SimpleTab("Apps", gadgetTab);
gadgetSimpleTab.setParamsToSet(gadgetTabParams);
gadgetSimpleTab.setParamsToClear(Pager.URL_PARAM_END_INDEX);
portalPage.addTab(gadgetSimpleTab);
// setup the params to set when the tab is activated
Map<String, String> themeTabParams = new HashMap<String, String>();
themeTabParams.put(PagedListPanel.URL_PARAM_LIST_ID, "themes");
themeTabParams.put(Pager.URL_PARAM_START_INDEX, "0");
SimpleTab themeSimpleTab = new SimpleTab("Themes", themeTab);
themeSimpleTab.setParamsToSet(themeTabParams);
themeSimpleTab.setParamsToClear(Pager.URL_PARAM_START_INDEX, Pager.URL_PARAM_END_INDEX);
portalPage.addTab(themeSimpleTab);
galleryPortalContainer.add(portalPage);
portalPage.init();
setUpEvents();
StartTabsModel.getInstance().fetch(null, true);
GadgetDefinitionCategoriesModel.getInstance().fetch(null, true);
ThemeDefinitionCategoriesModel.getInstance().fetch(null, true);
}
/**
* Set up all events.
*/
private void setUpEvents()
{
Session.getInstance().getEventBus().addObserver(GotGadgetMetaDataEvent.class,
new Observer<GotGadgetMetaDataEvent>()
{
public void update(final GotGadgetMetaDataEvent event)
{
gadgetTab.render(new PagedSet<GadgetMetaDataDTO>(gadgetsFrom, gadgetsTo, gadgetsTotal, event
.getMetadata()), "There are no apps in this category.");
}
});
Session.getInstance().getEventBus().addObserver(GotGadgetDefinitionsResponseEvent.class,
new Observer<GotGadgetDefinitionsResponseEvent>()
{
public void update(final GotGadgetDefinitionsResponseEvent event)
{
gadgetsFrom = event.getResponse().getFromIndex();
gadgetsTo = event.getResponse().getToIndex();
gadgetsTotal = event.getResponse().getTotal();
if (gadgetsTotal == 0)
{
Session.getInstance().getEventBus().notifyObservers(
new GotGadgetMetaDataEvent(new LinkedList<GadgetMetaDataDTO>()));
}
else
{
GadgetMetaDataFetcher fetcher = // \n
new GadgetMetaDataFetcher(event.getResponse().getPagedSet());
fetcher.fetchMetaData();
}
}
});
Session.getInstance().getEventBus().addObserver(GotGadgetDefinitionCategoriesResponseEvent.class,
new Observer<GotGadgetDefinitionCategoriesResponseEvent>()
{
public void update(final GotGadgetDefinitionCategoriesResponseEvent event)
{
gadgetTab.addSet("All", GadgetDefinitionModel.getInstance(), new GadgetMetaDataRenderer(),
new GetGalleryItemsRequest("recent", "", 0, 0), "Recent");
gadgetTab.addSet("All", GadgetDefinitionModel.getInstance(), new GadgetMetaDataRenderer(),
new GetGalleryItemsRequest("popularity", "", 0, 0), "Popular");
for (String category : event.getResponse())
{
gadgetTab.addSet(category, GadgetDefinitionModel.getInstance(),
new GadgetMetaDataRenderer(), new GetGalleryItemsRequest("recent", category, 0, 0),
"Recent");
gadgetTab.addSet(category, GadgetDefinitionModel.getInstance(),
new GadgetMetaDataRenderer(), new GetGalleryItemsRequest("popularity", category, 0,
0), "Popular");
}
Session.getInstance().getEventBus().removeObserver(
GotGadgetDefinitionCategoriesResponseEvent.class, this);
}
});
Session.getInstance().getEventBus().addObserver(GotGadgetDefinitionCategoriesResponseEvent.class,
new Observer<GotGadgetDefinitionCategoriesResponseEvent>()
{
public void update(final GotGadgetDefinitionCategoriesResponseEvent event)
{
if (Session.getInstance().getParameterValue("action").equals("newApp")
|| Session.getInstance().getParameterValue("action").equals("editApp"))
{
renderCreateOrEditGadget(event.getResponse());
}
}
});
Session.getInstance().getEventBus().addObserver(GotThemeDefinitionsResponseEvent.class,
new Observer<GotThemeDefinitionsResponseEvent>()
{
public void update(final GotThemeDefinitionsResponseEvent event)
{
themeTab.render(event.getResponse(), "There are no themes in this category.");
}
});
Session.getInstance().getEventBus().addObserver(GotThemeDefinitionCategoriesResponseEvent.class,
new Observer<GotThemeDefinitionCategoriesResponseEvent>()
{
public void update(final GotThemeDefinitionCategoriesResponseEvent event)
{
themeTab.addSet("All", ThemeModel.getInstance(), new ThemeRenderer(),
new GetGalleryItemsRequest("recent", "", 0, 0), "Recent");
themeTab.addSet("All", ThemeModel.getInstance(), new ThemeRenderer(),
new GetGalleryItemsRequest("popularity", "", 0, 0), "Popular");
for (String category : event.getResponse())
{
themeTab.addSet(category, ThemeModel.getInstance(), new ThemeRenderer(),
new GetGalleryItemsRequest("recent", category, 0, 0), "Recent");
themeTab.addSet(category, ThemeModel.getInstance(), new ThemeRenderer(),
new GetGalleryItemsRequest("popularity", category, 0, 0), "Popular");
}
Session.getInstance().getEventBus().removeObserver(
GotThemeDefinitionCategoriesResponseEvent.class, this);
}
});
Session.getInstance().getEventBus().addObserver(GotThemeDefinitionCategoriesResponseEvent.class,
new Observer<GotThemeDefinitionCategoriesResponseEvent>()
{
public void update(final GotThemeDefinitionCategoriesResponseEvent event)
{
if (Session.getInstance().getParameterValue("action").equals("newTheme")
|| Session.getInstance().getParameterValue("action").equals("editTheme"))
{
renderCreateOrEditTheme(event.getResponse());
}
}
});
Session.getInstance().getEventBus().addObserver(ThemeChangedEvent.getEvent(), new Observer<ThemeChangedEvent>()
{
public void update(final ThemeChangedEvent arg1)
{
String text = "Theme has been applied";
// since a refresh happens in IE7 when navigating to the start page, show the notification
// by passing in a notification url parameter
if (MasterComposite.getUserAgent().contains("msie 7"))
{
Map<String, String> parameters = new HashMap<String, String>();
parameters.put(UINotifier.NOTIFICATION_PARAM, text);
Session.getInstance().getEventBus().notifyObservers(
new UpdateHistoryEvent(new CreateUrlRequest(Page.START, "", parameters)));
}
// otherwise, throw the notification event as normal
else
{
Session.getInstance().getEventBus().notifyObservers(
new UpdateHistoryEvent(new CreateUrlRequest(Page.START)));
Session.getInstance().getEventBus().notifyObservers(
new ShowNotificationEvent(new Notification(text)));
}
}
});
Session.getInstance().getEventBus().addObserver(UserLoggedInEvent.class, new Observer<UserLoggedInEvent>()
{
public void update(final UserLoggedInEvent event)
{
Session.getInstance().getEventBus().notifyObservers(GalleryPageLoadedEvent.getEvent());
}
});
final HashMap<String, String> gadgetParams = new HashMap<String, String>();
gadgetParams.put("tab", Session.getInstance().getParameterValue("tab"));
gadgetParams.put("galleryTab", "Apps");
final HashMap<String, String> themeParams = new HashMap<String, String>();
themeParams.put("tab", Session.getInstance().getParameterValue("tab"));
themeParams.put("galleryTab", "Themes");
Session.getInstance().getEventBus().addObserver(InsertedGadgetDefinitionResponseEvent.class,
new Observer<InsertedGadgetDefinitionResponseEvent>()
{
public void update(final InsertedGadgetDefinitionResponseEvent arg1)
{
Session.getInstance().getEventBus().notifyObservers(
new UpdateHistoryEvent(new CreateUrlRequest(Page.GALLERY, gadgetParams)));
gadgetTab.reload();
Session.getInstance().getEventBus().notifyObservers(
new ShowNotificationEvent(new Notification("Your app has been successfully added")));
}
});
Session.getInstance().getEventBus().addObserver(UpdatedGadgetDefinitionResponseEvent.class,
new Observer<UpdatedGadgetDefinitionResponseEvent>()
{
public void update(final UpdatedGadgetDefinitionResponseEvent arg1)
{
Session.getInstance().getEventBus().notifyObservers(
new UpdateHistoryEvent(new CreateUrlRequest(Page.GALLERY, gadgetParams)));
gadgetTab.reload();
Session.getInstance().getEventBus().notifyObservers(
new ShowNotificationEvent(new Notification("Your app has been successfully saved")));
}
});
Session.getInstance().getEventBus().addObserver(InsertedThemeResponseEvent.class,
new Observer<InsertedThemeResponseEvent>()
{
public void update(final InsertedThemeResponseEvent arg1)
{
Session.getInstance().getEventBus().notifyObservers(
new UpdateHistoryEvent(new CreateUrlRequest(Page.GALLERY, themeParams)));
themeTab.reload();
Session.getInstance().getEventBus().notifyObservers(
new ShowNotificationEvent(new Notification("Your theme has been successfully added")));
}
});
Session.getInstance().getEventBus().addObserver(UpdatedThemeResponseEvent.class,
new Observer<UpdatedThemeResponseEvent>()
{
public void update(final UpdatedThemeResponseEvent arg1)
{
Session.getInstance().getEventBus().notifyObservers(
new UpdateHistoryEvent(new CreateUrlRequest(Page.GALLERY, themeParams)));
themeTab.reload();
Session.getInstance().getEventBus().notifyObservers(
new ShowNotificationEvent(new Notification("Your theme has been successfully saved")));
}
});
Session.getInstance().getEventBus().addObserver(GotStartPageTabsResponseEvent.class,
new Observer<GotStartPageTabsResponseEvent>()
{
public void update(final GotStartPageTabsResponseEvent event)
{
onGotStartTabs(event);
}
});
}
/**
* What happens after we get the start tabs (for the theme).
*
* @param event
* the event.
*/
private void onGotStartTabs(final GotStartPageTabsResponseEvent event)
{
// Apply the theme.
if (event.getResponse().getTheme() != null)
{
jSNIFacade.setCSS(event.getResponse().getTheme().getCssFile());
}
else
{
// default theme
jSNIFacade.setCSS("/themes/green_hills.css");
}
Session.getInstance().getEventBus().addObserver(UpdatedHistoryParametersEvent.class,
new Observer<UpdatedHistoryParametersEvent>()
{
public void update(final UpdatedHistoryParametersEvent event)
{
if (event.getParameters().get("action").equals("newTheme")
|| event.getParameters().get("action").equals("editTheme"))
{
if (Session.getInstance().getCurrentPersonRoles().contains(Role.ORG_COORDINATOR))
{
galleryPortalContainer.setVisible(false);
galleryAddOrEditContainer.setVisible(true);
galleryAddOrEditContainer.clear();
ThemeDefinitionCategoriesModel.getInstance().fetch(null, true);
}
}
else if (event.getParameters().get("action").equals("editApp")
|| event.getParameters().get("action").equals("newApp"))
{
if (Session.getInstance().getCurrentPersonRoles().contains(Role.ORG_COORDINATOR))
{
galleryPortalContainer.setVisible(false);
galleryAddOrEditContainer.setVisible(true);
galleryAddOrEditContainer.clear();
GadgetDefinitionCategoriesModel.getInstance().fetch(null, true);
}
}
else
{
galleryAddOrEditContainer.setVisible(false);
galleryPortalContainer.setVisible(true);
setPreviousPage(new CreateUrlRequest(Page.START, "tab", Session.getInstance()
.getParameterValue("tab")), "< Return to Start Page");
Session.getInstance().getEventBus().notifyObservers(new HideNotificationEvent());
setPageTitle("Configure");
if (Session.getInstance().getCurrentPersonRoles().contains(Role.ORG_COORDINATOR))
{
addGadget.setVisible(Session.getInstance().getParameterValue("galleryTab").equals(
"Apps"));
addTheme.setVisible(Session.getInstance().getParameterValue("galleryTab").equals(
"Themes"));
}
}
}
}, true);
}
/**
* Render the create or edit screen for a theme.
*
* @param categories
* the params from the history token.
*/
private void renderCreateOrEditTheme(final LinkedList<String> categories)
{
String defaultCategory = null;
String defaultUrl = "";
String id = "";
Map<String, String> urlParams = new HashMap<String, String>();
urlParams.put("tab", Session.getInstance().getParameterValue("tab"));
urlParams.put("galleryTab", "Themes");
this.setPreviousPage(new CreateUrlRequest(Page.GALLERY, urlParams), "< Return to Configure Page");
String title = "Add Theme";
FormBuilder.Method method = Method.INSERT;
if (Session.getInstance().getParameterValue("action").equals("editTheme"))
{
title = "Edit Theme";
method = Method.UPDATE;
defaultUrl = Session.getInstance().getParameterValue("url");
defaultCategory = Session.getInstance().getParameterValue("category");
id = Session.getInstance().getParameterValue("id");
}
this.setPageTitle(title);
FormBuilder form = new FormBuilder("", ThemeModel.getInstance(), method);
if (method.equals(Method.UPDATE))
{
form.setSubmitButtonClass("form-update-button");
}
form.setOnCancelHistoryToken(Session.getInstance().generateUrl(new CreateUrlRequest(Page.GALLERY, urlParams)));
form.addFormElement(new ValueOnlyFormElement("id", id));
form.addWidget(new HTML("<em class='gallery-upload-note'><strong>Please Note:</strong><br />"
+ "Please be sure your XML file includes the required fields. You will not be able to upload the XML "
+ "without the required fields."));
form.addFormDivider();
form
.addFormElement(new BasicDropDownFormElement("Category", "category", categories, defaultCategory, "",
true));
form.addFormDivider();
form.addFormElement(new BasicTextBoxFormElement("Theme XML:", "url", defaultUrl,
"Enter the link to the xml file", true));
form.addFormDivider();
galleryAddOrEditContainer.add(form);
}
/**
* Render the create or edit screen for a gadget.
*
* @param categories
* the params from the history token.
*/
private void renderCreateOrEditGadget(final LinkedList<String> categories)
{
String defaultCategory = null;
String defaultUrl = "";
String id = "";
Map<String, String> urlParams = new HashMap<String, String>();
urlParams.put("tab", Session.getInstance().getParameterValue("tab"));
urlParams.put("galleryTab", "Apps");
this.setPreviousPage(new CreateUrlRequest(Page.GALLERY, urlParams), "< Return to Configure Page");
String title = "Add App";
FormBuilder.Method method = Method.INSERT;
if (Session.getInstance().getParameterValue("action").equals("editApp"))
{
title = "Edit App";
method = Method.UPDATE;
defaultUrl = Session.getInstance().getParameterValue("url");
defaultCategory = Session.getInstance().getParameterValue("category");
id = Session.getInstance().getParameterValue("id");
}
this.setPageTitle(title);
FormBuilder form = new FormBuilder("", GadgetDefinitionModel.getInstance(), method);
if (method.equals(Method.UPDATE))
{
form.setSubmitButtonClass(StaticResourceBundle.INSTANCE.coreCss().formUpdateButton());
}
form.setOnCancelHistoryToken(Session.getInstance().generateUrl(new CreateUrlRequest(Page.GALLERY, urlParams)));
form.addFormElement(new ValueOnlyFormElement("id", id));
form.addWidget(new HTML("<em class='gallery-upload-note'><strong>Please Note:</strong><br />"
+ "Please be sure your XML file includes the required fields. You will not be able to upload the XML "
+ "without the required fields."));
form.addFormDivider();
form
.addFormElement(new BasicDropDownFormElement("Category", "category", categories, defaultCategory, "",
true));
form.addFormDivider();
form.addFormElement(new BasicTextBoxFormElement("App XML:", "url", defaultUrl,
"Enter the link to the xml file", true));
form.addFormDivider();
galleryAddOrEditContainer.add(form);
}
}