org.eclipse.xtext.formatting2.debug.TextRegionsInTextToString.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.xtext.formatting2.debug.TextRegionsInTextToString.java

Source

/*******************************************************************************
 * Copyright (c) 2014 itemis AG (http://www.itemis.eu) and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *******************************************************************************/
package org.eclipse.xtext.formatting2.debug;

import java.util.List;

import org.eclipse.xtext.formatting2.regionaccess.ILineRegion;
import org.eclipse.xtext.formatting2.regionaccess.ITextRegionAccess;
import org.eclipse.xtext.formatting2.regionaccess.ITextReplacement;
import org.eclipse.xtext.formatting2.regionaccess.ITextSegment;
import org.eclipse.xtext.formatting2.regionaccess.internal.TextRegions;

import com.google.common.base.Strings;
import com.google.common.base.Throwables;
import com.google.common.collect.Lists;

/**
 * @author Moritz Eysholdt - Initial contribution and API
 */
public class TextRegionsInTextToString {

    private ITextSegment frame;
    private List<ITextReplacement> items = Lists.newArrayList();
    private int leadingLines = 4;
    private ITextRegionAccess textRegionAccess;
    private String title = "document snippet";
    private int trailingLines = 4;

    public TextRegionsInTextToString add(ITextReplacement region) {
        items.add(region);
        return this;
    }

    public TextRegionsInTextToString add(ITextSegment region, String title) {
        items.add(region.replaceWith(title));
        return this;
    }

    protected String box(String title, String content) {
        final int width = 80;
        final int min = 3;
        int titleLength = title.length() + 2;
        final int left = Math.max((width - titleLength) / 2, min);
        StringBuilder result = new StringBuilder();
        result.append(Strings.repeat("-", left));
        result.append(" ");
        result.append(title);
        result.append(" ");
        if (left > min)
            result.append(Strings.repeat("-", width - left - titleLength));
        result.append("\n");
        result.append(org.eclipse.xtext.util.Strings.trimTrailingLineBreak(content));
        result.append("\n");
        result.append(Strings.repeat("-", width));
        return result.toString();
    }

    public ITextSegment getFrame() {
        if (this.frame != null)
            return this.frame;
        ITextRegionAccess access = getTextRegionAccess();
        if (access != null) {
            ITextSegment impactRegion = TextRegions.merge(this.items);
            List<ILineRegion> expandToLines = TextRegions.expandToLines(impactRegion, getLeadingLines(),
                    getTrailingLines());
            return TextRegions.merge(expandToLines);
        }
        return null;
    }

    public List<ITextReplacement> getItems() {
        return items;
    }

    public int getLeadingLines() {
        return leadingLines;
    }

    public ITextRegionAccess getTextRegionAccess() {
        if (this.textRegionAccess != null)
            return this.textRegionAccess;
        for (ITextReplacement item : this.items)
            return item.getTextRegionAccess();
        return null;
    }

    public String getTitle() {
        return title;
    }

    public int getTrailingLines() {
        return trailingLines;
    }

    public TextRegionsInTextToString setFrame(ITextSegment frame) {
        this.frame = frame;
        return this;
    }

    public TextRegionsInTextToString setLeadingLines(int leadingLines) {
        this.leadingLines = leadingLines;
        return this;
    }

    public TextRegionsInTextToString setTextRegionAccess(ITextRegionAccess textRegionAccess) {
        this.textRegionAccess = textRegionAccess;
        return this;
    }

    public TextRegionsInTextToString setTitle(String title) {
        this.title = title;
        return this;
    }

    public TextRegionsInTextToString setTrailingLines(int trailingLines) {
        this.trailingLines = trailingLines;
        return this;
    }

    @Override
    public String toString() {
        try {
            ITextRegionAccess access = getTextRegionAccess();
            ITextSegment frame = getFrame();
            if (access == null || frame == null)
                return "(null)";
            StringBuilder builder = new StringBuilder();
            String vizualized = access.getRewriter().renderToString(frame, items);
            builder.append(box(title, vizualized));
            return builder.toString();
        } catch (Exception e) {
            return box("error", e.getMessage() + "\n" + Throwables.getStackTraceAsString(e));
        }
    }

}