/*******************************************************************************
* 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.sources;
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.client.project.classpath.valueproviders.node.NodeWidget;
import org.eclipse.che.ide.ext.java.shared.dto.classpath.ClasspathEntryDto;
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.Collections;
import java.util.List;
import java.util.Map;
import static com.google.gwt.dom.client.Style.Visibility.HIDDEN;
/**
* The implementation of {@link SourceEntryView}.
*
* @author Valeriy Svydenko
*/
@Singleton
public class SourceEntryViewImpl extends Composite implements SourceEntryView {
private static SourceEntryViewImplUiBinder ourUiBinder = GWT.create(SourceEntryViewImplUiBinder.class);
private final JavaResources javaResources;
private final ProjectClasspathResources classpathResources;
@UiField(provided = true)
ProjectClasspathResources.ClasspathStyles styles;
@UiField
FlowPanel buttonsPanel;
@UiField
FlowPanel sourcePanel;
@UiField
Button addSourceBtn;
private final Category.CategoryEventDelegate<ClasspathEntryDto> librariesDelegate =
new Category.CategoryEventDelegate<ClasspathEntryDto>() {
@Override
public void onListItemClicked(Element listItemBase, ClasspathEntryDto itemData) {
}
};
private final CategoryRenderer<ClasspathEntryDto> classpathEntryRenderer = new CategoryRenderer<ClasspathEntryDto>() {
@Override
public void renderElement(Element element, ClasspathEntryDto data) {
}
@Override
public Element renderCategory(final Category<ClasspathEntryDto> category) {
DivElement categoryHeaderElement = Document.get().createDivElement();
categoryHeaderElement.setClassName(classpathResources.getCss().categoryHeader());
SpanElement iconElement = Document.get().createSpanElement();
iconElement.appendChild(javaResources.sourceFolder().getSvg().getElement());
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()) {
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());
}
}
});
return categoryHeaderElement;
}
};
private Element createNameOfElement(String fullPath) {
DivElement textElement = Document.get().createDivElement();
textElement.setInnerText(fullPath);
return textElement;
}
private ActionDelegate delegate;
private CategoriesList list;
private List<Category<?>> categoriesList;
@Inject
public SourceEntryViewImpl(org.eclipse.che.ide.Resources resources,
JavaResources javaResources,
ProjectClasspathResources classpathResources) {
this.javaResources = javaResources;
this.classpathResources = classpathResources;
styles = classpathResources.getCss();
styles.ensureInjected();
initWidget(ourUiBinder.createAndBindUi(this));
list = new CategoriesList(resources);
categoriesList = new ArrayList<>();
sourcePanel.add(list);
addSourceBtn.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
delegate.onAddSourceClicked();
}
});
}
@Override
public void renderNodes() {
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));
Collections.reverse(categoriesList);
}
}
@Override
public void setDelegate(ActionDelegate delegate) {
this.delegate = delegate;
}
@Override
public void removeNode(NodeWidget nodeWidget) {
sourcePanel.remove(nodeWidget);
}
@Override
public void setAddSourceButtonState(boolean enabled) {
addSourceBtn.setEnabled(enabled);
}
@Override
public void clear() {
sourcePanel.clear();
}
interface SourceEntryViewImplUiBinder extends UiBinder<Widget, SourceEntryViewImpl> {
}
}