package net.jeeeyul.eclipse.themes.ui.preference.internal; import java.util.ArrayList; import java.util.List; import net.jeeeyul.eclipse.themes.rendering.JTabSettings; import net.jeeeyul.eclipse.themes.rendering.JeeeyulsTabRenderer; import net.jeeeyul.eclipse.themes.ui.preference.JThemePreferenceStore; import net.jeeeyul.swtend.SWTExtensions; import net.jeeeyul.swtend.sam.Procedure1; import net.jeeeyul.swtend.ui.ColorPicker; import net.jeeeyul.swtend.ui.ColorStop; import net.jeeeyul.swtend.ui.ColorWell; import net.jeeeyul.swtend.ui.Gradient; import net.jeeeyul.swtend.ui.GradientEdit; import net.jeeeyul.swtend.ui.HSB; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.preference.PreferenceStore; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CTabFolder; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Scale; import org.eclipse.ui.dialogs.PreferencesUtil; @SuppressWarnings("javadoc") public class PreperencePageHelper { private JTPreferencePage root; private AbstractJTPreferencePage client; public PreperencePageHelper(JTPreferencePage root, AbstractJTPreferencePage client) { this.root = root; this.client = client; } public Label appendMonitor(final Scale scale, final String unit, final int delta) { final Label label = new Label(scale.getParent(), SWT.NORMAL); scale.addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event event) { label.setText((scale.getSelection() + delta) + unit); } }); label.setLayoutData(new GridData(40, -1)); label.setText((scale.getSelection() + delta) + unit); SWTExtensions.INSTANCE.asyncExec(new Procedure1<Void>() { @Override public void apply(Void t) { if (scale.isDisposed()) { return; } label.setText((scale.getSelection() + delta) + unit); } }); return label; } public Button appendOrderLockButton(final GradientEdit gradEdit, Procedure1<Button> initializer) { final Button button = new Button(gradEdit.getParent(), SWT.CHECK); button.setText("Lock Order"); button.addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event event) { gradEdit.setLockOrder(button.getSelection()); } }); if (initializer != null) { initializer.apply(button); } return button; } public List<HSB> asSWTSafeHSBArray(Gradient gradient) { ArrayList<HSB> result = new ArrayList<HSB>(); ColorStop first = gradient.get(0); if (first.percent != 0) { result.add(first.color); } for (ColorStop each : gradient) { result.add(each.color); } ColorStop last = gradient.get(gradient.size() - 1); if (last.percent != 100) { result.add(last.color); } return result; } public List<Integer> asSWTSafePercentArray(Gradient gradient) { ArrayList<Integer> result = new ArrayList<Integer>(); ColorStop first = gradient.get(0); if (first.percent != 0) { result.add(first.percent); } for (int i = 1; i < gradient.size(); i++) { ColorStop each = gradient.get(i); result.add(each.percent); } ColorStop last = gradient.get(gradient.size() - 1); if (last.percent != 100) { result.add(100); } return result; } public AbstractJTPreferencePage getActivePage() { return root.getActivePage(); } public JThemePreferenceStore getPreferenceStore() { return root.getPreferenceStore(); } public JTPreferencePage getRootPage() { return root; } /** * Compares {@link Color} array and {@link HSB} array. * * @param colors * colors to compare. * @param hsbArray * hsb arrays to compare. * @return what if they abstracts same color it returns true, otherwhise * false. * * @since 2.0.0 */ public boolean matches(Color[] colors, HSB[] hsbArray) { if (colors == null) { return false; } if (colors.length != hsbArray.length) { return false; } for (int i = 0; i < colors.length; i++) { if (colors[i].isDisposed()) { return false; } if (!colors[i].getRGB().equals(hsbArray[i].toRGB())) { return false; } } return true; } public boolean matches(Color color, HSB hsb) { if (color == null || color.isDisposed()) { return false; } return new HSB(color.getRGB()).equals(hsb); } public ColorWell newColorWell(Composite parent, Procedure1<ColorWell> initializer) { final ColorWell result = new ColorWell(parent, SWT.NORMAL); result.addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event event) { HSB original = result.getSelection(); ColorPicker picker = new ColorPicker(result.getShell()); picker.setSelection(original); picker.setContinuosSelectionHandler(new Procedure1<HSB>() { @Override public void apply(HSB t) { result.setSelection(t); } }); if (picker.open() == IDialogConstants.OK_ID) { result.setSelection(picker.getSelection()); } else { result.setSelection(original); } } }); if (initializer != null) { initializer.apply(result); } return result; } public GradientEdit newGradientEdit(Composite parent, Procedure1<GradientEdit> initializer) { final GradientEdit result = new GradientEdit(parent); if (initializer != null) { initializer.apply(result); } return result; } /** * request fast preview, it will call clients * {@link AbstractJTPreferencePage#updatePreview(CTabFolder, JTabSettings, SWTExtensions, PreperencePageHelper)} * Immediately. What it there is changing in layout, call * {@link #requestUpdatePreview()} instead. * * @since 2.0.0 */ public void requestFastUpdatePreview() { CTabFolder folder = getRootPage().getFolder(); JeeeyulsTabRenderer renderer = (JeeeyulsTabRenderer) folder.getRenderer(); JTabSettings settings = renderer.getSettings(); client.updatePreview(folder, settings, SWTExtensions.INSTANCE, this); } /** * Request full update for preview. It contains relayout. */ public void requestUpdatePreview() { root.updatePreview(); } public AbstractJTPreferencePage[] getAllPages() { return root.getAllPages(); } public void navigateTo(String id) { PreferencesUtil.createPreferenceDialogOn(root.getShell(), id, null, null); } public JThemePreferenceStore createWorkingCopy() { JThemePreferenceStore fakeStore = new JThemePreferenceStore(new PreferenceStore()); root.saveTo(fakeStore); return fakeStore; } public void loadFromWorkingCopy(JThemePreferenceStore store) { root.loadFrom(store); } }