org.eclipse.rap.ui.interactiondesign.internal.ConfigurableStackProxy.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.rap.ui.interactiondesign.internal.ConfigurableStackProxy.java

Source

/*******************************************************************************
 * Copyright (c) 2009, 2012 EclipseSource and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    EclipseSource - initial API and implementation
 ******************************************************************************/
package org.eclipse.rap.ui.interactiondesign.internal;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.rap.ui.interactiondesign.ConfigurableStack;
import org.eclipse.rap.ui.internal.branding.BrandingUtil;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.internal.presentations.NativeStackPresentation;
import org.eclipse.ui.internal.presentations.PresentablePart;
import org.eclipse.ui.presentations.IPartMenu;
import org.eclipse.ui.presentations.IPresentablePart;
import org.eclipse.ui.presentations.IPresentationSerializer;
import org.eclipse.ui.presentations.IStackPresentationSite;
import org.eclipse.ui.presentations.StackDropResult;
import org.eclipse.ui.presentations.StackPresentation;

/**
 * This is the proxy object for <code>ConfigurableStack</code>. The <code>
 * PresentationFactory</code> creates proxies instead of real <code>
 * ConfigurableStack</code>s to be able to switch the presentation on the fly.
 * 
 * @since 1.2
 */
public class ConfigurableStackProxy extends StackPresentation {

    public static final String STACK_PRESENTATION_ID = "stackPresentationId";

    private IConfigurationElement brandingElement;

    private String currentId;

    private StackPresentation currentStackPresentation;
    private NativeStackPresentation nativeStackPresentation;
    private Composite parent;
    private boolean showTitle = false;
    private IStackPresentationSite site;

    private String type;

    public ConfigurableStackProxy(final Composite parent, final IStackPresentationSite stackSite,
            final String type) {
        super(stackSite);
        this.parent = parent;
        this.site = stackSite;
        this.type = type;
        currentId = "";
        nativeStackPresentation = new NativeStackPresentation(parent, stackSite);

        currentStackPresentation = loadStackPresentations(this.type, this.site, this.parent);
        if (currentStackPresentation == null) {
            currentStackPresentation = nativeStackPresentation;
        }
    }

    public void addPart(final IPresentablePart newPart, final Object cookie) {
        StackPresentation delegate = getDelegate();
        if (delegate instanceof ConfigurableStack) {
            IAdaptable adaptable = getConfigAdaptable();
            if (newPart instanceof PresentablePart) {
                PresentablePart part = (PresentablePart) newPart;
                part.setConfigurationAdaptable(adaptable);
            }
        }
        delegate.addPart(newPart, cookie);
    }

    private boolean brandingPresentationFactoryExists() {
        boolean result = false;
        String id = getBrandingPresentationFactoryId();
        if (id != null) {
            result = true;
        }
        return result;
    }

    /**
     * @see StackPresentation
     */
    public Point computeMinimumSize() {
        return getDelegate().computeMinimumSize();
    }

    public int computePreferredSize(boolean width, int availableParallel, int availablePerpendicular,
            int preferredResult) {
        return getDelegate().computePreferredSize(width, availableParallel, availablePerpendicular,
                preferredResult);
    }

    private ConfigurableStack createStackById(final String stackId) {
        ConfigurableStack result = null;
        IExtensionRegistry registry = Platform.getExtensionRegistry();
        String stackPresentationExtId = ConfigurableStack.STACK_PRESENTATION_EXT_ID;
        IExtensionPoint point = registry.getExtensionPoint(stackPresentationExtId);
        if (point != null) {
            IConfigurationElement[] elements = point.getConfigurationElements();
            boolean found = false;
            for (int i = 0; i < elements.length && !found; i++) {
                String id = elements[i].getAttribute("id");
                //String presentationType = elements[ i ].getAttribute( "type" );
                if (id.equals(stackId)) {
                    found = true;
                    try {
                        Object obj = elements[i].createExecutableExtension("class");
                        result = (ConfigurableStack) obj;
                        result.init(site, id, parent, this);
                    } catch (CoreException e) {
                        // nothing todo
                    }
                }
            }
        }
        return result;
    }

    /**
     * @see StackPresentation
     */
    public void dispose() {
        getDelegate().dispose();
    }

    private IConfigurationElement getBrandingElement() {
        if (brandingElement == null) {
            String brandingId = BrandingUtil.getCurrentBrandingId();
            if (brandingId != null) {
                IExtensionRegistry registry = Platform.getExtensionRegistry();
                String id = "org.eclipse.rap.ui.branding";
                IExtensionPoint brandingPoint = registry.getExtensionPoint(id);
                if (brandingPoint != null) {
                    IConfigurationElement[] elements = brandingPoint.getConfigurationElements();

                    boolean found = false;
                    for (int i = 0; i < elements.length && !found; i++) {
                        String tempId = elements[i].getAttribute("id");
                        if (tempId.equals(brandingId)) {
                            found = true;
                            brandingElement = elements[i];
                        }
                    }
                }
            }
        }
        return brandingElement;
    }

