blob: 08209ebbab4770405498849286a6aa5c6720401c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004 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:
* Luzius Meisser - initial implementation
*******************************************************************************/
package org.eclipse.ajdt.core.codeconversion;
import java.util.ArrayList;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jdt.core.BufferChangedEvent;
import org.eclipse.jdt.core.IBuffer;
import org.eclipse.jdt.core.IBufferChangedListener;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IOpenable;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.internal.core.DocumentAdapter;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
/**
* This Wrapper forwards changes to the real buffer, but
* reads contents from a fake buffer.
* Purpose: to make jdt operations like "organize imports" produce reasonable
* results for .aj files.
*
* @author Luzius Meisser
*
*/
public class JavaCompatibleBuffer implements IBuffer, IBufferChangedListener{
private IBuffer realBuffer;
private IBuffer fakeBuffer;
private ArrayList insertionTable;
private boolean upToDate = false;
private ConversionOptions conversionOptions = ConversionOptions.STANDARD;
public JavaCompatibleBuffer(IBuffer real, IBuffer fake){
realBuffer = real;
fakeBuffer = fake;
real.addBufferChangedListener(this);
}
public void reinitialize(IBuffer buf){
if (buf != realBuffer){
realBuffer = buf;
realBuffer.addBufferChangedListener(this);
upToDate = false;
}
}
public void close() {
}
public char getChar(int position) {
ensureUpToDate();
return fakeBuffer.getChar(position);
}
public char[] getCharacters() {
ensureUpToDate();
return fakeBuffer.getCharacters();
}
public String getContents() {
ensureUpToDate();
return fakeBuffer.getContents();
}
public int getLength() {
ensureUpToDate();
return fakeBuffer.getLength();
}
public String getText(int offset, int length) {
ensureUpToDate();
return fakeBuffer.getText(offset, length);
}
public String toString() {
ensureUpToDate();
return fakeBuffer.toString();
}
public void addBufferChangedListener(IBufferChangedListener listener) {
realBuffer.addBufferChangedListener(listener);
}
public void append(char[] text) {
realBuffer.append(text);
}
public void append(String text) {
realBuffer.append(text);
}
public boolean equals(Object obj) {
return realBuffer.equals(obj);
}
public IOpenable getOwner() {
return realBuffer.getOwner();
}
public IResource getUnderlyingResource() {
return realBuffer.getUnderlyingResource();
}
public int hashCode() {
return realBuffer.hashCode();
}
public boolean hasUnsavedChanges() {
return realBuffer.hasUnsavedChanges();
}
public boolean isClosed() {
return realBuffer.isClosed();
}
public boolean isReadOnly() {
return realBuffer.isReadOnly();
}
public void removeBufferChangedListener(IBufferChangedListener listener) {
realBuffer.removeBufferChangedListener(listener);
}
public void replace(int position, int length, char[] text) {
position = translatePositionToReal(position);
if (position != -1)
realBuffer.replace(position, length, text);
}
public void replace(int position, int length, String text) {
position = translatePositionToReal(position);
if (position != -1)
realBuffer.replace(position, length, text);
}
public void save(IProgressMonitor progress, boolean force)
throws JavaModelException {
realBuffer.save(progress, force);
}
public void setContents(char[] contents) {
realBuffer.setContents(contents);
}
public void setContents(String contents) {
realBuffer.setContents(contents);
}
private void ensureUpToDate(){
if (!upToDate){
fakeBuffer.setContents((char[])realBuffer.getCharacters().clone());
AspectsConvertingParser conv = new AspectsConvertingParser((char[])realBuffer.getCharacters().clone());
IOpenable owner = getOwner();
if (owner instanceof ICompilationUnit) {
conv.setUnit((ICompilationUnit) owner);
}
insertionTable = conv.convert(conversionOptions);
fakeBuffer.setContents(conv.content);
upToDate = true;
}
}
public int translatePositionToReal(int pos){
this.ensureUpToDate();
return AspectsConvertingParser.translatePositionToBeforeChanges(pos, insertionTable);
}
public int translatePositionToFake(int pos){
this.ensureUpToDate();
return AspectsConvertingParser.translatePositionToAfterChanges(pos, insertionTable);
}
/* (non-Javadoc)
* @see org.eclipse.jdt.core.IBufferChangedListener#bufferChanged(org.eclipse.jdt.core.BufferChangedEvent)
*/
public void bufferChanged(BufferChangedEvent event) {
if (realBuffer.isClosed())
fakeBuffer.close();
upToDate = false;
}
public ConversionOptions getConversionOptions() {
return conversionOptions;
}
public void setConversionOptions(ConversionOptions conversionOptions) {
this.conversionOptions = conversionOptions;
upToDate = false;
}
public IBuffer getRealBuffer() {
return realBuffer;
}
}