/******************************************************************************* * Copyright (c) 2009 IBM Corporation 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: * IBM Corporation - initial API and implementation * Zend Technologies *******************************************************************************/ package org.eclipse.php.internal.debug.ui.pathmapper; import java.util.Arrays; import java.util.List; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.dltk.ui.viewsupport.ScriptUILabelProvider; import org.eclipse.jface.viewers.ColumnLayoutData; import org.eclipse.jface.viewers.ColumnWeightData; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.window.Window; import org.eclipse.php.internal.debug.core.pathmapper.PathEntry.Type; import org.eclipse.php.internal.debug.core.pathmapper.PathMapper; import org.eclipse.php.internal.debug.core.pathmapper.PathMapper.Mapping; import org.eclipse.php.internal.ui.preferences.ScrolledCompositeImpl; import org.eclipse.php.internal.ui.util.PHPPluginImages; import org.eclipse.php.internal.ui.util.PixelConverter; import org.eclipse.php.internal.ui.util.TableSorter; import org.eclipse.php.internal.ui.wizards.fields.IListAdapter; import org.eclipse.php.internal.ui.wizards.fields.ListDialogField; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.ui.ISharedImages; import org.eclipse.ui.PlatformUI; public class PathMappingComposite extends Composite { private static final int IDX_ADD = 0; private static final int IDX_EDIT = 1; private static final int IDX_REMOVE = 2; private static final String[] buttonLabels = { Messages.PathMappingComposite_0, Messages.PathMappingComposite_1, Messages.PathMappingComposite_2 }; private static final String[] columnHeaders = { Messages.PathMappingComposite_5, Messages.PathMappingComposite_3, Messages.PathMappingComposite_4 }; private static final ColumnLayoutData[] columnLayoutData = new ColumnLayoutData[] { new ColumnWeightData(15), new ColumnWeightData(50), new ColumnWeightData(50) }; private ListDialogField fMapList; public PathMappingComposite(Composite parent, int style) { super(parent, style); initializeControls(); } protected void initializeControls() { fMapList = new ListDialogField(new ListAdapter(), buttonLabels, new LabelProvider(), new TableSorter()); fMapList.setRemoveButtonIndex(IDX_REMOVE); fMapList.setTableColumns(new ListDialogField.ColumnsDescription(columnLayoutData, columnHeaders, true)); GridLayout layout = new GridLayout(); setLayout(layout); layout.marginHeight = 0; layout.marginWidth = 0; setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); PixelConverter conv = new PixelConverter(this); ScrolledCompositeImpl scrolledCompositeImpl = new ScrolledCompositeImpl(this, SWT.V_SCROLL | SWT.H_SCROLL); scrolledCompositeImpl.setLayout(layout); scrolledCompositeImpl.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); Composite composite = new Composite(scrolledCompositeImpl, SWT.NONE); layout = new GridLayout(); layout.marginHeight = 5; layout.marginWidth = 5; layout.numColumns = 2; composite.setLayout(layout); scrolledCompositeImpl.setContent(composite); scrolledCompositeImpl.setFont(getFont()); GridData data = new GridData(SWT.FILL, SWT.FILL, true, true); data.widthHint = conv.convertWidthInCharsToPixels(50); data.heightHint = 200; Control listControl = fMapList.getListControl(composite); listControl.setLayoutData(data); Control buttonsControl = fMapList.getButtonBox(composite); buttonsControl.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_BEGINNING)); Point size = composite.computeSize(SWT.DEFAULT, SWT.DEFAULT); scrolledCompositeImpl.setMinSize(size.x, size.y); updateButtonsEnablement(); } protected void handleAdd() { PathMapperEntryDialog dialog = new PathMapperEntryDialog(getShell()); if (dialog.open() == Window.OK) { Mapping mapping = dialog.getResult(); fMapList.addElement(mapping); } } @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); fMapList.setEnabled(enabled); } @SuppressWarnings("unchecked") protected void handleEdit() { List l = fMapList.getSelectedElements(); if (l.size() == 1) { Mapping oldElement = (Mapping) l.get(0); PathMapperEntryDialog dialog = new PathMapperEntryDialog(getShell(), oldElement); if (dialog.open() == Window.OK) { Mapping newElement = dialog.getResult(); fMapList.replaceElement(oldElement, newElement); } } } @SuppressWarnings("unchecked") protected void handleRemove() { fMapList.removeElements(fMapList.getSelectedElements()); } /** * Accepts only Mapping[] type */ public void setData(Object data) { if (!(data instanceof Mapping[])) { throw new IllegalArgumentException("Data must be instance of Mapping[]"); //$NON-NLS-1$ } Mapping[] mappings = (Mapping[]) data; fMapList.setElements(Arrays.asList(mappings)); updateButtonsEnablement(); } @SuppressWarnings("unchecked") public Mapping[] getMappings() { List l = fMapList.getElements(); return (Mapping[]) l.toArray(new Mapping[l.size()]); } protected void updateButtonsEnablement() { List<?> selectedElements = fMapList.getSelectedElements(); fMapList.enableButton(IDX_EDIT, selectedElements.size() == 1); fMapList.enableButton(IDX_REMOVE, selectedElements.size() > 0); } class ListAdapter implements IListAdapter { public void customButtonPressed(ListDialogField field, int index) { switch (index) { case IDX_ADD: handleAdd(); break; case IDX_EDIT: handleEdit(); break; case IDX_REMOVE: handleRemove(); break; } } public void doubleClicked(ListDialogField field) { handleEdit(); } public void selectionChanged(ListDialogField field) { updateButtonsEnablement(); } } class LabelProvider extends org.eclipse.jface.viewers.LabelProvider implements ITableLabelProvider { private ScriptUILabelProvider phpLabelProvider = new ScriptUILabelProvider(); public Image getColumnImage(Object element, int columnIndex) { if (columnIndex == 2) { // local path PathMapper.Mapping mapping = (PathMapper.Mapping) element; if (mapping.type == Type.EXTERNAL) { return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FOLDER); } if (mapping.type == Type.INCLUDE_VAR) { return PHPPluginImages.get(PHPPluginImages.IMG_OBJS_ENV_VAR); } if (mapping.type == Type.INCLUDE_FOLDER) { return PHPPluginImages.get(PHPPluginImages.IMG_OBJS_LIBRARY); } IResource resource = ResourcesPlugin.getWorkspace().getRoot().findMember(mapping.localPath.toString()); if (resource != null) { return phpLabelProvider.getImage(resource); } } return null; } public String getColumnText(Object element, int columnIndex) { PathMapper.Mapping mapping = (PathMapper.Mapping) element; switch (columnIndex) { case 0: return mapping.source.toString(); case 1: return mapping.remotePath.toString(); case 2: return mapping.localPath.toString(); } return null; } } }