Package com.subgraph.vega.ui.scanner.scope

Source Code of com.subgraph.vega.ui.scanner.scope.RemovableItemWidget

package com.subgraph.vega.ui.scanner.scope;

import org.eclipse.jface.layout.TableColumnLayout;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnLayoutData;
import org.eclipse.jface.viewers.ColumnPixelData;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
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.events.SelectionListener;
import org.eclipse.swt.events.TraverseEvent;
import org.eclipse.swt.events.TraverseListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FillLayout;
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.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;

import com.subgraph.vega.api.model.scope.ITargetScope;
import com.subgraph.vega.ui.scanner.Activator;
import com.subgraph.vega.ui.util.images.ImageCache;

public abstract class RemovableItemWidget extends Composite {
  private final static String REMOVE_ICON = "icons/remove.png";
  private final static ImageCache imageCache = new ImageCache(Activator.PLUGIN_ID);
 
  protected final Text addText;
  protected final Button addButton;
  private final TableViewer tableViewer;
 
  protected ITargetScope currentScope;

  public RemovableItemWidget(Composite parent, String title, StructuredViewer scopeViewer) {
    super(parent, SWT.NONE);
    setLayout(new FillLayout());
    final Group group = new Group(this, SWT.NONE);
    group.setText(title);
    group.setLayout(new GridLayout(2, false));
    tableViewer = createTableViewer(group);
    addText = createText(group, createModifyListener());
    addButton = createAddButton(group, createSelectionListener());
    currentScope = getScopeFromSelection(scopeViewer.getSelection());
    scopeViewer.addSelectionChangedListener(createSelectionChangedListener());
    reloadInput();
  }
 
 
 
  protected void reloadInput() {
    tableViewer.setInput(getTableInput());
    tableViewer.getTable().getParent().layout();
  }
 
  private ISelectionChangedListener createSelectionChangedListener() {
    return new ISelectionChangedListener() {
      @Override
      public void selectionChanged(SelectionChangedEvent event) {
        currentScope = getScopeFromSelection(event.getSelection());
        reloadInput();
      }
    };
  }
 
  private ITargetScope getScopeFromSelection(ISelection selection) {
    if(!(selection instanceof StructuredSelection)) {
      return null;
    }
    final Object ob = ((StructuredSelection)selection).getFirstElement();
    if(!(ob instanceof ITargetScope)) {
      return null;
    }
    return (ITargetScope) ob;
  }
 
  private ModifyListener createModifyListener() {
    return new ModifyListener() {
      @Override
      public void modifyText(ModifyEvent e) {
        addButton.setEnabled(verifyText(addText.getText()));
      }
    };
  }

  private SelectionListener createTextSelectionListener() {
    return new SelectionAdapter() {
      @Override
      public void widgetDefaultSelected(SelectionEvent e) {
        if(handleInput(addText.getText())) {
          addText.setText("");
          reloadInput();
        }
       
      }
    };
  }
 
  private SelectionAdapter createSelectionListener() {
    return new SelectionAdapter() {
      @Override
      public void widgetSelected(SelectionEvent e) {
        if(handleInput(addText.getText())) {
          addText.setText("");
          reloadInput();
        }
      }
    };
  }

  abstract Object[] getTableInput();
  abstract boolean verifyText(String input);
  abstract boolean handleInput(String input);
  abstract boolean handleRemoveElement(Object element);
 
  private Text createText(Composite parent, ModifyListener modifyListener) {
    final Text text = new Text(parent, SWT.BORDER);
    text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
    text.addModifyListener(modifyListener);
    text.addSelectionListener(createTextSelectionListener());
    text.addTraverseListener(new TraverseListener() {
      @Override
      public void keyTraversed(TraverseEvent e) {
        if(e.detail == SWT.TRAVERSE_RETURN) {
          e.doit = false;
        }
      }
    });
    return text;
  }

  private Button createAddButton(Composite parent, SelectionListener selectionListener) {
    final Button button = new Button(parent, SWT.NONE);
    button.setText("Add");
    button.setEnabled(false);
    button.addSelectionListener(selectionListener);
    return button;
  }
 
  private TableViewer createTableViewer(Composite parent) {
    final Composite tableComposite = new Composite(parent, SWT.NONE);
    final TableViewer tableViewer = new TableViewer(tableComposite, SWT.V_SCROLL | SWT.BORDER);
    final Table table = tableViewer.getTable();
    table.setHeaderVisible(false);
    table.addListener(SWT.MouseDown, new Listener() {
      @Override
      public void handleEvent(Event event) {
        handleTableMouseDown(event, tableViewer);
      }
    });
    final TableColumnLayout layout = new TableColumnLayout();
    createDataColumn(tableViewer, layout);
    createRemoveColumn(tableViewer, layout);
    tableComposite.setLayout(layout);
    final GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
    gd.horizontalSpan = 2;
    gd.heightHint = 80;
    tableComposite.setLayoutData(gd);
    tableViewer.setContentProvider(new ArrayContentProvider());
    return tableViewer;
  }
 
  private void handleTableMouseDown(Event e, TableViewer tableViewer) {
    final Table table = tableViewer.getTable();
    final Rectangle clientArea = table.getClientArea();
    Point point = new Point(e.x, e.y);
    for(int i = table.getTopIndex(); i < table.getItemCount(); i++) {
      TableItem item = table.getItem(i);
      Rectangle rect = item.getBounds(1);
      if(!rect.intersects(clientArea)) {
        return;
      }
      if(rect.contains(point)) {
        if(handleRemoveElement(tableViewer.getElementAt(i))) {
          reloadInput();
        }
      }
    }
  }
 
  private void createDataColumn(TableViewer viewer, TableColumnLayout layout) {
    final TableViewerColumn tvc = createTableColumn(viewer, layout, SWT.LEFT, new ColumnWeightData(100));
    tvc.setLabelProvider(new ColumnLabelProvider());
  }
 
  private void createRemoveColumn(TableViewer viewer, TableColumnLayout layout) {
    final TableViewerColumn tvc = createTableColumn(viewer, layout, SWT.CENTER, new ColumnPixelData(20, false, true));
    tvc.setLabelProvider(new ColumnLabelProvider() {
      @Override
      public String getText(Object element) {
        return null;
      }
      @Override
      public Image getImage(Object element) {
        return imageCache.get(REMOVE_ICON);
      }
    });
  }
 
  private TableViewerColumn createTableColumn(TableViewer viewer, TableColumnLayout layout, int align, ColumnLayoutData layoutData) {
    final TableViewerColumn tvc = new TableViewerColumn(viewer, align);
    final TableColumn tc = tvc.getColumn();
    tc.setMoveable(false);
    tc.setResizable(false);
    layout.setColumnData(tc, layoutData);
    return tvc;
  }
}
TOP

Related Classes of com.subgraph.vega.ui.scanner.scope.RemovableItemWidget

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.