com.apicloud.navigator.composite.ThemeUIComposite.java Source code

Java tutorial

Introduction

Here is the source code for com.apicloud.navigator.composite.ThemeUIComposite.java

Source

/**
 * APICloud Studio
 * Copyright (c) 2014-2015 by APICloud, Inc. All Rights Reserved.
 * Licensed under the terms of the GNU Public License (GPL) v3.
 * Please see the license.html included with this distribution for details.
 * Any modifications to this file must keep this entire header intact.
 */

package com.apicloud.navigator.composite;

import java.io.IOException;

import org.eclipse.core.runtime.FileLocator;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferenceConverter;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.browser.ProgressEvent;
import org.eclipse.swt.browser.ProgressListener;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FontDialog;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IPersistableElement;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.internal.WorkbenchPlugin;
import org.eclipse.ui.internal.themes.ThemeElementHelper;
import org.eclipse.ui.themes.ITheme;

import com.apicloud.navigator.ui.delegate.OpenAPICloudWizardActionDelegate;
import com.aptana.core.util.PlatformUtil;
import com.aptana.theme.Theme;
import com.aptana.theme.ThemePlugin;

@SuppressWarnings("restriction")
public class ThemeUIComposite {
    private UZWizardComposite browserComposite;
    private Shell parent;
    private Shell shell;
    private Font defaultFont;
    private boolean isHandler;

