de.dentrassi.eclipse.rpm.editor.DependenciesTable.java Source code

Java tutorial

Introduction

Here is the source code for de.dentrassi.eclipse.rpm.editor.DependenciesTable.java

Source

/*******************************************************************************
 * Copyright (c) 2016 IBH SYSTEMS GmbH 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
 *
 * Contributors:
 *     IBH SYSTEMS GmbH - initial API and implementation
 *******************************************************************************/
package de.dentrassi.eclipse.rpm.editor;

import java.util.Collection;
import java.util.EnumSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import org.eclipse.jface.layout.TreeColumnLayout;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ITreePathContentProvider;
import org.eclipse.jface.viewers.TreePath;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.packagedrone.utils.rpm.deps.Dependencies;
import org.eclipse.packagedrone.utils.rpm.deps.Dependency;
import org.eclipse.packagedrone.utils.rpm.deps.RpmDependencyFlags;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;

public class DependenciesTable {

    private final TreeViewer viewer;
    private final Composite wrapper;

    public DependenciesTable(final Composite parent) {
        this.wrapper = new Composite(parent, SWT.NO_BACKGROUND);
        parent.setLayout(new FillLayout());

        this.viewer = new TreeViewer(this.wrapper, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION);

        final TreeColumnLayout layout = new TreeColumnLayout();

        {
            final TreeViewerColumn col = new TreeViewerColumn(this.viewer, SWT.NONE);
            col.getColumn().setText("Name");
            col.setLabelProvider(new CellLabelProvider() {

                @Override
                public void update(final ViewerCell cell) {
                    final Object ele = cell.getElement();
                    if (ele instanceof Map.Entry<?, ?>) {
                        final String label = ((Map.Entry<?, ?>) ele).getKey().toString();
                        cell.setText(label);
                    } else if (ele instanceof Dependency) {
                        final Dependency dep = (Dependency) ele;
                        cell.setText(dep.getName());
                    }
                }
            });
            layout.setColumnData(col.getColumn(), new ColumnWeightData(5));
        }

        {
            final TreeViewerColumn col = new TreeViewerColumn(this.viewer, SWT.NONE);
            col.getColumn().setText("Op");
            col.setLabelProvider(new CellLabelProvider() {

                @Override
                public void update(final ViewerCell cell) {
                    final Object ele = cell.getElement();
                    if (ele instanceof Dependency) {
                        final Dependency dep = (Dependency) ele;

                        final EnumSet<RpmDependencyFlags> flags = dep.getFlags();

                        final StringBuilder sb = new StringBuilder();

                        for (final RpmDependencyFlags flag : flags) {
                            switch (flag) {
                            case LESS:
                                sb.append("<");
                                break;
                            case EQUAL:
                                sb.append("=");
                                break;
                            case GREATER:
                                sb.append(">");
                                break;
                            default:
                                break;
                            }
                        }

                        cell.setText(sb.toString());
                    }
                }
            });
            layout.setColumnData(col.getColumn(), new ColumnWeightData(1));
        }

        {
            final TreeViewerColumn col = new TreeViewerColumn(this.viewer, SWT.NONE);
            col.getColumn().setText("Version");
            col.setLabelProvider(new CellLabelProvider() {

                @Override
                public void update(final ViewerCell cell) {
                    final Object ele = cell.getElement();
                    if (ele instanceof Dependency) {
                        final Dependency dep = (Dependency) ele;
                        cell.setText(dep.getVersion());
                    }
                }
            });
            layout.setColumnData(col.getColumn(), new ColumnWeightData(5));
        }

        {
            final TreeViewerColumn col = new TreeViewerColumn(this.viewer, SWT.NONE);
            col.getColumn().setText("Flags");
            col.setLabelProvider(new CellLabelProvider() {

                @Override
                public void update(final ViewerCell cell) {
                    final Object ele = cell.getElement();
                    if (ele instanceof Dependency) {
                        final Dependency dep = (Dependency) ele;

                        final EnumSet<RpmDependencyFlags> flags = dep.getFlags();

                        final String text = flags.stream().map(RpmDependencyFlags::name)
                                .collect(Collectors.joining(", "));

                        cell.setText(text);
                    }
                }
            });
            layout.setColumnData(col.getColumn(), new ColumnWeightData(5));
        }

        this.wrapper.setLayout(layout);
        this.viewer.getTree().setHeaderVisible(true);

        final ITreePathContentProvider p = new ITreePathContentProvider() {

            @Override
            public boolean hasChildren(final TreePath path) {
                final Object[] children = getChildren(path);
                return children != null && children.length > 0;
            }

            @Override
            public TreePath[] getParents(final Object element) {
                return new TreePath[0];
            }

            @Override
            public Object[] getElements(final Object inputElement) {
                if (inputElement instanceof Map<?, ?>) {
                    return ((Map<?, ?>) inputElement).entrySet().toArray();
                } else if (inputElement instanceof Map.Entry<?, ?>) {
                    final Object val = ((Map.Entry<?, ?>) inputElement).getValue();
                    if (val instanceof Collection<?>) {
                        return ((Collection<?>) val).toArray();
                    }
                }
                return null;
            }

            @Override
            public Object[] getChildren(final TreePath parentPath) {
                return getElements(parentPath.getLastSegment());
            }
        };
        this.viewer.setContentProvider(p);
    }

    public void setInformation(final RpmInformation ri) {

        final List<Dependency> req = Dependencies.getRequirements(ri.getHeader());
        final List<Dependency> prov = Dependencies.getProvides(ri.getHeader());
        final List<Dependency> conf = Dependencies.getConflicts(ri.getHeader());
        final List<Dependency> obs = Dependencies.getObsoletes(ri.getHeader());

        final Map<String, List<Dependency>> entries = new LinkedHashMap<>();
        entries.put("Requirements", req);
        entries.put("Provides", prov);
        entries.put("Conflicts", conf);
        entries.put("Obsoletes", obs);

        this.viewer.setAutoExpandLevel(2);
        this.viewer.setInput(entries);
        this.viewer.getTree().layout();
    }

    public Control getContainer() {
        return this.wrapper;
    }

}