/*******************************************************************************
* 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.ui.list;
import com.google.gwt.dom.client.Element;
import com.google.gwt.resources.client.ClientBundle;
import com.google.gwt.resources.client.CssResource;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel;
import org.vectomatic.dom.svg.ui.SVGResource;
import java.util.ArrayList;
import java.util.List;
/**
* @author Evgen Vidolob
* @author Vitaliy Guliy
*/
public class CategoriesList extends Composite {
/** Defines the attribute used to indicate selection. */
private static final String SELECTED_ATTRIBUTE = "SELECTED";
private final Resources resources;
private final SelectionManager selectionManager;
private List<CategoryNodeElement> categoryNodeElements;
private FlowPanel rootPanel;
private FlowPanel scrollPanel;
private FlowPanel lockPanel;
private boolean enabled = true;
public CategoriesList(Resources resources) {
this.resources = resources;
this.categoryNodeElements = new ArrayList<>();
rootPanel = new FlowPanel();
rootPanel.setStyleName(resources.defaultCategoriesListCss().rootPanel());
initWidget(rootPanel);
scrollPanel = new FlowPanel();
scrollPanel.setStyleName(resources.defaultCategoriesListCss().scrollPanel());
rootPanel.add(scrollPanel);
lockPanel = new FlowPanel();
lockPanel.setStyleName(resources.defaultCategoriesListCss().lockPanel());
lockPanel.setVisible(false);
rootPanel.add(lockPanel);
selectionManager = new SelectionManager();
}
/**
* Refreshes list of items.
* <p/>
* <p>This method tries to keep selection.
*
* @param categories
* the categories
* @param renderChildren
* if is true - child node will be expanded, otherwise only root node.
*/
public void render(List<Category<?>> categories, boolean renderChildren) {
this.categoryNodeElements = new ArrayList<>();
for (Category category : categories) {
CategoryNodeElement categoryNodeElement = new CategoryNodeElement(category, renderChildren, selectionManager, resources);
categoryNodeElements.add(categoryNodeElement);
scrollPanel.add(categoryNodeElement);
}
}
/**
* Select object in the list.
*
* @param element
* @return
*/
public boolean selectElement(Object element) {
if (categoryNodeElements == null || categoryNodeElements.isEmpty()) {
return false;
}
for (CategoryNodeElement category : categoryNodeElements) {
if (category.containsItem(element)) {
category.selectItem(element);
return true;
}
}
return false;
}
/**
* Clears list of items.
*/
public void clear() {
scrollPanel.clear();
categoryNodeElements = null;
}
/**
* Enables ot disables this widget.
*
* @param enabled
* enabled state
*/
public void setEnabled(boolean enabled) {
if (enabled) {
lockPanel.setVisible(false);
scrollPanel.getElement().getStyle().clearProperty("opacity");
} else {
lockPanel.setVisible(true);
scrollPanel.getElement().getStyle().setProperty("opacity", "0.5");
}
this.enabled = enabled;
}
class SelectionManager {
private Element selectedItem;
public void selectItem(Element item) {
if (selectedItem != null) {
selectedItem.removeAttribute(SELECTED_ATTRIBUTE);
}
selectedItem = item;
selectedItem.setAttribute(SELECTED_ATTRIBUTE, SELECTED_ATTRIBUTE);
}
}
/** Item style selectors for a categories list item. */
public interface Css extends CssResource {
String rootPanel();
String scrollPanel();
String lockPanel();
String categoryItem();
String category();
String categoryLabel();
String expandControl();
String categoryHeader();
String expandedImage();
String itemContainer();
String headerText();
}
public interface Resources extends ClientBundle {
@Source({"CategoriesList.css", "org/eclipse/che/ide/ui/constants.css", "org/eclipse/che/ide/api/ui/style.css"})
Css defaultCategoriesListCss();
@Source("arrowExpansionIcon.svg")
SVGResource arrowExpansionImage();
}
}