public ShipGroupData( int groupID )
 {
     GroupID = groupID;
     ViewColumns = new Dictionary<string, ViewColumnData>();
     Name = "notitle #" + groupID;
     ScrollLockColumnCount = 0;
     AutoSortEnabled = true;
     SortOrder = new List<KeyValuePair<string, ListSortDirection>>();
     Expressions = new ExpressionManager();
     Members = new List<int>();
 }
		/// <summary>
		/// フィルタに基づいて検索を実行し、Members に結果をセットします。
		/// </summary>
		/// <param name="previousOrder">直前の並び替え順。なるべくこの順番を維持するように結果が生成されます。null もしくは 要素数 0 の場合は適当に生成されます。</param>
		public void UpdateMembers( IEnumerable<int> previousOrder = null ) {

			if ( Expressions == null )
				Expressions = new ExpressionManager();

			if ( InclusionFilter == null )
				InclusionFilter = new List<int>();

			if ( ExclusionFilter == null )
				ExclusionFilter = new List<int>();

			ValidateFilter();


			if ( !Expressions.IsAvailable )
				Expressions.Compile();

			var newdata = Expressions.GetResult( KCDatabase.Instance.Ships.Values ).Select( s => s.MasterID ).Union( InclusionFilter ).Except( ExclusionFilter );

			IEnumerable<int> prev = ( previousOrder != null && previousOrder.Count() > 0 ) ? previousOrder : ( Members ?? new List<int>() );

			// ソート順序を維持するため
			Members = prev.Except( prev.Except( newdata ) ).Union( newdata ).ToList();
		}
		public override void Initialize() {
			GroupID = -1;
			ViewColumns = new Dictionary<string, ViewColumnData>();
			Name = "no title";
			ScrollLockColumnCount = 0;
			AutoSortEnabled = true;
			SortOrder = new List<KeyValuePair<string, ListSortDirection>>();
			Expressions = new ExpressionManager();
			InclusionFilter = new List<int>();
			ExclusionFilter = new List<int>();
			Members = new List<int>();
		}
        public DialogShipGroupFilter( ExpressionManager exp )
        {
            InitializeComponent();

            #region init DataTable
            {
                _dtAndOr = new DataTable();
                _dtAndOr.Columns.AddRange( new DataColumn[]{
                    new DataColumn( "Value", typeof( bool ) ),
                    new DataColumn( "Display", typeof( string ) ) } );
                _dtAndOr.Rows.Add( true, "And" );
                _dtAndOr.Rows.Add( false, "Or" );
                _dtAndOr.AcceptChanges();

                ExpressionView_InternalAndOr.ValueMember = "Value";
                ExpressionView_InternalAndOr.DisplayMember = "Display";
                ExpressionView_InternalAndOr.DataSource = _dtAndOr;

                ExpressionView_ExternalAndOr.ValueMember = "Value";
                ExpressionView_ExternalAndOr.DisplayMember = "Display";
                ExpressionView_ExternalAndOr.DataSource = _dtAndOr;
            }
            {
                _dtLeftOperand = new DataTable();
                _dtLeftOperand.Columns.AddRange( new DataColumn[]{
                    new DataColumn( "Value", typeof( string ) ),
                    new DataColumn( "Display", typeof( string ) ) } );
                foreach ( var lont in ExpressionData.LeftOperandNameTable )
                    _dtLeftOperand.Rows.Add( lont.Key, lont.Value );
                _dtLeftOperand.AcceptChanges();

                LeftOperand.ValueMember = "Value";
                LeftOperand.DisplayMember = "Display";
                LeftOperand.DataSource = _dtLeftOperand;
            }
            {
                _dtOperator = new DataTable();
                _dtOperator.Columns.AddRange( new DataColumn[]{
                    new DataColumn( "Value", typeof( ExpressionData.ExpressionOperator ) ),
                    new DataColumn( "Display", typeof( string ) ) } );
                foreach ( var ont in ExpressionData.OperatorNameTable )
                    _dtOperator.Rows.Add( ont.Key, ont.Value );
                _dtOperator.AcceptChanges();

                Operator.ValueMember = "Value";
                Operator.DisplayMember = "Display";
                Operator.DataSource = _dtOperator;
            }
            {
                _dtOperator_bool = new DataTable();
                _dtOperator_bool.Columns.AddRange( new DataColumn[]{
                    new DataColumn( "Value", typeof( ExpressionData.ExpressionOperator ) ),
                    new DataColumn( "Display", typeof( string ) ) } );
                _dtOperator_bool.Rows.Add( ExpressionData.ExpressionOperator.Equal, ExpressionData.OperatorNameTable[ExpressionData.ExpressionOperator.Equal] );
                _dtOperator_bool.Rows.Add( ExpressionData.ExpressionOperator.NotEqual, ExpressionData.OperatorNameTable[ExpressionData.ExpressionOperator.NotEqual] );
                _dtOperator_bool.AcceptChanges();
            }
            {
                _dtOperator_number = new DataTable();
                _dtOperator_number.Columns.AddRange( new DataColumn[]{
                    new DataColumn( "Value", typeof( ExpressionData.ExpressionOperator ) ),
                    new DataColumn( "Display", typeof( string ) ) } );
                _dtOperator_number.Rows.Add( ExpressionData.ExpressionOperator.Equal, ExpressionData.OperatorNameTable[ExpressionData.ExpressionOperator.Equal] );
                _dtOperator_number.Rows.Add( ExpressionData.ExpressionOperator.NotEqual, ExpressionData.OperatorNameTable[ExpressionData.ExpressionOperator.NotEqual] );
                _dtOperator_number.Rows.Add( ExpressionData.ExpressionOperator.LessThan, ExpressionData.OperatorNameTable[ExpressionData.ExpressionOperator.LessThan] );
                _dtOperator_number.Rows.Add( ExpressionData.ExpressionOperator.LessEqual, ExpressionData.OperatorNameTable[ExpressionData.ExpressionOperator.LessEqual] );
                _dtOperator_number.Rows.Add( ExpressionData.ExpressionOperator.GreaterThan, ExpressionData.OperatorNameTable[ExpressionData.ExpressionOperator.GreaterThan] );
                _dtOperator_number.Rows.Add( ExpressionData.ExpressionOperator.GreaterEqual, ExpressionData.OperatorNameTable[ExpressionData.ExpressionOperator.GreaterEqual] );
                _dtOperator_number.AcceptChanges();
            }
            {
                _dtOperator_string = new DataTable();
                _dtOperator_string.Columns.AddRange( new DataColumn[]{
                    new DataColumn( "Value", typeof( ExpressionData.ExpressionOperator ) ),
                    new DataColumn( "Display", typeof( string ) ) } );
                _dtOperator_string.Rows.Add( ExpressionData.ExpressionOperator.Equal, ExpressionData.OperatorNameTable[ExpressionData.ExpressionOperator.Equal] );
                _dtOperator_string.Rows.Add( ExpressionData.ExpressionOperator.NotEqual, ExpressionData.OperatorNameTable[ExpressionData.ExpressionOperator.NotEqual] );
                _dtOperator_string.Rows.Add( ExpressionData.ExpressionOperator.Contains, ExpressionData.OperatorNameTable[ExpressionData.ExpressionOperator.Contains] );
                _dtOperator_string.Rows.Add( ExpressionData.ExpressionOperator.NotContains, ExpressionData.OperatorNameTable[ExpressionData.ExpressionOperator.NotContains] );
                _dtOperator_string.Rows.Add( ExpressionData.ExpressionOperator.BeginWith, ExpressionData.OperatorNameTable[ExpressionData.ExpressionOperator.BeginWith] );
                _dtOperator_string.Rows.Add( ExpressionData.ExpressionOperator.NotBeginWith, ExpressionData.OperatorNameTable[ExpressionData.ExpressionOperator.NotBeginWith] );
                _dtOperator_string.Rows.Add( ExpressionData.ExpressionOperator.EndWith, ExpressionData.OperatorNameTable[ExpressionData.ExpressionOperator.EndWith] );
                _dtOperator_string.Rows.Add( ExpressionData.ExpressionOperator.NotEndWith, ExpressionData.OperatorNameTable[ExpressionData.ExpressionOperator.NotEndWith] );
                _dtOperator_string.AcceptChanges();
            }
            {
                _dtOperator_array = new DataTable();
                _dtOperator_array.Columns.AddRange( new DataColumn[]{
                    new DataColumn( "Value", typeof( ExpressionData.ExpressionOperator ) ),
                    new DataColumn( "Display", typeof( string ) ) } );
                _dtOperator_array.Rows.Add( ExpressionData.ExpressionOperator.ArrayContains, ExpressionData.OperatorNameTable[ExpressionData.ExpressionOperator.ArrayContains] );
                _dtOperator_array.Rows.Add( ExpressionData.ExpressionOperator.ArrayNotContains, ExpressionData.OperatorNameTable[ExpressionData.ExpressionOperator.ArrayNotContains] );
                _dtOperator_array.AcceptChanges();
            }
            {
                _dtRightOperand_bool = new DataTable();
                _dtRightOperand_bool.Columns.AddRange( new DataColumn[]{
                    new DataColumn( "Value", typeof( bool ) ),
                    new DataColumn( "Display", typeof( string ) ) } );
                _dtRightOperand_bool.Rows.Add( true, "○" );
                _dtRightOperand_bool.Rows.Add( false, "×" );
                _dtRightOperand_bool.AcceptChanges();
            }
            {
                _dtRightOperand_shipname = new DataTable();
                _dtRightOperand_shipname.Columns.AddRange( new DataColumn[]{
                    new DataColumn( "Value", typeof( int ) ),
                    new DataColumn( "Display", typeof( string ) ) } );
                foreach ( var s in KCDatabase.Instance.MasterShips.Values.Where( s => !s.IsAbyssalShip ).OrderBy( s => s.NameWithClass ).OrderBy( s => s.NameReading ) )
                    _dtRightOperand_shipname.Rows.Add( s.ShipID, s.Name );
                _dtRightOperand_shipname.AcceptChanges();
            }
            {
                _dtRightOperand_shiptype = new DataTable();
                _dtRightOperand_shiptype.Columns.AddRange( new DataColumn[]{
                    new DataColumn( "Value", typeof( int ) ),
                    new DataColumn( "Display", typeof( string ) ) } );
                foreach ( var st in KCDatabase.Instance.ShipTypes.Values )
                    _dtRightOperand_shiptype.Rows.Add( st.TypeID, st.Name );
                _dtRightOperand_shiptype.AcceptChanges();
            }
            {
                _dtRightOperand_range = new DataTable();
                _dtRightOperand_range.Columns.AddRange( new DataColumn[]{
                    new DataColumn( "Value", typeof( int ) ),
                    new DataColumn( "Display", typeof( string ) ) } );
                for ( int i = 0; i <= 4; i++ )
                    _dtRightOperand_range.Rows.Add( i, Constants.GetRange( i ) );
                _dtRightOperand_range.AcceptChanges();
            }
            {
                _dtRightOperand_speed = new DataTable();
                _dtRightOperand_speed.Columns.AddRange( new DataColumn[]{
                    new DataColumn( "Value", typeof( int ) ),
                    new DataColumn( "Display", typeof( string ) ) } );
                _dtRightOperand_speed.Rows.Add( 0, Constants.GetSpeed( 0 ) );
                _dtRightOperand_speed.Rows.Add( 5, Constants.GetSpeed( 5 ) );
                _dtRightOperand_speed.Rows.Add( 10, Constants.GetSpeed( 10 ) );
                _dtRightOperand_speed.AcceptChanges();
            }
            {
                _dtRightOperand_rarity = new DataTable();
                _dtRightOperand_rarity.Columns.AddRange( new DataColumn[]{
                    new DataColumn( "Value", typeof( int ) ),
                    new DataColumn( "Display", typeof( string ) ) } );
                for ( int i = 1; i <= 8; i++ )
                    _dtRightOperand_rarity.Rows.Add( i, Constants.GetShipRarity( i ) );
                _dtRightOperand_rarity.AcceptChanges();
            }
            {
                _dtRightOperand_equipment = new DataTable();
                _dtRightOperand_equipment.Columns.AddRange( new DataColumn[]{
                    new DataColumn( "Value", typeof( int ) ),
                    new DataColumn( "Display", typeof( string ) ) } );
                foreach ( var eq in KCDatabase.Instance.MasterEquipments.Values.Where( eq => !eq.IsAbyssalEquipment ).OrderBy( eq => eq.CategoryType ) )
                    _dtRightOperand_equipment.Rows.Add( eq.EquipmentID, eq.Name );
                _dtRightOperand_equipment.AcceptChanges();
            }

            RightOperand_ComboBox.ValueMember = "Value";
            RightOperand_ComboBox.DisplayMember = "Display";
            RightOperand_ComboBox.DataSource = _dtRightOperand_bool;

            SetExpressionSetter( ExpressionData.LeftOperandNameTable.Keys.First() );

            #endregion

            _target = exp.Clone();

            LabelResult.Tag = false;
            UpdateExpressionLabel();
        }
        public void ImportExpressionData( ExpressionManager exm )
        {
            _target = exm.Clone();

            ExpressionView.Rows.Clear();

            var rows = new DataGridViewRow[exm.Expressions.Count];
            for ( int i = 0; i < rows.Length; i++ ) {
                rows[i] = GetExpressionViewRow( exm.Expressions[i] );
            }

            ExpressionView.Rows.AddRange( rows.ToArray() );

            ExpressionDetailView.Rows.Clear();
        }