[Title] call flow chart implementation
authorgreatim <jaewon81.lim@samsung.com>
Fri, 20 Dec 2013 06:46:43 +0000 (15:46 +0900)
committergreatim <jaewon81.lim@samsung.com>
Fri, 20 Dec 2013 06:46:43 +0000 (15:46 +0900)
[Desc.]
[Issue]

15 files changed:
org.tizen.dynamicanalyzer.widgets/src/org/tizen/dynamicanalyzer/widgets/chart/DAChartSeries.java
org.tizen.dynamicanalyzer.widgets/src/org/tizen/dynamicanalyzer/widgets/chartBoard/DAChartBoard.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/nl/KernelPageLabels.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/nl/KernelPageLabels.properties
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/kernel/CallFlowChart.java [new file with mode: 0644]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/kernel/CallFlowChartView.java [moved from org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/kernel/CallFlowView.java with 50% similarity]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/kernel/CallFlowTabComposite.java [new file with mode: 0644]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/kernel/ContextSwitchingChart.java [new file with mode: 0644]
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/kernel/ContextSwitchingChartSeriesItem.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/kernel/ContextSwitchingChartView.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/kernel/KernelListView.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/kernel/KernelPage.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/kernel/data/KernelDataMaker.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/kernel/data/KernelDataManager.java
org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/page/BaseView.java

