/**
* Copyright (c) 2013-2016 Angelo ZERR.
* 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
*
* Contributors:
* Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation
*/
package tern.eclipse.ide.internal.ui.dialogs;
import java.io.File;
import java.util.Collection;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.osgi.util.NLS;
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.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.Control;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import tern.eclipse.ide.core.IIDETernRepository;
import tern.eclipse.ide.core.ITernRepositoryManager;
import tern.eclipse.ide.core.TernCorePlugin;
import tern.eclipse.ide.internal.ui.TernUIMessages;
import tern.repository.ITernRepository;
import tern.utils.StringUtils;
/**
* Dialog to create or modify a tern repository.
*
*/
public class EditRepositoryDialog extends TitleAreaDialog {
private Text nameText;
private Text ternBaseDirText;
private final Collection<IIDETernRepository> repositories;
private IIDETernRepository repository;
public EditRepositoryDialog(Shell parentShell,
Collection<IIDETernRepository> repositories) {
this(parentShell, repositories, null);
}
public EditRepositoryDialog(Shell parentShell,
Collection<IIDETernRepository> repositories, IIDETernRepository repository) {
super(parentShell);
this.repository = repository;
this.repositories = repositories;
}
@Override
protected Control createContents(Composite parent) {
Control contents = super.createContents(parent);
super.setTitle(TernUIMessages.EditRepositoryDialog_title);
super.setMessage(TernUIMessages.EditRepositoryDialog_desc,
IMessageProvider.INFORMATION);
return contents;
}
@Override
protected Control createDialogArea(Composite parent) {
Composite area = (Composite) super.createDialogArea(parent);
Composite container = new Composite(area, SWT.NONE);
container.setLayoutData(new GridData(GridData.FILL_BOTH));
GridLayout layout = new GridLayout(3, false);
container.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
container.setLayout(layout);
createRepositoryName(container);
createTernBaseDir(container);
validate();
return area;
}
/**
* Create the repository name text field.
*
* @param parent
*/
private void createRepositoryName(Composite parent) {
Label repositorylabel = new Label(parent, SWT.NONE);
repositorylabel.setText(TernUIMessages.EditRepositoryDialog_name_label);
GridData dataRepository = new GridData();
dataRepository.grabExcessHorizontalSpace = true;
dataRepository.horizontalAlignment = GridData.FILL;
dataRepository.horizontalSpan = 2;
nameText = new Text(parent, SWT.BORDER);
nameText.setLayoutData(dataRepository);
if (repository != null) {
nameText.setEnabled(false);
nameText.setText(repository.getName());
}
nameText.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent event) {
validate();
}
});
}
/**
* Create the repository tern base dir text field.
*
* @param parent
*/
private void createTernBaseDir(final Composite parent) {
Label fileLabel = new Label(parent, SWT.NONE);
fileLabel
.setText(TernUIMessages.EditRepositoryDialog_ternBaseDir_label);
GridData dataFile = new GridData();
dataFile.grabExcessHorizontalSpace = true;
dataFile.horizontalAlignment = GridData.FILL;
ternBaseDirText = new Text(parent, SWT.BORDER);
ternBaseDirText.setLayoutData(dataFile);
if (repository != null) {
ternBaseDirText.setText(repository.getTernBaseDirAsString());
}
ternBaseDirText.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent event) {
validate();
}
});
Button browseButton = new Button(parent, SWT.NONE);
browseButton.setText(TernUIMessages.Button_browse);
final Shell shell = parent.getShell();
browseButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
DirectoryDialog dlg = new DirectoryDialog(shell);
dlg.setFilterPath(ternBaseDirText.getText());
dlg.setText(TernUIMessages.EditRepositoryDialog_directoryDialog_title);
dlg.setMessage(TernUIMessages.EditRepositoryDialog_directoryDialog_desc);
String dir = dlg.open();
if (dir != null) {
ternBaseDirText.setText(dir);
}
}
});
}
/**
* Validate repository name and tern base dir.
*/
private void validate() {
// Validate repository name
String error = validateName();
if (StringUtils.isEmpty(error)) {
// Validate tern base dir.
error = validateTernBaseDir();
}
setErrorMessage(error);
}
/**
* Validate repository name.
*
* @return the error message and null otherwise.
*/
private String validateName() {
// name is required
String name = nameText.getText();
if (StringUtils.isEmpty(name)) {
return TernUIMessages.EditRepositoryDialog_name_required;
}
// name must not contains ';' token.
if (name.contains(ITernRepositoryManager.REPOSITORY_SEPARATOR)) {
return NLS.bind(
TernUIMessages.EditRepositoryDialog_name_forbiddenToken,
ITernRepositoryManager.REPOSITORY_SEPARATOR);
}
// check if this name doesn't exists?
if (repository == null && isRepositoryNameAlreadyExists(name)) {
return NLS.bind(
TernUIMessages.EditRepositoryDialog_name_alreadyExists,
name);
}
return null;
}
private boolean isRepositoryNameAlreadyExists(String name) {
for (ITernRepository repository : repositories) {
if (repository.getName().equals(name)) {
return true;
}
}
return false;
}
/**
* Validate repository tern base dir.
*
* @return the error message and null otherwise.
*/
private String validateTernBaseDir() {
// tern base dir is required
String ternBaseDir = ternBaseDirText.getText();
if (StringUtils.isEmpty(ternBaseDir)) {
return TernUIMessages.EditRepositoryDialog_ternBaseDir_required;
}
File dir = new File(ternBaseDir);
if (!dir.exists()) {
return TernUIMessages.EditRepositoryDialog_ternBaseDir_doesntExists;
}
if (!dir.isDirectory()) {
return TernUIMessages.EditRepositoryDialog_ternBaseDir_notDir;
}
/*if (!(exists(dir, "defs") && exists(dir, "plugin"))) {
return TernUIMessages.EditRepositoryDialog_ternBaseDir_notValid;
}*/
return null;
}
private boolean exists(File dir, String name) {
return new File(dir, name).exists();
}
@Override
protected void okPressed() {
String name = nameText.getText();
String file = ternBaseDirText.getText();
if (repository == null) {
this.repository = TernCorePlugin.getTernRepositoryManager().createRepository(name, new File(file));
} else {
repository.setBaseDir(new File(file));
}
super.okPressed();
}
public IIDETernRepository getRepository() {
return repository;
}
}