Bug 460074 - corrected column reordering via drag&drop when using column
groups

Change-Id: I5d1425cffc907c4f4e842c4b03e74f585451a1d6
Signed-off-by: Dirk Fauth <dirk.fauth@googlemail.com>
diff --git a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/group/ColumnGroupReorderLayer.java b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/group/ColumnGroupReorderLayer.java
index a3c3d84..c1ee026 100644
--- a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/group/ColumnGroupReorderLayer.java
+++ b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/group/ColumnGroupReorderLayer.java
@@ -7,7 +7,7 @@
  *
  * Contributors:
  *     Original authors and others - initial API and implementation
- *     Dirk Fauth <dirk.fauth@googlemail.com> - Bug 460052
+ *     Dirk Fauth <dirk.fauth@googlemail.com> - Bug 460052, 460074
  ******************************************************************************/
 package org.eclipse.nebula.widgets.nattable.group;
 
@@ -20,6 +20,8 @@
 import org.apache.commons.logging.LogFactory;
 import org.eclipse.nebula.widgets.nattable.group.ColumnGroupModel.ColumnGroup;
 import org.eclipse.nebula.widgets.nattable.group.command.GroupColumnReorderCommandHandler;
+import org.eclipse.nebula.widgets.nattable.group.command.GroupColumnReorderEndCommandHandler;
+import org.eclipse.nebula.widgets.nattable.group.command.GroupColumnReorderStartCommandHandler;
 import org.eclipse.nebula.widgets.nattable.group.command.GroupMultiColumnReorderCommandHandler;
 import org.eclipse.nebula.widgets.nattable.group.command.ReorderColumnGroupCommandHandler;
 import org.eclipse.nebula.widgets.nattable.group.command.ReorderColumnGroupEndCommandHandler;
@@ -91,6 +93,8 @@
         registerCommandHandler(new ReorderColumnsAndGroupsCommandHandler(this));
         registerCommandHandler(new GroupColumnReorderCommandHandler(this));
         registerCommandHandler(new GroupMultiColumnReorderCommandHandler(this));
+        registerCommandHandler(new GroupColumnReorderStartCommandHandler(this));
+        registerCommandHandler(new GroupColumnReorderEndCommandHandler(this));
     }
 
     // Horizontal features
@@ -314,7 +318,11 @@
                 }
             }
             else {
-                this.model.removeColumnIndexes(fromColumnGroup.getName(), fromColumnIndexes);
+                // only remove if we are at the edge of a column group
+                if (ColumnGroupUtils.isLeftEdgeOfAColumnGroup(this, fromColumnPosition, fromColumnIndex, this.model)
+                        || ColumnGroupUtils.isRightEdgeOfAColumnGroup(this, fromColumnPosition, fromColumnIndex, this.model)) {
+                    this.model.removeColumnIndexes(fromColumnGroup.getName(), fromColumnIndexes);
+                }
             }
 
             consumeCommand = true;
diff --git a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/group/command/GroupColumnReorderEndCommandHandler.java b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/group/command/GroupColumnReorderEndCommandHandler.java
new file mode 100644
index 0000000..ff60208
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/group/command/GroupColumnReorderEndCommandHandler.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2015 Original authors and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Dirk Fauth <dirk.fauth@googlemail.com> - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.nebula.widgets.nattable.group.command;
+
+import org.eclipse.nebula.widgets.nattable.command.AbstractLayerCommandHandler;
+import org.eclipse.nebula.widgets.nattable.group.ColumnGroupReorderLayer;
+import org.eclipse.nebula.widgets.nattable.reorder.command.ColumnReorderEndCommand;
+
+public class GroupColumnReorderEndCommandHandler extends AbstractLayerCommandHandler<ColumnReorderEndCommand> {
+
+    private final ColumnGroupReorderLayer columnGroupReorderLayer;
+
+    public GroupColumnReorderEndCommandHandler(ColumnGroupReorderLayer columnReorderLayer) {
+        this.columnGroupReorderLayer = columnReorderLayer;
+    }
+
+    @Override
+    public Class<ColumnReorderEndCommand> getCommandClass() {
+        return ColumnReorderEndCommand.class;
+    }
+
+    @Override
+    protected boolean doCommand(ColumnReorderEndCommand command) {
+        int toColumnPosition = command.getToColumnPosition();
+        boolean reorderToLeftEdge = command.isReorderToLeftEdge();
+
+        this.columnGroupReorderLayer.updateColumnGroupModel(
+                this.columnGroupReorderLayer.getReorderFromColumnPosition(),
+                toColumnPosition, reorderToLeftEdge);
+
+        // we only update the ColumnGroupModel, the reordering is done in the
+        // ColumnReorderLayer
+        return false;
+    }
+
+}
diff --git a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/group/command/GroupColumnReorderStartCommandHandler.java b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/group/command/GroupColumnReorderStartCommandHandler.java
new file mode 100644
index 0000000..e1e1278
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/group/command/GroupColumnReorderStartCommandHandler.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2015 Original authors and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Dirk Fauth <dirk.fauth@googlemail.com> - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.nebula.widgets.nattable.group.command;
+
+import org.eclipse.nebula.widgets.nattable.command.AbstractLayerCommandHandler;
+import org.eclipse.nebula.widgets.nattable.group.ColumnGroupReorderLayer;
+import org.eclipse.nebula.widgets.nattable.reorder.command.ColumnReorderStartCommand;
+
+public class GroupColumnReorderStartCommandHandler extends AbstractLayerCommandHandler<ColumnReorderStartCommand> {
+
+    private final ColumnGroupReorderLayer columnGroupReorderLayer;
+
+    public GroupColumnReorderStartCommandHandler(ColumnGroupReorderLayer columnReorderLayer) {
+        this.columnGroupReorderLayer = columnReorderLayer;
+    }
+
+    @Override
+    public Class<ColumnReorderStartCommand> getCommandClass() {
+        return ColumnReorderStartCommand.class;
+    }
+
+    @Override
+    protected boolean doCommand(ColumnReorderStartCommand command) {
+        int fromColumnPosition = command.getFromColumnPosition();
+
+        this.columnGroupReorderLayer.setReorderFromColumnPosition(fromColumnPosition);
+
+        // we need to remember the from position in order to update the
+        // ColumnGroupModel
+        // the command shouldn't get consumed here, since the reordering needs
+        // to take place in the ColumnReorderLayer
+        return false;
+    }
+
+}