package net.jeeeyul.eclipse.themes.css.internal; import net.jeeeyul.eclipse.themes.internal.Debug; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.preferences.InstanceScope; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.ui.preferences.ScopedPreferenceStore; import org.eclipse.xtext.xbase.lib.Procedures.Procedure1; import org.osgi.framework.Bundle; /** * #159: Support for EditBox * https://github.com/jeeeyul/eclipse-themes/issues/issue/159 * * @author Jeeeyul */ public class EditBoxTracker { private static final String KEY_EDITBOX_ENABLEMENT = "ENABLED"; private static final String PLUGINID_EDITBOX = "pm.eclipse.editbox"; /** * Singleton instance for {@link EditBoxTracker}. */ public static final EditBoxTracker INSTANCE = new EditBoxTracker(); private boolean fIsTracking = false; private Boolean fEditBoxInstalled; private IPreferenceStore fEditBoxPreferenceStore; private Boolean fEditBoxIsActive = null; IPropertyChangeListener fEditBoxPreferenceStoreListener = new IPropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent event) { if (event.getProperty().equalsIgnoreCase(KEY_EDITBOX_ENABLEMENT)) { fEditBoxIsActive = getEditBoxPreferenceStore().getBoolean(KEY_EDITBOX_ENABLEMENT); if (editBoxEnablementHandler != null) { editBoxEnablementHandler.apply(fEditBoxIsActive); } } } }; Procedure1<Boolean> editBoxEnablementHandler; private EditBoxTracker() { } /** * Starts tracking for EditBox enablement. */ public synchronized void beginTrack() { if (fIsTracking) { return; } if (isEditBoxInstalled()) { hookEditBoxPreference(); } else { Debug.println("Editbox is not installed"); } fIsTracking = true; Debug.println("Tracking Edit Box Plugin was start"); } private IPreferenceStore getEditBoxPreferenceStore() { if (fEditBoxPreferenceStore == null) { fEditBoxPreferenceStore = new ScopedPreferenceStore(InstanceScope.INSTANCE, PLUGINID_EDITBOX); } return fEditBoxPreferenceStore; } private void hookEditBoxPreference() { IPreferenceStore store = getEditBoxPreferenceStore(); store.addPropertyChangeListener(fEditBoxPreferenceStoreListener); } /** * * @return Whether EditBox is active. */ public boolean isEditBoxActive() { if (fEditBoxIsActive == null) { if (isEditBoxInstalled() == false) { fEditBoxIsActive = false; } else { fEditBoxIsActive = getEditBoxPreferenceStore().getBoolean(KEY_EDITBOX_ENABLEMENT); } } return fEditBoxIsActive; } private boolean isEditBoxInstalled() { ResolveEditBox: if (fEditBoxInstalled == null) { Bundle bundle = Platform.getBundle(PLUGINID_EDITBOX); if (bundle == null) { fEditBoxInstalled = false; break ResolveEditBox; } switch (bundle.getState()) { case Bundle.RESOLVED: case Bundle.STARTING: case Bundle.ACTIVE: fEditBoxInstalled = true; break; default: fEditBoxInstalled = false; break; } } return fEditBoxInstalled; } /** * Sets a handler for EditBox enablemnt changes. * * @param editBoxEnablementHandler */ public void setEditBoxEnablementHandler(Procedure1<Boolean> editBoxEnablementHandler) { this.editBoxEnablementHandler = editBoxEnablementHandler; } /** * Stops tracking for EditBox enablement. */ public synchronized void stopTracking() { if (fIsTracking != true) { return; } unhookEditBoxPreference(); fIsTracking = false; } private void unhookEditBoxPreference() { getEditBoxPreferenceStore().removePropertyChangeListener(fEditBoxPreferenceStoreListener); } }