Browse Source
git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@2164 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61shortcuts
33 changed files with 1783 additions and 281 deletions
@ -1,26 +0,0 @@ |
|||||||
// <file>
|
|
||||||
// <copyright see="prj:///doc/copyright.txt"/>
|
|
||||||
// <license see="prj:///doc/license.txt"/>
|
|
||||||
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
|
|
||||||
// <version>$Revision$</version>
|
|
||||||
// </file>
|
|
||||||
|
|
||||||
using System; |
|
||||||
using ICSharpCode.Core; |
|
||||||
|
|
||||||
namespace ICSharpCode.XmlEditor |
|
||||||
{ |
|
||||||
/// <summary>
|
|
||||||
/// Removes the currently selected comment node from the XML tree.
|
|
||||||
/// </summary>
|
|
||||||
public class RemoveCommentCommand : AbstractMenuCommand |
|
||||||
{ |
|
||||||
public override void Run() |
|
||||||
{ |
|
||||||
XmlTreeViewContainerControl view = Owner as XmlTreeViewContainerControl; |
|
||||||
if (view != null) { |
|
||||||
view.RemoveComment(); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,26 +0,0 @@ |
|||||||
// <file>
|
|
||||||
// <copyright see="prj:///doc/copyright.txt"/>
|
|
||||||
// <license see="prj:///doc/license.txt"/>
|
|
||||||
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
|
|
||||||
// <version>$Revision$</version>
|
|
||||||
// </file>
|
|
||||||
|
|
||||||
using System; |
|
||||||
using ICSharpCode.Core; |
|
||||||
|
|
||||||
namespace ICSharpCode.XmlEditor |
|
||||||
{ |
|
||||||
/// <summary>
|
|
||||||
/// Removes the selected element from the XML tree.
|
|
||||||
/// </summary>
|
|
||||||
public class RemoveElementCommand : AbstractMenuCommand |
|
||||||
{ |
|
||||||
public override void Run() |
|
||||||
{ |
|
||||||
XmlTreeViewContainerControl view = Owner as XmlTreeViewContainerControl; |
|
||||||
if (view != null) { |
|
||||||
view.RemoveElement(); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,26 +0,0 @@ |
|||||||
// <file>
|
|
||||||
// <copyright see="prj:///doc/copyright.txt"/>
|
|
||||||
// <license see="prj:///doc/license.txt"/>
|
|
||||||
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
|
|
||||||
// <version>$Revision$</version>
|
|
||||||
// </file>
|
|
||||||
|
|
||||||
using System; |
|
||||||
using ICSharpCode.Core; |
|
||||||
|
|
||||||
namespace ICSharpCode.XmlEditor |
|
||||||
{ |
|
||||||
/// <summary>
|
|
||||||
/// Removes the currently selected text node from the XML tree.
|
|
||||||
/// </summary>
|
|
||||||
public class RemoveTextNodeCommand : AbstractMenuCommand |
|
||||||
{ |
|
||||||
public override void Run() |
|
||||||
{ |
|
||||||
XmlTreeViewContainerControl view = Owner as XmlTreeViewContainerControl; |
|
||||||
if (view != null) { |
|
||||||
view.RemoveTextNode(); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -0,0 +1,39 @@ |
|||||||
|
// <file>
|
||||||
|
// <copyright see="prj:///doc/copyright.txt"/>
|
||||||
|
// <license see="prj:///doc/license.txt"/>
|
||||||
|
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
|
||||||
|
// <version>$Revision$</version>
|
||||||
|
// </file>
|
||||||
|
|
||||||
|
using System; |
||||||
|
using System.Windows.Forms; |
||||||
|
using ICSharpCode.XmlEditor; |
||||||
|
using NUnit.Framework; |
||||||
|
using XmlEditor.Tests.Utils; |
||||||
|
|
||||||
|
namespace XmlEditor.Tests.Tree |
||||||
|
{ |
||||||
|
/// <summary>
|
||||||
|
/// Tests that the delete key event is fired so we can
|
||||||
|
/// </summary>
|
||||||
|
[TestFixture] |
||||||
|
public class DeleteTreeNodeWithDeleteKeyTestFixture |
||||||
|
{ |
||||||
|
bool deleteKeyPressEventFired; |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void DeleteKeyPressed() |
||||||
|
{ |
||||||
|
using (DerivedXmlTreeViewControl treeView = new DerivedXmlTreeViewControl()) { |
||||||
|
treeView.DeleteKeyPressed += TreeViewDeleteKeyPressed; |
||||||
|
treeView.CallProcessCmdKey(Keys.Delete); |
||||||
|
} |
||||||
|
Assert.IsTrue(deleteKeyPressEventFired); |
||||||
|
} |
||||||
|
|
||||||
|
void TreeViewDeleteKeyPressed(object sender, EventArgs e) |
||||||
|
{ |
||||||
|
deleteKeyPressEventFired = true; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,276 @@ |
|||||||
|
// <file>
|
||||||
|
// <copyright see="prj:///doc/copyright.txt"/>
|
||||||
|
// <license see="prj:///doc/license.txt"/>
|
||||||
|
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
|
||||||
|
// <version>$Revision$</version>
|
||||||
|
// </file>
|
||||||
|
|
||||||
|
using System; |
||||||
|
using System.Xml; |
||||||
|
using ICSharpCode.SharpDevelop.Gui; |
||||||
|
using ICSharpCode.XmlEditor; |
||||||
|
using NUnit.Framework; |
||||||
|
|
||||||
|
namespace XmlEditor.Tests.Tree |
||||||
|
{ |
||||||
|
/// <summary>
|
||||||
|
/// Tests pasting in the XmlTreeViewContainerControl.
|
||||||
|
/// </summary>
|
||||||
|
[TestFixture] |
||||||
|
public class PasteInTreeControlTestFixture |
||||||
|
{ |
||||||
|
XmlDocument doc; |
||||||
|
XmlTreeViewContainerControl treeViewContainerControl; |
||||||
|
XmlTreeViewControl treeView; |
||||||
|
IClipboardHandler clipboardHandler; |
||||||
|
XmlElementTreeNode htmlTreeNode; |
||||||
|
XmlElementTreeNode bodyTreeNode; |
||||||
|
XmlElementTreeNode paragraphTreeNode; |
||||||
|
XmlElement htmlElement; |
||||||
|
XmlElement bodyElement; |
||||||
|
XmlElement paragraphElement; |
||||||
|
XmlTextTreeNode paragraphTextTreeNode; |
||||||
|
XmlText paragraphText; |
||||||
|
XmlCommentTreeNode bodyCommentTreeNode; |
||||||
|
XmlComment bodyComment; |
||||||
|
|
||||||
|
[SetUp] |
||||||
|
public void SetUp() |
||||||
|
{ |
||||||
|
XmlCompletionDataProvider completionDataProvider = new XmlCompletionDataProvider(new XmlSchemaCompletionDataCollection(), null, String.Empty); |
||||||
|
treeViewContainerControl = new XmlTreeViewContainerControl(); |
||||||
|
treeView = treeViewContainerControl.TreeView; |
||||||
|
treeViewContainerControl.LoadXml(GetXml(), completionDataProvider); |
||||||
|
doc = treeViewContainerControl.Document; |
||||||
|
|
||||||
|
clipboardHandler = treeViewContainerControl as IClipboardHandler; |
||||||
|
|
||||||
|
htmlElement = doc.DocumentElement; |
||||||
|
bodyElement = htmlElement.FirstChild as XmlElement; |
||||||
|
paragraphElement = bodyElement.SelectSingleNode("p") as XmlElement; |
||||||
|
paragraphText = paragraphElement.SelectSingleNode("text()") as XmlText; |
||||||
|
bodyComment = bodyElement.SelectSingleNode("comment()") as XmlComment; |
||||||
|
|
||||||
|
htmlTreeNode = treeView.Nodes[0] as XmlElementTreeNode; |
||||||
|
htmlTreeNode.PerformInitialization(); |
||||||
|
bodyTreeNode = htmlTreeNode.FirstNode as XmlElementTreeNode; |
||||||
|
bodyTreeNode.PerformInitialization(); |
||||||
|
bodyCommentTreeNode = bodyTreeNode.FirstNode as XmlCommentTreeNode; |
||||||
|
paragraphTreeNode = bodyTreeNode.LastNode as XmlElementTreeNode; |
||||||
|
paragraphTreeNode.PerformInitialization(); |
||||||
|
paragraphTextTreeNode = paragraphTreeNode.FirstNode as XmlTextTreeNode; |
||||||
|
} |
||||||
|
|
||||||
|
[TearDown] |
||||||
|
public void TearDown() |
||||||
|
{ |
||||||
|
if (treeViewContainerControl != null) { |
||||||
|
treeViewContainerControl.Dispose(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void ClipboardCopyDisabledWhenNoNodeSelected() |
||||||
|
{ |
||||||
|
treeView.SelectedNode = null; |
||||||
|
Assert.IsFalse(clipboardHandler.EnableCopy); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void ClipboardPasteDisabledWhenNoNodeSelected() |
||||||
|
{ |
||||||
|
treeView.SelectedNode = null; |
||||||
|
Assert.IsFalse(clipboardHandler.EnablePaste); |
||||||
|
} |
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Select all is not currently implemented since the tree
|
||||||
|
/// only supports single node selection.
|
||||||
|
/// </summary>
|
||||||
|
[Test] |
||||||
|
public void SelectAllDisabled() |
||||||
|
{ |
||||||
|
Assert.IsFalse(clipboardHandler.EnableSelectAll); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void ClipboardCutDisabledWhenNoNodeSelected() |
||||||
|
{ |
||||||
|
treeView.SelectedNode = null; |
||||||
|
Assert.IsFalse(clipboardHandler.EnableCut); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void ClipboardDeleteDisabledWhenNoNodeSelected() |
||||||
|
{ |
||||||
|
treeView.SelectedNode = null; |
||||||
|
Assert.IsFalse(clipboardHandler.EnableDelete); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void ClipboardDeleteEnabledWhenNodeSelected() |
||||||
|
{ |
||||||
|
treeView.SelectedNode = treeView.Nodes[0]; |
||||||
|
Assert.IsTrue(clipboardHandler.EnableDelete); |
||||||
|
} |
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The cut tree node should have be showing its ghost image
|
||||||
|
/// after being cut.
|
||||||
|
/// </summary>
|
||||||
|
[Test] |
||||||
|
public void CutBodyElement() |
||||||
|
{ |
||||||
|
treeView.SelectedNode = bodyTreeNode; |
||||||
|
treeViewContainerControl.Cut(); |
||||||
|
|
||||||
|
Assert.AreEqual(XmlElementTreeNode.XmlElementTreeNodeGhostImageKey, bodyTreeNode.ImageKey); |
||||||
|
Assert.AreEqual(XmlElementTreeNode.XmlElementTreeNodeGhostImageKey, bodyTreeNode.SelectedImageKey); |
||||||
|
Assert.IsTrue(bodyTreeNode.ShowGhostImage); |
||||||
|
} |
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// This should append a copy of the root element
|
||||||
|
/// as a child of the existing root element. All child nodes of the
|
||||||
|
/// root element should be copied too.
|
||||||
|
/// </summary>
|
||||||
|
[Test] |
||||||
|
public void CopyRootElementAndPasteToRootElement() |
||||||
|
{ |
||||||
|
treeView.SelectedNode = htmlTreeNode; |
||||||
|
treeViewContainerControl.Copy(); |
||||||
|
bool pasteEnabled = treeViewContainerControl.EnablePaste; |
||||||
|
treeViewContainerControl.Paste(); |
||||||
|
|
||||||
|
XmlElement pastedElement = (XmlElement)htmlElement.LastChild; |
||||||
|
XmlElementTreeNode pastedTreeNode = htmlTreeNode.LastNode as XmlElementTreeNode; |
||||||
|
Assert.AreEqual(htmlElement.Name, pastedElement.Name); |
||||||
|
Assert.AreEqual(pastedElement.Name, pastedTreeNode.Text); |
||||||
|
Assert.AreSame(pastedElement, pastedTreeNode.XmlElement); |
||||||
|
Assert.IsTrue(pasteEnabled); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void CutAndPasteElement() |
||||||
|
{ |
||||||
|
treeView.SelectedNode = paragraphTreeNode; |
||||||
|
treeViewContainerControl.Cut(); |
||||||
|
treeView.SelectedNode = htmlTreeNode; |
||||||
|
bool pasteEnabled = treeViewContainerControl.EnablePaste; |
||||||
|
treeViewContainerControl.Paste(); |
||||||
|
|
||||||
|
XmlElement pastedElement = htmlElement.LastChild as XmlElement; |
||||||
|
XmlElementTreeNode pastedTreeNode = htmlTreeNode.LastNode as XmlElementTreeNode; |
||||||
|
|
||||||
|
Assert.AreSame(paragraphElement, pastedElement); |
||||||
|
Assert.IsNull(bodyElement.SelectSingleNode("p")); |
||||||
|
Assert.AreSame(paragraphElement, pastedTreeNode.XmlElement); |
||||||
|
Assert.IsTrue(pasteEnabled); |
||||||
|
Assert.AreEqual(XmlElementTreeNode.XmlElementTreeNodeImageKey, |
||||||
|
pastedTreeNode.ImageKey, |
||||||
|
"Should not be ghost image."); |
||||||
|
} |
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Check that the ghost image is removed when the user pastes the
|
||||||
|
/// cut node back onto itself.
|
||||||
|
/// </summary>
|
||||||
|
[Test] |
||||||
|
public void CutAndPasteElementBackOntoItself() |
||||||
|
{ |
||||||
|
treeView.SelectedNode = paragraphTreeNode; |
||||||
|
treeViewContainerControl.Cut(); |
||||||
|
treeView.SelectedNode = paragraphTreeNode; |
||||||
|
treeViewContainerControl.Paste(); |
||||||
|
|
||||||
|
Assert.IsFalse(treeViewContainerControl.IsDirty); |
||||||
|
Assert.AreSame(XmlElementTreeNode.XmlElementTreeNodeImageKey, paragraphTreeNode.ImageKey); |
||||||
|
Assert.AreSame(XmlElementTreeNode.XmlElementTreeNodeImageKey, paragraphTreeNode.SelectedImageKey); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void CopyAndPasteTextNode() |
||||||
|
{ |
||||||
|
treeView.SelectedNode = paragraphTextTreeNode; |
||||||
|
treeViewContainerControl.Copy(); |
||||||
|
treeView.SelectedNode = bodyTreeNode; |
||||||
|
treeViewContainerControl.Paste(); |
||||||
|
|
||||||
|
XmlText pastedTextNode = bodyElement.LastChild as XmlText; |
||||||
|
XmlTextTreeNode pastedTreeNode = bodyTreeNode.LastNode as XmlTextTreeNode; |
||||||
|
|
||||||
|
Assert.AreEqual(pastedTextNode.InnerText, paragraphText.InnerText); |
||||||
|
Assert.AreEqual(paragraphText.InnerText, pastedTreeNode.Text); |
||||||
|
Assert.IsTrue(treeViewContainerControl.IsDirty); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void CutAndPasteTextNode() |
||||||
|
{ |
||||||
|
treeView.SelectedNode = paragraphTextTreeNode; |
||||||
|
treeViewContainerControl.Cut(); |
||||||
|
string paragraphTextTreeNodeImageKeyAfterCut = paragraphTextTreeNode.ImageKey; |
||||||
|
treeView.SelectedNode = bodyTreeNode; |
||||||
|
treeViewContainerControl.Paste(); |
||||||
|
|
||||||
|
XmlText pastedTextNode = bodyElement.LastChild as XmlText; |
||||||
|
XmlTextTreeNode pastedTreeNode = bodyTreeNode.LastNode as XmlTextTreeNode; |
||||||
|
|
||||||
|
Assert.AreSame(paragraphText, pastedTextNode); |
||||||
|
Assert.IsNull(paragraphElement.SelectSingleNode("text()")); |
||||||
|
Assert.AreEqual(XmlTextTreeNode.XmlTextTreeNodeGhostImageKey, |
||||||
|
paragraphTextTreeNodeImageKeyAfterCut); |
||||||
|
Assert.AreEqual(XmlTextTreeNode.XmlTextTreeNodeImageKey, |
||||||
|
pastedTreeNode.ImageKey, |
||||||
|
"Should not be ghost image."); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void CopyAndPasteCommentNode() |
||||||
|
{ |
||||||
|
treeView.SelectedNode = bodyCommentTreeNode; |
||||||
|
treeViewContainerControl.Copy(); |
||||||
|
treeView.SelectedNode = htmlTreeNode; |
||||||
|
treeViewContainerControl.Paste(); |
||||||
|
|
||||||
|
XmlComment pastedCommentNode = htmlElement.LastChild as XmlComment; |
||||||
|
XmlCommentTreeNode pastedTreeNode = htmlTreeNode.LastNode as XmlCommentTreeNode; |
||||||
|
|
||||||
|
Assert.AreEqual(pastedCommentNode.InnerText, bodyComment.InnerText); |
||||||
|
Assert.AreEqual(bodyComment.InnerText.Trim(), pastedTreeNode.Text); |
||||||
|
Assert.IsTrue(treeViewContainerControl.IsDirty); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void CutAndPasteCommentNode() |
||||||
|
{ |
||||||
|
treeView.SelectedNode = bodyCommentTreeNode; |
||||||
|
treeViewContainerControl.Cut(); |
||||||
|
string bodyCommentTreeNodeImageKeyAfterCut = bodyCommentTreeNode.ImageKey; |
||||||
|
treeView.SelectedNode = htmlTreeNode; |
||||||
|
treeViewContainerControl.Paste(); |
||||||
|
|
||||||
|
XmlComment pastedCommentNode = htmlElement.LastChild as XmlComment; |
||||||
|
XmlCommentTreeNode pastedTreeNode = htmlTreeNode.LastNode as XmlCommentTreeNode; |
||||||
|
|
||||||
|
Assert.AreSame(bodyComment, pastedCommentNode); |
||||||
|
Assert.AreSame(bodyComment, pastedTreeNode.XmlComment); |
||||||
|
Assert.IsNull(bodyElement.SelectSingleNode("comment()")); |
||||||
|
Assert.AreEqual(XmlCommentTreeNode.XmlCommentTreeNodeGhostImageKey, |
||||||
|
bodyCommentTreeNodeImageKeyAfterCut); |
||||||
|
Assert.AreEqual(XmlCommentTreeNode.XmlCommentTreeNodeImageKey, |
||||||
|
pastedTreeNode.ImageKey, |
||||||
|
"Should not be ghost image."); |
||||||
|
} |
||||||
|
|
||||||
|
string GetXml() |
||||||
|
{ |
||||||
|
return "<html>\r\n" + |
||||||
|
"\t<body>\r\n" + |
||||||
|
"\t\t<!-- Comment -->\r\n" + |
||||||
|
"\t\t<p>some text here</p>\r\n" + |
||||||
|
"\t</body>\r\n" + |
||||||
|
"</html>"; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,372 @@ |
|||||||
|
// <file>
|
||||||
|
// <copyright see="prj:///doc/copyright.txt"/>
|
||||||
|
// <license see="prj:///doc/license.txt"/>
|
||||||
|
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
|
||||||
|
// <version>$Revision$</version>
|
||||||
|
// </file>
|
||||||
|
|
||||||
|
using System; |
||||||
|
using System.Xml; |
||||||
|
using ICSharpCode.XmlEditor; |
||||||
|
using NUnit.Framework; |
||||||
|
using XmlEditor.Tests.Utils; |
||||||
|
|
||||||
|
namespace XmlEditor.Tests.Tree |
||||||
|
{ |
||||||
|
/// <summary>
|
||||||
|
/// Tests pasting nodes with the XmlTreeEditor either from a cut or a copy.
|
||||||
|
/// Here we are testing the XmlTreeEditor side and now the actual
|
||||||
|
/// GUI side - XML Tree.
|
||||||
|
/// </summary>
|
||||||
|
[TestFixture] |
||||||
|
public class PasteTestFixture : XmlTreeViewTestFixtureBase |
||||||
|
{ |
||||||
|
XmlElement rootElement; |
||||||
|
XmlElement bodyElement; |
||||||
|
XmlElement paragraphElement; |
||||||
|
XmlComment bodyComment; |
||||||
|
XmlText paragraphText; |
||||||
|
|
||||||
|
[SetUp] |
||||||
|
public void Init() |
||||||
|
{ |
||||||
|
base.InitFixture(); |
||||||
|
rootElement = editor.Document.DocumentElement; |
||||||
|
bodyElement = (XmlElement)rootElement.FirstChild; |
||||||
|
paragraphElement = (XmlElement)bodyElement.SelectSingleNode("p"); |
||||||
|
bodyComment = (XmlComment)bodyElement.SelectSingleNode("comment()"); |
||||||
|
paragraphText = (XmlText)paragraphElement.SelectSingleNode("text()"); |
||||||
|
} |
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Here we take a copy of the root element of the document and paste
|
||||||
|
/// it on top of itself. This should append a copy of the root element
|
||||||
|
/// as a child of the existing root element. All child nodes of the
|
||||||
|
/// root element should be copied too.
|
||||||
|
/// </summary>
|
||||||
|
[Test] |
||||||
|
public void CopyRootElementAndPasteToRootElement() |
||||||
|
{ |
||||||
|
mockXmlTreeView.SelectedElement = rootElement; |
||||||
|
editor.Copy(); |
||||||
|
bool pasteEnabled = editor.IsPasteEnabled; |
||||||
|
editor.Paste(); |
||||||
|
|
||||||
|
XmlElement pastedElement = (XmlElement)rootElement.LastChild; |
||||||
|
Assert.AreEqual(rootElement.Name, pastedElement.Name); |
||||||
|
Assert.AreEqual(rootElement.FirstChild.Name, pastedElement.FirstChild.Name); |
||||||
|
Assert.IsTrue(mockXmlTreeView.IsDirty); |
||||||
|
Assert.AreEqual(1, mockXmlTreeView.ChildElementsAdded.Count); |
||||||
|
Assert.AreEqual(pastedElement, mockXmlTreeView.ChildElementsAdded[0]); |
||||||
|
Assert.IsTrue(pasteEnabled); |
||||||
|
} |
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The selected node is null when the paste is attempted. Here
|
||||||
|
/// nothing should happen.
|
||||||
|
/// </summary>
|
||||||
|
[Test] |
||||||
|
public void PasteWhenNoNodeSelected() |
||||||
|
{ |
||||||
|
mockXmlTreeView.SelectedNode = rootElement; |
||||||
|
editor.Copy(); |
||||||
|
mockXmlTreeView.SelectedNode = null; |
||||||
|
bool pasteEnabled = editor.IsPasteEnabled; |
||||||
|
editor.Paste(); |
||||||
|
|
||||||
|
Assert.IsFalse(mockXmlTreeView.IsDirty); |
||||||
|
Assert.IsFalse(pasteEnabled); |
||||||
|
} |
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Check that the view is informed when a node is cut. This allows the
|
||||||
|
/// view to give some sort of indication that a particular node is
|
||||||
|
/// being cut.
|
||||||
|
/// </summary>
|
||||||
|
[Test] |
||||||
|
public void CutElement() |
||||||
|
{ |
||||||
|
mockXmlTreeView.SelectedElement = bodyElement; |
||||||
|
editor.Cut(); |
||||||
|
|
||||||
|
Assert.AreEqual(1, mockXmlTreeView.CutNodes.Count); |
||||||
|
Assert.AreEqual(bodyElement, mockXmlTreeView.CutNodes[0]); |
||||||
|
Assert.IsFalse(mockXmlTreeView.IsDirty); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void CutAndPasteElement() |
||||||
|
{ |
||||||
|
mockXmlTreeView.SelectedElement = paragraphElement; |
||||||
|
editor.Cut(); |
||||||
|
mockXmlTreeView.SelectedElement = rootElement; |
||||||
|
editor.Paste(); |
||||||
|
|
||||||
|
XmlElement pastedElement = rootElement.LastChild as XmlElement; |
||||||
|
Assert.IsTrue(mockXmlTreeView.IsDirty); |
||||||
|
Assert.AreSame(paragraphElement, pastedElement); |
||||||
|
Assert.IsNull(bodyElement.SelectSingleNode("p")); |
||||||
|
Assert.AreEqual(1, mockXmlTreeView.ChildElementsAdded.Count); |
||||||
|
Assert.AreSame(paragraphElement, mockXmlTreeView.ChildElementsAdded[0]); |
||||||
|
Assert.AreEqual(1, mockXmlTreeView.ElementsRemoved.Count); |
||||||
|
Assert.AreSame(paragraphElement, mockXmlTreeView.ElementsRemoved[0]); |
||||||
|
} |
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Checks that nothing happens when no node is selected in the tree
|
||||||
|
/// to cut.
|
||||||
|
/// </summary>
|
||||||
|
[Test] |
||||||
|
public void NoElementSelectedToCut() |
||||||
|
{ |
||||||
|
editor.Cut(); |
||||||
|
|
||||||
|
Assert.AreEqual(0, mockXmlTreeView.CutNodes.Count); |
||||||
|
} |
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The selected node is null when the copy method is called, but
|
||||||
|
/// there is a selected node when the paste is attempted. Here
|
||||||
|
/// nothing should happen.
|
||||||
|
/// </summary>
|
||||||
|
[Test] |
||||||
|
public void CopyWhenNoNodeSelectedThenPaste() |
||||||
|
{ |
||||||
|
mockXmlTreeView.SelectedNode = null; |
||||||
|
editor.Copy(); |
||||||
|
mockXmlTreeView.SelectedNode = rootElement; |
||||||
|
|
||||||
|
bool pasteEnabled = editor.IsPasteEnabled; |
||||||
|
editor.Paste(); |
||||||
|
|
||||||
|
Assert.IsFalse(mockXmlTreeView.IsDirty); |
||||||
|
Assert.IsFalse(pasteEnabled); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void IsCopyEnabledWhenNoNodeSelected() |
||||||
|
{ |
||||||
|
Assert.IsFalse(editor.IsCopyEnabled); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void IsCopyEnabledWhenRootElementSelected() |
||||||
|
{ |
||||||
|
mockXmlTreeView.SelectedElement = rootElement; |
||||||
|
mockXmlTreeView.SelectedNode = rootElement; |
||||||
|
Assert.IsTrue(editor.IsCopyEnabled); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void IsCutEnabledWhenChildElementSelected() |
||||||
|
{ |
||||||
|
mockXmlTreeView.SelectedElement = bodyElement; |
||||||
|
mockXmlTreeView.SelectedNode = bodyElement; |
||||||
|
Assert.IsTrue(editor.IsCutEnabled); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void IsCutEnabledWhenRootElementSelected() |
||||||
|
{ |
||||||
|
mockXmlTreeView.SelectedElement = rootElement; |
||||||
|
mockXmlTreeView.SelectedNode = rootElement; |
||||||
|
Assert.IsFalse(editor.IsCutEnabled); |
||||||
|
} |
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The document should not change if the user decides to paste the
|
||||||
|
/// cut node back to itself. All that should happen is the view
|
||||||
|
/// updates the cut node so it no longer has the ghost image.
|
||||||
|
/// </summary>
|
||||||
|
[Test] |
||||||
|
public void CutAndPasteToSameNode() |
||||||
|
{ |
||||||
|
mockXmlTreeView.SelectedElement = paragraphElement; |
||||||
|
editor.Cut(); |
||||||
|
mockXmlTreeView.SelectedElement = paragraphElement; |
||||||
|
editor.Paste(); |
||||||
|
|
||||||
|
Assert.IsFalse(mockXmlTreeView.IsDirty); |
||||||
|
Assert.AreEqual(0, mockXmlTreeView.ChildElementsAdded.Count); |
||||||
|
Assert.AreEqual(1, mockXmlTreeView.HiddenCutNodes.Count); |
||||||
|
Assert.AreSame(paragraphElement, mockXmlTreeView.HiddenCutNodes[0]); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void CutThenPasteTwiceToSameNode() |
||||||
|
{ |
||||||
|
mockXmlTreeView.SelectedElement = paragraphElement; |
||||||
|
editor.Cut(); |
||||||
|
mockXmlTreeView.SelectedElement = paragraphElement; |
||||||
|
editor.Paste(); |
||||||
|
mockXmlTreeView.IsDirty = false; |
||||||
|
mockXmlTreeView.HiddenCutNodes.Clear(); |
||||||
|
mockXmlTreeView.SelectedElement = rootElement; |
||||||
|
bool pasteEnabled = editor.IsPasteEnabled; |
||||||
|
editor.Paste(); |
||||||
|
|
||||||
|
Assert.IsFalse(mockXmlTreeView.IsDirty); |
||||||
|
Assert.AreEqual(0, mockXmlTreeView.ChildElementsAdded.Count); |
||||||
|
Assert.IsFalse(pasteEnabled); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void CannotPasteElementOntoCommentNode() |
||||||
|
{ |
||||||
|
mockXmlTreeView.SelectedElement = paragraphElement; |
||||||
|
editor.Copy(); |
||||||
|
mockXmlTreeView.SelectedComment = bodyComment; |
||||||
|
|
||||||
|
Assert.IsFalse(editor.IsPasteEnabled); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void CannotPasteElementOntoTextNode() |
||||||
|
{ |
||||||
|
mockXmlTreeView.SelectedElement = paragraphElement; |
||||||
|
editor.Copy(); |
||||||
|
mockXmlTreeView.SelectedComment = bodyComment; |
||||||
|
|
||||||
|
Assert.IsFalse(editor.IsPasteEnabled); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void CopyAndPasteTextNode() |
||||||
|
{ |
||||||
|
mockXmlTreeView.SelectedTextNode = paragraphText; |
||||||
|
editor.Copy(); |
||||||
|
bool pastedEnabledWhenTextNodeSelected = editor.IsPasteEnabled; |
||||||
|
mockXmlTreeView.SelectedElement = bodyElement; |
||||||
|
bool pasteEnabled = editor.IsPasteEnabled; |
||||||
|
editor.Paste(); |
||||||
|
|
||||||
|
XmlText pastedTextNode = bodyElement.LastChild as XmlText; |
||||||
|
|
||||||
|
Assert.IsFalse(pastedEnabledWhenTextNodeSelected); |
||||||
|
Assert.IsTrue(pasteEnabled); |
||||||
|
Assert.IsTrue(mockXmlTreeView.IsDirty); |
||||||
|
Assert.IsNotNull(pastedTextNode); |
||||||
|
Assert.AreEqual(paragraphText.InnerText, pastedTextNode.InnerText); |
||||||
|
Assert.AreEqual(1, mockXmlTreeView.ChildTextNodesAdded.Count); |
||||||
|
Assert.AreEqual(pastedTextNode, mockXmlTreeView.ChildTextNodesAdded[0]); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void CutAndPasteTextNode() |
||||||
|
{ |
||||||
|
mockXmlTreeView.SelectedTextNode = paragraphText; |
||||||
|
editor.Cut(); |
||||||
|
mockXmlTreeView.SelectedElement = bodyElement; |
||||||
|
bool pasteEnabled = editor.IsPasteEnabled; |
||||||
|
editor.Paste(); |
||||||
|
|
||||||
|
XmlText pastedTextNode = bodyElement.LastChild as XmlText; |
||||||
|
|
||||||
|
Assert.IsTrue(pasteEnabled); |
||||||
|
Assert.IsNotNull(pastedTextNode); |
||||||
|
Assert.IsTrue(mockXmlTreeView.IsDirty); |
||||||
|
Assert.IsNull(paragraphElement.SelectSingleNode("text()")); |
||||||
|
Assert.AreEqual(1, mockXmlTreeView.ChildTextNodesAdded.Count); |
||||||
|
Assert.AreEqual(pastedTextNode, mockXmlTreeView.ChildTextNodesAdded[0]); |
||||||
|
Assert.AreEqual(1, mockXmlTreeView.CutNodes.Count); |
||||||
|
Assert.AreSame(pastedTextNode, mockXmlTreeView.CutNodes[0]); |
||||||
|
Assert.AreEqual(1, mockXmlTreeView.TextNodesRemoved.Count); |
||||||
|
Assert.AreSame(paragraphText, mockXmlTreeView.TextNodesRemoved[0]); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void CopyAndPasteCommentNode() |
||||||
|
{ |
||||||
|
mockXmlTreeView.SelectedComment = bodyComment; |
||||||
|
editor.Copy(); |
||||||
|
bool pastedEnabledWhenCommentSelected = editor.IsPasteEnabled; |
||||||
|
mockXmlTreeView.SelectedElement = rootElement; |
||||||
|
bool pasteEnabled = editor.IsPasteEnabled; |
||||||
|
editor.Paste(); |
||||||
|
|
||||||
|
XmlComment pastedCommentNode = rootElement.LastChild as XmlComment; |
||||||
|
|
||||||
|
Assert.IsFalse(pastedEnabledWhenCommentSelected); |
||||||
|
Assert.IsTrue(pasteEnabled); |
||||||
|
Assert.IsTrue(mockXmlTreeView.IsDirty); |
||||||
|
Assert.IsNotNull(pastedCommentNode); |
||||||
|
Assert.AreEqual(bodyComment.InnerText, pastedCommentNode.InnerText); |
||||||
|
Assert.AreEqual(1, mockXmlTreeView.ChildCommentNodesAdded.Count); |
||||||
|
Assert.AreEqual(pastedCommentNode, mockXmlTreeView.ChildCommentNodesAdded[0]); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void CutAndPasteCommentNode() |
||||||
|
{ |
||||||
|
mockXmlTreeView.SelectedComment = bodyComment; |
||||||
|
editor.Cut(); |
||||||
|
mockXmlTreeView.SelectedElement = rootElement; |
||||||
|
bool pasteEnabled = editor.IsPasteEnabled; |
||||||
|
editor.Paste(); |
||||||
|
|
||||||
|
XmlComment pastedCommentNode = rootElement.LastChild as XmlComment; |
||||||
|
|
||||||
|
Assert.IsTrue(pasteEnabled); |
||||||
|
Assert.IsNotNull(pastedCommentNode); |
||||||
|
Assert.IsTrue(mockXmlTreeView.IsDirty); |
||||||
|
Assert.IsNull(bodyElement.SelectSingleNode("comment()")); |
||||||
|
Assert.AreSame(bodyComment, pastedCommentNode); |
||||||
|
Assert.AreEqual(1, mockXmlTreeView.ChildCommentNodesAdded.Count); |
||||||
|
Assert.AreEqual(pastedCommentNode, mockXmlTreeView.ChildCommentNodesAdded[0]); |
||||||
|
Assert.AreEqual(1, mockXmlTreeView.CutNodes.Count); |
||||||
|
Assert.AreSame(pastedCommentNode, mockXmlTreeView.CutNodes[0]); |
||||||
|
Assert.AreEqual(1, mockXmlTreeView.CommentNodesRemoved.Count); |
||||||
|
Assert.AreSame(pastedCommentNode, mockXmlTreeView.CommentNodesRemoved[0]); |
||||||
|
} |
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Tests that the cut node has its ghost image removed.
|
||||||
|
/// </summary>
|
||||||
|
[Test] |
||||||
|
public void CutThenCopyElement() |
||||||
|
{ |
||||||
|
mockXmlTreeView.SelectedElement = bodyElement; |
||||||
|
editor.Cut(); |
||||||
|
editor.Copy(); |
||||||
|
|
||||||
|
Assert.AreEqual(1, mockXmlTreeView.HiddenCutNodes.Count); |
||||||
|
Assert.AreSame(bodyElement, mockXmlTreeView.HiddenCutNodes[0]); |
||||||
|
} |
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// This test makes sure that the copied node is cleared when
|
||||||
|
/// the user decides to do a cut.
|
||||||
|
/// </summary>
|
||||||
|
[Test] |
||||||
|
public void CopyThenCutAndPasteElement() |
||||||
|
{ |
||||||
|
mockXmlTreeView.SelectedElement = paragraphElement; |
||||||
|
editor.Copy(); |
||||||
|
editor.Cut(); |
||||||
|
mockXmlTreeView.SelectedElement = rootElement; |
||||||
|
editor.Paste(); |
||||||
|
|
||||||
|
Assert.IsNull(bodyElement.SelectSingleNode("p")); |
||||||
|
} |
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns the xhtml strict schema as the default schema.
|
||||||
|
/// </summary>
|
||||||
|
protected override XmlSchemaCompletionData DefaultSchemaCompletionData { |
||||||
|
get { |
||||||
|
XmlTextReader reader = ResourceManager.GetXhtmlStrictSchema(); |
||||||
|
return new XmlSchemaCompletionData(reader); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
protected override string GetXml() |
||||||
|
{ |
||||||
|
return "<html>\r\n" + |
||||||
|
"\t<body>\r\n" + |
||||||
|
"\t\t<!-- Comment -->\r\n" + |
||||||
|
"\t\t<p>some text here</p>\r\n" + |
||||||
|
"\t</body>\r\n" + |
||||||
|
"</html>"; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,133 @@ |
|||||||
|
// <file>
|
||||||
|
// <copyright see="prj:///doc/copyright.txt"/>
|
||||||
|
// <license see="prj:///doc/license.txt"/>
|
||||||
|
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
|
||||||
|
// <version>$Revision$</version>
|
||||||
|
// </file>
|
||||||
|
|
||||||
|
using System; |
||||||
|
using ICSharpCode.SharpDevelop; |
||||||
|
using ICSharpCode.SharpDevelop.Gui; |
||||||
|
using ICSharpCode.TextEditor.Document; |
||||||
|
using ICSharpCode.XmlEditor; |
||||||
|
using NUnit.Framework; |
||||||
|
using XmlEditor.Tests.Utils; |
||||||
|
|
||||||
|
namespace XmlEditor.Tests.Tree |
||||||
|
{ |
||||||
|
/// <summary>
|
||||||
|
/// Tests the XmlTreeView's IClipboardHandler implementation. Here
|
||||||
|
/// we are just checking that it calls the XmlTreeViewContainerControl
|
||||||
|
/// class.
|
||||||
|
/// </summary>
|
||||||
|
[TestFixture] |
||||||
|
public class XmlTreeViewClipboardHandlerTestFixture |
||||||
|
{ |
||||||
|
XmlView xmlView; |
||||||
|
XmlTreeView view; |
||||||
|
XmlTreeViewContainerControl treeViewContainer; |
||||||
|
XmlTreeViewControl treeView; |
||||||
|
IClipboardHandler clipboardHandler; |
||||||
|
XmlElementTreeNode htmlTreeNode; |
||||||
|
XmlElementTreeNode bodyTreeNode; |
||||||
|
XmlElementTreeNode paragraphTreeNode; |
||||||
|
|
||||||
|
[SetUp] |
||||||
|
public void SetUp() |
||||||
|
{ |
||||||
|
XmlSchemaCompletionDataCollection schemas = new XmlSchemaCompletionDataCollection(); |
||||||
|
xmlView = new XmlView(new DefaultTextEditorProperties(), schemas); |
||||||
|
view = new XmlTreeView(xmlView, null, null); |
||||||
|
treeViewContainer = (XmlTreeViewContainerControl)view.Control; |
||||||
|
treeView = treeViewContainer.TreeView; |
||||||
|
clipboardHandler = view as IClipboardHandler; |
||||||
|
|
||||||
|
xmlView.XmlEditor.Text = "<html><body><p></p></body></html>"; |
||||||
|
xmlView.IsDirty = false; |
||||||
|
view.Selected(); |
||||||
|
|
||||||
|
htmlTreeNode = treeView.Nodes[0] as XmlElementTreeNode; |
||||||
|
htmlTreeNode.PerformInitialization(); |
||||||
|
bodyTreeNode = htmlTreeNode.Nodes[0] as XmlElementTreeNode; |
||||||
|
bodyTreeNode.PerformInitialization(); |
||||||
|
paragraphTreeNode = bodyTreeNode.Nodes[0] as XmlElementTreeNode; |
||||||
|
|
||||||
|
treeView.SelectedNode = null; |
||||||
|
} |
||||||
|
|
||||||
|
[TearDown] |
||||||
|
public void TearDown() |
||||||
|
{ |
||||||
|
if (view != null) { |
||||||
|
view.Dispose(); |
||||||
|
} |
||||||
|
if (xmlView != null) { |
||||||
|
xmlView.Dispose(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void CopyDisabledWhenNoNodeSelected() |
||||||
|
{ |
||||||
|
Assert.IsFalse(clipboardHandler.EnableCopy); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void CutDisabledWhenNoNodeSelected() |
||||||
|
{ |
||||||
|
Assert.IsFalse(clipboardHandler.EnableCut); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void PasteDisabledWhenNoNodeSelected() |
||||||
|
{ |
||||||
|
Assert.IsFalse(clipboardHandler.EnablePaste); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void DeleteDisabledWhenNoNodeSelected() |
||||||
|
{ |
||||||
|
Assert.IsFalse(clipboardHandler.EnableDelete); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void SelectAllDisabled() |
||||||
|
{ |
||||||
|
Assert.IsFalse(clipboardHandler.EnableSelectAll); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void CopyAndPaste() |
||||||
|
{ |
||||||
|
treeView.SelectedNode = htmlTreeNode; |
||||||
|
view.Copy(); |
||||||
|
view.Paste(); |
||||||
|
|
||||||
|
Assert.IsTrue(xmlView.IsDirty); |
||||||
|
Assert.AreEqual(htmlTreeNode.Text, htmlTreeNode.LastNode.Text); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void CutAndPaste() |
||||||
|
{ |
||||||
|
treeView.SelectedNode = paragraphTreeNode; |
||||||
|
view.Cut(); |
||||||
|
treeView.SelectedNode = htmlTreeNode; |
||||||
|
view.Paste(); |
||||||
|
|
||||||
|
Assert.IsTrue(xmlView.IsDirty); |
||||||
|
Assert.AreEqual(paragraphTreeNode.Text, htmlTreeNode.LastNode.Text); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void DeleteRootElement() |
||||||
|
{ |
||||||
|
treeView.SelectedNode = htmlTreeNode; |
||||||
|
|
||||||
|
clipboardHandler.Delete(); |
||||||
|
|
||||||
|
Assert.AreEqual(0, treeView.Nodes.Count); |
||||||
|
Assert.IsTrue(xmlView.IsDirty); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue