package org.iplantc.phyloviewer.viewer.client.ui; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; import org.iplantc.phyloviewer.client.events.DocumentChangeEvent; import org.iplantc.phyloviewer.client.events.DocumentChangeHandler; import org.iplantc.phyloviewer.client.events.NodeSelectionEvent; import org.iplantc.phyloviewer.client.events.NodeSelectionHandler; import org.iplantc.phyloviewer.shared.model.IDocument; import org.iplantc.phyloviewer.shared.model.INode; import org.iplantc.phyloviewer.shared.render.Defaults; import org.iplantc.phyloviewer.shared.render.style.CompositeStyle; import org.iplantc.phyloviewer.shared.render.style.IStyle; import com.google.gwt.user.client.ui.FlexTable; import com.google.gwt.user.client.ui.HasEnabled; import com.google.gwt.user.client.ui.HasValue; import com.google.gwt.user.client.ui.Widget; public abstract class AbstractElementStyleWidget extends FlexTable implements NodeSelectionHandler, DocumentChangeHandler { private IDocument document; private Set<INode> nodes = Collections.emptySet(); private ArrayList<HasValue<?>> widgets = new ArrayList<HasValue<?>>(); public AbstractElementStyleWidget(IDocument document) { this.document = document; } public void setDocument(IDocument document) { this.document = document; } public IStyle getStyle(INode node) { IStyle style = document.getStyleMap().get(node); if (style == null) { style = new CompositeStyle(String.valueOf(node.getId()), Defaults.DEFAULT_STYLE); document.getStyleMap().put(node, style); } return style; } public Set<INode> getNodes() { return nodes; } protected final void setWidget(int row, int col, HasValue<?> widget) { if (widget instanceof Widget) { widgets.add(widget); setWidget(row, col, (Widget)widget); } } @Override public void onNodeSelection(NodeSelectionEvent event) { AbstractElementStyleWidget.this.nodes = event.getSelectedNodes(); updateWidgets(nodes); } @Override public void onDocumentChange(DocumentChangeEvent event) { this.document = event.getDocument(); } public abstract void updateValues(INode node); private void updateWidgets(Set<INode> selectedNodes) { setEnabled(widgets, true); clearWidgets(widgets); if(selectedNodes.size() == 1) { INode node = selectedNodes.iterator().next(); updateValues(node); } else if(selectedNodes.size() == 0) { setEnabled(widgets, false); } } private void clearWidgets(List<HasValue<?>> widgets) { for (HasValue<?> widget : widgets) { widget.setValue(null, false); } } private void setEnabled(List<HasValue<?>> widgets, boolean enabled) { for (HasValue<?> widget : widgets) { if (widget instanceof HasEnabled) { ((HasEnabled)widget).setEnabled(enabled); } } } }