/* * Copyright 2010 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.drools.eclipse.dsl.editor; import org.eclipse.jface.text.AbstractDocument; import org.eclipse.jface.text.DefaultLineTracker; import org.eclipse.jface.text.DocumentEvent; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IDocumentListener; import org.eclipse.jface.text.ITextStore; /** * A document that transforms the input of the original document * to something else. Changing something in this document will * NOT change the original document (as the transformation is only * defined in one way). All changes will also be overridden as soon * as the original document changes. */ public abstract class TransformedDocument extends AbstractDocument { private IDocument parentDocument; private boolean changed = true; public TransformedDocument(IDocument parentDocument) { this.parentDocument = parentDocument; parentDocument.addDocumentListener(new IDocumentListener() { public void documentAboutToBeChanged(DocumentEvent event) { // Do nothing } public void documentChanged(DocumentEvent event) { changed = true; } }); setTextStore(new StringTextStore()); setLineTracker(new DefaultLineTracker()); completeInitialization(); } /** * Always check that the store is up-to-date. * All read operations access the store so this method makes sure * that the document is updated whenever necessary. */ protected ITextStore getStore() { if (changed) { update(); } return super.getStore(); } private void update() { String translation = transformInput(parentDocument.get()); super.getStore().set(translation); getTracker().set(translation); changed = false; } /** * Transforms the original content of the document. */ protected abstract String transformInput(String content); /** * Default text store. */ private static class StringTextStore implements ITextStore { private String fContent; public StringTextStore() { } public char get(int offset) { return fContent.charAt(offset); } public String get(int offset, int length) { return fContent.substring(offset, offset + length); } public int getLength() { return fContent.length(); } public void replace(int offset, int length, String text) { } public void set(String text) { this.fContent = text; } } }