package org.genmymodel.customgen.runconfig;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.dialogs.FilteredItemsSelectionDialog;
import org.eclipse.ui.dialogs.FilteredResourcesSelectionDialog;
import org.eclipse.ui.statushandlers.StatusManager;
import org.genmymodel.common.account.GMMCredential;
import org.genmymodel.common.api.GMMAPIRestClient;
import org.genmymodel.common.api.ProjectBinding;
import org.genmymodel.customgen.Activator;
import org.springframework.security.oauth2.client.resource.OAuth2AccessDeniedException;
/**
* The custom generator run configuration tab in run configuration dialog.
*
* @author Ali Gourch
* @author Vincent Aranega
*
*/
public class GMMRunconfigTab extends AbstractLaunchConfigurationTab {
private static final String GID = "org.genmymodel.runconfig.tab";
private Table table;
private Text login;
private Text password;
private Text project;
private Button refresh;
private Button browse;
private String modelID;
/**
* {@inheritDoc}
*/
@Override
public void createControl(Composite parent) {
final Composite root = new Composite(parent, SWT.NULL);
setControl(root);
GridLayout grid = new GridLayout();
grid.marginTop = 10;
grid.verticalSpacing = 5;
grid.numColumns = 1;
root.setLayout(grid);
Group projectSelection = new Group(root, SWT.NONE); // createGroup(root, "Custom generator project", 2, 1, GridData.FILL);
projectSelection.setLayout(new GridLayout(2, false));
projectSelection.setText("Custom generator project");
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
gd.grabExcessHorizontalSpace = true;
projectSelection.setLayoutData(gd);
project = new Text(projectSelection, SWT.SINGLE | SWT.BORDER);
project.setLayoutData(gd);
project.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
updateLaunchConfigurationDialog();
}
});
browse = createPushButton(projectSelection, "Browse...", null);
browse.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
}
public void widgetSelected(SelectionEvent e) {
handleBrowse();
}
});
Group modelSelection = new Group(root, SWT.BORDER);
modelSelection.setText("Model project");
modelSelection.setLayout(new GridLayout());
GridData msgd = new GridData(GridData.FILL_BOTH);
msgd.grabExcessHorizontalSpace = true;
msgd.grabExcessVerticalSpace = true;
modelSelection.setLayoutData(msgd);
table = new Table(modelSelection, SWT.BORDER | SWT.FULL_SELECTION | SWT.VIRTUAL);
table.setLinesVisible (true);
table.setHeaderVisible (true);
table.setLayoutData(msgd);
table.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
ProjectBinding p = (ProjectBinding)((Table)e.getSource()).getSelection()[0].getData();
modelID = p.getProjectId();
updateLaunchConfigurationDialog();
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
}
});
String[] titles = {"name", "public", "ID"};
for (String title : titles) {
TableColumn column = new TableColumn (table, SWT.NONE);
column.setText (title);
column.setWidth(200);
}
Composite compositeCredential = new Composite(modelSelection, SWT.NULL);
GridLayout gridLayout = new GridLayout(5, false);
gridLayout.horizontalSpacing = 10;
compositeCredential.setLayout(gridLayout);
final GridData gridData = new GridData();
gridData.widthHint = 100;
final Label l1 = new Label(compositeCredential, SWT.RIGHT);
l1.setText("Login: ");
login = new Text(compositeCredential, SWT.BORDER | SWT.SINGLE);
login.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
updateLaunchConfigurationDialog();
}
});
login.setLayoutData(gridData);
final Label l2 = new Label(compositeCredential, SWT.RIGHT);
l2.setText("Password: ");
password = new Text(compositeCredential, SWT.PASSWORD | SWT.BORDER | SWT.SINGLE);
password.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
updateLaunchConfigurationDialog();
}
});
password.setLayoutData(gridData);
refresh = new Button(compositeCredential, SWT.PUSH);
refresh.setText("Refresh");
refresh.setLayoutData(gridData);
refresh.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
ProgressMonitorDialog mon = new ProgressMonitorDialog(root.getShell());
mon.open();
populateProjectTable();
mon.close();
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
}
});
}
/**
* Populate the project table with user information.
*/
private void populateProjectTable() {
GMMCredential credential = new GMMCredential(login.getText(), password.getText());
for (TableItem item : table.getItems()) {
item.dispose();
}
try {
ProjectBinding [] projects = GMMAPIRestClient.getInstance().GETMyProjects(credential);
for (ProjectBinding project : projects) {
TableItem item = new TableItem(table, SWT.NONE);
item.setText(new String[] {project.getName(), Boolean.toString(project.isPublic()), project.getProjectId()});
item.setData(project);
}
} catch (OAuth2AccessDeniedException e) {
IStatus err = new Status(
Status.ERROR,
Activator.PLUGIN_ID,
Status.ERROR,
"Login/password error\n\tPlease verify your information and be sure that you set a passord for your account.",
e);
StatusManager.getManager().handle(err, StatusManager.BLOCK);
}
}
/**
* Handles the project browse button.
*/
private void handleBrowse() {
FilteredItemsSelectionDialog dialog = new FilteredResourcesSelectionDialog(getShell(), false,
ResourcesPlugin.getWorkspace().getRoot(), IResource.PROJECT);
dialog.setTitle("Browse...");
String path = project.getText();
if (path != null && path.length() > 0 && new Path(path).lastSegment().length() > 0) {
dialog.setInitialPattern(new Path(path).lastSegment());
} else {
dialog.setInitialPattern("**");
}
dialog.open();
if (dialog.getResult() != null && dialog.getResult().length > 0
&& dialog.getResult()[0] instanceof IProject) {
project.setText(((IProject)dialog.getResult()[0]).getFullPath().toString());
}
}
/**
* {@inheritDoc}
*/
@Override
public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
}
/**
* {@inheritDoc}
*/
@Override
public void initializeFrom(ILaunchConfiguration configuration) {
try {
project.setText(configuration.getAttribute(GMMRunconfigConstant.CUSTOMGEN_PROJECT, ""));
} catch (CoreException e) {
}
try {
login.setText(configuration.getAttribute(GMMRunconfigConstant.LOGIN, ""));
} catch (CoreException e) {
}
try {
password.setText(configuration.getAttribute(GMMRunconfigConstant.PASSWORD, ""));
} catch (CoreException e) {
}
try {
modelID = configuration.getAttribute(GMMRunconfigConstant.MODEL_PROJECT, "");
} catch (CoreException e) {
}
if (login.getText() != null && !login.getText().trim().isEmpty() && password.getText() != null && !password.getText().trim().isEmpty()) {
populateProjectTable();
}
}
/**
* {@inheritDoc}
*/
@Override
public void performApply(ILaunchConfigurationWorkingCopy configuration) {
configuration.setAttribute(GMMRunconfigConstant.CUSTOMGEN_PROJECT, project.getText());
configuration.setAttribute(GMMRunconfigConstant.MODEL_PROJECT, modelID);
configuration.setAttribute(GMMRunconfigConstant.LOGIN, login.getText());
configuration.setAttribute(GMMRunconfigConstant.PASSWORD, password.getText());
}
/**
* {@inheritDoc}
*/
@Override
public String getName() {
return "&Project selection";
}
/**
* {@inheritDoc}
*/
@Override
public boolean isValid(ILaunchConfiguration config) {
boolean projectOK = project.getText() != null
&& !project.getText().trim().isEmpty()
&& ResourcesPlugin.getWorkspace().getRoot()
.getProject(project.getText()).exists();
boolean modelidOK = modelID != null && !modelID.trim().isEmpty();
return projectOK && modelidOK;
}
/**
* {@inheritDoc}
*/
@Override
public String getId() {
return GID;
}
}