/*******************************************************************************
* Copyright (c) 2000, 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.zend.php.zendserver.deployment.ui.editors;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.layout.PixelConverter;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.Table;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.SectionPart;
import org.eclipse.ui.forms.events.ExpansionAdapter;
import org.eclipse.ui.forms.events.ExpansionEvent;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;
import org.zend.php.zendserver.deployment.core.descriptor.ChangeEvent;
import org.zend.php.zendserver.deployment.core.descriptor.IDescriptorChangeListener;
import org.zend.php.zendserver.deployment.core.descriptor.IParameter;
import org.zend.php.zendserver.deployment.ui.Messages;
public abstract class ResourceListSection {
private class MasterContentProvider implements IStructuredContentProvider {
public void dispose() {
// empty
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
// empty
}
public Object[] getElements(Object input) {
return ResourceListSection.this.getElements(input);
}
}
private IManagedForm mForm;
private Button addButton;
private Button editButton;
private Button removeButton;
private DeploymentDescriptorEditor editor;
private TableViewer viewer;
private String title;
private String description;
/**
* @param id
* @param title
*/
public ResourceListSection(DeploymentDescriptorEditor editor,
IManagedForm mForm, String title, String description, Composite body) {
this.title = title;
this.description = description;
this.editor = editor;
this.mForm = mForm;
createSection(body);
createActions();
}
private void createSection(Composite body) {
FormToolkit toolkit = mForm.getToolkit();
Section section = createSection(title, description, body);
Composite client = (Composite) section.getClient();
final SectionPart spart = new SectionPart(section);
mForm.addPart(spart);
Table t = toolkit.createTable(client, SWT.NULL);
GridData gd = new GridData(GridData.FILL_BOTH);
gd.heightHint = 200;
gd.widthHint = 100;
t.setLayoutData(gd);
viewer = new TableViewer(t);
viewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
upadateEnablement();
mForm.fireSelectionChanged(spart, event.getSelection());
mForm.getForm().reflow(true);
}
});
viewer.setContentProvider(new MasterContentProvider());
viewer.setLabelProvider(new LabelProvider());
viewer.setInput(editor.getModel());
editor.getModel().addListener(new IDescriptorChangeListener() {
public void descriptorChanged(ChangeEvent event) {
if (event.target instanceof IParameter) {
refreshViewer((IParameter) event.target);
}
}
});
Composite buttons = toolkit.createComposite(client, SWT.WRAP);
GridLayout layout = new GridLayout(1, false);
buttons.setLayout(layout);
gd = new GridData(SWT.DEFAULT, SWT.TOP, false, false);
buttons.setLayoutData(gd);
addButton = createButton(toolkit, buttons,
Messages.ResourceListSection_Add);
editButton = createButton(toolkit, buttons,
Messages.ResourceListSection_Edit);
removeButton = createButton(toolkit, buttons,
Messages.ResourceListSection_Remove);
upadateEnablement();
toolkit.paintBordersFor(client);
}
protected void upadateEnablement() {
boolean enabled = !viewer.getSelection().isEmpty();
editButton.setEnabled(enabled);
removeButton.setEnabled(enabled);
}
private 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;
}
protected void refreshViewer(final IParameter target) {
viewer.getControl().getDisplay().asyncExec(new Runnable() {
public void run() {
viewer.refresh(target);
}
});
}
private Section createSection(String title, String description, Composite body) {
FormToolkit toolkit = mForm.getToolkit();
Section section = toolkit.createSection(body,
Section.TITLE_BAR | Section.DESCRIPTION | Section.TWISTIE);
Composite client = toolkit.createComposite(section, SWT.WRAP);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
client.setLayout(layout);
toolkit.paintBordersFor(client);
section.setClient(client);
section.addExpansionListener(new ExpansionAdapter() {
public void expansionStateChanged(ExpansionEvent e) {
mForm.getForm().reflow(false);
}
});
section.setText(title);
section.setDescription(description);
return section;
}
private void createActions() {
addButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
addPath();
viewer.refresh();
}
});
editButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
IStructuredSelection sel = (IStructuredSelection) viewer
.getSelection();
if (sel.isEmpty()) {
return;
}
editPath(sel.getFirstElement());
viewer.refresh();
}
});
removeButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
IStructuredSelection sel = (IStructuredSelection) viewer
.getSelection();
if (sel.isEmpty()) {
return;
}
removePath(sel.getFirstElement());
viewer.refresh();
}
});
}
abstract protected void removePath(Object element);
abstract protected void editPath(Object element);
abstract protected void addPath();
public abstract Object[] getElements(Object input);
public void refresh() {
viewer.refresh();
}
}