/* * Copyright (c) 2006 Eclipse.org * * 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: * Dmitry Stadnik - initial API and implementation */ package org.eclipse.gmf.internal.bridge.wizards.pages.simple; import java.util.List; import org.eclipse.emf.common.notify.AdapterFactory; import org.eclipse.emf.ecore.provider.EcoreItemProviderAdapterFactory; import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider; import org.eclipse.gmf.internal.bridge.ui.Plugin; import org.eclipse.gmf.internal.bridge.wizards.pages.simple.ResolvedItem.Resolution; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.CheckboxCellEditor; import org.eclipse.jface.viewers.ICellModifier; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; /** * @author dstadnik */ class DomainModelViewerFactory { private static final String P_NODE = "Node"; //$NON-NLS-1$ private static final String P_LINK = "Link"; //$NON-NLS-1$ private static final String P_LABEL = "Label"; //$NON-NLS-1$ public static TreeViewer createViewer(Tree tree, boolean withLabes) { TreeViewer viewer = new TreeViewer(tree); viewer.setContentProvider(new ResolverContentProvider()); AdapterFactory adapterFactory = new EcoreItemProviderAdapterFactory(); viewer.setLabelProvider(new ResolverLabelProvider(new AdapterFactoryLabelProvider(adapterFactory))); if (withLabes) { viewer.setColumnProperties(new String[] { "no", P_NODE, P_LINK, P_LABEL }); //$NON-NLS-1$ viewer.setCellEditors(new CellEditor[] { null, new CheckboxCellEditor(), new CheckboxCellEditor(), new CheckboxCellEditor() }); } else { viewer.setColumnProperties(new String[] { "no", P_NODE, P_LINK }); //$NON-NLS-1$ viewer.setCellEditors(new CellEditor[] { null, new CheckboxCellEditor(), new CheckboxCellEditor() }); } viewer.setCellModifier(new ResolverCellModifier(viewer, withLabes)); return viewer; } private static class ResolverCellModifier implements ICellModifier { private TreeViewer viewer; private boolean withLabels; public ResolverCellModifier(TreeViewer viewer, boolean withLabels) { this.viewer = viewer; this.withLabels = withLabels; } public Object getValue(Object element, String property) { ResolvedItem item = (ResolvedItem) element; return Boolean.valueOf(item.getResolution() == getResolution(property)); } public boolean canModify(Object element, String property) { ResolvedItem item = (ResolvedItem) element; return !item.isDisabled(); } public void modify(Object element, String property, Object value) { ResolvedItem item = (ResolvedItem) ((TreeItem) element).getData(); Resolution resolution = getResolution(property); if (!item.isPossibleResolution(resolution)) { return; } item.setResolution(((Boolean) value).booleanValue() ? resolution : null); if (withLabels) { viewer.update(item, new String[] { P_NODE, P_LINK, P_LABEL }); } else { viewer.update(item, new String[] { P_NODE, P_LINK }); } } private Resolution getResolution(String property) { if (P_NODE.equals(property)) { return Resolution.NODE; } else if (P_LINK.equals(property)) { return Resolution.LINK; } else if (P_LABEL.equals(property)) { return Resolution.LABEL; } return null; } } private static class ResolverContentProvider implements ITreeContentProvider { public void dispose() { } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } public Object getParent(Object element) { return ((ResolvedItem) element).getParent(); } public Object[] getChildren(Object parentElement) { List<?> children = ((ResolvedItem) parentElement).getChildren(); return children.toArray(); } public boolean hasChildren(Object element) { List<?> children = ((ResolvedItem) element).getChildren(); return !children.isEmpty(); } public Object[] getElements(Object inputElement) { return getChildren(inputElement); } } private static class ResolverLabelProvider extends LabelProvider implements ITableLabelProvider { private ILabelProvider domainLabelProvider; public ResolverLabelProvider(ILabelProvider domainLabelProvider) { this.domainLabelProvider = domainLabelProvider; } public String getColumnText(Object element, int columnIndex) { if (columnIndex == 0) { Object domainRef = ((ResolvedItem) element).getDomainRef(); return domainLabelProvider.getText(domainRef); } else { return null; } } public Image getColumnImage(Object element, int columnIndex) { if (columnIndex == 0) { Object domainRef = ((ResolvedItem) element).getDomainRef(); return domainLabelProvider.getImage(domainRef); } ResolvedItem item = (ResolvedItem) element; Image image = getResolutionImage(element, columnIndex); if (item.isDisabled() && image != null) { return Plugin.getDefault().getImageRegistry().get(Plugin.GRAYED_ICON); } return image; } protected Image getResolutionImage(Object element, int columnIndex) { ResolvedItem item = (ResolvedItem) element; Image checkedIcon = Plugin.getDefault().getImageRegistry().get(Plugin.CHECKED_ICON); Image uncheckedIcon = Plugin.getDefault().getImageRegistry().get(Plugin.UNCHECKED_ICON); if (columnIndex == 1) { if (!item.isPossibleResolution(Resolution.NODE)) { return null; } return Resolution.NODE == item.getResolution() ? checkedIcon : uncheckedIcon; } else if (columnIndex == 2) { if (!item.isPossibleResolution(Resolution.LINK)) { return null; } return Resolution.LINK == item.getResolution() ? checkedIcon : uncheckedIcon; } else if (columnIndex == 3) { if (!item.isPossibleResolution(Resolution.LABEL)) { return null; } return Resolution.LABEL == item.getResolution() ? checkedIcon : uncheckedIcon; } return null; } } }