package net.jeeeyul.eclipse.themes.ui.store; import java.io.ByteArrayInputStream; import java.util.Properties; import net.jeeeyul.eclipse.themes.JThemesCore; import net.jeeeyul.eclipse.themes.SharedImages; import net.jeeeyul.eclipse.themes.ui.hotswap.RewriteCustomTheme; import net.jeeeyul.eclipse.themes.ui.internal.Debug; 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.swtend.SWTExtensions; import org.eclipse.core.runtime.IProgressMonitor; 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.swt.SWT; import org.eclipse.swt.SWTError; import org.eclipse.swt.browser.Browser; import org.eclipse.swt.browser.BrowserFunction; import org.eclipse.swt.browser.CloseWindowListener; import org.eclipse.swt.browser.OpenWindowListener; import org.eclipse.swt.browser.TitleEvent; import org.eclipse.swt.browser.TitleListener; import org.eclipse.swt.browser.VisibilityWindowListener; import org.eclipse.swt.browser.WindowEvent; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.program.Program; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Link; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.swt.widgets.ToolItem; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.part.EditorPart; /** * Store client * * @author Jeeeyul */ @SuppressWarnings("restriction") public class StoreClient extends EditorPart { /** * Store Client Editor ID. */ public static final String EDITOR_ID = StoreClient.class.getCanonicalName(); private Browser browser; private Text urlField; private ToolItem backItem; private ToolItem forwardItem; private ToolItem homeItem; @Override public void doSave(IProgressMonitor monitor) { } @Override public void doSaveAs() { } @Override public void init(IEditorSite site, IEditorInput input) throws PartInitException { setSite(site); setInput(input); } @Override public boolean isDirty() { return false; } @Override public boolean isSaveAsAllowed() { return false; } private String getBootstrapURL() { if (Debug.useLocalStore()) { return "http://localhost:3000/"; } else { return "http://themes.jeeeyul.net"; } } @Override public void createPartControl(Composite parent) { try { Composite composite = new Composite(parent, SWT.NORMAL); GridLayout layout = new GridLayout(3, false); composite.setLayout(layout); layout.marginWidth = layout.marginHeight = 0; layout.verticalSpacing = 0; ToolBar toolBar = new ToolBar(composite, SWT.FLAT); backItem = new ToolItem(toolBar, SWT.PUSH); backItem.setImage(SharedImages.getImage(SharedImages.BACKWARD_NAV)); backItem.addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event event) { browser.back(); } }); forwardItem = new ToolItem(toolBar, SWT.PUSH); forwardItem.setImage(SharedImages.getImage(SharedImages.FORWARD_NAV)); forwardItem.addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event event) { browser.forward(); } }); new ToolItem(toolBar, SWT.SEPARATOR); homeItem = new ToolItem(toolBar, SWT.PUSH); homeItem.setImage(SharedImages.getImage(SharedImages.HOME_NAV)); homeItem.addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event event) { browser.setUrl(getBootstrapURL()); } }); urlField = new Text(composite, SWT.BORDER | SWT.READ_ONLY); urlField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); ToolBar rightToolBar = new ToolBar(composite, SWT.FLAT); ToolItem openInExternalBrowser = new ToolItem(rightToolBar, SWT.PUSH); openInExternalBrowser.setImage(SharedImages.getImage(SharedImages.EXTERNAL_BROWSER)); openInExternalBrowser.addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event event) { if (urlField.getText().length() > 0) { Program.launch(urlField.getText().trim()); } } }); browser = new Browser(composite, SWT.NONE); GridData browserData = new GridData(GridData.FILL_BOTH); browserData.horizontalSpan = 3; browser.setLayoutData(browserData); initializeBrowser(browser, false); installFunctions(); browser.setUrl(getBootstrapURL()); } catch (SWTError e) { createBrowserHelpPage(parent); } } private void createBrowserHelpPage(Composite parent) { Link link = new Link(parent, SWT.NORMAL); link.setText("Could not create browser, Please read <a href=\"https://github.com/jeeeyul/eclipse-themes/wiki/Linux-Theme-Store-Problem\">Linux User Guide</a>"); link.addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event event) { Program.launch(event.text); } }); } private void installFunctions() { new BrowserFunction(browser, "__install") { public Object function(Object[] arguments) { if (arguments.length == 1 && arguments[0] instanceof String) { String soruce = (String) arguments[0]; installEPF(soruce); } return null; } }; new BrowserFunction(browser, "__getCurrentEPF") { public Object function(Object[] args) { return new EPFGenerator().generate(); } }; new BrowserFunction(browser, "__updateURL") { public Object function(Object[] args) { if (args.length == 1 && args[0] instanceof String) { urlField.setText((String) args[0]); } return null; } }; new BrowserFunction(browser, "__openURL") { public Object function(Object[] args) { if (args.length == 1 && args[0] instanceof String) { String url = (String) args[0]; Program.launch(url); } return null; } }; } private void installEPF(String epfString) { try { Properties properties = new Properties(); properties.load(new ByteArrayInputStream(epfString.getBytes("ISO-8859-1"))); IJTPreset defaultPreset = JThemesCore.getDefault().getPresetManager().getDefaultPreset(); properties = PropertiesUtil.merge(defaultPreset.getProperties(), properties); JThemePreferenceStore store = JThemesCore.getDefault().getPreferenceStore(); 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(); MApplication application = (MApplication) PlatformUI.getWorkbench().getService(MApplication.class); IEclipseContext context = application.getContext(); IThemeEngine engine = context.get(IThemeEngine.class); if (engine.getActiveTheme() == null || !engine.getActiveTheme().getId().equals(JThemesCore.CUSTOM_THEME_ID)) { engine.setTheme(JThemesCore.CUSTOM_THEME_ID, true); } store.setValue(JTPConstants.Memento.LAST_CHOOSED_PRESET, ""); } catch (Exception e) { e.printStackTrace(); } } @Override public void setFocus() { if (SWTExtensions.INSTANCE.isAlive(browser)) browser.setFocus(); } private void initializeBrowser(final Browser browser, boolean closable) { browser.addOpenWindowListener(new OpenWindowListener() { public void open(WindowEvent event) { Debug.println("Open"); // Certain platforms can provide a default full browser. // simply return in that case if the application prefers // the default full browser to the embedded one set below. if (!event.required) return; // Embed the new window Shell shell = new Shell(browser.getDisplay(), SWT.SHELL_TRIM | SWT.TOP); shell.setImage(SharedImages.getImage(SharedImages.STORE)); shell.setText("New Window"); shell.setLayout(new FillLayout()); Browser browser = new Browser(shell, SWT.NONE); initializeBrowser(browser, true); event.browser = browser; } }); if (!closable) { return; } browser.addVisibilityWindowListener(new VisibilityWindowListener() { public void hide(WindowEvent event) { Debug.println("hide"); Browser browser = (Browser) event.widget; Shell shell = browser.getShell(); shell.setVisible(false); } public void show(WindowEvent event) { Debug.println("show"); Browser browser = (Browser) event.widget; Shell shell = browser.getShell(); if (event.location != null) shell.setLocation(event.location); if (event.size == null) { event.size = new Point(1024, 768); } if (event.size != null) { Point size = event.size; shell.setSize(shell.computeSize(Math.min(size.x, 1027), Math.min(size.y, 768))); } if (event.addressBar || event.menuBar || event.statusBar || event.toolBar) { // Create widgets for the address bar, menu bar, status bar // and/or tool bar // leave enough space in the Shell to accommodate a Browser // of the size // given by event.size } shell.open(); } }); browser.addCloseWindowListener(new CloseWindowListener() { public void close(WindowEvent event) { Debug.println("close"); Browser browser = (Browser) event.widget; Shell shell = browser.getShell(); shell.close(); } }); browser.addTitleListener(new TitleListener() { @Override public void changed(TitleEvent event) { browser.getShell().setText(event.title); } }); browser.addDisposeListener(new DisposeListener() { @Override public void widgetDisposed(DisposeEvent e) { Debug.println("dispose"); } }); } }