Builders.cs
上传用户:hbhltzc
上传日期:2022-06-04
资源大小:1925k
文件大小:10k
源码类别:

xml/soap/webservice

开发平台:

Visual C++

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Xml.Schema;
  5. using System.Windows.Forms;
  6. using System.Drawing;
  7. using System.Drawing.Design;
  8. using System.Xml;
  9. using System.Globalization;
  10. using System.ComponentModel;
  11. namespace XmlNotepad {
  12.     /// <summary>
  13.     /// This interface is used to provide extensible popup modal dialog for editing a particular
  14.     /// type of value in the XML document.  (e.g. color picker).
  15.     /// </summary>
  16.     public interface IXmlBuilder {
  17.         
  18.         /// <summary>
  19.         /// Return a caption for the button that launches your dialog.
  20.         /// </summary>
  21.         string Caption { get; }
  22.         /// <summary>
  23.         /// Provides the ISite objects which is how you get services from the hosting application.
  24.         /// </summary>
  25.         /// <param name="site"></param>
  26.         ISite Site { get; set; }
  27.         /// <summary>
  28.         /// Provides the IntellisenseProvider that created this object.
  29.         /// </summary>
  30.         IIntellisenseProvider Owner { get; set; }
  31.                 
  32.         /// <summary>
  33.         /// This method launches a custom builder (e.g. color picker, etc)
  34.         /// with an initial value and produces a resulting value.  
  35.         /// </summary>
  36.         /// <param name="owner">The parent window that is calling us</param>
  37.         /// <param name="type">The type associated with the value being edited</param>
  38.         /// <param name="input">The current value being edited</param>
  39.         /// <param name="output">The result of the builder</param>
  40.         /// <returns>Returns false if the user cancelled the operation</returns>
  41.         bool EditValue(IWin32Window owner, XmlSchemaType type, string input, out string output);
  42.     }
  43.     /// <summary>
  44.     /// This interface is used to provide other types of editors besides the default TextBox for
  45.     /// inline editing of particular types of values in the XML document.  For example, DateTimePicker.
  46.     /// </summary>
  47.     public interface IXmlEditor {
  48.         /// <summary>
  49.         /// Provides the ISite objects which is how you get services from the hosting application.
  50.         /// </summary>
  51.         /// <param name="site"></param>
  52.         ISite Site { get; set; }
  53.         /// <summary>
  54.         /// Provides the IntellisenseProvider that created this object.
  55.         /// </summary>
  56.         IIntellisenseProvider Owner { get; set; }
  57.         /// <summary>
  58.         /// This property provides the XmlSchemaType for the editor
  59.         /// </summary>
  60.         XmlSchemaType SchemaType { get; set; }
  61.         /// <summary>
  62.         /// Return the editor you want to use to edit your values.
  63.         /// </summary>
  64.         Control Editor { get; }
  65.         /// <summary>
  66.         /// The setter is called just before editing to pass in the current value from the 
  67.         /// XmlDocument.  At the end of editing, the getter is called to pull the new value
  68.         /// back out of the editor for storing in the XmlDocument.
  69.         /// </summary>
  70.         string XmlValue { get; set;}
  71.     }
  72.     /// <summary>
  73.     /// This is a custom builder for editing color values using the ColorDialog.
  74.     /// You can specify this builder using the following annotation in your schema:
  75.     ///     vs:builder="XmlNotepad.ColorBuilder"
  76.     /// where xmlns:vs="http://schemas.microsoft.com/Visual-Studio-Intellisense"
  77.     /// </summary>
  78.     class ColorBuilder : IXmlBuilder {
  79.         ColorDialog cd = new ColorDialog();
  80.         ISite site;
  81.         IIntellisenseProvider owner;
  82.         public IIntellisenseProvider Owner {
  83.             get { return this.owner; }
  84.             set { this.owner = value; }
  85.         }
  86.         public ISite Site {
  87.             get { return this.site; }
  88.             set { this.site = value; }
  89.         }
  90.         public string Caption { get { return SR.ColorPickerLabel; } }
  91.        
  92.         public bool EditValue(IWin32Window owner, XmlSchemaType type, string input, out string output) {
  93.             output = input;
  94.             ColorConverter cc = new ColorConverter();
  95.             Color c = Color.Black;
  96.             try { 
  97.                 c = (Color)cc.ConvertFromString(input);
  98.             } catch {
  99.             }
  100.             cd.Color = c;
  101.             cd.AnyColor = true;
  102.             if (cd.ShowDialog(owner) == DialogResult.OK) {
  103.                 output = cc.ConvertToString(cd.Color);
  104.                 return true;
  105.             } else {
  106.                 return false;
  107.             }
  108.         }
  109.     }
  110.     /// <summary>
  111.     /// This is a custom builder for editing anyUri types via Open File Dialog.
  112.     /// You can specify this builder using the following annotation in your schema:
  113.     ///     vs:builder="XmlNotepad.UriBuilder"
  114.     /// where xmlns:vs="http://schemas.microsoft.com/Visual-Studio-Intellisense"
  115.     /// </summary>
  116.     class UriBuilder : IXmlBuilder {
  117.         OpenFileDialog fd = new OpenFileDialog();
  118.         ISite site;
  119.         
  120.         public UriBuilder() {
  121.             fd.Filter = "All files (*.*)|*.*";
  122.         }
  123.         IIntellisenseProvider owner;
  124.         public IIntellisenseProvider Owner {
  125.             get { return this.owner; }
  126.             set { this.owner = value; }
  127.         }
  128.         
  129.         public ISite Site {
  130.             get { return this.site; }
  131.             set { this.site = value; }
  132.         }
  133.         public string Caption { get { return SR.UriBrowseLabel; } }
  134.         public bool EditValue(IWin32Window owner, XmlSchemaType type, string input, out string output) {
  135.             output = input;
  136.             if (!string.IsNullOrEmpty(input)) {
  137.                 fd.FileName = GetAbsolute(input);
  138.             }            
  139.             if (fd.ShowDialog(owner) == DialogResult.OK) {
  140.                 output = GetRelative(fd.FileName);
  141.                 return true;
  142.             } else {
  143.                 return false;
  144.             }
  145.         }
  146.         string GetRelative(string s) {
  147.             Uri baseUri = this.owner.BaseUri;
  148.             if (baseUri != null) {
  149.                 try {
  150.                     Uri uri = new Uri(s, UriKind.RelativeOrAbsolute);
  151.                     return baseUri.MakeRelative(uri);
  152.                 } catch (UriFormatException) {
  153.                     return s;
  154.                 }
  155.             }
  156.             return s;
  157.         }
  158.         string GetAbsolute(string s) {
  159.             Uri baseUri = this.owner.BaseUri;
  160.             if (baseUri != null) {
  161.                 try {
  162.                     Uri uri = new Uri(s, UriKind.RelativeOrAbsolute);
  163.                     Uri resolved = new Uri(baseUri, uri);
  164.                     if (resolved.IsFile) return resolved.LocalPath;
  165.                     return resolved.AbsoluteUri;
  166.                 } catch (UriFormatException) {
  167.                     return s;
  168.                 }
  169.             }
  170.             return s;
  171.         }
  172.     }
  173.     /// <summary>
  174.     /// This is a custom editor for editing date/time values using the DateTimePicker.
  175.     /// This editor is provided by default when you use xs:time, xs:dateTime or xs:date
  176.     /// simple types in your schema, or you can specify this editor using the following 
  177.     /// annotation in your schema: vs:editor="XmlNotepad.DateTimeEditor"
  178.     /// where xmlns:vs="http://schemas.microsoft.com/Visual-Studio-Intellisense"
  179.     /// </summary>
  180.     public class DateTimeEditor : IXmlEditor, IDisposable {
  181.         XmlSchemaType type;
  182.         DateTimePicker picker = new DateTimePicker();
  183.         string format = "yyyy-MM-dd";
  184.         ISite site;
  185.         IIntellisenseProvider owner;
  186.         public IIntellisenseProvider Owner {
  187.             get { return this.owner; }
  188.             set { this.owner = value; }
  189.         }
  190.         public ISite Site {
  191.             get { return this.site; }
  192.             set { this.site = value; }
  193.         }
  194.         /// <summary>
  195.         /// This property provides the XmlSchemaType for the editor
  196.         /// </summary>
  197.         public XmlSchemaType SchemaType { 
  198.             get { return this.type; }
  199.             set {
  200.                 this.type = value;
  201.                 if (type != null) {
  202.                     DateTimeFormatInfo dtInfo = DateTimeFormatInfo.CurrentInfo;
  203.                     switch (type.TypeCode){
  204.                         case XmlTypeCode.DateTime:
  205.                             format = SR.DateTimeFormat;
  206.                             picker.Format =  DateTimePickerFormat.Custom;
  207.                             picker.CustomFormat = dtInfo.ShortDatePattern + " " + dtInfo.LongTimePattern;
  208.                             picker.ShowUpDown = false;
  209.                             break;
  210.                         case XmlTypeCode.Time:
  211.                             picker.Format = DateTimePickerFormat.Time;
  212.                             format = SR.TimeFormat;
  213.                             picker.ShowUpDown = true;
  214.                             break;
  215.                         default:
  216.                             picker.Format = DateTimePickerFormat.Short;
  217.                             format = SR.DateFormat;
  218.                             picker.ShowUpDown = false;
  219.                             break;
  220.                         
  221.                     }
  222.                     // Todo: set picker.MinDate and MaxDate based on the XmlSchemaFacet information, if any.
  223.                 }
  224.             }
  225.         }
  226.         public Control Editor {
  227.             get { return picker; }
  228.         }
  229.         public string XmlValue {
  230.             get {
  231.                 return XmlConvert.ToString(picker.Value, format);
  232.             }
  233.             set {
  234.                 try {
  235.                     picker.Text = value;
  236.                 } catch {
  237.                     // ignore exceptions.
  238.                 }
  239.             }
  240.         }
  241.         ~DateTimeEditor() {
  242.             Dispose(false);
  243.         }
  244.         public void Dispose() {
  245.             Dispose(true);
  246.             GC.SuppressFinalize(this);
  247.         }
  248.         protected virtual void Dispose(bool disposing){
  249.             if (picker != null) {
  250.                 picker.Dispose();
  251.                 picker = null;
  252.             }
  253.         }
  254.     }
  255. }