/* * 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; } }