view dwtx/jface/text/TabsToSpacesConverter.d @ 129:eb30df5ca28b

Added JFace Text sources
author Frank Benoit <benoit@tionex.de>
date Sat, 23 Aug 2008 19:10:48 +0200
parents
children c4fb132a086c
line wrap: on
line source

/*******************************************************************************
 * Copyright (c) 2007 IBM Corporation 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
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 * Port to the D programming language:
 *     Frank Benoit <benoit@tionex.de>
 *******************************************************************************/
module dwtx.jface.text.TabsToSpacesConverter;

import dwt.dwthelper.utils;


/**
 * Auto edit strategy that converts tabs into spaces.
 * <p>
 * Clients usually instantiate and configure this class but
 * can also extend it in their own subclass.
 * </p>
 * 
 * @since 3.3
 */
public class TabsToSpacesConverter : IAutoEditStrategy {

    private int fTabRatio;
    private ILineTracker fLineTracker;


    public void setNumberOfSpacesPerTab(int ratio) {
        fTabRatio= ratio;
    }

    public void setLineTracker(ILineTracker lineTracker) {
        fLineTracker= lineTracker;
    }

    private int insertTabString(StringBuffer buffer, int offsetInLine) {

        if (fTabRatio is 0)
            return 0;

        int remainder= offsetInLine % fTabRatio;
        remainder= fTabRatio - remainder;
        for (int i= 0; i < remainder; i++)
            buffer.append(' ');
        return remainder;
    }

    public void customizeDocumentCommand(IDocument document, DocumentCommand command) {
        String text= command.text;
        if (text is null)
            return;

        int index= text.indexOf('\t');
        if (index > -1) {

            StringBuffer buffer= new StringBuffer();

            fLineTracker.set(command.text);
            int lines= fLineTracker.getNumberOfLines();

            try {

                for (int i= 0; i < lines; i++) {

                    int offset= fLineTracker.getLineOffset(i);
                    int endOffset= offset + fLineTracker.getLineLength(i);
                    String line= text.substring(offset, endOffset);

                    int position= 0;
                    if (i is 0) {
                        IRegion firstLine= document.getLineInformationOfOffset(command.offset);
                        position= command.offset - firstLine.getOffset();
                    }

                    int length= line.length();
                    for (int j= 0; j < length; j++) {
                        char c= line.charAt(j);
                        if (c is '\t') {
                            position += insertTabString(buffer, position);
                        } else {
                            buffer.append(c);
                            ++ position;
                        }
                    }

                }

                command.text= buffer.toString();

            } catch (BadLocationException x) {
            }
        }
    }
}