com.nokia.carbide.cpp.internal.project.ui.mmpEditor.MMPEditor.java Source code

Java tutorial

Introduction

Here is the source code for com.nokia.carbide.cpp.internal.project.ui.mmpEditor.MMPEditor.java

Source

/*
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description: 
*
*/
package com.nokia.carbide.cpp.internal.project.ui.mmpEditor;

import com.nokia.carbide.cdt.builder.*;
import com.nokia.carbide.cdt.builder.project.*;
import com.nokia.carbide.cdt.internal.api.builder.ui.ManageConfigurationsDialog;
import com.nokia.carbide.cpp.epoc.engine.model.IView;
import com.nokia.carbide.cpp.epoc.engine.model.MMPModelFactory;
import com.nokia.carbide.cpp.epoc.engine.model.mmp.IMMPView;
import com.nokia.carbide.cpp.internal.project.ui.editors.common.*;
import com.nokia.cpp.internal.api.utils.core.*;
import com.nokia.cpp.internal.api.utils.ui.*;

import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.*;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.text.IDocument;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.*;
import org.eclipse.ui.forms.editor.IFormPage;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.texteditor.IDocumentProvider;

import java.text.MessageFormat;
import java.util.HashMap;
import java.util.Map;

public class MMPEditor extends CarbideFormEditor implements ICarbideConfigurationChangedListener {

    private final MMPEditorContext editorContext;
    private OverviewPage overviewPage;
    private LibrariesPage librariesPage;
    private SourcesPage sourcesPage;
    private OptionsPage optionsPage;
    // true unless we degrade to text editor only 
    private boolean usingFormPages = true;

    public MMPEditor() {
        editorContext = new MMPEditorContext();
        initializeEditorContext(editorContext);
        CarbideBuilderPlugin.addBuildConfigChangedListener(this);
    }

    public void dispose() {
        CarbideBuilderPlugin.removeBuildConfigChangedListener(this);
        super.dispose();
    }

    /**
     * Creates the pages of the multi-page editor.
     */
    protected void addPages() {
        try {
            if (usingFormPages) {
                createOverviewPage();
                createSourcesPage();
                createLibrariesPage();
                createOptionsPage();
            }
            createTextEditorPage();

            applyActivePageProperty();
            refreshPages();

        } catch (PartInitException e) {
            ErrorDialog.openError(getSite().getShell(), Messages.MMPEditor_unableToOpenEditorErrorText, null,
                    e.getStatus());
        }
    }

    @Override
    protected FormToolkit createToolkit(Display display) {
        FormToolkit result = super.createToolkit(display);
        // Bug 2811. Force borders to be drawn. In the XP theme table borders weren't drawn, 
        // but we always want them to have borders.
        result.setBorderStyle(SWT.NULL);
        return result;
    }

    private void createOverviewPage() throws PartInitException {
        overviewPage = new OverviewPage(editorContext);
        addPage(overviewPage);
    }

    private void createLibrariesPage() throws PartInitException {
        librariesPage = new LibrariesPage(editorContext);
        addPage(librariesPage);
    }

    private void createSourcesPage() throws PartInitException {
        sourcesPage = new SourcesPage(editorContext);
        addPage(sourcesPage);
    }

    private void createOptionsPage() throws PartInitException {
        optionsPage = new OptionsPage(editorContext);
        addPage(optionsPage);
    }

    private void loadInput(IEditorInput editorInput) throws PartInitException {
        // assuming there's no previous model or connection to a document
        Check.checkState(editorContext.mmpModel == null);
        Check.checkState(editorContext.textDocument == null);

        IPath path = getInputLocation();
        if (!inputLocationExists()) {
            String fmt = Messages.MMPEditor_fileNotFoundMessage;
            // fix for Bug 5662 : cannot use path of non-existing file in exception message
            throw new PartInitException(MessageFormat.format(fmt, getEditorInput().getName()));
        }
        try {
            ICarbideBuildConfiguration buildConfig = null;
            IProject project = getProject();
            if (project != null) {
                // get the active ISymbianBuildContext
                ICarbideBuildManager buildManager = CarbideBuilderPlugin.getBuildManager();
                ICarbideProjectInfo cpi = buildManager.getProjectInfo(project);
                if (cpi != null) {
                    buildConfig = cpi.getDefaultConfiguration();
                }
                if (buildConfig == null) {
                    String msg = null;
                    if (buildManager.isCarbideProject(project)) {
                        if (fixMissingBuildConfig(cpi)) {
                            buildConfig = cpi.getDefaultConfiguration();
                        } else {
                            msg = Messages.MMPEditor_noBuildConfigError;
                        }

                    } else {
                        // we'll open with just a text tab
                        //msg = Messages.MMPEditor_badProjectMessage;
                    }
                    if (msg != null) {
                        MessageDialog.openError(getSite().getShell(), Messages.MMPEditor_dialogTitle, msg);
                        throw new PartInitException(msg, null);
                    }
                }
            }

            if (buildConfig != null) {
                editorContext.activeBuildConfig = buildConfig;
                editorContext.pathHelper = new MMPViewPathHelper(buildConfig);
                IDocumentProvider provider = CarbideTextEditor.documentProvider();
                provider.connect(editorInput);
                editorContext.project = project;
                editorContext.textDocument = provider.getDocument(editorInput);
                MMPModelFactory factory = new MMPModelFactory();
                editorContext.mmpModel = factory.createModel(path, editorContext.textDocument);
                editorContext.mmpModel.parse();

                initializeView();

                IFile file = getInputFile();
                if (file != null) {
                    editorInputTracker = new TrackedResource(file);
                    editorInputTracker.addListener(this);
                }

                updateProblemMarkers();
            } else {
                // degrade to a plain text editor; remove all but the text tab.
                usingFormPages = false;
            }
        } catch (PartInitException x) {
            throw x;
        } catch (CoreException x) {
            String fmt = Messages.MMPEditor_errorLoadingInputErrorText;
            Object params[] = { path.toOSString() };
            String msg = MessageFormat.format(fmt, params);
            throw new PartInitException(msg, x);
        }
    }

