package net.jeeeyul.eclipse.themes.ui.preference.preset.internal;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import net.jeeeyul.eclipse.themes.JThemesCore;
import net.jeeeyul.eclipse.themes.ui.ApplyPresetAction;
import net.jeeeyul.eclipse.themes.ui.preference.JTPConstants;
import net.jeeeyul.eclipse.themes.ui.preference.JThemePreferenceStore;
import net.jeeeyul.eclipse.themes.ui.preference.internal.JTPUtil;
import net.jeeeyul.eclipse.themes.ui.preference.internal.JTPreferencePage;
import net.jeeeyul.eclipse.themes.ui.preference.preset.IJTPreset;
import net.jeeeyul.eclipse.themes.ui.preference.preset.IJTPresetManagerListener;
import net.jeeeyul.swtend.SWTExtensions;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IInputValidator;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.preference.IPreferenceNode;
import org.eclipse.jface.preference.IPreferencePageContainer;
import org.eclipse.jface.preference.PreferenceDialog;
import org.eclipse.jface.preference.PreferenceManager;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.xtext.xbase.lib.Functions.Function1;
import org.eclipse.xtext.xbase.lib.IterableExtensions;
@SuppressWarnings("javadoc")
public class JTPresetPreferencePage extends PreferencePage implements IWorkbenchPreferencePage, IJTPresetManagerListener {
private SWTExtensions $ = SWTExtensions.INSTANCE;
public static final String ID = JTPresetPreferencePage.class.getCanonicalName();
private TableViewer viewer;
private Button deleteButton;
private Button renameButton;
private Button importButton;
private Button exportButton;
private Button activateButton;
public JTPresetPreferencePage() {
}
private void activate() {
IJTPreset selected = (IJTPreset) ((IStructuredSelection) viewer.getSelection()).getFirstElement();
if (selected == null) {
return;
}
new ApplyPresetAction(selected).run();
copySettingsIfAvailable(selected);
}
private void copySettingsIfAvailable(IJTPreset selected) {
IPreferencePageContainer container = getContainer();
if (!(container instanceof PreferenceDialog)) {
return;
}
PreferenceManager manager = ((PreferenceDialog) container).getPreferenceManager();
List<IPreferenceNode> elements = manager.getElements(PreferenceManager.POST_ORDER);
IPreferenceNode node = IterableExtensions.findFirst(elements, new Function1<IPreferenceNode, Boolean>() {
@Override
public Boolean apply(IPreferenceNode t) {
return t.getId().equals(JTPreferencePage.ID);
}
});
if (node == null || node.getPage() == null) {
return;
}
JTPreferencePage page = (JTPreferencePage) node.getPage();
JThemePreferenceStore copy = JThemesCore.getDefault().getPreferenceStore().getCopyWithContext(null);
Properties properties = selected.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);
copy.setValue(key, Math.max(intValue, SWTExtensions.INSTANCE.getMinimumToolBarHeight()));
} else {
copy.setValue(key, value);
}
}
page.loadFrom(copy);
}
@Override
protected Control createContents(Composite parent) {
Composite container = new Composite(parent, SWT.NORMAL);
container.setLayout(new GridLayout(2, false));
viewer = new TableViewer(container, SWT.FULL_SELECTION | SWT.BORDER | SWT.MULTI);
viewer.setLabelProvider(new LabelProvider() {
@Override
public Image getImage(Object element) {
IJTPreset preset = (IJTPreset) element;
Image image = preset.getImageDescriptor().createImage();
$.shouldDisposeWith(image, viewer.getControl());
return image;
}
@Override
public String getText(Object element) {
return ((IJTPreset) element).getName();
}
});
viewer.setContentProvider(new IStructuredContentProvider() {
@Override
public void dispose() {
}
@Override
public Object[] getElements(Object inputElement) {
return JThemesCore.getDefault().getPresetManager().getUserCategory().getPresets().toArray();
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
});
viewer.setInput(JThemesCore.getDefault().getPresetManager().getUserCategory());
GridData viewerLayoutData = new GridData(SWT.FILL, SWT.FILL, true, false);
viewerLayoutData.grabExcessVerticalSpace = true;
viewerLayoutData.widthHint = 200;
viewerLayoutData.heightHint = 200;
viewerLayoutData.verticalSpan = 5;
viewer.getControl().setLayoutData(viewerLayoutData);
activateButton = new Button(container, SWT.PUSH);
activateButton.setText("Apply");
activateButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
activateButton.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event event) {
activate();
}
});
deleteButton = new Button(container, SWT.PUSH);
deleteButton.setText("Delete");
deleteButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
deleteButton.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event event) {
deleteSelection();
}
});
renameButton = new Button(container, SWT.PUSH);
renameButton.setText("Rename");
renameButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
renameButton.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event event) {
UserPreset preset = (UserPreset) ((IStructuredSelection) viewer.getSelection()).getFirstElement();
if (preset != null) {
rename(preset);
}
}
});
importButton = new Button(container, SWT.PUSH);
importButton.setText("Import...");
importButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
importButton.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event event) {
doImport();
}
});
exportButton = new Button(container, SWT.PUSH);
exportButton.setText("Export...");
exportButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
exportButton.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event event) {
doExport();
}
});
viewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
updateButtons();
}
});
updateButtons();
return container;
}
private void deleteSelection() {
List<UserPreset> selection = getSelection();
if (selection.isEmpty()) {
return;
}
boolean confirmed = MessageDialog.openQuestion(getShell(), "Jeeeyul's Eclipse Themes", "Are you sure to remove selected use presets?");
if (confirmed) {
for (UserPreset each : selection) {
each.delete();
}
}
}
@Override
public void dispose() {
JThemesCore.getDefault().getPresetManager().removeListener(this);
super.dispose();
}
private void doExport() {
FileDialog dialog = new FileDialog(getShell(), SWT.SAVE);
UserPreset userPreset = getSelection().get(0);
dialog.setFileName(userPreset.getName() + ".epf");
dialog.setOverwrite(true);
dialog.setFilterExtensions(new String[] { "*.epf" });
dialog.setFilterNames(new String[] { "Eclipse Preference File" });
String target = dialog.open();
if (target != null) {
FileOutputStream fos;
try {
fos = new FileOutputStream(target);
userPreset.getProperties().store(fos, "Jeeeyul's Eclipse Themes Preset");
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void doImport() {
FileDialog dialog = new FileDialog(getShell(), SWT.OPEN | SWT.MULTI | SWT.SHEET);
dialog.setFilterExtensions(new String[] { "*.epf" });
dialog.setFilterNames(new String[] { "Eclipse Preference File" });
String firstFile = dialog.open();
if (firstFile != null) {
File dir = new File(firstFile).getParentFile();
for (String each : dialog.getFileNames()) {
importEPF(new File(dir, each));
}
}
}
private List<UserPreset> getSelection() {
ArrayList<UserPreset> selection = new ArrayList<UserPreset>();
Object[] array = ((IStructuredSelection) viewer.getSelection()).toArray();
for (Object each : array) {
if (each instanceof UserPreset) {
selection.add((UserPreset) each);
}
}
return selection;
}
private void importEPF(File file) {
try {
String name = file.getName().replaceFirst("[.][^.]+$", "");
IInputValidator nameValidator = JTPUtil.getPresetNameValidator();
String error = nameValidator.isValid(name);
if (error != null) {
String initialInput;
int number = 2;
do {
initialInput = MessageFormat.format("{0}({1})", name, number);
} while (nameValidator.isValid(initialInput) != null);
InputDialog nameDialog = new InputDialog(getShell(), "Import Preset", MessageFormat.format("{0} Enter a new preset name:", error),
initialInput, nameValidator);
if (nameDialog.open() != IDialogConstants.OK_ID) {
return;
} else {
name = nameDialog.getValue().trim();
}
}
UserPreset newPreset = new UserPreset(name);
FileInputStream fis = new FileInputStream(file);
newPreset.getProperties().load(fis);
fis.close();
newPreset.save();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void init(IWorkbench workbench) {
JThemesCore.getDefault().getPresetManager().addListener(this);
}
private void rename(UserPreset preset) {
InputDialog dialog = new InputDialog(Display.getDefault().getActiveShell(), "New Preset", "Enter a new preset name:", null,
JTPUtil.getPresetNameValidator());
if (dialog.open() != IDialogConstants.OK_ID) {
return;
}
preset.setName(dialog.getValue().trim());
try {
preset.save();
} catch (IOException e) {
e.printStackTrace();
}
}
private void updateButtons() {
List<UserPreset> selection = getSelection();
activateButton.setEnabled(selection.size() == 1);
deleteButton.setEnabled(selection.size() > 0);
renameButton.setEnabled(selection.size() == 1);
exportButton.setEnabled(selection.size() == 1);
importButton.setEnabled(true);
}
@Override
public void userPresetModified() {
if (viewer != null && !viewer.getControl().isDisposed()) {
viewer.refresh();
}
}
}