com.cisco.yangide.ext.model.editor.dialog.YangElementListSelectionDialog.java Source code

Java tutorial

Introduction

Here is the source code for com.cisco.yangide.ext.model.editor.dialog.YangElementListSelectionDialog.java

Source

/*******************************************************************************
 * Copyright (c) 2014, 2015 Cisco Systems, Inc. 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
 *  
 *******************************************************************************/
package com.cisco.yangide.ext.model.editor.dialog;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;

import org.eclipse.core.resources.IFile;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.graphiti.ui.services.GraphitiUi;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.dialogs.ElementListSelectionDialog;

import com.cisco.yangide.core.indexing.ElementIndexInfo;
import com.cisco.yangide.core.indexing.ElementIndexType;
import com.cisco.yangide.core.model.YangModelManager;
import com.cisco.yangide.editor.editors.YangScanner;
import com.cisco.yangide.ext.model.Import;
import com.cisco.yangide.ext.model.Module;
import com.cisco.yangide.ext.model.editor.util.Strings;
import com.cisco.yangide.ext.model.editor.util.YangDiagramImageProvider;
import com.cisco.yangide.ext.model.editor.util.YangModelUtil;

public class YangElementListSelectionDialog extends ElementListSelectionDialog {

    protected class ElementComparator implements Comparator<Object> {

        @Override
        public int compare(Object o1, Object o2) {
            if (null == o1 && null == o2) {
                return 0;
            }
            if (null != o1 && null == o2) {
                return 1;
            }
            if (null == o1 && null != o2) {
                return -1;
            }
            if (o1 instanceof String && o2 instanceof String) {
                return ((String) o1).compareTo((String) o2);
            }
            if (o1 instanceof String && !(o2 instanceof String)) {
                return -1;
            }
            if (!(o1 instanceof String) && o2 instanceof String) {
                return 1;
            }
            if (o1 instanceof ElementIndexInfo && o2 instanceof ElementIndexInfo) {
                if (((ElementIndexInfo) o1).getModule().equals(((ElementIndexInfo) o2).getModule())) {
                    return ((ElementIndexInfo) o1).getName().compareTo(((ElementIndexInfo) o2).getName());
                } else {
                    return ((ElementIndexInfo) o1).getModule().compareTo(((ElementIndexInfo) o2).getModule());
                }
            }
            return o1.toString().compareTo(o2.toString());
        }

    }

    private Module module;
    private HashMap<String, String> imports = new HashMap<String, String>();
    private String value;

    public interface Transformer {
        public String transform(ElementIndexInfo info);
    }

    protected List<Object> list;

    public YangElementListSelectionDialog(Shell parent, ElementIndexType indexType, IFile file, String imageId,
            Module module, Transformer transformer, String initialValue) {
        super(parent, new ElementLabelProvider(transformer));
        reset(indexType, file, imageId, module, initialValue);
    }

    public YangElementListSelectionDialog(Shell parent, ElementIndexType indexType, IFile file, String imageId,
            Module module, String initialValue) {
        super(parent, new ElementLabelProvider(module));
        reset(indexType, file, imageId, module, initialValue);
    }

    public void reset(ElementIndexType indexType, IFile file, String imageId, Module m, String initialValue) {
        setTitle("Select element");
        setAllowDuplicates(false);
        setModule(m);
        setList(indexType, file, m);
        setImage(GraphitiUi.getImageService().getImageForId(YangDiagramImageProvider.DIAGRAM_TYPE_PROVIDER_ID,
                imageId));
        setInitialSelections(new Object[] { getElementByValue(initialValue) });
    }

    private Object getElementByValue(String initialValue) {
        if (list.contains(initialValue)) {
            return initialValue;
        } else if (null != initialValue) {
            String test = initialValue.replaceAll(" ", "");
            for (Object el : list) {
                if (el instanceof ElementIndexInfo) {
                    if (test.equals(((ElementIndexInfo) el).getName())
                            || (imports.containsKey(((ElementIndexInfo) el).getModule())
                                    && test.equals(imports.get(((ElementIndexInfo) el).getModule()) + ":"
                                            + ((ElementIndexInfo) el).getName()))) {
                        return el;
                    }
                }
            }
        }
        return null;
    }

    public void setList(ElementIndexType indexType, IFile file, Module module) {
        List<Object> result = new ArrayList<Object>();
        if (ElementIndexType.TYPE.equals(indexType)) {
            result.addAll(Arrays.asList(YangScanner.getTypes()));
        }
        result.addAll(Arrays.asList(YangModelManager.search(null, null, null, indexType,
                null == file ? null : file.getProject(), null)));
        list = filterElements(result);
        setElements(list.toArray());

    }

    @Override
    protected void okPressed() {
        computeResult();
        if (null == getFirstResult()) {

            MessageDialog.openWarning(getShell(), "Warning", "No element was choosen");
        } else {
            setResultObject();
            super.okPressed();
        }
    }

    protected List<Object> filterElements(List<Object> elements) {
        List<Object> result = new ArrayList<Object>();
        for (Object element : elements) {
            if (!(element instanceof ElementIndexInfo) || hasImport(element)) {
                result.add(element);
            }
        }
        return result;
    }

    protected boolean hasImport(Object element) {
        if (element instanceof ElementIndexInfo) {
            return imports.containsKey(((ElementIndexInfo) element).getModule())
                    || ((ElementIndexInfo) element).getModule().equals(module.getName());
        }
        return false;
    }

    protected void setResultObject() {
        Object result = getFirstResult();
        if (result instanceof ElementIndexInfo) {
            ElementIndexInfo choosen = (ElementIndexInfo) result;
            if (null == getModule() || choosen.getModule().equals(getModule().getName())) {
                value = choosen.getName();
            } else {
                value = (imports.containsKey(choosen.getModule()) ? imports.get(choosen.getModule()) + ":" : "")
                        + choosen.getName();
            }
        } else {
            value = Strings.getAsString(result);
        }
    }

    public String getValue() {
        return value;
    }

    protected void setModule(Module module) {
        this.module = module;
        for (EObject i : YangModelUtil.filter(module.getChildren(), YangModelUtil.MODEL_PACKAGE.getImport())) {
            imports.put(((Import) i).getModule(), ((Import) i).getPrefix());
        }
    }

    protected Module getModule() {
        return module;
    }

    protected void setSelection(String initialValue) {
        if (null != initialValue) {
            setSelection(new Object[] { initialValue });
        }
    }

}