/* * 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()); } } }