类org.eclipse.jface.text.formatter.IFormattingContext源码实例Demo

下面列出了怎么用org.eclipse.jface.text.formatter.IFormattingContext的API类实例代码及写法,或者点击链接到github查看源代码。

@Override
protected void formatMaster(IFormattingContext context, IDocument document,
    int offset, int length) {
  // Reset error state
  masterFormatterHadError = false;

  // Save the entire doc text before we run the master formatter
  premasterDocumentText = document.get();

  // Create the document clone
  tempDocument = documentCloner.clone(document);
  if (tempDocument == null) {
    masterFormatterHadError = true;
    return;
  }

  recordSlavePartitionsText();

  if (replaceSlavePartitionsDuringMasterFormat) {
    replaceSlavePartitionsWithDummyText();
  }

  // Ensure the superclass works off the temp document
  setToTempDocument(context);
  super.formatMaster(context, tempDocument, offset, length);
}
 
/**
 * Update the fomatting context to reflect to the script formatter that should be used with the given content-type.
 * 
 * @param context
 * @param region
 * @param lastContentType
 */
private void updateContex(IFormattingContext context, String contentType, int offset, int length)
{
	IScriptFormatterFactory factory = ScriptFormatterManager.getSelected(contentType);
	if (factory != null)
	{
		factory.setMainContentType(contentType);
		if (context != null)
		{
			context.setProperty(ScriptFormattingContextProperties.CONTEXT_FORMATTER_ID, factory.getId());
			context.setProperty(FormattingContextProperties.CONTEXT_PARTITION, new TypedPosition(offset, length,
					contentType));
			context.setProperty(ScriptFormattingContextProperties.CONTEXT_FORMATTER_CAN_CONSUME_INDENTATION,
					factory.canConsumePreviousIndent());
		}
	}
}
 
@Override
public IFormattingContext createFormattingContext() {
	IFormattingContext context= new JavaFormattingContext();

	Map<String, String> preferences;
	IJavaElement inputJavaElement= getInputJavaElement();
	IJavaProject javaProject= inputJavaElement != null ? inputJavaElement.getJavaProject() : null;
	if (javaProject == null)
		preferences= new HashMap<String, String>(JavaCore.getOptions());
	else
		preferences= new HashMap<String, String>(javaProject.getOptions(true));

	context.setProperty(FormattingContextProperties.CONTEXT_PREFERENCES, preferences);

	return context;
}
 
@Override
public void formatterStarts(IFormattingContext context) {
  super.formatterStarts(context);

  IDocument document = (IDocument) context.getProperty(FormattingContextProperties.CONTEXT_MEDIUM);
  TypedPosition position = (TypedPosition) context.getProperty(FormattingContextProperties.CONTEXT_PARTITION);

  partitions.addLast(position);
  documents.addLast(document);
}
 
/**
 * @param context
 * @param document
 * @param partition
 * @param project
 * @param formatterId
 * @param isSlave
 * @param canConsumeIndentation
 * @param isSelection
 * @param selectedRegion
 *            - Should be valid when isSelection is true.
 */
public FormatJob(IFormattingContext context, IDocument document, TypedPosition partition, IProject project,
		String formatterId, Boolean isSlave, Boolean canConsumeIndentation, Boolean isSelection,
		IRegion selectedRegion)
{
	this.context = context;
	this.document = document;
	this.partition = partition;
	this.project = project;
	this.formatterId = formatterId;
	this.canConsumeIndentation = canConsumeIndentation;
	this.isSlave = (isSlave != null) ? isSlave : false;
	this.isSelection = (isSelection != null) ? isSelection : false;
	this.selectedRegion = selectedRegion;
}
 
源代码6 项目: APICloud-Studio   文件: HTMLFormatter.java
/**
 * Detects the indentation level.
 */
