org.eclipse.wazaabi.ui.runtime.parts.PropertySheetPage.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.wazaabi.ui.runtime.parts.PropertySheetPage.java

Source

/*******************************************************************************
 * Copyright (c) 2008 Olivier Moises
 *
 * 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:
 *   Olivier Moises- initial API and implementation
 *******************************************************************************/

package org.eclipse.wazaabi.ui.runtime.parts;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.views.properties.IPropertySheetPage;
import org.eclipse.wazaabi.engine.core.editparts.ContainerEditPart;
import org.eclipse.wazaabi.mm.core.styles.CoreStylesFactory;
import org.eclipse.wazaabi.mm.core.styles.StackLayoutRule;
import org.eclipse.wazaabi.mm.core.styles.StyleRule;
import org.eclipse.wazaabi.mm.core.widgets.AbstractComponent;
import org.eclipse.wazaabi.ui.model.parts.Page;

public class PropertySheetPage extends WazaabiPage implements IPropertySheetPage, IAdaptable {

    private Page modelPage = null;
    private URI uri;

    public PropertySheetPage() {
    }

    public PropertySheetPage(String uri) {
        this(URI.createURI(uri));
    }

    public PropertySheetPage(URI uri) {
        if (uri == null)
            throw new NullPointerException("URI cannot be null"); //$NON-NLS-1$
        this.uri = uri;
    }

    public PropertySheetPage(Page modelPage) {
        this.modelPage = modelPage;
        initializeCodeDescriptors(modelPage);
    }

    @SuppressWarnings("rawtypes")
    public Object getAdapter(Class adapter) {
        return null;
    }

    public void selectionChanged(IWorkbenchPart part, ISelection selection) {
        Object input = null;

        // TODO : when the selection has IPropertySource, transform property
        // sources into relevant objects
        if (selection instanceof StructuredSelection) {
            StructuredSelection structuredSelection = (StructuredSelection) selection;
            if (structuredSelection.size() == 1)
                if (getSelectionProcessorCodeDescriptor() != null && getGetObjectMethodDescriptor() != null)
                    input = getSelectionProcessorCodeDescriptor().invokeMethod(getGetObjectMethodDescriptor(),
                            new Object[] { structuredSelection.getFirstElement() });
                else
                    input = structuredSelection.getFirstElement();
            else {
                List<Object> transformedObjects = new ArrayList<Object>();
                for (Object item : structuredSelection.toArray()) {
                    if (getSelectionProcessorCodeDescriptor() != null && getGetObjectMethodDescriptor() != null)
                        input = getSelectionProcessorCodeDescriptor().invokeMethod(getGetObjectMethodDescriptor(),
                                new Object[] { item });
                    else
                        input = item;
                    transformedObjects.add(input);
                }
                input = transformedObjects;
            }
        }
        if (getSelectedComponent() != null)
            unsetInput(getSelectedComponent());
        updateSelectedComponent(input);
        if (getSelectedComponent() != null)
            setInput(getSelectedComponent(), input);
    }

    protected void updateSelectedComponent(Object input) {
        AbstractComponent ui = getUi(input);
        if (ui != BLANK_CONTAINER) {
            for (AbstractComponent child : getModelPage().getChildren())
                if (ui == child) {
                    setSelectedComponent(ui);
                    return;
                }
            getModelPage().getChildren().add(ui);
            setSelectedComponent(ui);
        } else
            setSelectedComponent(null);
    }

    protected AbstractComponent getSelectedComponent() {
        StackLayoutRule stackLayoutRule = getStackLayoutRule();
        if (stackLayoutRule != null && stackLayoutRule.getTop() != -1)
            return getModelPage().getChildren().get(stackLayoutRule.getTop());
        return null;
    }

    protected void setSelectedComponent(AbstractComponent component) {
        StackLayoutRule stackLayoutRule = getStackLayoutRule();
        // If no StackLayout found, we add a new one
        if (stackLayoutRule == null) {
            stackLayoutRule = CoreStylesFactory.eINSTANCE.createStackLayoutRule();
            stackLayoutRule.setPropertyName(ContainerEditPart.LAYOUT_PROPERTY_NAME);
            getModelPage().getStyleRules().add(stackLayoutRule);
        }
        if (component == null && stackLayoutRule.getTop() != -1) {
            stackLayoutRule.setTop(-1);
            return;
        }
        if (stackLayoutRule.getTop() != getModelPage().getChildren().indexOf(component))
            stackLayoutRule.setTop(getModelPage().getChildren().indexOf(component));
    }

    public void setActionBars(IActionBars actionBars) {

    }

    protected StackLayoutRule getStackLayoutRule() {
        // Do we have a StackLayout ?
        for (StyleRule rule : getModelPage().getStyleRules())
            if (ContainerEditPart.LAYOUT_PROPERTY_NAME.equals(rule.getPropertyName())
                    && rule instanceof StackLayoutRule) {
                return (StackLayoutRule) rule;
            }
        return null;
    }

    @Override
    public void dispose() {
        if (getSelectedComponent() != null)
            unsetInput(getSelectedComponent());
        setModelPage(null);
        super.dispose();
    }

    protected Page getModelPage() {
        return modelPage;
    }

    protected void setModelPage(Page modelPage) {
        this.modelPage = modelPage;
    }

    protected void createContent() {

    }

    protected void initializeContent() {
        if (getModelPage() != null)
            return;
        if (getUri() != null) {
            Resource resource = null;
            try {
                resource = new ResourceSetImpl().getResource(getUri(), true); //$NON-NLS-1$
            } catch (Throwable t) {
                // TODO : log this
                t.printStackTrace();
            }
            if (resource != null && !resource.getContents().isEmpty()
                    && resource.getContents().get(0) instanceof Page) {
                setModelPage((Page) resource.getContents().get(0));
                initializeCodeDescriptors((Page) resource.getContents().get(0));
            }
        } // else log : no propertypage found
    }

    protected ResourceSet getResourceSet() {
        if (getModelPage() != null && getModelPage().eResource() != null
                && getModelPage().eResource().getResourceSet() != null)
            return getModelPage().eResource().getResourceSet();
        else
            return super.getResourceSet();
    }

    protected void initializeViewer() {
        getViewer().setContents(getModelPage());
    }

    public URI getUri() {
        return uri;
    }

}