Package com.dubture.composer.core

Source Code of com.dubture.composer.core.ComposerBuildpathContainerInitializer

package com.dubture.composer.core;

import java.util.HashMap;
import java.util.Map;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.dltk.core.BuildpathContainerInitializer;
import org.eclipse.dltk.core.DLTKCore;
import org.eclipse.dltk.core.DLTKLanguageManager;
import org.eclipse.dltk.core.IBuildpathContainer;
import org.eclipse.dltk.core.IDLTKLanguageToolkit;
import org.eclipse.dltk.core.IScriptProject;
import org.eclipse.php.internal.core.Logger;
import org.eclipse.php.internal.core.preferences.IPreferencesPropagatorListener;
import org.eclipse.php.internal.core.preferences.PreferencesPropagatorEvent;
import org.eclipse.php.internal.core.project.PHPNature;
import org.eclipse.php.internal.core.project.PhpVersionChangedHandler;
import org.eclipse.php.internal.core.util.project.observer.IProjectClosedObserver;
import org.eclipse.php.internal.core.util.project.observer.ProjectRemovedObserversAttacher;

import com.dubture.composer.core.model.ComposerBuildpathContainer;
import com.dubture.composer.core.model.ModelAccess;
import com.dubture.composer.core.model.PackageManager;

/**
*
*
* @author Robert Gruendler <r.gruendler@gmail.com>
*
*/
@SuppressWarnings("restriction")
public class ComposerBuildpathContainerInitializer extends
        BuildpathContainerInitializer
{
   
    public static final String CONTAINER = ComposerPlugin.ID + ".CONTAINER"; //$NON-NLS-1$
   
    private Map<IProject, IPreferencesPropagatorListener> project2PhpVerListener = new HashMap<IProject, IPreferencesPropagatorListener>();

    @Override
    public void initialize(IPath containerPath, IScriptProject scriptProject)
            throws CoreException
    {
        if (containerPath.segmentCount() > 0 && containerPath.segment(0).equals(CONTAINER) && ComposerPlugin.getDefault().isBuildpathContainerEnabled()) {
            try {
                if (isPHPProject(scriptProject)) {
                    DLTKCore
                            .setBuildpathContainer(
                                    containerPath,
                                    new IScriptProject[] { scriptProject },
                                    new IBuildpathContainer[] { new ComposerBuildpathContainer(containerPath, scriptProject) },
                                    null);
                    initializeListener(containerPath, scriptProject);
                }
            } catch (Exception e) {
                Logger.logException(e);
            }
        }
    }
   
    private void initializeListener(final IPath containerPath,
            final IScriptProject scriptProject) {
        final IProject project = scriptProject.getProject();
        if (project2PhpVerListener.containsKey(project)) {
            return;
        }
        IPreferencesPropagatorListener versionChangeListener = new IPreferencesPropagatorListener() {
            public void preferencesEventOccured(PreferencesPropagatorEvent event) {
                try {
                    // Re-initialize when PHP version changes
                    initialize(containerPath, scriptProject);
                } catch (CoreException e) {
                    Logger.logException(e);
                }
            }

            public IProject getProject() {
                return project;
            }
        };

        project2PhpVerListener.put(project, versionChangeListener);
        PhpVersionChangedHandler.getInstance().addPhpVersionChangedListener(
                versionChangeListener);

        ProjectRemovedObserversAttacher.getInstance().addProjectClosedObserver(
                project, new IProjectClosedObserver() {
                    public void closed() {
                        PhpVersionChangedHandler.getInstance()
                                .removePhpVersionChangedListener(
                                        project2PhpVerListener.remove(project));
                    }
                });
    }   
   
    private static boolean isPHPProject(IScriptProject project) {
        String nature = getNatureFromProject(project);
        return PHPNature.ID.equals(nature);
    }
   
    private static String getNatureFromProject(IScriptProject project) {
        IDLTKLanguageToolkit languageToolkit = DLTKLanguageManager
                .getLanguageToolkit(project);
        if (languageToolkit != null) {
            return languageToolkit.getNatureId();
        }
        return null;
    }
   
    public void requestBuildpathContainerUpdate(IPath containerPath,
            IScriptProject project, IBuildpathContainer containerSuggestion)
    {
       
        if (isComposerContainer(containerPath)) {
            String name = containerPath.segment(1);
            if (containerSuggestion != null) {
               
                PackageManager manager = ModelAccess.getInstance().getPackageManager();
               
                if (manager.getPackage(name) == null) {
                    return;
                }
               
                manager.setPackage(
                                name,
                                containerSuggestion.getBuildpathEntries(),
                                containerSuggestion.getKind() == IBuildpathContainer.K_SYSTEM);
            } else {
                ModelAccess.getInstance().getPackageManager().removePackage(name);
            }
        }       

    }

    private boolean isComposerContainer(IPath path)
    {
        return path != null && CONTAINER.equals(path.segment(0));       
    }

    @Override
    public boolean canUpdateBuildpathContainer(IPath containerPath,
            IScriptProject project)
    {
        return isComposerContainer(containerPath);
    }
}
TOP

Related Classes of com.dubture.composer.core.ComposerBuildpathContainerInitializer

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.