Package org.jbehave.plugin.eclipse.editors

Source Code of org.jbehave.plugin.eclipse.editors.StoryContentOutlinePage$Segment

package org.jbehave.plugin.eclipse.editors;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.BadPositionCategoryException;
import org.eclipse.jface.text.DefaultPositionUpdater;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IPositionUpdater;
import org.eclipse.jface.text.Position;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.texteditor.IDocumentProvider;
import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.ui.views.contentoutline.ContentOutlinePage;

public class StoryContentOutlinePage  extends ContentOutlinePage{


  /**
   * A segment element.
   */
  protected static class Segment {
    public String name;
    public Position position;

    public Segment(String name, Position position) {
      this.name= name;
      this.position= position;
    }

    public String toString() {
      return name;
    }
  }

  /**
   * Divides the editor's document into ten segments and provides elements for them.
   */
  protected class ContentProvider implements ITreeContentProvider {

    protected final static String SEGMENTS= "__java_segments"; //$NON-NLS-1$
    protected IPositionUpdater fPositionUpdater= new DefaultPositionUpdater(SEGMENTS);
    protected List fContent= new ArrayList(10);

    protected void parse(IDocument document) {

      int lines= document.getNumberOfLines();
           
      for (int line= 0; line < lines; line += 1) {
        int offset;
        try {

          offset = document.getLineOffset(line);
          int length=document.getLineLength(line);
       
          String text=document.get(offset, length);
          org.jbehave.plugin.eclipse.model.StoryLine storyLine = org.jbehave.plugin.eclipse.model.StoryLine.parseLine(text);
          if ((storyLine!=null)){
            if (storyLine.getKeyWord().equals("Scenario:")){
            Position p= new Position(offset, length);
            document.addPosition(SEGMENTS, p);
            fContent.add(new Segment(storyLine.asText(), p)); //$NON-NLS-1$
            }
          }
         
        } catch (BadPositionCategoryException x) {
        } catch (BadLocationException x) {
        }
      }
    }

    /*
     * @see IContentProvider#inputChanged(Viewer, Object, Object)
     */
    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
      if (oldInput != null) {
        IDocument document= fDocumentProvider.getDocument(oldInput);
        if (document != null) {
          try {
            document.removePositionCategory(SEGMENTS);
          } catch (BadPositionCategoryException x) {
          }
          document.removePositionUpdater(fPositionUpdater);
        }
      }

      fContent.clear();

      if (newInput != null) {
        IDocument document= fDocumentProvider.getDocument(newInput);
        if (document != null) {
          document.addPositionCategory(SEGMENTS);
          document.addPositionUpdater(fPositionUpdater);

          parse(document);
        }
      }
    }

    /*
     * @see IContentProvider#dispose
     */
    public void dispose() {
      if (fContent != null) {
        fContent.clear();
        fContent= null;
      }
    }

    /*
     * @see IContentProvider#isDeleted(Object)
     */
    public boolean isDeleted(Object element) {
      return false;
    }

    /*
     * @see IStructuredContentProvider#getElements(Object)
     */
    public Object[] getElements(Object element) {
      return fContent.toArray();
    }

    /*
     * @see ITreeContentProvider#hasChildren(Object)
     */
    public boolean hasChildren(Object element) {
      return element == fInput;
    }

    /*
     * @see ITreeContentProvider#getParent(Object)
     */
    public Object getParent(Object element) {
      if (element instanceof Segment)
        return fInput;
      return null;
    }

    /*
     * @see ITreeContentProvider#getChildren(Object)
     */
    public Object[] getChildren(Object element) {
      if (element == fInput)
        return fContent.toArray();
      return new Object[0];
    }
  }

  protected Object fInput;
  protected IDocumentProvider fDocumentProvider;
  protected ITextEditor fTextEditor;

  /**
   * Creates a content outline page using the given provider and the given editor.
   *
   * @param provider the document provider
   * @param editor the editor
   */
  public StoryContentOutlinePage(IDocumentProvider provider, ITextEditor editor) {
    super();
    fDocumentProvider= provider;
    fTextEditor= editor;
  }
 
  /* (non-Javadoc)
   * Method declared on ContentOutlinePage
   */
  public void createControl(Composite parent) {

    super.createControl(parent);

    TreeViewer viewer= getTreeViewer();
    viewer.setContentProvider(new ContentProvider());
    viewer.setLabelProvider(new LabelProvider());
    viewer.addSelectionChangedListener(this);

    if (fInput != null)
      viewer.setInput(fInput);
  }
 
  /* (non-Javadoc)
   * Method declared on ContentOutlinePage
   */
  public void selectionChanged(SelectionChangedEvent event) {

    super.selectionChanged(event);

    ISelection selection= event.getSelection();
    if (selection.isEmpty())
      fTextEditor.resetHighlightRange();
    else {
      Segment segment= (Segment) ((IStructuredSelection) selection).getFirstElement();
      int start= segment.position.getOffset();
      int length= segment.position.getLength();
      try {
        fTextEditor.setHighlightRange(start, length, true);
      } catch (IllegalArgumentException x) {
        fTextEditor.resetHighlightRange();
      }
    }
  }
 
  /**
   * Sets the input of the outline page
   *
   * @param input the input of this outline page
   */
  public void setInput(Object input) {
    fInput= input;
    update();
  }
 
  /**
   * Updates the outline page.
   */
  public void update() {
    TreeViewer viewer= getTreeViewer();

    if (viewer != null) {
      Control control= viewer.getControl();
      if (control != null && !control.isDisposed()) {
        control.setRedraw(false);
        viewer.setInput(fInput);
        viewer.expandAll();
        control.setRedraw(true);
      }
    }
  }
}


TOP

Related Classes of org.jbehave.plugin.eclipse.editors.StoryContentOutlinePage$Segment

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.