public int detectIndentationLevel(IDocument document, int offset, boolean isSelection,
		IFormattingContext formattingContext)
{
	String source = document.get();
	int indent = 0;
	try
	{
		IParseState parseState = new HTMLParseState(source);
		IParseRootNode parseResult = ParserPoolFactory.parse(getMainContentType(), parseState).getRootNode();
		if (parseResult != null)
		{
			final HTMLFormatterNodeBuilder builder = new HTMLFormatterNodeBuilder();
			final FormatterDocument formatterDocument = createFormatterDocument(source);
			IFormatterContainerNode root = builder.build(parseResult, formatterDocument);
			new HTMLFormatterNodeRewriter().rewrite(root);
			IFormatterContext context = new HTMLFormatterContext(0);
			FormatterIndentDetector detector = new FormatterIndentDetector(offset);
			try
			{
				root.accept(context, detector);
				return detector.getLevel();
			}
			catch (Exception e)
			{
				// ignore
			}
		}
	}
	catch (Throwable t)
	{
		return super.detectIndentationLevel(document, offset);
	}
	return indent;
}
 
@Override
public IFormattingContext createFormattingContext() {

	// it's ok to use instance preferences here as subclasses replace
	// with project dependent versions (see CompilationUnitEditor.AdaptedSourceViewer)
	IFormattingContext context= new JavaFormattingContext();
	Map<String, String> map= new HashMap<String, String>(JavaCore.getOptions());
	context.setProperty(FormattingContextProperties.CONTEXT_PREFERENCES, map);

	return context;
}
 
@Override
public void formatterStarts(final IFormattingContext context) {
	super.formatterStarts(context);

	fPartitions.addLast((TypedPosition) context.getProperty(FormattingContextProperties.CONTEXT_PARTITION));
	fDocuments.addLast((IDocument) context.getProperty(FormattingContextProperties.CONTEXT_MEDIUM));
}
 
@Override
protected void doFormatPreview() {
       if (fPreviewText == null) {
           fPreviewDocument.set(""); //$NON-NLS-1$
           return;
       }
       fPreviewDocument.set(fPreviewText);

	fSourceViewer.setRedraw(false);
	final IFormattingContext context = new JavaFormattingContext();
	try {
		final IContentFormatter formatter =	fViewerConfiguration.getContentFormatter(fSourceViewer);
		if (formatter instanceof IContentFormatterExtension) {
			final IContentFormatterExtension extension = (IContentFormatterExtension) formatter;
			context.setProperty(FormattingContextProperties.CONTEXT_PREFERENCES, fWorkingValues);
			context.setProperty(FormattingContextProperties.CONTEXT_DOCUMENT, Boolean.valueOf(true));
			extension.format(fPreviewDocument, context);
		} else
			formatter.format(fPreviewDocument, new Region(0, fPreviewDocument.getLength()));
	} catch (Exception e) {
		final IStatus status= new Status(IStatus.ERROR, JavaPlugin.getPluginId(), IJavaStatusConstants.INTERNAL_ERROR,
			FormatterMessages.JavaPreview_formatter_exception, e);
		JavaPlugin.log(status);
	} finally {
	    context.dispose();
	    fSourceViewer.setRedraw(true);
	}
   }
 
@Override
protected void formatSlaves(IFormattingContext context, IDocument document,
    int offset, int length) {
  try {
    if (masterFormatterHadError) {
      // Do not proceed if the master formatter had an error
      return;
    }

    // Revert any master changes of partitions for which we have a slave
    // formatting strategy
    try {
      ITypedRegion[] partitions = TextUtilities.computePartitioning(
          tempDocument, partitioning, 0, tempDocument.getLength(), false);
      if (partitions.length == savedPartitionText.length) {
        for (int i = 0; i < savedPartitionText.length; i++) {
          if (savedPartitionText[i] == null) {
            continue;
          }

          tempDocument.replace(partitions[i].getOffset(),
              partitions[i].getLength(), savedPartitionText[i]);

          if (partitions[i].getLength() != savedPartitionText[i].length()) {
            // Recompute partitions since our replacement affects subsequent
            // offsets
            partitions = TextUtilities.computePartitioning(tempDocument,
                partitioning, 0, tempDocument.getLength(), false);
          }
        }
      }
    } catch (BadLocationException e) {
      // This will never happen, according to super.formatSlaves
    }

    if (length > tempDocument.getLength()) {
      // Safeguard against the master formatter shortening the document
      length = tempDocument.getLength();
    }

    // Ensure the superclass works off the temp document
    setToTempDocument(context);
    super.formatSlaves(context, tempDocument, offset, length);

    String tempText = tempDocument.get();
    if (!tempText.equals(premasterDocumentText)) {
      if (!checkForNonwhitespaceChanges
          || StringUtilities.equalsIgnoreWhitespace(tempText,
          premasterDocumentText, true)) {
        // Replace the text since it is different than what we started the
        // with
        document.set(tempText);
      } else {
        CorePluginLog.logWarning("Not applying formatting since it would cause non-whitespace changes.");
      }
    }
  } finally {
    /*
     * This will always be called. The super.format method tries calling
     * formatMaster, and in a finally block calls formatSlaves. We try-finally
     * on entry into formatSlaves.
     */
    documentCloner.release(tempDocument);
  }
}
 
