/*
* 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.IModelListener;
import com.google.dart.tools.core.pub.PubPackageManager;
import com.google.dart.tools.core.pub.PubspecModel;
import com.google.dart.tools.ui.web.DartWebPlugin;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IInputValidator;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.PixelConverter;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.window.Window;
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.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.forms.DetailsPart;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.MasterDetailsBlock;
import org.eclipse.ui.forms.SectionPart;
import org.eclipse.ui.forms.editor.FormPage;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;
/**
* The Master block for the dependencies - lists all the dependencies
*/
public class DependenciesMasterBlock extends MasterDetailsBlock implements IModelListener {
class MasterContentProvider implements IStructuredContentProvider {
@Override
public void dispose() {
}
@Override
public Object[] getElements(Object inputElement) {
if (model != null && model.getDependecies() != null) {
return model.getDependecies();
}
return new Object[0];
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
}
class MasterLabelProvider extends LabelProvider implements ITableLabelProvider {
@Override
public Image getColumnImage(Object obj, int index) {
if (obj instanceof DependencyObject) {
return DartWebPlugin.getImage("pubspec.png");
}
return null;
}
@Override
public String getColumnText(Object obj, int index) {
return obj.toString();
}
}
private class AddPackageDialog extends InputDialog {
public AddPackageDialog(Shell parentShell, String dialogTitle, String dialogMessage,
String initialValue, IInputValidator validator) {
super(parentShell, dialogTitle, dialogMessage, initialValue, validator);
}
@Override
protected Control createDialogArea(Composite parent) {
Composite composite = (Composite) super.createDialogArea(parent);
Label label = new Label(composite, SWT.NONE);
label.setText("For example, unittest, polymer, ...");
label.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false));
Label imageLabel = new Label(composite, SWT.NONE);
imageLabel.setImage(DartWebPlugin.getImage("pub_package_ex.png"));
imageLabel.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false));
return composite;
}
@Override
protected void validateInput() {
if (getText().getText().isEmpty()) {
setErrorMessage("Enter name of package");
} else {
setErrorMessage(null);
}
}
}
private FormPage page;
private PubspecModel model;
private TableViewer viewer;
private SectionPart sectionPart;
private boolean editable;
public DependenciesMasterBlock(FormPage page, boolean editable) {
this.page = page;
model = ((PubspecEditor) page.getEditor()).getModel();
this.editable = editable;
}
@Override
public void createContent(IManagedForm managedForm, Composite parent) {
super.createContent(managedForm, parent);
sashForm.setWeights(new int[] {50, 50});
}
public TableViewer getViewer() {
return viewer;
}
@Override
public void modelChanged(Object[] objects, String type) {
viewer.refresh();
if (type.equals(IModelListener.ADDED)) {
viewer.setSelection(new StructuredSelection(objects[0]));
}
if (type.equals(IModelListener.REMOVED) && model.getDependecies().length > 0) {
viewer.setSelection(new StructuredSelection(model.getDependecies()[0]));
}
}
@Override
protected void applyLayout(final Composite parent) {
GridLayout layout = new GridLayout();
layout.marginLeft = 5;
layout.marginBottom = 5;
parent.setLayout(layout);
}
@Override
protected void createMasterPart(final IManagedForm managedForm, Composite parent) {
FormToolkit toolkit = managedForm.getToolkit();
Section section = toolkit.createSection(parent, Section.DESCRIPTION | Section.TITLE_BAR);
section.setText("Dependencies"); //$NON-NLS-1$
section.setDescription("Specify all the packages required by this package"); //$NON-NLS-1$
section.marginHeight = 5;
Composite client = toolkit.createComposite(section, SWT.WRAP);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
layout.marginWidth = 2;
layout.marginHeight = 2;
client.setLayout(layout);
Table t = toolkit.createTable(client, SWT.NULL);
GridData gd = new GridData(GridData.FILL_BOTH);
gd.heightHint = 20;
gd.widthHint = 100;
t.setLayoutData(gd);
toolkit.paintBordersFor(client);
Composite buttonGroup = toolkit.createComposite(client);
gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING);
buttonGroup.setLayoutData(gd);
buttonGroup.setLayout(new GridLayout());
Button addButton = toolkit.createButton(buttonGroup, "Add...", SWT.PUSH);
addButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
addButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
handleAddDependency();
}
});
PixelConverter converter = new PixelConverter(addButton);
int widthHint = converter.convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
GridDataFactory.swtDefaults().hint(widthHint, -1).applyTo(addButton);
Button b = toolkit.createButton(buttonGroup, "Remove", SWT.PUSH);
b.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
b.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
handleRemoveDependency();
}
});
GridDataFactory.swtDefaults().hint(widthHint, -1).applyTo(b);
section.setClient(client);
section.setEnabled(editable);
sectionPart = new SectionPart(section);
managedForm.addPart(sectionPart);
viewer = new TableViewer(t);
viewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
managedForm.fireSelectionChanged(sectionPart, event.getSelection());
}
});
viewer.setContentProvider(new MasterContentProvider());
viewer.setLabelProvider(new MasterLabelProvider());
viewer.setComparator(new ViewerComparator());
viewer.setInput(page.getEditor().getEditorInput());
model.addModelListener(this);
}
@Override
protected void createToolBarActions(IManagedForm managedForm) {
}
@Override
protected void registerPages(DetailsPart detailsPart) {
detailsPart.registerPage(DependencyObject.class, new DependencyDetailsPage(page));
}
private void handleAddDependency() {
String[] list = PubPackageManager.getInstance().getPackageListArray();
int result = Window.OK;
String name = null;
if (list.length > 0) {
PackageSelectionDialog inputDialog = new PackageSelectionDialog(
PlatformUI.getWorkbench().getDisplay().getActiveShell(),
list);
inputDialog.setTitle("Add dependency");
inputDialog.setMessage("Enter name of package:");
result = inputDialog.open();
if (result == Window.OK) {
name = (String) inputDialog.getFirstResult();
}
} else {
AddPackageDialog inputDialog = new AddPackageDialog(
page.getSite().getShell(),
"Add Dependency",
"Enter the name of package:",
"",
null);
result = inputDialog.open();
if (result == Window.OK) {
name = inputDialog.getValue();
}
}
if (name != null) {
model.add(new DependencyObject[] {new DependencyObject(name)}, IModelListener.ADDED);
sectionPart.markDirty();
}
}
private void handleRemoveDependency() {
ISelection selection = viewer.getSelection();
if (!selection.isEmpty() && selection instanceof StructuredSelection) {
DependencyObject o = (DependencyObject) ((StructuredSelection) selection).getFirstElement();
model.remove(new DependencyObject[] {o}, true);
sectionPart.markDirty();
}
}
}