void newt_DragOver(object sender, DragEventArgs e) {
      e.Handled = true;

      var tabItemSource = e.Data.GetData(typeof(Wpf.Controls.TabItem)) as Wpf.Controls.TabItem;

      if ((sender as Wpf.Controls.TabItem).ShellObject.IsFileSystem)
        e.Effects = (e.KeyStates & DragDropKeyStates.ControlKey) == DragDropKeyStates.ControlKey ? DragDropEffects.Copy : DragDropEffects.Move;
      else if (tabItemSource != null)
        e.Effects = DragDropEffects.Move;
      else
        e.Effects = DragDropEffects.None;

      var desc = new BExplorer.Shell.DataObject.DropDescription();

      switch (e.Effects) {
        case DragDropEffects.Copy:
          desc.type = (int)BExplorer.Shell.DataObject.DropImageType.Copy;
          desc.szMessage = "Copy To %1";
          break;
        case DragDropEffects.Move:
          desc.type = (int)BExplorer.Shell.DataObject.DropImageType.Move;
          desc.szMessage = "Move To %1";
          break;
        case DragDropEffects.None:
          desc.type = (int)BExplorer.Shell.DataObject.DropImageType.None;
          desc.szMessage = "Cant drop here!";
          break;
        default:
          desc.type = (int)BExplorer.Shell.DataObject.DropImageType.Invalid;
          desc.szMessage = "";
          break;
      }
      desc.szInsert = (sender as Wpf.Controls.TabItem).ShellObject.DisplayName;
      ((System.Runtime.InteropServices.ComTypes.IDataObject)e.Data).SetDropDescription(desc);

      var ptw = new BExplorer.Shell.DataObject.Win32Point();
      GetCursorPos(ref ptw);

      if (e.Data.GetType() != typeof(Wpf.Controls.TabItem)) {
        var wpt = new BExplorer.Shell.DataObject.Win32Point() { X = ptw.X, Y = ptw.Y };
        DropTarget.Create.DragOver(ref wpt, (int)e.Effects);
      }
    }
    void newt_DragEnter(object sender, DragEventArgs e) {
      e.Handled = true;
      this._CurrentlySelectedItem = tcMain.SelectedItem as Wpf.Controls.TabItem;
      var tabItem = e.Source as Wpf.Controls.TabItem;
      if (tabItem == null) return;

      this._TabDropData = (System.Runtime.InteropServices.ComTypes.IDataObject)e.Data;

      if ((sender as Wpf.Controls.TabItem).ShellObject.IsFileSystem)
        e.Effects = (e.KeyStates & DragDropKeyStates.ControlKey) == DragDropKeyStates.ControlKey ? DragDropEffects.Copy : DragDropEffects.Move;
      else
        e.Effects = DragDropEffects.None;

      var ptw = new BExplorer.Shell.DataObject.Win32Point();
      GetCursorPos(ref ptw);
      e.Effects = DragDropEffects.None;
      var tabItemSource = e.Data.GetData(typeof(Wpf.Controls.TabItem)) as Wpf.Controls.TabItem;

      if (tabItemSource == null) {
        var wpt = new BExplorer.Shell.DataObject.Win32Point() { X = ptw.X, Y = ptw.Y };
        DropTarget.Create.DragEnter(this.Handle, (System.Runtime.InteropServices.ComTypes.IDataObject)e.Data, ref wpt, (int)e.Effects);
      } else if (e.Data.GetDataPresent(typeof(Wpf.Controls.TabItem))) {
        e.Effects = DragDropEffects.Move;
      }
    }
    void newt_Drop(object sender, DragEventArgs e) {
      e.Handled = true;
      var tabItemTarget = e.Source as Wpf.Controls.TabItem;

      var tabItemSource = e.Data.GetData(typeof(Wpf.Controls.TabItem)) as Wpf.Controls.TabItem;

      if (tabItemSource == null) {
        if ((sender as Wpf.Controls.TabItem).ShellObject.IsFileSystem) {
          e.Effects = (e.KeyStates & DragDropKeyStates.ControlKey) == DragDropKeyStates.ControlKey ? DragDropEffects.Copy : DragDropEffects.Move;

          switch (e.Effects) {
            case DragDropEffects.All:
              break;
            case DragDropEffects.Copy:
              this._ShellListView.DoCopy(e.Data, (sender as Wpf.Controls.TabItem).ShellObject);
              break;
            case DragDropEffects.Link:
              break;
            case DragDropEffects.Move:
              this._ShellListView.DoMove(e.Data, (sender as Wpf.Controls.TabItem).ShellObject);
              break;
            case DragDropEffects.None:
              break;
            case DragDropEffects.Scroll:
              break;
            default:
              break;
          }
        } else {
          e.Effects = DragDropEffects.None;
        }

        WIN.Point pt = e.GetPosition(sender as IInputElement);
        var wpt = new BExplorer.Shell.DataObject.Win32Point() { X = (int)pt.X, Y = (int)pt.Y };
        DropTarget.Create.Drop((System.Runtime.InteropServices.ComTypes.IDataObject)e.Data, ref wpt, (int)e.Effects);
        this._TabDropData = null;
      } else if (!tabItemTarget.Equals(tabItemSource)) {
        var tabControl = tabItemTarget.Parent as TabControl;
        int targetIndex = tabControl.Items.IndexOf(tabItemTarget);

        int tabState = tabItemSource == this._CurrentlySelectedItem ? 0 : 1;

        tabControl.Items.Remove(tabItemSource);
        tabControl.Items.Insert(targetIndex, tabItemSource);
        tcMain.IsInTabDragDrop = false;
        if (tabState == 1)
          tabControl.SelectedItem = this._CurrentlySelectedItem;
        else if (tabState == 0)
          tabControl.SelectedIndex = targetIndex;

        tcMain.IsInTabDragDrop = true;
      }
      //tcMain.IsSelectionHandled = false;
    }