#develop (short for SharpDevelop) is a free IDE for .NET programming languages.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

259 lines
6.9 KiB

// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Mike Krüger" email="mike@icsharpcode.net"/>
// <version>$Revision$</version>
// </file>
using System;
using System.Collections;
using System.IO;
using System.Windows.Forms;
using ICSharpCode.Core;
using ICSharpCode.Core.WinForms;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Gui;
namespace ResourceEditor
{
public class ResourceEditorDisplayBinding : IDisplayBinding
{
// IDisplayBinding interface
public bool CanCreateContentForFile(string fileName)
{
return Path.GetExtension(fileName).Equals(".RESOURCES", StringComparison.OrdinalIgnoreCase) ||
Path.GetExtension(fileName).Equals(".RESX", StringComparison.OrdinalIgnoreCase);
}
public IViewContent CreateContentForFile(OpenedFile file)
{
return new ResourceEditWrapper(file);
}
}
/// <summary>
/// This class describes the main functionality of a language codon
/// </summary>
public class ResourceEditWrapper : AbstractViewContentHandlingLoadErrors, IClipboardHandler
{
ResourceEditorControl resourceEditor = new ResourceEditorControl();
public ResourceEditorControl ResourceEditor {
get { return resourceEditor; }
}
public override bool IsReadOnly {
get {
return false;
}
}
void SetDirty(object sender, EventArgs e)
{
this.PrimaryFile.MakeDirty();
}
public ResourceEditWrapper(OpenedFile file)
{
this.TabPageText = "Resource editor";
base.UserContent = resourceEditor;
resourceEditor.ResourceList.Changed += new EventHandler(SetDirty);
this.Files.Add(file);
}
public override void Dispose()
{
base.Dispose();
resourceEditor.Dispose();
}
protected override void LoadInternal(OpenedFile file, Stream stream)
{
resourceEditor.ResourceList.LoadFile(file.FileName, stream);
}
protected override void SaveInternal(OpenedFile file, Stream stream)
{
resourceEditor.ResourceList.SaveFile(file.FileName, stream);
}
public bool EnableCut
{
get {
if (resourceEditor.ResourceList.IsEditing || !resourceEditor.ResourceList.Focused) {
return false;
}
return resourceEditor.ResourceList.SelectedItems.Count > 0;
}
}
public bool EnableCopy
{
get {
if (resourceEditor.ResourceList.IsEditing || !resourceEditor.ResourceList.Focused) {
return false;
}
return resourceEditor.ResourceList.SelectedItems.Count > 0;
}
}
public bool EnablePaste
{
get {
if (resourceEditor.ResourceList.IsEditing || !resourceEditor.ResourceList.Focused) {
return false;
}
return true;
}
}
public bool EnableDelete
{
get {
if (resourceEditor.ResourceList.IsEditing || !resourceEditor.ResourceList.Focused) {
return false;
}
return resourceEditor.ResourceList.SelectedItems.Count > 0;
}
}
public bool EnableSelectAll
{
get {
if (resourceEditor.ResourceList.IsEditing || !resourceEditor.ResourceList.Focused) {
return false;
}
return true;
}
}
public void Cut()
{
if (resourceEditor.ResourceList.WriteProtected || resourceEditor.ResourceList.SelectedItems.Count < 1)
return;
Hashtable tmphash = new Hashtable();
foreach (ListViewItem item in resourceEditor.ResourceList.SelectedItems) {
tmphash.Add(item.Text, resourceEditor.ResourceList.Resources[item.Text].ResourceValue);
resourceEditor.ResourceList.Resources.Remove(item.Text);
resourceEditor.ResourceList.Items.Remove(item);
}
resourceEditor.ResourceList.OnChanged();
ClipboardWrapper.SetDataObject(tmphash);
}
public void Copy()
{
if (resourceEditor.ResourceList.SelectedItems.Count < 1) {
return;
}
Hashtable tmphash = new Hashtable();
foreach (ListViewItem item in resourceEditor.ResourceList.SelectedItems) {
object resourceValue = GetClonedResource(resourceEditor.ResourceList.Resources[item.Text].ResourceValue);
tmphash.Add(item.Text, resourceValue); // copy a clone to clipboard
}
ClipboardWrapper.SetDataObject(tmphash);
}
public void Paste()
{
if (resourceEditor.ResourceList.WriteProtected) {
return;
}
IDataObject dob = ClipboardWrapper.GetDataObject();
if (dob == null)
return;
if (dob.GetDataPresent(typeof(Hashtable).FullName)) {
Hashtable tmphash = (Hashtable)dob.GetData(typeof(Hashtable));
foreach (DictionaryEntry entry in tmphash) {
object resourceValue = GetClonedResource(entry.Value);
ResourceItem item;
if (!resourceEditor.ResourceList.Resources.ContainsKey((string)entry.Key)) {
item = new ResourceItem(entry.Key.ToString(), resourceValue);
} else {
int count = 1;
string newNameBase = entry.Key.ToString() + " ";
string newName = newNameBase + count.ToString();
while(resourceEditor.ResourceList.Resources.ContainsKey(newName)) {
count++;
newName = newNameBase + count.ToString();
}
item = new ResourceItem(newName, resourceValue);
}
resourceEditor.ResourceList.Resources.Add(item.Name, item);
resourceEditor.ResourceList.OnChanged();
}
resourceEditor.ResourceList.InitializeListView();
}
}
/// <summary>
/// Clones a resource if the <paramref name="resource"/>
/// is cloneable.
/// </summary>
/// <param name="resource">A resource to clone.</param>
/// <returns>A cloned resource if the object implements
/// the ICloneable interface, otherwise the
/// <paramref name="resource"/> object.</returns>
object GetClonedResource(object resource)
{
object clonedResource = null;
ICloneable cloneableResource = resource as ICloneable;
if (cloneableResource != null) {
clonedResource = cloneableResource.Clone();
} else {
clonedResource = resource;
}
return clonedResource;
}
public void Delete()
{
if (resourceEditor.ResourceList.WriteProtected) {
return;
}
if (resourceEditor.ResourceList.SelectedItems.Count==0) return; // nothing to do
DialogResult rc;
try {
rc=MessageBox.Show(ResourceService.GetString("ResourceEditor.DeleteEntry.Confirm"),ResourceService.GetString("ResourceEditor.DeleteEntry.Title"),MessageBoxButtons.OKCancel);
}
catch {
// when something happens - like resource is missing - try to use default message
rc = MessageBox.Show("Do you really want to delete?","Delete-Warning!",MessageBoxButtons.OKCancel);
}
if (rc != DialogResult.OK) {
return;
}
foreach (ListViewItem item in resourceEditor.ResourceList.SelectedItems) {
//// not clear why this check is present here - seems to be extra
////if (item.Text != null) {
resourceEditor.ResourceList.Resources.Remove(item.Text);
resourceEditor.ResourceList.Items.Remove(item);
// and set dirty flag
resourceEditor.ResourceList.OnChanged();
}
}
public void SelectAll()
{
foreach (ListViewItem i in resourceEditor.ResourceList.Items) {
i.Selected=true;
}
}
}
}