/******************************************************************************* * This file is protected by Copyright. * Please refer to the COPYRIGHT file distributed with this source distribution. * * This file is part of REDHAWK IDE. * * 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 *******************************************************************************/ package gov.redhawk.frontend.ui.internal.section; import gov.redhawk.frontend.ListenerAllocation; import gov.redhawk.frontend.TunerStatus; import gov.redhawk.frontend.UnallocatedTunerContainer; import gov.redhawk.frontend.provider.FrontendItemProviderAdapterFactory; import gov.redhawk.frontend.ui.internal.TunerStatusFilter; import gov.redhawk.frontend.util.TunerProperties.TunerStatusAllocationProperties; import gov.redhawk.frontend.util.TunerUtils; import gov.redhawk.model.sca.ScaAbstractProperty; import gov.redhawk.model.sca.ScaSimpleProperty; import gov.redhawk.model.sca.commands.ScaModelCommand; import gov.redhawk.sca.ui.ScaModelAdapterFactoryLabelProvider; import gov.redhawk.sca.ui.ScaPropertiesEditingSupport; import gov.redhawk.sca.ui.ScaPropertiesViewer; import gov.redhawk.sca.ui.ScaPropertiesViewerColumnLabelProvider; import gov.redhawk.sca.ui.properties.AbstractPropertyEditingSupport; import gov.redhawk.sca.ui.properties.ScaPropertiesContentProvider; import java.util.ArrayList; import java.util.List; import org.eclipse.emf.common.notify.AdapterFactory; import org.eclipse.emf.edit.provider.ComposedAdapterFactory; import org.eclipse.jface.viewers.CellLabelProvider; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.ViewerCell; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.views.properties.IPropertySourceProvider; /** * */ public class TunerStatusProperitesViewer extends ScaPropertiesViewer { private TunerStatus tuner; public TunerStatusProperitesViewer(Composite parent, int style, int treeStyle, AdapterFactory adapterFactory) { super(parent, style, treeStyle, adapterFactory); } public TunerStatusProperitesViewer(Composite parent, int style, int treeStyle) { super(parent, style, treeStyle); } @Override protected AdapterFactory createAdapterFactory() { ComposedAdapterFactory factory = new ComposedAdapterFactory(); factory.addAdapterFactory(super.createAdapterFactory()); factory.addAdapterFactory(new FrontendItemProviderAdapterFactory()); return factory; } @Override protected void init(Composite parent, int style) { super.init(parent, style); getViewer().setFilters(new ViewerFilter[] { new TunerStatusFilter() }); } @Override protected ITreeContentProvider createContentProvider() { return new ScaPropertiesContentProvider(getAdapterFactory()) { @Override public Object[] getElements(Object object) { if (object instanceof TunerStatus) { return ((TunerStatus) object).getSimples().toArray(); } else if (object instanceof UnallocatedTunerContainer) { List<String[]> elements = new ArrayList<String[]>(); UnallocatedTunerContainer container = (UnallocatedTunerContainer) object; elements.add(new String[] { "Unallocated " + container.getTunerType(), container.getCount() + " available" }); return elements.toArray(); } else if (object instanceof ListenerAllocation) { List<String[]> elements = new ArrayList<String[]>(); elements.add(new String[] { "Listener ID", ((ListenerAllocation) object).getListenerID() }); elements.add(new String[] { "Existing Tuner ID", TunerUtils.getControlId(((ListenerAllocation) object).getTunerStatus()) }); return elements.toArray(); } return super.getElements(object); } }; } @Override protected ILabelProvider createRootLabelProvider() { return new ScaModelAdapterFactoryLabelProvider(getAdapterFactory(), getViewer()) { @Override public Color getForeground(Object object) { if (object instanceof ScaAbstractProperty< ? >) { ScaAbstractProperty< ? > prop = (ScaAbstractProperty< ? >) object; TunerStatusAllocationProperties statusProp = TunerStatusAllocationProperties.fromPropID(prop.getId()); if (statusProp != null && statusProp.isEditable()) { return getViewer().getControl().getForeground(); } } return Display.getCurrent().getSystemColor(SWT.COLOR_DARK_GRAY); } @Override public Color getForeground(Object object, int columnIndex) { return getForeground(object); } }; } @Override protected CellLabelProvider createPropertyColumnLabelProvider(ILabelProvider rootLabelProvider) { return new ScaPropertiesViewerColumnLabelProvider(rootLabelProvider) { @Override public void update(ViewerCell cell) { if (cell.getElement() instanceof ScaAbstractProperty< ? >) { super.update(cell); ScaAbstractProperty< ? > prop = (ScaAbstractProperty< ? >) cell.getElement(); TunerStatusAllocationProperties statusProp = TunerStatusAllocationProperties.fromPropID(prop.getId()); if (statusProp != null) { cell.setText(statusProp.getName()); } } else if (cell.getElement() instanceof String[]) { cell.setText(((String[]) cell.getElement())[0]); } else if (cell.getElement() instanceof TunerStatus) { cell.setText("Allocated " + ((TunerStatus) cell.getElement()).getTunerType()); } else if (cell.getElement() instanceof UnallocatedTunerContainer) { cell.setText("Unallocated " + ((UnallocatedTunerContainer) cell.getElement()).getTunerType()); } else if (cell.getElement() instanceof ListenerAllocation) { cell.setText("Listener"); } else { super.update(cell); } } }; } @Override protected CellLabelProvider createValueColumnLabelProvider(ILabelProvider rootLabelProvider) { return new ScaPropertiesViewerColumnLabelProvider(rootLabelProvider) { @Override public void update(ViewerCell cell) { if (cell.getElement() instanceof String[]) { cell.setText(((String[]) cell.getElement())[1]); } else if (cell.getElement() instanceof TunerStatus) { cell.setText(((TunerStatus) cell.getElement()).getAllocationID()); } else if (cell.getElement() instanceof ListenerAllocation) { cell.setText(((ListenerAllocation) cell.getElement()).getListenerID()); } else if (cell.getElement() instanceof UnallocatedTunerContainer) { UnallocatedTunerContainer container = (UnallocatedTunerContainer) cell.getElement(); cell.setText(container.getCount() + " available"); } else { super.update(cell); } } }; } @Override protected AbstractPropertyEditingSupport createValueColumnEditingSupport() { return new ScaPropertiesEditingSupport(getViewer(), (IPropertySourceProvider) getViewer().getContentProvider()) { @Override protected boolean canEdit(ScaAbstractProperty< ? > prop) { TunerStatusAllocationProperties statusProp = TunerStatusAllocationProperties.fromPropID(prop.getId()); if (statusProp != null) { return statusProp.isEditable(); } return super.canEdit(prop); } @Override protected void setValue(Object object, final Object newValue) { if (object instanceof ScaAbstractProperty< ? >) { final ScaAbstractProperty< ? > prop = (ScaAbstractProperty< ? >) object; final TunerStatusAllocationProperties statusProp = TunerStatusAllocationProperties.fromPropID(prop.getId()); if (statusProp != null && tuner != null) { ScaModelCommand.execute(prop, new ScaModelCommand() { @Override public void execute() { TunerStatusAllocationProperties.updateTunerStatusValue(tuner, statusProp, newValue); try { prop.setIgnoreRemoteSet(true); if (prop instanceof ScaSimpleProperty) { ((ScaSimpleProperty) prop).setValue(newValue); } } finally { prop.setIgnoreRemoteSet(false); } } }); } } } }; } public void setTuner(TunerStatus tuner) { this.tuner = tuner; } public TunerStatus getTuner() { return tuner; } }