[Bug 199788] Web Page Editor doesn't allow drops in the HTML head tag.
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/JMTResources.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/JMTResources.properties
index b8262cb..90f1c4d 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/JMTResources.properties
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/JMTResources.properties
@@ -119,6 +119,8 @@
 TableInsertHeaderFooterCommand.ColumnHeader=Column Header
 TableInsertHeaderFooterCommand.ColumnFooter=Column Footer
 
+HeadElementEdit.Submenu.InsertStylesheetLink=Stylesheet Link
+
 Action.Name.Copy=Copy
 Action.Name.Cut=Cut
 Action.Name.Paste=Paste
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/AddSubNodeCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/AddSubNodeCommand.java
index a099b9e..178aba7 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/AddSubNodeCommand.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/AddSubNodeCommand.java
@@ -14,6 +14,7 @@
 import java.util.Iterator;
 import java.util.Map;
 
+import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
 import org.eclipse.jst.pagedesigner.utils.JSPUtil;
 import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
 
@@ -53,16 +54,27 @@
 	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
 	 */
 	protected void doExecute() {
-		String prefix = JSPUtil.getOrCreatePrefix(_parent.getModel(), _url,
-				null);
-		_child = (IDOMElement) _parent.getOwnerDocument().createElement(
-				prefix + ":" + _tagName); //$NON-NLS-1$
+		String nodeName = null;
+		if (ITLDConstants.URI_HTML.equals(_url)) {
+			nodeName = _tagName;
+		} else {
+			String prefix = JSPUtil.getOrCreatePrefix(_parent.getModel(), _url, null);
+			nodeName = prefix + ":" + _tagName; //$NON-NLS-1$
+		}
+
+		_child = (IDOMElement) _parent.getOwnerDocument().createElement(nodeName);
+
+		if (_child == null) {
+			return;
+		}
+
 		for (Iterator iterator = _attributes.keySet().iterator(); iterator
 				.hasNext();) {
 			String key = (String) iterator.next();
 			String value = (String) _attributes.get(key);
 			_child.setAttribute(key, value);
 		}
+
 		_parent.appendChild(_child);
 	}
 
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/HeadItemCreationEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/HeadItemCreationEditPolicy.java
new file mode 100644
index 0000000..a7de205
--- /dev/null
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/HeadItemCreationEditPolicy.java
@@ -0,0 +1,117 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Oracle Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Oracle Corporation - initial API and implementation and/or initial documentation
+ *******************************************************************************/
+package org.eclipse.jst.pagedesigner.editpolicies;
+
+import org.eclipse.gef.Request;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gef.requests.DropRequest;
+import org.eclipse.jst.pagedesigner.IHTMLConstants;
+import org.eclipse.jst.pagedesigner.PDPlugin;
+import org.eclipse.jst.pagedesigner.commands.CreateItemCommand;
+import org.eclipse.jst.pagedesigner.dom.DOMPosition;
+import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
+import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
+import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
+import org.eclipse.jst.pagedesigner.itemcreation.ItemCreationEditPolicy;
+import org.eclipse.jst.pagedesigner.itemcreation.ItemCreationRequest;
+import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
+import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
+import org.eclipse.jst.pagedesigner.validation.caret.DnDPositionValidator;
+import org.eclipse.jst.pagedesigner.validation.caret.DropActionData;
+import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
+import org.eclipse.jst.pagedesigner.validation.caret.DropActionData.DropData;
+import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
+import org.w3c.dom.Node;
+
+/**
+ *
+ */
+public class HeadItemCreationEditPolicy extends ItemCreationEditPolicy {
+
+	/**
+	 * @param host
+	 */
+	public HeadItemCreationEditPolicy(ElementEditPart host) {
+		super();
+		setHost(host);
+	}
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#getCommand(org.eclipse.gef.Request)
+	 */
+	@Override
+	public Command getCommand(Request request) {
+		if (request instanceof ItemCreationRequest) {
+			ItemCreationRequest r = (ItemCreationRequest) request;
+			DesignPosition position = findPosition((ItemCreationRequest)request);
+			
+			if (position == null) {
+				return null;
+			}
+
+			IDOMPosition domposition = DOMPositionHelper.toDOMPosition(position);
+			if (domposition == null) {
+				return null;
+			}
+
+			// since the head tag is a widget, the offset will need 
+			// to be updated in the position so that new node is
+			// appended to the list of children.
+			Node node = domposition.getContainerNode();
+			domposition = new DOMPosition(node, node.getChildNodes().getLength());
+
+			return new CreateItemCommand(
+					PDPlugin
+							.getResourceString("ItemCreationEditPolicy.CommandLabel.CreateItem"),//$NON-NLS-1$
+					getViewer(getHost()).getModel(), domposition, r.getTagCreationProvider());
+		}
+		return null;
+	}
+
+	@Override
+	protected IPositionMediator createDropChildValidator(DropRequest r) {
+		DropData dropData = createDropData(r);
+
+		if (dropData != null) {
+			MyDnDPositionValidator validator = new MyDnDPositionValidator(
+					new DropActionData(ActionData.PALETTE_DND, dropData));
+			return validator;
+		}
+		return null;
+	}
+
+	private static class MyDnDPositionValidator extends DnDPositionValidator {
+
+		public MyDnDPositionValidator(DropActionData dropActionData) {
+			super(dropActionData);
+		}
+
+		@Override
+		public boolean isValidPosition(IDOMPosition position) {
+			// if position is really a IDOMRefPosition, convert it to DOMPosition
+			Node node = null;
+			if (position instanceof DOMRefPosition) {
+				node = ((DOMRefPosition) position).getReferenceNode();
+				if (IHTMLConstants.TAG_HEAD.equalsIgnoreCase(node.getLocalName())) {
+					return true;
+				}
+			} else {
+				node = position.getContainerNode();
+				if (IHTMLConstants.TAG_HEAD.equalsIgnoreCase(node.getLocalName())) {
+					return true;
+				}
+			}
+
+			return super.isValidPosition(position);
+		}
+	}
+}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/HTMLElementEditFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/HTMLElementEditFactory.java
index f4804c1..2ddff0c 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/HTMLElementEditFactory.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/HTMLElementEditFactory.java
@@ -24,6 +24,8 @@
  */
 public class HTMLElementEditFactory implements IElementEditFactory 
 {
+    final static TagIdentifier HTMLHEAD_TAG_IDENTIFIER =
+        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_HTML, IHTMLConstants.TAG_HEAD);
     final static TagIdentifier HTMLTABLE_TAG_IDENTIFIER =
         TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_HTML, IHTMLConstants.TAG_TABLE);
     
