package com.github.jknack.antlr4ide.ui.preferences; import java.util.Map; import com.github.jknack.antlr4ide.console.Console; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.jface.preference.IPreferencePageContainer; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer; import org.eclipse.xtext.Constants; import org.eclipse.xtext.builder.DerivedResourceCleanerJob; import org.eclipse.xtext.builder.EclipseOutputConfigurationProvider; import org.eclipse.xtext.ui.IImageHelper; import org.eclipse.xtext.ui.editor.preferences.PreferenceStoreAccessImpl; import org.eclipse.xtext.ui.preferences.OptionsConfigurationBlock; import org.eclipse.xtext.ui.preferences.PropertyAndPreferencePage; import com.google.common.collect.MapDifference.ValueDifference; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.name.Named; /** * @author Michael Clay - Initial contribution and API * @since 2.1 */ @SuppressWarnings("restriction") public class BuilderPreferencePage extends PropertyAndPreferencePage { private static final boolean DEBUG = false; private OptionsConfigurationBlock builderConfigurationBlock; private EclipseOutputConfigurationProvider configurationProvider; private String languageName; private PreferenceStoreAccessImpl preferenceStoreAccessImpl; private Provider<DerivedResourceCleanerJob> cleanerProvider; private IImageHelper imageHelper; @Inject private Console console; @Inject public void setCleanerProvider(final Provider<DerivedResourceCleanerJob> cleanerProvider) { console.debug("BuilderPreferencePage setCleanerProvider"); this.cleanerProvider = cleanerProvider; } @Inject public void setLanguageName(@Named(Constants.LANGUAGE_NAME) final String languageName) { console.debug("BuilderPreferencePage setLanguageName='%s'", languageName); this.languageName = languageName; } @Inject public void setConfigurationProvider( final EclipseOutputConfigurationProvider configurationProvider) { console.debug("BuilderPreferencePage setConfigurationProvider "); this.configurationProvider = configurationProvider; } @Inject public void setPreferenceStoreAccessImpl(final PreferenceStoreAccessImpl preferenceStoreAccessImpl) { console.debug("BuilderPreferencePage setPreferenceStoreAccessImpl "); this.preferenceStoreAccessImpl = preferenceStoreAccessImpl; } @Inject public void setImageHelper(final IImageHelper imageHelper) { console.debug("BuilderPreferencePage setImageHelper "); this.imageHelper = imageHelper; } @Override public void createControl(final Composite parent) { console.debug("BuilderPreferencePage createControl "); IWorkbenchPreferenceContainer container = (IWorkbenchPreferenceContainer) getContainer(); IPreferenceStore preferenceStore = preferenceStoreAccessImpl .getWritablePreferenceStore(getProject()); builderConfigurationBlock = new BuilderConfigurationBlock(getProject(), preferenceStore, configurationProvider, container, imageHelper); builderConfigurationBlock.setStatusChangeListener(getNewStatusChangedListener()); super.createControl(parent); } @Override protected Control createPreferenceContent(final Composite composite, final IPreferencePageContainer preferencePageContainer) { console.debug("BuilderPreferencePage createPreferenceContent "); return builderConfigurationBlock.createContents(composite); } @Override protected boolean hasProjectSpecificOptions(final IProject project) { console.trace("BuilderPreferencePage hasProjectSpecificOptions"); console.debug("BuilderPreferencePage hasProjectSpecificOptions='%s'", project.toString()); console.debug("BuilderPreferencePage builderConfigurationBlock==null = '%b'", (builderConfigurationBlock==null)); try { return builderConfigurationBlock.hasProjectSpecificOptions(project); } catch (Exception ex) { System.out.println("!!!BuilderPreferencePage hasProjectSpecificOptions Exception "+ex); ex.printStackTrace(); return false; } } @Override protected String getPreferencePageID() { console.debug("BuilderPreferencePage getPreferencePageID='%s'.compiler.preferencePage ", languageName); return languageName + ".compiler.preferencePage"; } @Override protected String getPropertyPageID() { console.debug("BuilderPreferencePage getPropertyPageID='%s'.compiler.propertyPage", languageName); return languageName + ".compiler.propertyPage"; } @Override public void dispose() { console.debug("BuilderPreferencePage dispose builderConfigurationBlock != null '%b'", (builderConfigurationBlock != null)); if (builderConfigurationBlock != null) { builderConfigurationBlock.dispose(); } super.dispose(); } @Override protected void enableProjectSpecificSettings(final boolean useProjectSpecificSettings) { console.debug("BuilderPreferencePage enableProjectSpecificSettings useProjectSpecificSettings='%b'", useProjectSpecificSettings); super.enableProjectSpecificSettings(useProjectSpecificSettings); if (builderConfigurationBlock != null) { builderConfigurationBlock.useProjectSpecificSettings(useProjectSpecificSettings); } } @Override protected void performDefaults() { console.debug("BuilderPreferencePage performDefaults"); super.performDefaults(); if (builderConfigurationBlock != null) { builderConfigurationBlock.performDefaults(); } } @Override public boolean performOk() { console.debug("BuilderPreferencePage performOk"); if (builderConfigurationBlock != null) { scheduleCleanerJobIfNecessary(getContainer()); if (!builderConfigurationBlock.performOk()) { return false; } } return super.performOk(); } @Override public void performApply() { console.debug("BuilderPreferencePage performApply"); if (builderConfigurationBlock != null) { scheduleCleanerJobIfNecessary(null); builderConfigurationBlock.performApply(); } } @Override public void setElement(final IAdaptable element) { console.debug("BuilderPreferencePage setElement"); super.setElement(element); setDescription(null); // no description for property page } private void scheduleCleanerJobIfNecessary(final IPreferencePageContainer preferencePageContainer) { console.debug("BuilderPreferencePage scheduleCleanerJobIfNecessary"); Map<String, ValueDifference<String>> changes = builderConfigurationBlock.getPreferenceChanges(); for (String key : changes.keySet()) { if (key.matches("^" + EclipseOutputConfigurationProvider.OUTPUT_PREFERENCE_TAG + "\\.\\w+\\." + EclipseOutputConfigurationProvider.OUTPUT_DIRECTORY + "$")) { ValueDifference<String> difference = changes.get(key); scheduleCleanerJob(preferencePageContainer, difference.rightValue()); } } } private void scheduleCleanerJob(final IPreferencePageContainer preferencePageContainer, final String folderNameToClean) { console.debug("BuilderPreferencePage scheduleCleanerJob"); DerivedResourceCleanerJob derivedResourceCleanerJob = cleanerProvider.get(); derivedResourceCleanerJob.setUser(true); derivedResourceCleanerJob.initialize(getProject(), folderNameToClean); if (preferencePageContainer != null) { IWorkbenchPreferenceContainer container = (IWorkbenchPreferenceContainer) getContainer(); container.registerUpdateJob(derivedResourceCleanerJob); } else { derivedResourceCleanerJob.schedule(); } } }