/*******************************************************************************
* 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;
import elemental.events.KeyboardEvent;
import com.google.gwt.core.client.GWT;
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.event.dom.client.KeyDownEvent;
import com.google.gwt.event.dom.client.KeyDownHandler;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.SimplePanel;
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.JavaLocalizationConstant;
import org.eclipse.che.ide.ext.java.client.project.classpath.valueproviders.pages.ClasspathPagePresenter;
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 org.eclipse.che.ide.ui.window.Window;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* The implementation of {@link ProjectClasspathView}.
*
* @author Valeriy Svydenko
*/
@Singleton
public class ProjectClasspathViewImpl extends Window implements ProjectClasspathView {
private static final PropertiesViewImplUiBinder UI_BINDER = GWT.create(PropertiesViewImplUiBinder.class);
private final JavaLocalizationConstant localization;
private final ProjectClasspathResources commandResources;
private Button doneButton;
private ActionDelegate delegate;
private CategoriesList list;
@UiField
SimplePanel categoriesPanel;
@UiField
SimplePanel contentPanel;
@Inject
protected ProjectClasspathViewImpl(org.eclipse.che.ide.Resources resources,
JavaLocalizationConstant localization,
ProjectClasspathResources commandResources) {
this.localization = localization;
this.commandResources = commandResources;
Map<Object, List<Object>> categories = new HashMap<>();
commandResources.getCss().ensureInjected();
setWidget(UI_BINDER.createAndBindUi(this));
setTitle(localization.projectClasspathTitle());
getWidget().getElement().setId("classpathManagerView");
list = new CategoriesList(resources);
list.addDomHandler(new KeyDownHandler() {
@Override
public void onKeyDown(KeyDownEvent event) {
switch (event.getNativeKeyCode()) {
case KeyboardEvent.KeyCode.INSERT:
break;
case KeyboardEvent.KeyCode.DELETE:
break;
}
}
}, KeyDownEvent.getType());
categoriesPanel.add(list);
contentPanel.clear();
createButtons();
getWidget().getElement().getStyle().setPadding(0, Style.Unit.PX);
}
@Override
public void setDelegate(ActionDelegate delegate) {
this.delegate = delegate;
}
@Override
public void show() {
super.show();
super.setHideOnEscapeEnabled(true);
doneButton.setFocus(true);
}
@Override
public void hideWindow() {
this.hide();
}
@Override
public AcceptsOneWidget getConfigurationsContainer() {
return contentPanel;
}
@Override
public void setDoneButtonInFocus() {
doneButton.setFocus(true);
}
@Override
protected void onEnterClicked() {
delegate.onEnterClicked();
}
@Override
protected void onClose() {
delegate.onCloseClicked();
super.onClose();
}
@Override
public boolean isDoneButtonInFocus() {
return isWidgetFocused(doneButton);
}
@Override
public void setPages(Map<String, Set<ClasspathPagePresenter>> properties) {
List<Category<?>> categoriesList = new ArrayList<>();
for (Map.Entry<String, Set<ClasspathPagePresenter>> entry : properties.entrySet()) {
categoriesList.add(new Category<>(entry.getKey(),
projectPropertiesRenderer,
entry.getValue(),
projectPropertiesDelegate));
}
list.render(categoriesList, true);
}
@Override
public void selectPage(ClasspathPagePresenter property) {
list.selectElement(property);
}
private void createButtons() {
doneButton = createPrimaryButton(localization.buttonDone(), "window-edit-configurations-close",
new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
delegate.onDoneClicked();
}
});
addButtonToFooter(doneButton);
Element dummyFocusElement = DOM.createSpan();
dummyFocusElement.setTabIndex(0);
getFooter().getElement().appendChild(dummyFocusElement);
}
private final CategoryRenderer<ClasspathPagePresenter> projectPropertiesRenderer =
new CategoryRenderer<ClasspathPagePresenter>() {
@Override
public void renderElement(Element element, ClasspathPagePresenter data) {
element.setInnerText(data.getTitle());
}
@Override
public SpanElement renderCategory(Category<ClasspathPagePresenter> category) {
SpanElement spanElement = Document.get().createSpanElement();
spanElement.setClassName(commandResources.getCss().categoryHeader());
spanElement.setInnerText(category.getTitle());
return spanElement;
}
};
private final Category.CategoryEventDelegate<ClasspathPagePresenter> projectPropertiesDelegate =
new Category.CategoryEventDelegate<ClasspathPagePresenter>() {
@Override
public void onListItemClicked(Element listItemBase, ClasspathPagePresenter itemData) {
delegate.onConfigurationSelected(itemData);
}
};
interface PropertiesViewImplUiBinder extends UiBinder<Widget, ProjectClasspathViewImpl> {
}
}