    private boolean fixMissingBuildConfig(ICarbideProjectInfo cpi) {
        boolean result = false;
        // Don't put up dialog if the workbench window is still not initialized
        Shell activeShell = WorkbenchUtils.getActiveShell();
        if (activeShell != null && activeShell.isVisible()) {
            boolean doDialog = MessageDialog.openQuestion(getSite().getShell(), Messages.MMPEditor_dialogTitle,
                    Messages.MMPEditor_noBuildConfig_ChooseNowPrompt);
            if (doDialog) {
                ManageConfigurationsDialog dialog = new ManageConfigurationsDialog(getSite().getShell(), cpi);
                if (dialog.open() == Dialog.OK) {
                    result = cpi.getDefaultConfiguration() != null;
                }
            }
        }
        return result;
    }

    private void initializeView() {
        if (editorContext.mmpView != null) {
            editorContext.mmpView.dispose();
            editorContext.mmpView = null;
        }
        MMPEditorViewConfiguration viewConfig = new MMPEditorViewConfiguration(
                editorContext.activeBuildConfig.getBuildContext(), getProject());
        editorContext.mmpView = editorContext.mmpModel.createView(viewConfig);
    }

    @Override
    protected IView getView() {
        return editorContext.mmpView;
    }

    protected void refreshPages() {
        if (usingFormPages) {
            overviewPage.refresh();
            sourcesPage.refresh();
            optionsPage.refresh();
            librariesPage.refresh();
        }
    }

    public void operationHistoryChanged() {
        getSite().getShell().getDisplay().asyncExec(new Runnable() {
            public void run() {
                MMPEditorContributor contributor = (MMPEditorContributor) getEditorSite().getActionBarContributor();
                contributor.updateUndoRedo();
                editorDirtyStateChanged();
            }
        });
    }

    protected void revertView() {
        if (editorContext.mmpView == null) {
            return;
        }

        Exception caughtException = null;
        try {
            editorContext.mmpView.revert();
        } catch (IllegalStateException x) {
            caughtException = x;
        } catch (IllegalArgumentException x) {
            caughtException = x;
        }

        if (caughtException != null) {
            String msg = Messages.MMPEditor_errorRevertingMMPErrorText;
            editorContext.logAndDisplayError(msg, caughtException);
        }
    }

    public void init(IEditorSite site, IEditorInput editorInput) throws PartInitException {
        super.init(site, editorInput);
        setPartName(editorInput.getName());
        loadInput(editorInput);
    }

    @Override
    public Object getAdapter(Class adapter) {
        Object result = null;
        if (adapter.equals(MMPEditorContext.class)) {
            result = editorContext;
        } else if (adapter.isInstance(this)) {
            result = this;
        } else if (adapter.equals(Shell.class)) {
            result = getSite() != null ? getSite().getShell() : null;
        } else if (adapter.equals(IResource.class)) {
            result = getInputFile();
        }

        if (result == null) {
            result = super.getAdapter(adapter);
        }
        return result;
    }

    @Override
    public IFormPage selectReveal(Object pageInput) {
        IFormPage result = super.selectReveal(pageInput);
        if (result == null && pageInput instanceof Control && usingFormPages) {
            Control control = (Control) pageInput;
            if (findControlInPage(overviewPage, control)) {
                return overviewPage;
            } else if (findControlInPage(sourcesPage, control)) {
                return sourcesPage;
            } else if (findControlInPage(librariesPage, control)) {
                return librariesPage;
            } else if (findControlInPage(optionsPage, control)) {
                return optionsPage;
            }
        }
        return result;
    }

    @Override
    protected void reloadRejected() {
        editorContext.mmpView.forceSynchronized();
    }

    @Override
    protected Map<IPath, IDocument> getIncludedDocumentMap() {
        if (usingFormPages) {
            Map<IPath, IDocument> map = new HashMap<IPath, IDocument>(editorContext.mmpModel.getDocumentMap());
            map.remove(editorContext.mmpModel.getPath());
            return map;
        } else {
            return null;
        }
    }

    public void buildConfigurationChanged(final ICarbideBuildConfiguration currentConfig) {
        IProject project = getProject();
        if (project != null && editorContext != null) {
            ICarbideProjectInfo carbideProject = currentConfig.getCarbideProject();
            if (carbideProject.getProject() == project) {
                getEditorSite().getShell().getDisplay().asyncExec(new Runnable() {
                    public void run() {
                        commitView();
                        editorContext.activeBuildConfig = currentConfig;
                        editorContext.pathHelper = new MMPViewPathHelper(currentConfig);
                        initializeView();
                        refreshPages();
                    }
                });
            }
        }
    }

    public OverviewPage getOverviewPage() {
        return overviewPage;
    }

    public LibrariesPage getLibrariesPage() {
        return librariesPage;
    }

    public SourcesPage getSourcesPage() {
        return sourcesPage;
    }

    public OptionsPage getOptionsPage() {
        return optionsPage;
    }

    public IMMPView getMMPView() {
        return editorContext.mmpView;
    }
}