nexcore.tool.uml.ui.property.section.ParameterSection.java Source code

Java tutorial

Introduction

Here is the source code for nexcore.tool.uml.ui.property.section.ParameterSection.java

Source

/**
 * Copyright (c) 2015 SK holdings Co., Ltd. All rights reserved.
 * This software is the confidential and proprietary information of SK holdings.
 * You shall not disclose such confidential information and shall use it only in
 * accordance with the terms of the license agreement you entered into with SK holdings.
 * (http://www.eclipse.org/legal/epl-v10.html)
 */

package nexcore.tool.uml.ui.property.section;

import java.util.Iterator;
import java.util.List;

import nexcore.tool.uml.core.log.Log;
import nexcore.tool.uml.core.message.UMLMessage;
import nexcore.tool.uml.core.util.StringUMLNameUtil;
import nexcore.tool.uml.core.util.TypeSelectDialogType;
import nexcore.tool.uml.manager.UMLManager;
import nexcore.tool.uml.manager.transaction.TransactionalAction;
import nexcore.tool.uml.manager.utility.DomainUtil;
import nexcore.tool.uml.ui.core.UICoreConstant;
import nexcore.tool.uml.ui.core.dialog.TypeSelectDialog;
import nexcore.tool.uml.ui.property.UMLTypeCellEditor;
import nexcore.tool.uml.ui.property.command.DefaultValueTrasactionAction;
import nexcore.tool.uml.ui.property.provider.ParameterSectionContentProvider;
import nexcore.tool.uml.ui.property.provider.ParameterSectionLabelProvider;
import nexcore.tool.uml.ui.property.type.MultiplicityType;
import nexcore.tool.uml.ui.property.type.ParameterDirectionType;

import org.eclipse.emf.common.util.EList;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnViewerEditor;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
import org.eclipse.jface.viewers.ComboBoxViewerCellEditor;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.ICellEditorListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.TableViewerEditor;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.uml2.uml.Element;
import org.eclipse.uml2.uml.LiteralBoolean;
import org.eclipse.uml2.uml.LiteralInteger;
import org.eclipse.uml2.uml.LiteralString;
import org.eclipse.uml2.uml.LiteralUnlimitedNatural;
import org.eclipse.uml2.uml.MultiplicityElement;
import org.eclipse.uml2.uml.NamedElement;
import org.eclipse.uml2.uml.Operation;
import org.eclipse.uml2.uml.Parameter;
import org.eclipse.uml2.uml.ParameterDirectionKind;
import org.eclipse.uml2.uml.PrimitiveType;
import org.eclipse.uml2.uml.Type;
import org.eclipse.uml2.uml.TypedElement;

/**
 * <ul>
 * <li>  : nexcore.tool.uml.ui.property</li>
 * <li>  : nexcore.tool.uml.ui.property.section</li>
 * <li>   : ParameterSection</li>
 * <li>? : 2009. 12. 18.</li>
 * <li>? : ?</li>
 * </ul>
 */
public class ParameterSection extends AbstractPropertyCommonSection {

    /** COLUMN_NAMES */
    private static final String[] COLUMN_NAMES = new String[] { UICoreConstant.PROJECT_CONSTANTS__EMPTY_STRING,
            UMLMessage.LABEL_DIRECTION, UMLMessage.LABEL_NAME, UMLMessage.LABEL_DEFAULT_VALUE,
            UMLMessage.LABEL_TYPE, UMLMessage.LABEL_ORDERED, UMLMessage.LABEL_IS_UNIQUE,
            UMLMessage.LABEL_MULTIPLICITY };

    /**
     * COLUMN_WIDTHS
     */
    private static final int[] COLUMN_WIDTHS = new int[] { 30, 50, 150, 90, 90, 90, 90, 90 };

    /** _IMAGE_COLUMN */
    private static final int _IMAGE_COLUMN = 0;

    /** _DIRECTION_COLUMN */
    private static final int _DIRECTION_COLUMN = 1;

    /** _NAME_COLUMN */
    private static final int _NAME_COLUMN = 2;

    /** _DEFAULT_VALUE_COLUMN */
    private static final int _DEFAULT_VALUE_COLUMN = 3;

    /** _TYPE_COLUMN */
    private static final int _TYPE_COLUMN = 4;

    /** _IS_ORDERED_COLUMN */
    private static final int _IS_ORDERED_COLUMN = 5;

