/*******************************************************************************
* Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
*******************************************************************************/
package com.cisco.yangide.ui.wizards;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
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 org.eclipse.swt.widgets.Text;
/**
* @author Konstantin Zaitsev
* @date Jun 27, 2014
*/
class YangProjectWizardPage extends WizardPage {
private Text rootDirTxt;
private Combo yangVersion;
private Button exampleFileChk;
private Table generatorsTable;
private TableViewer generatorsViewer;
private Button removeBtn;
private Button editBtn;
private Button addBtn;
protected YangProjectWizardPage() {
super("yangProjectPage");
setTitle("YANG Tools Configuration");
setDescription("Specify YANG Code Generators Parameters");
}
@Override
public void createControl(Composite parent) {
Composite container = new Composite(parent, SWT.NULL);
container.setLayout(new GridLayout(1, false));
Composite group1 = new Composite(container, SWT.NONE);
group1.setLayout(new GridLayout(2, false));
group1.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
new Label(group1, SWT.NONE).setText("YANG Tools Version:");
yangVersion = new Combo(group1, SWT.BORDER | SWT.READ_ONLY);
yangVersion.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
new Label(group1, SWT.NONE).setText("YANG Files Root Directory:");
rootDirTxt = new Text(group1, SWT.BORDER);
rootDirTxt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
rootDirTxt.setText(YangProjectWizard.SRC_MAIN_YANG);
Composite group2 = new Composite(container, SWT.NONE);
group2.setLayout(new GridLayout(2, false));
group2.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, true));
privateCreateGeneratorControls(group2);
exampleFileChk = new Button(group2, SWT.CHECK);
exampleFileChk.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
exampleFileChk.setText("Create Example YANG File");
exampleFileChk.setSelection(true);
setControl(container);
// add default values
// TODO KOS: load version from repository
yangVersion.add("0.6.2-SNAPSHOT");
yangVersion.add("0.6.1");
yangVersion.add("0.6.0");
yangVersion.add("0.5.8");
yangVersion.select(0);
// default generator
CodeGeneratorConfig config = new CodeGeneratorConfig();
config.setGroupId("org.opendaylight.yangtools");
config.setArtifactId("maven-sal-api-gen-plugin");
config.setVersion(yangVersion.getText());
config.setGenClassName("org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl");
config.setGenOutputDirectory("target/generated-sources/sal");
generatorsViewer.add(config);
}
/**
* @param parent
*/
private void privateCreateGeneratorControls(Composite parent) {
Label label = new Label(parent, SWT.NONE);
label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true, 2, 1));
label.setText("Source Code Generators:");
generatorsViewer = new TableViewer(parent, SWT.BORDER | SWT.FULL_SELECTION);
generatorsTable = generatorsViewer.getTable();
generatorsTable.setLinesVisible(true);
generatorsTable.setHeaderVisible(true);
generatorsTable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
generatorsTable.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
validate();
}
});
createTableColum(generatorsTable, "Group ID", 120);
createTableColum(generatorsTable, "Artifact ID", 120);
createTableColum(generatorsTable, "Version", 100);
createTableColum(generatorsTable, "Generator Class Name", 200);
createTableColum(generatorsTable, "Output Directory", 200);
generatorsViewer.setLabelProvider(new ITableLabelProvider() {
@Override
public void removeListener(ILabelProviderListener listener) {
}
@Override
public boolean isLabelProperty(Object element, String property) {
return false;
}
@Override
public void dispose() {
}
@Override
public void addListener(ILabelProviderListener listener) {
}
@Override
public String getColumnText(Object element, int columnIndex) {
if (element instanceof CodeGeneratorConfig) {
CodeGeneratorConfig conf = (CodeGeneratorConfig) element;
String txt = null;
switch (columnIndex) {
case 0:
txt = conf.getGroupId();
break;
case 1:
txt = conf.getArtifactId();
break;
case 2:
txt = conf.getVersion();
break;
case 3:
txt = conf.getGenClassName();
break;
case 4:
txt = conf.getGenOutputDirectory();
break;
}
return txt != null ? txt : "";
}
return "";
}
@Override
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
});
Composite group = new Composite(parent, SWT.NONE);
group.setLayout(new GridLayout(1, false));
group.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, true));
addBtn = new Button(group, SWT.NONE);
addBtn.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
addBtn.setText("Add...");
addBtn.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
YangCodeGeneratorDialog dialog = new YangCodeGeneratorDialog(getShell());
if (dialog.open() == Window.OK) {
generatorsViewer.add(dialog.getConfig());
}
}
});
editBtn = new Button(group, SWT.NONE);
editBtn.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
editBtn.setText("Edit...");
editBtn.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
CodeGeneratorConfig config = (CodeGeneratorConfig) generatorsViewer.getElementAt(generatorsTable
.getSelectionIndex());
YangCodeGeneratorDialog dialog = new YangCodeGeneratorDialog(getShell(), config);
if (dialog.open() == Window.OK) {
generatorsViewer.update(dialog.getConfig(), null);
}
}
});
removeBtn = new Button(group, SWT.NONE);
removeBtn.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false));
removeBtn.setText("Remove");
removeBtn.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (generatorsTable.getSelectionCount() > 1) {
generatorsTable.remove(generatorsTable.getSelectionIndices());
validate();
}
}
});
validate();
}
private TableColumn createTableColum(Table table, String name, int width) {
TableColumn tableColumn = new TableColumn(table, SWT.NONE);
tableColumn.setWidth(width);
tableColumn.setText(name);
return tableColumn;
}
private void validate() {
editBtn.setEnabled(generatorsTable.getSelectionCount() == 1);
removeBtn.setEnabled(generatorsTable.getItemCount() > 1);
}
public boolean createExampleFile() {
return exampleFileChk.getSelection();
}
public String getRootDir() {
return rootDirTxt.getText();
}
public String getYangVersion() {
return yangVersion.getText();
}
public List<CodeGeneratorConfig> getCodeGenerators() {
List<CodeGeneratorConfig> list = new ArrayList<CodeGeneratorConfig>();
for (TableItem item : generatorsTable.getItems()) {
list.add((CodeGeneratorConfig) item.getData());
}
return list;
}
}