    // Delegate methods

    private String getBrandingPresentationFactoryId() {
        return loadBrandingPresentationFactoryId(getBrandingElement());
    }

    private IAdaptable getConfigAdaptable() {
        IAdaptable adaptable = new IAdaptable() {

            public Object getAdapter(Class adapter) {
                Object result = null;
                if (currentStackPresentation instanceof ConfigurableStack) {
                    ConfigurableStack stackPresentation = (ConfigurableStack) currentStackPresentation;
                    if (adapter == ToolBar.class) {
                        result = stackPresentation.createPartToolBar();
                    } else if (adapter == IPartMenu.class) {
                        result = stackPresentation.createViewMenu();
                    }
                }
                return result;
            }

        };
        return adaptable;
    }

    /**
     * @see StackPresentation
     */
    public Control getControl() {
        return getDelegate().getControl();
    }

    public ConfigurableStack getCurrentStackPresentation() {
        ConfigurableStack result = null;
        if (currentStackPresentation instanceof ConfigurableStack) {
            result = (ConfigurableStack) currentStackPresentation;
        }
        return result;
    }

    private StackPresentation getDelegate() {
        StackPresentation result;
        if (currentStackPresentation != null) {
            result = currentStackPresentation;
        } else {
            result = nativeStackPresentation;
        }
        return result;
    }

    /**
     * @see StackPresentation
     */
    public boolean getShowTitle() {
        return showTitle;
    }

    /**
     * @see StackPresentation
     */
    public int getSizeFlags(final boolean width) {
        return getDelegate().getSizeFlags(width);
    }

    /**
     * @see StackPresentation
     */
    public Control[] getTabList(final IPresentablePart part) {
        return getDelegate().getTabList(part);
    }

    /**
     * Returns the type of the Stack. 
     * @return the type. See <code>PresentationFactory</code> constants.
     */
    public String getType() {
        return type;
    }

    private String loadBrandingPresentationFactoryId(final IConfigurationElement element) {
        String result = null;
        if (element != null) {
            IConfigurationElement[] factory = element.getChildren("presentationFactory");
            if (factory.length > 0) {
                result = factory[0].getAttribute("id");
            }
        }
        return result;
    }

    private ConfigurableStack loadDefaultPartStack() {
        ConfigurableStack result = null;
        IConfigurationElement element = getBrandingElement();
        IConfigurationElement[] factory = element.getChildren("presentationFactory");
        if (factory.length > 0) {
            IConfigurationElement[] stacks = factory[0].getChildren("defaultStackPresentation");
            if (stacks.length > 0) {
                String id = stacks[0].getAttribute("id");
                result = createStackById(id);
            }
        }
        return result;
    }

    private ConfigurableStack loadLayoutPartStack() {
        ConfigurableStack result = null;
        IConfigurationElement element = getBrandingElement();
        IConfigurationElement[] factory = element.getChildren("presentationFactory");
        if (factory.length > 0) {
            IConfigurationElement[] stacks = factory[0].getChildren("stackPresentation");
            if (stacks.length > 0) {
                String layoutPartId = ConfigurableStack.getLayoutPartId(site);
                boolean found = false;
                for (int i = 0; i < stacks.length && !found; i++) {
                    String partId = stacks[i].getAttribute("partId");
                    if (partId.equals(layoutPartId)) {
                        String stackId = stacks[i].getAttribute("id");
                        result = createStackById(stackId);
                        found = true;
                    }
                }
            }
        }
        return result;
    }

    private ConfigurableStack loadStackFromBranding() {
        ConfigurableStack result = loadLayoutPartStack();
        if (result == null) {
            result = loadDefaultPartStack();
        }
        return result;
    }