@@ -35,6 +37,16 @@
 	public IElementEdit createElementEdit(TagIdentifier tagIdentifier) {
 		if (HTMLTABLE_TAG_IDENTIFIER.isSameTagType(tagIdentifier)) {
 			return new TableElementEdit();
+		} else if (HTMLHEAD_TAG_IDENTIFIER.isSameTagType(tagIdentifier)) {
+			return new HeadElementEdit();
+		} else if (tagIdentifier != null) {
+			// No need to check the URI, it was checked to get this factory.
+			// Just check the tag name, ignoring case in the HTML tag names.
+			// The HTML tag meta data uses upper case and the programming
+			// constants are in lower case.
+			if (IHTMLConstants.TAG_LINK.equalsIgnoreCase(tagIdentifier.getTagName())) {
+				return new StylesheetLinkElementEdit();
+			}
 		}
 		return null;
 	}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/HeadElementEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/HeadElementEdit.java
new file mode 100644
index 0000000..4840bbb
--- /dev/null
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/HeadElementEdit.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Oracle Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Oracle Corporation - initial API and implementation and/or initial documentation
+ *******************************************************************************/
+package org.eclipse.jst.pagedesigner.elementedit.html;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IContributionItem;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants;
+import org.eclipse.jst.pagedesigner.editpolicies.HeadItemCreationEditPolicy;
+import org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit;
+import org.eclipse.jst.pagedesigner.itemcreation.ItemCreationRequest;
+import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
+import org.w3c.dom.Element;
+
+/**
+ * Simple ElementEdit implementation to support context menu insert
+ * actions and drag and drop of tags into the HTML head tag.
+ */
+public class HeadElementEdit extends AbstractElementEdit
+{
+	private static final Action EMPTY_ACTION = new Action() {
+        // create a default instance that does nothing.
+        // Action is abstract but has no abstract methods
+        // run() on this object is a NOOP
+	};
+
+	/* (non-Javadoc)
+     * @see org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit#fillContextMenu(org.eclipse.jface.action.IMenuManager, org.w3c.dom.Element)
+     */
+	@Override
+    public void fillContextMenu(IMenuManager contextMenu, Element ele) {
+		super.fillContextMenu(contextMenu, ele);
+
+		final IDOMElement element = (IDOMElement) ele;
+		IContributionItem item = contextMenu.find(PageDesignerActionConstants.INSERT_SUBMENU_ID);
+		if (item instanceof IMenuManager) {
+			final IMenuManager submenu = (IMenuManager) item;
+    		submenu.add(EMPTY_ACTION);
+    		submenu.addMenuListener(new IMenuListener() {
+    			public void menuAboutToShow(IMenuManager manager) {
+    				submenu.removeAll();
+    				addHeadAddItems(submenu, element);
+    			}
+    		});
+		}
+    }
+
+    private void addHeadAddItems(IMenuManager submenu, IDOMElement element) {
+		submenu.add(new InsertStylesheetLinkAction(element));
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#createEditPolicies(org.eclipse.jst.pagedesigner.parts.ElementEditPart)
+	 */
+	@Override
+	public void createEditPolicies(ElementEditPart part) {
+		part.installEditPolicy(ItemCreationRequest.REQ_ITEM_CREATION,
+				new HeadItemCreationEditPolicy(part));
+	}
+}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/InsertStylesheetLinkAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/InsertStylesheetLinkAction.java
new file mode 100644
index 0000000..a2c9326
--- /dev/null
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/InsertStylesheetLinkAction.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Oracle Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Oracle Corporation - initial API and implementation and/or initial documentation
+ *******************************************************************************/
+package org.eclipse.jst.pagedesigner.elementedit.html;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import org.eclipse.gef.commands.Command;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
+import org.eclipse.jst.pagedesigner.IHTMLConstants;
+import org.eclipse.jst.pagedesigner.PDPlugin;
+import org.eclipse.jst.pagedesigner.commands.single.AddSubNodeCommand;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
+
+/**
+ */
+public class InsertStylesheetLinkAction extends Action
+{
+	private IDOMElement _parentElement;
+
+	/**
+	 * @param parentElement 
+	 */
+	public InsertStylesheetLinkAction(IDOMElement parentElement) {
+		setText(PDPlugin.getResourceString("HeadElementEdit.Submenu.InsertStylesheetLink"));//$NON-NLS-1$
+		_parentElement = parentElement;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.action.IAction#run()
+	 */
+	public void run() {
+		// TODO: figure out how to get the default attributes from
+		// the tag create metadata. Get a tag creation provider?
+		Map attributes = new LinkedHashMap();
+		attributes.put("href", "");  //$NON-NLS-1$//$NON-NLS-2$
+		attributes.put("rel", "Stylesheet");  //$NON-NLS-1$//$NON-NLS-2$
+		attributes.put("type", "text/css");  //$NON-NLS-1$//$NON-NLS-2$
+		Command command = new AddSubNodeCommand(
+				PDPlugin.getResourceString("ItemCreationEditPolicy.CommandLabel.CreateItem"),//$NON-NLS-1$
+				_parentElement, IHTMLConstants.TAG_LINK, ITLDConstants.URI_HTML,
+				attributes);
+		command.execute();
+	}
+}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/StylesheetLinkElementEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/StylesheetLinkElementEdit.java
new file mode 100644
index 0000000..d3e4ea5
--- /dev/null
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/StylesheetLinkElementEdit.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Oracle Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Oracle Corporation - initial API and implementation and/or initial documentation
+ *******************************************************************************/
+package org.eclipse.jst.pagedesigner.elementedit.html;
+
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPartViewer;
+import org.eclipse.jst.jsf.common.dom.TagIdentifier;
+import org.eclipse.jst.pagedesigner.IHTMLConstants;
+import org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit;
+import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
+import org.eclipse.jst.pagedesigner.viewer.DefaultDropLocationStrategy;
+import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
+import org.eclipse.jst.pagedesigner.viewer.IDropLocationStrategy;
+import org.w3c.dom.Node;
+
+/**
+ * Simple ElementEdit implementation to support drag and drop
+ * of style sheet link tags into the HTML head tag.
+ */
+public class StylesheetLinkElementEdit extends AbstractElementEdit
+{
+    public IDropLocationStrategy getDropRequestorLocationStrategy(TagIdentifier tag, EditPartViewer viewer) {
+        return new MyDropLocationStrategy(viewer);
+    }
+
+    private static class MyDropLocationStrategy extends DefaultDropLocationStrategy
+    {
+        /**
+         * @param viewer
+         */
+        public MyDropLocationStrategy(EditPartViewer viewer) {
+            super(viewer);
+        }
+
+        public DesignPosition calculateDesignPosition(EditPart host,
+                Point p, IPositionMediator validator) {
+        	Node node = (Node) host.getModel();
+        	if (host != null && IHTMLConstants.TAG_HEAD.equalsIgnoreCase(node.getLocalName())) {
+        		return new DesignPosition(host, 0);
+        	}
+        	return super.calculateDesignPosition(host, p, validator);
+        }
+    }
+}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ItemCreationEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ItemCreationEditPolicy.java
index c514b42..42c3656 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ItemCreationEditPolicy.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ItemCreationEditPolicy.java
@@ -83,9 +83,9 @@
 
 	/**
 	 * @param host
-	 * @return
+	 * @return the graphical viewer
 	 */
-	private IHTMLGraphicalViewer getViewer(EditPart host) {
+	protected IHTMLGraphicalViewer getViewer(EditPart host) {
 		return (IHTMLGraphicalViewer) ((GraphicalEditPart) host).getViewer();
 	}
 
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/RootContainerPositionRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/RootContainerPositionRule.java
index 2901427..b44bdb1 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/RootContainerPositionRule.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/RootContainerPositionRule.java
@@ -14,17 +14,18 @@
 import java.util.Arrays;
 
 import org.eclipse.gef.EditPart;
+import org.eclipse.jst.pagedesigner.IHTMLConstants;
 import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
 import org.w3c.dom.Document;
 import org.w3c.dom.Node;
 
 /**
- * This rule deal with containers 'body', 'view', 'subview'.
+ * This rule deal with containers 'body', 'head', 'view', 'subview'.
  * 
  * @author mengbo
  */
 public class RootContainerPositionRule extends DefaultPositionRule {
-	static final String[] HTML_ROOT_CONTAINERS = { "body" }; //$NON-NLS-1$
+	static final String[] HTML_ROOT_CONTAINERS = { IHTMLConstants.TAG_BODY, IHTMLConstants.TAG_HEAD };
 
 	/**
 	 * @param actionData
@@ -47,7 +48,7 @@
 		}
 		Node node = target.getNode();
 		if (hasBasicContainers(EditModelQuery.getDocumentNode(node))) {
-			return true;// isWithinkBasicContainer(node);
+			return true;// isWithinBasicContainer(node);
 		}
 		return super.hasEditableArea(target);
 	}
@@ -60,7 +61,7 @@
 	public boolean isEditable(Target target) {
 		Node node = target.getNode();
 		if (hasBasicContainers(EditModelQuery.getDocumentNode(node))) {
-			boolean result = isWithinkBasicContainer(node);
+			boolean result = isWithinBasicContainer(node);
 			return result;
 		}
 		return super.isEditable(target);
@@ -78,7 +79,7 @@
 
 	}
 
-	private static boolean isWithinkBasicContainer(Node node) {
+	private static boolean isWithinBasicContainer(Node node) {
 		return EditModelQuery.isChild(HTML_ROOT_CONTAINERS, node, true, false);
 	}
 
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/EditPartPositionHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/EditPartPositionHelper.java
index 96f275e..0f11741 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/EditPartPositionHelper.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/EditPartPositionHelper.java
@@ -42,7 +42,7 @@
 //			.getLogger(EditPartPositionHelper.class);
 
 	/**
-	 * Add something to curent
+	 * Add something to current
 	 * 
 	 * @param lineBox
 	 * @param host
@@ -156,9 +156,9 @@
 	}
 
 	/**
-	 * This function find the position, if there is one which is widget or text
-	 * and it contains p, or there is not such widget, then boxLine will returns
-	 * the widget that are in a sameline which contains p;
+	 * This function finds the position, if there is one which is widget or text
+	 * and it contains p, or there is not such widget, then boxLine will return
+	 * the widget that are in a same line which contains p;
 	 * @param rootHost 
 	 * @param host 
 	 * 
@@ -204,7 +204,7 @@
 			}
             addToCurrentLine(boxLine, host, p, validator);
 		} else {
-			// root host. we always supporse it has editable area.
+			// root host. we always support it has editable area.
 			if (host == rootHost) {
 				if (host.getChildren().size() > 0) {
 					List children = host.getChildren();
@@ -228,13 +228,13 @@
 			}
 			// container
 			else {
-				// cann't edit it.
+				// can't edit it.
 				if (!validator.hasEditableArea(target)) {
 					if (lPart.contains(p) && //
 							(validator.isValidPosition(new DesignRefPosition(
 									target.getPart(), true)) || //
 							validator.isValidPosition(new DesignRefPosition(
-									target.getPart(), true)))) {
+									target.getPart(), false)))) {
 						return new DesignRefPosition(host, lPart
 								.isBeforePoint(p)
 								|| !lPart.atLeftPart(p));
@@ -248,7 +248,7 @@
 							(!validator.isValidPosition(new DesignRefPosition(
 									target.getPart(), true)) && //
 							!validator.isValidPosition(new DesignRefPosition(
-									target.getPart(), true)))) {
+									target.getPart(), false)))) {
 						if (host.getChildren().size() > 0) {
 							List children = host.getChildren();
 							for (int i = 0, size = children.size(); i < size; i++) {
@@ -280,7 +280,7 @@
 	}
 
 	/**
-	 * similiar to findEditPartPositionConstrained, this method is used to
+	 * Similar to findEditPartPositionConstrained, this method is used to
 	 * vertically move caret.
 	 * 
 	 * @param host
@@ -314,7 +314,7 @@
 
 	/**
 	 * This method is used for move up/down, except for using tactics to deal
-	 * with container, this method is similiar to findEditPartPosition.
+	 * with container, this method is similar to findEditPartPosition.
 	 * 
 	 * @param rootHost 
 	 * @param host 
@@ -357,7 +357,7 @@
 			}
             addToCurrentLine(boxLine, host, p, validator);
 		} else {
-			// root host. we always supporse it has editable area.
+			// root host. we always support it has editable area.
 			if (host == rootHost) {
 				if (host.getChildren().size() > 0) {
 					List children = host.getChildren();
@@ -380,7 +380,7 @@
 			}
 			// container
 			else {
-				// cann't edit it.
+				// can't edit it.
 				if (!validator.hasEditableArea(target)
 						|| !validator.allowsMoveIn(target)) {
 					if (validator.canReference(target, true)
@@ -560,8 +560,8 @@
 	}
 
 	/*
-	 * Here we are doing something to avoid reference witespace tag. Since we
-	 * still need to improve whitespace tags's layout furthure more.
+	 * Here we are doing something to avoid reference whitespace tag. Since we
+	 * still need to improve whitespace tags's layout further more.
 	 */
 	private static EditPart getNextConcretPart(DesignPosition position,
 			List<Boolean> caretIsAtRightTest) {