/*******************************************************************************
* Copyright (c) 2004, 2012 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.dialogs.cpaths;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.layout.PixelConverter;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.ICModel;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.IPathEntry;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.internal.ui.ICHelpContextIds;
import org.eclipse.cdt.internal.ui.wizards.dialogfields.CheckedListDialogField;
import org.eclipse.cdt.internal.ui.wizards.dialogfields.DialogField;
import org.eclipse.cdt.internal.ui.wizards.dialogfields.IDialogFieldListener;
import org.eclipse.cdt.internal.ui.wizards.dialogfields.LayoutUtil;
import org.eclipse.cdt.internal.ui.wizards.dialogfields.ListDialogField;
/**
* Projects tab for C/C++ Project Paths page for 3.X projects.
*
* @deprecated as of CDT 4.0. This tab was used for property pages
* for 3.X style projects.
*/
@Deprecated
public class CPathProjectsEntryPage extends CPathBasePage {
private CheckedListDialogField<CPElement> fProjectsList;
ICProject fCurrCProject;
private ListDialogField<CPElement> fCPathList;
public CPathProjectsEntryPage(ListDialogField<CPElement> cPathList) {
super(CPathEntryMessages.ProjectsEntryPage_title);
setDescription(CPathEntryMessages.ProjectsEntryPage_description);
ProjectsListListener listener = new ProjectsListListener();
String[] buttonLabels = new String[] { CPathEntryMessages.ProjectsEntryPage_projects_checkall_button,
CPathEntryMessages.ProjectsEntryWorkbookPage_projects_uncheckall_button};
fProjectsList = new CheckedListDialogField<CPElement>(null, buttonLabels, new CPElementLabelProvider());
fProjectsList.setDialogFieldListener(listener);
fProjectsList.setLabelText(CPathEntryMessages.ProjectsEntryPage_projects_label);
fProjectsList.setCheckAllButtonIndex(0);
fProjectsList.setUncheckAllButtonIndex(1);
fProjectsList.setViewerComparator(new CPElementSorter());
fCPathList = cPathList;
}
@Override
public Image getImage() {
return PlatformUI.getWorkbench().getSharedImages().getImage(IDE.SharedImages.IMG_OBJ_PROJECT);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.cdt.ui.dialogs.ICOptionPage#performApply(org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void performApply(IProgressMonitor monitor) throws CoreException {
}
/*
* (non-Javadoc)
*
* @see org.eclipse.cdt.ui.dialogs.ICOptionPage#performDefaults()
*/
@Override
public void performDefaults() {
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
*/
@Override
public void createControl(Composite parent) {
PixelConverter converter = new PixelConverter(parent);
Composite composite = new Composite(parent, SWT.NONE);
setControl(composite);
LayoutUtil.doDefaultLayout(composite, new DialogField[] { fProjectsList}, true);
LayoutUtil.setHorizontalGrabbing(fProjectsList.getListControl(null), true);
int buttonBarWidth = converter.convertWidthInCharsToPixels(24);
fProjectsList.setButtonsMinWidth(buttonBarWidth);
CUIPlugin.getDefault().getWorkbench().getHelpSystem().setHelp(composite, ICHelpContextIds.PROJECT_PATHS_PROJECTS);
}
private class ProjectsListListener implements IDialogFieldListener {
// ---------- IDialogFieldListener --------
@Override
public void dialogFieldChanged(DialogField field) {
if (fCurrCProject != null) {
// already initialized
updateCPathList();
}
}
}
public void init(ICProject cproject) {
updateProjectsList(cproject);
}
void updateProjectsList(ICProject currCProject) {
ICModel cmodel = currCProject.getCModel();
List<CPElement> projects = new ArrayList<CPElement>();
final List<CPElement> checkedProjects = new ArrayList<CPElement>();
try {
ICProject[] cprojects = cmodel.getCProjects();
// a vector remembering all projects that dont have to be added anymore
List<IResource> existingProjects = new ArrayList<IResource>(cprojects.length);
existingProjects.add(currCProject.getProject());
// add the projects-cpentries that are already on the C Path
List<CPElement> cpelements = fCPathList.getElements();
for (int i = cpelements.size() - 1; i >= 0; i--) {
CPElement cpelem = cpelements.get(i);
if (isEntryKind(cpelem.getEntryKind())) {
existingProjects.add(cpelem.getResource());
projects.add(cpelem);
checkedProjects.add(cpelem);
}
}
for (ICProject cproject : cprojects) {
IProject proj = cproject.getProject();
if (!existingProjects.contains(proj)) {
projects.add(new CPElement(fCurrCProject, IPathEntry.CDT_PROJECT, proj.getFullPath(), proj));
}
}
} catch (CModelException e) {
CUIPlugin.log(e);
}
fProjectsList.setElements(projects);
fProjectsList.setCheckedElements(checkedProjects);
fCurrCProject = currCProject;
}
void updateCPathList() {
List<CPElement> projelements = fProjectsList.getCheckedElements();
boolean remove = false;
List<CPElement> pelements = fCPathList.getElements();
// backwards, as entries will be deleted
for (int i = pelements.size() - 1; i >= 0; i--) {
CPElement pe = pelements.get(i);
if (isEntryKind(pe.getEntryKind())) {
if (!projelements.remove(pe)) {
pelements.remove(i);
remove = true;
}
}
}
for (int i = 0; i < projelements.size(); i++) {
pelements.add(projelements.get(i));
}
if (remove || (projelements.size() > 0)) {
fCPathList.setElements(pelements);
}
}
/*
* @see BuildPathBasePage#getSelection
*/
@Override
public List<CPElement> getSelection() {
return fProjectsList.getSelectedElements();
}
/*
* @see BuildPathBasePage#setSelection
*/
@Override
public void setSelection(List<?> selElements) {
fProjectsList.selectElements(new StructuredSelection(selElements));
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jdt.internal.ui.wizards.buildpaths.BuildPathBasePage#isEntryKind(int)
*/
@Override
public boolean isEntryKind(int kind) {
return kind == IPathEntry.CDT_PROJECT;
}
}