From 819170c88f00417a550bb6f1bf08ce01c91f0aa8 Mon Sep 17 00:00:00 2001 From: "hyeran74.kim" Date: Thu, 6 Mar 2014 17:42:30 +0900 Subject: [PATCH] [Title] Page tab : added dynamic move function [Desc.] Dynamic move tab function has been added [Issue] Change-Id: If7b6be3da945f0ed19e607f021fe48b39ee3ea92 Signed-off-by: hyeran74.kim --- .../dynamicanalyzer/ui/widgets/DATabComposite.java | 229 +++++++++++++++++++-- 1 file changed, 216 insertions(+), 13 deletions(-) diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/widgets/DATabComposite.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/widgets/DATabComposite.java index b64fd57..bb16d2b 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/widgets/DATabComposite.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/widgets/DATabComposite.java @@ -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 getTabChildren() { if (null == children) { children = new ArrayList(); -- 2.7.4