Package com.google.eclipse.protobuf.ui.preferences.paths

Source Code of com.google.eclipse.protobuf.ui.preferences.paths.DirectoryPathsEditor$RichLabelProvider

/*
* 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();
    }
  }
}
TOP

Related Classes of com.google.eclipse.protobuf.ui.preferences.paths.DirectoryPathsEditor$RichLabelProvider

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.