am 5837c3cc: ADT: Tag classes with "@since GLE1"
Merge commit '5837c3cc34e1408781479ea1c4d77260de288647' * commit '5837c3cc34e1408781479ea1c4d77260de288647': ADT: Tag classes with "@since GLE1"
This commit is contained in:
@@ -30,7 +30,9 @@ import org.eclipse.ui.PartInitException;
|
||||
import org.eclipse.ui.part.EditorPart;
|
||||
|
||||
/**
|
||||
* Graphical layout editor, version 2.
|
||||
* Graphical layout editor part, version 2.
|
||||
*
|
||||
* @since GLE2
|
||||
*/
|
||||
public class GLE2 extends EditorPart implements IGraphicalLayoutEditor {
|
||||
|
||||
|
||||
@@ -111,6 +111,8 @@ import java.util.Map;
|
||||
* To understand GEF: http://www.ibm.com/developerworks/opensource/library/os-gef/
|
||||
* <p/>
|
||||
* To understand Drag'n'drop: http://www.eclipse.org/articles/Article-Workbench-DND/drag_drop.html
|
||||
*
|
||||
* @since GLE1
|
||||
*/
|
||||
public class GraphicalLayoutEditor extends GraphicalEditorWithPalette
|
||||
implements IGraphicalLayoutEditor, IConfigListener {
|
||||
|
||||
@@ -28,6 +28,8 @@ import org.eclipse.ui.IEditorPart;
|
||||
|
||||
/**
|
||||
* Interface defining what {@link LayoutEditor} expects from a GraphicalLayoutEditor part.
|
||||
*
|
||||
* @since GLE2
|
||||
*/
|
||||
/*package*/ interface IGraphicalLayoutEditor extends IEditorPart, ILayoutReloadListener {
|
||||
|
||||
|
||||
@@ -28,6 +28,8 @@ import java.util.List;
|
||||
|
||||
/**
|
||||
* Factory that creates the palette for the {@link GraphicalLayoutEditor}.
|
||||
*
|
||||
* @since GLE1
|
||||
*/
|
||||
public class PaletteFactory {
|
||||
|
||||
@@ -37,7 +39,7 @@ public class PaletteFactory {
|
||||
|
||||
public static PaletteRoot createPaletteRoot(PaletteRoot currentPalette,
|
||||
AndroidTargetData targetData) {
|
||||
|
||||
|
||||
if (currentPalette == null) {
|
||||
currentPalette = new PaletteRoot();
|
||||
}
|
||||
@@ -45,7 +47,7 @@ public class PaletteFactory {
|
||||
for (int n = currentPalette.getChildren().size() - 1; n >= 0; n--) {
|
||||
currentPalette.getChildren().remove(n);
|
||||
}
|
||||
|
||||
|
||||
if (targetData != null) {
|
||||
addTools(currentPalette);
|
||||
addViews(currentPalette, "Layouts",
|
||||
@@ -59,7 +61,7 @@ public class PaletteFactory {
|
||||
|
||||
private static void addTools(PaletteRoot paletteRoot) {
|
||||
PaletteGroup group = new PaletteGroup("Tools");
|
||||
|
||||
|
||||
// Default tools: selection.
|
||||
// Do not use the MarqueeToolEntry since we don't support multiple selection.
|
||||
/* -- Do not put the selection tool. It's the unique tool so it looks useless.
|
||||
@@ -75,7 +77,7 @@ public class PaletteFactory {
|
||||
private static void addViews(PaletteRoot paletteRoot, String groupName,
|
||||
List<ElementDescriptor> descriptors) {
|
||||
PaletteDrawer group = new PaletteDrawer(groupName);
|
||||
|
||||
|
||||
for (ElementDescriptor desc : descriptors) {
|
||||
PaletteTemplateEntry entry = new PaletteTemplateEntry(
|
||||
desc.getUiName(), // label
|
||||
@@ -84,10 +86,10 @@ public class PaletteFactory {
|
||||
desc.getImageDescriptor(), // small icon
|
||||
desc.getImageDescriptor() // large icon
|
||||
);
|
||||
|
||||
|
||||
group.add(entry);
|
||||
}
|
||||
|
||||
|
||||
paletteRoot.add(group);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -67,6 +67,8 @@ import java.util.List;
|
||||
|
||||
/**
|
||||
* Implementation of the {@link ContentOutlinePage} to display {@link UiElementNode}.
|
||||
*
|
||||
* @since GLE1
|
||||
*/
|
||||
class UiContentOutlinePage extends ContentOutlinePage {
|
||||
|
||||
|
||||
@@ -35,10 +35,12 @@ import org.eclipse.ui.views.properties.PropertySheetPage;
|
||||
* A customized property sheet page for the graphical layout editor.
|
||||
* <p/>
|
||||
* Currently it just provides a custom tooltip to display attributes javadocs.
|
||||
*
|
||||
* @since GLE1
|
||||
*/
|
||||
public class UiPropertySheetPage extends PropertySheetPage {
|
||||
|
||||
|
||||
|
||||
public UiPropertySheetPage() {
|
||||
super();
|
||||
}
|
||||
@@ -46,7 +48,7 @@ public class UiPropertySheetPage extends PropertySheetPage {
|
||||
@Override
|
||||
public void createControl(Composite parent) {
|
||||
super.createControl(parent);
|
||||
|
||||
|
||||
setupTooltip();
|
||||
}
|
||||
|
||||
@@ -59,14 +61,14 @@ public class UiPropertySheetPage extends PropertySheetPage {
|
||||
final Tree tree = (Tree) getControl();
|
||||
|
||||
/*
|
||||
* Reference:
|
||||
* Reference:
|
||||
* http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet125.java?view=markup
|
||||
*/
|
||||
|
||||
final Listener listener = new Listener() {
|
||||
Shell tip = null;
|
||||
Label label = null;
|
||||
|
||||
|
||||
public void handleEvent(Event event) {
|
||||
switch(event.type) {
|
||||
case SWT.Dispose:
|
||||
@@ -88,7 +90,7 @@ public class UiPropertySheetPage extends PropertySheetPage {
|
||||
}
|
||||
|
||||
String tooltip = null;
|
||||
|
||||
|
||||
TreeItem item = tree.getItem(new Point(event.x, event.y));
|
||||
if (item != null) {
|
||||
Object data = item.getData();
|
||||
@@ -102,11 +104,11 @@ public class UiPropertySheetPage extends PropertySheetPage {
|
||||
tooltip = item.getText() + ":\r" + tooltip;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (tooltip != null) {
|
||||
Shell shell = tree.getShell();
|
||||
Display display = tree.getDisplay();
|
||||
|
||||
|
||||
tip = new Shell(shell, SWT.ON_TOP | SWT.NO_FOCUS | SWT.TOOL);
|
||||
tip.setBackground(display .getSystemColor(SWT.COLOR_INFO_BACKGROUND));
|
||||
FillLayout layout = new FillLayout();
|
||||
@@ -128,7 +130,7 @@ public class UiPropertySheetPage extends PropertySheetPage {
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
tree.addListener(SWT.Dispose, listener);
|
||||
tree.addListener(SWT.KeyDown, listener);
|
||||
tree.addListener(SWT.MouseMove, listener);
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* 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
|
||||
@@ -35,6 +35,8 @@ import java.util.Map.Entry;
|
||||
* This class uses some temporary static storage to avoid excessive allocations during
|
||||
* drop operations. It is expected to only be invoked from the main UI thread with no
|
||||
* concurrent access.
|
||||
*
|
||||
* @since GLE1
|
||||
*/
|
||||
class DropFeedback {
|
||||
|
||||
@@ -43,12 +45,12 @@ class DropFeedback {
|
||||
private static final int BOTTOM = 2;
|
||||
private static final int RIGHT = 3;
|
||||
private static final int MAX_DIR = RIGHT;
|
||||
|
||||
|
||||
private static final int sOppositeDirection[] = { BOTTOM, RIGHT, TOP, LEFT };
|
||||
|
||||
private static final UiElementEditPart sTempClosests[] = new UiElementEditPart[4];
|
||||
private static final int sTempMinDists[] = new int[4];
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Target information computed from a drop on a RelativeLayout.
|
||||
@@ -69,20 +71,20 @@ class DropFeedback {
|
||||
private static final RelativeInfo sRelativeInfo = new RelativeInfo();
|
||||
/** A temporary array of 2 {@link UiElementEditPart} to avoid allocations. */
|
||||
private static final UiElementEditPart sTempTwoParts[] = new UiElementEditPart[2];
|
||||
|
||||
|
||||
|
||||
private DropFeedback() {
|
||||
}
|
||||
|
||||
|
||||
|
||||
//----- Package methods called by users of this helper class -----
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* This method is used by {@link ElementCreateCommand#execute()} when a new item
|
||||
* needs to be "dropped" in the current XML document. It creates the new item using
|
||||
* the given descriptor as a child of the given parent part.
|
||||
*
|
||||
*
|
||||
* @param parentPart The parent part.
|
||||
* @param descriptor The descriptor for the new XML element.
|
||||
* @param where The drop location (in parent coordinates)
|
||||
@@ -91,16 +93,16 @@ class DropFeedback {
|
||||
static void addElementToXml(UiElementEditPart parentPart,
|
||||
ElementDescriptor descriptor, Point where,
|
||||
UiEditorActions actions) {
|
||||
|
||||
|
||||
String layoutXmlName = getXmlLocalName(parentPart);
|
||||
RelativeInfo info = null;
|
||||
UiElementEditPart sibling = null;
|
||||
|
||||
|
||||
// TODO consider merge like a vertical layout
|
||||
// TODO consider TableLayout like a linear
|
||||
if (LayoutConstants.LINEAR_LAYOUT.equals(layoutXmlName)) {
|
||||
sibling = findLinearTarget(parentPart, where)[1];
|
||||
|
||||
|
||||
} else if (LayoutConstants.RELATIVE_LAYOUT.equals(layoutXmlName)) {
|
||||
info = findRelativeTarget(parentPart, where, sRelativeInfo);
|
||||
if (info != null) {
|
||||
@@ -114,7 +116,7 @@ class DropFeedback {
|
||||
UiElementNode uiParent = parentPart.getUiNode();
|
||||
UiElementNode uiNode = actions.addElement(uiParent, uiSibling, descriptor,
|
||||
false /*updateLayout*/);
|
||||
|
||||
|
||||
if (LayoutConstants.ABSOLUTE_LAYOUT.equals(layoutXmlName)) {
|
||||
adjustAbsoluteAttributes(uiNode, where);
|
||||
} else if (LayoutConstants.RELATIVE_LAYOUT.equals(layoutXmlName)) {
|
||||
@@ -128,8 +130,8 @@ class DropFeedback {
|
||||
* highlight information when a drop target is moved over a valid drop area.
|
||||
* <p/>
|
||||
* Since there are no "out" parameters in Java, all the information is returned
|
||||
* via the {@link HighlightInfo} structure passed as parameter.
|
||||
*
|
||||
* via the {@link HighlightInfo} structure passed as parameter.
|
||||
*
|
||||
* @param parentPart The parent part, always a layout.
|
||||
* @param highlightInfo A structure where result is stored to perform highlight.
|
||||
* @param where The target drop point, in parent's coordinates
|
||||
@@ -139,16 +141,16 @@ class DropFeedback {
|
||||
HighlightInfo highlightInfo,
|
||||
Point where) {
|
||||
String layoutType = getXmlLocalName(parentPart);
|
||||
|
||||
|
||||
if (LayoutConstants.ABSOLUTE_LAYOUT.equals(layoutType)) {
|
||||
highlightInfo.anchorPoint = where;
|
||||
|
||||
|
||||
} else if (LayoutConstants.LINEAR_LAYOUT.equals(layoutType)) {
|
||||
boolean isVertical = isVertical(parentPart);
|
||||
|
||||
highlightInfo.childParts = findLinearTarget(parentPart, where);
|
||||
computeLinearLine(parentPart, isVertical, highlightInfo);
|
||||
|
||||
|
||||
} else if (LayoutConstants.RELATIVE_LAYOUT.equals(layoutType)) {
|
||||
|
||||
RelativeInfo info = findRelativeTarget(parentPart, where, sRelativeInfo);
|
||||
@@ -157,13 +159,13 @@ class DropFeedback {
|
||||
computeRelativeLine(parentPart, info, highlightInfo);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return highlightInfo;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//----- Misc utilities -----
|
||||
|
||||
|
||||
/**
|
||||
* Returns the next UI sibling of this part, i.e. the element which is just after in
|
||||
* the UI/XML order in the same parent. Returns null if there's no such part.
|
||||
@@ -208,7 +210,7 @@ class DropFeedback {
|
||||
|
||||
/**
|
||||
* Adjusts the attributes of a new node dropped in an AbsoluteLayout.
|
||||
*
|
||||
*
|
||||
* @param uiNode The new node being dropped.
|
||||
* @param where The drop location (in parent coordinates)
|
||||
*/
|
||||
@@ -237,12 +239,12 @@ class DropFeedback {
|
||||
* will "attach". The anchor part can be null, either because the layout is currently
|
||||
* empty or the user is attaching to an existing empty border.
|
||||
* <li> direction: the direction from the anchor part to the drop point. That's also the
|
||||
* direction from the anchor part to the new part.
|
||||
* direction from the anchor part to the new part.
|
||||
* <li> the new node; it is created either after the anchor for right or top directions
|
||||
* or before the anchor for left or bottom directions. This means the new part can
|
||||
* reference the id of the anchor part.
|
||||
* or before the anchor for left or bottom directions. This means the new part can
|
||||
* reference the id of the anchor part.
|
||||
* </ul>
|
||||
*
|
||||
*
|
||||
* Several cases:
|
||||
* <ul>
|
||||
* <li> set: layout_above/below/toLeftOf/toRightOf to point to the anchor.
|
||||
@@ -251,7 +253,7 @@ class DropFeedback {
|
||||
* <li> copy: layout_above/below/toLeftOf/toRightOf for the orthogonal direction
|
||||
* (i.e. top/bottom or left/right.)
|
||||
* </ul>
|
||||
*
|
||||
*
|
||||
* @param uiNode The new node being dropped.
|
||||
* @param info The context computed by {@link #findRelativeTarget(UiElementEditPart, Point, RelativeInfo)}.
|
||||
*/
|
||||
@@ -259,10 +261,10 @@ class DropFeedback {
|
||||
if (uiNode == null || info == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
final UiElementEditPart anchorPart = info.targetParts[info.anchorIndex]; // can be null
|
||||
|
||||
final UiElementEditPart anchorPart = info.targetParts[info.anchorIndex]; // can be null
|
||||
final int direction = info.direction;
|
||||
|
||||
|
||||
uiNode.getEditor().editXmlModel(new Runnable() {
|
||||
public void run() {
|
||||
HashMap<String, String> map = new HashMap<String, String>();
|
||||
@@ -276,7 +278,7 @@ class DropFeedback {
|
||||
anchorId = DescriptorsUtils.getFreeWidgetId(anchorUiNode);
|
||||
anchorUiNode.setAttributeValue("id", anchorId, true /*override*/); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
|
||||
if (anchorId != null) {
|
||||
switch(direction) {
|
||||
case TOP:
|
||||
@@ -315,7 +317,7 @@ class DropFeedback {
|
||||
map.put(LayoutConstants.ATTR_LAYOUT_ALIGN_BASELINE,
|
||||
anchorUiNode.getAttributeValue(
|
||||
LayoutConstants.ATTR_LAYOUT_ALIGN_BASELINE));
|
||||
|
||||
|
||||
map.put(LayoutConstants.ATTR_LAYOUT_ABOVE,
|
||||
anchorUiNode.getAttributeValue(LayoutConstants.ATTR_LAYOUT_ABOVE));
|
||||
map.put(LayoutConstants.ATTR_LAYOUT_BELOW,
|
||||
@@ -344,7 +346,7 @@ class DropFeedback {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
for (Entry<String, String> entry : map.entrySet()) {
|
||||
uiNode.setAttributeValue(entry.getKey(), entry.getValue(), true /* override */);
|
||||
}
|
||||
@@ -365,7 +367,7 @@ class DropFeedback {
|
||||
* <p/>
|
||||
* It returns null if it can't be determined, in which case the element will be added at the
|
||||
* end of the parent child list.
|
||||
*
|
||||
*
|
||||
* @return The edit parts that correspond to what will be the "prev" and "next sibling" of the
|
||||
* new element. The previous sibling can be null if adding before the first element.
|
||||
* The next sibling can be null if adding after the last element.
|
||||
@@ -373,9 +375,9 @@ class DropFeedback {
|
||||
private static UiElementEditPart[] findLinearTarget(UiElementEditPart parent, Point point) {
|
||||
// default orientation is horizontal
|
||||
boolean isVertical = isVertical(parent);
|
||||
|
||||
|
||||
int target = isVertical ? point.y : point.x;
|
||||
|
||||
|
||||
UiElementEditPart prev = null;
|
||||
UiElementEditPart next = null;
|
||||
|
||||
@@ -391,7 +393,7 @@ class DropFeedback {
|
||||
prev = childPart;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
sTempTwoParts[0] = prev;
|
||||
sTempTwoParts[1] = next;
|
||||
return sTempTwoParts;
|
||||
@@ -405,7 +407,7 @@ class DropFeedback {
|
||||
* The result is stored in HighlightInfo.
|
||||
* <p/>
|
||||
* Caller must clear the HighlightInfo as appropriate before this call.
|
||||
*
|
||||
*
|
||||
* @param parentPart The parent part, always a layout.
|
||||
* @param isVertical True for vertical parts, thus computing an horizontal line.
|
||||
* @param highlightInfo The in-out highlight info.
|
||||
@@ -455,18 +457,18 @@ class DropFeedback {
|
||||
|
||||
/**
|
||||
* Returns true if the linear layout is marked as vertical.
|
||||
*
|
||||
* @param parent The a layout part that must be a LinearLayout
|
||||
*
|
||||
* @param parent The a layout part that must be a LinearLayout
|
||||
* @return True if the linear layout has a vertical orientation attribute.
|
||||
*/
|
||||
private static boolean isVertical(UiElementEditPart parent) {
|
||||
String orientation = parent.getStringAttr("orientation"); //$NON-NLS-1$
|
||||
boolean isVertical = "vertical".equals(orientation) || //$NON-NLS-1$
|
||||
boolean isVertical = "vertical".equals(orientation) || //$NON-NLS-1$
|
||||
"1".equals(orientation); //$NON-NLS-1$
|
||||
return isVertical;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//----- RelativeLayout --------
|
||||
|
||||
/**
|
||||
@@ -481,26 +483,26 @@ class DropFeedback {
|
||||
* <p/>
|
||||
* If the drop point is not exactly on a current element, find the closest in each
|
||||
* direction and align with the two closest of these.
|
||||
*
|
||||
*
|
||||
* @return null if we fail to find anything (such as there are currently no items to compare
|
||||
* with); otherwise fills the {@link RelativeInfo} and return it.
|
||||
*/
|
||||
private static RelativeInfo findRelativeTarget(UiElementEditPart parent,
|
||||
Point point,
|
||||
RelativeInfo outInfo) {
|
||||
|
||||
|
||||
for (int i = 0; i < 4; i++) {
|
||||
sTempMinDists[i] = Integer.MAX_VALUE;
|
||||
sTempClosests[i] = null;
|
||||
}
|
||||
|
||||
|
||||
|
||||
for (Object child : parent.getChildren()) {
|
||||
if (child instanceof UiElementEditPart) {
|
||||
UiElementEditPart childPart = (UiElementEditPart) child;
|
||||
Rectangle r = childPart.getBounds();
|
||||
if (r.contains(point)) {
|
||||
|
||||
|
||||
float rx = ((float)(point.x - r.x) / (float)r.width ) - 0.5f;
|
||||
float ry = ((float)(point.y - r.y) / (float)r.height) - 0.5f;
|
||||
|
||||
@@ -537,18 +539,18 @@ class DropFeedback {
|
||||
|
||||
return outInfo;
|
||||
}
|
||||
|
||||
|
||||
computeClosest(point, childPart, sTempClosests, sTempMinDists, TOP);
|
||||
computeClosest(point, childPart, sTempClosests, sTempMinDists, LEFT);
|
||||
computeClosest(point, childPart, sTempClosests, sTempMinDists, BOTTOM);
|
||||
computeClosest(point, childPart, sTempClosests, sTempMinDists, RIGHT);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
UiElementEditPart closest = null;
|
||||
int minDist = Integer.MAX_VALUE;
|
||||
int minDir = -1;
|
||||
|
||||
|
||||
for (int i = 0; i <= MAX_DIR; i++) {
|
||||
if (sTempClosests[i] != null && sTempMinDists[i] < minDist) {
|
||||
closest = sTempClosests[i];
|
||||
@@ -556,7 +558,7 @@ class DropFeedback {
|
||||
minDir = i;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (closest != null) {
|
||||
int index = 0;
|
||||
switch(minDir) {
|
||||
@@ -662,7 +664,7 @@ class DropFeedback {
|
||||
|
||||
Point p = null;
|
||||
boolean usable = false;
|
||||
|
||||
|
||||
switch(direction) {
|
||||
case TOP:
|
||||
p = r.getBottom();
|
||||
@@ -701,7 +703,7 @@ class DropFeedback {
|
||||
if (referencePart == null || referencePart.getParent() == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
Rectangle r = referencePart.getBounds();
|
||||
Point ref = null;
|
||||
switch(direction) {
|
||||
@@ -718,16 +720,16 @@ class DropFeedback {
|
||||
ref = r.getRight();
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
int minDist = Integer.MAX_VALUE;
|
||||
UiElementEditPart closestPart = null;
|
||||
|
||||
|
||||
for (Object childPart : referencePart.getParent().getChildren()) {
|
||||
if (childPart != referencePart && childPart instanceof UiElementEditPart) {
|
||||
r = ((UiElementEditPart) childPart).getBounds();
|
||||
Point p = null;
|
||||
boolean usable = false;
|
||||
|
||||
|
||||
switch(direction) {
|
||||
case TOP:
|
||||
p = r.getBottom();
|
||||
@@ -756,7 +758,7 @@ class DropFeedback {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return closestPart;
|
||||
}
|
||||
|
||||
|
||||
@@ -29,6 +29,8 @@ import org.eclipse.gef.commands.Command;
|
||||
/**
|
||||
* A command that knows how to instantiate a new element based on a given {@link ElementDescriptor},
|
||||
* the parent {@link UiElementEditPart} and an optional target location.
|
||||
*
|
||||
* @since GLE1
|
||||
*/
|
||||
public class ElementCreateCommand extends Command {
|
||||
|
||||
@@ -41,7 +43,7 @@ public class ElementCreateCommand extends Command {
|
||||
|
||||
/**
|
||||
* Creates a new {@link ElementCreateCommand}.
|
||||
*
|
||||
*
|
||||
* @param descriptor Descriptor of the new element to create
|
||||
* @param targetPart The edit part that hosts the new edit part
|
||||
* @param targetPoint The drop location in parent coordinates
|
||||
@@ -52,7 +54,7 @@ public class ElementCreateCommand extends Command {
|
||||
mParentPart = targetPart;
|
||||
mTargetPoint = targetPoint;
|
||||
}
|
||||
|
||||
|
||||
// --- Methods inherited from Command ---
|
||||
|
||||
@Override
|
||||
@@ -82,14 +84,14 @@ public class ElementCreateCommand extends Command {
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void redo() {
|
||||
throw new UnsupportedOperationException("redo not supported by this command"); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void undo() {
|
||||
throw new UnsupportedOperationException("undo not supported by this command"); //$NON-NLS-1$
|
||||
|
||||
@@ -22,11 +22,13 @@ import org.eclipse.draw2d.Graphics;
|
||||
import org.eclipse.draw2d.geometry.Rectangle;
|
||||
import org.eclipse.swt.SWT;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* The figure used to draw basic elements.
|
||||
* <p/>
|
||||
* The figure is totally empty and transparent except for the selection border.
|
||||
*
|
||||
* @since GLE1
|
||||
*/
|
||||
class ElementFigure extends Figure {
|
||||
|
||||
@@ -36,18 +38,18 @@ class ElementFigure extends Figure {
|
||||
public ElementFigure() {
|
||||
setOpaque(false);
|
||||
}
|
||||
|
||||
|
||||
public void setSelected(boolean isSelected) {
|
||||
if (isSelected != mIsSelected) {
|
||||
mIsSelected = isSelected;
|
||||
repaint();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void setBounds(Rectangle rect) {
|
||||
super.setBounds(rect);
|
||||
|
||||
|
||||
mInnerBounds = getBounds().getCopy();
|
||||
if (mInnerBounds.width > 0) {
|
||||
mInnerBounds.width--;
|
||||
@@ -56,11 +58,11 @@ class ElementFigure extends Figure {
|
||||
mInnerBounds.height--;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public Rectangle getInnerBounds() {
|
||||
return mInnerBounds;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void paintBorder(Graphics graphics) {
|
||||
super.paintBorder(graphics);
|
||||
|
||||
@@ -30,11 +30,13 @@ import org.eclipse.swt.SWT;
|
||||
* By default the figure is transparent and empty.
|
||||
* The base {@link ElementFigure} knows how to draw the selection border.
|
||||
* This figure knows how to draw the drop feedback.
|
||||
*
|
||||
* @since GLE1
|
||||
*/
|
||||
class LayoutFigure extends ElementFigure {
|
||||
|
||||
private HighlightInfo mHighlightInfo;
|
||||
|
||||
|
||||
public LayoutFigure() {
|
||||
super();
|
||||
}
|
||||
@@ -50,12 +52,12 @@ class LayoutFigure extends ElementFigure {
|
||||
* The parent {@link Figure#paint(Graphics)} calls {@link #paintFigure(Graphics)} then
|
||||
* {@link #paintClientArea(Graphics)} then {@link #paintBorder(Graphics)}. Here we thus
|
||||
* draw the actual highlight border but also the highlight anchor lines and points so that
|
||||
* we can make sure they are all drawn on top of the border.
|
||||
* we can make sure they are all drawn on top of the border.
|
||||
* <p/>
|
||||
* Note: This method doesn't really need to restore its graphic state. The parent
|
||||
* Figure will do it for us.
|
||||
* <p/>
|
||||
*
|
||||
*
|
||||
* @param graphics The Graphics object used for painting
|
||||
*/
|
||||
@Override
|
||||
@@ -98,7 +100,7 @@ class LayoutFigure extends ElementFigure {
|
||||
int y1 = mHighlightInfo.linePoints[0].y;
|
||||
int x2 = mHighlightInfo.linePoints[1].x;
|
||||
int y2 = mHighlightInfo.linePoints[1].y;
|
||||
|
||||
|
||||
// if the line is right to the edge, draw it one pixel more inside so that the
|
||||
// full 2-pixel width be visible.
|
||||
if (x1 <= 0) x1++;
|
||||
@@ -110,12 +112,12 @@ class LayoutFigure extends ElementFigure {
|
||||
if (x2 >= w - 1) x2--;
|
||||
if (y1 >= h - 1) y1--;
|
||||
if (y2 >= h - 1) y2--;
|
||||
|
||||
|
||||
x1 += bx;
|
||||
x2 += bx;
|
||||
y1 += by;
|
||||
y2 += by;
|
||||
|
||||
|
||||
graphics.setLineWidth(2);
|
||||
graphics.setLineStyle(SWT.LINE_DASH);
|
||||
graphics.setLineCap(SWT.CAP_ROUND);
|
||||
|
||||
@@ -46,27 +46,29 @@ import java.awt.image.DataBufferInt;
|
||||
/**
|
||||
* Graphical edit part for the root document.
|
||||
* <p/>
|
||||
* It acts as a simple container.
|
||||
* It acts as a simple container.
|
||||
*
|
||||
* @since GLE1
|
||||
*/
|
||||
public class UiDocumentEditPart extends UiElementEditPart {
|
||||
|
||||
|
||||
private Display mDisplay;
|
||||
private FreeformLayer mLayer;
|
||||
private ImageBackground mImage;
|
||||
private Label mChild = null;
|
||||
|
||||
|
||||
final static class ImageBackground extends AbstractBackground {
|
||||
|
||||
|
||||
private BufferedImage mBufferedImage;
|
||||
private Image mImage;
|
||||
|
||||
ImageBackground() {
|
||||
}
|
||||
|
||||
|
||||
ImageBackground(BufferedImage image, Display display) {
|
||||
setImage(image, display);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void paintBackground(IFigure figure, Graphics graphics, Insets insets) {
|
||||
if (mImage != null) {
|
||||
@@ -74,7 +76,7 @@ public class UiDocumentEditPart extends UiElementEditPart {
|
||||
graphics.drawImage(mImage, rect.x, rect.y);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void setImage(BufferedImage image, Display display) {
|
||||
if (image != null) {
|
||||
int[] data = ((DataBufferInt)image.getData().getDataBuffer()).getData();
|
||||
@@ -104,27 +106,27 @@ public class UiDocumentEditPart extends UiElementEditPart {
|
||||
protected IFigure createFigure() {
|
||||
mLayer = new FreeformLayer();
|
||||
mLayer.setLayoutManager(new FreeformLayout());
|
||||
|
||||
|
||||
mLayer.setOpaque(true);
|
||||
mLayer.setBackgroundColor(ColorConstants.lightGray);
|
||||
|
||||
|
||||
return mLayer;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void refreshVisuals() {
|
||||
UiElementNode model = (UiElementNode)getModel();
|
||||
|
||||
|
||||
Object editData = model.getEditData();
|
||||
if (editData instanceof BufferedImage) {
|
||||
BufferedImage image = (BufferedImage)editData;
|
||||
|
||||
|
||||
if (mImage == null || image != mImage.getBufferedImage()) {
|
||||
mImage = new ImageBackground(image, mDisplay);
|
||||
}
|
||||
|
||||
|
||||
mLayer.setBorder(mImage);
|
||||
|
||||
|
||||
if (mChild != null && mChild.getParent() == mLayer) {
|
||||
mLayer.remove(mChild);
|
||||
}
|
||||
@@ -156,7 +158,7 @@ public class UiDocumentEditPart extends UiElementEditPart {
|
||||
protected void showSelection() {
|
||||
// no selection at this level.
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void createEditPolicies() {
|
||||
super.createEditPolicies();
|
||||
@@ -168,12 +170,12 @@ public class UiDocumentEditPart extends UiElementEditPart {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the EditPart that should be used as the target for the specified Request.
|
||||
* Returns the EditPart that should be used as the target for the specified Request.
|
||||
* For instance this is called during drag'n'drop with a CreateRequest.
|
||||
* <p/>
|
||||
* For the root document, we want the first child edit part to the be the target
|
||||
* since an XML document can have only one root element.
|
||||
*
|
||||
*
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
@@ -194,7 +196,7 @@ public class UiDocumentEditPart extends UiElementEditPart {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -22,13 +22,15 @@ import java.util.List;
|
||||
|
||||
/**
|
||||
* Implementation of {@link UiElementTreeEditPart} for the document root.
|
||||
*
|
||||
* @since GLE1
|
||||
*/
|
||||
public class UiDocumentTreeEditPart extends UiElementTreeEditPart {
|
||||
|
||||
public UiDocumentTreeEditPart(UiDocumentNode model) {
|
||||
super(model);
|
||||
}
|
||||
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
protected List getModelChildren() {
|
||||
|
||||
@@ -44,10 +44,12 @@ import java.util.List;
|
||||
|
||||
/**
|
||||
* An {@link EditPart} for a {@link UiElementNode}.
|
||||
*
|
||||
* @since GLE1
|
||||
*/
|
||||
public abstract class UiElementEditPart extends AbstractGraphicalEditPart
|
||||
implements IUiUpdateListener {
|
||||
|
||||
|
||||
public UiElementEditPart(UiElementNode uiElementNode) {
|
||||
setModel(uiElementNode);
|
||||
}
|
||||
@@ -60,7 +62,7 @@ public abstract class UiElementEditPart extends AbstractGraphicalEditPart
|
||||
|
||||
//-------------------------
|
||||
// Base class overrides
|
||||
|
||||
|
||||
@Override
|
||||
public DragTracker getDragTracker(Request request) {
|
||||
return new SelectEditPartTracker(this);
|
||||
@@ -71,12 +73,12 @@ public abstract class UiElementEditPart extends AbstractGraphicalEditPart
|
||||
/*
|
||||
* This is no longer needed, as a selection edit policy is set by the parent layout.
|
||||
* Leave this code commented out right now, I'll want to play with this later.
|
||||
*
|
||||
*
|
||||
installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE,
|
||||
new NonResizableSelectionEditPolicy(this));
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
/* (non-javadoc)
|
||||
* Returns a List containing the children model objects.
|
||||
* Must not return null, instead use the super which returns an empty list.
|
||||
@@ -92,7 +94,7 @@ public abstract class UiElementEditPart extends AbstractGraphicalEditPart
|
||||
super.activate();
|
||||
getUiNode().addUpdateListener(this);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void deactivate() {
|
||||
super.deactivate();
|
||||
@@ -104,11 +106,11 @@ public abstract class UiElementEditPart extends AbstractGraphicalEditPart
|
||||
if (getFigure().getParent() != null) {
|
||||
((GraphicalEditPart) getParent()).setLayoutConstraint(this, getFigure(), getBounds());
|
||||
}
|
||||
|
||||
|
||||
// update the visuals of the children as well
|
||||
refreshChildrenVisuals();
|
||||
}
|
||||
|
||||
|
||||
protected void refreshChildrenVisuals() {
|
||||
if (children != null) {
|
||||
for (Object child : children) {
|
||||
@@ -131,7 +133,7 @@ public abstract class UiElementEditPart extends AbstractGraphicalEditPart
|
||||
break;
|
||||
case CHILDREN_CHANGED:
|
||||
refreshChildren();
|
||||
|
||||
|
||||
// new children list, need to update the layout
|
||||
refreshVisuals();
|
||||
break;
|
||||
@@ -151,19 +153,19 @@ public abstract class UiElementEditPart extends AbstractGraphicalEditPart
|
||||
public final UiElementNode getUiNode() {
|
||||
return (UiElementNode) getModel();
|
||||
}
|
||||
|
||||
|
||||
protected final ElementDescriptor getDescriptor() {
|
||||
return getUiNode().getDescriptor();
|
||||
}
|
||||
|
||||
|
||||
protected final UiElementEditPart getEditPartParent() {
|
||||
EditPart parent = getParent();
|
||||
if (parent instanceof UiElementEditPart) {
|
||||
return (UiElementEditPart)parent;
|
||||
return (UiElementEditPart)parent;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns a given XML attribute.
|
||||
* @param attrName The local name of the attribute.
|
||||
@@ -186,17 +188,17 @@ public abstract class UiElementEditPart extends AbstractGraphicalEditPart
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
protected final Rectangle getBounds() {
|
||||
UiElementNode model = (UiElementNode)getModel();
|
||||
|
||||
|
||||
Object editData = model.getEditData();
|
||||
|
||||
if (editData != null) {
|
||||
// assert with fully qualified class name to prevent import changes to another
|
||||
// Rectangle class.
|
||||
assert (editData instanceof org.eclipse.draw2d.geometry.Rectangle);
|
||||
|
||||
|
||||
return (Rectangle)editData;
|
||||
}
|
||||
|
||||
@@ -205,12 +207,12 @@ public abstract class UiElementEditPart extends AbstractGraphicalEditPart
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the EditPart that should be used as the target for the specified Request.
|
||||
* Returns the EditPart that should be used as the target for the specified Request.
|
||||
* <p/>
|
||||
* For instance this is called during drag'n'drop with a CreateRequest.
|
||||
* <p/>
|
||||
* Reject being a target for elements which descriptor does not allow children.
|
||||
*
|
||||
*
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
@@ -227,7 +229,7 @@ public abstract class UiElementEditPart extends AbstractGraphicalEditPart
|
||||
/**
|
||||
* Used by derived classes {@link UiDocumentEditPart} and {@link UiLayoutEditPart}
|
||||
* to accept drag'n'drop of new items from the palette.
|
||||
*
|
||||
*
|
||||
* @param layoutEditPart The layout edit part where this policy is installed. It can
|
||||
* be either a {@link UiDocumentEditPart} or a {@link UiLayoutEditPart}.
|
||||
*/
|
||||
@@ -269,18 +271,18 @@ public abstract class UiElementEditPart extends AbstractGraphicalEditPart
|
||||
Point where = request.getLocation().getCopy();
|
||||
Point origin = getLayoutContainer().getClientArea().getLocation();
|
||||
where.translate(origin.getNegated());
|
||||
|
||||
|
||||
// The host is the EditPart where this policy is installed,
|
||||
// e.g. this UiElementEditPart.
|
||||
EditPart host = getHost();
|
||||
if (host instanceof UiElementEditPart) {
|
||||
|
||||
|
||||
return new ElementCreateCommand((ElementDescriptor) newType,
|
||||
(UiElementEditPart) host,
|
||||
where);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -289,14 +291,14 @@ public abstract class UiElementEditPart extends AbstractGraphicalEditPart
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void showLayoutTargetFeedback(Request request) {
|
||||
super.showLayoutTargetFeedback(request);
|
||||
|
||||
|
||||
// for debugging
|
||||
// System.out.println("target: " + request.toString() + " -- " + layoutEditPart.getUiNode().getBreadcrumbTrailDescription(false));
|
||||
|
||||
|
||||
if (layoutEditPart instanceof UiLayoutEditPart &&
|
||||
request instanceof DropRequest) {
|
||||
Point where = ((DropRequest) request).getLocation().getCopy();
|
||||
@@ -314,24 +316,24 @@ public abstract class UiElementEditPart extends AbstractGraphicalEditPart
|
||||
((UiLayoutEditPart) layoutEditPart).hideDropTarget();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected IFigure createSizeOnDropFeedback(CreateRequest createRequest) {
|
||||
// TODO understand if this is useful for us or remove
|
||||
return super.createSizeOnDropFeedback(createRequest);
|
||||
}
|
||||
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
protected static class NonResizableSelectionEditPolicy extends SelectionEditPolicy {
|
||||
|
||||
|
||||
private final UiElementEditPart mEditPart;
|
||||
|
||||
public NonResizableSelectionEditPolicy(UiElementEditPart editPart) {
|
||||
mEditPart = editPart;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void hideSelection() {
|
||||
mEditPart.hideSelection();
|
||||
|
||||
@@ -25,6 +25,8 @@ import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
|
||||
/**
|
||||
* Base {@link AbstractTreeEditPart} to represent {@link UiElementNode} objects in the
|
||||
* {@link IContentOutlinePage} linked to the layout editor.
|
||||
*
|
||||
* @since GLE1
|
||||
*/
|
||||
public class UiElementTreeEditPart extends AbstractTreeEditPart {
|
||||
|
||||
|
||||
@@ -26,7 +26,9 @@ import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
|
||||
|
||||
/**
|
||||
* {@link EditPartFactory} to create {@link AbstractTreeEditPart} for {@link UiElementNode} objects.
|
||||
* These objects are used in the {@link IContentOutlinePage} linked to the layout editor.
|
||||
* These objects are used in the {@link IContentOutlinePage} linked to the layout editor.
|
||||
*
|
||||
* @since GLE1
|
||||
*/
|
||||
public class UiElementTreeEditPartFactory implements EditPartFactory {
|
||||
|
||||
|
||||
@@ -28,15 +28,17 @@ import org.eclipse.swt.widgets.Display;
|
||||
* <p/>
|
||||
* The only model objects we use are {@link UiElementNode} objects and they are
|
||||
* edited using {@link UiElementEditPart}.
|
||||
*
|
||||
* @since GLE1
|
||||
*/
|
||||
public class UiElementsEditPartFactory implements EditPartFactory {
|
||||
|
||||
|
||||
private Display mDisplay;
|
||||
|
||||
public UiElementsEditPartFactory(Display display) {
|
||||
mDisplay = display;
|
||||
}
|
||||
|
||||
|
||||
public EditPart createEditPart(EditPart context, Object model) {
|
||||
if (model instanceof UiDocumentNode) {
|
||||
return new UiDocumentEditPart((UiDocumentNode) model, mDisplay);
|
||||
|
||||
@@ -29,10 +29,12 @@ import org.eclipse.gef.requests.CreateRequest;
|
||||
/**
|
||||
* Graphical edit part for an {@link UiElementNode} that represents a ViewLayout.
|
||||
* <p/>
|
||||
* It acts as a simple container.
|
||||
* It acts as a simple container.
|
||||
*
|
||||
* @since GLE1
|
||||
*/
|
||||
public final class UiLayoutEditPart extends UiElementEditPart {
|
||||
|
||||
|
||||
static class HighlightInfo {
|
||||
public boolean drawDropBorder;
|
||||
public UiElementEditPart[] childParts;
|
||||
@@ -48,24 +50,24 @@ public final class UiLayoutEditPart extends UiElementEditPart {
|
||||
linePoints = null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private final HighlightInfo mHighlightInfo = new HighlightInfo();
|
||||
|
||||
|
||||
public UiLayoutEditPart(UiElementNode uiElementNode) {
|
||||
super(uiElementNode);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void createEditPolicies() {
|
||||
super.createEditPolicies();
|
||||
|
||||
|
||||
installEditPolicy(EditPolicy.CONTAINER_ROLE, new ContainerEditPolicy() {
|
||||
@Override
|
||||
protected Command getCreateCommand(CreateRequest request) {
|
||||
return null;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
installLayoutEditPolicy(this);
|
||||
}
|
||||
|
||||
|
||||
@@ -22,13 +22,15 @@ import java.util.List;
|
||||
|
||||
/**
|
||||
* Implementation of {@link UiElementTreeEditPart} for layout objects.
|
||||
*
|
||||
* @since GLE1
|
||||
*/
|
||||
public class UiLayoutTreeEditPart extends UiElementTreeEditPart {
|
||||
|
||||
public UiLayoutTreeEditPart(UiElementNode node) {
|
||||
super(node);
|
||||
}
|
||||
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
protected List getModelChildren() {
|
||||
|
||||
@@ -23,6 +23,8 @@ import org.eclipse.draw2d.XYLayout;
|
||||
|
||||
/**
|
||||
* Graphical edit part for an {@link UiElementNode} that represents a View.
|
||||
*
|
||||
* @since GLE1
|
||||
*/
|
||||
public class UiViewEditPart extends UiElementEditPart {
|
||||
|
||||
|
||||
@@ -20,6 +20,8 @@ import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
|
||||
|
||||
/**
|
||||
* Implementation of {@link UiElementTreeEditPart} for view objects.
|
||||
*
|
||||
* @since GLE1
|
||||
*/
|
||||
public class UiViewTreeEditPart extends UiElementTreeEditPart {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user