blob: 37adb7f6e54c56c3a0b107372d18a7774ebe0df3 [file] [log] [blame]
/*
* 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.Shell;
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(new Shell(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());
}
}
}