Package org.erlide.ui.internal.search

Source Code of org.erlide.ui.internal.search.SearchResultLabelProvider

/**
*
*/
package org.erlide.ui.internal.search;

import java.text.MessageFormat;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.search.ui.text.AbstractTextSearchResult;
import org.eclipse.search.ui.text.AbstractTextSearchViewPage;
import org.eclipse.swt.graphics.Image;
import org.erlide.engine.model.ErlModelException;
import org.erlide.engine.model.erlang.ErlangFunction;
import org.erlide.engine.model.erlang.IErlFunction;
import org.erlide.engine.model.erlang.IErlModule;
import org.erlide.engine.model.root.ErlElementKind;
import org.erlide.engine.util.ResourceUtil;
import org.erlide.ui.editors.erl.outline.ErlangElementImageProvider;

public class SearchResultLabelProvider extends LabelProvider implements
        IStyledLabelProvider {

    public static final int SHOW_LABEL = 1;
    public static final int SHOW_LABEL_PATH = 2;
    public static final int SHOW_PATH_LABEL = 3;

    private final ErlangElementImageProvider fImageProvider;
    private final AbstractTextSearchViewPage fPage;

    private int fOrder;
    private final boolean fIsInTree;

    // private final String[] fArgs = new String[2];

    public SearchResultLabelProvider(final AbstractTextSearchViewPage page,
            final int order, final boolean isInTree) {
        fIsInTree = isInTree;
        fImageProvider = new ErlangElementImageProvider();
        fOrder = order;
        fPage = page;
    }

    public void setOrder(final int orderFlag) {
        fOrder = orderFlag;
    }

    public int getOrder() {
        return fOrder;
    }

    private StyledString getPathText(final Object element) {
        String location;
        if (element instanceof String) {
            final String s = (String) element;
            location = new Path(s).removeLastSegments(1).toPortableString();
        } else if (element instanceof ErlangSearchElement) {
            final ErlangSearchElement ese = (ErlangSearchElement) element;
            location = ese.getModuleName();
        } else {
            location = "";
        }
        final IFile file = ResourceUtil.getFileFromLocation(location);
        final String s;
        if (file != null) {
            s = file.getFullPath().toPortableString();
        } else {
            s = location;
        }
        return new StyledString(s, StyledString.QUALIFIER_STYLER);
    }

    private String getElementText(final Object element) {
        if (element instanceof String) { // Module
            final String s = (String) element;
            return new Path(s).lastSegment();
        } else if (element instanceof ErlangSearchElement) {
            final ErlangSearchElement ese = (ErlangSearchElement) element;
            return searchElementToString(ese);
        } else if (element instanceof ErlangFunction) {
            final ErlangFunction f = (ErlangFunction) element;
            return f.getNameWithArity();
        }
        return "";
    }

    private static String searchElementFunctionToString(final ErlangSearchElement ese) {
        final String a = ese.getArguments();
        if (ese.isSubClause()) {
            return ese.getName() + a;
        }
        final String nameWithArity = ese.getName() + "/" + ese.getArity();
        if (a != null) {
            return nameWithArity + "  " + a;
        }
        return nameWithArity;
    }

    private String searchElementToString(final ErlangSearchElement ese) {
        switch (ese.getKind()) {
        case ATTRIBUTE:
            return ese.getName();
        case CLAUSE:
        case FUNCTION:
            return searchElementFunctionToString(ese);
        case RECORD_DEF:
            return "record_definition: " + ese.getName();
        case MACRO_DEF:
            return "macro_definition: " + ese.getName();
        default:
            return ese.getName();
        }
    }

    private StyledString getMatchCountText(final Object element) {
        int matchCount = 0;
        final AbstractTextSearchResult result = fPage.getInput();
        if (result != null) {
            matchCount = fPage.getDisplayedMatchCount(element);
        }
        if (matchCount > 1) {
            final String countInfo = MessageFormat.format("({0} matches)",
                    Integer.valueOf(matchCount));
            return new StyledString(countInfo, StyledString.COUNTER_STYLER);
        }
        return new StyledString();
    }

    @Override
    public Image getImage(final Object element) {
        // module - String
        // function - ErlangFunction
        // clause - ClauseHead
        // occurrence - ModuleLineFunctionArityRef
        ErlElementKind kind = ErlElementKind.PROBLEM;
        if (element instanceof String) {
            kind = ErlElementKind.MODULE;
        } else if (element instanceof ErlangSearchElement) {
            final ErlangSearchElement ese = (ErlangSearchElement) element;
            kind = ese.getKind();
            if (kind == ErlElementKind.FUNCTION) {
                final IErlModule module = ese.getModule();
                try {
                    module.open(null);
                } catch (final ErlModelException e) {
                }
                final IErlFunction function = module.findFunction(new ErlangFunction(ese
                        .getName(), ese.getArity()));
                if (function != null && function.isExported()) {
                    kind = ErlElementKind.EXPORTFUNCTION;
                }
            }
        } else if (element instanceof ErlangFunction) {
            kind = ErlElementKind.FUNCTION;
        }
        return fImageProvider.getImageLabel(ErlangElementImageProvider
                .getImageDescriptionFromKind(kind));
    }

    @Override
    public void dispose() {
        super.dispose();
    }

    @Override
    public boolean isLabelProperty(final Object element, final String property) {
        return super.isLabelProperty(element, property);
        // return fLabelProvider.isLabelProperty(element, property);
    }

    @Override
    public void removeListener(final ILabelProviderListener listener) {
        super.removeListener(listener);
        // fLabelProvider.removeListener(listener);
    }

    @Override
    public void addListener(final ILabelProviderListener listener) {
        super.addListener(listener);
        // fLabelProvider.addListener(listener);
    }

    @Override
    public StyledString getStyledText(final Object element) {
        final StyledString result = new StyledString();
        if (fOrder == SHOW_LABEL_PATH || element instanceof String && isInTree()) {
            result.append(getElementText(element));
            result.append(' ');
            result.append(getMatchCountText(element));
            result.append(" - ", StyledString.QUALIFIER_STYLER);
            result.append(getPathText(element));
        } else if (fOrder == SHOW_LABEL) {
            result.append(getElementText(element));
            result.append(' ');
            result.append(getMatchCountText(element));
        } else { // SHOW_PATH_LABEL
            result.append(getElementText(element));
            result.append(' ');
            result.append(getMatchCountText(element));
            result.append(" - ", StyledString.QUALIFIER_STYLER);
            result.append(getPathText(element));
        }
        return result;
    }

    private boolean isInTree() {
        return fIsInTree;
    }

}
TOP

Related Classes of org.erlide.ui.internal.search.SearchResultLabelProvider

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.