com.google.eclipse.protobuf.ui.preferences.paths.DirectoryPathsEditor.java Source code

Java tutorial

Introduction

Here is the source code for com.google.eclipse.protobuf.ui.preferences.paths.DirectoryPathsEditor.java

Source

/*
 * 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.paths;

import static java.util.Collections.unmodifiableList;

import static org.eclipse.jface.window.Window.OK;

import static com.google.eclipse.protobuf.ui.preferences.paths.Messages.add;
import static com.google.eclipse.protobuf.ui.preferences.paths.Messages.directories;
import static com.google.eclipse.protobuf.ui.preferences.paths.Messages.down;
import static com.google.eclipse.protobuf.ui.preferences.paths.Messages.remove;
import static com.google.eclipse.protobuf.ui.preferences.paths.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();
        }
    }
}