org.eclipse.cdt.internal.ui.dialogs.cpaths.CPathPropertyPage.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.cdt.internal.ui.dialogs.cpaths.CPathPropertyPage.java

Source

/*******************************************************************************
 * 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.CoreModel;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.resources.IPathEntryStore;
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.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++ Project Paths page for 3.X projects.
 * 
 * @deprecated as of CDT 4.0. This property page was used to set properties
 * "C/C++ Make Project" for 3.X style 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
public class CPathPropertyPage extends PropertyPage implements IStatusChangeListener {

    private static final String PAGE_SETTINGS = "CPathsPropertyPage"; //$NON-NLS-1$
    private static final String INDEX = "pageIndex"; //$NON-NLS-1$

    CPathTabBlock fCPathsBlock;
    IPathEntryStore fStore;

    @Override
    protected Control createContents(Composite parent) {
        IProject project = getProject();
        Control result;

        // ensure the page has no special buttons
        noDefaultAndApplyButton();
        if (project == null || !isCProject(project)) {
            result = createWithoutCProject(parent);
        } else if (!project.isOpen()) {
            result = createForClosedProject(parent);
        } else {
            result = createWithCProject(parent, project);
        }
        Dialog.applyDialogFont(result);
        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) {
        fCPathsBlock = new CPathTabBlock(this, getSettings().getInt(INDEX));
        fCPathsBlock.init(CoreModel.getDefault().create(project), null);
        return fCPathsBlock.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);

        fCPathsBlock = 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);

        fCPathsBlock = null;
        setValid(true);
        return label;
    }

    @Override
    public void setVisible(boolean visible) {
        if (fCPathsBlock != null) {
            if (!visible) {
                if (fCPathsBlock.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) {
                        fCPathsBlock.init(CoreModel.getDefault().create(getProject()), null);
                    }
                }
            } else {
                if (!fCPathsBlock.hasChangesInDialog() && fCPathsBlock.hasChangesInCPathFile()) {
                    fCPathsBlock.init(CoreModel.getDefault().create(getProject()), null);
                }
            }
        }
        super.setVisible(visible);
    }

    private IProject getProject() {
        IAdaptable adaptable = getElement();
        if (adaptable != null) {
            ICElement elem = (ICElement) adaptable.getAdapter(ICElement.class);
            if (elem instanceof ICProject) {
                return ((ICProject) elem).getProject();
            }
        }
        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 (fCPathsBlock != null) {
            getSettings().put(INDEX, fCPathsBlock.getPageIndex());

            Shell shell = getControl().getShell();
            IRunnableWithProgress runnable = new IRunnableWithProgress() {

                @Override
                public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
                    try {
                        fCPathsBlock.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
     */
    @Override
    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 (fCPathsBlock != null) {
            getSettings().put(INDEX, fCPathsBlock.getPageIndex());
        }
        return super.performCancel();
    }
}