Skip to content

Commit

Permalink
Update EnumRepositoryItemGridListEditorController #439
Browse files Browse the repository at this point in the history
  • Loading branch information
apobekiaris committed Aug 5, 2019
1 parent d8f9fa2 commit a9fd90a
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 23 deletions.
Expand Up @@ -32,7 +32,7 @@ public EnumPropertyEditor(Type objectType, IModelMemberViewItem model)
if (Control != null) FilterRepositoryItem( Control.Properties,MemberInfo,CurrentObject,_objectSpace, _itemsData);
}

static bool TypeHasFlagsAttribute(IMemberInfo info) {
public static bool TypeHasFlagsAttribute(IMemberInfo info) {
return PropertyEditorHelper.CalcUnderlyingType(info).GetCustomAttributes(typeof(FlagsAttribute), true).Length > 0;
}

Expand Down
@@ -1,43 +1,65 @@
using System;
using System.Collections.Generic;
using System.Linq;
using DevExpress.ExpressApp;
using DevExpress.ExpressApp.DC;
using DevExpress.ExpressApp.Win.Editors;
using DevExpress.XtraEditors.Controls;
using DevExpress.XtraEditors.Repository;
using DevExpress.XtraGrid.Columns;
using DevExpress.XtraGrid.Views.Grid;
using Xpand.Utils.Helpers;
using EnumPropertyEditor = Xpand.ExpressApp.Win.PropertyEditors.EnumPropertyEditor;

namespace Xpand.ExpressApp.Win.SystemModule {
public class EnumRepositoryItemGridListEditorController:ViewController<ListView> {
private IEnumerable<IMemberInfo> _memberInfos;
private IEnumerable<(GridColumn column, RepositoryItem repositoryItem,IMemberInfo memberInfo)> _repos;

protected override void OnViewControlsCreated() {
base.OnViewControlsCreated();
if (View.Editor is GridListEditor gridListEditor) {
View.SelectionChanged+=ViewOnSelectionChanged;
FilterRepositories(gridListEditor);
_memberInfos = View.Model.Columns.Where(_ =>_.Index > -1 && (_.ModelMember.MemberInfo.MemberType.IsEnum ||
_.ModelMember.MemberInfo.MemberType.IsNullableType() && _.ModelMember.MemberInfo.MemberType.GetGenericArguments().First().IsEnum))
.Select(_ => _.ModelMember.MemberInfo).ToArray();
_repos = _memberInfos.Select(info => {
var gridColumn = gridListEditor.GridView.Columns[info.Name];
var tuple = (column: gridColumn,repositoryItem: gridColumn.ColumnEdit,info);
gridColumn.ColumnEdit=new RepositoryItemTextEdit();
return tuple;
}).ToArray();
gridListEditor.GridView.CustomRowCellEditForEditing+=GridViewOnCustomRowCellEdit;
}

}

private void FilterRepositories(GridListEditor gridListEditor){
var memberInfos = View.Model.Columns.Where(_ =>
_.Index > -1 && (_.ModelMember.MemberInfo.MemberType.IsEnum ||
_.ModelMember.MemberInfo.MemberType.IsNullableType() && _.ModelMember.MemberInfo
.MemberType.GetGenericArguments().First().IsEnum))
.Select(_ => _.ModelMember.MemberInfo);
foreach (var memberInfo in memberInfos){
var repositoryItem = gridListEditor.GridView.Columns[memberInfo.Name].ColumnEdit;
var itemsData = EnumPropertyEditor.GetItemsData(repositoryItem, memberInfo);
EnumPropertyEditor.FilterRepositoryItem(repositoryItem, memberInfo,
View.SelectedObjects.Cast<object>().FirstOrDefault(), ObjectSpace, itemsData);
private void GridViewOnCustomRowCellEdit(object sender, CustomRowCellEditEventArgs e) {
var data = _repos.FirstOrDefault(_ => _.column==e.Column);
if (data!=default) {
var hasFlagsAttribute = EnumPropertyEditor.TypeHasFlagsAttribute(data.memberInfo);
var values = EnumsNET.NonGeneric.NonGenericEnums.GetValues(data.memberInfo.MemberType).ToArray();
e.RepositoryItem = hasFlagsAttribute? (RepositoryItem) NewRepositoryItemCheckedComboBoxEdit(values,data.repositoryItem): NewRepositoryItemEnumEdit(values,data.repositoryItem);
var tuple = hasFlagsAttribute
? ((ImageComboBoxItem[] startComboBoxItems, CheckedListBoxItem[] startCheckedListBoxItems)) (null,((RepositoryItemCheckedComboBoxEdit) e.RepositoryItem).Items.ToArray())
: (((RepositoryItemEnumEdit) e.RepositoryItem).Items.ToArray(), null);
EnumPropertyEditor.FilterRepositoryItem(e.RepositoryItem, data.memberInfo,View.SelectedObjects.Cast<object>().FirstOrDefault(), ObjectSpace, tuple);
}
}

protected override void OnDeactivated() {
base.OnDeactivated();
View.SelectionChanged-=ViewOnSelectionChanged;
private object[] GetNullItem(RepositoryItem repositoryItem) {
return repositoryItem is RepositoryItemCheckedComboBoxEdit comboBoxEdit? new object[] {comboBoxEdit.Items.First()}
: new object[] {((RepositoryItemEnumEdit) repositoryItem).Items.First()};
}

private RepositoryItemEnumEdit NewRepositoryItemEnumEdit(object[] values,RepositoryItem repositoryItem) {
var item = new RepositoryItemEnumEdit();
item.Items.AddRange(GetNullItem(repositoryItem).Cast<ImageComboBoxItem>().Concat(values.Select(o => new ImageComboBoxItem(o))).ToArray());
return item;
}

private void ViewOnSelectionChanged(object sender, EventArgs e) {

FilterRepositories((GridListEditor) View.Editor);
private RepositoryItemCheckedComboBoxEdit NewRepositoryItemCheckedComboBoxEdit(object[] values,RepositoryItem dataRepositoryItem) {
var item = new RepositoryItemCheckedComboBoxEdit();
item.Items.Add(GetNullItem(dataRepositoryItem));
item.Items.AddRange(values.Select(o => new CheckedListBoxItem(o)).ToArray());
return item;
}
}
}
Expand Up @@ -20,7 +20,10 @@ public static class EnumPropertyEditorExtensions {
var nullableItem = startitems.First(item => itemValueSelector(item)==null);
var member = memberInfo.Owner.FindMember(dataSourcePropertyAttribute.DataSourceProperty);
var items = ((IEnumerable) member.GetValue(objectInstance)).Cast<object>()
.Select(o => startitems.First(item => $"{itemValueSelector(item)}" == $"{o}")).ToArray();
.Select(o => {
var controlItem = startitems.First(item => $"{itemValueSelector(item)}" == $"{o}");
return controlItem;
}).ToArray();
controlItems.Clear();
if (nullableItem != null) {
controlItems.Add(nullableItem);
Expand Down

0 comments on commit a9fd90a

Please sign in to comment.