diff options
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/MarqueeGesture.java')
-rw-r--r-- | eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/MarqueeGesture.java | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/MarqueeGesture.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/MarqueeGesture.java new file mode 100644 index 000000000..4cfd4fe3d --- /dev/null +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/MarqueeGesture.java @@ -0,0 +1,160 @@ +/* + * Copyright (C) 2010 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.layout.gle2; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.Device; +import org.eclipse.swt.graphics.GC; +import org.eclipse.swt.graphics.Rectangle; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +/** + * A {@link MarqueeGesture} is a gesture for swiping out a selection rectangle. + * With a modifier key, items that intersect the rectangle can be toggled + * instead of added to the new selection set. + */ +public class MarqueeGesture extends Gesture { + /** The {@link Overlay} drawn for the marquee. */ + private MarqueeOverlay mOverlay; + + /** The canvas associated with this gesture. */ + private LayoutCanvas mCanvas; + + /** A copy of the initial selection, when we're toggling the marquee. */ + private Collection<CanvasViewInfo> mInitialSelection; + + /** + * Creates a new marquee selection (selection swiping). + * + * @param canvas The canvas where selection is performed. + * @param toggle If true, toggle the membership of contained elements + * instead of adding it. + */ + public MarqueeGesture(LayoutCanvas canvas, boolean toggle) { + mCanvas = canvas; + + if (toggle) { + List<SelectionItem> selection = canvas.getSelectionManager().getSelections(); + mInitialSelection = new ArrayList<CanvasViewInfo>(selection.size()); + for (SelectionItem item : selection) { + mInitialSelection.add(item.getViewInfo()); + } + } else { + mInitialSelection = Collections.emptySet(); + } + } + + @Override + public void update(ControlPoint pos) { + if (mOverlay == null) { + return; + } + + int x = Math.min(pos.x, mStart.x); + int y = Math.min(pos.y, mStart.y); + int w = Math.abs(pos.x - mStart.x); + int h = Math.abs(pos.y - mStart.y); + + mOverlay.updateSize(x, y, w, h); + + // Compute selection overlaps + LayoutPoint topLeft = ControlPoint.create(mCanvas, x, y).toLayout(); + LayoutPoint bottomRight = ControlPoint.create(mCanvas, x + w, y + h).toLayout(); + mCanvas.getSelectionManager().selectWithin(topLeft, bottomRight, mInitialSelection); + } + + @Override + public List<Overlay> createOverlays() { + mOverlay = new MarqueeOverlay(); + return Collections.<Overlay> singletonList(mOverlay); + } + + /** + * An {@link Overlay} for the {@link MarqueeGesture}; paints a selection + * overlay rectangle matching the mouse coordinate delta between gesture + * start and the current position. + */ + private static class MarqueeOverlay extends Overlay { + /** Rectangle border color. */ + private Color mStroke; + + /** Rectangle fill color. */ + private Color mFill; + + /** Current rectangle coordinates (in terms of control coordinates). */ + private Rectangle mRectangle = new Rectangle(0, 0, 0, 0); + + /** Alpha value of the fill. */ + private int mFillAlpha; + + /** Alpha value of the border. */ + private int mStrokeAlpha; + + /** Constructs a new {@link MarqueeOverlay}. */ + public MarqueeOverlay() { + } + + /** + * Updates the size of the marquee rectangle. + * + * @param x The top left corner of the rectangle, x coordinate. + * @param y The top left corner of the rectangle, y coordinate. + * @param w Rectangle width. + * @param h Rectangle height. + */ + public void updateSize(int x, int y, int w, int h) { + mRectangle.x = x; + mRectangle.y = y; + mRectangle.width = w; + mRectangle.height = h; + } + + @Override + public void create(Device device) { + // TODO: Integrate DrawingStyles with this? + mStroke = new Color(device, 255, 255, 255); + mFill = new Color(device, 128, 128, 128); + mFillAlpha = 64; + mStrokeAlpha = 255; + } + + @Override + public void dispose() { + mStroke.dispose(); + mFill.dispose(); + } + + @Override + public void paint(GC gc) { + if (mRectangle.width > 0 && mRectangle.height > 0) { + gc.setLineStyle(SWT.LINE_SOLID); + gc.setLineWidth(1); + gc.setForeground(mStroke); + gc.setBackground(mFill); + gc.setAlpha(mStrokeAlpha); + gc.drawRectangle(mRectangle); + gc.setAlpha(mFillAlpha); + gc.fillRectangle(mRectangle); + } + } + } +} |