    /*
     * load the saved or default StackPresentation from extension registry
     */
    private ConfigurableStack loadStackPresentations(final String type, final IStackPresentationSite site,
            final Composite parent) {
        this.parent = parent;
        ConfigurableStack result = null;
        IExtensionRegistry registry = Platform.getExtensionRegistry();
        String stackPresentationExtId = ConfigurableStack.STACK_PRESENTATION_EXT_ID;
        IExtensionPoint point = registry.getExtensionPoint(stackPresentationExtId);
        if (point != null) {
            IConfigurationElement[] elements = point.getConfigurationElements();

            String savedStackId = ConfigurableStack.getSavedStackId(site);

            boolean error = false;
            boolean found = false;
            for (int i = 0; !error && !found && i < elements.length; i++) {

                String id = elements[i].getAttribute("id");
                String presentationType = elements[i].getAttribute("type");

                if (savedStackId.equals(IPreferenceStore.STRING_DEFAULT_DEFAULT)) {
                    // No id is saved, check branding Presentationfactory
                    if (brandingPresentationFactoryExists()) {
                        ConfigurableStack tempStack = loadStackFromBranding();
                        if (tempStack != null) {
                            result = tempStack;
                            currentId = id;
                        } else {
                            result = null;
                        }
                        found = true;
                    } else {
                        result = null;
                        found = true;
                    }

                } else {
                    // their is a saved id, loading the stackPresentation if the id 
                    // matches the saved id
                    if (id.equals(savedStackId) && presentationType.equals(type)) {
                        result = createStackById(id);
                        currentId = id;
                        found = true;
                    }
                }

            }
        }
        return result;
    }

    /**
     * @see StackPresentation
     */
    public void movePart(final IPresentablePart toMove, final Object cookie) {
        getDelegate().movePart(toMove, cookie);
    }

    /**
     * @see StackPresentation
     */
    public void refreshStack() {
        if (!currentId.equals("")) {
            setCurrentStackPresentation(currentId);
        }

    }

    /**
     * @see StackPresentation
     */
    public void removePart(final IPresentablePart oldPart) {
        getDelegate().removePart(oldPart);
    }

    /**
     * @see StackPresentation
     */
    public void restoreState(final IPresentationSerializer context, final IMemento memento) {
        getDelegate().restoreState(context, memento);
    }

    /**
     * @see StackPresentation
     */
    public void saveState(final IPresentationSerializer context, final IMemento memento) {
        getDelegate().saveState(context, memento);
    }

    /**
     * @see StackPresentation
     */
    public void selectPart(final IPresentablePart toSelect) {
        getDelegate().selectPart(toSelect);
    }

    public StackDropResult dragOver(final Control currentControl, final Point location) {
        return null;
    }

    /**
     * @see StackPresentation
     */
    public void setActive(final int newState) {
        getDelegate().setActive(newState);
    }

    /**
     * @see StackPresentation
     */
    public void setBounds(final Rectangle bounds) {
        getDelegate().setBounds(bounds);
    }

    public void setCurrentStackPresentation(final String id) {

        IExtensionRegistry registry = Platform.getExtensionRegistry();
        String stackPresentationExtId = ConfigurableStack.STACK_PRESENTATION_EXT_ID;
        IExtensionPoint point = registry.getExtensionPoint(stackPresentationExtId);

        IConfigurationElement elements[] = point.getConfigurationElements();

        Object stackObj = null;
        for (int i = 0; stackObj == null && i < elements.length; i++) {
            String attributeId = elements[i].getAttribute("id");
            if (attributeId.equals(id)) {
                currentId = id;
                try {
                    Rectangle bounds = currentStackPresentation.getControl().getBounds();

                    stackObj = elements[i].createExecutableExtension("class");
                    if (stackObj instanceof ConfigurableStack) {

                        ConfigurableStack newStackPresentation = (ConfigurableStack) stackObj;
                        newStackPresentation.init(site, id, parent, this);

                        Control control = currentStackPresentation.getControl();
                        control.dispose();

                        IPresentablePart[] parts = site.getPartList();
                        for (int j = 0; j < parts.length; j++) {
                            newStackPresentation.addPart(parts[j], null);
                            currentStackPresentation.removePart(parts[j]);
                        }
                        newStackPresentation.selectPart(site.getSelectedPart());

                        currentStackPresentation.getControl().dispose();
                        currentStackPresentation.dispose();
                        currentStackPresentation = newStackPresentation;
                        currentStackPresentation.setBounds(bounds);

                    }
                } catch (CoreException e) {
                    e.printStackTrace();
                }

            }
        }

    }

    /**
     * @see StackPresentation
     */
    public void setShowTitle(boolean showTitle) {
        this.showTitle = showTitle;
    }

    /**
     * @see StackPresentation
     */
    public void setState(final int state) {
        getDelegate().setState(state);
    }

    /**
     * @see StackPresentation
     */
    public void setVisible(final boolean isVisible) {
        getDelegate().setVisible(isVisible);
    }

    /**
     * @see StackPresentation
     */
    public void showPaneMenu() {
        getDelegate().showPaneMenu();
    }

    /**
     * @see StackPresentation
     */
    public void showPartList() {
        getDelegate().showPartList();
    }

    /**
     * @see StackPresentation
     */
    public void showSystemMenu() {
        getDelegate().showSystemMenu();
    }

}