/* * * All rights reserved. This program and the accompanying materials are made * available under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the License, * or (at your option) any later version. * * You should have received a copy of the GNU Lesser General Public License * along with this distribution. If not, see <http://www.gnu.org/licenses/>. * * Contributors: * wetransform GmbH <http://www.wetransform.to> */ package eu.esdihumboldt.hale.io.haleconnect.ui.projects; import java.io.InputStream; import java.text.MessageFormat; import java.util.Collection; import java.util.HashSet; import java.util.Set; import org.eclipse.core.runtime.content.IContentType; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.DialogPage; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.preference.FieldEditor; import org.eclipse.jface.preference.StringFieldEditor; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.jface.viewers.ComboViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import eu.esdihumboldt.hale.common.core.io.HaleIO; import eu.esdihumboldt.hale.common.core.io.ImportProvider; import eu.esdihumboldt.hale.common.core.io.extension.IOProviderDescriptor; import eu.esdihumboldt.hale.common.core.io.supplier.LocatableInputSupplier; import eu.esdihumboldt.hale.io.haleconnect.HaleConnectException; import eu.esdihumboldt.hale.io.haleconnect.HaleConnectService; import eu.esdihumboldt.hale.io.haleconnect.ui.HaleConnectLoginDialog; import eu.esdihumboldt.hale.io.haleconnect.ui.HaleConnectLoginHandler; import eu.esdihumboldt.hale.ui.HaleUI; import eu.esdihumboldt.hale.ui.io.ImportSource; import eu.esdihumboldt.hale.ui.io.source.AbstractProviderSource; import eu.esdihumboldt.hale.ui.io.source.AbstractSource; /** * Provider source for hale connect projects * * @author Florian Esser * @param <P> Import provider * */ public class HaleConnectSource<P extends ImportProvider> extends AbstractProviderSource<P> { private Label loginStatusLabel; private Button loginButton; private StringFieldEditor projectName; private Button selectProjectButton; private HaleConnectProjectConfig selectedProject; private Set<IContentType> supportedTypes; /** * @see ImportSource#createControls(Composite) */ @Override public void createControls(Composite parent) { parent.setLayout(new GridLayout(3, false)); HaleConnectService hcs = HaleUI.getServiceProvider().getService(HaleConnectService.class); /* * Login status label */ loginStatusLabel = new Label(parent, SWT.NONE); loginStatusLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1)); loginButton = new Button(parent, SWT.PUSH); loginButton.setText("Login"); loginButton.addSelectionListener(new SelectionAdapter() { /** * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent) */ @Override public void widgetSelected(SelectionEvent e) { HaleConnectLoginDialog loginDialog = HaleConnectLoginHandler .createLoginDialog(Display.getCurrent().getActiveShell()); if (loginDialog.open() == Dialog.OK) { HaleConnectLoginHandler.performLogin(loginDialog); updateLoginStatus(); } } }); /* * Project name text field */ projectName = new StringFieldEditor("project", "Project", parent) { // the following methods are overridden so the button // may appear on the same line @Override public int getNumberOfControls() { return super.getNumberOfControls() + 1; } @Override protected void doFillIntoGrid(Composite parent, int numColumns) { super.doFillIntoGrid(parent, numColumns - 1); } }; projectName.setEmptyStringAllowed(false); projectName.setErrorMessage("Please select a project before continuing."); projectName.setPage(getPage()); projectName.getTextControl(parent).setEditable(false); projectName.getTextControl(parent).addMouseListener(new MouseAdapter() { @Override public void mouseDown(MouseEvent e) { selectProject(); } }); projectName.setPropertyChangeListener(new IPropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent event) { if (event.getProperty().equals(FieldEditor.IS_VALID)) { getPage().setMessage(null); updateState(false); } else if (event.getProperty().equals(FieldEditor.VALUE)) { getPage().setMessage(null); updateState(false); } } }); /* * Select project button */ selectProjectButton = new Button(parent, SWT.PUSH); selectProjectButton.setText("Select"); selectProjectButton.setToolTipText("Select project"); selectProjectButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1)); selectProjectButton.setEnabled(hcs.isLoggedIn()); selectProjectButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { selectProject(); } }); /* * Supported types */ supportedTypes = new HashSet<IContentType>(); if (getConfiguration().getContentType() != null) { supportedTypes.add(getConfiguration().getContentType()); } else { // set content types for file field Collection<IOProviderDescriptor> factories = getConfiguration().getFactories(); for (IOProviderDescriptor factory : factories) { supportedTypes.addAll(factory.getSupportedTypes()); } } // types combo Composite group = new Composite(parent, SWT.NONE); group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 3, 1)); group.setLayout(GridLayoutFactory.fillDefaults().numColumns(3).create()); // label Label providerLabel = new Label(parent, SWT.NONE); providerLabel.setText("Import as"); // create provider combo ComboViewer providers = createProviders(parent); providers.getControl() .setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false, 2, 1)); updateLoginStatus(); // initial state update updateState(true); } /** * @see AbstractProviderSource#updateContentType() */ @Override protected void updateContentType() { IContentType contentType = getConfiguration().getContentType(); if (projectName.isValid()) { // determine content type Collection<IContentType> filteredTypes = HaleIO.findContentTypesFor(supportedTypes, getSource(), projectName.getStringValue()); if (!filteredTypes.isEmpty()) { contentType = filteredTypes.iterator().next(); } } getConfiguration().setContentType(contentType); if (contentType != null) { getPage().setMessage(contentType.getName(), DialogPage.INFORMATION); } else { getPage().setMessage(null); } super.updateContentType(); } private void selectProject() { selectedProject = ChooseHaleConnectProjectWizard.openSelectProject(); if (selectedProject != null) { projectName.setStringValue(selectedProject.getProjectName()); } else { projectName.setStringValue(""); } } /** * @see AbstractProviderSource#isValidSource() */ @Override protected boolean isValidSource() { HaleConnectService hcs = HaleUI.getServiceProvider().getService(HaleConnectService.class); return hcs.isLoggedIn() && selectedProject != null; } /** * @see AbstractProviderSource#getSource() */ @Override protected LocatableInputSupplier<? extends InputStream> getSource() { HaleConnectService hcs = HaleUI.getServiceProvider().getService(HaleConnectService.class); try { return hcs.loadProject(selectedProject.getOwner(), selectedProject.getProjectId()); } catch (HaleConnectException e) { throw new RuntimeException(e.getMessage(), e); } } /** * @see AbstractSource#onActivate() */ @Override public void onActivate() { selectProjectButton.setFocus(); } private void updateLoginStatus() { HaleConnectService hcs = HaleUI.getServiceProvider().getService(HaleConnectService.class); loginButton.setEnabled(!hcs.isLoggedIn()); selectProjectButton.setEnabled(hcs.isLoggedIn()); if (hcs.isLoggedIn()) { loginStatusLabel .setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_GREEN)); loginStatusLabel.setText( MessageFormat.format("Logged in as {0}", hcs.getSession().getUsername())); } else { loginStatusLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1)); loginStatusLabel.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_RED)); loginStatusLabel.setText( "You are not logged in to hale connect. Please login before opening a project."); } } }