private void setToTempDocument(IFormattingContext context) {
  context.setProperty(FormattingContextProperties.CONTEXT_MEDIUM,
      tempDocument);
}
 
源代码12 项目: APICloud-Studio   文件: XMLFormatter.java
/**
 * Detects the indentation level.
 */
public int detectIndentationLevel(IDocument document, int offset, boolean isSelection,
		IFormattingContext formattingContext)
{

	int indent = 0;
	try
	{
		// detect the indentation offset with the parser, only if the given offset is not the first one in the
		// current partition.
		ITypedRegion partition = document.getPartition(offset);
		if (partition != null && partition.getOffset() == offset)
		{
			return super.detectIndentationLevel(document, offset);
		}

		String source = document.get();
		IParseRootNode parseResult = ParserPoolFactory.parse(getMainContentType(), source).getRootNode();
		if (parseResult != null)
		{
			final XMLFormatterNodeBuilder builder = new XMLFormatterNodeBuilder();
			final FormatterDocument formatterDocument = createFormatterDocument(source, offset);
			IFormatterContainerNode root = builder.build(parseResult, formatterDocument);
			new XMLFormatterNodeRewriter().rewrite(root);
			IFormatterContext context = new XMLFormatterContext(0);
			FormatterIndentDetector detector = new FormatterIndentDetector(offset);
			try
			{
				root.accept(context, detector);
				return detector.getLevel();
			}
			catch (Exception e)
			{
				// ignore
			}
		}
	}
	catch (Throwable t)
	{
		return super.detectIndentationLevel(document, offset);
	}
	return indent;
}
 
源代码13 项目: APICloud-Studio   文件: CSSFormatter.java
/**
 * Detects the indentation level.
 */
public int detectIndentationLevel(IDocument document, int offset, boolean isSelection,
		IFormattingContext formattingContext)
{

	int indent = 0;
	try
	{
		// detect the indentation offset with the parser, only if the given offset is not the first one in the
		// current partition.
		ITypedRegion partition = document.getPartition(offset);
		if (partition != null && partition.getOffset() == offset)
		{
			return super.detectIndentationLevel(document, offset);
		}

		String source = document.get();
		IParseRootNode parseResult = ParserPoolFactory.parse(getMainContentType(), source).getRootNode();
		if (parseResult != null)
		{
			final CSSFormatterNodeBuilder builder = new CSSFormatterNodeBuilder();
			final FormatterDocument formatterDocument = createFormatterDocument(source, offset);
			IFormatterContainerNode root = builder.build(parseResult, formatterDocument);
			new CSSFormatterNodeRewriter(parseResult, formatterDocument).rewrite(root);
			IFormatterContext context = new CSSFormatterContext(0);
			FormatterIndentDetector detector = new FormatterIndentDetector(offset);
			try
			{
				root.accept(context, detector);
				return detector.getLevel();
			}
			catch (Exception e)
			{
				// ignore
			}
		}
	}
	catch (Throwable t)
	{
		return super.detectIndentationLevel(document, offset);
	}
	return indent;
}
 
源代码14 项目: APICloud-Studio   文件: JSFormatter.java
/**
 * Detects the indentation level.
 */
