/*******************************************************************************
* Copyright (c) 2009 QNX Software Systems and others.
* 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:
* QNX Software Systems - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.ui.workingsets;
import java.util.Set;
import org.eclipse.jface.resource.FontDescriptor;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.resource.LocalResourceManager;
import org.eclipse.jface.resource.ResourceManager;
import org.eclipse.jface.viewers.IFontProvider;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
import org.eclipse.cdt.ui.CDTSharedImages;
import org.eclipse.cdt.internal.ui.workingsets.IWorkingSetProjectConfiguration.ISnapshot;
/**
* Default implementation of the working set project configuration controller protocol.
*
* @author Christian W. Damus (cdamus)
*
* @since 6.0
*
*/
public class ProjectConfigurationController implements IWorkingSetProjectConfigurationController {
private IWorkingSetProjectConfiguration.ISnapshot config;
/**
* Initializes me with my project configuration.
*
* @param config
* my project configuration
*/
public ProjectConfigurationController(IWorkingSetProjectConfiguration.ISnapshot config) {
this.config = config;
}
public ISnapshot getProjectConfiguration() {
return config;
}
public void checkStateChanged(Object element, boolean checked, IControllerContext context) {
if (!context.isReadOnly() && (element instanceof ICConfigurationDescription)) {
ICConfigurationDescription newSel = (ICConfigurationDescription) element;
ICConfigurationDescription oldSel = getProjectConfiguration().resolveSelectedConfiguration();
boolean oldActive = getProjectConfiguration().isActive();
if (checked) {
if (newSel != oldSel) {
getProjectConfiguration().setSelectedConfigurationID(newSel.getId());
if (oldSel != null) {
context.setChecked(oldSel, false);
}
}
} else if (newSel == oldSel) {
// cannot just uncheck the current selection
context.setChecked(oldSel, true);
}
boolean newActive = getProjectConfiguration().isActive();
if (oldActive != newActive) {
context.activationStateChanged(getProjectConfiguration());
}
} else {
// cannot change the check-state of these nodes
context.setChecked(element, !checked);
}
}
public void updateCheckState(IControllerContext context) {
ICConfigurationDescription sel = getProjectConfiguration().resolveSelectedConfiguration();
if (sel != null) {
context.setChecked(sel, true);
}
// gray the project node
context.setGrayed(getProjectConfiguration(), true);
}
public ITreeContentProvider getContentProvider() {
return new ContentProvider(getProjectConfiguration());
}
public ILabelProvider getLabelProvider(Viewer viewer) {
return new LabelProvider(viewer, getProjectConfiguration());
}
//
// Nested classes
//
private static class ContentProvider implements ITreeContentProvider {
private static final Object[] NO_OBJECTS = new Object[0];
private IWorkingSetProjectConfiguration project;
private Set<ICConfigurationDescription> configs;
ContentProvider(IWorkingSetProjectConfiguration project) {
this.project = project;
this.configs = new java.util.HashSet<ICConfigurationDescription>(project.resolveConfigurations());
}
public Object[] getChildren(Object parentElement) {
return (parentElement == project) ? project.resolveConfigurations().toArray() : NO_OBJECTS;
}
public Object getParent(Object element) {
return (element == project) ? null : configs.contains(element) ? project : null;
}
public boolean hasChildren(Object element) {
return element == project;
}
public Object[] getElements(Object inputElement) {
return new Object[] { project };
}
public void dispose() {
// nothing to dispose
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
// nothing to do
}
}
private static class LabelProvider extends org.eclipse.jface.viewers.LabelProvider implements
IFontProvider {
private IWorkingSetProjectConfiguration.ISnapshot projectConfig;
private WorkbenchLabelProvider wbLabels = new WorkbenchLabelProvider();
private Image configImage = CDTSharedImages.getImage(CDTSharedImages.IMG_OBJS_CONFIG);
private Font defaultFont;
private ResourceManager fonts = new LocalResourceManager(JFaceResources.getResources());
LabelProvider(Viewer viewer, IWorkingSetProjectConfiguration.ISnapshot projectConfig) {
this.projectConfig = projectConfig;
this.defaultFont = viewer.getControl().getFont();
}
@Override
public String getText(Object element) {
if (element instanceof ICConfigurationDescription) {
ICConfigurationDescription config = (ICConfigurationDescription) element;
return isActiveInWorkspace(config) ? NLS.bind(
WorkingSetMessages.ProjConfigController_activeConfig, config.getName()) : config
.getName();
} else if (element instanceof IWorkingSetProjectConfiguration) {
return wbLabels.getText(((IWorkingSetProjectConfiguration) element).resolveProject());
}
return wbLabels.getText(element);
}
@Override
public Image getImage(Object element) {
if (element instanceof ICConfigurationDescription) {
return configImage;
} else if (element instanceof IWorkingSetProjectConfiguration) {
return wbLabels.getImage(((IWorkingSetProjectConfiguration) element).resolveProject());
}
return wbLabels.getImage(element);
}
public Font getFont(Object element) {
if (element instanceof ICConfigurationDescription) {
ICConfigurationDescription config = (ICConfigurationDescription) element;
if (isActiveInWorkspace(config)) {
FontDescriptor desc = FontDescriptor.createFrom(defaultFont);
return (Font) fonts.get(desc.withStyle(SWT.BOLD));
}
}
return wbLabels.getFont(element);
}
private boolean isActiveInWorkspace(ICConfigurationDescription config) {
WorkspaceSnapshot workspace = projectConfig.getWorkspaceSnapshot();
return workspace.getState(projectConfig.resolveProject()).isActive(config.getId());
}
@Override
public void dispose() {
wbLabels.dispose();
fonts.dispose();
super.dispose();
}
}
}