/******************************************************************************* * Copyright (c) 2004, 2010 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.lang.reflect.InvocationTargetException; import org.eclipse.cdt.core.CProjectNature; import org.eclipse.cdt.core.model.CModelException; import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.resources.IPathEntryStore; import org.eclipse.cdt.core.resources.IPathEntryStoreListener; import org.eclipse.cdt.core.resources.PathEntryStoreChangedEvent; import org.eclipse.cdt.internal.ui.dialogs.IStatusChangeListener; import org.eclipse.cdt.internal.ui.dialogs.StatusUtil; import org.eclipse.cdt.internal.ui.util.ExceptionHandler; import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.actions.WorkspaceModifyDelegatingOperation; import org.eclipse.ui.dialogs.PropertyPage; /** * C/C++ Include Paths and Symbols page for 3.X projects. * * This page lives dormant as of writing (CDT 7.0) but may get activated for * {@code org.eclipse.cdt.make.core.makeNature} project (3.X style). * * @deprecated as of CDT 4.0. */ @Deprecated public class IncludesSymbolsPropertyPage extends PropertyPage implements IStatusChangeListener, IPathEntryStoreListener { private static final String PAGE_SETTINGS = "IncludeSysmbolsPropertyPage"; //$NON-NLS-1$ private static final String INDEX = "pageIndex"; //$NON-NLS-1$ NewIncludesSymbolsTabBlock fIncludesSymbolsBlock; IPathEntryStore fStore; @Override protected Control createContents(Composite parent) { IProject project = getProject(); Control result; if (project == null || !isCProject(project)) { result = createWithoutCProject(parent); } else if (!project.isOpen()) { result = createForClosedProject(parent); } else { try { fStore = CoreModel.getPathEntryStore(getProject()); fStore.addPathEntryStoreListener(this); } catch (CoreException e) { } result = createWithCProject(parent, project); } Dialog.applyDialogFont(result); noDefaultAndApplyButton(); return result; } private IDialogSettings getSettings() { IDialogSettings cSettings = CUIPlugin.getDefault().getDialogSettings(); IDialogSettings pageSettings = cSettings.getSection(PAGE_SETTINGS); if (pageSettings == null) { pageSettings = cSettings.addNewSection(PAGE_SETTINGS); pageSettings.put(INDEX, 3); } return pageSettings; } /* * Content for valid projects. */ private Control createWithCProject(Composite parent, IProject project) { fIncludesSymbolsBlock = new NewIncludesSymbolsTabBlock(this, getSettings().getInt(INDEX)); fIncludesSymbolsBlock.init(getCElement(), null); return fIncludesSymbolsBlock.createContents(parent); } /* * Content for non-C projects. */ private Control createWithoutCProject(Composite parent) { Label label = new Label(parent, SWT.LEFT); label.setText(CPathEntryMessages.CPathsPropertyPage_no_C_project_message); fIncludesSymbolsBlock = null; setValid(true); return label; } /* * Content for closed projects. */ private Control createForClosedProject(Composite parent) { Label label = new Label(parent, SWT.LEFT); label.setText(CPathEntryMessages.CPathsPropertyPage_closed_project_message); fIncludesSymbolsBlock = null; setValid(true); return label; } /* * (non-Javadoc) * * @see org.eclipse.jface.dialogs.IDialogPage#dispose() */ @Override public void dispose() { if (fStore != null) { fStore.removePathEntryStoreListener(this); } } @Override public void setVisible(boolean visible) { if (fIncludesSymbolsBlock != null) { if (!visible) { if (fIncludesSymbolsBlock.hasChangesInDialog()) { String title = CPathEntryMessages.CPathsPropertyPage_unsavedchanges_title; String message = CPathEntryMessages.CPathsPropertyPage_unsavedchanges_message; String[] buttonLabels = new String[]{ CPathEntryMessages.CPathsPropertyPage_unsavedchanges_button_save, CPathEntryMessages.CPathsPropertyPage_unsavedchanges_button_discard, }; MessageDialog dialog = new MessageDialog(getShell(), title, null, message, MessageDialog.QUESTION, buttonLabels, 0); int res = dialog.open(); if (res == 0) { performOk(); } else if (res == 1) { fIncludesSymbolsBlock.init(getCElement(), null); } } } else { if (!fIncludesSymbolsBlock.hasChangesInDialog() && fIncludesSymbolsBlock.hasChangesInCPathFile()) { fIncludesSymbolsBlock.init(getCElement(), null); } } } super.setVisible(visible); } private IProject getProject() { IAdaptable adaptable = getElement(); if (adaptable != null) { IResource resource = (IResource)adaptable.getAdapter(IResource.class); return resource.getProject(); } return null; } protected ICElement getCElement() { IAdaptable adaptable = getElement(); if (adaptable != null) { ICElement elem = (ICElement)adaptable.getAdapter(ICElement.class); return elem; } return null; } private boolean isCProject(IProject proj) { try { return proj.hasNature(CProjectNature.C_NATURE_ID); } catch (CoreException e) { CUIPlugin.log(e); } return false; } /* * @see IPreferencePage#performOk */ @Override public boolean performOk() { if (fIncludesSymbolsBlock != null) { getSettings().put(INDEX, fIncludesSymbolsBlock.getPageIndex()); Shell shell = getControl().getShell(); IRunnableWithProgress runnable = new IRunnableWithProgress() { public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { try { fIncludesSymbolsBlock.configureCProject(monitor); } catch (CoreException e) { throw new InvocationTargetException(e); } } }; IRunnableWithProgress op = new WorkspaceModifyDelegatingOperation(runnable); try { new ProgressMonitorDialog(shell).run(true, true, op); } catch (InvocationTargetException e) { String title = CPathEntryMessages.CPathsPropertyPage_error_title; String message = CPathEntryMessages.CPathsPropertyPage_error_message; ExceptionHandler.handle(e, shell, title, message); return false; } catch (InterruptedException e) { // cancelled return false; } } return true; } /* * (non-Javadoc) * * @see IStatusChangeListener#statusChanged */ public void statusChanged(IStatus status) { setValid(!status.matches(IStatus.ERROR)); StatusUtil.applyToStatusLine(this, status); } /* * (non-Javadoc) * * @see org.eclipse.jface.preference.IPreferencePage#performCancel() */ @Override public boolean performCancel() { if (fIncludesSymbolsBlock != null) { getSettings().put(INDEX, fIncludesSymbolsBlock.getPageIndex()); } return super.performCancel(); } /* * (non-Javadoc) * * @see org.eclipse.cdt.core.resources.IPathEntryStoreListener#pathEntryStoreChanged(org.eclipse.cdt.core.resources.PathEntryStoreChangedEvent) */ public void pathEntryStoreChanged(PathEntryStoreChangedEvent event) { if (event.hasContentChanged()) { Control control = getControl(); if (control != null && !control.isDisposed()) { control.getDisplay().asyncExec(new Runnable() { public void run() { Control control = getControl(); if (control != null && !control.isDisposed()) { try { fIncludesSymbolsBlock.init(getCElement(), fIncludesSymbolsBlock.getRawCPath()); } catch (CModelException e) { CUIPlugin.log(e); } } } }); } } } }