org.multicore_association.shim.edit.actions.PasteChildAction.java Source code

Java tutorial

Introduction

Here is the source code for org.multicore_association.shim.edit.actions.PasteChildAction.java

Source

/*
 * Copyright (c) 2014 eSOL Co.,Ltd. and Nagoya University
 *
 * This software is released under the MIT License.
 * http://opensource.org/licenses/mit-license.php
 */
package org.multicore_association.shim.edit.actions;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.xml.bind.annotation.XmlType;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TreeItem;
import org.multicore_association.shim.edit.gui.common.CommonConstants;
import org.multicore_association.shim.edit.gui.jface.SHIMEditJFaceApplicationWindow;
import org.multicore_association.shim.edit.log.ShimLoggerUtil;
import org.multicore_association.shim.edit.model.ShimModelAdapter;
import org.multicore_association.shim.edit.model.ShimModelManager;

import com.sun.xml.internal.ws.util.StringUtils;

/**
 * Pastes items as a child element.
 */
public class PasteChildAction extends Action {

    private static final Logger log = ShimLoggerUtil.getLogger(PasteChildAction.class);

    private static final String ERROR_MSG_HEADER = "Schema error: ";

    private TreeViewer viewer;

    private Shell shell;

    /**
     * Constructs a new instance of PasteChildAction.
     * 
     * @param viewer
     *            the tree viewer with this menu
     */
    public PasteChildAction(TreeViewer viewer) {
        this.viewer = viewer;
        this.shell = viewer.getControl().getShell();
    }

    /**
     * @see org.eclipse.jface.action.Action#getText()
     */
    @Override
    public String getText() {
        return "Paste Item@Ctrl+V";
    }

    /**
     * @see org.eclipse.jface.action.Action#isEnabled()
     */
    @Override
    public boolean isEnabled() {
        return MyClipboard.canPaste() && viewer.getTree().getSelectionCount() == 1;
    }

