/******************************************************************************* * Copyright (c) 2012-2017 Codenvy, S.A. * 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: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.ide.ext.java.client.project.classpath.valueproviders.pages.libraries; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.DivElement; import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.SpanElement; import com.google.gwt.dom.client.Style; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.EventListener; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Widget; import com.google.inject.Inject; import com.google.inject.Singleton; import org.eclipse.che.ide.ext.java.client.JavaResources; import org.eclipse.che.ide.ext.java.client.project.classpath.ProjectClasspathResources; import org.eclipse.che.ide.ext.java.shared.dto.classpath.ClasspathEntryDto; import org.eclipse.che.ide.project.shared.NodesResources; import org.eclipse.che.ide.ui.list.CategoriesList; import org.eclipse.che.ide.ui.list.Category; import org.eclipse.che.ide.ui.list.CategoryRenderer; import java.util.ArrayList; import java.util.List; import java.util.Map; import static com.google.gwt.dom.client.Style.Visibility.HIDDEN; import static java.util.Collections.reverse; /** * The implementation of {@link LibEntryView}. * * @author Valeriy Svydenko */ @Singleton public class LibEntryViewImpl extends Composite implements LibEntryView { private static LibPropertyViewImplUiBinder ourUiBinder = GWT.create(LibPropertyViewImplUiBinder.class); private final JavaResources javaResources; private final NodesResources nodesResources; private final ProjectClasspathResources classpathResources; @UiField(provided = true) ProjectClasspathResources.ClasspathStyles styles; @UiField FlowPanel buttonsPanel; @UiField FlowPanel libraryPanel; @UiField Button addJarBtn; private final Category.CategoryEventDelegate<ClasspathEntryDto> librariesDelegate = new Category.CategoryEventDelegate<ClasspathEntryDto>() { @Override public void onListItemClicked(Element listItemBase, ClasspathEntryDto itemData) { listItemBase.getStyle().setBackgroundColor("inherit"); } }; private final CategoryRenderer<ClasspathEntryDto> classpathEntryRenderer = new CategoryRenderer<ClasspathEntryDto>() { @Override public void renderElement(Element element, ClasspathEntryDto data) { SpanElement categoryHeaderElement = Document.get().createSpanElement(); categoryHeaderElement.setClassName(classpathResources.getCss().elementHeader()); element.appendChild(categoryHeaderElement); SpanElement iconElement = Document.get().createSpanElement(); if (data.getPath().endsWith(".jar")) { iconElement.appendChild(javaResources.jarFileIcon().getSvg().getElement()); } categoryHeaderElement.appendChild(iconElement); Element textElement = createNameOfElement(data.getPath()); textElement.addClassName(classpathResources.getCss().elementLabel()); categoryHeaderElement.appendChild(textElement); element.appendChild(categoryHeaderElement); } @Override public Element renderCategory(final Category<ClasspathEntryDto> category) { DivElement categoryHeaderElement = Document.get().createDivElement(); categoryHeaderElement.setClassName(classpathResources.getCss().categoryHeader()); SpanElement iconElement = Document.get().createSpanElement(); categoryHeaderElement.appendChild(iconElement); SpanElement textElement = Document.get().createSpanElement(); categoryHeaderElement.appendChild(textElement); Element text = createNameOfElement(category.getTitle()); text.addClassName(classpathResources.getCss().classpathCategoryLabel()); textElement.appendChild(text); final SpanElement buttonElement = Document.get().createSpanElement(); buttonElement.addClassName(classpathResources.getCss().removeButton()); buttonElement.appendChild(classpathResources.removeNode().getSvg().getElement()); buttonElement.getStyle().setVisibility(HIDDEN); categoryHeaderElement.appendChild(buttonElement); Event.sinkEvents(categoryHeaderElement, Event.MOUSEEVENTS); Event.setEventListener(categoryHeaderElement, new EventListener() { @Override public void onBrowserEvent(Event event) { if (!delegate.isPlainJava() || !category.getData().isEmpty()) { return; } if (Event.ONMOUSEOVER == event.getTypeInt()) { buttonElement.getStyle().setVisibility(Style.Visibility.VISIBLE); } else if (Event.ONMOUSEOUT == event.getTypeInt()) { buttonElement.getStyle().setVisibility(HIDDEN); } } }); Event.sinkEvents(buttonElement, Event.ONCLICK); Event.setEventListener(buttonElement, new EventListener() { @Override public void onBrowserEvent(Event event) { if (Event.ONCLICK == event.getTypeInt()) { event.stopPropagation(); delegate.onRemoveClicked(category.getTitle()); } } }); if (category.getData().isEmpty()) { iconElement.appendChild(category.getTitle().endsWith(".jar") ? javaResources.jarFileIcon().getSvg().getElement() : nodesResources.simpleFolder().getSvg().getElement()); } else { iconElement.appendChild(javaResources.externalLibraries().getSvg().getElement()); } return categoryHeaderElement; } }; private Element createNameOfElement(String fullPath) { DivElement textElement = Document.get().createDivElement(); int lastSeparator = fullPath.lastIndexOf('/'); if (lastSeparator < 0 || !fullPath.endsWith(".jar")) { textElement.setInnerText(fullPath); return textElement; } String name = fullPath.substring(lastSeparator + 1); String path = fullPath.substring(0, lastSeparator); textElement.setInnerText(name + " - " + path); return textElement; } private CategoriesList list; private List<Category<?>> categoriesList; private ActionDelegate delegate; @Inject public LibEntryViewImpl(org.eclipse.che.ide.Resources resources, JavaResources javaResources, NodesResources nodesResources, ProjectClasspathResources classpathResources) { this.javaResources = javaResources; this.nodesResources = nodesResources; this.classpathResources = classpathResources; styles = classpathResources.getCss(); styles.ensureInjected(); initWidget(ourUiBinder.createAndBindUi(this)); list = new CategoriesList(resources); categoriesList = new ArrayList<>(); libraryPanel.add(list); addJarBtn.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { delegate.onAddJarClicked(); } }); } @Override public void setDelegate(ActionDelegate delegate) { this.delegate = delegate; } @Override public void renderLibraries() { list.clear(); list.render(categoriesList, false); } @Override public void setData(Map<String, ClasspathEntryDto> data) { categoriesList.clear(); for (Map.Entry<String, ClasspathEntryDto> elem : data.entrySet()) { categoriesList.add(new Category<>(elem.getKey(), classpathEntryRenderer, elem.getValue().getExpandedEntries(), librariesDelegate)); reverse(categoriesList); } } @Override public void setAddJarButtonState(boolean enabled) { addJarBtn.setEnabled(enabled); } interface LibPropertyViewImplUiBinder extends UiBinder<Widget, LibEntryViewImpl> { } }