public int detectIndentationLevel(IDocument document, int offset, boolean isSelection,
		IFormattingContext formattingContext)
{
	int indent = 0;
	try
	{
		// detect the indentation offset with the parser, only if the given offset is not the first one in the
		// current partition.
		ITypedRegion partition = document.getPartition(offset);
		if (partition != null && partition.getOffset() == offset)
		{
			return super.detectIndentationLevel(document, offset);
		}
		String source = document.get();
		IParseRootNode parseResult = ParserPoolFactory.parse(getMainContentType(), source).getRootNode();
		if (parseResult != null)
		{
			final JSFormatterNodeBuilder builder = new JSFormatterNodeBuilder();
			final FormatterDocument formatterDocument = createFormatterDocument(source, offset);
			IFormatterContainerNode root = builder.build(parseResult, formatterDocument);
			new JSFormatterNodeRewriter(parseResult, formatterDocument).rewrite(root);
			IFormatterContext context = new JSFormatterContext(0);
			FormatterIndentDetector detector = new FormatterIndentDetector(offset);
			try
			{
				root.accept(context, detector);
				return detector.getLevel();
			}
			catch (Exception e)
			{
				// ignore
			}
		}
	}
	catch (Throwable t)
	{
		return super.detectIndentationLevel(document, offset);
	}
	return indent;
}
 
源代码15 项目: APICloud-Studio   文件: CommonProjectionViewer.java
@SuppressWarnings("rawtypes")
@Override
public IFormattingContext createFormattingContext()
{
	final IFormattingContext context = super.createFormattingContext();
	try
	{
		QualifiedContentType contentType = CommonEditorPlugin.getDefault().getDocumentScopeManager()
				.getContentType(getDocument(), 0);
		if (contentType != null && contentType.getPartCount() > 0)
		{
			for (String ct : contentType.getParts())
			{
				String mainContentType = ct;
				// We need to make sure that in case the given content type is actually a nested language in
				// HTML, we look for the HTML formatter factory because it should be the 'Master' formatter.
				if (mainContentType.startsWith(CommonSourceViewerConfiguration.CONTENTTYPE_HTML_PREFIX))
				{
					mainContentType = CommonSourceViewerConfiguration.CONTENTTYPE_HTML_PREFIX;
				}
				final IScriptFormatterFactory factory = ScriptFormatterManager.getSelected(mainContentType);
				if (factory != null)
				{
					// The code above might change the content type that is used to
					// get the formatter, but we still need to save the original content-type so that the
					// IScriptFormatter instance will handle the any required parsing by calling the right
					// IParser.
					factory.setMainContentType(contentType.getParts()[0]);

					ITextEditor textEditor = (ITextEditor) getAdapter(ITextEditor.class);
					if (textEditor != null)
					{
						IResource file = (IResource) textEditor.getEditorInput().getAdapter(IResource.class);
						context.setProperty(ScriptFormattingContextProperties.CONTEXT_FORMATTER_ID, factory.getId());
						IProject project = (file != null) ? file.getProject() : null;
						Map preferences = factory.retrievePreferences(new PreferencesLookupDelegate(project));
						context.setProperty(FormattingContextProperties.CONTEXT_PREFERENCES, preferences);
					}
					break;
				}
			}
		}
	}
	catch (BadLocationException e)
	{
	}
	return context;
}
 
源代码16 项目: APICloud-Studio   文件: IScriptFormatter.java
/**
 * Detects the indentation level at the specified offset
 * 
 * @param document
 * @param offset
 * @param context
 * @param isSelection
 * @return
 */
int detectIndentationLevel(IDocument document, int offset, boolean isSelection, IFormattingContext context);
 
源代码17 项目: APICloud-Studio   文件: IScriptFormatter.java
/**
 * Format <code>source</code>, and returns a text edit that correspond to the difference between the given string
 * and the formatted string.
 * <p>
 * It returns null if the given string cannot be formatted.
 * </p>
 * 
 * @param source
 *            full source module content
 * @param offset
 *            the offset of the region to format
 * @param length
 *            the length of the region to format
 * @param indentationLevel
 *            the additional indent level
 * @param isSelection
 *            Indicate that we are formatting selected text.
 * @param context
 *            {@link IFormatterContext}
 * @param indentSufix
 *            Extra string indent to insert into the end of the formatter text (may be empty)
 */
TextEdit format(String source, int offset, int length, int indentationLevel, boolean isSelection,
		IFormattingContext context, String indentSufix) throws FormatterException;
 
 类所在包
 类方法
 同包方法