    /**
     * @see org.eclipse.jface.action.Action#run()
     */
    @SuppressWarnings("unchecked")
    @Override
    public void run() {
        log.finest("[Action] Paste Item start");

        Object obj = MyClipboard.Paste();
        if (obj instanceof List<?>) {
            List<Object> objlist = (List<Object>) obj;
            log.finest("Multi Paste select count=" + objlist.size());
        } else {
            log.finest("Single Paste select obj=" + obj.getClass().getName());
        }

        // Select Paste parent Node
        TreeItem[] selections = viewer.getTree().getSelection();
        if (selections.length == 0) {
            return;
        }
        TreeItem pasteParentNodeItem = selections[0];
        if (pasteParentNodeItem == null) {
            log.finest("* select nothing *");
            return;
        }
        log.log(Level.FINEST, "paste Parent Node Item=" + pasteParentNodeItem.getText());

        Object selobj = MyClipboard.Paste();
        int open = SWT.YES;

        if (!(selobj instanceof List<?>)) {

            Object _data = selobj;

            log.finest("Paste Item =" + MyClipboard.Paste());

            Object pasteParentObject = pasteParentNodeItem.getData();
            ArrayList<Class<?>> children = ShimModelAdapter.getChildren(pasteParentObject);
            boolean canPaste = false;
            boolean canOverwrite = false;
            for (Class<?> child : children) {
                if (!_data.getClass().equals(child)) {
                    continue;
                }

                Object newChildObject = ShimModelAdapter.getNewInstance(child);

                if (newChildObject == null) {
                    continue;
                }

                String valueName = StringUtils.decapitalize(child.getSimpleName());
                Object childObject = ShimModelAdapter.getValObject(pasteParentObject, valueName);

                if (childObject instanceof List) {
                    List<Object> list = (List<Object>) childObject;
                    list.add(_data);
                    canPaste = true;
                    break;

                } else if (childObject != null) {

                    MessageBox box = new MessageBox(shell, SWT.YES | SWT.NO);
                    box.setText(CommonConstants.QUESTION_DIALOG_TITLE);
                    box.setMessage(String.format(CommonConstants.MESSAGE_OVERWRITE_ELEMENT,
                            ShimLoggerUtil.getElementName(child)));
                    open = box.open();

                    if (open == SWT.YES) {
                        Object topObject = viewer.getTree().getData();
                        ShimModelManager.removeObject(pasteParentObject, childObject, topObject, true);

                        // Action: over write
                        ShimModelAdapter.setValObject(pasteParentObject, valueName, _data);
                        canOverwrite = true;

                    } else {
                        log.info("Paste: Overwrite is canceled. item=" + ShimLoggerUtil.getNameProperty(_data));
                    }
                    break;
                } else {
                    ShimModelAdapter.setValObject(pasteParentObject, valueName, _data);
                    canPaste = true;
                    break;
                }
            }

            if (canPaste || canOverwrite) {
                log.info("Paste: item=" + ShimLoggerUtil.getNameProperty(_data));
            }

            if (canPaste) {
                log.finest("Paste:Add.");
            } else if (canOverwrite) {
                log.finest("Paste:Overwrite.");
            } else if (open != SWT.NO) {
                // if can not paste, open ErrorDialog.
                StringBuilder msg = new StringBuilder(ERROR_MSG_HEADER);
                try {
                    XmlType xmlType = _data.getClass().getAnnotation(XmlType.class);
                    XmlType pXmlType = pasteParentObject.getClass().getAnnotation(XmlType.class);
                    if (xmlType != null) {
                        msg.append("CopyElement=");
                        msg.append(xmlType.name());
                    }
                    if (pXmlType != null) {
                        msg.append(", PasteTargetElement=");
                        msg.append(pXmlType.name());
                    }
                } catch (Exception e) {
                }
                log.warning("Can not Paste this item. : " + msg.toString());

                ErrorDialog.openError(viewer.getControl().getShell(), "Warning", "Can not Paste this item.",
                        new Status(IStatus.WARNING, this.getClass().getName(), msg.toString()));
            }

        } else {
            // ----------------------------------------------
            // Multi-select Paste

            List<Object> _dataList = (List<Object>) selobj;

            Object pasteParentObject = pasteParentNodeItem.getData();

            List<Object> pasteFailedData = new ArrayList<Object>();

            for (Object _data : _dataList) {

                log.finest("Paste Item =" + MyClipboard.Paste());

                ArrayList<Class<?>> children = ShimModelAdapter.getChildren(pasteParentObject);
                boolean canPaste = false;
                boolean canOverwrite = false;
                for (Class<?> child : children) {
                    if (!_data.getClass().equals(child)) {
                        continue;
                    }

                    Object newChildObject = ShimModelAdapter.getNewInstance(child);

                    if (newChildObject == null) {
                        continue;
                    }

                    String valueName = StringUtils.decapitalize(child.getSimpleName());
                    Object childObject = ShimModelAdapter.getValObject(pasteParentObject, valueName);

                    if (childObject instanceof List) {
                        List<Object> list = (List<Object>) childObject;
                        list.add(_data);
                        canPaste = true;
                        break;
                    } else if (childObject != null) {

                        MessageBox box = new MessageBox(shell, SWT.YES | SWT.NO);
                        box.setText(CommonConstants.QUESTION_DIALOG_TITLE);
                        box.setMessage(String.format(CommonConstants.MESSAGE_OVERWRITE_ELEMENT,
                                ShimLoggerUtil.getElementName(child)));
                        open = box.open();

                        if (open == SWT.YES) {
                            Object topObject = viewer.getTree().getData();
                            ShimModelManager.removeObject(pasteParentObject, childObject, topObject, true);

                            // Action: over write
                            ShimModelAdapter.setValObject(pasteParentObject, valueName, _data);
                            canOverwrite = true;

                            log.log(Level.FINEST, "Paste Object CanOverwite = true");
                        } else {
                            log.info("Paste: Overwrite is canceled. item=" + ShimLoggerUtil.getNameProperty(_data));
                        }
                        break;
                    } else {
                        ShimModelAdapter.setValObject(pasteParentObject, valueName, _data);
                        canPaste = true;
                        break;
                    }
                }

                if (canPaste || canOverwrite) {
                    log.info("Paste: item=" + ShimLoggerUtil.getNameProperty(_data));
                }

                if (canPaste) {
                    log.finest("Paste:Add.");
                } else if (canOverwrite) {
                    log.finest("Paste:Overwrite.");
                } else if (open != SWT.NO) {
                    log.finest("Can not Paste this item.");
                    pasteFailedData.add(_data);
                }
            }

            // if can not paste, open ErrorDialog.
            if (!pasteFailedData.isEmpty()) {
                StringBuilder msg = new StringBuilder(ERROR_MSG_HEADER);
                for (Object failedData : pasteFailedData) {
                    try {
                        StringBuilder newLine = new StringBuilder();
                        XmlType xmlType = failedData.getClass().getAnnotation(XmlType.class);
                        XmlType pXmlType = pasteParentObject.getClass().getAnnotation(XmlType.class);
                        if (xmlType != null) {
                            newLine.append("CopyElement=");
                            newLine.append(xmlType.name());
                        }
                        if (pXmlType != null) {
                            newLine.append(", PasteTargetElement=");
                            newLine.append(pXmlType.name());
                        }
                        if (newLine.length() > 0) {
                            newLine.append("\n");
                            msg.append(newLine);
                        }
                    } catch (Exception e) {
                    }
                }
                ErrorDialog.openError(viewer.getControl().getShell(), "Warning", "Can not Paste this item.",
                        new Status(IStatus.WARNING, this.getClass().getName(), msg.toString()));
                log.warning("Can not Paste this item. : " + msg.toString());
            }
        }

        viewer.refresh();

        pasteParentNodeItem = null;

        if (SHIMEditJFaceApplicationWindow.window != null) {
            SHIMEditJFaceApplicationWindow.window.setInputToEachCurrentInputPannel();
        }

        super.run();
    }
}