1d6124a176326169bc87cb29823ca2dc906689680Tor Norbye/* 2d6124a176326169bc87cb29823ca2dc906689680Tor Norbye * Copyright (C) 2012 The Android Open Source Project 3d6124a176326169bc87cb29823ca2dc906689680Tor Norbye * 4d6124a176326169bc87cb29823ca2dc906689680Tor Norbye * Licensed under the Eclipse Public License, Version 1.0 (the "License"); 5d6124a176326169bc87cb29823ca2dc906689680Tor Norbye * you may not use this file except in compliance with the License. 6d6124a176326169bc87cb29823ca2dc906689680Tor Norbye * You may obtain a copy of the License at 7d6124a176326169bc87cb29823ca2dc906689680Tor Norbye * 8d6124a176326169bc87cb29823ca2dc906689680Tor Norbye * http://www.eclipse.org/org/documents/epl-v10.php 9d6124a176326169bc87cb29823ca2dc906689680Tor Norbye * 10d6124a176326169bc87cb29823ca2dc906689680Tor Norbye * Unless required by applicable law or agreed to in writing, software 11d6124a176326169bc87cb29823ca2dc906689680Tor Norbye * distributed under the License is distributed on an "AS IS" BASIS, 12d6124a176326169bc87cb29823ca2dc906689680Tor Norbye * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d6124a176326169bc87cb29823ca2dc906689680Tor Norbye * See the License for the specific language governing permissions and 14d6124a176326169bc87cb29823ca2dc906689680Tor Norbye * limitations under the License. 15d6124a176326169bc87cb29823ca2dc906689680Tor Norbye */ 16d6124a176326169bc87cb29823ca2dc906689680Tor Norbyepackage com.android.ide.eclipse.adt.internal.lint; 17d6124a176326169bc87cb29823ca2dc906689680Tor Norbye 18d6124a176326169bc87cb29823ca2dc906689680Tor Norbyeimport com.android.ide.eclipse.adt.AdtPlugin; 19d6124a176326169bc87cb29823ca2dc906689680Tor Norbyeimport com.android.tools.lint.checks.TypographyDetector; 20d6124a176326169bc87cb29823ca2dc906689680Tor Norbye 21d6124a176326169bc87cb29823ca2dc906689680Tor Norbyeimport org.eclipse.core.resources.IMarker; 22d6124a176326169bc87cb29823ca2dc906689680Tor Norbyeimport org.eclipse.jface.text.BadLocationException; 23d6124a176326169bc87cb29823ca2dc906689680Tor Norbyeimport org.eclipse.jface.text.IDocument; 24d6124a176326169bc87cb29823ca2dc906689680Tor Norbyeimport org.eclipse.swt.graphics.Image; 25d6124a176326169bc87cb29823ca2dc906689680Tor Norbyeimport org.eclipse.ui.ISharedImages; 26d6124a176326169bc87cb29823ca2dc906689680Tor Norbyeimport org.eclipse.ui.PlatformUI; 27d6124a176326169bc87cb29823ca2dc906689680Tor Norbyeimport org.eclipse.wst.sse.core.internal.provisional.IStructuredModel; 28d6124a176326169bc87cb29823ca2dc906689680Tor Norbyeimport org.eclipse.wst.sse.core.internal.provisional.IndexedRegion; 29d6124a176326169bc87cb29823ca2dc906689680Tor Norbyeimport org.w3c.dom.Element; 30d6124a176326169bc87cb29823ca2dc906689680Tor Norbyeimport org.w3c.dom.Node; 31d6124a176326169bc87cb29823ca2dc906689680Tor Norbyeimport org.w3c.dom.NodeList; 32d6124a176326169bc87cb29823ca2dc906689680Tor Norbye 33d6124a176326169bc87cb29823ca2dc906689680Tor Norbyeimport java.util.List; 34d6124a176326169bc87cb29823ca2dc906689680Tor Norbye 35d6124a176326169bc87cb29823ca2dc906689680Tor Norbye@SuppressWarnings("restriction") // DOM model 36d6124a176326169bc87cb29823ca2dc906689680Tor Norbyefinal class TypographyFix extends DocumentFix { 37d6124a176326169bc87cb29823ca2dc906689680Tor Norbye private TypographyFix(String id, IMarker marker) { 38d6124a176326169bc87cb29823ca2dc906689680Tor Norbye super(id, marker); 39d6124a176326169bc87cb29823ca2dc906689680Tor Norbye } 40d6124a176326169bc87cb29823ca2dc906689680Tor Norbye 41d6124a176326169bc87cb29823ca2dc906689680Tor Norbye @Override 42d6124a176326169bc87cb29823ca2dc906689680Tor Norbye public boolean needsFocus() { 43d6124a176326169bc87cb29823ca2dc906689680Tor Norbye return false; 44d6124a176326169bc87cb29823ca2dc906689680Tor Norbye } 45d6124a176326169bc87cb29823ca2dc906689680Tor Norbye 46d6124a176326169bc87cb29823ca2dc906689680Tor Norbye @Override 47d6124a176326169bc87cb29823ca2dc906689680Tor Norbye public boolean isCancelable() { 48d6124a176326169bc87cb29823ca2dc906689680Tor Norbye return false; 49d6124a176326169bc87cb29823ca2dc906689680Tor Norbye } 50d6124a176326169bc87cb29823ca2dc906689680Tor Norbye 51d6124a176326169bc87cb29823ca2dc906689680Tor Norbye @Override 52d6124a176326169bc87cb29823ca2dc906689680Tor Norbye public boolean isBulkCapable() { 53d6124a176326169bc87cb29823ca2dc906689680Tor Norbye return false; 54d6124a176326169bc87cb29823ca2dc906689680Tor Norbye } 55d6124a176326169bc87cb29823ca2dc906689680Tor Norbye 56d6124a176326169bc87cb29823ca2dc906689680Tor Norbye @Override 57d6124a176326169bc87cb29823ca2dc906689680Tor Norbye protected void apply(IDocument document, IStructuredModel model, Node node, int start, 58d6124a176326169bc87cb29823ca2dc906689680Tor Norbye int end) { 59d6124a176326169bc87cb29823ca2dc906689680Tor Norbye if (node instanceof Element) { 60d6124a176326169bc87cb29823ca2dc906689680Tor Norbye Element element = (Element) node; 61d6124a176326169bc87cb29823ca2dc906689680Tor Norbye // Find the text node which contains the character in question 62d6124a176326169bc87cb29823ca2dc906689680Tor Norbye NodeList childNodes = element.getChildNodes(); 63d6124a176326169bc87cb29823ca2dc906689680Tor Norbye for (int i = 0, n = childNodes.getLength(); i < n; i++) { 64d6124a176326169bc87cb29823ca2dc906689680Tor Norbye Node child = childNodes.item(i); 65d6124a176326169bc87cb29823ca2dc906689680Tor Norbye if (child.getNodeType() == Node.TEXT_NODE) { 66d6124a176326169bc87cb29823ca2dc906689680Tor Norbye IndexedRegion region = (IndexedRegion) child; 67d6124a176326169bc87cb29823ca2dc906689680Tor Norbye String message = mMarker.getAttribute(IMarker.MESSAGE, ""); 68d6124a176326169bc87cb29823ca2dc906689680Tor Norbye List<TypographyDetector.ReplaceEdit> edits = 69d6124a176326169bc87cb29823ca2dc906689680Tor Norbye TypographyDetector.getEdits(mId, message, child); 70d6124a176326169bc87cb29823ca2dc906689680Tor Norbye for (TypographyDetector.ReplaceEdit edit : edits) { 71d6124a176326169bc87cb29823ca2dc906689680Tor Norbye try { 72d6124a176326169bc87cb29823ca2dc906689680Tor Norbye document.replace(edit.offset + region.getStartOffset(), 73d6124a176326169bc87cb29823ca2dc906689680Tor Norbye edit.length, edit.replaceWith); 74d6124a176326169bc87cb29823ca2dc906689680Tor Norbye } catch (BadLocationException e) { 75d6124a176326169bc87cb29823ca2dc906689680Tor Norbye AdtPlugin.log(e, null); 76d6124a176326169bc87cb29823ca2dc906689680Tor Norbye } 77d6124a176326169bc87cb29823ca2dc906689680Tor Norbye } 78d6124a176326169bc87cb29823ca2dc906689680Tor Norbye } 79d6124a176326169bc87cb29823ca2dc906689680Tor Norbye } 80d6124a176326169bc87cb29823ca2dc906689680Tor Norbye } 81d6124a176326169bc87cb29823ca2dc906689680Tor Norbye } 82d6124a176326169bc87cb29823ca2dc906689680Tor Norbye 83d6124a176326169bc87cb29823ca2dc906689680Tor Norbye @Override 84d6124a176326169bc87cb29823ca2dc906689680Tor Norbye public String getDisplayString() { 85d6124a176326169bc87cb29823ca2dc906689680Tor Norbye return "Replace with suggested characters"; 86d6124a176326169bc87cb29823ca2dc906689680Tor Norbye } 87d6124a176326169bc87cb29823ca2dc906689680Tor Norbye 88d6124a176326169bc87cb29823ca2dc906689680Tor Norbye @Override 89d6124a176326169bc87cb29823ca2dc906689680Tor Norbye public Image getImage() { 90d6124a176326169bc87cb29823ca2dc906689680Tor Norbye ISharedImages sharedImages = PlatformUI.getWorkbench().getSharedImages(); 91d6124a176326169bc87cb29823ca2dc906689680Tor Norbye // TODO: Need a better icon here 92d6124a176326169bc87cb29823ca2dc906689680Tor Norbye return sharedImages.getImage(ISharedImages.IMG_OBJ_ELEMENT); 93d6124a176326169bc87cb29823ca2dc906689680Tor Norbye } 94d6124a176326169bc87cb29823ca2dc906689680Tor Norbye}