index 7f91b42..181d898 100644 (file)
@@ -55,6 +55,7 @@ public class DAChartSeries {
        public static final int SERIES_BAR_ALIGN_CENTER = 1;
        public static final int SERIES_BAR_ALIGN_RIGHT = 2;
 
+       private Object data;
        private String name;
        private int style = SERIES_STYLE_NONE;
        private List<DAChartSeriesItem> seriesItems = new ArrayList<DAChartSeriesItem>();
@@ -288,4 +289,12 @@ public class DAChartSeries {
        public void setBarAlign(int barAlign) {
                this.barAlign = barAlign;
        }
+
+       public Object getData() {
+               return data;
+       }
+
+       public void setData(Object data) {
+               this.data = data;
+       }
 }
index 12b0cb6..d05c304 100644 (file)
@@ -48,6 +48,8 @@ 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.Event;
+import org.eclipse.swt.widgets.Listener;
 import org.eclipse.swt.widgets.ScrollBar;
 import org.tizen.dynamicanalyzer.widgets.button.DACustomButton;
 import org.tizen.dynamicanalyzer.widgets.button.DACustomButtonClickEventListener;
@@ -98,7 +100,7 @@ public class DAChartBoard extends Composite {
        private final static int DEFAULT_CHARTBOARD_MINIMIZE_BUTTON_WIDTH = 21;
        private final static int DEFAULT_CHARTBOARD_FOOTER_HEIGHT = 20;
        private final static int DEFAULT_CHARTBOARD_SCALE_WIDTH = 99;
-       
+
        public static final double ITEM_HEIGHT_RATIO_SHORT = 0.5;
        public static final double ITEM_HEIGHT_RATIO_NORMAL = 1;
        protected static final double ITEM_HEIGHT_RATIO_TALL = 2;
@@ -165,6 +167,8 @@ public class DAChartBoard extends Composite {
                        timeline = new DATimeline(this, false);
                        timeline.setRenderer(new DATimelineTinyTimeRenderer());
                }
+               
+               this.addListener(SWT.Resize, resizeListener);
 
                scale = new DAScale(this, 4, SWT.NONE);
                scale.addSelectionListener(scaleSelectionListener);
@@ -384,6 +388,13 @@ public class DAChartBoard extends Composite {
                }
        };
 
+       private Listener resizeListener = new Listener() {
+               @Override
+               public void handleEvent(Event event) {
+                       callBackSizeChanged();
+               }
+       };
+
        private void setChartAxis() {
                itemList.setChartAxis(getVisibleStartTime(), getVisibleEndTime());
        }
@@ -456,7 +467,7 @@ public class DAChartBoard extends Composite {
 
        protected void registerItem(DAChartBoardItem item) {
                itemList.registerItem(item);
-               
+
                int listHeight = itemList.getListHeight();
                itemList.setSize(itemListScrollComp.getClientArea().width, listHeight);
        }
@@ -622,7 +633,7 @@ public class DAChartBoard extends Composite {
                if (0 == itemSize || parentIndex >= itemSize) {
                        return;
                }
-               
+
                DAChartBoardItem item = itemList.get(parentIndex);
                if (null == item) {
                        return;
@@ -636,7 +647,7 @@ public class DAChartBoard extends Composite {
                        return;
                }
                item.getItemCell().setFoldButtonTrue();
-               
+
                DAChartBoardItem childItem = childItemList.get(childIndex);
                selectRow(childItem);
                int selection = itemList.getItemYPos(parentIndex)
@@ -727,6 +738,7 @@ public class DAChartBoard extends Composite {
 
        public void reArrangeItem(Integer a[]) {
                itemList.reArrangeItem(a);
+               itemList.layout(true, true);
        }
 
        public Composite getListComposite() {
@@ -759,10 +771,13 @@ public class DAChartBoard extends Composite {
        public ScrollBar getHScrollBar() {
                return hScroll;
        }
-       
+
        protected void callBackScaleChanged() {
        }
-       
+
        protected void callBackScrollChanged() {
        }
+       
+       protected void callBackSizeChanged() {
+       }
 }
index b59d385..765ea8c 100644 (file)
@@ -4,15 +4,17 @@ import org.eclipse.osgi.util.NLS;
 
 public class KernelPageLabels extends NLS {
        private static final String BUNDLE_NAME = "org.tizen.dynamicanalyzer.nl.KernelPageLabels";
-       
+
        public static String CONTEXT_SWITCH_CHART_TITLE;
-       public static String CALLFLOW_CHART_TITLE;
-       public static String KERNEL_STATISTIC_TITLE;
+       public static String CONTEXT_SWITCH_BOARD_NAME_PID;
+       public static String CONTEXT_SWITCH_BOARD_NAME_TID;
+       public static String CONTEXT_SWITCH_BOARD_NAME_FUNC_CHILD;
+       public static String CONTEXT_SWITCH_SERIES_NAME;
+       public static String CONTEXT_SWITCH_SERIES_NAME_CHILD;
+       public static String CONTEXT_SWITCH_SERIES_ITEM_NAME;
 
-       public static String KERNEL_CHART_SERIES_LOAD;
-       public static String KERNEL_CHART_SERIES_CORE;
-       public static String KERNEL_CHART_SERIES_FUNCTION;
-       public static String KERNEL_CHART_SERIES_THREAD;
+       public static String CALL_FLOW_CHART_TITLE;
+       public static String CALL_FLOW_BOARD_NAME_TID;
 
        public static String UNKNOWN_FUNCTION_NAME;
        public static String CORE_NAME_PREFIX;
@@ -25,7 +27,12 @@ public class KernelPageLabels extends NLS {
        public static String KERNEL_CHART_ITEM_END;
        public static String KERNEL_CHART_ITEM_SWITCHED;
 
+       public static String KERNEL_LIST_VIEW_NAME;
+       public static String KERNEL_LIST_VIEW_TITLE_CORE;
+       public static String KERNEL_LIST_VIEW_TITLE_FUNCTION;
        public static String KERNEL_LIST_VIEW_INDEX;
+       public static String KERNEL_LIST_VIEW_PID;
+       public static String KERNEL_LIST_VIEW_TID;
        public static String KERNEL_LIST_VIEW_START_TIME;
        public static String KERNEL_LIST_VIEW_END_TIME;
        public static String KERNEL_LIST_VIEW_EXECUTION_TIME;
@@ -33,22 +40,10 @@ public class KernelPageLabels extends NLS {
        public static String KERNEL_LIST_VIEW_END_PC;
        public static String KERNEL_LIST_VIEW_ENTRY;
        public static String KERNEL_LIST_VIEW_EXIT;
+       public static String KERNEL_LIST_VIEW_CORE;
+       public static String KERNEL_LIST_VIEW_FUNCTION;
 
-       public static String THREAD_LIST_VIEW_THREAD_TITLE;
-       public static String THREAD_LIST_VIEW_CORE_TITLE;
-       public static String THREAD_LIST_VIEW_FUNCTION_TITLE;
-       public static String THREAD_LIST_VIEW_INDEX;
-       public static String THREAD_LIST_VIEW_CORE;
-       public static String THREAD_LIST_VIEW_FUNCTION;
-
-       public static String CORE_LIST_VIEW_CORE_TITLE;
-       public static String CORE_LIST_VIEW_THREAD_TITLE;
-       public static String CORE_LIST_VIEW_FUNCTION_TITLE;
-       public static String CORE_LIST_VIEW_INDEX;
-       public static String CORE_LIST_VIEW_PID;
-       public static String CORE_LIST_VIEW_TID;
-       public static String CORE_LIST_VIEW_FUNCTION;
-
+       public static String KERNEL_STATISTIC_TITLE;
        public static String KERNEL_STATISTIC_CS_COUNT;
        public static String KERNEL_STATISTIC_CS_AVGTIME;
        public static String KERNEL_STATISTIC_CS_OVERHEAD;
index c0e509c..17fe816 100644 (file)
@@ -1,11 +1,13 @@
-CONTEXT_SWITCH_CHART_TITLE=Context-switch
-CALLFLOW_CHART_TITLE=Call-flow
-KERNEL_STATISTIC_TITLE=Kernel Statistics
+CONTEXT_SWITCH_CHART_TITLE=Context Switch
+CONTEXT_SWITCH_BOARD_NAME_PID=PID :
+CONTEXT_SWITCH_BOARD_NAME_TID=TID :
+CONTEXT_SWITCH_BOARD_NAME_FUNC_CHILD=Functions
+CONTEXT_SWITCH_SERIES_NAME=core number
+CONTEXT_SWITCH_SERIES_NAME_CHILD=function name
+CONTEXT_SWITCH_SERIES_ITEM_NAME=Core
 
-KERNEL_CHART_SERIES_LOAD=Load
-KERNEL_CHART_SERIES_CORE=Core
-KERNEL_CHART_SERIES_FUNCTION=Function
-KERNEL_CHART_SERIES_THREAD=Thread
+CALL_FLOW_CHART_TITLE=Call Flow
+CALL_FLOW_BOARD_NAME_TID=TID :
 
 UNKNOWN_FUNCTION_NAME=unknown
 CORE_NAME_PREFIX=core<
@@ -18,7 +20,12 @@ KERNEL_CHART_ITEM_START=Start
 KERNEL_CHART_ITEM_END=End
 KERNEL_CHART_ITEM_SWITCHED=Switched
 
+KERNEL_LIST_VIEW_NAME=Contexts
+KERNEL_LIST_VIEW_TITLE_CORE=Context List for Thread
+KERNEL_LIST_VIEW_TITLE_FUNCTION=Function Fragment List for Thread
 KERNEL_LIST_VIEW_INDEX=#
+KERNEL_LIST_VIEW_PID=PID
+KERNEL_LIST_VIEW_TID=TID
 KERNEL_LIST_VIEW_START_TIME=Start time
 KERNEL_LIST_VIEW_END_TIME=End time
 KERNEL_LIST_VIEW_EXECUTION_TIME=Execution time
@@ -26,22 +33,10 @@ KERNEL_LIST_VIEW_START_PC=Start pc addr
 KERNEL_LIST_VIEW_END_PC=End pc addr
 KERNEL_LIST_VIEW_ENTRY=Entry of func.
 KERNEL_LIST_VIEW_EXIT=Exit of func.
+KERNEL_LIST_VIEW_CORE=Core number
+KERNEL_LIST_VIEW_FUNCTION=Function name
 
-THREAD_LIST_VIEW_THREAD_TITLE=Context Switch List for Thread
-THREAD_LIST_VIEW_CORE_TITLE=Core Usage List for Thread
-THREAD_LIST_VIEW_FUNCTION_TITLE=Function Call List for Thread
-THREAD_LIST_VIEW_INDEX=#
-THREAD_LIST_VIEW_CORE=Core num
-THREAD_LIST_VIEW_FUNCTION=Function name
-
-CORE_LIST_VIEW_CORE_TITLE=Context Switch List for Core
-CORE_LIST_VIEW_THREAD_TITLE=Thread List fir Core
-CORE_LIST_VIEW_FUNCTION_TITLE=Function Call List for Core
-CORE_LIST_VIEW_INDEX=#
-CORE_LIST_VIEW_PID=pid
-CORE_LIST_VIEW_TID=tid
-CORE_LIST_VIEW_FUNCTION=Function name
-
+KERNEL_STATISTIC_TITLE=Kernel Statistics
 KERNEL_STATISTIC_CS_COUNT=Number of context switch :
 KERNEL_STATISTIC_CS_AVGTIME=Average execution time of contexts :
 KERNEL_STATISTIC_CS_OVERHEAD=Overhead time of context switch :
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/kernel/CallFlowChart.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/kernel/CallFlowChart.java
new file mode 100644 (file)
index 0000000..1851f3b
--- /dev/null
@@ -0,0 +1,232 @@
+package org.tizen.dynamicanalyzer.ui.kernel;
+
+import java.util.HashMap;
+import java.util.List;
+
+import org.eclipse.swt.widgets.Composite;
+import org.tizen.dynamicanalyzer.nl.KernelPageLabels;
+import org.tizen.dynamicanalyzer.nl.TimelineChartLabels;
+import org.tizen.dynamicanalyzer.resources.ColorResources;
+import org.tizen.dynamicanalyzer.resources.FontResources;
+import org.tizen.dynamicanalyzer.resources.ImageResources;
+import org.tizen.dynamicanalyzer.ui.common.PopupAnalysisMenuItemClickListener;
+import org.tizen.dynamicanalyzer.ui.common.PopupClearMenuItemClickListener;
+import org.tizen.dynamicanalyzer.ui.common.PopupEndMenuItemClickListener;
+import org.tizen.dynamicanalyzer.ui.common.PopupFromSelectionMenuItemClickListener;
+import org.tizen.dynamicanalyzer.ui.common.PopupStartMenuItemClickListener;
+import org.tizen.dynamicanalyzer.ui.common.TimelineChartMouseEventListener;
+import org.tizen.dynamicanalyzer.ui.common.TimelineChartMouseTrackAdapter;
+import org.tizen.dynamicanalyzer.ui.kernel.data.KernelDataMaker;
+import org.tizen.dynamicanalyzer.ui.kernel.data.KernelDataPerThread;
+import org.tizen.dynamicanalyzer.ui.timeline.common.TimelineConstants;
+import org.tizen.dynamicanalyzer.widgets.chart.DAChart;
+import org.tizen.dynamicanalyzer.widgets.chart.DAChartPlot;
+import org.tizen.dynamicanalyzer.widgets.chart.DAChartPlotTooltip;
+import org.tizen.dynamicanalyzer.widgets.chart.DAChartSeries;
+import org.tizen.dynamicanalyzer.widgets.chart.DAChartPlot.AutoRangeType;
+import org.tizen.dynamicanalyzer.widgets.chartBoard.DAChartBoard;
+import org.tizen.dynamicanalyzer.widgets.chartBoard.DAChartBoardHeightChangeableItem;
+import org.tizen.dynamicanalyzer.widgets.chartBoard.DAChartBoardItemList;
+import org.tizen.dynamicanalyzer.widgets.popupMenu.DAPopupMenu;
+import org.tizen.dynamicanalyzer.widgets.popupMenu.DAPopupMenuItem;
+
+public class CallFlowChart extends DAChartBoard {
+       private KernelDataPerThread selectedData = null;
+       private final KernelDataMaker dataMaker = KernelDataMaker.getInstance();
+       private HashMap<String, DAChartSeries> seriesMap = null;
+
+       public CallFlowChart(Composite parent, String title) {
+               super(parent, title);
+       }
+
+       public CallFlowChart(Composite parent, String title, int[] scaleValues) {
+               super(parent, title, scaleValues);
+       }
+
+       public CallFlowChart(Composite parent, String title, int boardStyle) {
+               super(parent, title, boardStyle);
+       }
+
+       @Override
+       protected void callBackScaleChanged() {
+               updateChart();
+               super.callBackScaleChanged();
+       }
+
+       @Override
+       protected void callBackScrollChanged() {
+               updateChart();
+               super.callBackScrollChanged();
+       }
+
+       @Override
+       protected void callBackSizeChanged() {
+               layout(true, true);
+               updateChart();
+               super.callBackSizeChanged();
+       }
+
+       public void setSelectedData(KernelDataPerThread data) {
+               selectedData = data;
+       }
+
+       public void updateChart() {
+               // remove all previous items
+               DAChartBoardItemList itemList = getItemList();
+               itemList.clear();
+               clear();
+               if (seriesMap != null) {
+                       seriesMap.clear();
+                       seriesMap = null;
+               }
+
+               if (selectedData == null) {
+                       return;
+               }
+
+               // get data from db
+               List<List<String>> funcnames = dataMaker.getFuncnameFromDB(selectedData
+                               .getTid());
+               int fsize = funcnames.size();
+
+               // create board item for these functions
+               DAChartBoardHeightChangeableItem funcItem = new DAChartBoardHeightChangeableItem(
+                               this, KernelPageLabels.CALL_FLOW_BOARD_NAME_TID + " "
+                                               + selectedData.getTid());
+               initCallflowChart(funcItem, fsize);
+
+               seriesMap = new HashMap<String, DAChartSeries>(fsize * 2);
+               DAChart funcChart = funcItem.getChart();
+               for (int i = 0; i < fsize; i++) {
+                       String funcname = funcnames.get(i).get(0);
+                       DAChartSeries funcseries = new DAChartSeries(funcname, -1,
+                                       ColorResources.RED, true);
+                       funcChart.addSeries(funcseries);
+                       funcseries.setData(new Integer(i));
+                       seriesMap.put(funcname, funcseries);
+               }
+
+               drawChart();
+       }
+
+       private void drawChart() {
+               if (selectedData == null) {
+                       return;
+               }
+
+               // get data from database and add new item to series
+               long starttime = (long) (getVisibleStartTime() * TimelineConstants.MEGA_DOUBLE);
+               long endtime = (long) (getVisibleEndTime() * TimelineConstants.MEGA_DOUBLE);
+
+               List<List<String>> functionData = dataMaker.getFunctionDataFromDB(
+                               starttime, endtime, selectedData.getTid());
+               if (functionData == null || functionData.isEmpty()) {
+                       return;
+               }
+
+               int fsize = functionData.size();
+               ContextSwitchingChartSeriesItem prevItem = null;
+               int prevSeriesNum = -1;
+
+               for (int i = 0; i < fsize; i++) {
+                       List<String> idata = functionData.get(i);
+                       String funcname = idata
+                                       .get(KernelDataMaker.FUNCTION_DATA_COLUMN_INDEX_FUNCNAME);
+                       double funcStart = (double) (Long.parseLong(idata
+                                       .get(KernelDataMaker.FUNCTION_DATA_COLUMN_INDEX_STARTTIME)))
+                                       / TimelineConstants.MEGA_DOUBLE;
+                       double funcEnd = (double) (Long.parseLong(idata
+                                       .get(KernelDataMaker.FUNCTION_DATA_COLUMN_INDEX_ENDTIME)))
+                                       / TimelineConstants.MEGA_DOUBLE;
+
+                       DAChartSeries funcSeries = seriesMap.get(funcname);
+                       if (funcSeries != null) {
+                               int curSeriesNum = ((Integer) funcSeries.getData()).intValue();
+                               ContextSwitchingChartSeriesItem curItem = new ContextSwitchingChartSeriesItem(
+                                               null, funcStart, funcEnd, ColorResources.RED);
+
+                               // for previous function segment
+                               if (prevItem != null && prevSeriesNum != curSeriesNum) {
+                                       prevItem.setArrow(curSeriesNum - prevSeriesNum);
+                               }
+                               funcSeries.addSeriesItem(curItem);
+
+                               prevItem = curItem;
+                               prevSeriesNum = curSeriesNum;
+                       } else {
+                               System.out
+                                               .println("[ERR] Function series is not exist in call flow chart");
+                       }
+               }
+
+               // redraw
+               redraw();
+               update();
+       }
+
+       private void initCallflowChart(DAChartBoardHeightChangeableItem chartItem,
+                       int itemsize) {
+               DAChart chart = chartItem.getChart();
+               if (null == chart) {
+                       return;
+               }
+
+               DAChartPlot plot = chart.getPlot();
+               if (null == plot) {
+                       return;
+               }
+
+               chartItem.useExpand(false);
+               chartItem.setHeightRatio(itemsize * 0.3);
+               chart.getPlot().setAutoHeightRange(AutoRangeType.MANUAL);
+               chart.getPlot().setShowAxis(false);
+               chart.setChartRenderer(new CallFlowChartRenderer());
+
+               plot.setBackgroundImage(ImageResources.BG_GRADIENT);
+
+               DAChartPlotTooltip tooltip = new DAChartPlotTooltip(-1);
+               tooltip.setFont(FontResources.CHART_TOOLTIP_FONT);
+               plot.setTooltip(tooltip);
+
+               DAPopupMenu popupMenu = new DAPopupMenu(chart);
+               popupMenu.setFont(FontResources.CONTEXT_MENU_ITEM_FONT);
+
+               DAPopupMenuItem startItem = new DAPopupMenuItem(popupMenu,
+                               DAPopupMenuItem.NONE);
+               startItem.setText(TimelineChartLabels.RANGE_CONTEXT_SET_START);
+               startItem.addListener(new PopupStartMenuItemClickListener(startItem,
+                               this));
+
+               DAPopupMenuItem endItem = new DAPopupMenuItem(popupMenu,
+                               DAPopupMenuItem.NONE);
+               endItem.setText(TimelineChartLabels.RANGE_CONTEXT_SET_END);
+               endItem.addListener(new PopupEndMenuItemClickListener(endItem, this));
+
+               DAPopupMenuItem fromSelectionItem = new DAPopupMenuItem(popupMenu,
+                               DAPopupMenuItem.NONE);
+               fromSelectionItem
+                               .setText(TimelineChartLabels.RANGE_CONTEXT_SET_FROM_SELECTION);
+               fromSelectionItem
+                               .addListener(new PopupFromSelectionMenuItemClickListener(
+                                               fromSelectionItem, this));
+
+               DAPopupMenuItem analysisItem = new DAPopupMenuItem(popupMenu,
+                               DAPopupMenuItem.NONE);
+               analysisItem.setText(TimelineChartLabels.RANGE_CONTEXT_ANALYSIS);
+               analysisItem.addListener(new PopupAnalysisMenuItemClickListener());
+
+               DAPopupMenuItem clearItem = new DAPopupMenuItem(popupMenu,
+                               DAPopupMenuItem.NONE);
+               clearItem.setText(TimelineChartLabels.RANGE_CONTEXT_CLEAR);
+               clearItem.addListener(new PopupClearMenuItemClickListener());
+
+               TimelineChartMouseEventListener timelineChartMouseEventListener = new TimelineChartMouseEventListener(
+                               popupMenu, getTimeline());
+               chart.addMouseListener(timelineChartMouseEventListener);
+               chart.addMouseMoveListener(timelineChartMouseEventListener);
+               chart.addMouseTrackListener(new TimelineChartMouseTrackAdapter(
+                               getTimeline()));
+               plot.setMarkers(getMarkers());
+       }
+
+}
@@ -1,83 +1,61 @@
 package org.tizen.dynamicanalyzer.ui.kernel;
 
-import java.util.List;
-
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.StackLayout;
-import org.eclipse.swt.graphics.Color;
 import org.eclipse.swt.layout.FillLayout;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 import org.tizen.dynamicanalyzer.common.AnalyzerManager;
-import org.tizen.dynamicanalyzer.common.CommonConstants;
 import org.tizen.dynamicanalyzer.common.DASelectionData;
 import org.tizen.dynamicanalyzer.model.DAView;
 import org.tizen.dynamicanalyzer.nl.KernelPageLabels;
-import org.tizen.dynamicanalyzer.nl.TimelineChartLabels;
 import org.tizen.dynamicanalyzer.resources.ColorResources;
 import org.tizen.dynamicanalyzer.resources.FontResources;
 import org.tizen.dynamicanalyzer.resources.ImageResources;
-import org.tizen.dynamicanalyzer.ui.common.PopupAnalysisMenuItemClickListener;
-import org.tizen.dynamicanalyzer.ui.common.PopupClearMenuItemClickListener;
-import org.tizen.dynamicanalyzer.ui.common.PopupEndMenuItemClickListener;
-import org.tizen.dynamicanalyzer.ui.common.PopupFromSelectionMenuItemClickListener;
-import org.tizen.dynamicanalyzer.ui.common.PopupStartMenuItemClickListener;
 import org.tizen.dynamicanalyzer.ui.common.SetRangeMarkerMouseMoveListener;
-import org.tizen.dynamicanalyzer.ui.common.TimelineChartMouseEventListener;
-import org.tizen.dynamicanalyzer.ui.common.TimelineChartMouseTrackAdapter;
 import org.tizen.dynamicanalyzer.ui.common.UICommonConstants;
-import org.tizen.dynamicanalyzer.ui.kernel.data.KernelDataMaker;
 import org.tizen.dynamicanalyzer.ui.kernel.data.KernelDataPerThread;
-import org.tizen.dynamicanalyzer.ui.network.NetworkChartData;
-import org.tizen.dynamicanalyzer.ui.network.NetworkChartManager;
 import org.tizen.dynamicanalyzer.ui.range.RangeDataManager;
 import org.tizen.dynamicanalyzer.ui.timeline.common.TimelineConstants;
 import org.tizen.dynamicanalyzer.ui.timeline.logparser.LifecycleLogParser;
+import org.tizen.dynamicanalyzer.ui.toolbar.ToolbarArea;
 import org.tizen.dynamicanalyzer.ui.widgets.TitleComboPopupRenderer;
 import org.tizen.dynamicanalyzer.ui.widgets.TitleComboRenderer;
 import org.tizen.dynamicanalyzer.ui.widgets.ViewContainer;
 import org.tizen.dynamicanalyzer.widgets.button.DACustomButtonRenderer;
-import org.tizen.dynamicanalyzer.widgets.chart.DAChart;
-import org.tizen.dynamicanalyzer.widgets.chart.DAChartPlot;
 import org.tizen.dynamicanalyzer.widgets.chart.DAChartPlotIntervalMarker;
-import org.tizen.dynamicanalyzer.widgets.chart.DAChartPlotTooltip;
-import org.tizen.dynamicanalyzer.widgets.chart.DAChartSeries;
-import org.tizen.dynamicanalyzer.widgets.chart.DAChartPlot.AutoRangeType;
 import org.tizen.dynamicanalyzer.widgets.chartBoard.DAChartBoard;
-import org.tizen.dynamicanalyzer.widgets.chartBoard.DAChartBoardHeightChangeableItem;
 import org.tizen.dynamicanalyzer.widgets.chartBoard.DAChartBoardItem;
 import org.tizen.dynamicanalyzer.widgets.chartBoard.DAChartBoardSelectionListener;
 import org.tizen.dynamicanalyzer.widgets.combo.DACustomCombo;
-import org.tizen.dynamicanalyzer.widgets.popupMenu.DAPopupMenu;
-import org.tizen.dynamicanalyzer.widgets.popupMenu.DAPopupMenuItem;
 import org.tizen.dynamicanalyzer.widgets.timeline.DATimeline;
 
-public class CallFlowView extends DAView {
-       public static final String ID = CallFlowView.class.getName();
+public class CallFlowChartView extends DAView {
+       public static final String ID = CallFlowChartView.class.getName();
 
        private final Composite contents;
-       private DAChartBoard callflowChart;
+       private CallFlowChart callflowChart;
        private DACustomCombo callflowCombo;
        private final StackLayout stackLayout;
 
-       private KernelDataPerThread selectedData = null;
-
        private final RangeDataManager rangeDataManager = RangeDataManager
                        .getInstance();
 
-       public CallFlowView(Composite parent, int style) {
+       public CallFlowChartView(Composite parent, int style) {
                super(parent, style);
+               name = KernelPageLabels.CALL_FLOW_CHART_TITLE;
                this.setLayout(new FillLayout());
 
                ViewContainer viewContainer = new ViewContainer(this, false);
-               viewContainer.setTitleText(KernelPageLabels.CALLFLOW_CHART_TITLE);
+               viewContainer.setTitleText(KernelPageLabels.CALL_FLOW_CHART_TITLE);
 
                contents = viewContainer.getContentArea();
                contents.setBackground(ColorResources.WINDOW_BG_COLOR);
                stackLayout = new StackLayout();
                contents.setLayout(stackLayout);
-               callflowChart = new DAChartBoard(contents,
-                               KernelPageLabels.CALLFLOW_CHART_TITLE);
+               callflowChart = new CallFlowChart(contents,
+                               KernelPageLabels.CALL_FLOW_CHART_TITLE,
+                               ContextSwitchingChartView.kernelScaleValue);
                callflowChart.setNameFont(FontResources.CHART_NAME_FONT);
                callflowChart.addSelectionListener(new DAChartBoardSelectionListener() {
                        @Override
@@ -86,7 +64,7 @@ public class CallFlowView extends DAView {
                                                .getCurrentPage()
                                                .updatePage(
                                                                new DASelectionData(
-                                                                               CallFlowView.ID,
+                                                                               CallFlowChartView.ID,
                                                                                (long) (((DAChartPlotIntervalMarker) callflowChart
                                                                                                .getMarkers()
                                                                                                .get(UICommonConstants.SELECTION_MARKER_INDEX))
@@ -108,7 +86,7 @@ public class CallFlowView extends DAView {
                                ImageResources.TIMELINE_DROPDOWN_HOVER,
                                ImageResources.TIMELINE_DROPDOWN_PUSH,
                                ImageResources.TIMELINE_DROPDOWN_NORMAL);
-               callflowCombo.add(KernelPageLabels.CALLFLOW_CHART_TITLE);
+               callflowCombo.add(KernelPageLabels.CALL_FLOW_CHART_TITLE);
                callflowCombo.setTextAlign(DACustomCombo.TEXT_ALIGN_CENTER);
                callflowCombo.select(0);
                callflowCombo.setEnabled(false);
@@ -127,37 +105,73 @@ public class CallFlowView extends DAView {
 
                timeline.addMouseMoveListener(new SetRangeMarkerMouseMoveListener(
                                rangeDataManager, callflowChart, timeline));
-
-               clear();
        }
 
        @Override
        public void updateView() {
-               if (selectedData == null) {
-                       return;
+               callflowChart.updateChart();
+
+               // set chart end time
+               callflowChart.setTotalEndTime(ToolbarArea.getInstance().getTime());
+
+               // setting markers
+               callflowChart.setTimelineMarkerStartTime(RangeDataManager.getInstance()
+                               .getMarkerStartTime() / TimelineConstants.MEGA_DOUBLE);
+               callflowChart.setTimelineMarkerEndTime(RangeDataManager.getInstance()
+                               .getMarkerEndTime() / TimelineConstants.MEGA_DOUBLE);
+
+               RangeDataManager rangeDataManager = RangeDataManager.getInstance();
+               if (rangeDataManager.isBeingAnalyzed()) {
+                       ((DAChartPlotIntervalMarker) callflowChart.getMarkers().get(
+                                       UICommonConstants.RANGE_ANALYSIS_MARKER_INDEX))
+                                       .setInterval(rangeDataManager.getAnalysisStartTime()
+                                                       / TimelineConstants.MEGA_DOUBLE,
+                                                       rangeDataManager.getAnalysisEndTime()
+                                                                       / TimelineConstants.MEGA_DOUBLE);
+               } else {
+                       ((DAChartPlotIntervalMarker) callflowChart.getMarkers().get(
+                                       UICommonConstants.RANGE_ANALYSIS_MARKER_INDEX))
+                                       .setInterval(-1, -1);
                }
+
+               ((DAChartPlotIntervalMarker) callflowChart.getMarkers().get(
+                               UICommonConstants.RANGE_MARKER_INDEX)).setInterval(
+                               rangeDataManager.getMarkerStartTime()
+                                               / TimelineConstants.MEGA_DOUBLE,
+                               rangeDataManager.getMarkerEndTime()
+                                               / TimelineConstants.MEGA_DOUBLE);
        }
 
        @Override
        public void updateView(DASelectionData selData) {
-               KernelDataPerThread sdata = (KernelDataPerThread) selData.getData();
+               Object odata = selData.getData();
                long selectionStartTime, selectionEndTime;
 
-               if (!(sdata instanceof KernelDataPerThread)) {
+               if (!(odata instanceof KernelDataPerThread)) {
                        selectionStartTime = selData.getStartTime();
                        selectionEndTime = selData.getEndTime();
+
+                       double startTime = (double) selectionStartTime
+                                       / TimelineConstants.MEGA_DOUBLE;
+                       double endTime = (double) selectionEndTime
+                                       / TimelineConstants.MEGA_DOUBLE;
+
+                       DAChartBoard chartBoard = (DAChartBoard) stackLayout.topControl;
+
+                       DAChartPlotIntervalMarker intervalMarker = (DAChartPlotIntervalMarker) chartBoard
+                                       .getMarkers().get(UICommonConstants.SELECTION_MARKER_INDEX);
+                       intervalMarker.setInterval(startTime, endTime);
                } else {
-                       selectedData = sdata;
+                       KernelDataPerThread sdata = (KernelDataPerThread) odata;
+                       callflowChart.setSelectedData(sdata);
+                       callflowChart.updateChart();
                }
-
-               // tableComp.getTable().removeAll();
-               // tableComp.updateTable();
-               // tableComp.setSelectionByTime(selectionStartTime, selectionEndTime);
        }
 
        @Override
        public void clear() {
                callflowChart.clear();
+               initIntervalMarkers(callflowChart);
        }
 
        @Override
@@ -165,97 +179,6 @@ public class CallFlowView extends DAView {
                return callflowChart;
        }
 
-       private void updateChart() {
-               callflowChart.clear();
-               if (selectedData == null) {
-                       return;
-               }
-
-               // create board item for these functions
-               DAChartBoardHeightChangeableItem funcItem = new DAChartBoardHeightChangeableItem(
-                               callflowChart, "tid : " + selectedData.getTid());
-               initCallflowChart(funcItem);
-
-               DAChart funcChart = funcItem.getChart();
-
-               List<List<String>> funcnames = KernelDataMaker.getInstance()
-                               .getFuncnameFromDB(selectedData.getTid());
-               int fsize = funcnames.size();
-
-               for (int i = 0; i < fsize; i++) {
-                       String funcname = funcnames.get(i).get(0);
-                       funcChart.addSeries(new DAChartSeries(funcname + "()", -1,
-                                       ColorResources.RED));
-               }
-
-       }
-
-       private void initCallflowChart(DAChartBoardHeightChangeableItem chartItem) {
-               DAChart chart = chartItem.getChart();
-               if (null == chart) {
-                       return;
-               }
-
-               DAChartPlot plot = chart.getPlot();
-               if (null == plot) {
-                       return;
-               }
-
-               chartItem.useExpand(false);
-               chartItem.setHeightRatio(0.5);
-               chart.getPlot().setAutoHeightRange(AutoRangeType.MANUAL);
-               chart.getPlot().setShowAxis(false);
-               chart.setChartRenderer(new CallFlowChartRenderer());
-
-               plot.setBackgroundImage(ImageResources.BG_GRADIENT);
-
-               DAChartPlotTooltip tooltip = new DAChartPlotTooltip(-1);
-               tooltip.setFont(FontResources.CHART_TOOLTIP_FONT);
-               plot.setTooltip(tooltip);
-
-               DAPopupMenu popupMenu = new DAPopupMenu(chart);
-               popupMenu.setFont(FontResources.CONTEXT_MENU_ITEM_FONT);
-
-               DAPopupMenuItem startItem = new DAPopupMenuItem(popupMenu,
-                               DAPopupMenuItem.NONE);
-               startItem.setText(TimelineChartLabels.RANGE_CONTEXT_SET_START);
-               startItem.addListener(new PopupStartMenuItemClickListener(startItem,
-                               callflowChart));
-
-               DAPopupMenuItem endItem = new DAPopupMenuItem(popupMenu,
-                               DAPopupMenuItem.NONE);
-               endItem.setText(TimelineChartLabels.RANGE_CONTEXT_SET_END);
-               endItem.addListener(new PopupEndMenuItemClickListener(endItem,
-                               callflowChart));
-
-               DAPopupMenuItem fromSelectionItem = new DAPopupMenuItem(popupMenu,
-                               DAPopupMenuItem.NONE);
-               fromSelectionItem
-                               .setText(TimelineChartLabels.RANGE_CONTEXT_SET_FROM_SELECTION);
-               fromSelectionItem
-                               .addListener(new PopupFromSelectionMenuItemClickListener(
-                                               fromSelectionItem, callflowChart));
-
-               DAPopupMenuItem analysisItem = new DAPopupMenuItem(popupMenu,
-                               DAPopupMenuItem.NONE);
-               analysisItem.setText(TimelineChartLabels.RANGE_CONTEXT_ANALYSIS);
-               analysisItem.addListener(new PopupAnalysisMenuItemClickListener());
-
-               DAPopupMenuItem clearItem = new DAPopupMenuItem(popupMenu,
-                               DAPopupMenuItem.NONE);
-               clearItem.setText(TimelineChartLabels.RANGE_CONTEXT_CLEAR);
-               clearItem.addListener(new PopupClearMenuItemClickListener());
-
-               TimelineChartMouseEventListener timelineChartMouseEventListener = new TimelineChartMouseEventListener(
-                               popupMenu, callflowChart.getTimeline());
-               chart.addMouseListener(timelineChartMouseEventListener);
-               chart.addMouseMoveListener(timelineChartMouseEventListener);
-               chart.addMouseTrackListener(new TimelineChartMouseTrackAdapter(
-                               callflowChart.getTimeline()));
-               plot.setMarkers(callflowChart.getMarkers());
-
-       }
-
        private void initIntervalMarkers(DAChartBoard board) {
                // selection marker
                DAChartPlotIntervalMarker selectionMarker = new DAChartPlotIntervalMarker(
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/kernel/CallFlowTabComposite.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/kernel/CallFlowTabComposite.java
new file mode 100644 (file)
index 0000000..99cc21e
--- /dev/null
@@ -0,0 +1,12 @@
+package org.tizen.dynamicanalyzer.ui.kernel;
+
+import org.eclipse.swt.widgets.Composite;
+import org.tizen.dynamicanalyzer.ui.widgets.DATabComposite;
+
+public class CallFlowTabComposite extends DATabComposite {
+
+       public CallFlowTabComposite(Composite parent, int style) {
+               super(parent, style);
+       }
+
+}
diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/kernel/ContextSwitchingChart.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/kernel/ContextSwitchingChart.java
new file mode 100644 (file)
index 0000000..da0c7a6
--- /dev/null
@@ -0,0 +1,345 @@
+package org.tizen.dynamicanalyzer.ui.kernel;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+import org.eclipse.swt.widgets.Composite;
+import org.tizen.dynamicanalyzer.nl.KernelPageLabels;
+import org.tizen.dynamicanalyzer.nl.TimelineChartLabels;
+import org.tizen.dynamicanalyzer.resources.ColorResources;
+import org.tizen.dynamicanalyzer.resources.FontResources;
+import org.tizen.dynamicanalyzer.resources.ImageResources;
+import org.tizen.dynamicanalyzer.ui.common.PopupAnalysisMenuItemClickListener;
+import org.tizen.dynamicanalyzer.ui.common.PopupClearMenuItemClickListener;
+import org.tizen.dynamicanalyzer.ui.common.PopupEndMenuItemClickListener;
+import org.tizen.dynamicanalyzer.ui.common.PopupFromSelectionMenuItemClickListener;
+import org.tizen.dynamicanalyzer.ui.common.PopupStartMenuItemClickListener;
+import org.tizen.dynamicanalyzer.ui.common.TimelineChartMouseEventListener;
+import org.tizen.dynamicanalyzer.ui.common.TimelineChartMouseTrackAdapter;
+import org.tizen.dynamicanalyzer.ui.kernel.data.KernelDataMaker;
+import org.tizen.dynamicanalyzer.ui.kernel.data.KernelDataPerThread;
+import org.tizen.dynamicanalyzer.ui.kernel.data.KernelDataPerThreadComparator;
+import org.tizen.dynamicanalyzer.ui.timeline.common.TimelineConstants;
+import org.tizen.dynamicanalyzer.widgets.chart.DAChart;
+import org.tizen.dynamicanalyzer.widgets.chart.DAChartPlot;
+import org.tizen.dynamicanalyzer.widgets.chart.DAChartPlotTooltip;
+import org.tizen.dynamicanalyzer.widgets.chart.DAChartSeries;
+import org.tizen.dynamicanalyzer.widgets.chart.DAChartPlot.AutoRangeType;
+import org.tizen.dynamicanalyzer.widgets.chartBoard.DAChartBoard;
+import org.tizen.dynamicanalyzer.widgets.chartBoard.DAChartBoardHeightChangeableItem;
+import org.tizen.dynamicanalyzer.widgets.chartBoard.DAChartBoardItem;
+import org.tizen.dynamicanalyzer.widgets.chartBoard.DAChartBoardItemList;
+import org.tizen.dynamicanalyzer.widgets.popupMenu.DAPopupMenu;
+import org.tizen.dynamicanalyzer.widgets.popupMenu.DAPopupMenuItem;
+
+public class ContextSwitchingChart extends DAChartBoard {
+       private final KernelDataMaker dataMaker = KernelDataMaker.getInstance();
+
+       public ContextSwitchingChart(Composite parent, String title) {
+               super(parent, title);
+       }
+
+       public ContextSwitchingChart(Composite parent, String title,
+                       int[] scaleValues) {
+               super(parent, title, scaleValues);
+       }
+
+       public ContextSwitchingChart(Composite parent, String title, int boardStyle) {
+               super(parent, title, boardStyle);
+       }
+
+       @Override
+       protected void callBackScaleChanged() {
+               updateChart(false);
+               super.callBackScaleChanged();
+       }
+
+       @Override
+       protected void callBackScrollChanged() {
+               updateChart(false);
+               super.callBackScrollChanged();
+       }
+
+       @Override
+       protected void callBackSizeChanged() {
+               layout(true, true);
+               updateChart(false);
+               super.callBackSizeChanged();
+       }
+
+       public void updateChart(boolean rearrange) {
+               List<KernelDataPerThread> threads = dataMaker.getThreadData();
+               int thread_size = threads.size();
+
+               for (int i = 0; i < thread_size; i++) {
+                       KernelDataPerThread kdata = threads.get(i);
+                       DAChartBoardItem bitem = kdata.getContextChart();
+                       if (bitem == null) {
+                               // create board item for this thread context
+                               DAChartBoardHeightChangeableItem coreItem = new DAChartBoardHeightChangeableItem(
+                                               this, getChartName(kdata));
+                               initContextSwitchChart(coreItem, true);
+
+                               DAChart coreChart = coreItem.getChart();
+                               DAChartSeries coreSeries = new DAChartSeries(
+                                               KernelPageLabels.CONTEXT_SWITCH_SERIES_NAME, -1,
+                                               ColorResources.BLUE);
+                               coreChart.addSeries(coreSeries);
+
+                               coreItem.setData(kdata);
+                               kdata.setContextChart(coreItem);
+                       } else {
+                               // delete previous drawing items
+                               bitem.getChart().getSeries(0).clear();
+                       }
+
+                       bitem = kdata.getFunctionChart();
+                       if (kdata.getFunclog() != null && bitem == null) {
+                               // create board item for function
+                               DAChartBoardHeightChangeableItem functionItem = new DAChartBoardHeightChangeableItem(
+                                               kdata.getContextChart(),
+                                               KernelPageLabels.CONTEXT_SWITCH_BOARD_NAME_FUNC_CHILD);
+                               initContextSwitchChart(functionItem, false);
+
+                               DAChart functionChart = functionItem.getChart();
+                               DAChartSeries functionSeries = new DAChartSeries(
+                                               KernelPageLabels.CONTEXT_SWITCH_SERIES_NAME_CHILD, -1,
+                                               ColorResources.RED);
+                               functionChart.addSeries(functionSeries);
+
+                               functionItem.setData(kdata);
+                               kdata.setFunctionChart(functionItem);
+                       } else if (bitem != null) {
+                               // delete previous drawing items
+                               bitem.getChart().getSeries(0).clear();
+                       }
+               }
+
+               // rearrange items
+               if (rearrange) {
+                       rearrangeChart();
+               }
+
+               // get data from database and add new item to series
+               long starttime = (long) (getVisibleStartTime() * TimelineConstants.MEGA_DOUBLE);
+               long endtime = (long) (getVisibleEndTime() * TimelineConstants.MEGA_DOUBLE);
+
+               List<List<String>> contextData = dataMaker.getContextDataFromDB(
+                               starttime, endtime);
+               List<List<String>> functionData = dataMaker.getFunctionDataFromDB(
+                               starttime, endtime, -1);
+               if (contextData != null) {
+                       int csize = contextData.size();
+                       for (int i = 0; i < csize; i++) {
+                               List<String> idata = contextData.get(i);
+                               int tid = Integer.parseInt(idata
+                                               .get(KernelDataMaker.CONTEXT_DATA_COLUMN_INDEX_TID));
+                               int cpunum = Integer.parseInt(idata
+                                               .get(KernelDataMaker.CONTEXT_DATA_COLUMN_INDEX_CPU));
+                               double contextStart = (double) (Long
+                                               .parseLong(idata
+                                                               .get(KernelDataMaker.CONTEXT_DATA_COLUMN_INDEX_STARTTIME)))
+                                               / TimelineConstants.MEGA_DOUBLE;
+                               double contextEnd = (double) (Long
+                                               .parseLong(idata
+                                                               .get(KernelDataMaker.CONTEXT_DATA_COLUMN_INDEX_ENDTIME)))
+                                               / TimelineConstants.MEGA_DOUBLE;
+
+                               DAChartBoardItem coreItem = findCoreBoardItem(threads, tid);
+                               assert (coreItem != null);
+                               DAChartSeries coreSeries = coreItem.getChart().getSeries(0);
+
+                               coreSeries.addSeriesItem(new ContextSwitchingChartSeriesItem(
+                                               KernelPageLabels.CONTEXT_SWITCH_SERIES_ITEM_NAME + " "
+                                                               + Integer.toString(cpunum), contextStart,
+                                               contextEnd));
+                               // System.out.println("context(" + tid + ")(" + contextStart +
+                               // ","
+                               // + contextEnd + ")");
+                       }
+               }
+
+               if (functionData != null) {
+                       int fsize = functionData.size();
+                       for (int i = 0; i < fsize; i++) {
+                               List<String> idata = functionData.get(i);
+                               int tid = Integer.parseInt(idata
+                                               .get(KernelDataMaker.FUNCTION_DATA_COLUMN_INDEX_TID));
+                               String funcname = idata
+                                               .get(KernelDataMaker.FUNCTION_DATA_COLUMN_INDEX_FUNCNAME);
+                               double funcStart = (double) (Long
+                                               .parseLong(idata
+                                                               .get(KernelDataMaker.FUNCTION_DATA_COLUMN_INDEX_STARTTIME)))
+                                               / TimelineConstants.MEGA_DOUBLE;
+                               double funcEnd = (double) (Long
+                                               .parseLong(idata
+                                                               .get(KernelDataMaker.FUNCTION_DATA_COLUMN_INDEX_ENDTIME)))
+                                               / TimelineConstants.MEGA_DOUBLE;
+                               int type = Integer
+                                               .parseInt(idata
+                                                               .get(KernelDataMaker.FUNCTION_DATA_COLUMN_INDEX_STARTTYPE))
+                                               + Integer
+                                                               .parseInt(idata
+                                                                               .get(KernelDataMaker.FUNCTION_DATA_COLUMN_INDEX_ENDTYPE));
+
+                               DAChartBoardItem functionItem = findFunctionBoardItem(threads,
+                                               tid);
+                               assert (functionItem != null);
+                               DAChartSeries funcSeries = functionItem.getChart().getSeries(0);
+
+                               int style;
+                               switch (type) {
+                               case 21:
+                               case 31:
+                                       style = ContextSwitchingChartSeriesItem.STYLE_OCTAGON_LEFT_ONLY;
+                                       break;
+                               case 12:
+                               case 13:
+                                       style = ContextSwitchingChartSeriesItem.STYLE_OCTAGON_RIGHT_ONLY;
+                                       break;
+                               case 22:
+                               case 32:
+                               case 23:
+                               case 33:
+                                       style = ContextSwitchingChartSeriesItem.STYLE_OCTAGON;
+                                       break;
+                               case 11:
+                               default:
+                                       style = ContextSwitchingChartSeriesItem.STYLE_SQUARE;
+                                       break;
+                               }
+
+                               funcSeries.addSeriesItem(new ContextSwitchingChartSeriesItem(
+                                               funcname, funcStart, funcEnd, style));
+                       }
+               }
+
+               // redraw chart
+               redraw();
+               update();
+       }
+
+       private String getChartName(KernelDataPerThread data) {
+               String name = KernelPageLabels.CONTEXT_SWITCH_BOARD_NAME_PID + " "
+                               + data.getPid() + "\n"
+                               + KernelPageLabels.CONTEXT_SWITCH_BOARD_NAME_TID + " "
+                               + data.getTid();
+               return name;
+       }
+
+       private DAChartBoardItem findCoreBoardItem(
+                       List<KernelDataPerThread> threads, int tid) {
+               int size = threads.size();
+               for (int i = 0; i < size; i++) {
+                       if (threads.get(i).getTid() == tid)
+                               return threads.get(i).getContextChart();
+               }
+
+               return null;
+       }
+
+       private DAChartBoardItem findFunctionBoardItem(
+                       List<KernelDataPerThread> threads, int tid) {
+               int size = threads.size();
+               for (int i = 0; i < size; i++) {
+                       if (threads.get(i).getTid() == tid)
+                               return threads.get(i).getFunctionChart();
+               }
+
+               return null;
+       }
+
+       private void rearrangeChart() {
+               DAChartBoardItemList itemList = getItemList();
+               int listsize = itemList.getItemSize();
+
+               TreeMap<KernelDataPerThread, Integer> sortedmap = new TreeMap<KernelDataPerThread, Integer>(
+                               new KernelDataPerThreadComparator());
+
+               for (int i = 0; i < listsize; i++) {
+                       DAChartBoardItem item = itemList.get(i);
+                       KernelDataPerThread gdata = (KernelDataPerThread) item.getData();
+                       sortedmap.put(gdata, i);
+               }
+
+               Map.Entry<KernelDataPerThread, Integer> entry;
+               ArrayList<Integer> arranged = new ArrayList<Integer>();
+               while ((entry = sortedmap.pollFirstEntry()) != null) {
+                       arranged.add(entry.getValue());
+               }
+
+               reArrangeItem(arranged.toArray(new Integer[listsize]));
+       }
+
+       private void initContextSwitchChart(
+                       DAChartBoardHeightChangeableItem chartItem, boolean isParent) {
+               DAChart chart = chartItem.getChart();
+               if (null == chart) {
+                       return;
+               }
+
+               DAChartPlot plot = chart.getPlot();
+               if (null == plot) {
+                       return;
+               }
+
+               chartItem.useExpand(false);
+               chartItem.setHeightRatio(1);
+               chart.getPlot().setAutoHeightRange(AutoRangeType.MANUAL);
+               chart.getPlot().setShowAxis(false);
+               chart.setChartRenderer(new ContextSwitchingChartRenderer());
+
+               if (isParent) {
+                       plot.setBackgroundImage(ImageResources.BG_GRADIENT);
+               } else {
+                       plot.setBackgroundImage(ImageResources.BG_CHILD_GRADIENT);
+               }
+
+               DAChartPlotTooltip tooltip = new DAChartPlotTooltip(-1);
+               tooltip.setFont(FontResources.CHART_TOOLTIP_FONT);
+               plot.setTooltip(tooltip);
+
+               DAPopupMenu popupMenu = new DAPopupMenu(chart);
+               popupMenu.setFont(FontResources.CONTEXT_MENU_ITEM_FONT);
+
+               DAPopupMenuItem startItem = new DAPopupMenuItem(popupMenu,
+                               DAPopupMenuItem.NONE);
+               startItem.setText(TimelineChartLabels.RANGE_CONTEXT_SET_START);
+               startItem.addListener(new PopupStartMenuItemClickListener(startItem,
+                               this));
+
+               DAPopupMenuItem endItem = new DAPopupMenuItem(popupMenu,
+                               DAPopupMenuItem.NONE);
+               endItem.setText(TimelineChartLabels.RANGE_CONTEXT_SET_END);
+               endItem.addListener(new PopupEndMenuItemClickListener(endItem, this));
+
+               DAPopupMenuItem fromSelectionItem = new DAPopupMenuItem(popupMenu,
+                               DAPopupMenuItem.NONE);
+               fromSelectionItem
+                               .setText(TimelineChartLabels.RANGE_CONTEXT_SET_FROM_SELECTION);
+               fromSelectionItem
+                               .addListener(new PopupFromSelectionMenuItemClickListener(
+                                               fromSelectionItem, this));
+
+               DAPopupMenuItem analysisItem = new DAPopupMenuItem(popupMenu,
+                               DAPopupMenuItem.NONE);
+               analysisItem.setText(TimelineChartLabels.RANGE_CONTEXT_ANALYSIS);
+               analysisItem.addListener(new PopupAnalysisMenuItemClickListener());
+
+               DAPopupMenuItem clearItem = new DAPopupMenuItem(popupMenu,
+                               DAPopupMenuItem.NONE);
+               clearItem.setText(TimelineChartLabels.RANGE_CONTEXT_CLEAR);
+               clearItem.addListener(new PopupClearMenuItemClickListener());
+
+               TimelineChartMouseEventListener timelineChartMouseEventListener = new TimelineChartMouseEventListener(
+                               popupMenu, getTimeline());
+               chart.addMouseListener(timelineChartMouseEventListener);
+               chart.addMouseMoveListener(timelineChartMouseEventListener);
+               chart.addMouseTrackListener(new TimelineChartMouseTrackAdapter(
+                               getTimeline()));
+               plot.setMarkers(getMarkers());
+       }
+
+}
index b823d28..103f56a 100644 (file)
@@ -8,7 +8,7 @@ public class ContextSwitchingChartSeriesItem extends DAChartSeriesItem {
        public static final int STYLE_OCTAGON = 1;
        public static final int STYLE_OCTAGON_LEFT_ONLY = 2;
        public static final int STYLE_OCTAGON_RIGHT_ONLY = 3;
-       
+
        private String name = null;
        private int style = STYLE_SQUARE;
        private double endX = -1;
@@ -18,60 +18,69 @@ public class ContextSwitchingChartSeriesItem extends DAChartSeriesItem {
        public ContextSwitchingChartSeriesItem(String name, double x) {
                super(x, 0);
                this.name = name;
+               setTooltipText(name);
        }
 
        public ContextSwitchingChartSeriesItem(String name, double x,
                        Color borderColor) {
                this(name, x);
                this.borderColor = borderColor;
+               setTooltipText(name);
        }
 
-       public ContextSwitchingChartSeriesItem(String name, double x,
-                       int arrow, Color borderColor) {
+       public ContextSwitchingChartSeriesItem(String name, double x, int arrow,
+                       Color borderColor) {
                this(name, x, borderColor);
                this.arrow = arrow;
+               setTooltipText(name);
        }
 
-       public ContextSwitchingChartSeriesItem(String name, double x,
-                       Color color, Color borderColor) {
+       public ContextSwitchingChartSeriesItem(String name, double x, Color color,
+                       Color borderColor) {
                this(name, x, borderColor);
                this.color = color;
+               setTooltipText(name);
        }
 
-       public ContextSwitchingChartSeriesItem(String name, double x,
-                       int style) {
+       public ContextSwitchingChartSeriesItem(String name, double x, int style) {
                this(name, x);
                this.style = style;
+               setTooltipText(name);
        }
 
        public ContextSwitchingChartSeriesItem(String name, double x, double endX) {
                super(x, 0);
                this.endX = endX;
                this.name = name;
+               setTooltipText(name);
        }
 
        public ContextSwitchingChartSeriesItem(String name, double x, double endX,
                        Color borderColor) {
                this(name, x, endX);
                this.borderColor = borderColor;
+               setTooltipText(name);
        }
 
        public ContextSwitchingChartSeriesItem(String name, double x, double endX,
                        int arrow, Color borderColor) {
                this(name, x, endX, borderColor);
                this.arrow = arrow;
+               setTooltipText(name);
        }
 
        public ContextSwitchingChartSeriesItem(String name, double x, double endX,
                        Color color, Color borderColor) {
                this(name, x, endX, borderColor);
                this.color = color;
+               setTooltipText(name);
        }
 
        public ContextSwitchingChartSeriesItem(String name, double x, double endX,
                        int style) {
                this(name, x, endX);
                this.style = style;
+               setTooltipText(name);
        }
 
        public String getName() {
@@ -85,19 +94,23 @@ public class ContextSwitchingChartSeriesItem extends DAChartSeriesItem {
        public double getEndX() {
                return endX;
        }
-       
+
        public void setEndX(double endX) {
                this.endX = endX;
        }
-       
+
        public void setStyle(int style) {
                this.style = style;
        }
        
+       public void setArrow(int arr) {
+               this.arrow = arr;
+       }
+
        public int getArrow() {
                return arrow;
        }
-       
+
        public Color getBorderColor() {
                return borderColor;
        }
index 261babb..08a658f 100755 (executable)
@@ -1,10 +1,5 @@
 package org.tizen.dynamicanalyzer.ui.kernel;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.StackLayout;
 import org.eclipse.swt.layout.FillLayout;
@@ -14,22 +9,11 @@ import org.tizen.dynamicanalyzer.common.AnalyzerManager;
 import org.tizen.dynamicanalyzer.common.DASelectionData;
 import org.tizen.dynamicanalyzer.model.DAView;
 import org.tizen.dynamicanalyzer.nl.KernelPageLabels;
-import org.tizen.dynamicanalyzer.nl.TimelineChartLabels;
 import org.tizen.dynamicanalyzer.resources.ColorResources;
 import org.tizen.dynamicanalyzer.resources.FontResources;
 import org.tizen.dynamicanalyzer.resources.ImageResources;
-import org.tizen.dynamicanalyzer.ui.common.PopupAnalysisMenuItemClickListener;
-import org.tizen.dynamicanalyzer.ui.common.PopupClearMenuItemClickListener;
-import org.tizen.dynamicanalyzer.ui.common.PopupEndMenuItemClickListener;
-import org.tizen.dynamicanalyzer.ui.common.PopupFromSelectionMenuItemClickListener;
-import org.tizen.dynamicanalyzer.ui.common.PopupStartMenuItemClickListener;
 import org.tizen.dynamicanalyzer.ui.common.SetRangeMarkerMouseMoveListener;
-import org.tizen.dynamicanalyzer.ui.common.TimelineChartMouseEventListener;
-import org.tizen.dynamicanalyzer.ui.common.TimelineChartMouseTrackAdapter;
 import org.tizen.dynamicanalyzer.ui.common.UICommonConstants;
-import org.tizen.dynamicanalyzer.ui.kernel.data.KernelDataMaker;
-import org.tizen.dynamicanalyzer.ui.kernel.data.KernelDataPerThread;
-import org.tizen.dynamicanalyzer.ui.kernel.data.KernelDataPerThreadComparator;
 import org.tizen.dynamicanalyzer.ui.range.RangeDataManager;
 import org.tizen.dynamicanalyzer.ui.timeline.common.TimelineConstants;
 import org.tizen.dynamicanalyzer.ui.timeline.logparser.LifecycleLogParser;
@@ -38,20 +22,11 @@ import org.tizen.dynamicanalyzer.ui.widgets.TitleComboPopupRenderer;
 import org.tizen.dynamicanalyzer.ui.widgets.TitleComboRenderer;
 import org.tizen.dynamicanalyzer.ui.widgets.ViewContainer;
 import org.tizen.dynamicanalyzer.widgets.button.DACustomButtonRenderer;
-import org.tizen.dynamicanalyzer.widgets.chart.DAChart;
-import org.tizen.dynamicanalyzer.widgets.chart.DAChartPlot;
 import org.tizen.dynamicanalyzer.widgets.chart.DAChartPlotIntervalMarker;
-import org.tizen.dynamicanalyzer.widgets.chart.DAChartPlotTooltip;
-import org.tizen.dynamicanalyzer.widgets.chart.DAChartSeries;
-import org.tizen.dynamicanalyzer.widgets.chart.DAChartPlot.AutoRangeType;
 import org.tizen.dynamicanalyzer.widgets.chartBoard.DAChartBoard;
-import org.tizen.dynamicanalyzer.widgets.chartBoard.DAChartBoardHeightChangeableItem;
 import org.tizen.dynamicanalyzer.widgets.chartBoard.DAChartBoardItem;
-import org.tizen.dynamicanalyzer.widgets.chartBoard.DAChartBoardItemList;
 import org.tizen.dynamicanalyzer.widgets.chartBoard.DAChartBoardSelectionListener;
 import org.tizen.dynamicanalyzer.widgets.combo.DACustomCombo;
-import org.tizen.dynamicanalyzer.widgets.popupMenu.DAPopupMenu;
-import org.tizen.dynamicanalyzer.widgets.popupMenu.DAPopupMenuItem;
 import org.tizen.dynamicanalyzer.widgets.timeline.DATimeline;
 
 public class ContextSwitchingChartView extends DAView {
@@ -60,11 +35,12 @@ public class ContextSwitchingChartView extends DAView {
        public final static int KERNEL_COMBO_ITEM_HEIGHT = 24;
 
        private final Composite contents;
-       private DAChartBoard contextChart;
+       private ContextSwitchingChart contextChart;
        private DACustomCombo contextCombo;
        private final StackLayout stackLayout;
 
-       private KernelDataMaker dataMaker;
+       public static final int[] kernelScaleValue = new int[] { 100, 200, 400,
+                       800, 1600 };
 
        public ContextSwitchingChartView(Composite parent, int style) {
                super(parent, style);
@@ -79,9 +55,8 @@ public class ContextSwitchingChartView extends DAView {
                stackLayout = new StackLayout();
                contents.setLayout(stackLayout);
 
-               int[] scaleval = new int[] { 100, 200, 400, 800, 1600 };
-               contextChart = new DAChartBoard(contents,
-                               KernelPageLabels.CONTEXT_SWITCH_CHART_TITLE, scaleval);
+               contextChart = new ContextSwitchingChart(contents,
+                               KernelPageLabels.CONTEXT_SWITCH_CHART_TITLE, kernelScaleValue);
                contextChart.setNameFont(FontResources.CHART_NAME_FONT);
 
                contextChart.addSelectionListener(new DAChartBoardSelectionListener() {
@@ -102,7 +77,7 @@ public class ContextSwitchingChartView extends DAView {
                contextCombo.add(KernelPageLabels.CONTEXT_SWITCH_CHART_TITLE);
                contextCombo.select(0);
                contextCombo.setTextAlign(DACustomCombo.TEXT_ALIGN_CENTER);
-               contextCombo.setEnabled(true);
+               contextCombo.setEnabled(false);
                contextCombo.setComboRender(new TitleComboRenderer());
                contextCombo.setComboPopupRender(new TitleComboPopupRenderer());
                contextCombo.setButtonRenderer(new DACustomButtonRenderer());
@@ -120,10 +95,6 @@ public class ContextSwitchingChartView extends DAView {
                                .addMouseMoveListener(new SetRangeMarkerMouseMoveListener(
                                                RangeDataManager.getInstance(), contextChart,
                                                threadTimeline));
-
-               dataMaker = KernelDataMaker.getInstance();
-
-               clear();
        }
 
        private void handleSelection(DAChartBoardItem selectItem) {
@@ -162,137 +133,7 @@ public class ContextSwitchingChartView extends DAView {
 
        @Override
        public void updateView() {
-               List<KernelDataPerThread> threads = dataMaker.getThreadData();
-               int thread_size = threads.size();
-
-               for (int i = 0; i < thread_size; i++) {
-                       KernelDataPerThread kdata = threads.get(i);
-                       DAChartBoardItem bitem = kdata.getContextChart();
-                       if (bitem == null) {
-                               // create board item for this thread context
-                               DAChartBoardHeightChangeableItem coreItem = new DAChartBoardHeightChangeableItem(
-                                               contextChart, getChartName(kdata));
-                               initContextSwitchChart(coreItem, true);
-
-                               DAChart coreChart = coreItem.getChart();
-                               DAChartSeries coreSeries = new DAChartSeries("core", -1,
-                                               ColorResources.BLUE);
-                               coreChart.addSeries(coreSeries);
-
-                               coreItem.setData(kdata);
-                               kdata.setContextChart(coreItem);
-                       } else {
-                               // delete previous drawing items
-                               bitem.getChart().getSeries(0).clear();
-                       }
-
-                       bitem = kdata.getFunctionChart();
-                       if (kdata.getFunclog() != null && bitem == null) {
-                               // create board item for function
-                               DAChartBoardHeightChangeableItem functionItem = new DAChartBoardHeightChangeableItem(
-                                               kdata.getContextChart(), "functions");
-                               initContextSwitchChart(functionItem, false);
-
-                               DAChart functionChart = functionItem.getChart();
-                               DAChartSeries functionSeries = new DAChartSeries("function",
-                                               -1, ColorResources.RED);
-                               functionChart.addSeries(functionSeries);
-
-                               functionItem.setData(kdata);
-                               kdata.setFunctionChart(functionItem);
-                       } else if (bitem != null) {
-                               // delete previous drawing items
-                               bitem.getChart().getSeries(0).clear();
-                       }
-               }
-
-               // rearrange items
-               rearrangeChart();
-
-               // get data from database and add new item to series
-               long starttime = (long) (contextChart.getVisibleStartTime() * TimelineConstants.MEGA_DOUBLE);
-               long endtime = (long) (contextChart.getVisibleEndTime() * TimelineConstants.MEGA_DOUBLE);
-
-               List<List<String>> contextData = dataMaker.getContextDataFromDB(
-                               starttime, endtime);
-               List<List<String>> functionData = dataMaker.getFunctionDataFromDB(
-                               starttime, endtime);
-               int csize = contextData.size();
-               int fsize = functionData.size();
-
-               for (int i = 0; i < csize; i++) {
-                       List<String> idata = contextData.get(i);
-                       int tid = Integer.parseInt(idata
-                                       .get(KernelDataMaker.CONTEXT_DATA_COLUMN_INDEX_TID));
-                       int cpunum = Integer.parseInt(idata
-                                       .get(KernelDataMaker.CONTEXT_DATA_COLUMN_INDEX_CPU));
-                       double contextStart = (double) (Long.parseLong(idata
-                                       .get(KernelDataMaker.CONTEXT_DATA_COLUMN_INDEX_STARTTIME)))
-                                       / TimelineConstants.MEGA_DOUBLE;
-                       double contextEnd = (double) (Long.parseLong(idata
-                                       .get(KernelDataMaker.CONTEXT_DATA_COLUMN_INDEX_ENDTIME)))
-                                       / TimelineConstants.MEGA_DOUBLE;
-
-                       DAChartBoardItem coreItem = findCoreBoardItem(threads, tid);
-                       assert (coreItem != null);
-                       DAChartSeries coreSeries = coreItem.getChart().getSeries(0);
-
-                       coreSeries.addSeriesItem(new ContextSwitchingChartSeriesItem("core"
-                                       + cpunum, contextStart, contextEnd));
-                       System.out.println("context(" + tid + ")(" + contextStart + ","
-                                       + contextEnd + ")");
-               }
-
-               for (int i = 0; i < fsize; i++) {
-                       List<String> idata = functionData.get(i);
-                       int tid = Integer.parseInt(idata
-                                       .get(KernelDataMaker.FUNCTION_DATA_COLUMN_INDEX_TID));
-                       String funcname = idata
-                                       .get(KernelDataMaker.FUNCTION_DATA_COLUMN_INDEX_FUNCNAME);
-                       double funcStart = (double) (Long.parseLong(idata
-                                       .get(KernelDataMaker.FUNCTION_DATA_COLUMN_INDEX_STARTTIME)))
-                                       / TimelineConstants.MEGA_DOUBLE;
-                       double funcEnd = (double) (Long.parseLong(idata
-                                       .get(KernelDataMaker.FUNCTION_DATA_COLUMN_INDEX_ENDTIME)))
-                                       / TimelineConstants.MEGA_DOUBLE;
-                       int type = Integer.parseInt(idata
-                                       .get(KernelDataMaker.FUNCTION_DATA_COLUMN_INDEX_STARTTYPE))
-                                       + Integer
-                                                       .parseInt(idata
-                                                                       .get(KernelDataMaker.FUNCTION_DATA_COLUMN_INDEX_ENDTYPE));
-
-                       DAChartBoardItem functionItem = findFunctionBoardItem(threads, tid);
-                       assert (functionItem != null);
-                       DAChartSeries funcSeries = functionItem.getChart().getSeries(0);
-
-                       int style;
-                       switch (type) {
-                       case 21:
-                       case 31:
-                               style = ContextSwitchingChartSeriesItem.STYLE_OCTAGON_LEFT_ONLY;
-                               break;
-                       case 12:
-                       case 13:
-                               style = ContextSwitchingChartSeriesItem.STYLE_OCTAGON_RIGHT_ONLY;
-                               break;
-                       case 22:
-                       case 32:
-                       case 23:
-                       case 33:
-                               style = ContextSwitchingChartSeriesItem.STYLE_OCTAGON;
-                               break;
-                       case 11:
-                       default:
-                               style = ContextSwitchingChartSeriesItem.STYLE_SQUARE;
-                               break;
-                       }
-
-                       funcSeries.addSeriesItem(new ContextSwitchingChartSeriesItem(
-                                       funcname, funcStart, funcEnd, style));
-               }
-
-               // redraw chart
-               contextChart.redraw();
+               contextChart.updateChart(true);
 
                // set chart end time
                contextChart.setTotalEndTime(ToolbarArea.getInstance().getTime());
@@ -343,6 +184,7 @@ public class ContextSwitchingChartView extends DAView {
        @Override
        public void clear() {
                contextChart.clear();
+               initIntervalMarkers(contextChart);
        }
 
        @Override
@@ -350,125 +192,6 @@ public class ContextSwitchingChartView extends DAView {
                return contextChart;
        }
 
-       private DAChartBoardItem findCoreBoardItem(
-                       List<KernelDataPerThread> threads, int tid) {
-               int size = threads.size();
-               for (int i = 0; i < size; i++) {
-                       if (threads.get(i).getTid() == tid)
-                               return threads.get(i).getContextChart();
-               }
-
-               return null;
-       }
-
-       private DAChartBoardItem findFunctionBoardItem(
-                       List<KernelDataPerThread> threads, int tid) {
-               int size = threads.size();
-               for (int i = 0; i < size; i++) {
-                       if (threads.get(i).getTid() == tid)
-                               return threads.get(i).getFunctionChart();
-               }
-
-               return null;
-       }
-
-       private void initContextSwitchChart(
-                       DAChartBoardHeightChangeableItem chartItem, boolean isParent) {
-               DAChart chart = chartItem.getChart();
-               if (null == chart) {
-                       return;
-               }
-
-               DAChartPlot plot = chart.getPlot();
-               if (null == plot) {
-                       return;
-               }
-
-               chartItem.useExpand(false);
-               chartItem.setHeightRatio(0.5);
-               chart.getPlot().setAutoHeightRange(AutoRangeType.MANUAL);
-               chart.getPlot().setShowAxis(false);
-               chart.setChartRenderer(new ContextSwitchingChartRenderer());
-
-               if (isParent) {
-                       plot.setBackgroundImage(ImageResources.BG_GRADIENT);
-               } else {
-                       plot.setBackgroundImage(ImageResources.BG_CHILD_GRADIENT);
-               }
-
-               DAChartPlotTooltip tooltip = new DAChartPlotTooltip(-1);
-               tooltip.setFont(FontResources.CHART_TOOLTIP_FONT);
-               plot.setTooltip(tooltip);
-
-               DAPopupMenu popupMenu = new DAPopupMenu(chart);
-               popupMenu.setFont(FontResources.CONTEXT_MENU_ITEM_FONT);
-
-               DAPopupMenuItem startItem = new DAPopupMenuItem(popupMenu,
-                               DAPopupMenuItem.NONE);
-               startItem.setText(TimelineChartLabels.RANGE_CONTEXT_SET_START);
-               startItem.addListener(new PopupStartMenuItemClickListener(startItem,
-                               contextChart));
-
-               DAPopupMenuItem endItem = new DAPopupMenuItem(popupMenu,
-                               DAPopupMenuItem.NONE);
-               endItem.setText(TimelineChartLabels.RANGE_CONTEXT_SET_END);
-               endItem.addListener(new PopupEndMenuItemClickListener(endItem,
-                               contextChart));
-
-               DAPopupMenuItem fromSelectionItem = new DAPopupMenuItem(popupMenu,
-                               DAPopupMenuItem.NONE);
-               fromSelectionItem
-                               .setText(TimelineChartLabels.RANGE_CONTEXT_SET_FROM_SELECTION);
-               fromSelectionItem
-                               .addListener(new PopupFromSelectionMenuItemClickListener(
-                                               fromSelectionItem, contextChart));
-
-               DAPopupMenuItem analysisItem = new DAPopupMenuItem(popupMenu,
-                               DAPopupMenuItem.NONE);
-               analysisItem.setText(TimelineChartLabels.RANGE_CONTEXT_ANALYSIS);
-               analysisItem.addListener(new PopupAnalysisMenuItemClickListener());
-
-               DAPopupMenuItem clearItem = new DAPopupMenuItem(popupMenu,
-                               DAPopupMenuItem.NONE);
-               clearItem.setText(TimelineChartLabels.RANGE_CONTEXT_CLEAR);
-               clearItem.addListener(new PopupClearMenuItemClickListener());
-
-               TimelineChartMouseEventListener timelineChartMouseEventListener = new TimelineChartMouseEventListener(
-                               popupMenu, contextChart.getTimeline());
-               chart.addMouseListener(timelineChartMouseEventListener);
-               chart.addMouseMoveListener(timelineChartMouseEventListener);
-               chart.addMouseTrackListener(new TimelineChartMouseTrackAdapter(
-                               contextChart.getTimeline()));
-               plot.setMarkers(contextChart.getMarkers());
-       }
-
-       private String getChartName(KernelDataPerThread data) {
-               String name = "Pid : " + data.getPid() + "\nTid : " + data.getTid();
-               return name;
-       }
-
-       private void rearrangeChart() {
-               DAChartBoardItemList itemList = contextChart.getItemList();
-               int listsize = itemList.getItemSize();
-
-               TreeMap<KernelDataPerThread, Integer> sortedmap = new TreeMap<KernelDataPerThread, Integer>(
-                               new KernelDataPerThreadComparator());
-
-               for (int i = 0; i < listsize; i++) {
-                       DAChartBoardItem item = itemList.get(i);
-                       KernelDataPerThread gdata = (KernelDataPerThread) item.getData();
-                       sortedmap.put(gdata, i);
-               }
-
-               Map.Entry<KernelDataPerThread, Integer> entry;
-               ArrayList<Integer> arranged = new ArrayList<Integer>();
-               while ((entry = sortedmap.pollFirstEntry()) != null) {
-                       arranged.add(entry.getValue());
-               }
-
-               contextChart.reArrangeItem(arranged.toArray(new Integer[0]));
-       }
-
        private void initIntervalMarkers(DAChartBoard board) {
                // selection marker
                DAChartPlotIntervalMarker selectionMarker = new DAChartPlotIntervalMarker(
index b9c3ca0..db36517 100644 (file)
@@ -1,62 +1,70 @@
 package org.tizen.dynamicanalyzer.ui.kernel;
 
+import java.awt.image.Kernel;
+
+import org.eclipse.nebula.widgets.grid.Grid;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.FillLayout;
 import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
 import org.tizen.dynamicanalyzer.common.AnalyzerConstants;
+import org.tizen.dynamicanalyzer.common.AnalyzerManager;
+import org.tizen.dynamicanalyzer.common.CommonConstants;
+import org.tizen.dynamicanalyzer.common.DASelectionData;
 import org.tizen.dynamicanalyzer.model.DAView;
 import org.tizen.dynamicanalyzer.nl.KernelPageLabels;
 import org.tizen.dynamicanalyzer.resources.ColorResources;
+import org.tizen.dynamicanalyzer.swap.model.data.LogData;
+import org.tizen.dynamicanalyzer.ui.network.NetworkApiListView;
+import org.tizen.dynamicanalyzer.ui.network.NetworkChartData;
+import org.tizen.dynamicanalyzer.ui.network.NetworkChartManager;
+import org.tizen.dynamicanalyzer.ui.range.RangeDataManager;
+import org.tizen.dynamicanalyzer.ui.toolbar.ToolbarArea;
 import org.tizen.dynamicanalyzer.ui.widgets.ViewContainer;
 import org.tizen.dynamicanalyzer.ui.widgets.table.TableColumnSizePackListener;
 
 public class KernelListView extends DAView {
        public static final String ID = KernelListView.class.getName();
-       
+
+       private long analysisStartTime = 0;
+       private long analysisEndTime = 0;
+
        int[] innerMaxWeight = { 0, 100 };
        int[] outerMaxWeight = { 100, 0 };
-       
-//     private String[] columnNames = {
-//                     KernelPageLabels.NETWORK_API_LIST_VIEW_INDEX,
-//                     KernelPageLabels.NETWORK_API_LIST_VIEW_START_TIME,
-//                     KernelPageLabels.NETWORK_API_LIST_VIEW_END_TIME,
-//                     KernelPageLabels.NETWORK_API_LIST_VIEW_PID,
-//                     KernelPageLabels.NETWORK_API_LIST_VIEW_API,
-//                     KernelPageLabels.NETWORK_API_LIST_VIEW_OBJECT,
-//                     KernelPageLabels.NETWORK_API_LIST_VIEW_PARAMETER,
-//                     KernelPageLabels.NETWORK_API_LIST_VIEW_THREAD_ID,
-//                     KernelPageLabels.NETWORK_API_LIST_VIEW_RETURN,
-//                     KernelPageLabels.NETWORK_API_LIST_VIEW_BYTE_SIZE,
-//                     KernelPageLabels.NETWORK_API_LIST_VIEW_MESSAGE,
-//                     KernelPageLabels.NETWORK_API_LIST_VIEW_ERRNO };
-//
-//     private int[] columnSizes = { 40, 70, 70, 70, 120, 90, 70, 70, 100, 70,
-//                     100, 100 };
-//     private int[] columnAlignment = { SWT.RIGHT, SWT.LEFT, SWT.LEFT, SWT.LEFT,
-//                     SWT.LEFT, SWT.LEFT, SWT.LEFT, SWT.LEFT, SWT.LEFT, SWT.LEFT,
-//                     SWT.LEFT, SWT.LEFT };
-//
-//     int[] sortTypes = { AnalyzerConstants.SORT_TYPE_NUM,
-//                     AnalyzerConstants.SORT_TYPE_NUM, AnalyzerConstants.SORT_TYPE_NUM,
-//                     AnalyzerConstants.SORT_TYPE_NUM,
-//                     AnalyzerConstants.SORT_TYPE_STRING,
-//                     AnalyzerConstants.SORT_TYPE_STRING,
-//                     AnalyzerConstants.SORT_TYPE_STRING,
-//                     AnalyzerConstants.SORT_TYPE_NUM,
-//                     AnalyzerConstants.SORT_TYPE_STRING,
-//                     AnalyzerConstants.SORT_TYPE_STRING,
-//                     AnalyzerConstants.SORT_TYPE_STRING,
-//                     AnalyzerConstants.SORT_TYPE_STRING };
-       
+
+       private String[] columnNames = { KernelPageLabels.KERNEL_LIST_VIEW_INDEX,
+                       KernelPageLabels.KERNEL_LIST_VIEW_PID,
+                       KernelPageLabels.KERNEL_LIST_VIEW_TID,
+                       KernelPageLabels.KERNEL_LIST_VIEW_CORE,
+                       KernelPageLabels.KERNEL_LIST_VIEW_START_TIME,
+                       KernelPageLabels.KERNEL_LIST_VIEW_END_TIME,
+                       KernelPageLabels.KERNEL_LIST_VIEW_EXECUTION_TIME,
+                       KernelPageLabels.KERNEL_LIST_VIEW_START_PC,
+                       KernelPageLabels.KERNEL_LIST_VIEW_END_PC,
+                       KernelPageLabels.KERNEL_LIST_VIEW_FUNCTION };
+
+       private int[] columnSizes = { 40, 40, 40, 40, 90, 90, 90, 120, 120, 250 };
+
+       private int[] columnAlignment = { SWT.RIGHT, SWT.LEFT, SWT.LEFT, SWT.LEFT,
+                       SWT.LEFT, SWT.LEFT, SWT.LEFT, SWT.LEFT, SWT.LEFT, SWT.LEFT };
+
+       int[] sortTypes = { AnalyzerConstants.SORT_TYPE_NUM,
+                       AnalyzerConstants.SORT_TYPE_NUM, AnalyzerConstants.SORT_TYPE_NUM,
+                       AnalyzerConstants.SORT_TYPE_NUM, AnalyzerConstants.SORT_TYPE_NUM,
+                       AnalyzerConstants.SORT_TYPE_NUM, AnalyzerConstants.SORT_TYPE_NUM,
+                       AnalyzerConstants.SORT_TYPE_NUM, AnalyzerConstants.SORT_TYPE_NUM,
+                       AnalyzerConstants.SORT_TYPE_STRING };
+
        KernelListTable tableComp = null;
 
        public KernelListView(Composite parent, int style) {
                super(parent, style);
+               name = KernelPageLabels.KERNEL_LIST_VIEW_NAME;
                this.setLayout(new FillLayout());
 
                ViewContainer viewContainer = new ViewContainer(this, true);
                viewContainer
-                               .setTitleText(KernelPageLabels.THREAD_LIST_VIEW_THREAD_TITLE);
+                               .setTitleText(KernelPageLabels.KERNEL_LIST_VIEW_TITLE_CORE);
                setMaxWeight(innerMaxWeight, outerMaxWeight);
 
                Composite contents = viewContainer.getContentArea();
@@ -64,14 +72,132 @@ public class KernelListView extends DAView {
                contents.setLayout(new FillLayout());
                tableComp = new KernelListTable(contents, SWT.NONE, SWT.MULTI
                                | SWT.BORDER | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL);
-//             tableComp.setSortTypes(sortTypes);
-//             tableComp.setFailedAPITableIndex(12);
-//             tableComp.setColumnAlignment(columnAlignment);
-//             tableComp.setColumns(columnNames);
-//             tableComp.setColumnSize(columnSizes);
-               tableComp.setTableName(KernelPageLabels.THREAD_LIST_VIEW_THREAD_TITLE);
-//             contents.addControlListener(new TableColumnSizePackListener(tableComp,
-//                             columnSizes));
+               tableComp.setSortTypes(sortTypes);
+               tableComp.setColumnAlignment(columnAlignment);
+               tableComp.setColumns(columnNames);
+               tableComp.setColumnSize(columnSizes);
+               tableComp.setTableName(KernelPageLabels.KERNEL_LIST_VIEW_TITLE_CORE);
+               contents.addControlListener(new TableColumnSizePackListener(tableComp,
+                               columnSizes));
+       }
+/*
+       @Override
+       public void updateView() {
+               if (null == data) {
+                       return;
+               }
+
+               long newAnalysisStartTime = 0;
+               long newAnalysisEndTime = 0;
+
+               if (RangeDataManager.getInstance().isBeingAnalyzed()) {
+                       newAnalysisStartTime = RangeDataManager.getInstance()
+                                       .getAnalysisStartTime();
+                       newAnalysisEndTime = RangeDataManager.getInstance()
+                                       .getAnalysisEndTime();
+               } else {
+                       newAnalysisStartTime = 0;
+                       newAnalysisEndTime = 0;
+               }
+
+               if (newAnalysisStartTime != analysisStartTime
+                               || newAnalysisEndTime != analysisEndTime) {
+                       analysisStartTime = newAnalysisStartTime;
+                       analysisEndTime = newAnalysisEndTime;
+                       tableComp.updateTable();
+                       return;
+               }
+
+               int selectedPid = ToolbarArea.getInstance().getSelectedPid();
+               if (preSelectionPId != -1 && preSelectionPId != selectedPid) {
+                       tableComp.updateTable();
+               }
+               preSelectionPId = selectedPid;
+
+               if (tableComp.getTable().getItemCount() > 0
+                               && data.getContents().size() != tableComp.getTable()
+                                               .getItemCount()) {
+                       tableComp.updateTable();
+               }
+
+       }
+
+       @Override
+       public void updateView(DASelectionData data) {
+               NetworkChartManager.getInstance().setPacketMessage(
+                               CommonConstants.EMPTY);
+               NetworkChartManager.getInstance().setSendAckTime(
+                               CommonConstants.EMPTY);
+               NetworkChartData pageData = (NetworkChartData) data.getData();
+
+               if (!(pageData instanceof NetworkChartData)) {
+                       selectionStartTime = data.getStartTime();
+                       selectionEndTime = data.getEndTime();
+               } else {
+                       this.data = pageData;
+               }
+               tableComp.getTable().removeAll();
+               tableComp.updateTable();
+               tableComp.setSelectionByTime(selectionStartTime, selectionEndTime);
+
+       }
+
+       @Override
+       public void setSelection(LogData data) {
+               if (null == data) {
+                       return;
+               }
+               int seq = data.getSeq();
+               tableComp.updateTable();
+               int nSize = tableComp.getTable().getItemCount();
+               for (int ii = 0; ii < nSize; ii++) {
+                       if (tableComp.getTable().getItem(ii).getText(0)
+                                       .equals(Integer.toString(seq))) {
+                               tableComp.getTable().setSelection(ii);
+                               tableComp
+                                               .getTable()
+                                               .getVerticalBar()
+                                               .setSelection(
+                                                               getScrollSelectionIndex(tableComp.getTable(),
+                                                                               ii));
+                               tableComp.updateTable();
+                       }
+               }
+               long selectedTime = data.getTime();
+               DASelectionData selData = new DASelectionData(NetworkApiListView.ID,
+                               selectedTime, selectedTime,
+                               tableComp.getTable().getSelection(), tableComp.getTable());
+               AnalyzerManager.getCurrentPage().updatePage(selData);
+       }
+
+       private int getScrollSelectionIndex(Grid table, int selection) {
+               int size = table.getVerticalBar().getThumb() / 2;
+               int output = selection - size;
+               output = (output < 0) ? 0 : output;
+               return output;
+       }
+
+       @Override
+       public Control getControl() {
+               return tableComp;
+       }
+
+       @Override
+       public void clear() {
+               tableComp.getTable().removeAll();
+               data = null;
+       }
+
+       public NetworkChartData getPageData() {
+               return data;
+       }
+
+       public long getRangeStartTime() {
+               return analysisStartTime;
        }
 
+       public long getRangeEndTime() {
+               return analysisEndTime;
+       }
+*/
 }
index 22053e6..c0dcf7a 100755 (executable)
@@ -37,10 +37,10 @@ public class KernelPage extends DAPageComposite {
                ContextSwitchingChartView kernelChartView = new ContextSwitchingChartView(leftForm,
                                SWT.NONE);
                addView(kernelChartView);
-               DATabComposite lefttabView = new DATabComposite(leftForm, SWT.NONE);
+               CallFlowTabComposite lefttabView = new CallFlowTabComposite(leftForm, SWT.NONE);
                addView(lefttabView);
                {
-                       CallFlowView callflowView = new CallFlowView(
+                       CallFlowChartView callflowView = new CallFlowChartView(
                                        lefttabView.getContentComposite(), SWT.NONE);
                        lefttabView.addView(callflowView, false);
 
index 4014845..9b1cabe 100755 (executable)
@@ -85,12 +85,12 @@ public class KernelDataMaker {
                int size = inputs.size();
                for (int i = 0; i < size; i++) {
                        LogData input = (LogData) inputs.get(i);
-
+                       
                        switch (input.getId()) {
-                       case DataChannelConstants.MSG_CONTEXT_SWITCH_ENTRY: {
+                       case DataChannelConstants.MSG_CONTEXT_SWITCH_EXIT: {
                                ContextSwitchData csdata = (ContextSwitchData) input;
                                int tid = csdata.getTid();
-
+                               
                                KernelDataPerThread kdata = findKernelData(tid);
                                if (kdata == null) { // thread id is not exist in thread id
                                        kdata = new KernelDataPerThread(csdata.getPid(), tid,
@@ -120,11 +120,11 @@ public class KernelDataMaker {
                                }
                                break;
                        }
-                       case DataChannelConstants.MSG_CONTEXT_SWITCH_EXIT: {
+                       case DataChannelConstants.MSG_CONTEXT_SWITCH_ENTRY: {
                                ContextSwitchData csdata = (ContextSwitchData) input;
                                ContextSwitchData precore;
                                int tid = csdata.getTid();
-
+                               
                                KernelDataPerThread kdata = findKernelData(tid);
                                if (kdata == null) { // thread id is not exist
                                        // TODO : error
@@ -325,15 +325,21 @@ public class KernelDataMaker {
                return queriedContextData;
        }
 
-       public List<List<String>> getFunctionDataFromDB(long start, long end) {
+       public List<List<String>> getFunctionDataFromDB(long start, long end,
+                       int tid) {
                DBTableManager dbManager = DBTableManager.getInstance();
                DBTableInfo fnTable = dbManager
                                .getTableInfo(DBTableManager.TABLE_INDEX_FUNCTION_CALL_DATA);
                SqlManager sql = SqlManager.getInstance();
 
-               String where = "where " + DBTableManager.CUSTOM_COLUMN_START_TIME
-                               + " < " + end + " and " + DBTableManager.CUSTOM_COLUMN_END_TIME
-                               + " > " + start + " order by "
+               String where = "where ";
+               if (tid >= 0) {
+                       where = where + DBTableManager.COMMON_COLUMN_TID + " = " + tid
+                                       + " and ";
+               }
+               where = where + DBTableManager.CUSTOM_COLUMN_START_TIME + " < " + end
+                               + " and " + DBTableManager.CUSTOM_COLUMN_END_TIME + " > "
+                               + start + " order by "
                                + DBTableManager.CUSTOM_COLUMN_START_TIME;
 
                String[] fnColumns = fnTable.getColumnNames();
index e3e05bc..6d6f987 100644 (file)
@@ -18,12 +18,12 @@ public class KernelDataManager implements Runnable {
        private Thread updateLogThread = null;
        private KernelBlockingQueue<LogPackage> logPackQueue = null;
        private KernelDataMaker kdataMaker = null;
-
+       
        public KernelDataManager() {
                logPackQueue = new KernelBlockingQueue<LogPackage>();
                kdataMaker = KernelDataMaker.getInstance();
        }
-
+       
        public synchronized static KernelDataManager getInstance() {
                if (null == instance) {
                        instance = new KernelDataManager();
@@ -148,7 +148,7 @@ public class KernelDataManager implements Runnable {
                        default:
                                break;
                        }
-
+                       
                        kernelLogs.add(top);
                } while (true);
 
index 50bf53f..1ed4006 100755 (executable)
@@ -80,9 +80,9 @@ public class BaseView extends ViewPart {
                                        SWT.NONE);
                        tabView.addView(uiPage, false);
 
-//                     Composite kernelPage = new KernelPage(
-//                                     tabView.getContentComposite(), SWT.NONE);
-//                     tabView.addView(kernelPage, false);
+                       Composite kernelPage = new KernelPage(
+                                       tabView.getContentComposite(), SWT.NONE);
+                       tabView.addView(kernelPage, false);
 
                        Composite summaryPage = new SummaryPage(
                                        tabView.getContentComposite(), SWT.NONE);