    public ThemeUIComposite(final Shell shell, String url, int w, int h, boolean isHandler) {
        this.shell = shell;
        this.isHandler = isHandler;
        Rectangle ret = shell.getBounds();
        parent = new Composite(shell, SWT.NONE);
        parent.addKeyListener(new KeyListener() {
            @Override
            public void keyReleased(KeyEvent e) {
                if (e.character == 27) {
                    shell.setEnabled(true);
                }
            }

            @Override
            public void keyPressed(KeyEvent e) {
                // TODO Auto-generated method stub
            }
        });
        parent.setBounds((ret.width - w) / 2, (ret.height - h) / 2, w, h);
        try {
            parent.setLayout(new FillLayout());
            browserComposite = new UZWizardComposite(parent, SWT.NONE, url);
            browserComposite.addKeyListener(new KeyListener() {

                @Override
                public void keyReleased(KeyEvent e) {
                    if (e.character == 27) {
                        shell.setEnabled(true);
                    }
                }

                @Override
                public void keyPressed(KeyEvent e) {
                    // TODO Auto-generated method stub

                }
            });
            if (PlatformUtil.isWindows()) {
                Browser browser = (Browser) browserComposite.getBrowser();
                browser.addProgressListener(new ProgressListener() {
                    @Override
                    public void completed(ProgressEvent event) {
                        ThemeUIComposite.this.registerWizardFunction(browserComposite);
                    }

                    public void changed(ProgressEvent event) {
                    }
                });
            } else {
                Browser browser = (Browser) browserComposite.getBrowser();
                browser.addProgressListener(new ProgressListener() {
                    @Override
                    public void completed(ProgressEvent event) {
                        ThemeUIComposite.this.registerWizardFunction(browserComposite);
                    }

                    public void changed(ProgressEvent event) {
                    }
                });
            }
            this.browserComposite.forceFocus();
            shell.setEnabled(false);
            parent.open();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    protected void registerWizardFunction(final UZWizardComposite browserComposite) {
        browserComposite.registerFunction("closea", new UZWizardComposite.IScriptHandler() {
            public Object handle(Object[] arguments) {
                shell.setEnabled(true);
                parent.close();
                if (!isHandler) {
                    showUZWizard();
                }
                return null;
            }

        });

        browserComposite.registerFunction("initFont", new UZWizardComposite.IScriptHandler() {
            public Object handle(Object[] arguments) {
                defaultFont = JFaceResources.getFontRegistry().get("org.eclipse.jface.textfont");
                if ((defaultFont == null) || (defaultFont.getFontData() == null)
                        || (defaultFont.getFontData().length <= 0)) {
                    return "";
                }
                FontData data = defaultFont.getFontData()[0];
                if (PlatformUtil.isWindows()) {
                    Browser browser = (Browser) browserComposite.getBrowser();
                    browser.execute(
                            "changeFont('" + data.getName() + "'," + Integer.valueOf(data.getHeight()) + ")");
                } else {
                    Browser browser = (Browser) browserComposite.getBrowser();
                    browser.execute(
                            "changeFont('" + data.getName() + "'," + Integer.valueOf(data.getHeight()) + ")");
                }
                return null;
            }
        });

        browserComposite.registerFunction("setTheme", new UZWizardComposite.IScriptHandler() {
            public Object handle(Object[] arguments) {
                String url;
                try {
                    url = FileLocator.toFileURL(super.getClass().getResource("/content/step5.html")).toString();
                    browserComposite.redirectTo(url);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return null;
            }

        });

        browserComposite.registerFunction("selectTheme", new UZWizardComposite.IScriptHandler() {
            public Object handle(Object[] arguments) {
                String themeName = (String) arguments[0];
                performDefaultTheme(themeName);
                return null;
            }
        });

        browserComposite.registerFunction("setFont", new UZWizardComposite.IScriptHandler() {
            public Object handle(Object[] arguments) {
                FontDialog fontDialog = new FontDialog(shell);
                fontDialog.setFontList(defaultFont.getFontData());
                FontData data = fontDialog.open();
                if (data == null)
                    return null;
                Font newFont = new Font(defaultFont.getDevice(), fontDialog.getFontList());
                if (defaultFont.equals(newFont)) {
                    return null;
                }
                FontData newData = newFont.getFontData()[0];
                defaultFont = newFont;
                setDefaultFont(newFont);
                if (PlatformUtil.isWindows()) {
                    Browser browser = (Browser) browserComposite.getBrowser();
                    browser.execute(
                            "changeFont('" + newData.getName() + "'," + Integer.valueOf(newData.getHeight()) + ")");
                } else {
                    Browser browser = (Browser) browserComposite.getBrowser();
                    browser.execute(
                            "changeFont('" + newData.getName() + "'," + Integer.valueOf(newData.getHeight()) + ")");
                }
                return null;
            }

        });

    }

    private void performDefaultTheme(String themeName) {
        com.aptana.theme.IThemeManager themeManager = ThemePlugin.getDefault().getThemeManager();
        Theme theme = themeManager.getTheme(themeName);
        if (theme == null) {
            return;
        }
        themeManager.setCurrentTheme(theme);
    }

    private void setDefaultFont(Font newFont) {
        String[] fontIds = { "org.eclipse.jface.textfont",
                "org.eclipse.ui.workbench.texteditor.blockSelectionModeFont" };
        FontData[] newData = newFont.getFontData();
        for (String fontId : fontIds) {
            setFont(fontId, newData);
        }

        newData = newFont.getFontData();
        FontData[] smaller = new FontData[newData.length];
        int j = 0;
        for (FontData fd : newData) {
            int height = fd.getHeight();
            if (height >= 12) {
                fd.setHeight(height - 2);
            } else if (height >= 10) {
                fd.setHeight(height - 1);
            }
            smaller[(j++)] = fd;
        }
        setFont("com.aptana.explorer.font", smaller);
    }

    private void setFont(String fontId, FontData[] data) {
        String fdString = PreferenceConverter.getStoredRepresentation(data);

        Font existing = JFaceResources.getFont(fontId);
        String existingString = "";
        if (!(existing.isDisposed())) {
            existingString = PreferenceConverter.getStoredRepresentation(existing.getFontData());
        }
        if (existingString.equals(fdString)) {
            return;
        }
        JFaceResources.getFontRegistry().put(fontId, data);

        ITheme currentTheme = PlatformUI.getWorkbench().getThemeManager().getCurrentTheme();
        String key = ThemeElementHelper.createPreferenceKey(currentTheme, fontId);
        IPreferenceStore store = WorkbenchPlugin.getDefault().getPreferenceStore();
        store.setValue(key, fdString);
    }

    private void showUZWizard() {
        IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
        if (OpenAPICloudWizardActionDelegate.input == null) {
            OpenAPICloudWizardActionDelegate.input = new IEditorInput() {
                @SuppressWarnings("rawtypes")
                public Object getAdapter(Class adapter) {
                    return null;
                }

                public String getToolTipText() {
                    return "test";
                }

                public IPersistableElement getPersistable() {
                    return null;
                }

                public String getName() {
                    return "uz";
                }

                public ImageDescriptor getImageDescriptor() {
                    return null;
                }

                public boolean exists() {
                    return true;
                }
            };
        }
        IEditorPart part = page.findEditor(OpenAPICloudWizardActionDelegate.input);
        if (part != null) {
            page.bringToTop(part);
            return;
        }
        try {
            IDE.openEditor(page, OpenAPICloudWizardActionDelegate.input, "com.apicloud.navigator.APICloudWizard");
        } catch (PartInitException e) {
            e.printStackTrace();
        }

    }

    public void setFocus() {
        shell.setFocus();
    }

    public void close() {
        Display.getCurrent().asyncExec(new Runnable() {
            @Override
            public void run() {
                shell.setEnabled(true);
                parent.close();
            }
        });
    }

    class Composite extends Shell {
        private Shell shell;

        public Composite(Shell parent, int style) {
            super(parent, style);
            this.shell = parent;
            // TODO Auto-generated constructor stub
        }

        @Override
        public void close() {
            shell.setEnabled(true);
            super.close();
        }

        @Override
        protected void checkSubclass() {
            // TODO Auto-generated method stub
        }
    }
}