[Title] Page tab : added dynamic move function
authorhyeran74.kim <hyeran74.kim@samsung.com>
Thu, 6 Mar 2014 08:42:30 +0000 (17:42 +0900)
committerhyeran74.kim <hyeran74.kim@samsung.com>
Thu, 6 Mar 2014 08:42:30 +0000 (17:42 +0900)
[Desc.] Dynamic move tab function has been added
[Issue]

Change-Id: If7b6be3da945f0ed19e607f021fe48b39ee3ea92
Signed-off-by: hyeran74.kim <hyeran74.kim@samsung.com>
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/widgets/DATabComposite.java

index b64fd57..bb16d2b 100644 (file)
@@ -27,6 +27,7 @@
 package org.tizen.dynamicanalyzer.ui.widgets;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Timer;
@@ -36,12 +37,16 @@ import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.StackLayout;
 import org.eclipse.swt.events.PaintEvent;
 import org.eclipse.swt.events.PaintListener;
+import org.eclipse.swt.graphics.Point;
 import org.eclipse.swt.graphics.Rectangle;
 import org.eclipse.swt.layout.FormAttachment;
 import org.eclipse.swt.layout.FormData;
 import org.eclipse.swt.layout.FormLayout;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.tizen.dynamicanalyzer.common.AnalyzerManager;
 import org.tizen.dynamicanalyzer.common.DASelectionData;
 import org.tizen.dynamicanalyzer.common.DesignConstants;
 import org.tizen.dynamicanalyzer.model.DAView;
@@ -49,9 +54,11 @@ import org.tizen.dynamicanalyzer.resources.ColorResources;
 import org.tizen.dynamicanalyzer.resources.FontResources;
 import org.tizen.dynamicanalyzer.swap.logparser.LogPackage;
 import org.tizen.dynamicanalyzer.swap.model.data.LogData;
+import org.tizen.dynamicanalyzer.ui.page.DAPageComposite;
 import org.tizen.dynamicanalyzer.ui.page.ViewAction;
+import org.tizen.dynamicanalyzer.ui.range.RangePage;
+import org.tizen.dynamicanalyzer.ui.timeline.TimelinePage;
 import org.tizen.dynamicanalyzer.widgets.button.DACustomButton;
