package com.redhat.ceylon.eclipse.code.wizard;
import static com.redhat.ceylon.eclipse.ui.CeylonResources.CEYLON_NEW_MODULE;
import static org.eclipse.swt.layout.GridData.HORIZONTAL_ALIGN_FILL;
import static org.eclipse.swt.layout.GridData.VERTICAL_ALIGN_BEGINNING;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
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.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import com.redhat.ceylon.common.Versions;
import com.redhat.ceylon.eclipse.ui.CeylonPlugin;
import com.redhat.ceylon.eclipse.ui.CeylonResources;
import com.redhat.ceylon.ide.common.modulesearch.ModuleVersionNode;
import com.redhat.ceylon.model.typechecker.model.Module;
public abstract class ImportModulesWizardPage extends WizardPage {
private Table moduleImportsTable;
ImportModulesWizardPage() {
super("Add Module Imports",
"Add Module Imports",
CeylonPlugin.imageRegistry()
.getDescriptor(CEYLON_NEW_MODULE));
setDescription("Add module imports to new module.");
}
@Override
public void createControl(Composite parent) {
initializeDialogUnits(parent);
Composite composite = new Composite(parent, SWT.NONE);
composite.setFont(parent.getFont());
GridLayout layout = new GridLayout();
layout.numColumns = 1;
composite.setLayout(layout);
createModulesBlock(composite);
setControl(composite);
Dialog.applyDialogFont(composite);
setPageComplete(true);
}
private void createModulesBlock(Composite parent) {
Label label = new Label(parent, SWT.NONE);
label.setText("Imported modules:");
GridData lgd = new GridData(VERTICAL_ALIGN_BEGINNING);
label.setLayoutData(lgd);
Composite composite = new Composite(parent, SWT.NONE);
GridData cgd = new GridData(GridData.FILL_HORIZONTAL);
cgd.grabExcessHorizontalSpace = true;
composite.setLayoutData(cgd);
GridLayout layout = new GridLayout(3, true);
layout.marginWidth=0;
composite.setLayout(layout);
moduleImportsTable = new Table(composite,
SWT.MULTI | SWT.V_SCROLL | SWT.BORDER);
moduleImportsTable.setHeaderVisible(true);
moduleImportsTable.setLinesVisible(true);
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan=2;
gd.verticalSpan=4;
gd.grabExcessHorizontalSpace = true;
// gd.grabExcessVerticalSpace = true;
gd.heightHint = 100;
gd.widthHint = 300;
moduleImportsTable.setLayoutData(gd);
TableColumn column = new TableColumn(moduleImportsTable, SWT.NONE, 0);
column.setText("Module");
column.setWidth(180);
TableColumn versionColumn = new TableColumn(moduleImportsTable, SWT.NONE, 1);
versionColumn.setText("Version");
versionColumn.setWidth(70);
TableColumn sharedColumn = new TableColumn(moduleImportsTable, SWT.NONE, 2);
sharedColumn.setText("Transitivity");
sharedColumn.setWidth(70);
final TableItem item = new TableItem(moduleImportsTable, SWT.NONE);
item.setImage(CeylonResources.MODULE);
item.setText(Module.LANGUAGE_MODULE_NAME);
item.setText(1, Versions.CEYLON_VERSION_NUMBER); //TODO: is this right?
item.setText(2, "shared");
GridData bgd = new GridData(VERTICAL_ALIGN_BEGINNING|HORIZONTAL_ALIGN_FILL);
bgd.grabExcessHorizontalSpace=false;
bgd.widthHint = 50;
Button sharedButton = new Button(composite, SWT.PUSH);
sharedButton.setText("Toggle Shared");
sharedButton.setLayoutData(bgd);
sharedButton.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
for (TableItem item: moduleImportsTable.getSelection()) {
item.setText(2, item.getText(2).isEmpty() ? "shared": "");
}
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {}
});
Button addButton = new Button(composite, SWT.PUSH);
addButton.setText("Add Imports...");
addButton.setLayoutData(bgd);
addButton.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
selectAndAddModules();
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {}
});
Button removeButton = new Button(composite, SWT.PUSH);
removeButton.setText("Remove Selected");
removeButton.setLayoutData(bgd);
removeButton.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
removeSelectedModules();
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {}
});
// Label l = new Label(parent, SWT.NONE);
// l.setText("(Checked modules are exported.)");
// label.setLayoutData(lgd);
}
private void selectAndAddModules() {
Map<String, ModuleVersionNode> added = getModules();
for (Map.Entry<String, ModuleVersionNode> entry:
added.entrySet()) {
TableItem item = new TableItem(moduleImportsTable, SWT.NONE);
item.setImage(CeylonResources.MODULE);
item.setText(entry.getKey());
item.setText(1, entry.getValue().getVersion());
}
}
abstract Map<String, ModuleVersionNode> getModules();
private void removeSelectedModules() {
int[] selection = moduleImportsTable.getSelectionIndices();
List<String> names = new ArrayList<String>();
List<Integer> removed = new ArrayList<Integer>();
for (int index: selection) {
TableItem item = moduleImportsTable.getItem(index);
String name = item.getText();
if (!name.equals(Module.LANGUAGE_MODULE_NAME)) {
names.add(name);
removed.add(index);
}
}
int[] indices = new int[removed.size()];
for (int i=0; i<removed.size(); i++) {
indices[i] = removed.get(i);
}
moduleImportsTable.remove(indices);
}
Map<String,String> getImports() {
Map<String,String> result = new HashMap<String,String>();
for (TableItem item: moduleImportsTable.getItems()) {
String name = item.getText();
String version = item.getText(1);
if (!name.equals(Module.LANGUAGE_MODULE_NAME)) {
result.put(name, version);
}
}
return result;
}
Set<String> getSharedImports() {
Set<String> result = new HashSet<String>();
for (TableItem item: moduleImportsTable.getItems()) {
String name = item.getText();
boolean shared = !item.getText(2).isEmpty();
if (shared && !name.equals(Module.LANGUAGE_MODULE_NAME)) {
result.add(name);
}
}
return result;
}
}