| /* |
| * Copyright (C) 2012 The Android Open Source Project |
| * |
| * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php |
| * |
| * 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.android.ide.eclipse.adt.internal.editors; |
| |
| import static com.android.SdkConstants.PREFIX_RESOURCE_REF; |
| import static com.android.SdkConstants.PREFIX_THEME_REF; |
| |
| import org.eclipse.swt.graphics.Point; |
| import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext; |
| import org.eclipse.wst.xml.ui.internal.doubleclick.XMLDoubleClickStrategy; |
| |
| /** |
| * Custom version of {@link XMLDoubleClickStrategy} which is smarter about |
| * selecting portions of resource references, etc. |
| */ |
| @SuppressWarnings("restriction") // XML API |
| public class AndroidDoubleClickStrategy extends XMLDoubleClickStrategy { |
| /** |
| * Creates a new {@linkplain AndroidDoubleClickStrategy} |
| */ |
| public AndroidDoubleClickStrategy() { |
| } |
| |
| @Override |
| protected void processElementDoubleClicked() { |
| // Special case: if you click on the local name portion of an attribute pair, |
| // select only the local name. For example, if you click anywhere in the "text" region |
| // of "android:text", select just the "text" portion. |
| if (fTextRegion.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) { |
| String regionText = fStructuredDocumentRegion.getText(fTextRegion); |
| int cursor = fCaretPosition - fStructuredDocumentRegion.getStartOffset(fTextRegion); |
| int ns = regionText.indexOf(':'); |
| if (cursor > ns) { |
| int start = ns + 1; |
| fTextViewer.setSelectedRange(fStructuredDocumentRegion.getStartOffset(fTextRegion) |
| + start, fTextRegion.getTextLength() - start); |
| return; |
| } |
| } |
| |
| super.processElementDoubleClicked(); |
| } |
| |
| @Override |
| protected Point getWord(String string, int cursor) { |
| if (string == null) { |
| return null; |
| } |
| |
| // Default implementation will strip off the surrounding quotes etc: |
| Point position = super.getWord(string, cursor); |
| |
| assert cursor >= position.x && cursor <= position.y; |
| |
| // Special case: when you click on a resource identifier name, only select the |
| // name portion |
| if (string.startsWith(PREFIX_RESOURCE_REF, position.x) || |
| string.startsWith(PREFIX_THEME_REF, position.x)) { |
| int nameStart = string.indexOf('/', position.x + 1); |
| if (nameStart != -1 && nameStart < cursor) { |
| position.x = nameStart + 1; |
| return position; |
| } |
| } |
| |
| // Special case: when you have a dotted name, such as com.android.tools.MyClass, |
| // and you click on the last part, select only that part |
| int lastDot = string.lastIndexOf('.', cursor); |
| if (lastDot >= position.x && lastDot < position.y - 1) { |
| int next = string.indexOf('.', cursor); |
| if (next == -1 || next > position.y) { |
| position.x = lastDot + 1; |
| } |
| } |
| |
| return position; |
| } |
| } |