From 66dfef0595627f9512616acbe61b9d6e5c35524f Mon Sep 17 00:00:00 2001 From: "ggh1933.go" Date: Mon, 9 May 2016 13:28:04 +0900 Subject: [PATCH] [SRADA-467] Add DlogTable on TimeLinePage - recommit - Add Time Sync with DA and Dlog function. - Modified Dlog regex patterns and parsing. - modified Columns "Time" "Level" "Pid" "Tid" "Tag" "Message" like SDK-IDE - modified DlogData Class, because changed Columns. - Dlog Time changed to DA timeformat, Start "0" from StartTraceTime. - Dlog Shell Command Changed ("dlogutil -v threadtime ") - Executing Dlog clear command ("dlogutil -c")before StartDlog - patch : modified regex pattern for fixing all dlog format support. - patch : Dlog tab composite appear, After TraceStop - patch : ready to timesync by dlog "swap_start"(need to modified swap dlog) - patch : popup DlogView deleted, Add updateView when StopTrace - patch : Add TimeLine marker for DlogView - patch : filtering DlogView ( incompleted ) - recommit : because Latest is changed, it's re commited. (before commit abandon) - patch : Don't use get Time, changing get Device Time by shellCommand (sdb shell date) Change-Id: I03026368011cc588b24264203535c3f2e933a858 --- .../dynamicanalyzer/control/StartTraceManager.java | 6 +- .../dynamicanalyzer/control/StopTraceManager.java | 18 ++-- .../ui/timeline/common/TimelineTableView.java | 7 +- .../ui/timeline/dlog/DADlogData.java | 31 +++++- .../ui/timeline/dlog/DADlogReceiver.java | 92 +++++++++++++--- .../ui/timeline/dlog/DlogTable.java | 120 ++++++++++++++++----- .../dynamicanalyzer/ui/timeline/dlog/DlogView.java | 16 --- 7 files changed, 221 insertions(+), 69 deletions(-) mode change 100644 => 100755 org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/common/TimelineTableView.java diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/control/StartTraceManager.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/control/StartTraceManager.java index d25af13..74fbb87 100755 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/control/StartTraceManager.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/control/StartTraceManager.java @@ -115,6 +115,7 @@ public class StartTraceManager implements Runnable { public void run() { Toolbar.INSTANCE.startTimer(); UpdateViewTimer.start(); + startDlog(); } }; @@ -404,9 +405,7 @@ public class StartTraceManager implements Runnable { throw new InterruptedException(); } } - - // Start DlogReceiver - /* + private void startDlog(){ Thread DlogThread = new Thread(new Runnable() { public void run() { @@ -416,5 +415,4 @@ public class StartTraceManager implements Runnable { }); DlogThread.start(); } - */ } diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/control/StopTraceManager.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/control/StopTraceManager.java index f86083e..bd8a020 100755 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/control/StopTraceManager.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/control/StopTraceManager.java @@ -46,10 +46,12 @@ import org.tizen.dynamicanalyzer.swap.logparser.LogParser; import org.tizen.dynamicanalyzer.swap.logparser.MessageParser; import org.tizen.dynamicanalyzer.ui.info.callstack.CallStackInserter; import org.tizen.dynamicanalyzer.ui.info.screenshot.ScreenshotTimer; +import org.tizen.dynamicanalyzer.ui.page.BaseView; import org.tizen.dynamicanalyzer.ui.page.UpdateViewTimer; import org.tizen.dynamicanalyzer.ui.timeline.dlog.DADlogReceiver; import org.tizen.dynamicanalyzer.ui.toolbar.Toolbar; import org.tizen.dynamicanalyzer.util.Logger; +import org.tizen.dynamicanalyzer.util.WorkbenchUtil; import org.tizen.dynamicanalyzer.widgets.da.base.ProgressDialog; public class StopTraceManager implements Runnable { @@ -58,10 +60,7 @@ public class StopTraceManager implements Runnable { private DAResult error; private boolean stopFromTarget = false; private Boolean stopThreadCompleted = false; - - // Dlog Receiver Class - //private DADlogReceiver dlogRecv = new DADlogReceiver(); - + private DADlogReceiver dlogRecv = new DADlogReceiver(); public StopTraceManager(DAResult err, boolean stopFromTarget) { this.error = err; this.stopFromTarget = stopFromTarget; @@ -159,9 +158,14 @@ public class StopTraceManager implements Runnable { // change summary UI // change to summary page UIAction.applyStopTraceUI(); - - // Dlog Stop - // dlogRecv.stopDlog(); + dlogRecv.stopDlog(); + Display.getDefault().syncExec(new Runnable() { + @Override + public void run() { + BaseView baseView = (BaseView) WorkbenchUtil.getViewPart(BaseView.ID); + baseView.getTopComposite().updateView(); + } + }); } catch (InterruptedException e) { // canceled stop tracing diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/common/TimelineTableView.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/common/TimelineTableView.java old mode 100644 new mode 100755 index 14beecd..b771b7a --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/common/TimelineTableView.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/common/TimelineTableView.java @@ -34,6 +34,7 @@ import org.tizen.dynamicanalyzer.ui.info.callstack.CallstackView; import org.tizen.dynamicanalyzer.ui.info.screenshot.ImageViewer; import org.tizen.dynamicanalyzer.ui.info.screenshot.ScreenshotView; import org.tizen.dynamicanalyzer.ui.timeline.calltrace.CallTraceView; +import org.tizen.dynamicanalyzer.ui.timeline.dlog.DlogView; import org.tizen.dynamicanalyzer.widgets.da.view.DATabComposite; public class TimelineTableView extends DATabComposite { @@ -55,9 +56,9 @@ public class TimelineTableView extends DATabComposite { super(parent, style, false); this.enableImageTab(true); -// DlogView dlogView = new DlogView(getContentComposite(), -// SWT.NONE); -// addView(dlogView); + DlogView dlogView = new DlogView(getContentComposite(), + SWT.NONE); + addView(dlogView); CallTraceView callTraceView = new CallTraceView(getContentComposite(), SWT.NONE); diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/dlog/DADlogData.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/dlog/DADlogData.java index 43d2f24..85bfb17 100755 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/dlog/DADlogData.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/dlog/DADlogData.java @@ -1,12 +1,35 @@ package org.tizen.dynamicanalyzer.ui.timeline.dlog; +import java.util.Date; import java.util.List; public class DADlogData { + + private Date syncTime; + private String time; - private String tag; private String pid; + private String tid; + private String level; + private String tag; private String message; + + public String getLevel() { + return level; + } + + public void setLevel(String level) { + this.level = level; + } + + public String getTid() { + return tid; + } + + public void setTid(String tid) { + this.tid = tid; + } + public String getTag() { return tag; } @@ -31,4 +54,10 @@ public class DADlogData { public void setTime(String time) { this.time = time; } + public Date getSyncTime() { + return syncTime; + } + public void setSyncTime(Date time) { + this.syncTime = time; + } } \ No newline at end of file diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/dlog/DADlogReceiver.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/dlog/DADlogReceiver.java index fe0e02c..0677b60 100755 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/dlog/DADlogReceiver.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/dlog/DADlogReceiver.java @@ -1,14 +1,22 @@ package org.tizen.dynamicanalyzer.ui.timeline.dlog; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; import java.util.ArrayList; -import java.util.HashMap; +import java.util.Calendar; +import java.util.Date; import java.util.List; -import java.util.Map; import java.util.regex.Pattern; +import org.eclipse.swt.widgets.Display; import org.tizen.dynamicanalyzer.common.Global; import org.tizen.dynamicanalyzer.communicator.CommunicatorUtils; import org.tizen.dynamicanalyzer.communicator.DeviceInfo; +import org.tizen.dynamicanalyzer.ui.timeline.TimelinePage; +import org.tizen.dynamicanalyzer.ui.timeline.common.TimelineChartView; +import org.tizen.dynamicanalyzer.ui.timeline.common.TimelineTableView; +import org.tizen.dynamicanalyzer.utils.AnalyzerUtil; import org.tizen.sdblib.receiver.MultiLineReceiver; import org.tizen.sdblib.util.StringUtil; @@ -16,29 +24,57 @@ public class DADlogReceiver { static List Dlogs = new ArrayList(); + private static final Pattern pattern = Pattern.compile("\\d{2}-\\d{2}\\s(\\d{2}:\\d{2}:\\d{2}\\.?\\d*)\\+?\\d*\\s+" //time - + "(V|D|I|W|E|F)/.*\\(\\s?" //tag - + "(\\d+)\\):\\s" //pid + + "(\\d+)\\s+" //pid + + "(\\d+)\\s+" //tid + + "(V|D|I|W|E|F)\\s+" //level + + "(\\S+)\\s*\\:\\s+" //tag + "(.*)"); //message + static boolean start = false; static boolean dlogKill = false; - + static String[] daStartTime = null; public DADlogReceiver() { // TODO Auto-generated constructor stub } public boolean startDlog(){ + Pattern timeregex = Pattern.compile("\\S+\\s+" //day + + "\\S+\\s+" //month + + "\\d+\\s+" //date + + "(\\d{2}\\:\\d{2}\\:\\d{2})\\s+" //hour:min:sec + + ".*"); //year + + DeviceInfo curDev = Global.getCurrentDeviceInfo(); + Dlogs.clear(); dlogKill = false; - DeviceInfo curDev = Global.getCurrentDeviceInfo(); + if (curDev == null) { return false; } CommunicatorUtils.execShellCommand(curDev.getIDevice(), - "/usr/bin/dlogutil -v time", new MultiLineReceiver() { + "date", new MultiLineReceiver() { + @Override + public void processNewLines(String[] appLines) { + for (int i = 0; i < appLines.length; i++) { + daStartTime = appLines; + } + } + }); + + String[] TmpdaStartTime = daStartTime; + daStartTime = StringUtil.split(TmpdaStartTime[0], timeregex); + + CommunicatorUtils.execShellCommand(curDev.getIDevice(), + "/usr/bin/dlogutil -c"); + + CommunicatorUtils.execShellCommand(curDev.getIDevice(), + "/usr/bin/dlogutil -v threadtime", new MultiLineReceiver() { @Override public void processNewLines(String[] appLines) { start = true; @@ -46,6 +82,11 @@ public class DADlogReceiver { if(dlogKill){ break; } + /* Dlog don't show swap_start always... + if(appLines[i].contains("swap_start")){ + daStartTime = StringUtil.split(appLines[i], StartTimepattern); + } + */ Dlogs.add(appLines[i]); //System.out.println(appLines[i]); } @@ -72,13 +113,38 @@ public class DADlogReceiver { String[] matches = StringUtil.split(Dlogs.get(i), pattern); if(matches == null) continue; DADlogData dlogData = new DADlogData(); - dlogData.setTime(matches[0]); - dlogData.setTag(matches[1]); - dlogData.setPid(matches[2]); - dlogData.setMessage(matches[3]); - dlogList.add(dlogData); + + + DateFormat formatter = new SimpleDateFormat("hh:mm:ss.SSS"); + DateFormat formatter2 = new SimpleDateFormat("hh:mm:ss"); + try { + Date date = formatter.parse(matches[0]); + Date DAdate = formatter2.parse(daStartTime[0]); + dlogData.setSyncTime(DAdate); + + int compare = date.compareTo(DAdate); + + if(compare < 0){ + continue; + } + else{ + long diffTime = date.getTime()*1000 - DAdate.getTime()*1000; + + //dlogData.setTime(matches[0]); + dlogData.setTime(Long.toString(diffTime)); + dlogData.setPid(matches[1]); + dlogData.setTid(matches[2]); + dlogData.setLevel(matches[3]); + dlogData.setTag(matches[4]); + dlogData.setMessage(matches[5]); + dlogList.add(dlogData); + } + + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } } - return dlogList; } diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/dlog/DlogTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/dlog/DlogTable.java index 6e5b732..4299490 100755 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/dlog/DlogTable.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/dlog/DlogTable.java @@ -4,43 +4,47 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import org.eclipse.nebula.widgets.grid.Grid; import org.eclipse.nebula.widgets.grid.GridItem; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Composite; import org.tizen.dynamicanalyzer.common.AnalyzerConstants; -import org.tizen.dynamicanalyzer.common.AnalyzerManager; -import org.tizen.dynamicanalyzer.common.DASelectionData; import org.tizen.dynamicanalyzer.model.TableInput; -import org.tizen.dynamicanalyzer.ui.timeline.calltrace.FunctionEntryDBTable; -import org.tizen.dynamicanalyzer.ui.timeline.common.TimelineTableView; +import org.tizen.dynamicanalyzer.ui.common.UICommonConstants; +import org.tizen.dynamicanalyzer.ui.timeline.TimelinePage; +import org.tizen.dynamicanalyzer.ui.timeline.common.TimelineChartView; +import org.tizen.dynamicanalyzer.ui.timeline.common.TimelineConstants; import org.tizen.dynamicanalyzer.ui.widgets.table.DATableComposite; import org.tizen.dynamicanalyzer.ui.widgets.table.DATableDataFormat; -import org.tizen.dynamicanalyzer.ui.widgets.table.DAWindowingTableComposite; import org.tizen.dynamicanalyzer.ui.widgets.table.DefaultTableComparator; -import org.tizen.dynamicanalyzer.ui.widgets.table.WindowingTableColumnSizePackListener; -import org.tizen.dynamicanalyzer.widgets.da.view.DAViewData; -import org.tizen.sdblib.receiver.DlogReceiver; +import org.tizen.dynamicanalyzer.utils.AnalyzerUtil; +import org.tizen.dynamicanalyzer.utils.Formatter; +import org.tizen.dynamicanalyzer.widgets.chart.DAChartPlotIntervalMarker; +import org.tizen.dynamicanalyzer.widgets.chartBoard.DAChartBoard; public class DlogTable extends DATableComposite { - private String[] columnNames = {"Date & Time", "LogLevel", "Pid", "Message" }; - private String[] initcolumnNames = {"", "", "", "[After StopTrace, Show Dlogs]" }; - private int[] columnSizes = { 200, 100, 100, 1200}; - private int[] columnAlignment = { SWT.LEFT, SWT.LEFT, SWT.LEFT, SWT.LEFT }; - private boolean[] columnVisibility = { true, true, true, true }; - private int[] sortTypes = { AnalyzerConstants.SORT_TYPE_NONE, AnalyzerConstants.SORT_TYPE_NONE, - AnalyzerConstants.SORT_TYPE_NONE,AnalyzerConstants.SORT_TYPE_NONE }; + private String[] columnNames = {"Time", "Level", "Pid", "Tid", "Tag", "Message" }; //6col + private int[] columnSizes = { 80, 80, 80, 80, 300, 1200}; + private int[] columnAlignment = { SWT.LEFT, SWT.LEFT, SWT.LEFT, SWT.LEFT, SWT.LEFT, SWT.LEFT }; + private boolean[] columnVisibility = { true, true, true, true, true, true }; + private int[] sortTypes = { AnalyzerConstants.SORT_TYPE_NONE, AnalyzerConstants.SORT_TYPE_STRING, AnalyzerConstants.SORT_TYPE_NONE, + AnalyzerConstants.SORT_TYPE_NONE,AnalyzerConstants.SORT_TYPE_STRING, AnalyzerConstants.SORT_TYPE_NONE }; private DADlogReceiver dlogRecv = new DADlogReceiver(); + private List tableClone = new ArrayList(); + private static boolean isFilter = false; + private static List dlogfilteredData = new ArrayList(); public DlogTable(Composite parent, int compStyle, int tableStyle) { // TODO Auto-generated constructor stub super(parent, compStyle, tableStyle); setSortTypes(sortTypes); - setColumns(initcolumnNames); + setColumns(columnNames); setColumnSize(columnSizes); setColumnVisibility(columnVisibility); setColumnAlignment(columnAlignment); @@ -48,22 +52,43 @@ public class DlogTable extends DATableComposite { //setDataType(FunctionEntryDBTable.COLUMN.START_TIME.index); //setContextMenu(AnalyzerConstants.CONTEXT_TABLE_RANGE); + + table.addSelectionListener(new SelectionListener() { + + @Override + public void widgetSelected(SelectionEvent e) { + GridItem[] ti = ((Grid) e.widget).getSelection(); + if (null == ti || ti.length == 0) { + return; + } + int size = ti.length; + List startData = ((DATableDataFormat) ti[0].getData()).getData(); + List endData = ((DATableDataFormat) ti[size - 1].getData()).getData(); + long startTime = (Long) Long.parseLong((String) startData.get(0)); + long endTime = (Long) Long.parseLong((String) endData.get(0)); + DlogTimeMarker(startTime, endTime); + } + + @Override + public void widgetDefaultSelected(SelectionEvent e) { + } + }); } @Override protected List makeTableInput() { - table.getColumn(0).setText(columnNames[0]); - table.getColumn(1).setText(columnNames[1]); - table.getColumn(2).setText(columnNames[2]); - table.getColumn(3).setText(columnNames[3]); List output = new ArrayList(); List dlogData = new ArrayList(); - if(dlogRecv.getDlogs()!=null){ + if(isFilter){ + dlogData = dlogfilteredData; + } + else if(dlogRecv.getDlogs()!=null){ dlogData = dlogRecv.parserDlogs(); } else { + tableClone = output; return output; } @@ -73,16 +98,23 @@ public class DlogTable extends DATableComposite { List text = new ArrayList(); List tabledata = new ArrayList(); DATableDataFormat TableDataformat = new DATableDataFormat(seqnum++); - - text.add(data.getTime()); + + String strTime = Formatter.toTimeFormat(data.getTime()); + text.add(strTime); tabledata.add(data.getTime()); - text.add(data.getTag()); - tabledata.add(data.getTag()); + text.add(data.getLevel()); + tabledata.add(data.getLevel()); text.add(data.getPid()); tabledata.add(data.getPid()); + text.add(data.getTid()); + tabledata.add(data.getTid()); + + text.add(data.getTag()); + tabledata.add(data.getTag()); + text.add(data.getMessage()); tabledata.add(data.getMessage()); @@ -90,6 +122,8 @@ public class DlogTable extends DATableComposite { TableDataformat.getData().add(tabledata.get(1)); TableDataformat.getData().add(tabledata.get(2)); TableDataformat.getData().add(tabledata.get(3)); + TableDataformat.getData().add(tabledata.get(4)); + TableDataformat.getData().add(tabledata.get(5)); TableInput tableInput = new TableInput(); tableInput.setText(text); @@ -97,6 +131,7 @@ public class DlogTable extends DATableComposite { output.add(tableInput); } + tableClone = output; return output; } /* @@ -192,5 +227,40 @@ public class DlogTable extends DATableComposite { } table.update(); } + /// 0504 Success find me~! + /// 1. Add TextEditor for input filter Text + /// 2. Effect for selection + /// 3. cutting Table by filtering + private void filteringDlog(String input){ + if(tableClone != null){ + for(TableInput table : tableClone){ + if(table.getText().get(4).contains(input)){ + //private String time; + //private String pid; + //private String tid; + //private String level; + //private String tag; + //private String message; + //dlogfilteredData.add(0,dlogRecv.getDlogs()); + System.out.println("============find me!!"+table.getText()+"=================="); + } + } + } + } + private void DlogTimeMarker(long startTime, long endTime){ + TimelineChartView timeline =(TimelineChartView) AnalyzerUtil.getView(TimelinePage.pageID, TimelineChartView.class.getName()); + DAChartBoard chartboard = (DAChartBoard)timeline.getControl(); + + double startMarkerTime = startTime + / (TimelineConstants.MEGA_DOUBLE); + double endMarkerTime = endTime + / (TimelineConstants.MEGA_DOUBLE); + + chartboard.setTimelineMarkerStartTime(startMarkerTime); + chartboard.setTimelineMarkerEndTime(endMarkerTime); + ((DAChartPlotIntervalMarker) chartboard.getMarkers().get( + UICommonConstants.RANGE_MARKER_INDEX)).setInterval(startTime, + endTime); + } } diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/dlog/DlogView.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/dlog/DlogView.java index e4ca0bd..5151e9b 100755 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/dlog/DlogView.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/dlog/DlogView.java @@ -4,32 +4,16 @@ 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.DASelectionData; -import org.tizen.dynamicanalyzer.common.Global; import org.tizen.dynamicanalyzer.nl.InformationViewLabels; -import org.tizen.dynamicanalyzer.nl.MemoryPageLabels; -import org.tizen.dynamicanalyzer.nl.TimelinePageLabels; -import org.tizen.dynamicanalyzer.project.Project; import org.tizen.dynamicanalyzer.resources.ColorResources; -import org.tizen.dynamicanalyzer.ui.memory.MemoryStatisticsTableView; -import org.tizen.dynamicanalyzer.ui.timeline.calltrace.CallTraceTable; -import org.tizen.dynamicanalyzer.ui.timeline.calltrace.WebCallTraceTable; import org.tizen.dynamicanalyzer.ui.widgets.table.DATableComposite; -import org.tizen.dynamicanalyzer.ui.widgets.table.DefaultTableComparator; import org.tizen.dynamicanalyzer.widgets.da.view.DAViewComposite; -import org.tizen.dynamicanalyzer.widgets.da.view.DAViewData; import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.StackLayout; -import org.eclipse.swt.layout.FormData; -import org.eclipse.swt.layout.FormAttachment; -import org.eclipse.swt.widgets.Text; public class DlogView extends DAViewComposite { - private String[] initcolumnNames = {"", "", "", "[After StopTrace, Show Dlogs]" }; public static final String ID = DlogView.class.getName(); Composite contents = null; - private StackLayout stackLayout; private DATableComposite DlogTable = null; public DlogView(Composite parent, int style) { -- 2.7.4