    /** _IS_UNIQUE_COLUMN */
    private static final int _IS_UNIQUE_COLUMN = 6;

    /** _MULTIPLICITY_COLUMN */
    private static final int _MULTIPLICITY_COLUMN = 7;

    /** PREFIX */
    private static final String PREFIX = UMLMessage.getMessage(UMLMessage.LABEL_PARAMETER);

    /** cellEdotor */
    private CellEditor cellEditor;

    /**
     * 
     * 
     * @return Operation
     */
    private Operation getData() {
        return (Operation) this.getSelectedModel();
    }

    /**
     * @see nexcore.tool.uml.ui.property.section.AbstractPropertyCommonSection#createMainComposite()
     */
    @Override
    public void createMainComposite() {
        gridData = new GridData(GridData.FILL_BOTH);
        parent.setLayoutData(gridData);
        sectionComposite = getWidgetFactory().createComposite(parent);
        sectionLayout = new GridLayout(1, false);
        sectionComposite.setLayout(sectionLayout);

        buttonComposite = getWidgetFactory().createComposite(sectionComposite);
        sectionLayout = new GridLayout(2, true);
        buttonComposite.setLayout(sectionLayout);

        Button addButton = getWidgetFactory().createButton(buttonComposite,
                UMLMessage.getMessage(UMLMessage.LABEL_ADD), SWT.NONE);
        gridData = new GridData();
        gridData.horizontalAlignment = GridData.FILL;
        addButton.setLayoutData(gridData);
        addButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                DomainUtil.run(new TransactionalAction() {
                    /**
                     * @see nexcore.tool.uml.manager.transaction.TransactionalAction#doExecute()
                     */
                    @Override
                    public void doExecute() {
                        createParameter();
                    }
                });
                tableViewer.refresh();
                packColumns();
            }
        });
        // addButton.addListener(SWT.MouseDown, new Listener() {
        // /**
        // * @see
        // org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
        // */
        // public void handleEvent(Event event) {
        // DomainUtil.run(new TransactionalAction() {
        // /**
        // * @see
        // nexcore.tool.uml.manager.transaction.TransactionalAction#doExecute()
        // */
        // @Override
        // public void doExecute() {
        // createParameter();
        // }
        // });
        // tableViewer.refresh();
        // packColumns();
        // }
        // });
        Button deleteButton = getWidgetFactory().createButton(buttonComposite,
                UMLMessage.getMessage(UMLMessage.LABEL_DELETE), SWT.NONE);
        gridData = new GridData();
        gridData.horizontalAlignment = GridData.FILL;
        deleteButton.setLayoutData(gridData);
        deleteButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                DomainUtil.run(new TransactionalAction() {
                    /**
                     * @see nexcore.tool.uml.manager.transaction.TransactionalAction#doExecute()
                     */
                    @Override
                    public void doExecute() {
                        removeParameter();
                    }
                });
                tableViewer.refresh();
                packColumns();
            }
        });
        // deleteButton.addListener(SWT.MouseDown, new Listener() {
        // /**
        // * @see
        // org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
        // */
        // public void handleEvent(Event event) {
        // DomainUtil.run(new TransactionalAction() {
        // /**
        // * @see
        // nexcore.tool.uml.manager.transaction.TransactionalAction#doExecute()
        // */
        // @Override
        // public void doExecute() {
        // removeParameter();
        // }
        // });
        // tableViewer.refresh();
        // packColumns();
        // }
        // });

        tableViewerComposite = getWidgetFactory().createComposite(sectionComposite);
        sectionLayout = new GridLayout();
        tableViewerComposite.setLayout(sectionLayout);
        gridData = new GridData(GridData.FILL_BOTH);
        tableViewerComposite.setLayoutData(gridData);

        tableViewer = new TableViewer(tableViewerComposite, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI);
        table = tableViewer.getTable();
        gridData = new GridData(GridData.FILL_BOTH);
        table.setLayoutData(gridData);
        table.setLinesVisible(true);
        table.setHeaderVisible(true);
        tableViewer.setUseHashlookup(true);
        tableViewer.setColumnProperties(COLUMN_NAMES);
        tableViewer.setContentProvider(new ParameterSectionContentProvider());

        // 2012-09-13
        // ??   ? ( ?  ?)
        tableViewer.getTable().addMouseListener(new MouseAdapter() {

            @Override
            public void mouseDoubleClick(MouseEvent e) {
                TableItem item = tableViewer.getTable().getItem(new Point(e.x, e.y));
                if (item == null) {
                    DomainUtil.run(new TransactionalAction() {
                        /**
                         * @see nexcore.tool.uml.manager.transaction.TransactionalAction#doExecute()
                         */
                        @Override
                        public void doExecute() {
                            createParameter();
                        }
                    });
                    tableViewer.refresh();
                    packColumns();
                }
            }
        });

        ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(tableViewer) {
            /**
             * @see org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy#isEditorActivationEvent(org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent)
             */
            protected boolean isEditorActivationEvent(ColumnViewerEditorActivationEvent event) {
                return event.eventType == ColumnViewerEditorActivationEvent.MOUSE_CLICK_SELECTION;
            }
        };
        TableViewerEditor.create(tableViewer, actSupport, ColumnViewerEditor.KEYBOARD_ACTIVATION);

        for (int i = 0; i < COLUMN_NAMES.length; i++) {
            viewerColumn = new TableViewerColumn(tableViewer, SWT.NONE);
            viewerColumn.getColumn().setText(COLUMN_NAMES[i]);
            viewerColumn.getColumn().setWidth(COLUMN_WIDTHS[i]);
            viewerColumn.getColumn().setAlignment(SWT.LEFT);
            viewerColumn.getColumn().setMoveable(false);
            final int columnNumber = i;
            viewerColumn.setLabelProvider(new ParameterSectionLabelProvider(i));
            viewerColumn.setEditingSupport(new EditingSupport(tableViewer) {

                /** instanceClassName */
                String instanceClassName;

                /** stringBuffer */
                StringBuffer stringBuffer;

                /**
                 * @see org.eclipse.jface.viewers.EditingSupport#canEdit(java.lang.Object)
                 */
                protected boolean canEdit(Object element) {
                    if (columnNumber != 0)
                        return true;
                    return false;
                }

                /**
                 * @see org.eclipse.jface.viewers.EditingSupport#getCellEditor(java.lang.Object)
                 */
                protected CellEditor getCellEditor(Object element) {
                    return getCellEditors(columnNumber, element);

                }

                /**
                 * @see org.eclipse.jface.viewers.EditingSupport#getValue(java.lang.Object)
                 */
                protected Object getValue(Object element) {
                    switch (columnNumber) {
                    case _DIRECTION_COLUMN:
                        return getDirection((Parameter) element);
                    case _NAME_COLUMN:
                        return getName((Parameter) element);
                    case _DEFAULT_VALUE_COLUMN:
                        return getDefaultValue((Parameter) element);
                    case _TYPE_COLUMN:
                        return getTypeText((Parameter) element);
                    case _IS_ORDERED_COLUMN:
                        return Boolean.toString(((Parameter) element).isOrdered());
                    case _IS_UNIQUE_COLUMN:
                        return Boolean.toString(((Parameter) element).isUnique());
                    case _MULTIPLICITY_COLUMN:
                        return getMultiplicity((Parameter) element);
                    default:
                        break;
                    }
                    return null;
                }

                private Object getDefaultValue(Parameter element) {
                    if (element.getDefaultValue() != null) {
                        if (element.getDefaultValue() instanceof LiteralString) {
                            return ((LiteralString) element.getDefaultValue()).getValue().toString();
                        } else if (element.getDefaultValue() instanceof LiteralInteger) {
                            return String.valueOf(((LiteralInteger) element.getDefaultValue()).getValue());

                        } else if (element.getDefaultValue() instanceof LiteralUnlimitedNatural) {
                            return String.valueOf(((LiteralUnlimitedNatural) element.getDefaultValue()).getValue());

                        } else if (element.getDefaultValue() instanceof LiteralBoolean) {
                            return String.valueOf((LiteralBoolean) element.getDefaultValue());
                        } else {
                            return UICoreConstant.UMLSECTION_CONSTANTS__DEFAULT_VALUES_NULL;
                        }
                    } else {
                        return UICoreConstant.PROJECT_CONSTANTS__EMPTY_STRING;
                    }
                }

                /**
                 * 
                 * 
                 * @param element
                 * @return Object
                 */
                private String getDirection(Parameter element) {
                    if (element.getDirection().equals(ParameterDirectionKind.IN_LITERAL)) {
                        return ParameterDirectionType.IN.toString();
                    } else if (element.getDirection().equals(ParameterDirectionKind.INOUT_LITERAL)) {
                        return ParameterDirectionType.INOUT.toString();
                    } else if (element.getDirection().equals(ParameterDirectionKind.OUT_LITERAL)) {
                        return ParameterDirectionType.OUT.toString();
                    } else if (element.getDirection().equals(ParameterDirectionKind.RETURN_LITERAL)) {
                        return ParameterDirectionType.RETURN.toString();
                    }
                    return null;
                }

                /**
                 * ?? .
                 * 
                 * @param property
                 * @return String
                 */
                private String getName(NamedElement element) {
                    if (element.getName() != null)
                        return element.getName().toString();
                    else
                        return UICoreConstant.PROJECT_CONSTANTS__EMPTY_STRING;
                }

                /**
                 * 
                 * 
                 * @param element
                 * @return String
                 */
                private String getTypeText(TypedElement typedElement) {
                    if (typedElement.getType() != null) {
                        instanceClassName = typedElement.getType().eClass().getInstanceClassName();
                        stringBuffer = new StringBuffer();
                        stringBuffer.append(UICoreConstant.UMLSECTION_CONSTANTS__SQUARE_BRAKET_LEFT);
                        stringBuffer.append(StringUMLNameUtil.getUMLNotationName(instanceClassName));
                        stringBuffer.append(UICoreConstant.UMLSECTION_CONSTANTS__SQUARE_BRAKET_RIGHT);
                        stringBuffer.append(UICoreConstant.PROJECT_CONSTANTS__BLANK);
                        stringBuffer.append(typedElement.getType().getName());
                        return stringBuffer.toString();
                    }
                    return UICoreConstant.PROJECT_CONSTANTS__EMPTY_STRING;
                }

                /**
                 *  ? .
                 * 
                 * @param property
                 * @return String
                 */
                private String getMultiplicity(MultiplicityElement multiplicityElement) {
                    if (multiplicityElement.getUpperValue() != null
                            && multiplicityElement.getLowerValue() != null) {
                        if (isSingleStar(multiplicityElement)) {
                            return MultiplicityType.SINGLE_STAR.toString();
                        } else if (isZeroToUnique(multiplicityElement)) {
                            return MultiplicityType.ZERO_TO_UNIQUE.toString();
                        } else if (isUnique(multiplicityElement)) {
                            return MultiplicityType.UNIQUE.toString();
                        } else if (isUniqueToSingleStar(multiplicityElement)) {
                            return MultiplicityType.UNIQUE_TO_SINGLE_STAR.toString();
                        }
                    } else {
                        return MultiplicityType.UNIQUE.toString();
                    }
                    return UICoreConstant.PROJECT_CONSTANTS__EMPTY_STRING;
                }

                /**
                 * ? "*" ? ?.
                 * 
                 * @param property
                 * @return boolean
                 */
                private boolean isSingleStar(MultiplicityElement multiplicityElement) {
                    if (UICoreConstant.UMLSECTION_CONSTANTS___ZERO
                            .equals(multiplicityElement.getLowerValue().stringValue())) {
                        if (MultiplicityType.SINGLE_STAR.toString()
                                .equals(multiplicityElement.getUpperValue().stringValue())) {
                            return true;
                        }
                    }
                    return false;
                }

                /**
                 * ? "1" ? ?.
                 * 
                 * @param property
                 * @return boolean
                 */
                private boolean isUnique(MultiplicityElement multiplicityElement) {
                    if (UICoreConstant.UMLSECTION_CONSTANTS___UNIQUE
                            .equals(multiplicityElement.getLowerValue().stringValue())) {
                        if (UICoreConstant.UMLSECTION_CONSTANTS___UNIQUE
                                .equals(multiplicityElement.getUpperValue().stringValue())) {
                            return true;
                        }
                    }
                    return false;
                }

                /**
                 * ? "1.. *" ? ?.
                 * 
                 * @param property
                 * @return boolean
                 */
                private boolean isUniqueToSingleStar(MultiplicityElement multiplicityElement) {
                    if (UICoreConstant.UMLSECTION_CONSTANTS___UNIQUE
                            .equals(multiplicityElement.getLowerValue().stringValue())) {
                        if (MultiplicityType.SINGLE_STAR.toString()
                                .equals(multiplicityElement.getUpperValue().stringValue())) {
                            return true;
                        }
                    }
                    return false;
                }

                /**
                 * ? "0.. 1" ? ?.
                 * 
                 * @param property
                 * @return boolean
                 */
                private boolean isZeroToUnique(MultiplicityElement multiplicityElement) {
                    if (UICoreConstant.UMLSECTION_CONSTANTS___ZERO
                            .equals(multiplicityElement.getLowerValue().stringValue())) {
                        if (UICoreConstant.UMLSECTION_CONSTANTS___UNIQUE
                                .equals(multiplicityElement.getUpperValue().stringValue())) {
                            return true;
                        }
                    }
                    return false;
                }

                /**
                 * @see org.eclipse.jface.viewers.EditingSupport#setValue(java.lang.Object,
                 *      java.lang.Object)
                 */
                protected void setValue(final Object element, final Object value) {
                    if (null == value) {
                        return;
                    }
                    List<Parameter> parameters = getData().getOwnedParameters();
                    switch (columnNumber) {
                    case _NAME_COLUMN:
                        for (Parameter p : parameters) {
                            if (value != null) {
                                if (value instanceof String) {
                                    if (element != p && ((String) value).equals(p.getName())) {
                                        MessageDialog.openWarning(getPart().getSite().getShell(),
                                                UMLMessage.LABEL_DUPLICATE_ERROR,
                                                UMLMessage.MESSAGE_DUPLICATE_ERROR);
                                        return;
                                    }
                                }
                            }
                        }
                        break;
                    }

                    DomainUtil.run(new TransactionalAction() {
                        /**
                         * @see nexcore.tool.uml.manager.transaction.TransactionalAction#doExecute()
                         */
                        @Override
                        public void doExecute() {
                            if (value != null) {
                                switch (columnNumber) {
                                case _DIRECTION_COLUMN:
                                    setDirectionToElemet((Parameter) element, value);
                                    break;
                                case _NAME_COLUMN:
                                    setNameToElement((Parameter) element, value);
                                    break;
                                case _DEFAULT_VALUE_COLUMN:
                                    setDefaultValueToElement((Parameter) element, (String) value);
                                    break;
                                case _TYPE_COLUMN:
                                    if (((UMLTypeCellEditor) cellEditor).getFirstResult() != null) {
                                        if (element instanceof Parameter) {
                                            // 2012-09-13
                                            // ?  ? ?? "parameter"   ? ??    ??  .
                                            if (((Parameter) element).getDirection()
                                                    .equals(ParameterDirectionKind.RETURN_LITERAL)) {
                                                if (((Parameter) element).getName().startsWith(PREFIX)) {
                                                    Operation operation = ((Operation) ((Parameter) element)
                                                            .getOwner());
                                                    for (Parameter para : operation.returnResult()) {
                                                        para.destroy();
                                                    }
                                                    operation.createReturnResult(
                                                            ((Type) ((UMLTypeCellEditor) cellEditor)
                                                                    .getFirstResult()).getName(),
                                                            ((Type) ((UMLTypeCellEditor) cellEditor)
                                                                    .getFirstResult()));
                                                }
                                            }
                                            ((Parameter) element).setType(
                                                    ((Type) ((UMLTypeCellEditor) cellEditor).getFirstResult()));
                                        }
                                    }
                                    break;
                                case _IS_ORDERED_COLUMN:
                                    setIsOrderedToElement((Parameter) element, value);
                                    break;
                                case _IS_UNIQUE_COLUMN:
                                    setIsUniqueToElement((Parameter) element, value);
                                    break;
                                case _MULTIPLICITY_COLUMN:
                                    setMultiplicityToElement((Parameter) element, value);
                                    break;
                                default:
                                    return;
                                }
                            }
                        }
                    });
                    tableViewer.refresh();
                }

                /**
                 * 
                 * 
                 * @param element
                 * @param value
                 *            void
                 */
                private void setIsUniqueToElement(MultiplicityElement element, Object value) {
                    if (((String) value).equals(Boolean.toString(true))) {
                        element.setIsUnique(true);
                    } else if (((String) value).equals(Boolean.toString(false))) {
                        element.setIsUnique(false);
                    }
                }

                /**
                 * 
                 * 
                 * @param element
                 * @param value
                 *            void
                 */
                private void setIsOrderedToElement(MultiplicityElement element, Object value) {
                    if (((String) value).equals(Boolean.toString(true))) {
                        element.setIsOrdered(true);
                    } else if (((String) value).equals(Boolean.toString(false))) {
                        element.setIsOrdered(false);
                    }
                }

                /**
                 * ?? ? .
                 * 
                 * @param element
                 * @param value
                 *            void
                 */
                private void setDirectionToElemet(Parameter element, Object value) {
                    if (((String) value).equals(ParameterDirectionType.IN.toString())) {
                        element.setDirection(ParameterDirectionKind.IN_LITERAL);
                    } else if (((String) value).equals(ParameterDirectionType.INOUT.toString())) {
                        element.setDirection(ParameterDirectionKind.INOUT_LITERAL);
                    } else if (((String) value).equals(ParameterDirectionType.OUT.toString())) {
                        element.setDirection(ParameterDirectionKind.OUT_LITERAL);
                    } else if (((String) value).equals(ParameterDirectionType.RETURN.toString())) {
                        Operation operation = (Operation) element.getOwner();
                        if (operation.getReturnResult() == null) {
                            element.setDirection(ParameterDirectionKind.RETURN_LITERAL);
                        }
                    }
                }

                /**
                 * ?? ? .
                 * 
                 * @param value
                 *            void
                 */
                private void setDefaultValueToElement(Object element, Object value) {
                    DomainUtil.run(new DefaultValueTrasactionAction(element, value));
                    // defaultValue = ((Property) element).getDefaultValue();
                    // Property property = (Property) element);
                    // if (defaultValue != null) {
                    // ValueSpecificationOperations.setValue(defaultValue,
                    // (String)value);
                    //
                    // } else {
                    // ((Property) element).setStringDefaultValue(((String)
                    // value));
                    // }
                    //                    
                    // if (((String) value).equals(defaultValues[3])) { // 
                    // 
                    // ((Property) element).setDefaultValue(value);
                    // } else if (((String) value).equals(defaultValues[4])) {
                    // //  
                    //                        
                    // }

                }

                /**
                 * ?? ? .
                 * 
                 * @param element
                 * @param value
                 *            void
                 */
                private void setMultiplicityToElement(MultiplicityElement element, Object value) {
                    if (((String) value).equals(MultiplicityType.SINGLE_STAR.toString())) {
                        // *
                        element.setLower(0);
                        element.setUpper(LiteralUnlimitedNatural.UNLIMITED);
                    } else if (((String) value).equals(MultiplicityType.ZERO_TO_UNIQUE.toString())) {
                        // 0.. 1
                        element.setLower(0);
                        element.setUpper(1);
                    } else if (((String) value).equals(MultiplicityType.UNIQUE.toString())) {
                        // 1
                        element.setLower(1);
                        element.setUpper(1);
                    } else if (((String) value).equals(MultiplicityType.UNIQUE_TO_SINGLE_STAR.toString())) {
                        // 1.. *
                        element.setLower(1);
                        element.setUpper(LiteralUnlimitedNatural.UNLIMITED);
                    } else if (((String) value).equals(MultiplicityType.NONE.toString())) {
                        // 1
                        element.setLower(1);
                        element.setUpper(1);
                    }
                }

                /**
                 * ?? ?? .
                 * 
                 * @param element
                 * @param value
                 *            void
                 */
                private void setNameToElement(NamedElement element, Object value) {
                    element.setName((String) value);
                }
            });
        }

        // ?
        Menu menu = new Menu(table);
        MenuItem addItem = new MenuItem(menu, SWT.CASCADE);
        addItem.addSelectionListener(new SelectionAdapter() {
            /**
             * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
             */
            public void widgetSelected(SelectionEvent e) {
                DomainUtil.run(new TransactionalAction() {
                    /**
                     * @see nexcore.tool.uml.manager.transaction.TransactionalAction#doExecute()
                     */
                    @Override
                    public void doExecute() {
                        createParameter();
                    }
                });
                tableViewer.refresh();
                packColumns();
            }
        });
        addItem.setText(UMLMessage.getMessage(UMLMessage.LABEL_ADD_NEW_ATTRIBUTE));
        MenuItem deleteItem = new MenuItem(menu, SWT.CASCADE);
        deleteItem.addSelectionListener(new SelectionAdapter() {
            /**
             * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
             */
            public void widgetSelected(SelectionEvent e) {
                DomainUtil.run(new TransactionalAction() {
                    /**
                     * @see nexcore.tool.uml.manager.transaction.TransactionalAction#doExecute()
                     */
                    @Override
                    public void doExecute() {
                        removeParameter();
                    }
                });
                tableViewer.refresh();
                packColumns();
            }
        });
        deleteItem.setText(UMLMessage.getMessage(UMLMessage.LABEL_DELETE_FROM_MODEL));

        MenuItem typeAllItem = new MenuItem(menu, SWT.CASCADE);
        typeAllItem.addSelectionListener(new SelectionAdapter() {
            /**
             * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
             */
            public void widgetSelected(SelectionEvent e) {
                DomainUtil.run(new TransactionalAction() {
                    /**
                     * @see nexcore.tool.uml.manager.transaction.TransactionalAction#doExecute()
                     */
                    @Override
                    public void doExecute() {
                        final TableItem[] items = tableViewer.getTable().getSelection();
                        if (items == null || items.length < 1) {
                            return;
                        }
                        Object data = items[0].getData();
                        if (data instanceof Parameter) {
                            TypeSelectDialog dialog = new TypeSelectDialog(table.getShell(),
                                    TypeSelectDialogType.PROPERTY, (Parameter) data);
                            int returnCode = dialog.open();

                            switch (returnCode) {
                            case Window.OK:
                                final Object firstResult = dialog.getFirstResult();
                                DomainUtil.run(new TransactionalAction() {
                                    /**
                                     * @see nexcore.tool.uml.manager.transaction.TransactionalAction#doExecute()
                                     */
                                    @Override
                                    public void doExecute() {
                                        for (TableItem item : items) {
                                            Object param = item.getData();
                                            if (param instanceof Parameter) {
                                                ((Parameter) param).setType((Type) firstResult);
                                            }
                                        }
                                    }
                                });
                                tableViewer.refresh();
                                return;
                            case Window.CANCEL:
                            case IDialogConstants.FINISH_ID:
                            default:
                                return;
                            }
                        }

                    }
                });
                tableViewer.refresh();
                packColumns();
            }
        });
        typeAllItem.setText(UMLMessage.LABEL_TYPE_SET);

        table.setMenu(menu);

        // 

    }

    /**
     * 
     * void
     */
    private void createParameter() {
        try {
            uniqueName = UMLManager.getPackagedUniqueName(this.getData(), PREFIX);
            this.getData().createOwnedParameter(uniqueName, null);
        } catch (Exception error) {
            Log.error(error);
        }
    }

    /**
     * ? ? ??  ??? ? . void
     */
    @SuppressWarnings("unchecked")
    private void removeParameter() {
        IStructuredSelection selection = (IStructuredSelection) tableViewer.getSelection();
        EList<Parameter> parameterList = this.getData().getOwnedParameters();
        for (Iterator<Parameter> iterator = selection.iterator(); iterator.hasNext();) {
            parameterList.remove(iterator.next());
        }
    }

    /**
     * ? ? ?? ?  ? ?.
     * 
     * @param columnNumber
     * @return CellEditor  ?  ?.
     */
    public CellEditor getCellEditors(int columnNumber, final Object element) {
        Parameter parameter = null;
        switch (columnNumber) {
        case _IMAGE_COLUMN:
            return null;
        case _DIRECTION_COLUMN:
            parameter = (Parameter) element;
            if (parameter.getDirection().equals(ParameterDirectionKind.RETURN_LITERAL)) {
                return null;
            }
            cellEditor = new ComboBoxViewerCellEditor(tableViewer.getTable(), SWT.READ_ONLY);
            ((ComboBoxViewerCellEditor) cellEditor).setContenProvider(getContentProvider());
            ((ComboBoxViewerCellEditor) cellEditor).setInput(UICoreConstant.UMLSECTION_CONSTANTS__DIRECTIONS);
            return cellEditor;
        case _NAME_COLUMN:
            cellEditor = new TextCellEditor(tableViewer.getTable());
            return cellEditor;
        case _DEFAULT_VALUE_COLUMN:
            // cellEditor = new
            // ComboBoxViewerCellEditor(tableViewer.getTable(),
            // SWT.READ_ONLY);
            // ((ComboBoxViewerCellEditor) cellEditor).setContenProvider(new
            // IStructuredContentProvider() {
            // /**
            // * @see org.eclipse.jface.viewers.IContentProvider#dispose()
            // */
            // public void dispose() {
            // }
            //
            // /**
            // * @see
            // org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
            // */
            // public Object[] getElements(Object inputElement) {
            // // TODO Auto-generated method stub
            // return (Object[]) inputElement;
            // }
            //
            // /**
            // * @see
            // org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
            // * java.lang.Object, java.lang.Object)
            // */
            // public void inputChanged(Viewer viewer, Object oldInput,
            // Object
            // newInput) {
            // }
            // });
            // ((ComboBoxViewerCellEditor)
            // cellEditor).setInput(UICoreConstant.UMLSECTION_CONSTANTS__DEFAULT_VALUES_BOOLEAN);
            // return cellEditor;
            parameter = (Parameter) element;
            if (parameter.getType() == null) {
                return null;
            } else if (parameter.getType() instanceof Element && !(parameter.getType() instanceof PrimitiveType)) {
                // cellEditor = new TextCellEditor(tableViewer.getTable());
                // return cellEditor;
                return null;
            } else if (parameter.getType().getName() != null
                    && "boolean".equals(parameter.getType().getName().toLowerCase())) {
                createBooleanComboBox();
                return cellEditor;
            } else {

                return new TextCellEditor(tableViewer.getTable());
            }

        case _TYPE_COLUMN:
            cellEditor = new UMLTypeCellEditor(tableViewer.getTable(), ((Parameter) element).getType(), getData());
            ((UMLTypeCellEditor) cellEditor).setUMLModel(this.getData().getModel());
            cellEditor.addListener(new ICellEditorListener() {

                @Override
                public void editorValueChanged(boolean oldValidState, boolean newValidState) {
                    tableViewer.refresh(element);
                }

                @Override
                public void cancelEditor() {
                }

                @Override
                public void applyEditorValue() {
                }
            });
            return cellEditor;
        case _IS_ORDERED_COLUMN:
            cellEditor = new ComboBoxViewerCellEditor(tableViewer.getTable(), SWT.READ_ONLY);
            ((ComboBoxViewerCellEditor) cellEditor).setContenProvider(getContentProvider());
            ((ComboBoxViewerCellEditor) cellEditor).setInput(UICoreConstant.UMLSECTION_CONSTANTS__IS_BOOLEANS);
            return cellEditor;
        case _IS_UNIQUE_COLUMN:
            cellEditor = new ComboBoxViewerCellEditor(tableViewer.getTable(), SWT.READ_ONLY);
            ((ComboBoxViewerCellEditor) cellEditor).setContenProvider(getContentProvider());
            ((ComboBoxViewerCellEditor) cellEditor).setInput(UICoreConstant.UMLSECTION_CONSTANTS__IS_BOOLEANS);
            return cellEditor;
        case _MULTIPLICITY_COLUMN:
            cellEditor = new ComboBoxViewerCellEditor(tableViewer.getTable());
            ((ComboBoxViewerCellEditor) cellEditor).setContenProvider(getContentProvider());
            ((ComboBoxViewerCellEditor) cellEditor).setInput(UICoreConstant.UMLSECTION_CONSTANTS__MULTIPLICITIES);
            return cellEditor;
        default:
            return null;
        }
    }

    /**
     * createBooleanComboBox
     *   void
     */
    private void createBooleanComboBox() {
        cellEditor = new ComboBoxViewerCellEditor(tableViewer.getTable(), SWT.READ_ONLY);
        ((ComboBoxViewerCellEditor) cellEditor).setContenProvider(getContentProvider());
        ((ComboBoxViewerCellEditor) cellEditor)
                .setInput(UICoreConstant.UMLSECTION_CONSTANTS__DEFAULT_VALUES_BOOLEAN);
    }

    /**
     * getContentProvider
     *  
     * @return IStructuredContentProvider
     */
    private IStructuredContentProvider getContentProvider() {
        return new IStructuredContentProvider() {
            /**
             * @see org.eclipse.jface.viewers.IContentProvider#dispose()
             */
            public void dispose() {
            }

            /**
             * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
             */
            public Object[] getElements(Object inputElement) {
                return (Object[]) inputElement;
            }

            /**
             * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
             *      java.lang.Object, java.lang.Object)
             */
            public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
            }
        };
    }

    /**
     * @see nexcore.tool.uml.ui.property.section.AbstractPropertyCommonSection#refreshChildren()
     */
    @Override
    public void refreshChildren() {
        if (tableViewer.getContentProvider() != null) {
            try {
                tableViewer.setInput(this.getData());
                packColumns();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * @see nexcore.tool.uml.ui.property.section.AbstractPropertyCommonSection#setListener()
     */
    @Override
    protected void setListener() {

    }

    /**
     * @see nexcore.tool.uml.ui.property.section.AbstractPropertyCommonSection#unsetListener()
     */
    @Override
    protected void unsetListener() {

    }

}