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