blob: 9f6557cbbf2cb612d8e2f682c1bbcd3a23db9e67 [file] [log] [blame]
/*
* Copyright (C) 2008 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.parts;
import com.android.ide.eclipse.adt.internal.editors.uimodel.UiDocumentNode;
import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
import org.eclipse.draw2d.AbstractBackground;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.FreeformLayer;
import org.eclipse.draw2d.FreeformLayout;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Label;
import org.eclipse.draw2d.geometry.Insets;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.Request;
import org.eclipse.gef.RequestConstants;
import org.eclipse.gef.editpolicies.RootComponentEditPolicy;
import org.eclipse.gef.requests.DropRequest;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.PaletteData;
import org.eclipse.swt.widgets.Display;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;
/**
* Graphical edit part for the root document.
* <p/>
* 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) {
Rectangle rect = getPaintRectangle(figure, insets);
graphics.drawImage(mImage, rect.x, rect.y);
}
}
void setImage(BufferedImage image, Display display) {
if (image != null) {
int[] data = ((DataBufferInt)image.getData().getDataBuffer()).getData();
ImageData imageData = new ImageData(image.getWidth(), image.getHeight(), 32,
new PaletteData(0x00FF0000, 0x0000FF00, 0x000000FF));
imageData.setPixels(0, 0, data.length, data, 0);
mImage = new Image(display, imageData);
} else {
mImage = null;
}
}
BufferedImage getBufferedImage() {
return mBufferedImage;
}
}
public UiDocumentEditPart(UiDocumentNode uiDocumentNode, Display display) {
super(uiDocumentNode);
mDisplay = display;
}
@Override
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);
}
} else if (editData instanceof String) {
mLayer.setBorder(null);
if (mChild == null) {
mChild = new Label();
}
mChild.setText((String)editData);
if (mChild != null && mChild.getParent() != mLayer) {
mLayer.add(mChild);
}
Rectangle bounds = mChild.getTextBounds();
bounds.x = bounds.y = 0;
mLayer.setConstraint(mChild, bounds);
}
// refresh the children as well
refreshChildrenVisuals();
}
@Override
protected void hideSelection() {
// no selection at this level.
}
@Override
protected void showSelection() {
// no selection at this level.
}
@Override
protected void createEditPolicies() {
super.createEditPolicies();
// This policy indicates this a root component that cannot be removed
installEditPolicy(EditPolicy.COMPONENT_ROLE, new RootComponentEditPolicy());
installLayoutEditPolicy(this);
}
/**
* 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
public EditPart getTargetEditPart(Request request) {
if (request != null && request.getType() == RequestConstants.REQ_CREATE) {
// We refuse the drop if it's not in the bounds of the document.
if (request instanceof DropRequest) {
Point where = ((DropRequest) request).getLocation().getCopy();
UiElementNode uiNode = getUiNode();
if (uiNode instanceof UiDocumentNode) {
// Take the bounds of the background image as the valid drop zone
Object editData = uiNode.getEditData();
if (editData instanceof BufferedImage) {
BufferedImage image = (BufferedImage)editData;
int w = image.getWidth();
int h = image.getHeight();
if (where.x > w || where.y > h) {
return null;
}
}
}
}
// 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.
if (getChildren().size() > 0) {
Object o = getChildren().get(0);
if (o instanceof EditPart) {
return ((EditPart) o).getTargetEditPart(request);
}
}
}
return super.getTargetEditPart(request);
}
}