package net.jeeeyul.eclipse.themes.ui;
import java.util.Properties;
import net.jeeeyul.eclipse.themes.JThemesCore;
import net.jeeeyul.eclipse.themes.ui.hotswap.RewriteCustomTheme;
import net.jeeeyul.eclipse.themes.ui.preference.JTPConstants;
import net.jeeeyul.eclipse.themes.ui.preference.JThemePreferenceStore;
import net.jeeeyul.eclipse.themes.ui.preference.internal.PropertiesUtil;
import net.jeeeyul.eclipse.themes.ui.preference.preset.IJTPreset;
import net.jeeeyul.eclipse.themes.ui.preference.preset.IJTPresetManager;
import net.jeeeyul.swtend.SWTExtensions;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.ui.css.swt.theme.IThemeEngine;
import org.eclipse.e4.ui.model.application.MApplication;
import org.eclipse.jface.action.Action;
import org.eclipse.swt.SWT;
import org.eclipse.ui.PlatformUI;
/**
* Applies {@link IJTPreset} to current preference and generate CSS and apply
* it.
*
* @since 2.0
* @author Jeeeyul
*/
@SuppressWarnings("restriction")
public class ApplyPresetAction extends Action {
private IJTPreset preset;
/**
* Creates an {@link ApplyPresetAction}.
*
* @param preset
*/
public ApplyPresetAction(IJTPreset preset) {
super(preset.getName(), SWT.CHECK);
this.preset = preset;
this.setImageDescriptor(preset.getImageDescriptor());
/*
* https://github.com/jeeeyul/eclipse-themes/issues/140
*/
if (getThemeEngine().getActiveTheme().getId().equals(JThemesCore.CUSTOM_THEME_ID)) {
String lastChoosedPresetId = getStore().getString(JTPConstants.Memento.LAST_CHOOSED_PRESET);
if (preset.getId().equals(lastChoosedPresetId)) {
setChecked(true);
}
}
}
@Override
public void run() {
JThemePreferenceStore store = getStore();
IJTPresetManager presetManager = JThemesCore.getDefault().getPresetManager();
Properties properties = PropertiesUtil.merge(presetManager.getDefaultPreset().getProperties(), preset.getProperties());
for (Object keyObj : properties.keySet()) {
String key = (String) keyObj;
String value = properties.getProperty(key);
if (key.equals(JTPConstants.Layout.TAB_HEIGHT)) {
int intValue = Integer.parseInt(value);
store.setValue(key, Math.max(intValue, SWTExtensions.INSTANCE.getMinimumToolBarHeight()));
} else {
store.setValue(key, value);
}
}
new RewriteCustomTheme(true).rewrite();
IThemeEngine engine = getThemeEngine();
if (engine.getActiveTheme() == null || !engine.getActiveTheme().getId().equals(JThemesCore.CUSTOM_THEME_ID)) {
engine.setTheme(JThemesCore.CUSTOM_THEME_ID, true);
}
/*
* https://github.com/jeeeyul/eclipse-themes/issues/140
*/
store.setValue(JTPConstants.Memento.LAST_CHOOSED_PRESET, preset.getId());
}
private IThemeEngine getThemeEngine() {
MApplication application = (MApplication) PlatformUI.getWorkbench().getService(MApplication.class);
IEclipseContext context = application.getContext();
IThemeEngine engine = context.get(IThemeEngine.class);
return engine;
}
private JThemePreferenceStore getStore() {
JThemePreferenceStore store = JThemesCore.getDefault().getPreferenceStore();
return store;
}
}