/**
 * Copyright (C) 2005 - 2014  Eric Van Dewoestine
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.eclim.eclipse.jface.text;

import org.eclim.eclipse.EclimPlugin;

import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IEventConsumer;
import org.eclipse.jface.text.IFindReplaceTarget;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.ITextDoubleClickStrategy;
import org.eclipse.jface.text.ITextHover;
import org.eclipse.jface.text.ITextInputListener;
import org.eclipse.jface.text.ITextListener;
import org.eclipse.jface.text.ITextOperationTarget;
import org.eclipse.jface.text.IUndoManager;
import org.eclipse.jface.text.IViewportListener;
import org.eclipse.jface.text.TextPresentation;
import org.eclipse.jface.text.TextSelection;

import org.eclipse.jface.text.source.Annotation;
import org.eclipse.jface.text.source.IAnnotationHover;
import org.eclipse.jface.text.source.IAnnotationModel;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.jface.text.source.SourceViewerConfiguration;

import org.eclipse.jface.viewers.ISelectionProvider;

import org.eclipse.swt.custom.StyledText;

import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Point;

/**
 * Dummy ITextViewer implementation that provides basic functionality for
 * eclipse classes that require an ITextViewer.
 *
 * @author Eric Van Dewoestine
 */
public class DummyTextViewer
  implements ISourceViewer
{
  public IDocument document;
  public ISelectionProvider selectionProvider;
  private StyledText textWidget;

  public DummyTextViewer (IDocument document, int offset, int length)
  {
    this.document = document;
    selectionProvider = new DummySelectionProvider(
        new TextSelection(document, offset, length));
  }

  // ITextViewer

  public StyledText getTextWidget()
  {
    // needed by at least pydev when completing top level functions (see #307)
    if (textWidget == null){
      textWidget = new StyledText(EclimPlugin.getShell(), 0);
    }
    return textWidget;
  }

  public void setUndoManager(IUndoManager undoManager)
  {
  }

  public void setTextDoubleClickStrategy(
      ITextDoubleClickStrategy strategy, String contentType)
  {
  }

  @SuppressWarnings("deprecation")
  public void setAutoIndentStrategy(
      org.eclipse.jface.text.IAutoIndentStrategy strategy, String contentType)
  {
  }

  public void setTextHover(ITextHover textViewerHover, String contentType)
  {
  }

  public void activatePlugins()
  {
  }

  public void resetPlugins()
  {
  }

  public void addViewportListener(IViewportListener listener)
  {
  }

  public void removeViewportListener(IViewportListener listener)
  {
  }

  public void addTextListener(ITextListener listener)
  {
  }

  public void removeTextListener(ITextListener listener)
  {
  }

  public void addTextInputListener(ITextInputListener listener)
  {
  }

  public void removeTextInputListener(ITextInputListener listener)
  {
  }

  public void setDocument(IDocument document)
  {
    this.document = document;
  }

  public IDocument getDocument()
  {
    return document;
  }

  public void setEventConsumer(IEventConsumer consumer)
  {
  }

  public void setEditable(boolean editable)
  {
  }

  public boolean isEditable()
  {
    return true;
  }

  public void setDocument(
      IDocument document, int modelRangeOffset, int modelRangeLength)
  {
  }

  public void setVisibleRegion(int offset, int length)
  {
  }

  public void resetVisibleRegion()
  {
  }

  public IRegion getVisibleRegion()
  {
    return null;
  }

  public boolean overlapsWithVisibleRegion(int offset, int length)
  {
    return false;
  }

  public void changeTextPresentation(
      TextPresentation presentation, boolean controlRedraw)
  {
  }

  public void invalidateTextPresentation()
  {
  }

  public void setTextColor(Color color)
  {
  }

  public void setTextColor(
      Color color, int offset, int length, boolean controlRedraw)
  {
  }

  public ITextOperationTarget getTextOperationTarget()
  {
    return null;
  }

  public IFindReplaceTarget getFindReplaceTarget()
  {
    return null;
  }

  public void setDefaultPrefixes(String[] defaultPrefixes, String contentType)
  {
  }

  public void setIndentPrefixes(String[] indentPrefixes, String contentType)
  {
  }

  public void setSelectedRange(int offset, int length)
  {
  }

  public Point getSelectedRange()
  {
    return new Point(-1, -1);
  }

  public ISelectionProvider getSelectionProvider()
  {
    return selectionProvider;
  }

  public void revealRange(int offset, int length)
  {
  }

  public void setTopIndex(int index)
  {
  }

  public int getTopIndex()
  {
    return -1;
  }

  public int getTopIndexStartOffset()
  {
    return -1;
  }

  public int getBottomIndex()
  {
    return -1;
  }

  public int getBottomIndexEndOffset()
  {
    return -1;
  }

  public int getTopInset()
  {
    return -1;
  }

  // ISourceViewer

  private IAnnotationModel annotationModel;

  public void configure(SourceViewerConfiguration configuration)
  {
  }

  public void setAnnotationHover(IAnnotationHover annotationHover)
  {
  }

  public void setDocument(IDocument document, IAnnotationModel annotationModel)
  {
    this.document = document;
    this.annotationModel = annotationModel;
  }

  public void setDocument(
      IDocument document, IAnnotationModel annotationModel,
      int modelRangeOffset, int modelRangeLength)
  {
    this.document = document;
    this.annotationModel = annotationModel;
  }

  public IAnnotationModel getAnnotationModel()
  {
    return annotationModel;
  }

  public void setRangeIndicator(Annotation rangeIndicator)
  {
  }

  public void setRangeIndication(int offset, int length, boolean moveCursor)
  {
  }

  public IRegion getRangeIndication()
  {
    return null;
  }

  public void removeRangeIndication()
  {
  }

  public void showAnnotations(boolean show){
  }
}
