/******************************************************************************* * Copyright (c) 2010-2014 SAP AG and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * SAP AG - initial API and implementation *******************************************************************************/ package org.eclipse.skalli.view.ext.impl.internal.infobox; import java.util.List; import java.util.SortedSet; import java.util.UUID; import org.apache.commons.lang.StringEscapeUtils; import org.eclipse.skalli.model.Project; import org.eclipse.skalli.model.ProjectNature; import org.eclipse.skalli.services.project.ProjectService; import org.eclipse.skalli.services.template.ProjectTemplate; import org.eclipse.skalli.services.template.ProjectTemplateService; import org.eclipse.skalli.view.component.SubprojectComparator; import org.eclipse.skalli.view.ext.ExtensionUtil; import org.eclipse.skalli.view.ext.InfoBox; import org.eclipse.skalli.view.ext.InfoBoxBase; import com.vaadin.ui.Component; import com.vaadin.ui.CssLayout; import com.vaadin.ui.Label; import com.vaadin.ui.Layout; public class SubprojectsInfoBox extends InfoBoxBase implements InfoBox { private static final int DELTA_INDENT = 20; private static final String STYLE_SUBPROJECTS_INFOBOX = "infobox-subprojects"; //$NON-NLS-1$ private ProjectService projectService; private ProjectTemplateService templateService; protected void bindProjectService(ProjectService srvc) { this.projectService = srvc; } protected void unbindProjectService(ProjectService srvc) { this.projectService = null; } protected void bindProjectTemplateService(ProjectTemplateService srvc) { this.templateService = srvc; } protected void unbindProjectTemplateService(ProjectTemplateService srvc) { this.templateService = null; } @Override public String getIconPath() { return "res/icons/subprojects.png"; //$NON-NLS-1$ } @Override public String getCaption() { return "Project Hierarchy"; } @Override public String getShortName() { return "subprojects"; } @Override public Component getContent(Project project, ExtensionUtil util) { Layout layout = new CssLayout(); layout.addStyleName(STYLE_SUBPROJECTS_INFOBOX); layout.setSizeFull(); UUID uuid = project.getUuid(); List<Project> parents = projectService.getParentChain(uuid); SortedSet<Project> subprojects = project.getSubProjects(new SubprojectComparator(templateService)); int indent = 0; StringBuilder sb = new StringBuilder(); // render the parents of the project as links in reverse order and // with increasing indentation; finally render the project // itself (just as emphasized text, no link) for (int i = parents.size() - 1; i >= 0; --i) { renderProject(sb, parents.get(i), templateService, indent, i > 0); indent += DELTA_INDENT; } // render the subprojects as links in alphabetical order // and with same indentation for (Project subproject : subprojects) { renderProject(sb, subproject, templateService, indent, true); } Label content = new Label(sb.toString(), Label.CONTENT_XHTML); content.setSizeUndefined(); layout.addComponent(content); return layout; } private void renderProject(StringBuilder sb, Project project, ProjectTemplateService templateService, int indent, boolean asLink) { sb.append("<div"); //$NON-NLS-1$ if (indent > 0) { sb.append(" style=\"margin-left: ").append(indent).append("px\">"); //$NON-NLS-1$ //$NON-NLS-2$ } else { sb.append(">"); //$NON-NLS-1$ } ProjectTemplate template = templateService.getProjectTemplateById(project.getProjectTemplateId()); ProjectNature nature = template != null ? template.getProjectNature() : null; if (nature != null) { sb.append("<img class=\"natureicon\" src=\""); //$NON-NLS-1$ if (ProjectNature.PROJECT.equals(nature)) { sb.append("/VAADIN/themes/simple/icons/nature/project16x16.png"); //$NON-NLS-1$ sb.append("\" title=\"").append("Project of People").append("\" />"); //$NON-NLS-1$ //$NON-NLS-3$ } else if (ProjectNature.COMPONENT.equals(nature)) { sb.append("/VAADIN/themes/simple/icons/nature/component16x16.png"); //$NON-NLS-1$ sb.append("\" title=\"").append("Component").append("\" />"); //$NON-NLS-1$ //$NON-NLS-3$ } } if (asLink) { sb.append("<a class=\"link\" href=\"/projects/"); //$NON-NLS-1$ sb.append(project.getProjectId()); sb.append("\" target=\"_top\">"); //$NON-NLS-1$ sb.append(StringEscapeUtils.escapeHtml(project.getName())); sb.append("</a>"); //$NON-NLS-1$ } else { sb.append("<em>").append(StringEscapeUtils.escapeHtml(project.getName())).append("</em>"); //$NON-NLS-1$ //$NON-NLS-2$ } sb.append("</div>"); //$NON-NLS-1$ } @Override public float getPositionWeight() { return 1.02f; } @Override public int getPreferredColumn() { return COLUMN_EAST; } @Override public boolean isVisible(Project project, String loggedInUserId) { return project.getParentEntityId() != null || project.getFirstChild() != null; } }