org.eclipse.emf.cdo.internal.ui.dialogs.PackageRegistryDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.emf.cdo.internal.ui.dialogs.PackageRegistryDialog.java

Source

/*
 * Copyright (c) 2009-2012, 2015 Eike Stepper (Berlin, Germany) 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:
 *    Eike Stepper - initial API and implementation
 *    Victor Roldan Betancort - maintenance
 */
package org.eclipse.emf.cdo.internal.ui.dialogs;

import org.eclipse.emf.cdo.common.model.CDOModelUtil;
import org.eclipse.emf.cdo.common.model.CDOPackageInfo;
import org.eclipse.emf.cdo.common.model.CDOPackageUnit.Type;
import org.eclipse.emf.cdo.common.model.EMFUtil;
import org.eclipse.emf.cdo.internal.ui.actions.RegisterFilesystemPackagesAction;
import org.eclipse.emf.cdo.internal.ui.actions.RegisterGeneratedPackagesAction;
import org.eclipse.emf.cdo.internal.ui.messages.Messages;
import org.eclipse.emf.cdo.session.CDOSession;
import org.eclipse.emf.cdo.ui.shared.SharedIcons;

import org.eclipse.net4j.util.ObjectUtil;
import org.eclipse.net4j.util.container.IPluginContainer;
import org.eclipse.net4j.util.ui.UIUtil;
import org.eclipse.net4j.util.ui.widgets.CustomizeableComposite;

import org.eclipse.emf.ecore.EPackage;

import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.viewers.BaseLabelProvider;
import org.eclipse.jface.viewers.IColorProvider;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.IWorkbenchPage;

import javax.swing.text.AbstractDocument.Content;

import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

/**
 * @author Eike Stepper
 */
public class PackageRegistryDialog extends TitleAreaDialog {
    public static final String PRODUCT_GROUP = "org.eclipse.emf.cdo.ui.packageRegistryDialogCustomizers";

    private static final String TITLE = Messages.getString("PackageRegistryDialog.0"); //$NON-NLS-1$

    private static final Color GRAY = UIUtil.getDisplay().getSystemColor(SWT.COLOR_GRAY);

    private IWorkbenchPage page;

    private CDOSession session;

    private TableViewer viewer;

    public PackageRegistryDialog(IWorkbenchPage page, CDOSession session) {
        super(page.getWorkbenchWindow().getShell());
        this.page = page;
        this.session = session;
        setShellStyle(getShellStyle() | SWT.APPLICATION_MODAL | SWT.MAX | SWT.TITLE | SWT.RESIZE);
    }

    public IWorkbenchPage getPage() {
        return page;
    }

    public CDOSession getSession() {
        return session;
    }

    @Override
    protected Point getInitialSize() {
        return new Point(660, 500);
    }

    @Override
    protected Control createDialogArea(Composite parent) {
        getShell().setText(TITLE);
        setTitle(session.toString());
        setTitleImage(SharedIcons.getImage(SharedIcons.WIZBAN_PACKAGE_MANAGER));

        Composite composite = (Composite) super.createDialogArea(parent);

        viewer = new TableViewer(composite, SWT.NONE);
        Table table = viewer.getTable();

        table.setHeaderVisible(true);
        table.setLayoutData(UIUtil.createGridData());
        addColumn(table, Messages.getString("PackageRegistryDialog.1"), 400, SWT.LEFT); //$NON-NLS-1$
        addColumn(table, Messages.getString("PackageRegistryDialog.2"), 75, SWT.CENTER); //$NON-NLS-1$
        addColumn(table, Messages.getString("PackageRegistryDialog.3"), 75, SWT.CENTER); //$NON-NLS-1$
        addColumn(table, Messages.getString("PackageRegistryDialog.4"), 75, SWT.CENTER); //$NON-NLS-1$

        viewer.setContentProvider(new EPackageContentProvider());
        viewer.setLabelProvider(new EPackageLabelProvider());
        viewer.setInput(session);

        return composite;
    }

