Package com.onpositive.commons.ui.viewers

Source Code of com.onpositive.commons.ui.viewers.SortController$MComparator

package com.onpositive.commons.ui.viewers;

import java.util.Comparator;

import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Item;

public abstract class SortController extends SelectionAdapter {

  private final class MComparator implements Comparator {
    private final boolean state;

    private MComparator(boolean state) {
      this.state = state;
    }

    public int compare(Object e1, Object e2) {
      int rev = state ? 1 : -1;
      return rev * columnComparator.compare(e1, e2);
    }
  }

  private static final String CONTROLLER = "controller";
  private StructuredViewer viewer;
  private Item column;
  private Comparator columnComparator;
  private boolean state = true;

  // private static WeakHashMap instantes = new WeakHashMap();

  public static SortController getController(Control control, Item column) {
    return (SortController) column.getData(CONTROLLER);
  }

  public SortController(StructuredViewer viewer, Item column,
      Comparator columnComparator, boolean defaultDesc) {
    column.setData(CONTROLLER, this);
    this.viewer = viewer;
    this.column = column;
    this.columnComparator = columnComparator;
    this.state = defaultDesc;
  }

  public void widgetSelected(SelectionEvent e) {
    boolean newColumn = false;
    if (viewer instanceof TableViewer) {
      TableViewer tv = (TableViewer) viewer;
      newColumn = tv.getTable().getSortColumn() != column;
    }
    if (viewer instanceof TreeViewer) {
      TreeViewer tv = (TreeViewer) viewer;
      newColumn = tv.getTree().getSortColumn() != column;
    }
    if (newColumn) {
      this.state = true;
    }
    stateChanged();
    // if (!newColumn) {
    this.state = !state;
    // }
  }

  public void setState(boolean state) {
    stateChanged();
    this.state = !state;
  }

  private boolean getState() {
    return state;
  }

  protected StructuredViewer getViewer() {
    return viewer;
  }

  protected Item getColumn() {
    return column;
  }

  protected ViewerSorter getViewerSorter() {
    final boolean state = getState();
    return new ViewerSorter() {

      public int compare(Viewer viewer, Object e1, Object e2) {
        int rev = state ? 1 : -1;
        return rev * columnComparator.compare(e1, e2);
      }

    };
  }

  public Comparator getComparator() {
    final boolean state = getState();
    return new MComparator(state);
  }

  protected int getSortDirection() {
    return getState() ? SWT.DOWN : SWT.UP;
  }

  public void initState() {
    state = getRealSortDirection() == SWT.DOWN;
    update();
    this.state = !state;
  }

  protected void update() {
    IContentProvider contentProvider = getViewer().getContentProvider();
    if (contentProvider instanceof DeferedContentProvider) {
      DeferedContentProvider ds = (DeferedContentProvider) contentProvider;
      contentProvider = ds.getBase();
    }
    getViewer().getControl().setRedraw(false);
    try {
      getViewer().setContentProvider(new ITreeContentProvider() {

        public Object[] getChildren(Object parentElement) {
          return null;
        }

        public Object getParent(Object element) {
          return null;
        }

        public boolean hasChildren(Object element) {
          return false;
        }

        public Object[] getElements(Object inputElement) {
          return new Object[0];
        }

        public void dispose() {

        }

        public void inputChanged(Viewer viewer, Object oldInput,
            Object newInput) {

        }

      });
      getViewer().setSorter(getViewerSorter());
      getViewer().setContentProvider(
          new DeferedContentProvider(
              (ITreeContentProvider) contentProvider));
    } finally {
      getViewer().getControl().setRedraw(true);
    }
  }

  public abstract int getRealSortDirection();

  public abstract void stateChanged();

}
TOP

Related Classes of com.onpositive.commons.ui.viewers.SortController$MComparator

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.