/* * 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.profile.widgets; import java.util.ArrayList; import java.util.HashMap; import org.eurekastreams.commons.client.ActionProcessor; import org.eurekastreams.commons.client.ActionRequestImpl; import org.eurekastreams.server.action.request.profile.GetBreadcrumbsListRequest; import org.eurekastreams.server.domain.BreadcrumbDTO; import org.eurekastreams.server.domain.Organization; import org.eurekastreams.server.domain.Page; import org.eurekastreams.server.search.modelview.DomainGroupModelView; import org.eurekastreams.server.search.modelview.OrganizationModelView; import org.eurekastreams.server.search.modelview.PersonModelView; import org.eurekastreams.web.client.history.CreateUrlRequest; import org.eurekastreams.web.client.ui.Session; import org.eurekastreams.web.client.ui.pages.master.StaticResourceBundle; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Hyperlink; import com.google.gwt.user.client.ui.Label; /** * Shows the bread crumbs for navigation. */ public class BreadcrumbPanel extends FlowPanel { /** * The action processor. */ private ActionProcessor processor; /** * Constructor. * * @param inProcessor * the processor to set. */ public BreadcrumbPanel(final ActionProcessor inProcessor) { processor = inProcessor; this.addStyleName(StaticResourceBundle.INSTANCE.coreCss().breadcrumb()); } /** * Specify the Person we're looking at. Set the breadcrumb trail to this person and the parent organization(s). * TODO: Change DomainEntity to Entity * * @param inPerson * the person whose info we are displaying. */ public void setPerson(final PersonModelView inPerson) { OrganizationModelView orgMv = new OrganizationModelView(); orgMv.setEntityId(inPerson.getParentOrganizationId()); orgMv.setShortName(inPerson.getParentOrganizationShortName()); orgMv.setName(inPerson.getParentOrganizationName()); // note: we don't have the parent organization's parent org id, but that's okay because of the 3rd parameter // is set to true, which means the parent org's parent org won't be used buildBreadcrumbs(orgMv, inPerson.getPreferredName() + " " + inPerson.getLastName(), true, false); } /** * Specify the Group we're looking at. Set the breadcrumb trail to this group and the parent organization(s). * * @param inGroup * the inGroup whose info we are displaying. * @param showItemLink * flag to show this item in the trail as a link that wipes out all params when clicked. */ public void setGroup(final DomainGroupModelView inGroup, final boolean showItemLink) { OrganizationModelView parentOrgModelView = new OrganizationModelView(); parentOrgModelView.setName(inGroup.getParentOrganizationName()); parentOrgModelView.setEntityId(inGroup.getParentOrganizationId()); parentOrgModelView.setShortName(inGroup.getParentOrganizationShortName()); buildBreadcrumbs(parentOrgModelView, inGroup.getName(), true, showItemLink); } /** * Set up the breadcrumbs based on an organization. Note that we should be able to collapse this and setPerson() * once we have the Resource hierarchy. * * @param inOrganization * the new organization */ public void setOrganization(final OrganizationModelView inOrganization) { buildBreadcrumbs(inOrganization, inOrganization.getName(), false, false); } /** * Makes the action call to build the breadcrumb list. * * @param org * the organization starting point. * @param thisItem * the display name of the end node in the breadcrumb trail. * @param showParent * flag to show this item's direct parent in the trail; only orgs do not need to show this. * @param showItemLink * flag to show this item in the trail as a link that wipes out all params when clicked. */ private void buildBreadcrumbs(final OrganizationModelView org, final String thisItem, final boolean showParent, final boolean showItemLink) { GetBreadcrumbsListRequest request = new GetBreadcrumbsListRequest(org.getId()); // No need to get the organization hierarchy if the supplied org is the root org // and breadcrumbs are being displayed on an Org profile page. if (!showParent && (org.getParentOrganizationId() == org.getId())) { displayBreadcrumbs(new ArrayList<BreadcrumbDTO>(), thisItem, showParent, showItemLink); } else { processor.makeRequest(new ActionRequestImpl<ArrayList<BreadcrumbDTO>>("getBreadcrumbsList", request), new AsyncCallback<ArrayList<BreadcrumbDTO>>() { public void onFailure(final Throwable caught) { } public void onSuccess(final ArrayList<BreadcrumbDTO> breadcrumbs) { // Don't show the parent if your parent is the root org. if (showParent) { breadcrumbs .add(new BreadcrumbDTO(org.getName(), Page.ORGANIZATIONS, org.getShortName())); } displayBreadcrumbs(breadcrumbs, thisItem, showParent, showItemLink); } }); } } /** * Makes the action call to build the breadcrumb list. * * @param org * the organization starting point. * @param thisItem * the display name of the end node in the breadcrumb trail. * @param showParent * flag to show this item's direct parent in the trail; only orgs do not need to show this. * @param showItemLink * flag to show this item in the trail as a link that wipes out all params when clicked. */ private void buildBreadcrumbs(final Organization org, final String thisItem, final boolean showParent, final boolean showItemLink) { GetBreadcrumbsListRequest request = new GetBreadcrumbsListRequest(org.getId()); // No need to get the organization hierarchy if the supplied org is the root org // and breadcrumbs are being displayed on an Org profile page. if (!showParent && (org.getParentOrgId() == org.getId())) { displayBreadcrumbs(new ArrayList<BreadcrumbDTO>(), thisItem, showParent, showItemLink); } else { processor.makeRequest(new ActionRequestImpl<ArrayList<BreadcrumbDTO>>("getBreadcrumbsList", request), new AsyncCallback<ArrayList<BreadcrumbDTO>>() { public void onFailure(final Throwable caught) { } public void onSuccess(final ArrayList<BreadcrumbDTO> breadcrumbs) { // Don't show the parent if your parent is the root org. if (showParent) { breadcrumbs .add(new BreadcrumbDTO(org.getName(), Page.ORGANIZATIONS, org.getShortName())); } displayBreadcrumbs(breadcrumbs, thisItem, showParent, showItemLink); } }); } } /** * Put the breadcrumbs on the display. * * @param breadcrumbs * the crumbs. * @param thisItem * the display name of the end node in the breadcrumb trail. * @param showParent * flag to show this item's direct parent in the trail; only orgs do not need to show this. * @param showItemLink * flag to show this item in the trail as a link that wipes out all params when clicked. */ private void displayBreadcrumbs(final ArrayList<BreadcrumbDTO> breadcrumbs, final String thisItem, final boolean showParent, final boolean showItemLink) { Label separator; this.clear(); HashMap<String, String> params = new HashMap<String, String>(); params.put("tab", "Stream"); for (BreadcrumbDTO crumb : breadcrumbs) { Hyperlink crumbLink = new Hyperlink(crumb.getText(), Session.getInstance().generateUrl( new CreateUrlRequest(crumb.getPage(), crumb.getView(), params))); this.add(crumbLink); separator = new Label(">"); separator.addStyleName(StaticResourceBundle.INSTANCE.coreCss().breadcrumbSeparator()); this.add(separator); } if (showItemLink) { Hyperlink crumbLink = new Hyperlink(thisItem, Session.getInstance().generateUrl( new CreateUrlRequest(new HashMap<String, String>(), true))); crumbLink.addStyleName(StaticResourceBundle.INSTANCE.coreCss().breadcrumbLabel()); this.add(crumbLink); } else { Label label = new Label(); label.setText(thisItem); label.addStyleName(StaticResourceBundle.INSTANCE.coreCss().breadcrumbLabel()); this.add(label); } } }