blob: 7cb3dcc3849b2057074b66d353a6cbcab2263370 [file] [log] [blame]
/*
* Copyright (c) 2011 Google Inc.
*
* 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
*/
package com.google.eclipse.protobuf.ui.preferences.locations;
import static java.util.Collections.unmodifiableList;
import static org.eclipse.jface.window.Window.OK;
import static com.google.eclipse.protobuf.ui.preferences.locations.Messages.add;
import static com.google.eclipse.protobuf.ui.preferences.locations.Messages.directories;
import static com.google.eclipse.protobuf.ui.preferences.locations.Messages.down;
import static com.google.eclipse.protobuf.ui.preferences.locations.Messages.remove;
import static com.google.eclipse.protobuf.ui.preferences.locations.Messages.up;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.core.resources.IProject;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
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.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.xtext.ui.PluginImageHelper;
import com.google.eclipse.protobuf.ui.preferences.pages.DataChangedListener;
/**
* Editor where users can add/remove the directories to be used for URI resolution.
*
* @author alruiz@google.com (Alex Ruiz)
*/
public class DirectoryPathsEditor extends Composite {
private final IProject project;
private final Table tblDirectoryPaths;
private final TableViewer tblVwrDirectoryPaths;
private final Button btnAdd;
private final Button btnRemove;
private final Button btnUp;
private final Button btnDown;
private final LinkedList<String> importPaths = new LinkedList<String>();
private DataChangedListener dataChangedListener;
public DirectoryPathsEditor(Composite parent, IProject project, PluginImageHelper imageHelper) {
super(parent, SWT.NONE);
this.project = project;
// generated by WindowBuilder
setLayout(new GridLayout(2, false));
tblVwrDirectoryPaths = new TableViewer(this, SWT.BORDER | SWT.FULL_SELECTION);
tblVwrDirectoryPaths.setLabelProvider(new RichLabelProvider(imageHelper));
tblVwrDirectoryPaths.setContentProvider(ArrayContentProvider.getInstance());
tblDirectoryPaths = tblVwrDirectoryPaths.getTable();
tblDirectoryPaths.setHeaderVisible(true);
tblDirectoryPaths.setLinesVisible(true);
tblDirectoryPaths.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
TableViewerColumn tblclmnVwrPath = new TableViewerColumn(tblVwrDirectoryPaths, SWT.NONE);
TableColumn tblclmnPath = tblclmnVwrPath.getColumn();
tblclmnPath.setWidth(290);
tblclmnPath.setResizable(true);
tblclmnPath.setText(directories);
tblclmnVwrPath.setLabelProvider(new ColumnLabelProvider() {
@Override public String getText(Object element) {
return element.toString();
}
});
Composite composite = new Composite(this, SWT.NONE);
composite.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 1, 1));
composite.setLayout(new GridLayout(1, false));
btnAdd = new Button(composite, SWT.NONE);
btnAdd.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
btnAdd.setText(add);
btnRemove = new Button(composite, SWT.NONE);
btnRemove.setEnabled(false);
btnRemove.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
btnRemove.setText(remove);
new Label(composite, SWT.NONE);
btnUp = new Button(composite, SWT.NONE);
btnUp.setEnabled(false);
btnUp.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
btnUp.setText(up);
btnDown = new Button(composite, SWT.NONE);
btnDown.setEnabled(false);
btnDown.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
btnDown.setText(down);
addEventListeners();
}
private void addEventListeners() {
tblDirectoryPaths.addSelectionListener(new SelectionAdapter() {
@Override public void widgetSelected(SelectionEvent e) {
enableButtonsDependingOnTableSelection();
}
});
btnAdd.addSelectionListener(new SelectionAdapter() {
@Override public void widgetSelected(SelectionEvent e) {
AddDirectoryDialog dialog = new AddDirectoryDialog(getShell(), project);
if (dialog.open() == OK) {
importPaths.add(dialog.selectedPath());
updateTable();
enableButtonsDependingOnTableSelection();
notifyDataHasChanged();
}
}
});
btnRemove.addSelectionListener(new SelectionAdapter() {
@Override public void widgetSelected(SelectionEvent e) {
int index = tblDirectoryPaths.getSelectionIndex();
if (index < 0) {
return;
}
importPaths.remove(index);
updateTable();
enableButtonsDependingOnTableSelection();
notifyDataHasChanged();
}
});
btnUp.addSelectionListener(new SelectionAdapter() {
@Override public void widgetSelected(SelectionEvent e) {
swap(true);
}
});
btnDown.addSelectionListener(new SelectionAdapter() {
@Override public void widgetSelected(SelectionEvent e) {
swap(false);
}
});
}
private void swap(boolean goUp) {
int index = tblDirectoryPaths.getSelectionIndex();
if (index < 0) {
return;
}
int target = goUp ? index - 1 : index + 1;
int[] selection = tblDirectoryPaths.getSelectionIndices();
String path = importPaths.get(selection[0]);
importPaths.remove(index);
importPaths.add(target, path);
updateTable();
tblDirectoryPaths.setSelection(target);
enableButtonsDependingOnTableSelection();
}
/** {@inheritDoc} */
@Override public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
tblDirectoryPaths.setEnabled(enabled);
btnAdd.setEnabled(enabled);
if (enabled) {
enableButtonsDependingOnTableSelection();
} else {
btnRemove.setEnabled(false);
btnUp.setEnabled(false);
btnDown.setEnabled(false);
}
}
private void enableButtonsDependingOnTableSelection() {
int selectionIndex = tblDirectoryPaths.getSelectionIndex();
int size = tblDirectoryPaths.getItemCount();
boolean hasSelection = selectionIndex >= 0;
btnRemove.setEnabled(hasSelection);
boolean hasElements = size > 1;
btnUp.setEnabled(hasElements && selectionIndex > 0);
btnDown.setEnabled(hasElements && hasSelection && selectionIndex < size - 1);
}
public List<String> directoryPaths() {
return unmodifiableList(importPaths);
}
public void directoryPaths(Collection<String> paths) {
importPaths.clear();
importPaths.addAll(paths);
updateTable();
}
private void updateTable() {
tblVwrDirectoryPaths.setInput(importPaths.toArray());
if (tblDirectoryPaths.getItemCount() > 0 && tblDirectoryPaths.getSelectionCount() == 0) {
tblDirectoryPaths.setSelection(0);
}
}
public void setDataChangedListener(DataChangedListener listener) {
dataChangedListener = listener;
}
private void notifyDataHasChanged() {
if (dataChangedListener != null) {
dataChangedListener.dataChanged();
}
}
private static class RichLabelProvider extends LabelProvider implements ITableLabelProvider {
private final PluginImageHelper imageHelper;
RichLabelProvider(PluginImageHelper imageHelper) {
this.imageHelper = imageHelper;
}
@Override public Image getImage(Object element) {
return getColumnImage(element, 0);
}
@Override public Image getColumnImage(Object element, int columnIndex) {
DirectoryPath path = (DirectoryPath) element;
String imageName = (path.isWorkspacePath()) ? "workspace.gif" : "folder.gif";
return imageHelper.getImage(imageName);
}
@Override public String getText(Object element) {
return getColumnText(element, 0);
}
@Override public String getColumnText(Object element, int columnIndex) {
DirectoryPath path = (DirectoryPath) element;
return path.value();
}
}
}