blob: 2050bc38cf3f4c6a165e19b1cae321cfe8824c9d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015 Red Hat, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* Contributors:
* Red Hat Inc. - initial API and implementation and/or initial documentation
*******************************************************************************/
package org.eclipse.wst.jsdt.js.bower.internal.wizard;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.debug.internal.ui.SWTFactory;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.FillLayout;
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.ContainerSelectionDialog;
import org.eclipse.wst.jsdt.js.bower.BowerJson;
import org.eclipse.wst.jsdt.js.bower.BowerJson.Builder;
import org.eclipse.wst.jsdt.js.bower.internal.BowerConstants;
import org.eclipse.wst.jsdt.js.bower.internal.Messages;
import org.eclipse.wst.jsdt.js.common.ui.PopUpPropertyDialog;
import org.eclipse.wst.jsdt.js.common.util.WorkbenchResourceUtil;
/**
* @author "Ilya Buziuk (ibuziuk)"
*/
@SuppressWarnings("restriction")
public class BowerInitPage extends WizardPage {
private final IStructuredSelection selection;
private IContainer selectedContainer;
private Text dirText;
private Text nameText;
private Text versionText;
private Text licenseText;
private Button useDefaultCheckBox;
private Table authorsTable;
private Button addAuthorButton;
private Table ignoreTable;
private Button addIgnoreButton;
private String defaultName;
private String defaultVersion;
private String defaultLicense;
private List<String> defaultAuthors;
private List<String> defaultIgnore;
private String defaultDirectory;
public BowerInitPage(IStructuredSelection selection) {
super(Messages.BowerInitWizard_pageName);
setTitle(Messages.BowerInitWizard_pageTitle);
setDescription(Messages.BowerInitWizard_pageDescription);
this.selection = selection;
}
@Override
public void createControl(Composite parent) {
initializeDialogUnits(parent);
Composite mainComposite = SWTFactory.createComposite(parent, parent.getFont(), 1, 1, GridData.FILL_BOTH);
((GridLayout) mainComposite.getLayout()).verticalSpacing = 4;
createExecutionDirEditor(mainComposite);
createUseDefaultsEditor(mainComposite);
createBasePropertyEditor(mainComposite);
createAuthorsEditor(mainComposite);
createIgnoreEditor(mainComposite);
Dialog.applyDialogFont(mainComposite);
initiDefaultsValues();
setControl(mainComposite);
}
public String getExecutionDir() {
return dirText.getText();
}
public BowerJson getModel() {
String name = nameText.getText();
String version = versionText.getText();
String license = licenseText.getText();
List<String> authors = getItems(authorsTable);
List<String> ignore = getItems(ignoreTable);
Builder builder = new BowerJson.Builder();
if (name != null && !name.isEmpty()) {
builder.name(name);
}
if (version != null && !version.isEmpty()) {
builder.version(version);
}
if (license != null && !license.isEmpty()) {
builder.license(license);
}
if (authors != null && !authors.isEmpty()) {
builder.authrors(authors);
}
if (ignore != null && !ignore.isEmpty()) {
builder.ignore(ignore);
}
BowerJson model = builder.build();
return model;
}
private void initiDefaultsValues() {
this.selectedContainer = WorkbenchResourceUtil.getContainerFromSelection(this.selection);
String location = WorkbenchResourceUtil.getAbsolutePath(selectedContainer);
this.defaultDirectory = (location != null) ? location : ""; //$NON-NLS-1$
this.defaultName = (selectedContainer != null) ? selectedContainer.getProject().getName().replaceAll("\\s", "") : BowerConstants.DEFAULT_NAME; //$NON-NLS-1$ //$NON-NLS-2$
this.defaultVersion = BowerConstants.DEFAULT_VERSION;
this.defaultLicense = BowerConstants.DEFAULT_LICENSE;
this.defaultIgnore = Arrays.asList(BowerConstants.DEFAULT_IGNORE);
this.dirText.setText(defaultDirectory);
this.nameText.setText(defaultName);
this.versionText.setText(defaultVersion);
this.licenseText.setText(defaultLicense);
// Authors
setDefaults(authorsTable, defaultAuthors);
// Ignore
setDefaults(ignoreTable, defaultIgnore);
boolean useDefault = useDefaultCheckBox.getSelection();
this.nameText.setEnabled(!useDefault);
this.versionText.setEnabled(!useDefault);
this.licenseText.setEnabled(!useDefault);
this.authorsTable.setEnabled(!useDefault);
this.addAuthorButton.setEnabled(!useDefault);
this.ignoreTable.setEnabled(!useDefault);
this.addIgnoreButton.setEnabled(!useDefault);
}
private void createExecutionDirEditor(Composite mainComposite) {
Label label = new Label(mainComposite, SWT.NONE);
label.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1));
label.setText(Messages.BowerLaunchConfigurationTab_baseDirectory);
this.dirText = new Text(mainComposite, SWT.BORDER);
this.dirText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 5, 1));
this.dirText.addModifyListener(new EntriesChangedListener());
final Composite buttonComposite = new Composite(mainComposite, SWT.NONE);
buttonComposite.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 5, 1));
final GridLayout buttonGridLayout = new GridLayout();
buttonGridLayout.marginWidth = 0;
buttonGridLayout.marginHeight = 0;
buttonGridLayout.numColumns = 1;
buttonComposite.setLayout(buttonGridLayout);
final Button browseWorkspaceButton = new Button(buttonComposite, SWT.NONE);
browseWorkspaceButton.setText(Messages.BowerLaunchConfigurationTab_browseWorkspace);
browseWorkspaceButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
ContainerSelectionDialog dialog = new ContainerSelectionDialog(getShell(),
ResourcesPlugin.getWorkspace().getRoot(), false, Messages.BowerLaunchConfigurationTab_rootFolderSelection);
dialog.showClosedProjects(false);
int buttonId = dialog.open();
if (buttonId == IDialogConstants.OK_ID) {
Object[] resource = dialog.getResult();
if (resource != null && resource.length > 0) {
IPath path = ((IPath) resource[0]);
IResource selectedResource = ResourcesPlugin.getWorkspace().getRoot().findMember(path);
String location = WorkbenchResourceUtil.getAbsolutePath(selectedResource);
if (selectedResource.exists()) {
dirText.setText(location);
}
}
}
}
});
}
private void createUseDefaultsEditor(Composite mainComposite) {
Composite group = SWTFactory.createComposite(mainComposite, 2, 1, GridData.FILL_HORIZONTAL);
useDefaultCheckBox = SWTFactory.createCheckButton(group, Messages.BowerLaunchConfigurationTab_useDefaulConfiguration, null, true, 2);
useDefaultCheckBox.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
boolean useDefault = ((Button) e.widget).getSelection();
nameText.setEnabled(!useDefault);
versionText.setEnabled(!useDefault);
licenseText.setEnabled(!useDefault);
authorsTable.setEnabled(!useDefault);
addAuthorButton.setEnabled(!useDefault);
ignoreTable.setEnabled(!useDefault);
addIgnoreButton.setEnabled(!useDefault);
if (useDefault) {
setDefaults();
} else {
nameText.setEnabled(true);
versionText.setEnabled(true);
licenseText.setEnabled(true);
authorsTable.setEnabled(true);
addAuthorButton.setEnabled(true);
ignoreTable.setEnabled(true);
addIgnoreButton.setEnabled(true);
}
}
});
}
private void createBasePropertyEditor(Composite mainComposite) {
Group group = SWTFactory.createGroup(mainComposite, Messages.BowerLaunchConfigurationTab_Properties, 2, 1, GridData.FILL_HORIZONTAL);
Label nameLabel = new Label(group, SWT.NONE);
nameLabel.setText(Messages.BowerLaunchConfigurationTab_Name);
nameText = new Text(group, SWT.BORDER);
nameText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
nameText.addModifyListener(new EntriesChangedListener());
Label versionLabel = new Label(group, SWT.NONE);
versionLabel.setText(Messages.BowerLaunchConfigurationTab_Version);
versionText = new Text(group, SWT.BORDER);
versionText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
versionText.addModifyListener(new EntriesChangedListener());
Label licenseLabel = new Label(group, SWT.NONE);
licenseLabel.setText(Messages.BowerLaunchConfigurationTab_License);
licenseText = new Text(group, SWT.BORDER);
licenseText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
licenseText.addModifyListener(new EntriesChangedListener());
}
private void createAuthorsEditor(Composite mainComposite) {
TableGroupComposite authorsComposite = new TableGroupComposite(Messages.BowerLaunchConfigurationTab_Authors,
Messages.BowerLaunchConfigurationTab_Author, mainComposite, Messages.BowerInitWizard_addAuthor, Messages.BowerInitWizard_editAuthor);
authorsComposite.createControls();
this.authorsTable = authorsComposite.getTable();
this.addAuthorButton = authorsComposite.getAddButton();
}
private void createIgnoreEditor(Composite mainComposite) {
TableGroupComposite ignoreComposite = new TableGroupComposite(Messages.BowerLaunchConfigurationTab_Ignore,
Messages.BowerLaunchConfigurationTab_Ignore, mainComposite, Messages.BowerInitWizard_addIgnore, Messages.BowerInitWizard_editIgnore);
ignoreComposite.createControls();
this.ignoreTable = ignoreComposite.getTable();
this.addIgnoreButton = ignoreComposite.getAddButton();
}
@Override
public String getName() {
return Messages.BowerLaunchConfigurationTab_launchMainTabName;
}
private List<String> getItems(Table table) {
List<String> authors = new ArrayList<>();
TableItem[] items = table.getItems();
if (items != null && items.length > 0) {
for (TableItem item : items) {
authors.add(item.getText());
}
}
return authors;
}
private void setDefaults(Table table, List<String> defaultItems) {
if (table != null && defaultItems != null && !defaultItems.isEmpty()) {
table.removeAll();
for (String item : defaultItems) {
new TableItem(table, SWT.NONE).setText(item);
}
}
}
private void setDefaults() {
nameText.setText(defaultName);
versionText.setText(defaultVersion);
licenseText.setText(defaultLicense);
setDefaults(authorsTable, defaultAuthors);
setDefaults(ignoreTable, defaultIgnore);
}
private class EntriesChangedListener implements ModifyListener, SelectionListener {
public void modifyText(ModifyEvent e) {
entriesChanged();
}
public void widgetDefaultSelected(SelectionEvent e) {
entriesChanged();
}
public void widgetSelected(SelectionEvent e) {
entriesChanged();
}
}
private class TableGroupComposite {
private String groupLabel;
private String propertyLabel;
private Composite parent;
private Table table;
private Button addButton;
private Button editButton;
private Button removeButton;
private String addDialogTitle;
private String editDialogTitle;
public TableGroupComposite(String groupLabel, String propertyLabel, Composite parent, String addDialogTitle, String editDialogTitle) {
this.groupLabel = groupLabel;
this.propertyLabel = propertyLabel;
this.parent = parent;
this.addDialogTitle = addDialogTitle;
this.editDialogTitle = editDialogTitle;
}
public Table getTable() {
return this.table;
}
public Button getAddButton() {
return this.addButton;
}
public void createControls() {
Composite tableGroup = SWTFactory.createGroup(parent, groupLabel, 2, 1, GridData.FILL_HORIZONTAL);
TableViewer tableViewer = new TableViewer(tableGroup, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI);
tableViewer.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
TableItem[] selection = table.getSelection();
if(selection.length == 1) {
editProperty(editDialogTitle, selection[0].getText(0), selection[0].getText(1));
}
}
});
tableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
TableItem[] items = table.getSelection();
if(items == null || items.length == 0) {
editButton.setEnabled(false);
removeButton.setEnabled(false);
} else if(items.length == 1) {
editButton.setEnabled(true);
removeButton.setEnabled(true);
} else {
editButton.setEnabled(false);
removeButton.setEnabled(true);
}
}
});
table = tableViewer.getTable();
GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
data.heightHint = 50;
table.setLayoutData(data);
table.setLinesVisible(true);
table.setHeaderVisible(true);
final TableColumn propColumn = new TableColumn(this.table, SWT.NONE, 0);
propColumn.setWidth(300);
Composite buttonComposite = new Composite(tableGroup, SWT.NONE);
FillLayout fillLayout = new FillLayout(SWT.VERTICAL);
fillLayout.spacing = 2;
buttonComposite.setLayout(fillLayout);
addButton = new Button(buttonComposite, SWT.NONE);
addButton.setText(Messages.BowerLaunchConfigurationTab_buttonAdd);
addButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
addProperty(addDialogTitle);
}
});
editButton = new Button(buttonComposite, SWT.NONE);
editButton.setText(Messages.BowerLaunchConfigurationTab_buttonEdit);
editButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
if(table.getSelectionCount() > 0) {
TableItem[] selection = table.getSelection();
if(selection.length == 1) {
editProperty(editDialogTitle, selection[0].getText(0), selection[0].getText(1));
}
}
}
});
editButton.setEnabled(false);
removeButton = new Button(buttonComposite, SWT.NONE);
removeButton.setText(Messages.BowerLaunchConfigurationTab_buttonRemove);
removeButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
if(table.getSelectionCount() > 0) {
table.remove(table.getSelectionIndices());
}
}
});
removeButton.setEnabled(false);
}
private void addProperty(String title) {
PopUpPropertyDialog dialog = new PopUpPropertyDialog(getShell(), title, propertyLabel, "", null); //$NON-NLS-1$
if (dialog.open() == IDialogConstants.OK_ID) {
TableItem item = new TableItem(table, SWT.NONE);
item.setText(0, dialog.getName());
}
}
private void editProperty(String title, String name, String value) {
PopUpPropertyDialog dialog = new PopUpPropertyDialog(getShell(), title, propertyLabel, name, null);
if (dialog.open() == IDialogConstants.OK_ID) {
TableItem[] item = table.getSelection();
item[0].setText(0, dialog.getName());
}
}
}
private void entriesChanged() {
String dir = dirText.getText();
if (dir == null || dir.isEmpty()) {
setPageComplete(false);
setErrorMessage(Messages.BowerInitWizard_errorDirNotDefiened);
} else {
IContainer container = ResourcesPlugin.getWorkspace().getRoot().getContainerForLocation(new Path(dir));
if (container != null && container.exists()) {
IFile bowerJson = container.getFile(new Path(BowerConstants.BOWER_JSON));
if (bowerJson.exists()) {
setError(Messages.BowerInitWizard_errorBowerJsonAlreadyExist);
} else {
setComplete();
}
} else {
setError(Messages.BowerInitWizard_errorDirNotExist);
}
}
}
private void setError(String message) {
setPageComplete(false);
setErrorMessage(message);
}
private void setComplete() {
setPageComplete(true);
setErrorMessage(null);
}
}