Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.ComponentModel;
- using System.Drawing;
- using System.Drawing.Design;
- using System.Windows.Forms;
- namespace ControlEx.Controls {
- public class FlagEnumControl : CheckedListBox , INotifyPropertyChanged {
- private Type targetEunm;
- private int _value = 0;
- /// <summary>
- /// Enum型を登録します。
- /// </summary>
- /// <param name="target"></param>
- [Browsable( false )]
- [DesignerSerializationVisibility( DesignerSerializationVisibility.Hidden )]
- public void EnumSet( Type target ) {
- this.targetEunm = target;
- if( target.IsEnum == false )
- return;
- this.SuspendLayout();
- this.Items.Clear();
- int maxWidth = this.Width + 16;
- int totalHeight = 16;
- foreach( Enum item in target.GetEnumValues() ){
- int index = this.Items.Add( new FlagEnumItem( item ) );
- var rect = this.GetItemRectangle( index );
- if( rect.Width > maxWidth ){
- maxWidth = rect.Width;
- }
- totalHeight += rect.Height;
- }
- this.Size = new Size( maxWidth , totalHeight );
- this.ResumeLayout();
- }
- /// <summary>
- /// 列挙値を設定または、取得します。
- /// </summary>
- [Browsable( false )]
- [DesignerSerializationVisibility( DesignerSerializationVisibility.Hidden )]
- public Enum Value {
- get {
- return Enum.ToObject( this.targetEunm , _value ) as Enum;
- }
- set {
- _value = (int)( value as object );
- for( int i = 0 ; this.Items.Count > i ; i++ )
- this.SetItemChecked( i , _value == ( _value | GetEnumItem( i ).GetNumber() ) );
- }
- }
- /// <summary>
- /// 指定された列挙値が格納されている項目のインデックスを取得します。
- /// </summary>
- /// <param name="val"></param>
- /// <returns></returns>
- public int GetIndex( Enum val ) {
- for( int i = 0 ; i < this.Items.Count ; i++ ) {
- var e = GetEnumItem( i );
- if( e.GetEnum.HasFlag( val ) )
- return i;
- }
- return -1;
- }
- protected override void OnItemCheck( ItemCheckEventArgs ice ) {
- base.OnItemCheck( ice );
- if( this.Items.Count > ice.Index ) {
- if( ice.NewValue == CheckState.Checked ) {
- _value |= GetEnumItem( ice.Index ).GetNumber();
- } else {
- _value ^= GetEnumItem( ice.Index ).GetNumber();
- }
- OnPropertyChanged( "Value" );
- }
- }
- #region INotifyPropertyChanged Members
- public event PropertyChangedEventHandler PropertyChanged;
- protected void OnPropertyChanged( string propertyName ) {
- if( PropertyChanged != null )
- PropertyChanged( this , new PropertyChangedEventArgs( propertyName ) );
- }
- #endregion
- public FlagEnumItem GetEnumItem( int i ) {
- if( this.Items.Count > i ) {
- return (FlagEnumItem)this.Items[i];
- }
- return default( FlagEnumItem );
- }
- public struct FlagEnumItem {
- private Enum enumItem;
- public FlagEnumItem( Enum target ) {
- this.enumItem = target;
- }
- public Enum GetEnum {
- get {
- return enumItem;
- }
- }
- public int GetNumber() {
- return (int)( enumItem as object );
- }
- }
- }
- }
- // 使用例
- [Flags]
- enum TestTypes{
- A,
- B
- }
- FlagEnumControl hogehoe = new FlagEnumControl();
- // フォームのLoadイベントとかでやってればおk
- hogehoge.EnumSet( typeof( TestTypes ) ); // 型情報を登録する
- hogehoge.Value = A | B;
- // Valueプロパティは、Enum型なので使うときは、適当な型にキャストの必要あり。
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement