| /***************************************************************************** |
| * Copyright (c) 2013, 2017 CEA LIST. |
| * |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * CEA LIST - Initial API and implementation |
| *****************************************************************************/ |
| package org.eclipse.papyrus.cdo.internal.ui.wizards; |
| |
| import java.lang.reflect.InvocationTargetException; |
| |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.Status; |
| import org.eclipse.core.runtime.SubMonitor; |
| import org.eclipse.emf.cdo.explorer.CDOExplorerUtil; |
| import org.eclipse.emf.cdo.explorer.checkouts.CDOCheckout; |
| import org.eclipse.emf.cdo.explorer.checkouts.CDOCheckoutManager; |
| import org.eclipse.jface.layout.GridDataFactory; |
| import org.eclipse.jface.operation.IRunnableContext; |
| import org.eclipse.jface.operation.IRunnableWithProgress; |
| import org.eclipse.jface.viewers.ISelectionChangedListener; |
| import org.eclipse.jface.viewers.IStructuredContentProvider; |
| import org.eclipse.jface.viewers.IStructuredSelection; |
| import org.eclipse.jface.viewers.LabelProvider; |
| import org.eclipse.jface.viewers.SelectionChangedEvent; |
| import org.eclipse.jface.viewers.StructuredSelection; |
| import org.eclipse.jface.viewers.TableViewer; |
| import org.eclipse.jface.viewers.Viewer; |
| import org.eclipse.osgi.util.NLS; |
| import org.eclipse.papyrus.cdo.internal.ui.l10n.Messages; |
| import org.eclipse.papyrus.cdo.ui.Activator; |
| import org.eclipse.papyrus.cdo.ui.SharedImages; |
| import org.eclipse.swt.graphics.Image; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Control; |
| import org.eclipse.ui.statushandlers.StatusManager; |
| |
| import com.google.common.base.Supplier; |
| import com.google.common.eventbus.EventBus; |
| |
| /** |
| * This is the CheckoutSelectionBlock type. Enjoy. |
| */ |
| public class CheckoutSelectionBlock { |
| |
| private final EventBus bus; |
| |
| private final Supplier<? extends IRunnableContext> runnableContext; |
| |
| private TableViewer repoList; |
| |
| private CDOCheckout selectedCheckout; |
| |
| public CheckoutSelectionBlock(EventBus bus, Supplier<? extends IRunnableContext> runnableContext) { |
| this.bus = bus; |
| this.runnableContext = runnableContext; |
| } |
| |
| public Control createControl(Composite parent) { |
| CDOCheckoutManager mgr = CDOExplorerUtil.getCheckoutManager(); |
| repoList = new TableViewer(parent); |
| GridDataFactory.fillDefaults().grab(true, true).applyTo(repoList.getControl()); |
| repoList.setContentProvider(new RepositoryContentProvider()); |
| repoList.setLabelProvider(new RepositoryLabelProvider()); |
| repoList.setInput(mgr); |
| |
| if (selectedCheckout != null) { |
| repoList.setSelection(new StructuredSelection(selectedCheckout)); |
| selected(selectedCheckout); |
| } |
| |
| repoList.addSelectionChangedListener(new ISelectionChangedListener() { |
| |
| @Override |
| public void selectionChanged(SelectionChangedEvent event) { |
| IStructuredSelection sel = (IStructuredSelection) event.getSelection(); |
| |
| if (sel.isEmpty()) { |
| if (selectedCheckout != null) { |
| // veto empty selection |
| repoList.setSelection(new StructuredSelection(selectedCheckout)); |
| } |
| } else { |
| selected((CDOCheckout) sel.getFirstElement()); |
| } |
| } |
| }); |
| |
| // initially select the first connected repo |
| for (CDOCheckout next : mgr.getCheckouts()) { |
| |
| if (next.isOpen()) { |
| selected(next); |
| repoList.setSelection(new StructuredSelection(next)); |
| break; |
| } |
| } |
| |
| return repoList.getControl(); |
| } |
| |
| public void dispose() { |
| // pass |
| } |
| |
| public void setEnabled(boolean enabled) { |
| if (repoList != null) { |
| repoList.getControl().setEnabled(enabled); |
| } |
| } |
| |
| public boolean isEnabled() { |
| return (repoList != null) && repoList.getControl().isEnabled(); |
| } |
| |
| void selected(final CDOCheckout checkout) { |
| selectedCheckout = checkout; |
| |
| if (!checkout.isOpen()) { |
| try { |
| runnableContext.get().run(true, false, new IRunnableWithProgress() { |
| |
| @Override |
| public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { |
| |
| SubMonitor sub = SubMonitor.convert(monitor, NLS.bind(Messages.CheckoutSelectionBlock_0, checkout.getLabel()), IProgressMonitor.UNKNOWN); |
| |
| try { |
| checkout.open(); |
| |
| // yes, it's a busy wait, but there's not much |
| // to be done about that. |
| final long deadline = System.currentTimeMillis() + 5000L; |
| while (!checkout.isOpen()) { |
| Thread.sleep(250L); |
| if (System.currentTimeMillis() >= deadline) { |
| break; |
| } |
| } |
| |
| repoList.getControl().getDisplay().asyncExec(new Runnable() { |
| |
| @Override |
| public void run() { |
| if (!repoList.getControl().isDisposed()) { |
| repoList.update(checkout, null); |
| bus.post(checkout); |
| } |
| } |
| }); |
| } finally { |
| sub.done(); |
| } |
| } |
| }); |
| } catch (Exception e) { |
| StatusManager.getManager().handle(new Status(IStatus.ERROR, Activator.PLUGIN_ID, Messages.CheckoutSelectionBlock_1, e), StatusManager.SHOW); |
| } |
| } |
| |
| bus.post(checkout); |
| } |
| |
| public void setSelectedCheckout(CDOCheckout checkout) { |
| this.selectedCheckout = checkout; |
| |
| if (repoList != null) { |
| repoList.setSelection(new StructuredSelection(selectedCheckout)); |
| selected(selectedCheckout); |
| } |
| } |
| |
| public CDOCheckout getSelectedCheckout() { |
| return selectedCheckout; |
| } |
| |
| // |
| // Nested types |
| // |
| |
| private static class RepositoryContentProvider implements IStructuredContentProvider { |
| |
| @Override |
| public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { |
| viewer.refresh(); |
| } |
| |
| @Override |
| public Object[] getElements(Object inputElement) { |
| return CDOExplorerUtil.getCheckoutManager().getCheckouts(); |
| } |
| |
| @Override |
| public void dispose() { |
| // pass |
| } |
| } |
| |
| private static class RepositoryLabelProvider extends LabelProvider { |
| |
| @Override |
| public Image getImage(Object element) { |
| boolean open = ((CDOCheckout) element).isOpen(); |
| return SharedImages.getImage(open ? Activator.ICON_OPEN_REPOSITORY : Activator.ICON_CLOSED_REPOSITORY); |
| } |
| |
| @Override |
| public String getText(Object element) { |
| return ((CDOCheckout) element).getLabel(); |
| } |
| } |
| } |