/*******************************************************************************
* Copyright (c) 2012, 2016, 2017 PDT Extension Group and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* PDT Extension Group - initial API and implementation
* Kaloyan Raev - [501269] externalize strings
*******************************************************************************/
package org.eclipse.php.composer.ui.dialogs;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.php.composer.api.objects.Namespace;
import org.eclipse.php.composer.core.log.Logger;
import org.eclipse.php.composer.ui.ComposerUIPluginConstants;
import org.eclipse.php.composer.ui.ComposerUIPluginImages;
import org.eclipse.php.composer.ui.controller.PathController;
import org.eclipse.php.composer.ui.utils.WidgetHelper;
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.layout.GridLayout;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.dialogs.CheckedTreeSelectionDialog;
public class PsrDialog extends Dialog {
private Text namespaceControl;
private Namespace namespace;
private IProject project;
private TableViewer pathViewer;
public PsrDialog(Shell parentShell, Namespace namespace, IProject project) {
super(parentShell);
this.namespace = namespace;
this.project = project;
}
@Override
protected Control createDialogArea(Composite parent) {
getShell().setText(Messages.PsrDialog_Title);
getShell().setImage(ComposerUIPluginImages.EVENT.createImage());
Composite contents = new Composite(parent, SWT.NONE);
contents.setLayout(new GridLayout(3, false));
GridData gd_contents = new GridData();
gd_contents.widthHint = 350;
contents.setLayoutData(gd_contents);
Label lblEvent = new Label(contents, SWT.NONE);
GridData gd_lblEvent = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1);
gd_lblEvent.widthHint = ComposerUIPluginConstants.DIALOG_LABEL_WIDTH;
lblEvent.setLayoutData(gd_lblEvent);
lblEvent.setText(Messages.PsrDialog_NamespaceLabel);
namespaceControl = new Text(contents, SWT.BORDER);
GridData gd_eventControl = new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1);
gd_eventControl.widthHint = ComposerUIPluginConstants.DIALOG_CONTROL_WIDTH;
namespaceControl.setLayoutData(gd_eventControl);
namespaceControl.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
namespace.setNamespace(namespaceControl.getText());
}
});
if (namespace.getNamespace() != null) {
namespaceControl.setText(namespace.getNamespace());
} else {
// must never be null, so at least be sure to always return an empty
// string
namespaceControl.setText(""); //$NON-NLS-1$
}
Label lblHandler = new Label(contents, SWT.NONE);
lblHandler.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false, 1, 1));
lblHandler.setText(Messages.PsrDialog_PathsLabel);
PathController controller = new PathController();
pathViewer = new TableViewer(contents, SWT.BORDER | SWT.FULL_SELECTION);
GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
gridData.minimumHeight = 100;
pathViewer.getTable().setLayoutData(gridData);
pathViewer.setContentProvider(controller);
pathViewer.setLabelProvider(controller);
pathViewer.setInput(namespace.getPaths());
Composite buttons = new Composite(contents, SWT.NONE);
buttons.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false, 1, 1));
buttons.setLayout(new GridLayout(1, false));
WidgetHelper.trimComposite(buttons, 0);
WidgetHelper.setMargin(buttons, 1, 1);
WidgetHelper.setSpacing(buttons, 0, 0);
Button btnEdit = new Button(buttons, SWT.PUSH);
btnEdit.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
btnEdit.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false, 1, 1));
btnEdit.setText(Messages.PsrDialog_EditButton);
btnEdit.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
List<IFolder> folders = new ArrayList<IFolder>();
for (Object path : namespace.getPaths()) {
IResource resource = project.findMember((String) path);
if (resource != null && resource instanceof IFolder) {
folders.add((IFolder) resource);
}
}
CheckedTreeSelectionDialog dialog = ResourceDialog.createMulti(pathViewer.getTable().getShell(),
Messages.PsrDialog_SelectionDialogTitle, Messages.PsrDialog_SelectionDialogMessage,
new Class[] { IFolder.class }, project, folders);
if (dialog.open() == Dialog.OK) {
namespace.clear();
for (Object result : dialog.getResult()) {
if (result instanceof IFolder) {
namespace.add(((IFolder) result).getProjectRelativePath().toString());
}
}
}
}
});
Button btnRemove = new Button(buttons, SWT.NONE);
btnRemove.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false, 1, 1));
btnRemove.setText(Messages.PsrDialog_RemoveButton);
// XXX: add/remove listener on dialog open/close
btnRemove.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
ISelection selection = pathViewer.getSelection();
if (!(selection instanceof StructuredSelection)) {
return;
}
StructuredSelection s = (StructuredSelection) selection;
for (Object o : s.toArray()) {
try {
String item = (String) o;
pathViewer.remove(item);
namespace.remove(item);
} catch (Exception e2) {
Logger.logException(e2);
}
}
}
});
namespace.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent e) {
// "namespace" can be modified afterwards by
// PsrSection#handleEdit()
if (e.getPropertyName().contains("#")) { //$NON-NLS-1$
if (pathViewer.getControl().isDisposed()) {
return;
}
pathViewer.refresh();
}
}
});
return contents;
}
public Namespace getNamespace() {
return namespace;
}
public void setProject(IProject project) {
this.project = project;
}
}