/*
* Copyright (c) 2012, the Dart project authors.
*
* Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.eclipse.org/legal/epl-v10.html
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.dart.tools.ui.web.pubspec;
import com.google.dart.tools.core.pub.DependencyObject;
import com.google.dart.tools.core.pub.DependencyObject.Type;
import com.google.dart.tools.core.utilities.yaml.PubYamlUtils;
import com.google.dart.tools.ui.internal.util.ExternalBrowserUtil;
import com.google.dart.tools.ui.web.DartWebPlugin;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
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.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.Link;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.forms.AbstractFormPart;
import org.eclipse.ui.forms.IDetailsPage;
import org.eclipse.ui.forms.IFormPart;
import org.eclipse.ui.forms.editor.FormPage;
import org.eclipse.ui.forms.events.HyperlinkAdapter;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.widgets.FormText;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;
import org.eclipse.ui.forms.widgets.TableWrapData;
import org.eclipse.ui.forms.widgets.TableWrapLayout;
/**
* Details page for dependencies, shows all the details of the package
*/
public class DependencyDetailsPage extends AbstractFormPart implements IDetailsPage {
private static String EMPTY_STRING = "";
private static String[] sourceList = {"git", "hosted", "path"};
private static String VERSION_CONTSTRAINTS_KEY = "versionConstraints";
private DependencyObject input;
private Text nameText;
private Text versionText;
private Text pathText;
private Text gitrefText;
private Combo sourceCombo;
private Label pathLabel;
private Label gitrefLabel;
private boolean ignoreModify = false;
private Button devButton;
private FormPage page;
public DependencyDetailsPage(FormPage page) {
super();
this.page = page;
}
@Override
public void createContents(Composite parent) {
TableWrapLayout layout = new TableWrapLayout();
parent.setLayout(layout);
FormToolkit toolkit = getManagedForm().getToolkit();
Section section = toolkit.createSection(parent, Section.TITLE_BAR);
section.setText("Dependency Details");
TableWrapData td = new TableWrapData(TableWrapData.FILL, TableWrapData.TOP);
td.grabHorizontal = true;
section.setLayoutData(td);
Composite client = toolkit.createComposite(section);
GridLayoutFactory.swtDefaults().spacing(5, 5).numColumns(3).margins(0, 0).applyTo(client);
GridData gd;
toolkit.createLabel(client, "Name:");
nameText = toolkit.createText(client, "", SWT.SINGLE | SWT.BORDER); //$NON-NLS-1$
gd = new GridData(SWT.FILL, SWT.TOP, true, false, 2, 1);
nameText.setLayoutData(gd);
nameText.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
if (input != null) {
input.setName(nameText.getText());
setTextDirty();
}
}
});
toolkit.createLabel(client, "Version: ");
versionText = toolkit.createText(client, "", SWT.SINGLE | SWT.BORDER); //$NON-NLS-1$
gd = new GridData(SWT.FILL, SWT.TOP, true, false, 2, 1);
versionText.setLayoutData(gd);
versionText.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
if (input != null) {
if (validateVersionConstriants(versionText.getText().trim())) {
input.setVersion(versionText.getText().trim());
}
setTextDirty();
}
}
});
toolkit.createLabel(client, "");
Label examplesLabel = toolkit.createLabel(client, "e.g. any, 1.0.0 ...");
examplesLabel.setFont(DartWebPlugin.getPlugin().getItalicFont(examplesLabel.getFont()));
StringBuffer buf = new StringBuffer();
buf.append("<form>");
buf.append("<p>");
buf.append("<a href=\"http://pub.dartlang.org/doc/pubspec.html#version\">what are version constraints?</a>");
buf.append("</p>");
buf.append("</form>");
FormText info = toolkit.createFormText(client, true);
gd = new GridData(SWT.RIGHT, SWT.TOP, false, false, 1, 1);
info.setLayoutData(gd);
info.setText(buf.toString(), true, true);
info.addHyperlinkListener(new HyperlinkAdapter() {
@Override
public void linkActivated(HyperlinkEvent e) {
ExternalBrowserUtil.openInExternalBrowser((String) e.getHref());
}
});
toolkit.createLabel(client, "Source:");
sourceCombo = new Combo(client, SWT.READ_ONLY | SWT.BORDER);
toolkit.adapt(sourceCombo, true, false);
sourceCombo.setItems(sourceList);
sourceCombo.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
int index = sourceCombo.getSelectionIndex();
switch (index) {
case 0:
updateModelandSourceFields(Type.GIT);
break;
case 1:
updateModelandSourceFields(Type.HOSTED);
break;
case 2:
updateModelandSourceFields(Type.PATH);
}
setTextDirty();
}
});
devButton = toolkit.createButton(client, "dev dependency", SWT.CHECK);
devButton.setToolTipText("dependency is used for tests, examples etc.");
gd = new GridData(SWT.FILL, SWT.TOP, true, false, 2, 1);
devButton.setLayoutData(gd);
devButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
input.setForDevelopment(devButton.getSelection());
setTextDirty();
}
});
buf = new StringBuffer();
buf.append("<form>");
buf.append("<p>");
buf.append("<a href=\"http://pub.dartlang.org/doc/dependencies.html#dev-dependencies\">what is dev dependency?</a>");
buf.append("</p>");
buf.append("</form>");
info = toolkit.createFormText(client, true);
gd = new GridData(SWT.RIGHT, SWT.TOP, false, false, 1, 1);
info.setLayoutData(gd);
info.setText(buf.toString(), true, true);
info.addHyperlinkListener(new HyperlinkAdapter() {
@Override
public void linkActivated(HyperlinkEvent e) {
ExternalBrowserUtil.openInExternalBrowser((String) e.getHref());
}
});
pathLabel = toolkit.createLabel(client, "Path:");
pathText = toolkit.createText(client, "", SWT.SINGLE | SWT.BORDER); //$NON-NLS-1$
pathText.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 2, 1));
pathText.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
if (input != null) {
input.setPath(pathText.getText());
setTextDirty();
}
}
});
gitrefLabel = toolkit.createLabel(client, "Git ref:");
gitrefText = toolkit.createText(client, "", SWT.SINGLE | SWT.BORDER);
gitrefText.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 2, 1));
gitrefText.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
if (input != null) {
input.setGitRef(gitrefText.getText());
setTextDirty();
}
}
});
Link infoLink = new Link(client, SWT.WRAP);
infoLink.setText("Packages with advanced requirements e.g. transformers, currently \n"
+ "require manual editing. <a href=\"" + "source" + "\">Switch to yaml editing mode</a>");
gd = new GridData(SWT.LEFT, SWT.BOTTOM, true, false, 3, 1);
infoLink.setLayoutData(gd);
infoLink.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
((PubspecEditor) page.getEditor()).setActivePage(1);
}
});
toolkit.paintBordersFor(section);
section.setClient(client);
section.setEnabled(((PubspecEditor) page.getEditor()).isEditable());
}
@Override
public void refresh() {
super.refresh();
update();
}
@Override
public void selectionChanged(IFormPart part, ISelection selection) {
IStructuredSelection ssel = (IStructuredSelection) selection;
if (ssel.size() == 1) {
input = (DependencyObject) ssel.getFirstElement();
} else {
input = null;
}
ignoreModify = true;
update();
ignoreModify = false;
}
@Override
public void setFocus() {
nameText.setFocus();
}
private void setTextDirty() {
if (!ignoreModify) {
if (input.getModel() != null) {
input.getModel().setDirty(true);
}
markDirty();
}
}
private void update() {
if (input != null) {
nameText.setText(input.getName() != null ? input.getName() : EMPTY_STRING);
versionText.setText(input.getVersion() != null ? input.getVersion() : EMPTY_STRING);
devButton.setSelection(input.isForDevelopment());
if (input.getType().equals(Type.GIT)) {
sourceCombo.select(0);
updateModelandSourceFields(Type.GIT);
pathText.setText(input.getPath() != null ? input.getPath() : EMPTY_STRING);
gitrefText.setText(input.getGitRef() != null ? input.getGitRef() : EMPTY_STRING);
} else if (input.getType().equals(Type.PATH)) {
sourceCombo.select(2);
updateModelandSourceFields(Type.PATH);
pathText.setText(input.getPath() != null ? input.getPath() : EMPTY_STRING);
} else {
sourceCombo.select(1);
pathText.setText(EMPTY_STRING);
gitrefText.setText(EMPTY_STRING);
updateModelandSourceFields(Type.HOSTED);
}
}
}
private void updateModelandSourceFields(Type type) {
if (input != null) {
input.setType(type);
}
boolean pathFields = false;
boolean gitRefFields = false;
if (type.equals(Type.HOSTED)) {
pathText.setText(EMPTY_STRING);
gitrefText.setText(EMPTY_STRING);
input.setPath(EMPTY_STRING);
input.setGitRef(EMPTY_STRING);
}
if (type.equals(Type.GIT)) {
pathFields = gitRefFields = true;
} else if (type.equals(Type.PATH)) {
pathFields = true;
}
pathLabel.setVisible(pathFields);
pathText.setVisible(pathFields);
gitrefLabel.setVisible(gitRefFields);
gitrefText.setVisible(gitRefFields);
}
private boolean validateVersionConstriants(String version) {
boolean isValid = PubYamlUtils.isValidDependencyConstraintString(version);
if (isValid) {
getManagedForm().getMessageManager().removeMessage(VERSION_CONTSTRAINTS_KEY, versionText);
} else {
getManagedForm().getMessageManager().addMessage(
VERSION_CONTSTRAINTS_KEY,
"The version constriant does not have the correct format as in '1.0.0', '<1.5.0', \n'>=2.0.0 <3.0.0', '^1.2.3' or it contains invalid characters",
null,
IMessageProvider.ERROR,
versionText);
}
return isValid;
}
}