    @Override
    protected void createButtonsForButtonBar(Composite parent) {
        Button button = createButton(parent, -1, Messages.getString("PackageRegistryDialog.5"), false); //$NON-NLS-1$
        button.setEnabled(isGlobalPackageAvaliable());
        button.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                new RegisterGeneratedPackagesAction(page, session) {
                    @Override
                    protected void postRegistration(List<EPackage> ePackages) {
                        refreshViewer();
                    }
                }.run();
            }
        });

        createButton(parent, -1, Messages.getString("PackageRegistryDialog.7"), false) //$NON-NLS-1$
                .addSelectionListener(new SelectionAdapter() {
                    @Override
                    public void widgetSelected(SelectionEvent e) {
                        new RegisterFilesystemPackagesAction(page, session) {
                            @Override
                            protected void postRegistration(List<EPackage> ePackages) {
                                refreshViewer();
                            }
                        }.run();
                    }
                });

        CustomizeableComposite.customize(parent, IPluginContainer.INSTANCE, PRODUCT_GROUP, this);

        createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CLOSE_LABEL, false);
    }

    /**
     * Expose this method publicly.
     */
    @Override
    public Button createButton(Composite parent, int id, String label, boolean defaultButton) {
        return super.createButton(parent, id, label, defaultButton);
    }

    private boolean isGlobalPackageAvaliable() {
        Set<String> uris = new HashSet<String>(EPackage.Registry.INSTANCE.keySet());
        uris.removeAll(session.getPackageRegistry().keySet());
        return !uris.isEmpty();
    }

    private void addColumn(Table table, String title, int width, int alignment) {
        TableColumn column = new TableColumn(table, alignment);
        column.setText(title);
        column.setWidth(width);
    }

    protected Image getContentIcon(Content content) {
        return null;
    }

    public void refreshViewer() {
        page.getWorkbenchWindow().getShell().getDisplay().asyncExec(new Runnable() {
            public void run() {
                try {
                    viewer.refresh();
                } catch (RuntimeException ignore) {
                }
            }
        });
    }

    /**
     * @author Eike Stepper
     */
    public class EPackageLabelProvider extends BaseLabelProvider implements ITableLabelProvider, IColorProvider {
        public EPackageLabelProvider() {
        }

        public String getColumnText(Object element, int columnIndex) {
            @SuppressWarnings("unchecked")
            Map.Entry<String, Object> entry = (Entry<String, Object>) element;
            CDOPackageInfo packageInfo = CDOModelUtil.getPackageInfo(entry.getValue(),
                    session.getPackageRegistry());
            if (packageInfo != null) {
                switch (columnIndex) {
                case 0:
                    return packageInfo.getPackageURI();

                case 1:
                    return packageInfo.getPackageUnit().getState().toString();

                case 2:
                    if (packageInfo.getPackageUnit().getType() == Type.UNKNOWN) {
                        return Messages.getString("PackageRegistryDialog.8"); //$NON-NLS-1$
                    }

                    return packageInfo.getPackageUnit().getType().toString();

                case 3:
                    return packageInfo.getPackageUnit().getOriginalType().toString();
                }
            }

            switch (columnIndex) {
            case 0:
                return entry.getKey();

            default:
                return ""; //$NON-NLS-1$
            }
        }

        public Image getColumnImage(Object element, int columnIndex) {
            if (columnIndex == 0) {
                @SuppressWarnings("unchecked")
                Map.Entry<String, Object> entry = (Entry<String, Object>) element;
                CDOPackageInfo packageInfo = CDOModelUtil.getPackageInfo(entry.getValue(),
                        session.getPackageRegistry());
                if (packageInfo != null) {
                    switch (packageInfo.getPackageUnit().getType()) {
                    case LEGACY:
                        return SharedIcons.getDescriptor(SharedIcons.OBJ_EPACKAGE_LEGACY).createImage();

                    case NATIVE:
                        return SharedIcons.getDescriptor(SharedIcons.OBJ_EPACKAGE_NATIVE).createImage();

                    case DYNAMIC:
                        return SharedIcons.getDescriptor(SharedIcons.OBJ_EPACKAGE_DYNAMIC).createImage();
                    }
                }

                return SharedIcons.getDescriptor(SharedIcons.OBJ_EPACKAGE_UNKNOWN).createImage();
            }

            return null;
        }

        public Color getBackground(Object element) {
            return null;
        }

        public Color getForeground(Object element) {
            @SuppressWarnings("unchecked")
            Map.Entry<String, Object> entry = (Entry<String, Object>) element;
            CDOPackageInfo packageInfo = CDOModelUtil.getPackageInfo(entry.getValue(),
                    session.getPackageRegistry());
            if (packageInfo != null) {
                return null;
            }

            return GRAY;
        }
    }

    /**
     * @author Eike Stepper
     */
    public static class EPackageContentProvider implements IStructuredContentProvider {
        private static final Object[] NO_ELEMENTS = {};

        private CDOSession session;

        public EPackageContentProvider() {
        }

        public void dispose() {
        }

        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
            if (newInput instanceof CDOSession) {
                if (!ObjectUtil.equals(session, newInput)) {
                    session = (CDOSession) newInput;
                }
            }
        }

        public Object[] getElements(Object inputElement) {
            if (inputElement != session) {
                return NO_ELEMENTS;
            }

            return EMFUtil.getSortedRegistryEntries(session.getPackageRegistry());
        }
    }
}