package com.dubture.composer.ui.editor.composer;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;
import com.dubture.composer.ui.controller.DependencyController;
import com.dubture.composer.ui.dialogs.DependencyDialog;
import com.dubture.composer.ui.editor.ComposerFormPage;
import com.dubture.composer.ui.editor.FormLayoutFactory;
import com.dubture.composer.ui.editor.TableSection;
import com.dubture.composer.ui.job.UpdateDevJob;
import com.dubture.composer.ui.parts.TablePart;
import com.dubture.getcomposer.core.VersionedPackage;
import com.dubture.getcomposer.core.collection.Dependencies;
public class DependencySection extends TableSection implements PropertyChangeListener {
private Dependencies dependencies;
private TableViewer dependencyViewer;
private IAction editAction;
private IAction removeAction;
private IAction updateAction;
private UpdateDevJob updateJob;
private static final int EDIT_INDEX = 0;
private static final int REMOVE_INDEX = 1;
private static final int UPDATE_INDEX = 2;
public DependencySection(ComposerFormPage page, Composite parent, Dependencies dependencies, String title, String description, boolean expanded) {
super(page, parent, Section.EXPANDED | Section.DESCRIPTION | Section.TWISTIE | Section.TITLE_BAR, new String[]{"Edit...", "Remove", "Update"});
this.dependencies = dependencies;
createClient(getSection(), page.getManagedForm().getToolkit(), title, description, expanded);
updateJob = new UpdateDevJob(page.getComposerEditor().getProject());
updateJob.setUser(true);
}
protected void createClient(final Section section, FormToolkit toolkit, String title, String description, boolean expanded) {
section.setText(title);
section.setDescription(description);
section.setExpanded(expanded);
section.setLayout(FormLayoutFactory.createClearGridLayout(false, 1));
GridData gd = new GridData(GridData.FILL_BOTH);
gd.grabExcessVerticalSpace = expanded;
section.setLayoutData(gd);
Composite container = createClientContainer(section, 2, toolkit);
createViewerPartControl(container, SWT.MULTI, 2, toolkit);
TablePart tablePart = getTablePart();
DependencyController dependencyController = new DependencyController();
dependencyViewer = tablePart.getTableViewer();
dependencyViewer.setContentProvider(dependencyController);
dependencyViewer.setLabelProvider(dependencyController);
toolkit.paintBordersFor(container);
section.setClient(container);
dependencyViewer.setInput(dependencies);
dependencies.addPropertyChangeListener(this);
updateButtons();
makeActions();
updateMenu();
}
public void setExpanded(boolean expanded) {
getSection().setExpanded(expanded);
if (expanded) {
((GridData)getSection().getLayoutData()).widthHint = 0;
} else {
((GridData)getSection().getLayoutData()).widthHint = SWT.DEFAULT;
}
}
protected boolean createCount() {
return true;
}
private void updateButtons() {
ISelection selection = dependencyViewer.getSelection();
TablePart tablePart = getTablePart();
tablePart.setButtonEnabled(EDIT_INDEX, !selection.isEmpty() && enabled);
tablePart.setButtonEnabled(REMOVE_INDEX, !selection.isEmpty() && enabled);
tablePart.setButtonEnabled(UPDATE_INDEX, !selection.isEmpty() && enabled);
}
private void updateMenu() {
IStructuredSelection selection = (IStructuredSelection)dependencyViewer.getSelection();
editAction.setEnabled(selection.size() > 0);
removeAction.setEnabled(selection.size() > 0);
updateAction.setEnabled(selection.size() > 0);
}
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
updateButtons();
refresh();
dependencyViewer.getTable().setEnabled(enabled);
}
public void refresh() {
dependencyViewer.refresh();
super.refresh();
}
@Override
public void propertyChange(PropertyChangeEvent e) {
refresh();
}
protected void selectionChanged(IStructuredSelection sel) {
updateButtons();
updateMenu();
}
private void makeActions() {
editAction = new Action("Edit...") {
@Override
public void run() {
handleEdit();
}
};
removeAction = new Action("Remove") {
@Override
public void run() {
handleRemove();
}
};
updateAction = new Action("Update Selected") {
@Override
public void run() {
handleUpdate();
}
};
}
@Override
protected void fillContextMenu(IMenuManager manager) {
manager.add(editAction);
manager.add(removeAction);
manager.add(updateAction);
}
private void handleEdit() {
VersionedPackage dep = (VersionedPackage)((StructuredSelection)dependencyViewer.getSelection()).getFirstElement();
DependencyDialog diag = new DependencyDialog(dependencyViewer.getTable().getShell(), dep.clone());
if (diag.open() == Dialog.OK) {
dep.setVersion(diag.getDependency().getVersion());
// refresh();
}
}
@SuppressWarnings("unchecked")
private void handleRemove() {
StructuredSelection selection = ((StructuredSelection)dependencyViewer.getSelection());
Iterator<Object> it = selection.iterator();
String[] names = new String[selection.size()];
List<VersionedPackage> deps = new ArrayList<VersionedPackage>();
for (int i = 0; it.hasNext(); i++) {
VersionedPackage dep = (VersionedPackage)it.next();
deps.add(dep);
names[i] = dep.getName();
}
MessageDialog diag = new MessageDialog(
dependencyViewer.getTable().getShell(),
"Remove Dependenc" + (selection.size() > 1 ? "ies" : "y"),
null,
"Do you really wan't to remove " + StringUtils.join(names, ", ") + "?",
MessageDialog.WARNING,
new String[] {"Yes", "No"},
0);
if (diag.open() == Dialog.OK) {
for (VersionedPackage dep : deps) {
dependencies.remove(dep);
}
}
}
@SuppressWarnings("unchecked")
private void handleUpdate() {
StructuredSelection selection = ((StructuredSelection)dependencyViewer.getSelection());
Iterator<Object> it = selection.iterator();
String[] names = new String[selection.size()];
List<VersionedPackage> deps = new ArrayList<VersionedPackage>();
for (int i = 0; it.hasNext(); i++) {
VersionedPackage dep = (VersionedPackage)it.next();
deps.add(dep);
names[i] = dep.getName();
}
updateJob.setPackages(names);
updateJob.schedule();
}
@Override
protected void buttonSelected(int index) {
switch (index) {
case EDIT_INDEX:
handleEdit();
break;
case REMOVE_INDEX:
handleRemove();
break;
case UPDATE_INDEX:
handleUpdate();
break;
}
}
protected void createClient(Section section, FormToolkit toolkit) {
}
}