ConvertToDpFix.java revision 12d4581faa6438941e65a9dc83213be34c6ca970
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 1812d4581faa6438941e65a9dc83213be34c6ca970Tor Norbyeimport static com.android.SdkConstants.VALUE_N_DP; 19d6124a176326169bc87cb29823ca2dc906689680Tor Norbye 20d6124a176326169bc87cb29823ca2dc906689680Tor Norbyeimport com.android.ide.eclipse.adt.AdtPlugin; 21d6124a176326169bc87cb29823ca2dc906689680Tor Norbye 22d6124a176326169bc87cb29823ca2dc906689680Tor Norbyeimport org.eclipse.core.resources.IMarker; 23d6124a176326169bc87cb29823ca2dc906689680Tor Norbyeimport org.eclipse.jface.dialogs.IInputValidator; 24d6124a176326169bc87cb29823ca2dc906689680Tor Norbyeimport org.eclipse.jface.text.IDocument; 25d6124a176326169bc87cb29823ca2dc906689680Tor Norbyeimport org.eclipse.jface.window.Window; 26d6124a176326169bc87cb29823ca2dc906689680Tor Norbyeimport org.eclipse.swt.graphics.Image; 27d6124a176326169bc87cb29823ca2dc906689680Tor Norbyeimport org.eclipse.swt.widgets.Shell; 28d6124a176326169bc87cb29823ca2dc906689680Tor Norbyeimport org.eclipse.wst.sse.core.internal.provisional.IStructuredModel; 29d6124a176326169bc87cb29823ca2dc906689680Tor Norbyeimport org.w3c.dom.Attr; 30d6124a176326169bc87cb29823ca2dc906689680Tor Norbyeimport org.w3c.dom.Element; 31d6124a176326169bc87cb29823ca2dc906689680Tor Norbyeimport org.w3c.dom.NamedNodeMap; 32d6124a176326169bc87cb29823ca2dc906689680Tor Norbyeimport org.w3c.dom.Node; 33d6124a176326169bc87cb29823ca2dc906689680Tor Norbye 34d6124a176326169bc87cb29823ca2dc906689680Tor Norbyeimport java.util.regex.Matcher; 35d6124a176326169bc87cb29823ca2dc906689680Tor Norbyeimport java.util.regex.Pattern; 36d6124a176326169bc87cb29823ca2dc906689680Tor Norbye 37d6124a176326169bc87cb29823ca2dc906689680Tor Norbye@SuppressWarnings("restriction") // DOM model 38d6124a176326169bc87cb29823ca2dc906689680Tor Norbyefinal class ConvertToDpFix extends DocumentFix implements IInputValidator { 39d6124a176326169bc87cb29823ca2dc906689680Tor Norbye private ConvertToDpFix(String id, IMarker marker) { 40d6124a176326169bc87cb29823ca2dc906689680Tor Norbye super(id, marker); 41d6124a176326169bc87cb29823ca2dc906689680Tor Norbye } 42d6124a176326169bc87cb29823ca2dc906689680Tor Norbye 43d6124a176326169bc87cb29823ca2dc906689680Tor Norbye @Override 44d6124a176326169bc87cb29823ca2dc906689680Tor Norbye public boolean needsFocus() { 45d6124a176326169bc87cb29823ca2dc906689680Tor Norbye return false; 46d6124a176326169bc87cb29823ca2dc906689680Tor Norbye } 47d6124a176326169bc87cb29823ca2dc906689680Tor Norbye 48d6124a176326169bc87cb29823ca2dc906689680Tor Norbye @Override 49d6124a176326169bc87cb29823ca2dc906689680Tor Norbye public boolean isCancelable() { 50d6124a176326169bc87cb29823ca2dc906689680Tor Norbye return true; 51d6124a176326169bc87cb29823ca2dc906689680Tor Norbye } 52d6124a176326169bc87cb29823ca2dc906689680Tor Norbye 53d6124a176326169bc87cb29823ca2dc906689680Tor Norbye @Override 54d6124a176326169bc87cb29823ca2dc906689680Tor Norbye protected void apply(IDocument document, IStructuredModel model, Node node, int start, 55d6124a176326169bc87cb29823ca2dc906689680Tor Norbye int end) { 56d6124a176326169bc87cb29823ca2dc906689680Tor Norbye Shell shell = AdtPlugin.getDisplay().getActiveShell(); 57d6124a176326169bc87cb29823ca2dc906689680Tor Norbye InputDensityDialog densityDialog = new InputDensityDialog(shell); 58d6124a176326169bc87cb29823ca2dc906689680Tor Norbye if (densityDialog.open() == Window.OK) { 59d6124a176326169bc87cb29823ca2dc906689680Tor Norbye int dpi = densityDialog.getDensity(); 60d6124a176326169bc87cb29823ca2dc906689680Tor Norbye Element element = (Element) node; 61d6124a176326169bc87cb29823ca2dc906689680Tor Norbye Pattern pattern = Pattern.compile("(\\d+)px"); //$NON-NLS-1$ 62d6124a176326169bc87cb29823ca2dc906689680Tor Norbye NamedNodeMap attributes = element.getAttributes(); 63d6124a176326169bc87cb29823ca2dc906689680Tor Norbye for (int i = 0, n = attributes.getLength(); i < n; i++) { 64d6124a176326169bc87cb29823ca2dc906689680Tor Norbye Attr attribute = (Attr) attributes.item(i); 65d6124a176326169bc87cb29823ca2dc906689680Tor Norbye String value = attribute.getValue(); 66d6124a176326169bc87cb29823ca2dc906689680Tor Norbye if (value.endsWith("px")) { 67d6124a176326169bc87cb29823ca2dc906689680Tor Norbye Matcher matcher = pattern.matcher(value); 68d6124a176326169bc87cb29823ca2dc906689680Tor Norbye if (matcher.matches()) { 69d6124a176326169bc87cb29823ca2dc906689680Tor Norbye String numberString = matcher.group(1); 70d6124a176326169bc87cb29823ca2dc906689680Tor Norbye try { 71d6124a176326169bc87cb29823ca2dc906689680Tor Norbye int px = Integer.parseInt(numberString); 72d6124a176326169bc87cb29823ca2dc906689680Tor Norbye int dp = px * 160 / dpi; 73d6124a176326169bc87cb29823ca2dc906689680Tor Norbye String newValue = String.format(VALUE_N_DP, dp); 74d6124a176326169bc87cb29823ca2dc906689680Tor Norbye attribute.setNodeValue(newValue); 75d6124a176326169bc87cb29823ca2dc906689680Tor Norbye } catch (NumberFormatException nufe) { 76d6124a176326169bc87cb29823ca2dc906689680Tor Norbye AdtPlugin.log(nufe, null); 77d6124a176326169bc87cb29823ca2dc906689680Tor Norbye } 78d6124a176326169bc87cb29823ca2dc906689680Tor Norbye } 79d6124a176326169bc87cb29823ca2dc906689680Tor Norbye } 80d6124a176326169bc87cb29823ca2dc906689680Tor Norbye } 81d6124a176326169bc87cb29823ca2dc906689680Tor Norbye } 82d6124a176326169bc87cb29823ca2dc906689680Tor Norbye } 83d6124a176326169bc87cb29823ca2dc906689680Tor Norbye 84d6124a176326169bc87cb29823ca2dc906689680Tor Norbye @Override 85d6124a176326169bc87cb29823ca2dc906689680Tor Norbye public String getDisplayString() { 86d6124a176326169bc87cb29823ca2dc906689680Tor Norbye return "Convert to \"dp\"..."; 87d6124a176326169bc87cb29823ca2dc906689680Tor Norbye } 88d6124a176326169bc87cb29823ca2dc906689680Tor Norbye 89d6124a176326169bc87cb29823ca2dc906689680Tor Norbye @Override 90d6124a176326169bc87cb29823ca2dc906689680Tor Norbye public Image getImage() { 91d6124a176326169bc87cb29823ca2dc906689680Tor Norbye return AdtPlugin.getAndroidLogo(); 92d6124a176326169bc87cb29823ca2dc906689680Tor Norbye } 93d6124a176326169bc87cb29823ca2dc906689680Tor Norbye 94d6124a176326169bc87cb29823ca2dc906689680Tor Norbye // ---- Implements IInputValidator ---- 95d6124a176326169bc87cb29823ca2dc906689680Tor Norbye 96d6124a176326169bc87cb29823ca2dc906689680Tor Norbye @Override 97d6124a176326169bc87cb29823ca2dc906689680Tor Norbye public String isValid(String input) { 98d6124a176326169bc87cb29823ca2dc906689680Tor Norbye if (input == null || input.length() == 0) 99d6124a176326169bc87cb29823ca2dc906689680Tor Norbye return " "; //$NON-NLS-1$ 100d6124a176326169bc87cb29823ca2dc906689680Tor Norbye 101d6124a176326169bc87cb29823ca2dc906689680Tor Norbye try { 102d6124a176326169bc87cb29823ca2dc906689680Tor Norbye int i = Integer.parseInt(input); 103d6124a176326169bc87cb29823ca2dc906689680Tor Norbye if (i <= 0 || i > 1000) { 104d6124a176326169bc87cb29823ca2dc906689680Tor Norbye return "Invalid range"; 105d6124a176326169bc87cb29823ca2dc906689680Tor Norbye } 106d6124a176326169bc87cb29823ca2dc906689680Tor Norbye } catch (NumberFormatException x) { 107d6124a176326169bc87cb29823ca2dc906689680Tor Norbye return "Enter a valid number"; 108d6124a176326169bc87cb29823ca2dc906689680Tor Norbye } 109d6124a176326169bc87cb29823ca2dc906689680Tor Norbye 110d6124a176326169bc87cb29823ca2dc906689680Tor Norbye return null; 111d6124a176326169bc87cb29823ca2dc906689680Tor Norbye } 11212d4581faa6438941e65a9dc83213be34c6ca970Tor Norbye} 113