Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
03/18/11 01:38:23 (13 years ago)
Author:
swagner
Message:

Implemented dragging of multiple items in all collection views and refactored drag & drop code (#1112)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Core.Views/3.3/ItemListView.cs

    r5445 r5744  
    2121
    2222using System;
     23using System.Collections;
    2324using System.Collections.Generic;
    2425using System.Drawing;
     
    3738    protected Dictionary<T, List<ListViewItem>> itemListViewItemMapping;
    3839    protected TypeSelectorDialog typeSelectorDialog;
     40    protected bool validDragOperation;
    3941
    4042    public new IItemList<T> Content {
     
    277279    protected virtual void itemsListView_ItemDrag(object sender, ItemDragEventArgs e) {
    278280      if (!Locked) {
    279         ListViewItem listViewItem = (ListViewItem)e.Item;
    280         T item = listViewItem.Tag as T;
    281         if (item != null) {
     281        List<T> items = new List<T>();
     282        foreach (ListViewItem listViewItem in itemsListView.SelectedItems) {
     283          T item = listViewItem.Tag as T;
     284          if (item != null) items.Add(item);
     285        }
     286
     287        if (items.Count > 0) {
    282288          DataObject data = new DataObject();
    283           data.SetData("Type", item.GetType());
    284           data.SetData("Value", item);
     289          if (items.Count == 1) data.SetData("HeuristicLab", items[0]);
     290          else data.SetData("HeuristicLab", items);
    285291          if (Content.IsReadOnly || ReadOnly) {
    286292            DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link);
    287293          } else {
    288294            DragDropEffects result = DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link | DragDropEffects.Move);
    289             if ((result & DragDropEffects.Move) == DragDropEffects.Move)
    290               Content.RemoveAt(listViewItem.Index);
     295            if ((result & DragDropEffects.Move) == DragDropEffects.Move) {
     296              foreach (ListViewItem listViewItem in itemsListView.SelectedItems.Cast<ListViewItem>().ToArray()) {
     297                if (listViewItem.Tag != null) Content.RemoveAt(listViewItem.Index);
     298              }
     299            }
    291300          }
    292301        }
    293302      }
    294303    }
    295     protected virtual void itemsListView_DragEnterOver(object sender, DragEventArgs e) {
     304    protected virtual void itemsListView_DragEnter(object sender, DragEventArgs e) {
     305      validDragOperation = false;
     306      if (e.Data.GetData("HeuristicLab") is T) {
     307        validDragOperation = true;
     308      } else if (e.Data.GetData("HeuristicLab") is IEnumerable) {
     309        validDragOperation = true;
     310        IEnumerable items = (IEnumerable)e.Data.GetData("HeuristicLab");
     311        foreach (object item in items)
     312          validDragOperation = validDragOperation && (item is T);
     313      }
     314      validDragOperation = validDragOperation && !Content.IsReadOnly && !ReadOnly;
     315    }
     316    protected virtual void itemsListView_DragOver(object sender, DragEventArgs e) {
    296317      e.Effect = DragDropEffects.None;
    297       Type type = e.Data.GetData("Type") as Type;
    298       if (!Content.IsReadOnly && !ReadOnly && (type != null) && (typeof(T).IsAssignableFrom(type))) {
     318      if (validDragOperation) {
    299319        if ((e.KeyState & 32) == 32) e.Effect = DragDropEffects.Link;  // ALT key
    300320        else if ((e.KeyState & 4) == 4) e.Effect = DragDropEffects.Move;  // SHIFT key
    301         else if ((e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy) e.Effect = DragDropEffects.Copy;
    302         else if ((e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move) e.Effect = DragDropEffects.Move;
    303         else if ((e.AllowedEffect & DragDropEffects.Link) == DragDropEffects.Link) e.Effect = DragDropEffects.Link;
     321        else if (e.AllowedEffect.HasFlag(DragDropEffects.Copy)) e.Effect = DragDropEffects.Copy;
     322        else if (e.AllowedEffect.HasFlag(DragDropEffects.Move)) e.Effect = DragDropEffects.Move;
     323        else if (e.AllowedEffect.HasFlag(DragDropEffects.Link)) e.Effect = DragDropEffects.Link;
    304324      }
    305325    }
    306326    protected virtual void itemsListView_DragDrop(object sender, DragEventArgs e) {
    307327      if (e.Effect != DragDropEffects.None) {
    308         T item = e.Data.GetData("Value") as T;
    309         if ((e.Effect & DragDropEffects.Copy) == DragDropEffects.Copy) item = (T)item.Clone();
    310 
    311328        Point p = itemsListView.PointToClient(new Point(e.X, e.Y));
    312329        ListViewItem listViewItem = itemsListView.GetItemAt(p.X, p.Y);
    313         if (listViewItem != null) Content.Insert(listViewItem.Index, item);
    314         else Content.Add(item);
     330
     331        if (e.Data.GetData("HeuristicLab") is T) {
     332          T item = (T)e.Data.GetData("HeuristicLab");
     333          if (listViewItem != null) Content.Insert(listViewItem.Index, e.Effect.HasFlag(DragDropEffects.Copy) ? (T)item.Clone() : item);
     334          else Content.Add(e.Effect.HasFlag(DragDropEffects.Copy) ? (T)item.Clone() : item);
     335        } else if (e.Data.GetData("HeuristicLab") is IEnumerable) {
     336          IEnumerable<T> items = ((IEnumerable)e.Data.GetData("HeuristicLab")).Cast<T>();
     337          foreach (T item in items) {
     338            if (listViewItem != null) Content.Insert(listViewItem.Index, e.Effect.HasFlag(DragDropEffects.Copy) ? (T)item.Clone() : item);
     339            else Content.Add(e.Effect.HasFlag(DragDropEffects.Copy) ? (T)item.Clone() : item);
     340          }
     341        }
    315342      }
    316343    }
Note: See TracChangeset for help on using the changeset viewer.