/******************************************************************************* * Copyright 2011 Google Inc. All Rights Reserved. * * 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 * * 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 com.gwtplugins.gwt.eclipse.gss; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; import org.eclipse.wst.css.core.internal.modelhandler.CSSModelLoader; import org.eclipse.wst.css.core.internal.provisional.document.ICSSDocument; import org.eclipse.wst.css.core.internal.provisional.document.ICSSModel; import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument; import com.gwtplugins.gwt.eclipse.gss.model.GssResourceAwareModelRepairer; /** * Extracts a block of CSS from a document (can be any {@link IDocument} * implementation) and generates a CSS model and its associated documents. */ @SuppressWarnings("restriction") public class GssExtractor { /** * Extracts a CSS block from a document and creates the CSS model and * documents. * <p> * This requires a model loader to create the model, instead of taking in an * empty model. The reason is, there are multiple ways to create a model, but * we need a way that also creates the associated documents. The model loader * is guaranteed to do this, which is why we specifically take this as a * parameter. * * @param cssModelLoader a model loader used to create the empty model (see * {@link com.google.gwt.eclipse.core.uibinder.sse.css.model.CssResourceAwareModelLoader} * ) * @return a container for the model and associated documents, or null if it * could not be successfully extracted */ public static GssExtractor extract(IDocument document, int offset, int length, CSSModelLoader cssModelLoader) { try { String cssBlock = document.get(offset, length); return extract(cssBlock, cssModelLoader); } catch (BadLocationException e) { // Likely not to happen, but in case it does, return null return null; } } /** * @see #extract(IDocument, int, int, CSSModelLoader) */ public static GssExtractor extract(String cssBlock, CSSModelLoader cssModelLoader) { // Create an empty model, and its associated documents ICSSModel model = (ICSSModel) cssModelLoader.createModel(); ICSSDocument cssDocument = model.getDocument(); IStructuredDocument structuredDocument = model.getStructuredDocument(); // Copy the contents structuredDocument.set(cssBlock); // Fix CSS Resource custom at-rules GssResourceAwareModelRepairer modelRepairer = new GssResourceAwareModelRepairer( structuredDocument, model); modelRepairer.repair(); return new GssExtractor(cssDocument, structuredDocument, model); } private final ICSSDocument cssDocument; private final IStructuredDocument structuredDocument; private final ICSSModel cssModel; private GssExtractor(ICSSDocument cssDocument, IStructuredDocument structuredDocument, ICSSModel cssModel) { this.cssDocument = cssDocument; this.structuredDocument = structuredDocument; this.cssModel = cssModel; } public ICSSDocument getCssDocument() { return cssDocument; } public ICSSModel getCssModel() { return cssModel; } public IStructuredDocument getStructuredDocument() { return structuredDocument; } }