-import org.tizen.dynamicanalyzer.widgets.button.DACustomButtonClickEventListener;
 
 public class DATabComposite extends DAView {
 
@@ -70,7 +77,13 @@ public class DATabComposite extends DAView {
        private Composite tabComposite = null;
        private Composite contentsComposite = null;
        private StackLayout stackLayout = null;
-
+       
+       private DATabButton sourceButton = null;
+       private int targetButtonIndex = -1;
+       private int sourceButtonIndex = -1;
+       
+       private boolean drag = false;
+       
        private int tabWidth = LONG_TAB_WIDTH;
 
        public DATabComposite(Composite parent, int style) {
@@ -167,19 +180,208 @@ public class DATabComposite extends DAView {
                tabButton.setLayoutData(data);
 
                final Composite tempChild = child;
-               DACustomButtonClickEventListener buttonListener = new DACustomButtonClickEventListener() {
+
+               Listener tabMoveEvent = new Listener() {
 
                        @Override
-                       public void handleClickEvent(DACustomButton button) {
-                               stackLayout.topControl = tempChild;
-                               changeButtonState(tabButton);
-                               tabComposite.layout();
-                               contentsComposite.layout();
-                               ((ViewAction) tempChild).updateView();
+                       public void handleEvent(Event event) {
+                               Point cursorLocation = tabComposite.getDisplay().getCurrent().getCursorLocation();
+                               Point curPosition = tabComposite.toControl(cursorLocation);
+                               
+                               switch(event.type) {
+                               case SWT.MouseDown:
+                                       drag = true;
+                                       sourceButton = (DATabButton) event.widget;
+                                       sourceButtonIndex = getButtons().indexOf(sourceButton);
+                                       
+                                       break;
+                               case SWT.MouseUp:
+                                       drag = false;
+                                       for (int i = 0; i < getButtons().size(); i++) {
+                                               Rectangle rec = getButtons().get(i).getBounds();
+                                               if (rec.contains(curPosition.x, 0)
+                                                               && (event.y > rec.y && event.y < rec.y+ rec.height)) {
+                                                       targetButtonIndex = i;
+                                                       break;
+                                               } else {
+                                                       targetButtonIndex = -1;
+                                               }
+                                       }
+                                       
+                                       if (targetButtonIndex == sourceButtonIndex) {
+                                               stackLayout.topControl = tempChild;
+                                               changeButtonState(tabButton);
+                                               tabComposite.layout();
+                                               contentsComposite.layout();
+                                               tempChild.update();
+                                               ((ViewAction) tempChild).updateView();
+                                               
+                                               return;
+                                       }
+
+                                       if (targetButtonIndex != -1) {
+                                               if (sourceButtonIndex == 0) { // source == first tab
+                                                       // source
+                                                       FormData data = new FormData();
+                                                       data.top = new FormAttachment(0, 0);
+                                                       data.bottom = new FormAttachment(100, 0);
+                                                       data.left = new FormAttachment(getButtons().get(targetButtonIndex));
+                                                       data.width = tabWidth;
+                                                       sourceButton.setLayoutData(data);
+
+                                                       // source+1
+                                                       data = new FormData();
+                                                       data.top = new FormAttachment(0, 0);
+                                                       data.bottom = new FormAttachment(100, 0);
+                                                       data.left = new FormAttachment(0, 0);
+                                                       data.width = tabWidth;
+                                                       getButtons().get(sourceButtonIndex + 1).setLayoutData(data);
+                                                       
+                                                       // target+1
+                                                       if (targetButtonIndex != getButtons().size()-1) {
+                                                               data = new FormData();
+                                                               data.top = new FormAttachment(0, 0);
+                                                               data.bottom = new FormAttachment(100, 0);
+                                                               data.left = new FormAttachment(getButtons().get(sourceButtonIndex));
+                                                               data.width = tabWidth;
+                                                               getButtons().get(targetButtonIndex+1).setLayoutData(data);                                                                      
+                                                       }
+                                                       
+                                                       Collections.rotate(getButtons().subList(sourceButtonIndex, targetButtonIndex + 1), -1);
+                                                       Collections.rotate(getTabChildren().subList(sourceButtonIndex, targetButtonIndex + 1), -1);
+
+                                               } else if (sourceButtonIndex == getButtons().size() - 1) { // source == last tab                                                                                                                                                                
+                                                       // source
+                                                       FormData data = new FormData();
+                                                       data.top = new FormAttachment(0, 0);
+                                                       data.bottom = new FormAttachment(100, 0);
+                                                       if (targetButtonIndex != 0) {
+                                                               data.left = new FormAttachment(getButtons().get(targetButtonIndex - 1));
+                                                       } else {
+                                                               data.left = new FormAttachment(0, 0);
+                                                       }
+                                                       data.width = tabWidth;
+                                                       sourceButton.setLayoutData(data);
+
+                                                       // target
+                                                       data = new FormData();
+                                                       data.top = new FormAttachment(0, 0);
+                                                       data.bottom = new FormAttachment(100, 0);
+                                                       data.left = new FormAttachment(getButtons().get(sourceButtonIndex));
+                                                       data.width = tabWidth;
+                                                       ((DATabButton) getButtons().get(targetButtonIndex)).setLayoutData(data);
+
+                                                       Collections.rotate(getButtons().subList(targetButtonIndex, sourceButtonIndex + 1), 1);
+                                                       Collections.rotate(getTabChildren().subList(targetButtonIndex, sourceButtonIndex + 1), 1);
+
+                                               } else { // first tab < source < last tab
+                                                       // source
+                                                       FormData data = new FormData();
+                                                       
+                                                       if (sourceButtonIndex < targetButtonIndex) { //forward
+                                                               // source
+                                                               data = new FormData();
+                                                               data.top = new FormAttachment(0, 0);
+                                                               data.bottom = new FormAttachment(100, 0);
+                                                               data.left = new FormAttachment(getButtons().get(targetButtonIndex));
+                                                               data.width = tabWidth;
+                                                               sourceButton.setLayoutData(data);
+                                                               
+                                                               // source +1
+                                                               data = new FormData();
+                                                               data.top = new FormAttachment(0, 0);
+                                                               data.bottom = new FormAttachment(100, 0);
+                                                               data.left = new FormAttachment(getButtons().get(sourceButtonIndex - 1));
+                                                               data.width = tabWidth;
+                                                               getButtons().get(sourceButtonIndex + 1).setLayoutData(data);
+                                                               
+                                                               // target+1
+                                                               if (targetButtonIndex != getButtons().size()-1) {
+                                                                       data = new FormData();
+                                                                       data.top = new FormAttachment(0, 0);
+                                                                       data.bottom = new FormAttachment(100, 0);
+                                                                       data.left = new FormAttachment(getButtons().get(sourceButtonIndex));
+                                                                       data.width = tabWidth;
+                                                                       getButtons().get(targetButtonIndex + 1).setLayoutData(data);                                                                    
+                                                               }
+                                                               
+                                                               Collections.rotate(getButtons().subList(sourceButtonIndex, targetButtonIndex + 1), -1);
+                                                               Collections.rotate(getTabChildren().subList(sourceButtonIndex, targetButtonIndex + 1), -1);
+                                                               
+                                                       } else { //backward
+                                                               // source
+                                                               data = new FormData();
+                                                               data.top = new FormAttachment(0, 0);
+                                                               data.bottom = new FormAttachment(100, 0);
+                                                               if (targetButtonIndex == 0) {
+                                                                       data.left = new FormAttachment(0,0);
+                                                               } else {
+                                                                       data.left = new FormAttachment(getButtons().get(targetButtonIndex - 1));
+                                                               }
+                                                               data.width = tabWidth;
+                                                               sourceButton.setLayoutData(data);
+                                                               
+                                                               // source +1
+                                                               data = new FormData();
+                                                               data.top = new FormAttachment(0, 0);
+                                                               data.bottom = new FormAttachment(100, 0);
+                                                               data.left = new FormAttachment(getButtons().get(sourceButtonIndex - 1));
+                                                               data.width = tabWidth;
+                                                               getButtons().get(sourceButtonIndex + 1).setLayoutData(data);
+                                                               
+                                                               // tartget
+                                                               data = new FormData();
+                                                               data.top = new FormAttachment(0, 0);
+                                                               data.bottom = new FormAttachment(100, 0);
+                                                               data.left = new FormAttachment(getButtons().get(sourceButtonIndex));
+                                                               data.width = tabWidth;
+                                                               getButtons().get(targetButtonIndex).setLayoutData(data);                                
+                                                               
+                                                               Collections.rotate(getButtons().subList(targetButtonIndex, sourceButtonIndex + 1), 1);
+                                                               Collections.rotate(getTabChildren().subList(targetButtonIndex, sourceButtonIndex + 1), 1);
+                                                       }
+                                               }                                                               
+                                       }                       
+                                       
+                                       stackLayout.topControl = tempChild;
+                                       tabComposite.layout();
+                                       contentsComposite.layout();
+
+                                       break;
+                               case SWT.MouseMove:
+                                       if(drag){
+                                               DATabButton selectedBtn = (DATabButton)event.widget;
+                                               for (int i = 0; i < getButtons().size(); i++) {
+                                                       Rectangle r = getButtons().get(i).getBounds();
+                                                       DATabButton btn = (DATabButton) getButtons().get(i);
+                                                       
+                                                       if (selectedBtn.equals(btn)) {
+                                                               btn.setGradationColor(DACustomButton.STATE_DISABLE,
+                                                                               ColorResources.TAB_SELECTED_COLOR_START,
+                                                                               ColorResources.TAB_SELECTED_COLOR_END);
+                                                               btn.setButtonEnabled(false);
+                                                               stackLayout.topControl = tempChild;
+                                                               tabComposite.layout();
+                                                               contentsComposite.layout();
+                                                               
+                                                       } else {
+                                                               if (r.contains(curPosition.x, 0) 
+                                                                               && (event.y > r.y && event.y < r.y+ r.height)) {
+                                                                       btn.changeButtonState(btn.STATE_HOVER);
+                                                               } else {
+                                                                       btn.changeButtonState(btn.STATE_NORMAL);
+                                                               }
+                                                       }
+                                               }
+                                       }
+                                       break;
+                               }
                        }
                };
-               tabButton.addClickListener(buttonListener);
-
+               tabButton.addListener(SWT.MouseUp, tabMoveEvent);
+               tabButton.addListener(SWT.MouseDown, tabMoveEvent);
+               tabButton.addListener(SWT.MouseMove, tabMoveEvent);
+       
                childrenMap.put(ID, child);
                buttonMap.put(ID, tabButton);
                getButtons().add(tabButton); // TODO : think about button map??
@@ -209,12 +411,13 @@ public class DATabComposite extends DAView {
                Composite child = childrenMap.get(ID);
                getTabChildren().remove(child);
                childrenMap.remove(ID);
+               tabComposite.layout();
+               
                final DACustomButton button = buttonMap.get(ID);
                if (!usingAnimation) {
                        button.setLayoutData(null);
                        getButtons().remove(button);
                        buttonMap.remove(ID);
-                       tabComposite.layout();
                } else {
                        Display.getDefault().syncExec(new Runnable() {
                                @Override
@@ -283,7 +486,7 @@ public class DATabComposite extends DAView {
                        }
                }
        }
-
+       
        private synchronized List<Composite> getTabChildren() {
                if (null == children) {
                        children = new ArrayList<Composite>();