package org.zend.php.zendserver.deployment.ui.editors;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.layout.PixelConverter;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.DecoratingLabelProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Point;
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.Display;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
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.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;
import org.eclipse.ui.forms.widgets.TableWrapData;
import org.zend.php.zendserver.deployment.core.descriptor.ChangeEvent;
import org.zend.php.zendserver.deployment.core.descriptor.DeploymentDescriptorFactory;
import org.zend.php.zendserver.deployment.core.descriptor.IDescriptorChangeListener;
import org.zend.php.zendserver.deployment.core.internal.descriptor.Feature;
import org.zend.php.zendserver.deployment.ui.Messages;
import org.zend.php.zendserver.deployment.ui.wizards.NewDependencyWizard;
public class DescriptorMasterDetailsBlock extends MasterDetailsBlock {
private class MasterContentProvider implements ITreeContentProvider {
public void dispose() {
// empty
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
// empty
}
public Object[] getElements(Object input) {
return provider.doGetElements(input);
}
public Object[] getChildren(Object parentElement) {
return provider.doGetElements(parentElement);
}
public Object getParent(Object element) {
return provider.doGetParent(element);
}
public boolean hasChildren(Object element) {
Object[] obj = getChildren(element);
return obj != null && obj.length > 0;
}
}
protected DeploymentDescriptorEditor editor;
protected TreeViewer viewer;
protected String title;
protected String description;
protected MasterDetailsProvider provider;
protected Button removeButton;
public DescriptorMasterDetailsBlock(DeploymentDescriptorEditor editor,
MasterDetailsProvider prov, String title, String description) {
this.editor = editor;
this.provider = prov;
this.title = title;
this.description = description;
}
@Override
protected void createMasterPart(final IManagedForm managedForm,
Composite parent) {
FormToolkit toolkit = managedForm.getToolkit();
final Section section = toolkit.createSection(parent, Section.DESCRIPTION
| Section.TITLE_BAR | Section.TWISTIE | Section.EXPANDED);
section.setText(title);
section.setDescription(provider.getDescription());
final SectionPart spart = new SectionPart(section);
managedForm.addPart(spart);
TableWrapData tdd = new TableWrapData(TableWrapData.FILL_GRAB,
TableWrapData.FILL_GRAB);
section.setLayoutData(tdd);
Composite client = toolkit.createComposite(section, SWT.NONE);
section.setClient(client);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
layout.marginWidth = 2;
layout.marginHeight = 2;
client.setLayout(layout);
client.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
Tree tree = toolkit.createTree(client, SWT.H_SCROLL | SWT.V_SCROLL);
GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
gd.widthHint = 200;
gd.heightHint = 400;
tree.setLayoutData(gd);
Composite buttons = toolkit.createComposite(client, SWT.NONE);
layout = new GridLayout(1, false);
buttons.setLayout(layout);
gd = new GridData(SWT.BEGINNING, SWT.TOP, false, false);
buttons.setLayoutData(gd);
addButtons(toolkit, buttons);
viewer = new TreeViewer(tree);
viewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
managedForm.fireSelectionChanged(spart, event.getSelection());
managedForm.getForm().reflow(true);
updateButtonsEnabledState();
}
});
viewer.setContentProvider(new MasterContentProvider());
DecoratingLabelProvider labelProvider = new DecoratingLabelProvider(
new DeploymentDescriptorLabelProvider(),
new DeploymentDescriptorLabelDecorator(editor));
viewer.setLabelProvider(labelProvider);
viewer.setInput(editor.getModel());
editor.getModel().addListener(new IDescriptorChangeListener() {
public void descriptorChanged(final ChangeEvent event) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
if (!section.isDisposed()) {
section.setDescription(provider.getDescription());
refreshViewer(event.target);
}
}
});
}
});
toolkit.paintBordersFor(client);
}
protected void addButtons(FormToolkit toolkit, Composite buttons) {
Button addButton = createButton(toolkit, buttons,
Messages.DescriptorMasterDetailsBlock_Add);
addButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e) {
final Object result = provider.addElment(editor.getModel(),
DescriptorMasterDetailsBlock.this);
if (result == null) {
return;
}
NewDependencyWizard wizard = new NewDependencyWizard(result);
WizardDialog dialog = new WizardDialog(e.display
.getActiveShell(), wizard);
dialog.create();
setDialogSize(dialog, 420, 300);
dialog.open();
if (dialog.getReturnCode() == Window.CANCEL) {
return;
}
Feature feature = DeploymentDescriptorFactory
.getFeature(result);
editor.getModel().add(feature, result);
Object[] expanded = viewer.getExpandedElements();
viewer.refresh();
viewer.setExpandedElements(expanded);
viewer.setSelection(new StructuredSelection(result));
}
});
removeButton = createButton(toolkit, buttons,
Messages.DescriptorMasterDetailsBlock_Remove);
removeButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
removeElement(viewer.getSelection());
final TreeItem[] expandedElements = viewer.getTree().getItems();
if (expandedElements != null && expandedElements.length > 0) {
viewer.getTree().setSelection(expandedElements[0]);
}
}
});
}
protected Button createButton(FormToolkit toolkit, Composite buttons,
String message) {
Button button = toolkit.createButton(buttons, message, SWT.NONE);
GridData gd = new GridData(
SWT.FILL | GridData.VERTICAL_ALIGN_BEGINNING, SWT.TOP, true,
false);
button.setLayoutData(gd);
// Set the default button size
button.setFont(JFaceResources.getDialogFont());
PixelConverter converter = new PixelConverter(button);
int widthHint = converter
.convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
gd.widthHint = Math.max(widthHint,
button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x);
return button;
}
private void updateButtonsEnabledState() {
boolean isEmpty = viewer.getSelection().isEmpty();
removeButton.setEnabled(!isEmpty);
}
protected void refreshViewer(final Object target) {
viewer.getControl().getDisplay().asyncExec(new Runnable() {
public void run() {
viewer.refresh(target);
}
});
}
protected void removeElement(ISelection selection) {
IStructuredSelection sel = (IStructuredSelection) selection;
Object elem = sel.getFirstElement();
if (elem == null) {
return;
}
Feature feature = DeploymentDescriptorFactory.getFeature(elem);
editor.getModel().getChildren(feature).remove(elem);
viewer.refresh();
}
@Override
protected void registerPages(DetailsPart detailsPart) {
detailsPart.setPageProvider(new DetailsPageProvider(editor, provider
.getType()));
}
@Override
protected void createToolBarActions(IManagedForm managedForm) {
// TODO Auto-generated method stub
}
public void refresh() {
viewer.refresh();
detailsPart.refresh();
updateButtonsEnabledState();
showMarkers();
}
public static void setDialogSize(Dialog dialog, int width, int height) {
Point computedSize = dialog.getShell().computeSize(SWT.DEFAULT,
SWT.DEFAULT);
width = Math.max(computedSize.x, width);
height = Math.max(computedSize.y, height);
dialog.getShell().setSize(width, height);
}
public void showMarkers() {
viewer.refresh();
DescriptorDetailsPage page = ((DescriptorDetailsPage)detailsPart.getCurrentPage());
if (page != null) {
page.showMarkers();
}
}
@Override
protected void applyLayout(Composite parent) {
parent.setLayout(FormLayoutFactory.createFormGridLayout(true, 1));
}
}