com.nokia.tools.screen.ui.propertysheet.tabbed.MultipleSelectionWidgetSection.java Source code

Java tutorial

Introduction

Here is the source code for com.nokia.tools.screen.ui.propertysheet.tabbed.MultipleSelectionWidgetSection.java

Source

/*
* Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies). 
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:
*
*/
package com.nokia.tools.screen.ui.propertysheet.tabbed;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.gef.commands.CommandStack;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IWorkbenchPart;

import com.nokia.tools.content.core.IContentData;
import com.nokia.tools.editing.core.EditingUtil;
import com.nokia.tools.editing.ui.command.ApplyFeatureCommand;
import com.nokia.tools.editing.ui.command.CommandBuilder;
import com.nokia.tools.screen.core.IScreenElement;
import com.nokia.tools.screen.core.JEMUtil;

public abstract class MultipleSelectionWidgetSection extends WidgetSection {

    private List<IScreenElement> elements;

    private List<EObject> targets;

    private List<EObject> widgets;

    private List<IContentData> contents;

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISection#setInput(org.eclipse.ui.IWorkbenchPart,
     *      org.eclipse.jface.viewers.ISelection)
     */
    public final void setInput(IWorkbenchPart part, ISelection selection) {
        super.setInput(part, selection);

        removeRefreshAdapters();

        elements = new ArrayList<IScreenElement>();
        targets = new ArrayList<EObject>();
        widgets = new ArrayList<EObject>();
        contents = new ArrayList<IContentData>();
        IStructuredSelection ssel = (IStructuredSelection) selection;

        for (Iterator iter = ssel.iterator(); iter.hasNext();) {
            Object obj = iter.next();
            IScreenElement adapter = JEMUtil.getScreenElement(obj);
            if (adapter != null) {
                IScreenElement element = adapter;
                if (adapter.getTargetAdapter() != null) {
                    adapter = adapter.getTargetAdapter();
                }

                EObject target = doSetInput(part, adapter);
                if (target != null) {
                    if (!(elements.contains(element) && targets.contains(target))) {
                        elements.add(element);
                        targets.add(target);
                        widgets.add(adapter.getWidget());
                        contents.add(element.getData());
                    }
                } else {
                    IContentData data = JEMUtil.getContentData(obj);
                    if (data != null) {
                        contents.add(data);
                    }
                }
            } else {
                IContentData data = JEMUtil.getContentData(obj);
                if (data != null) {
                    contents.add(data);
                }
            }
        }
        for (EObject target : targets) {
            addRefreshAdapter(target);
        }
        for (IContentData data : contents) {
            addRefreshAdapter(data);
        }

        clearErrorMessage();
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.nokia.tools.screen.ui.propertysheet.tabbed.WidgetSection#removeRefreshAdapters()
     */
    protected void removeRefreshAdapters() {
        if (targets != null) {
            for (EObject target : targets) {
                removeRefreshAdapter(target);
            }
        }
        if (contents != null) {
            for (IContentData data : contents) {
                removeRefreshAdapter(data);
            }
        }
    }

    /**
     * @return Returns the elements.
     */
    public IScreenElement[] getElements() {
        return elements.toArray(new IScreenElement[0]);
    }

    /**
     * @return Returns the element widgets.
     */
    public EObject[] getWidgets() {
        return widgets.toArray(new EObject[0]);
    }

    /**
     * @return Returns the targets.
     */
    public EObject[] getTargets() {
        return targets.toArray(new EObject[0]);
    }

    public IContentData[] getContents() {
        return contents.toArray(new IContentData[0]);
    }

    public IScreenElement getElement(EObject target) {
        int idx = targets.indexOf(target);
        if (idx >= 0) {
            return elements.get(idx);
        }
        return null;
    }

    public EObject getTarget(IScreenElement element) {
        int idx = elements.indexOf(element);
        if (idx >= 0) {
            return targets.get(idx);
        }
        return null;
    }

    public IScreenElement getFirstElement() {
        if (elements.size() > 0) {
            return elements.get(0);
        }
        return null;
    }

    public EObject getFirstTarget() {
        if (null != targets) {
            if (targets.size() > 0) {
                return targets.get(0);
            }
        }
        return null;
    }

    public EObject getFirstWidget() {
        if (widgets.size() > 0) {
            return widgets.get(0);
        }
        return null;
    }

    public IContentData getFirstContent() {
        if (contents.size() > 0) {
            return contents.get(0);
        }
        return null;
    }

    public void applyAttributeSetting(String featureName, Object value) {
        if (targets.isEmpty()) {
            return;
        }
        applyAttributeSetting(EditingUtil.getFeature(targets.get(0), featureName), value);
    }

    protected void applyAttributeSetting(EStructuralFeature feature, Object value) {

        if (!isDirty) {
            return;
        }

        isDirty = false;

        CommandStack commandStack = (CommandStack) getPart().getAdapter(CommandStack.class);

        if (targets.size() == 0 || commandStack == null) {
            return;
        }

        if (validatePropertyValue(feature, value)) {
            CommandBuilder builder = new CommandBuilder(
                    Messages.Command_Apply + " " + customizeFeatureName(feature), isForwardUndo());
            buildCommand(builder, getElements(), getTargets(), feature, value);
            applyParentAttributeSettings(builder);

            suppressStackEvent = true;
            try {
                commandStack.execute(builder.getCommand());
            } finally {
                suppressStackEvent = false;
            }
        }
    }

    protected Object getFeatureValue(EObject widget, String path) {
        return getFeatureValues(new EObject[] { widget }, path)[0];
    }

    protected Object[] getFeatureValues(EObject[] widgets, String path) {
        StringTokenizer st = new StringTokenizer(path, "\\/");
        Object[] values = new Object[widgets.length];
        while (st.hasMoreTokens()) {
            String featureName = st.nextToken();
            for (int i = 0; i < widgets.length; i++) {
                if (widgets[i] != null) {
                    values[i] = EditingUtil.getFeatureValue((EObject) widgets[i], featureName);
                } else {
                    values[i] = null;
                }
            }
        }
        return values;
    }

    protected EObject[] getFeatureObjects(EObject[] widgets, String path) {
        Object[] values = getFeatureValues(widgets, path);
        EObject[] objects = new EObject[values.length];
        for (int i = 0; i < values.length; i++) {
            objects[i] = createEditObject(values[i]);
        }
        return objects;
    }

    protected void buildCommand(CommandBuilder builder, IScreenElement[] elements, EObject[] targets,
            EStructuralFeature feature, Object[] newValue) {
        for (int i = 0; i < targets.length; i++) {
            builder.applyFeature(new ApplyFeatureCommand(), targets[i], feature, newValue[i]);
        }
    }

    protected void buildCommand(CommandBuilder builder, IScreenElement[] elements, EObject[] targets,
            EStructuralFeature feature, Object newValue) {
        for (int i = 0; i < targets.length; i++) {
            builder.applyFeature(new ApplyFeatureCommand(), targets[i], feature, newValue);
        }
    }
}