From 9cce1629e085c58fda4e1574831eeea9cce30afa Mon Sep 17 00:00:00 2001 From: "seokgil.kang" Date: Wed, 10 Jun 2015 20:13:02 +0900 Subject: [PATCH] [Filtering] implement table filtering feature Change-Id: I408851008c65c48d1d8e320f568acb1028048a3c Signed-off-by: seokgil.kang --- .../dynamicanalyzer/resources/ImageResources.java | 3 + .../widgets/da/view/DAViewComposite.java | 4 +- .../theme/white/img/advanced_menu_arrow.png | Bin 0 -> 2870 bytes .../dynamicanalyzer/model/FilterProperty.java | 56 +++ .../tizen/dynamicanalyzer/nl/AnalyzerLabels.java | 11 + .../dynamicanalyzer/nl/AnalyzerLabels.properties | 10 + .../tizen/dynamicanalyzer/nl/SummaryLabels.java | 2 + .../dynamicanalyzer/nl/SummaryLabels.properties | 2 + .../swap/platform/ui/SettingSaveTable.java | 2 +- .../dynamicanalyzer/ui/file/FileApiListTable.java | 1 + .../dynamicanalyzer/ui/file/FileApiListView.java | 6 +- .../ui/info/callstack/CallstackTable.java | 6 + .../ui/info/callstack/CallstackView.java | 7 +- .../dynamicanalyzer/ui/kernel/KernelListTable.java | 2 +- .../dynamicanalyzer/ui/network/NetworkTable.java | 1 + .../ui/network/NetworkTableView.java | 6 +- .../ui/opengl/table/api/GLAPIListView.java | 6 +- .../ui/opengl/table/api/GLAPITable.java | 1 + .../ui/opengl/table/state/GLContextTable.java | 2 +- .../ui/opengl/table/state/GLContextTableView.java | 8 +- .../ui/opengl/table/state/GLProgramTable.java | 1 + .../ui/opengl/table/state/GLProgramTableView.java | 6 +- .../ui/opengl/table/state/GLRedundantTable.java | 1 + .../opengl/table/state/GLRedundantTableView.java | 6 +- .../ui/opengl/table/state/GLStatisticsTable.java | 1 + .../opengl/table/state/GLStatisticsTableView.java | 6 +- .../ui/opengl/table/state/GLTextureTable.java | 1 + .../ui/opengl/table/state/GLTextureTableView.java | 6 +- .../ui/summary/failed/FailedApiListView.java | 7 +- .../ui/summary/failed/FailedApiTable.java | 1 + .../ui/summary/leaks/LeakDataMaker.java | 108 +--- .../ui/summary/leaks/LeakTable.java | 222 ++++----- .../dynamicanalyzer/ui/summary/leaks/LeakView.java | 6 +- .../profiling/FunctionUsageProfilingView.java | 6 +- .../ui/summary/profiling/ProfilingTable.java | 89 +++- .../ui/summary/warning/WarningListView.java | 6 +- .../ui/summary/warning/WarningTable.java | 1 + .../ui/thread/ThreadAPIListTable.java | 1 + .../ui/thread/ThreadAPIListView.java | 6 +- .../ui/timeline/calltrace/CallTraceTable.java | 1 + .../ui/timeline/calltrace/CallTraceView.java | 6 +- .../ui/timeline/uievent/UIEventListDialog.java | 1 + .../ui/toolbar/opentrace/SaveFilesTable.java | 1 + .../ui/toolbar/opentrace/TempFilesTable.java | 1 + .../replayEditor/ReplayEditScreenshotTable.java | 1 + .../ui/toolbar/replayEditor/ReplayEditTable.java | 1 + .../setting/FeatureDialogFeaturesTable.java | 1 + .../userinterface/control/UIControlListTable.java | 1 + .../profiling/UIFunctionProfilingTable.java | 1 + .../ui/userinterface/scene/UISceneListTable.java | 1 + .../ui/widgets/DAAdvancedPopupMenu.java | 93 ++++ .../ui/widgets/DAAdvancedViewComposite.java | 275 ++++++++++ .../dynamicanalyzer/ui/widgets/FilterDialog.java | 551 +++++++++++++++++++++ .../dynamicanalyzer/ui/widgets/FilterInputRow.java | 203 ++++++++ .../ui/widgets/table/DAApiListTableComposite.java | 1 + .../ui/widgets/table/DATableComposite.java | 152 +++++- .../ui/widgets/table/DATreeComposite.java | 8 +- 57 files changed, 1667 insertions(+), 249 deletions(-) create mode 100644 org.tizen.dynamicanalyzer.appearance/theme/white/img/advanced_menu_arrow.png create mode 100644 org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/model/FilterProperty.java create mode 100644 org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/widgets/DAAdvancedPopupMenu.java create mode 100644 org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/widgets/DAAdvancedViewComposite.java create mode 100644 org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/widgets/FilterDialog.java create mode 100644 org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/widgets/FilterInputRow.java diff --git a/org.tizen.dynamicanalyzer.appearance/src/org/tizen/dynamicanalyzer/resources/ImageResources.java b/org.tizen.dynamicanalyzer.appearance/src/org/tizen/dynamicanalyzer/resources/ImageResources.java index 33a042c..5250a73 100644 --- a/org.tizen.dynamicanalyzer.appearance/src/org/tizen/dynamicanalyzer/resources/ImageResources.java +++ b/org.tizen.dynamicanalyzer.appearance/src/org/tizen/dynamicanalyzer/resources/ImageResources.java @@ -450,6 +450,9 @@ public class ImageResources { public static final Image OVERHEAD_BAR = getPngImage("overhead_bar"); //$NON-NLS-1$ public static final Image OVERHEAD_BAR_BG = getPngImage("overhead_bar_bg"); //$NON-NLS-1$ + + /* advanced view */ + public static final Image ADVANCED_MENU_BUTTON = getPngImage("advanced_menu_arrow"); //$NON-NLS-1$ private static Image getImage(String pluginId, String folderName, diff --git a/org.tizen.dynamicanalyzer.appearance/src/org/tizen/dynamicanalyzer/widgets/da/view/DAViewComposite.java b/org.tizen.dynamicanalyzer.appearance/src/org/tizen/dynamicanalyzer/widgets/da/view/DAViewComposite.java index 23f1849..ab0ceab 100755 --- a/org.tizen.dynamicanalyzer.appearance/src/org/tizen/dynamicanalyzer/widgets/da/view/DAViewComposite.java +++ b/org.tizen.dynamicanalyzer.appearance/src/org/tizen/dynamicanalyzer/widgets/da/view/DAViewComposite.java @@ -56,8 +56,8 @@ public abstract class DAViewComposite extends DABaseComposite { private static final int OFFSET = 5; // ui components - private Canvas titleBar = null; - private Composite contentArea = null; + protected Canvas titleBar = null; + protected Composite contentArea = null; private Color titleFontColor = ColorResources.VIEW_TITLE_FONT_COLOR; private boolean isMaximized = false; diff --git a/org.tizen.dynamicanalyzer.appearance/theme/white/img/advanced_menu_arrow.png b/org.tizen.dynamicanalyzer.appearance/theme/white/img/advanced_menu_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..3e6ab31433d8260ac71defa3ad7bccd389a8bce7 GIT binary patch literal 2870 zcmV-63(53}P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0001CNkl@F+Oe7&v + * Juyoung Kim + * WooJin Jung + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Contributors: + * - S-Core Co., Ltd + * + */ + +package org.tizen.dynamicanalyzer.model; + +import org.tizen.dynamicanalyzer.constant.CommonConstants; + +public class FilterProperty { + private int columnIndex; + private String keyWord; + + public FilterProperty() { + columnIndex = -1; + keyWord = CommonConstants.EMPTY; + } + + public int getColumnIndex() { + return columnIndex; + } + + public String getKeyWord() { + return keyWord; + } + + public void setColumnIndex(int index) { + columnIndex = index; + } + + public void setKeyWord(String keyWord) { + this.keyWord = keyWord; + } +} diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/nl/AnalyzerLabels.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/nl/AnalyzerLabels.java index 7a5aa9f..6ba874b 100755 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/nl/AnalyzerLabels.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/nl/AnalyzerLabels.java @@ -177,6 +177,13 @@ public class AnalyzerLabels extends NLS { public static String FIND_DLG_OPTION; public static String FIND_DLG_CASE_SENSITIVE; public static String FIND_DLG_WHOLE_WORD; + + public static String FILTER_DLG_TITLE_PREFIX; + public static String FILTER_DLG_TITLE_POSTFIX; + public static String FILTER_DLG_ADD_BUTTON; + public static String FILTER_DLG_CLEAR_BUTTON; + public static String FILTER_DLG_CLEAR_MESSAGE; + public static String FILTER_DLG_KEYWORD_VERIFICATION_MESSAGE; public static String SAVE_TRACE_DLG_SAVE_FILE_NAME; public static String SAVE_FAILED; @@ -217,6 +224,10 @@ public class AnalyzerLabels extends NLS { public static String DETAIL_INFORMATION_APPLICATION_NAME; public static String DETAIL_INFORMATION_APPLICATION_EXEC_PATH; + // advanced menu text + public static String ADVANCED_MENU_SEARCH; + public static String ADVANCED_MENU_FILTER; + static { NLS.initializeMessages(BUNDLE_NAME, AnalyzerLabels.class); } diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/nl/AnalyzerLabels.properties b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/nl/AnalyzerLabels.properties index 3d5860e..6ae1c2f 100755 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/nl/AnalyzerLabels.properties +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/nl/AnalyzerLabels.properties @@ -151,6 +151,13 @@ FIND_DLG_DIRECTION_BACKWARD=Back FIND_DLG_OPTION=Option : FIND_DLG_CASE_SENSITIVE=Case sensitive FIND_DLG_WHOLE_WORD=Whole word + +FILTER_DLG_TITLE_PREFIX=Filter from +FILTER_DLG_TITLE_POSTFIX= table +FILTER_DLG_ADD_BUTTON=Add +FILTER_DLG_CLEAR_BUTTON=Clear +FILTER_DLG_CLEAR_MESSAGE=Clear filter setting?\nIf you click 'Ok', All settings will be deleted. +FILTER_DLG_KEYWORD_VERIFICATION_MESSAGE=Please enter a keyword. SAVE_TRACE_DLG_SAVE_FILE_NAME=Enter save file name SAVE_FAILED=Failed to save the tracing result @@ -181,3 +188,6 @@ DETAIL_INFORMATION_PACKAGE_VERSION=Package Version : DETAIL_INFORMATION_PACKAGE_INSTALL_TIME=Package Installed Time : DETAIL_INFORMATION_APPLICATION_NAME=Application Name : DETAIL_INFORMATION_APPLICATION_EXEC_PATH=Application Exec Path : + +ADVANCED_MENU_SEARCH=Search +ADVANCED_MENU_FILTER=Filter diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/nl/SummaryLabels.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/nl/SummaryLabels.java index 61059d3..68621fa 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/nl/SummaryLabels.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/nl/SummaryLabels.java @@ -53,6 +53,8 @@ public class SummaryLabels extends NLS { public static String FUNCTION_USER_PROFILING_VIEW_CALL_COUNT; public static String FUNCTION_USER_PROFILING_VIEW_EXCLUSIVE; public static String FUNCTION_USER_PROFILING_VIEW_INCLUSIVE; + public static String FUNCTION_USER_PROFILING_VIEW_EXCLUSIVE_PREFIX; + public static String FUNCTION_USER_PROFILING_VIEW_INCLUSIVE_PREFIX; public static String WARNING_CASE_BRIEF_DUPLICATE; public static String WARNING_CASE_BRIEF_NO_OPERATION; diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/nl/SummaryLabels.properties b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/nl/SummaryLabels.properties index 6e0be96..ab84b52 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/nl/SummaryLabels.properties +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/nl/SummaryLabels.properties @@ -19,6 +19,8 @@ FUNCTION_USER_PROFILING_VIEW_ELAPSED_TIME=Elapsed time FUNCTION_USER_PROFILING_VIEW_CALL_COUNT=Call count FUNCTION_USER_PROFILING_VIEW_EXCLUSIVE=Exclusive FUNCTION_USER_PROFILING_VIEW_INCLUSIVE=Inclusive +FUNCTION_USER_PROFILING_VIEW_EXCLUSIVE_PREFIX=Ex- +FUNCTION_USER_PROFILING_VIEW_INCLUSIVE_PREFIX=In- WARNING_CASE_BRIEF_DUPLICATE= Duplicate file open. WARNING_CASE_BRIEF_NO_OPERATION= File closed without using it. diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/platform/ui/SettingSaveTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/platform/ui/SettingSaveTable.java index ca6ef9b..b45c87a 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/platform/ui/SettingSaveTable.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/swap/platform/ui/SettingSaveTable.java @@ -34,6 +34,7 @@ import org.eclipse.nebula.widgets.grid.GridItem; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.tizen.dynamicanalyzer.common.path.PathManager; +import org.tizen.dynamicanalyzer.model.FilterProperty; import org.tizen.dynamicanalyzer.model.TableInput; import org.tizen.dynamicanalyzer.ui.widgets.table.DATableComposite; import org.tizen.dynamicanalyzer.utils.AnalyzerUtil; @@ -87,5 +88,4 @@ public class SettingSaveTable extends DATableComposite { } table.update(); } - } diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/file/FileApiListTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/file/FileApiListTable.java index 58eeb9a..fe31f1c 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/file/FileApiListTable.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/file/FileApiListTable.java @@ -43,6 +43,7 @@ import org.tizen.dynamicanalyzer.constant.CommonConstants; import org.tizen.dynamicanalyzer.database.SqlConnectionManager; import org.tizen.dynamicanalyzer.error.ErrorCodeManager; import org.tizen.dynamicanalyzer.logparser.LogCenterConstants; +import org.tizen.dynamicanalyzer.model.FilterProperty; import org.tizen.dynamicanalyzer.model.TableInput; import org.tizen.dynamicanalyzer.swap.model.data.FileData; import org.tizen.dynamicanalyzer.ui.file.manager.FileDataManager; diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/file/FileApiListView.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/file/FileApiListView.java index 0b7bef2..308cb41 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/file/FileApiListView.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/file/FileApiListView.java @@ -38,11 +38,12 @@ import org.tizen.dynamicanalyzer.ui.file.manager.FileDataManager; import org.tizen.dynamicanalyzer.ui.file.model.FileSelectedData; import org.tizen.dynamicanalyzer.ui.range.RangeDataManager; import org.tizen.dynamicanalyzer.ui.toolbar.Toolbar; +import org.tizen.dynamicanalyzer.ui.widgets.DAAdvancedViewComposite; import org.tizen.dynamicanalyzer.ui.widgets.table.TableColumnSizePackListener; import org.tizen.dynamicanalyzer.widgets.da.view.DAViewComposite; import org.tizen.dynamicanalyzer.widgets.da.view.DAViewData; -public class FileApiListView extends DAViewComposite { +public class FileApiListView extends DAAdvancedViewComposite { private long analysisStartTime = 0; private long analysisEndTime = 0; private int preSelectionPId = 1; @@ -80,7 +81,7 @@ public class FileApiListView extends DAViewComposite { FileDataManager manager = FileDataManager.getInstance(); public FileApiListView(Composite parent, int style) { - super(parent, style, true); + super(parent, style, true, true); this.setLayout(new FillLayout()); setTitle(FilePageLabels.FILE_API_LIST_VIEW_TITLE); @@ -97,6 +98,7 @@ public class FileApiListView extends DAViewComposite { tableComp.setTableName(FilePageLabels.FILE_API_LIST_VIEW_TITLE); contents.addControlListener(new TableColumnSizePackListener(tableComp, columnSizes)); + setTable(tableComp); } @Override diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/info/callstack/CallstackTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/info/callstack/CallstackTable.java index dbf2e20..5d426af 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/info/callstack/CallstackTable.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/info/callstack/CallstackTable.java @@ -34,11 +34,13 @@ 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.Rectangle; 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.common.Global; +import org.tizen.dynamicanalyzer.model.FilterProperty; import org.tizen.dynamicanalyzer.model.TableInput; import org.tizen.dynamicanalyzer.project.callstack.RuntimeCallstackManager; import org.tizen.dynamicanalyzer.swap.model.data.LogData; @@ -76,6 +78,8 @@ public class CallstackTable extends DATableComposite { public void widgetDefaultSelected(SelectionEvent e) { } }); + + applyFilterImage(); } @Override @@ -159,6 +163,8 @@ public class CallstackTable extends DATableComposite { return; } + // TODO : make GridItem using filter property data + GridItem gridItem = new GridItem(table, SWT.NONE); // setData block diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/info/callstack/CallstackView.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/info/callstack/CallstackView.java index ef06644..3d673d1 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/info/callstack/CallstackView.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/info/callstack/CallstackView.java @@ -42,6 +42,7 @@ import org.tizen.dynamicanalyzer.nl.InformationViewLabels; import org.tizen.dynamicanalyzer.resources.ColorResources; import org.tizen.dynamicanalyzer.swap.model.data.LogData; import org.tizen.dynamicanalyzer.ui.timeline.calltrace.FunctionEntryDBTable; +import org.tizen.dynamicanalyzer.ui.widgets.DAAdvancedViewComposite; import org.tizen.dynamicanalyzer.ui.widgets.table.DATableComposite; import org.tizen.dynamicanalyzer.ui.widgets.table.DATableDataFormat; import org.tizen.dynamicanalyzer.ui.widgets.table.DATreeComposite; @@ -50,7 +51,7 @@ import org.tizen.dynamicanalyzer.ui.widgets.table.TableColumnSizePackListener; import org.tizen.dynamicanalyzer.widgets.da.view.DAViewComposite; import org.tizen.dynamicanalyzer.widgets.da.view.DAViewData; -public class CallstackView extends DAViewComposite { +public class CallstackView extends DAAdvancedViewComposite { private DATableComposite callstackTableComp = null; private String[] columnNames = { InformationViewLabels.CALLSTACK_VIEW_FUNCTION, InformationViewLabels.CALLSTACK_VIEW_ADDRESS, @@ -65,7 +66,7 @@ public class CallstackView extends DAViewComposite { private static CallStackInserter inserter = CallStackInserter.getInstance(); public CallstackView(Composite parent, int style) { - super(parent, style, false); + super(parent, style, false, false); this.setLayout(new FillLayout()); setTitle(InformationViewLabels.CALLSTACK_VIEW_TITLE); @@ -82,6 +83,8 @@ public class CallstackView extends DAViewComposite { callstackTableComp.setColumnVisibility(columnVisibility); contents.addControlListener(new TableColumnSizePackListener(callstackTableComp, columnSizes)); + setTable(callstackTableComp); +// setView(this); } public void setObservingViews(String[] viewIds) { diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/kernel/KernelListTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/kernel/KernelListTable.java index 8c00932..146de56 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/kernel/KernelListTable.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/kernel/KernelListTable.java @@ -39,6 +39,7 @@ import org.tizen.dynamicanalyzer.common.AnalyzerManager; import org.tizen.dynamicanalyzer.common.DASelectionData; import org.tizen.dynamicanalyzer.common.Global; import org.tizen.dynamicanalyzer.database.DBConstants; +import org.tizen.dynamicanalyzer.model.FilterProperty; import org.tizen.dynamicanalyzer.model.TableInput; import org.tizen.dynamicanalyzer.ui.kernel.data.ContextDataDBTable; import org.tizen.dynamicanalyzer.ui.kernel.data.FunctionDataDBTable; @@ -282,5 +283,4 @@ public class KernelListTable extends DAWindowingTableComposite { return timestr; } - } diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/network/NetworkTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/network/NetworkTable.java index a59904c..2c9021b 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/network/NetworkTable.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/network/NetworkTable.java @@ -42,6 +42,7 @@ import org.tizen.dynamicanalyzer.common.Global; import org.tizen.dynamicanalyzer.constant.CommonConstants; import org.tizen.dynamicanalyzer.error.ErrorCodeManager; import org.tizen.dynamicanalyzer.logparser.LogCenterConstants; +import org.tizen.dynamicanalyzer.model.FilterProperty; import org.tizen.dynamicanalyzer.model.TableInput; import org.tizen.dynamicanalyzer.ui.network.data.NetworkDataManager; import org.tizen.dynamicanalyzer.ui.network.data.type.NetworkAPIType; diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/network/NetworkTableView.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/network/NetworkTableView.java index 2a55f46..e58222d 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/network/NetworkTableView.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/network/NetworkTableView.java @@ -39,12 +39,13 @@ import org.tizen.dynamicanalyzer.ui.network.data.NetworkDataManager; import org.tizen.dynamicanalyzer.ui.network.data.type.NetworkSelectionType; import org.tizen.dynamicanalyzer.ui.range.RangeDataManager; import org.tizen.dynamicanalyzer.ui.toolbar.Toolbar; +import org.tizen.dynamicanalyzer.ui.widgets.DAAdvancedViewComposite; import org.tizen.dynamicanalyzer.ui.widgets.table.TableColumnSizePackListener; import org.tizen.dynamicanalyzer.util.Logger; import org.tizen.dynamicanalyzer.widgets.da.view.DAViewComposite; import org.tizen.dynamicanalyzer.widgets.da.view.DAViewData; -public class NetworkTableView extends DAViewComposite { +public class NetworkTableView extends DAAdvancedViewComposite { public static final String ID = NetworkTableView.class.getName(); private long preAnalysisStartTime = 0; @@ -99,7 +100,7 @@ public class NetworkTableView extends DAViewComposite { NetworkTable tableComp = null; public NetworkTableView(Composite parent, int style) { - super(parent, style, true); + super(parent, style, true, true); this.setLayout(new FillLayout()); setTitle(NetworkPageLabels.NETWORK_API_LIST_VIEW_TITLE); @@ -115,6 +116,7 @@ public class NetworkTableView extends DAViewComposite { tableComp.setColumnSize(columnSizes); tableComp.setTableName(NetworkPageLabels.NETWORK_API_LIST_VIEW_TITLE); contents.addControlListener(new TableColumnSizePackListener(tableComp, columnSizes)); + setTable(tableComp); } @Override diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/api/GLAPIListView.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/api/GLAPIListView.java index d5d26b4..8e57b96 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/api/GLAPIListView.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/api/GLAPIListView.java @@ -42,12 +42,13 @@ import org.tizen.dynamicanalyzer.ui.opengl.data.GLDataManager; import org.tizen.dynamicanalyzer.ui.opengl.data.type.GLFrameRateInfo; import org.tizen.dynamicanalyzer.ui.opengl.data.type.GLSelectionData; import org.tizen.dynamicanalyzer.ui.timeline.common.TimelineConstants; +import org.tizen.dynamicanalyzer.ui.widgets.DAAdvancedViewComposite; import org.tizen.dynamicanalyzer.ui.widgets.table.DefaultTableComparator; import org.tizen.dynamicanalyzer.ui.widgets.table.TableColumnSizePackListener; import org.tizen.dynamicanalyzer.widgets.da.view.DAViewComposite; import org.tizen.dynamicanalyzer.widgets.da.view.DAViewData; -public class GLAPIListView extends DAViewComposite { +public class GLAPIListView extends DAAdvancedViewComposite { GLAPITable glAPIListTable; private String[] columnNames = { GLPageLabels.GL_API_LIST_VIEW_SEQ, @@ -72,7 +73,7 @@ public class GLAPIListView extends DAViewComposite { AnalyzerConstants.SORT_TYPE_NUM, }; public GLAPIListView(Composite parent, int style) { - super(parent, style, true); + super(parent, style, true, false); setLayout(new FillLayout()); setTitle(GLPageLabels.GL_API_LIST_VIEW_TITLE); Composite contents = getContentArea(); @@ -90,6 +91,7 @@ public class GLAPIListView extends DAViewComposite { glAPIListTable.setTableToolTipEnable(true); contents.addControlListener(new TableColumnSizePackListener(glAPIListTable, columnSizes)); + setTable(glAPIListTable); } diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/api/GLAPITable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/api/GLAPITable.java index e8a4ada..f9fbaf4 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/api/GLAPITable.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/api/GLAPITable.java @@ -37,6 +37,7 @@ import org.eclipse.swt.widgets.Composite; import org.tizen.dynamicanalyzer.common.AnalyzerConstants; import org.tizen.dynamicanalyzer.common.AnalyzerManager; import org.tizen.dynamicanalyzer.constant.CommonConstants; +import org.tizen.dynamicanalyzer.model.FilterProperty; import org.tizen.dynamicanalyzer.model.TableInput; import org.tizen.dynamicanalyzer.ui.opengl.GLPage; import org.tizen.dynamicanalyzer.ui.opengl.data.GLDataManager; diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/state/GLContextTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/state/GLContextTable.java index a59b9d3..6841cd8 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/state/GLContextTable.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/state/GLContextTable.java @@ -46,6 +46,7 @@ import org.eclipse.swt.widgets.Composite; import org.tizen.dynamicanalyzer.common.AnalyzerConstants; import org.tizen.dynamicanalyzer.common.AnalyzerManager; import org.tizen.dynamicanalyzer.constant.CommonConstants; +import org.tizen.dynamicanalyzer.model.FilterProperty; import org.tizen.dynamicanalyzer.model.TableInput; import org.tizen.dynamicanalyzer.resources.ColorResources; import org.tizen.dynamicanalyzer.resources.ImageResources; @@ -387,5 +388,4 @@ public class GLContextTable extends DATableComposite { AnalyzerManager.getCurrentPage().updateView(selData); disposeNaviButtons(); } - } diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/state/GLContextTableView.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/state/GLContextTableView.java index 9f4836d..68edde9 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/state/GLContextTableView.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/state/GLContextTableView.java @@ -53,12 +53,13 @@ import org.tizen.dynamicanalyzer.ui.opengl.data.GLDataManager; import org.tizen.dynamicanalyzer.ui.opengl.data.type.GLAPIData; import org.tizen.dynamicanalyzer.ui.opengl.data.type.GLContextNameEnum; import org.tizen.dynamicanalyzer.ui.opengl.data.type.GLSelectionData; +import org.tizen.dynamicanalyzer.ui.widgets.DAAdvancedViewComposite; import org.tizen.dynamicanalyzer.ui.widgets.table.DATableDataFormat; import org.tizen.dynamicanalyzer.ui.widgets.table.TableColumnSizePackListener; import org.tizen.dynamicanalyzer.widgets.da.view.DAViewComposite; import org.tizen.dynamicanalyzer.widgets.da.view.DAViewData; -public class GLContextTableView extends DAViewComposite { +public class GLContextTableView extends DAAdvancedViewComposite { GLContextTable tableComp = null; private Canvas titleBar = null; private int[] columnSizes = { 150, 100, 400 }; @@ -78,7 +79,7 @@ public class GLContextTableView extends DAViewComposite { AnalyzerConstants.SORT_TYPE_STRING }; public GLContextTableView(Composite parent, int style) { - super(parent, style, true); + super(parent, style, true, false); this.setLayout(new FillLayout()); setTitle(GLPageLabels.GL_CONTEXT_VIEW_TITLE); @@ -99,6 +100,9 @@ public class GLContextTableView extends DAViewComposite { tableComp.setColumnVisibility(columnVisibility); tableComp.setTableToolTipEnable(false); contents.addControlListener(new TableColumnSizePackListener(tableComp, columnSizes)); + setTable(tableComp); + // disable filter menu + disableAdvancedMenuItem(ADVANCED_MENU_ITEM.FILTER.index); } @Override diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/state/GLProgramTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/state/GLProgramTable.java index f10f019..21d6570 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/state/GLProgramTable.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/state/GLProgramTable.java @@ -35,6 +35,7 @@ import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.widgets.Composite; import org.tizen.dynamicanalyzer.common.AnalyzerConstants; import org.tizen.dynamicanalyzer.common.AnalyzerManager; +import org.tizen.dynamicanalyzer.model.FilterProperty; import org.tizen.dynamicanalyzer.model.TableInput; import org.tizen.dynamicanalyzer.nl.GLPageLabels; import org.tizen.dynamicanalyzer.ui.opengl.GLPage; diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/state/GLProgramTableView.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/state/GLProgramTableView.java index c3b41f5..cac5e49 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/state/GLProgramTableView.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/state/GLProgramTableView.java @@ -36,12 +36,13 @@ import org.tizen.dynamicanalyzer.nl.GLPageLabels; import org.tizen.dynamicanalyzer.resources.ColorResources; import org.tizen.dynamicanalyzer.ui.opengl.GLPage; import org.tizen.dynamicanalyzer.ui.opengl.data.type.GLSelectionData; +import org.tizen.dynamicanalyzer.ui.widgets.DAAdvancedViewComposite; import org.tizen.dynamicanalyzer.ui.widgets.table.DefaultTableComparator; import org.tizen.dynamicanalyzer.ui.widgets.table.TableColumnSizePackListener; import org.tizen.dynamicanalyzer.widgets.da.view.DAViewComposite; import org.tizen.dynamicanalyzer.widgets.da.view.DAViewData; -public class GLProgramTableView extends DAViewComposite { +public class GLProgramTableView extends DAAdvancedViewComposite { GLProgramTable tableComp = null; private int[] columnSizes = { 90, 90, 110, 110 }; private boolean[] columnVisibility = { true, true, true, true }; @@ -56,7 +57,7 @@ public class GLProgramTableView extends DAViewComposite { AnalyzerConstants.SORT_TYPE_GRID, AnalyzerConstants.SORT_TYPE_GRID }; public GLProgramTableView(Composite parent, int style) { - super(parent, style, true); + super(parent, style, true, false); this.setLayout(new FillLayout()); setTitle(GLPageLabels.GL_PROGRAMS_VIEW_TITLE); @@ -76,6 +77,7 @@ public class GLProgramTableView extends DAViewComposite { tableComp.setTableToolTipEnable(false); contents.addControlListener(new TableColumnSizePackListener(tableComp, columnSizes)); + setTable(tableComp); } diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/state/GLRedundantTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/state/GLRedundantTable.java index 32f3dc3..7877252 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/state/GLRedundantTable.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/state/GLRedundantTable.java @@ -36,6 +36,7 @@ import org.eclipse.swt.widgets.Composite; import org.tizen.dynamicanalyzer.common.AnalyzerConstants; import org.tizen.dynamicanalyzer.common.AnalyzerManager; import org.tizen.dynamicanalyzer.constant.CommonConstants; +import org.tizen.dynamicanalyzer.model.FilterProperty; import org.tizen.dynamicanalyzer.model.TableInput; import org.tizen.dynamicanalyzer.ui.opengl.GLPage; import org.tizen.dynamicanalyzer.ui.opengl.data.GLDataManager; diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/state/GLRedundantTableView.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/state/GLRedundantTableView.java index 97653b1..1b31fc9 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/state/GLRedundantTableView.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/state/GLRedundantTableView.java @@ -35,12 +35,13 @@ import org.tizen.dynamicanalyzer.common.AnalyzerManager; import org.tizen.dynamicanalyzer.nl.GLPageLabels; import org.tizen.dynamicanalyzer.resources.ColorResources; import org.tizen.dynamicanalyzer.ui.opengl.data.type.GLSelectionData; +import org.tizen.dynamicanalyzer.ui.widgets.DAAdvancedViewComposite; import org.tizen.dynamicanalyzer.ui.widgets.table.DefaultTableComparator; import org.tizen.dynamicanalyzer.ui.widgets.table.TableColumnSizePackListener; import org.tizen.dynamicanalyzer.widgets.da.view.DAViewComposite; import org.tizen.dynamicanalyzer.widgets.da.view.DAViewData; -public class GLRedundantTableView extends DAViewComposite { +public class GLRedundantTableView extends DAAdvancedViewComposite { public static final int COUNT_TABLE_INDEX = 0; public static final int ELAPSED_TIME_TABLE_INDEX = 1; public static final int API_NAME_TABLE_INDEX = 2; @@ -58,7 +59,7 @@ public class GLRedundantTableView extends DAViewComposite { AnalyzerConstants.SORT_TYPE_STRING, AnalyzerConstants.SORT_TYPE_STRING }; public GLRedundantTableView(Composite parent, int style) { - super(parent, style, true); + super(parent, style, true, false); this.setLayout(new FillLayout()); setTitle(GLPageLabels.GL_REDUNDANT_TITLE); Composite contents = getContentArea(); @@ -75,6 +76,7 @@ public class GLRedundantTableView extends DAViewComposite { tableComp.setColumnVisibility(columnVisibility); tableComp.setTableToolTipEnable(false); contents.addControlListener(new TableColumnSizePackListener(tableComp, columnSizes)); + setTable(tableComp); } @Override diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/state/GLStatisticsTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/state/GLStatisticsTable.java index 66f8f65..57cb918 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/state/GLStatisticsTable.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/state/GLStatisticsTable.java @@ -36,6 +36,7 @@ import org.eclipse.swt.widgets.Composite; import org.tizen.dynamicanalyzer.common.AnalyzerConstants; import org.tizen.dynamicanalyzer.common.AnalyzerManager; import org.tizen.dynamicanalyzer.constant.CommonConstants; +import org.tizen.dynamicanalyzer.model.FilterProperty; import org.tizen.dynamicanalyzer.model.TableInput; import org.tizen.dynamicanalyzer.ui.opengl.GLPage; import org.tizen.dynamicanalyzer.ui.opengl.data.GLDataManager; diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/state/GLStatisticsTableView.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/state/GLStatisticsTableView.java index 0a9adf4..8aa2ae7 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/state/GLStatisticsTableView.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/state/GLStatisticsTableView.java @@ -35,12 +35,13 @@ import org.tizen.dynamicanalyzer.common.AnalyzerManager; import org.tizen.dynamicanalyzer.nl.GLPageLabels; import org.tizen.dynamicanalyzer.resources.ColorResources; import org.tizen.dynamicanalyzer.ui.opengl.data.type.GLSelectionData; +import org.tizen.dynamicanalyzer.ui.widgets.DAAdvancedViewComposite; import org.tizen.dynamicanalyzer.ui.widgets.table.DefaultTableComparator; import org.tizen.dynamicanalyzer.ui.widgets.table.TableColumnSizePackListener; import org.tizen.dynamicanalyzer.widgets.da.view.DAViewComposite; import org.tizen.dynamicanalyzer.widgets.da.view.DAViewData; -public class GLStatisticsTableView extends DAViewComposite { +public class GLStatisticsTableView extends DAAdvancedViewComposite { public static final int API_NAME_TABLE_INDEX = 0; public static final int TABLE_RATE_TABLE_INDEX = 1; public static final int COUNT_TABLE_INDEX = 2; @@ -59,7 +60,7 @@ public class GLStatisticsTableView extends DAViewComposite { AnalyzerConstants.SORT_TYPE_NUM, AnalyzerConstants.SORT_TYPE_STRING }; public GLStatisticsTableView(Composite parent, int style) { - super(parent, style, true); + super(parent, style, true, false); this.setLayout(new FillLayout()); setTitle(GLPageLabels.GL_STATISTICS_TITLE); Composite contents = getContentArea(); @@ -76,6 +77,7 @@ public class GLStatisticsTableView extends DAViewComposite { tableComp.setColumnVisibility(columnVisibility); tableComp.setTableToolTipEnable(false); contents.addControlListener(new TableColumnSizePackListener(tableComp, columnSizes)); + setTable(tableComp); } @Override diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/state/GLTextureTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/state/GLTextureTable.java index 329c5a1..9958a85 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/state/GLTextureTable.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/state/GLTextureTable.java @@ -35,6 +35,7 @@ import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.widgets.Composite; import org.tizen.dynamicanalyzer.common.AnalyzerConstants; import org.tizen.dynamicanalyzer.common.AnalyzerManager; +import org.tizen.dynamicanalyzer.model.FilterProperty; import org.tizen.dynamicanalyzer.model.TableInput; import org.tizen.dynamicanalyzer.nl.GLPageLabels; import org.tizen.dynamicanalyzer.ui.opengl.GLPage; diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/state/GLTextureTableView.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/state/GLTextureTableView.java index 6cd4475..aaec655 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/state/GLTextureTableView.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/opengl/table/state/GLTextureTableView.java @@ -36,12 +36,13 @@ import org.tizen.dynamicanalyzer.nl.GLPageLabels; import org.tizen.dynamicanalyzer.resources.ColorResources; import org.tizen.dynamicanalyzer.ui.opengl.GLPage; import org.tizen.dynamicanalyzer.ui.opengl.data.type.GLSelectionData; +import org.tizen.dynamicanalyzer.ui.widgets.DAAdvancedViewComposite; import org.tizen.dynamicanalyzer.ui.widgets.table.DefaultTableComparator; import org.tizen.dynamicanalyzer.ui.widgets.table.TableColumnSizePackListener; import org.tizen.dynamicanalyzer.widgets.da.view.DAViewComposite; import org.tizen.dynamicanalyzer.widgets.da.view.DAViewData; -public class GLTextureTableView extends DAViewComposite { +public class GLTextureTableView extends DAAdvancedViewComposite { GLTextureTable tableComp = null; private int[] columnSizes = { 80, 80, 110, 120, 120, 100, 100 }; private boolean[] columnVisibility = { true, true, true, true, true, true, true }; @@ -61,7 +62,7 @@ public class GLTextureTableView extends DAViewComposite { AnalyzerConstants.SORT_TYPE_GRID }; public GLTextureTableView(Composite parent, int style) { - super(parent, style, true); + super(parent, style, true, false); this.setLayout(new FillLayout()); setTitle(GLPageLabels.GL_TEXTURE_VIEW_TITLE); @@ -81,6 +82,7 @@ public class GLTextureTableView extends DAViewComposite { tableComp.setTableToolTipEnable(false); contents.addControlListener(new TableColumnSizePackListener(tableComp, columnSizes)); + setTable(tableComp); } diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/failed/FailedApiListView.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/failed/FailedApiListView.java index 1e719b0..89dd029 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/failed/FailedApiListView.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/failed/FailedApiListView.java @@ -34,13 +34,13 @@ import org.eclipse.swt.widgets.Control; import org.tizen.dynamicanalyzer.common.AnalyzerConstants; import org.tizen.dynamicanalyzer.nl.SummaryLabels; import org.tizen.dynamicanalyzer.resources.ColorResources; +import org.tizen.dynamicanalyzer.ui.widgets.DAAdvancedViewComposite; import org.tizen.dynamicanalyzer.ui.widgets.table.DATableComposite; import org.tizen.dynamicanalyzer.ui.widgets.table.DefaultTableComparator; import org.tizen.dynamicanalyzer.ui.widgets.table.TableColumnSizePackListener; -import org.tizen.dynamicanalyzer.widgets.da.view.DAViewComposite; import org.tizen.dynamicanalyzer.widgets.da.view.DAViewData; -public class FailedApiListView extends DAViewComposite { +public class FailedApiListView extends DAAdvancedViewComposite { protected DATableComposite tableComp = null; protected String[] columnNames = { @@ -65,7 +65,7 @@ public class FailedApiListView extends DAViewComposite { AnalyzerConstants.SORT_TYPE_STRING }; public FailedApiListView(Composite parent, int style) { - super(parent, style, true); + super(parent, style, true, true); this.setLayout(new FillLayout()); setTitle(SummaryLabels.FAILED_API_LIST_VIEW_TITLE); @@ -84,6 +84,7 @@ public class FailedApiListView extends DAViewComposite { tableComp.setColumnVisibility(columnVisibility); contents.addControlListener(new TableColumnSizePackListener(tableComp, columnSizes)); + setTable(tableComp); } @Override diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/failed/FailedApiTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/failed/FailedApiTable.java index d0d6fe1..2a5fbf1 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/failed/FailedApiTable.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/failed/FailedApiTable.java @@ -40,6 +40,7 @@ import org.tizen.dynamicanalyzer.common.DASelectionData; import org.tizen.dynamicanalyzer.common.Global; import org.tizen.dynamicanalyzer.error.ErrorCodeManager; import org.tizen.dynamicanalyzer.listeners.SummaryMouseDoubleClickListener; +import org.tizen.dynamicanalyzer.model.FilterProperty; import org.tizen.dynamicanalyzer.model.TableInput; import org.tizen.dynamicanalyzer.swap.model.data.ProbeCommonData; import org.tizen.dynamicanalyzer.ui.range.RangeDataManager; diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/leaks/LeakDataMaker.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/leaks/LeakDataMaker.java index 083b122..9225487 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/leaks/LeakDataMaker.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/leaks/LeakDataMaker.java @@ -35,6 +35,7 @@ import java.util.Map; import org.tizen.dynamicanalyzer.common.AnalyzerManager; import org.tizen.dynamicanalyzer.common.DALimit; import org.tizen.dynamicanalyzer.common.Global; +import org.tizen.dynamicanalyzer.constant.CommonConstants; import org.tizen.dynamicanalyzer.database.DBInserter; import org.tizen.dynamicanalyzer.database.DBTable; import org.tizen.dynamicanalyzer.database.IResultSet; @@ -192,10 +193,8 @@ public class LeakDataMaker { memoryAllocDataList.clear(); freeDataList.clear(); } - - public List> getAllocationDataFromDB(Long seq) { - String where = String.format(query_withSeq, - MemoryAllocationDataDBTable.COLUMN.SEQUENCE_NUMBER.name, seq); + + private List> executeQuery(String where) { DBTable table = SummaryDataManager.getInstance().getMemoryAllocationDataDBTable(); List columns = new ArrayList(); columns.add(MemoryAllocationDataDBTable.COLUMN.SEQUENCE_NUMBER.name); @@ -236,6 +235,13 @@ public class LeakDataMaker { }); } + public List> getAllocationDataFromDB(Long seq) { + String where = String.format(query_withSeq, + MemoryAllocationDataDBTable.COLUMN.SEQUENCE_NUMBER.name, seq); + + return executeQuery(where); + } + public List> getLeakDataFromDB() { DBTable table = SummaryDataManager.getInstance().getLeakDataDBTable(); List columns = new ArrayList(); @@ -261,53 +267,25 @@ public class LeakDataMaker { }); } - public List> getLeakDataWithSeq(List leakSequenceNumbers) { + public List> getLeakDataWithSeq(List leakSequenceNumbers, + List whereQueryList) { String where = String.format(query_withSeqList, MemoryAllocationDataDBTable.COLUMN.SEQUENCE_NUMBER.name); int size = leakSequenceNumbers.size(); for (int i = 0; i < size - 1; i++) { - where += String.valueOf(leakSequenceNumbers.get(i)) + ", "; + where += String.valueOf(leakSequenceNumbers.get(i)) + CommonConstants.COMMA + + CommonConstants.SPACE; } - where += String.valueOf(leakSequenceNumbers.get(size - 1)) + ")"; - - DBTable table = SummaryDataManager.getInstance().getMemoryAllocationDataDBTable(); - List columns = new ArrayList(); - columns.add(MemoryAllocationDataDBTable.COLUMN.SEQUENCE_NUMBER.name); - columns.add(MemoryAllocationDataDBTable.COLUMN.PROCESS_ID.name); - columns.add(MemoryAllocationDataDBTable.COLUMN.API_ID.name); - columns.add(MemoryAllocationDataDBTable.COLUMN.API_TYPE.name); - columns.add(MemoryAllocationDataDBTable.COLUMN.ALLOCATED_ADDRESS.name); - columns.add(MemoryAllocationDataDBTable.COLUMN.ALLOCATED_TIME.name); - columns.add(MemoryAllocationDataDBTable.COLUMN.CALLER_PC_ADDRESS.name); - columns.add(MemoryAllocationDataDBTable.COLUMN.ARGUMENT.name); - columns.add(MemoryAllocationDataDBTable.COLUMN.RETURN_VALUE.name); - columns.add(MemoryAllocationDataDBTable.COLUMN.CALLER_LIBRARY_NAME.name); - columns.add(MemoryAllocationDataDBTable.COLUMN.MESSAGE_ID.name); - - return table.selectData(columns, where, new IResultSet() { - @Override - public List extractDataFromResultSet(ResultSet rs) { - List row = new ArrayList(); - try { - row.add(Long.valueOf(rs.getLong(1))); - row.add(Integer.valueOf(rs.getInt(2))); - row.add(Integer.valueOf(rs.getInt(3))); - row.add(Integer.valueOf(rs.getInt(4))); - row.add(Long.valueOf(rs.getLong(5))); - row.add(Long.valueOf(rs.getLong(6))); - row.add(Long.valueOf(rs.getLong(7))); - row.add(rs.getString(8)); - row.add(rs.getString(9)); - row.add(rs.getString(10)); - row.add(Integer.valueOf(rs.getInt(11))); - } catch (SQLException e) { - Logger.exception(e); - return null; - } - - return row; + where += String.valueOf(leakSequenceNumbers.get(size - 1)) + CommonConstants.CLOSE_BRACKET; + + if (whereQueryList != null && !whereQueryList.isEmpty()) { + // if 'WHERE' condition used on the DB query is existed + for (int i = 0; i < whereQueryList.size(); i++) { + where += " and " + whereQueryList.get(i); } - }); + } + + return executeQuery(where); } public List> getLeakDataForRange() { @@ -378,44 +356,8 @@ public class LeakDataMaker { MemoryAllocationDataDBTable.COLUMN.ALLOCATED_TIME.name, startTime.toString(), MemoryAllocationDataDBTable.COLUMN.ALLOCATED_TIME.name, endTime.toString(), MemoryAllocationDataDBTable.COLUMN.ALLOCATED_TIME.name); - DBTable table = SummaryDataManager.getInstance().getMemoryAllocationDataDBTable(); - List columns = new ArrayList(); - columns.add(MemoryAllocationDataDBTable.COLUMN.SEQUENCE_NUMBER.name); - columns.add(MemoryAllocationDataDBTable.COLUMN.PROCESS_ID.name); - columns.add(MemoryAllocationDataDBTable.COLUMN.API_ID.name); - columns.add(MemoryAllocationDataDBTable.COLUMN.API_TYPE.name); - columns.add(MemoryAllocationDataDBTable.COLUMN.ALLOCATED_ADDRESS.name); - columns.add(MemoryAllocationDataDBTable.COLUMN.ALLOCATED_TIME.name); - columns.add(MemoryAllocationDataDBTable.COLUMN.CALLER_PC_ADDRESS.name); - columns.add(MemoryAllocationDataDBTable.COLUMN.ARGUMENT.name); - columns.add(MemoryAllocationDataDBTable.COLUMN.RETURN_VALUE.name); - columns.add(MemoryAllocationDataDBTable.COLUMN.CALLER_LIBRARY_NAME.name); - columns.add(MemoryAllocationDataDBTable.COLUMN.MESSAGE_ID.name); - - return table.selectData(columns, where, new IResultSet() { - @Override - public List extractDataFromResultSet(ResultSet rs) { - List row = new ArrayList(); - try { - row.add(Long.valueOf(rs.getLong(1))); - row.add(Integer.valueOf(rs.getInt(2))); - row.add(Integer.valueOf(rs.getInt(3))); - row.add(Integer.valueOf(rs.getInt(4))); - row.add(Long.valueOf(rs.getLong(5))); - row.add(Long.valueOf(rs.getLong(6))); - row.add(Long.valueOf(rs.getLong(7))); - row.add(rs.getString(8)); - row.add(rs.getString(9)); - row.add(rs.getString(10)); - row.add(Integer.valueOf(rs.getInt(11))); - } catch (SQLException e) { - Logger.exception(e); - return null; - } - - return row; - } - }); + + return executeQuery(where); } private List> getFreeDataWithPidFromDBForRange(Long startTime, Long endTime, diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/leaks/LeakTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/leaks/LeakTable.java index 1a0bac6..52fcca9 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/leaks/LeakTable.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/leaks/LeakTable.java @@ -42,7 +42,9 @@ import org.tizen.dynamicanalyzer.common.AnalyzerConstants; import org.tizen.dynamicanalyzer.common.AnalyzerManager; import org.tizen.dynamicanalyzer.common.DASelectionData; import org.tizen.dynamicanalyzer.common.Global; +import org.tizen.dynamicanalyzer.constant.CommonConstants; import org.tizen.dynamicanalyzer.listeners.SummaryMouseDoubleClickListener; +import org.tizen.dynamicanalyzer.model.FilterProperty; import org.tizen.dynamicanalyzer.model.TreeInput; import org.tizen.dynamicanalyzer.swap.model.data.LogDataFactory; import org.tizen.dynamicanalyzer.swap.model.data.ProbeCommonData; @@ -59,8 +61,6 @@ import org.tizen.dynamicanalyzer.utils.Formatter; public class LeakTable extends DATreeComposite { private boolean isRange = false; - private final LeakDataMaker leakDataMaker = SummaryDataManager.getInstance().getLeakDataMaker(); - public LeakTable(Composite parent, int compStyle, int tableStyle) { super(parent, compStyle, tableStyle); setContextMenu(AnalyzerConstants.CONTEXT_TABLE_RANGE); @@ -158,6 +158,7 @@ public class LeakTable extends DATreeComposite { List output = new ArrayList(); Map leaks = null; List> leakDataList = null; + List filterList = getFilterPropertyList(); // TODO : make hashkey (LogData.getKey() --> combination of pid and // address) if (isRange) { @@ -165,16 +166,23 @@ public class LeakTable extends DATreeComposite { .getLeakDataForRange(); } else { leaks = AnalyzerManager.getNewLeakDetector().getLeakHash(); - if (leaks == null || leaks.size() < 1) + if (leaks == null || leaks.isEmpty()) return output; - ArrayList leakList = new ArrayList(); - leakList.addAll(leaks.values()); + List leakSeqNumList = new ArrayList(); - for (int i = 0; i < leakList.size(); i++) - leakSeqNumList.add(leakList.get(i).getSequenceNumber()); + for (Integer key : leaks.keySet()) { + leakSeqNumList.add(leaks.get(key).getSequenceNumber()); + } - leakDataList = SummaryDataManager.getInstance().getLeakDataMaker() - .getLeakDataWithSeq(leakSeqNumList); + if (!filterList.isEmpty()) { + // if filter is set by user + List whereQueryList = convertFilterProperty2Query(filterList); + leakDataList = SummaryDataManager.getInstance().getLeakDataMaker() + .getLeakDataWithSeq(leakSeqNumList, whereQueryList); + } else { + leakDataList = SummaryDataManager.getInstance().getLeakDataMaker() + .getLeakDataWithSeq(leakSeqNumList, null); + } } if (leakDataList == null) @@ -182,6 +190,7 @@ public class LeakTable extends DATreeComposite { // TODO : it is necessary to consider when choosing a multi-processes. int selectedPid = Toolbar.INSTANCE.getSelectedPid(); int size = leakDataList.size(); + for (int i = 0; i < size; i++) { List iLeakData = leakDataList.get(i); int pid = (Integer) iLeakData.get(MemoryAllocationDataDBTable.COLUMN.PROCESS_ID.index); @@ -190,8 +199,8 @@ public class LeakTable extends DATreeComposite { continue; } } - - TreeInput leakInput = makeTreeInputForLeakData(iLeakData, i); + + TreeInput leakInput = makeTreeInputForLeakData(iLeakData, i, filterList); if (leakInput != null){ output.add(leakInput); } @@ -200,7 +209,8 @@ public class LeakTable extends DATreeComposite { return output; } - private TreeInput makeTreeInputForLeakData(List leakData, int index) { + private TreeInput makeTreeInputForLeakData(List leakData, int index, + List filterList) { // TODO : need understand for the DATableDataFormat class DATableDataFormat tableData = new DATableDataFormat(index); @@ -230,15 +240,17 @@ public class LeakTable extends DATreeComposite { String type = LogDataFactory.getLogFormatName(id); text.add(type); data.add(type); - // 4 : allocated time + // 4 : allocated time long time = (Long) leakData.get(MemoryAllocationDataDBTable.COLUMN.ALLOCATED_TIME.index); - data.add(Long.valueOf(time)); + String timeFormat = null; try { - text.add(Formatter.toTimeFormat(time)); - } catch (NumberFormatException e) { + timeFormat = Formatter.toTimeFormat(time); + } catch(NumberFormatException e) { Logger.exception(e); - text.add(Long.toString(time)); + timeFormat = Long.toString(time); } + data.add(Long.valueOf(time)); + text.add(timeFormat); tableData.setObject(apiName); // 5 : arguments @@ -265,6 +277,38 @@ public class LeakTable extends DATreeComposite { long callerPcAddr = (Long) leakData .get(MemoryAllocationDataDBTable.COLUMN.CALLER_PC_ADDRESS.index); data.add(callerPcAddr); + + // check for filter data of the excluded columns from the process of creating a filter query + for (int i = 0; i < filterList.size(); i++) { + switch(filterList.get(i).getColumnIndex()) { + case 1: // API(api name) + if (apiName.toLowerCase().contains(filterList.get(i).getKeyWord().toLowerCase())) { + break; + } else { + text.clear(); + data.clear(); + return output; + } + case 3: // Category(log format name) + if (type.toLowerCase().contains(filterList.get(i).getKeyWord().toLowerCase())) { + break; + } else { + text.clear(); + data.clear(); + return output; + } + case 4: // Time(allocated time) + if (timeFormat.toLowerCase().contains(filterList.get(i).getKeyWord().toLowerCase())) { + break; + } else { + text.clear(); + data.clear(); + return output; + } + default: + break; + } + } tableData.getData().addAll(data); tableData.setType(AnalyzerConstants.TYPE_TABLE_LEAK); @@ -297,108 +341,50 @@ public class LeakTable extends DATreeComposite { return output; } - - @SuppressWarnings("unused") - private TreeInput makeTreeInputForLeaks(CurrentLeakData leakInfo, int index) { - // TODO : need understand for the DATableDataFormat class - DATableDataFormat tableData = new DATableDataFormat(index); - - List text = new ArrayList(); - List data = new ArrayList(); - TreeInput output = null; - - Long seq = leakInfo.getSequenceNumber(); - List> leakData = leakDataMaker.getAllocationDataFromDB(seq); - if (leakData == null) { - Logger.error("very strange case !!"); - return null; - } - if (leakData.size() != 1) { // size of leakData must be 1 - Logger.error("size of leakDataMaker.getLeakDataFromDB() is not '1'"); - return output; - } - List idata = leakData.get(0); - // 0 : column empty value for tree - int apiId = (Integer) idata.get(MemoryAllocationDataDBTable.COLUMN.API_ID.index); - String apiName = Global.getFunctionName(apiId); - text.add(apiName); - data.add(apiName); - // 1 : pid - int pid = (Integer) idata.get(MemoryAllocationDataDBTable.COLUMN.PROCESS_ID.index); - text.add(Integer.toString(pid)); - data.add(pid); - // 2 : sequence number - text.add(Long.toString(seq)); - data.add(seq); - // 3 : message id - int id = (Integer) idata.get(MemoryAllocationDataDBTable.COLUMN.MESSAGE_ID.index); - String type = LogDataFactory.getLogFormatName(id); - text.add(type); - data.add(type); - // 4 : allocated time - long time = (Long) idata.get(MemoryAllocationDataDBTable.COLUMN.ALLOCATED_TIME.index); - data.add(Long.valueOf(time)); - try { - text.add(Formatter.toTimeFormat(time)); - } catch (NumberFormatException e) { - Logger.exception(e); - text.add(Long.toString(time)); - } - - tableData.setObject(apiName); - // 5 : arguments - String args = (String) idata.get(MemoryAllocationDataDBTable.COLUMN.ARGUMENT.index); - text.add(args); - data.add(args); - // 6 : return value - String retValue = (String) idata.get(MemoryAllocationDataDBTable.COLUMN.RETURN_VALUE.index); - text.add(retValue); - data.add(retValue); - // 7 : library name - String libName = (String) idata - .get(MemoryAllocationDataDBTable.COLUMN.CALLER_LIBRARY_NAME.index); - if (libName == null || libName.isEmpty()) { - // TODO : replace another one ?? - libName = "unknown"; + + private List convertFilterProperty2Query(List filterList) { + List queries = new ArrayList(); + + for (int i = 0; i < filterList.size(); i++) { + FilterProperty prop = filterList.get(i); + String queryPrefix = makeFilterQueryPrefix(prop.getColumnIndex()); + if (queryPrefix != null) { + queries.add(makeFilterQueryPostfix(queryPrefix, prop.getKeyWord())); + } } - text.add(libName); - data.add(libName); - // 8 : for ToolTip Listener - data.add((Long) idata.get(MemoryAllocationDataDBTable.COLUMN.ALLOCATED_ADDRESS.index)); - // 9 : caller pc address - long callerPcAddr = (Long) idata - .get(MemoryAllocationDataDBTable.COLUMN.CALLER_PC_ADDRESS.index); - data.add(callerPcAddr); - - tableData.getData().addAll(data); - tableData.setType(AnalyzerConstants.TYPE_TABLE_LEAK); - - ProbeCommonData probeData = new ProbeCommonData(); - probeData.setSeq(seq); - probeData.setApiName(apiName); - probeData.setMsgID(id); - probeData.setPid(pid); - probeData.setTime(time); - probeData.setArgs(args); - probeData.setReturn(retValue); - probeData.setCallerAddress(callerPcAddr); - probeData.setLibName(libName); - tableData.setLogData(probeData); - - output = new TreeInput(); - output.setText(text); - output.setData(tableData); - // output.setParent(Integer.toString(leakData.getParentKey())); - - if (RangeDataManager.getInstance().isBeingAnalyzed()) { - long leakTime = time; - long startTime = RangeDataManager.getInstance().getAnalysisStartTime(); - long endTime = RangeDataManager.getInstance().getAnalysisEndTime(); - if (leakTime >= startTime && leakTime <= endTime) { - output.setInRange(true); - } + + return queries; + } + + // excluded columns : API(api name), Category(log format name), Time(allocated time) + private String makeFilterQueryPrefix(int index) { + String queryPrefix = null; + switch(index) { + case 2: + queryPrefix = String.valueOf(MemoryAllocationDataDBTable.COLUMN.PROCESS_ID.name); + break; + case 5: + queryPrefix = addLowerOperation(MemoryAllocationDataDBTable.COLUMN.ARGUMENT.name); + break; + case 6: + queryPrefix = addLowerOperation(MemoryAllocationDataDBTable.COLUMN.RETURN_VALUE.name); + break; + case 7: + queryPrefix = addLowerOperation(MemoryAllocationDataDBTable.COLUMN.CALLER_LIBRARY_NAME.name); + break; + default: + break; } - - return output; + + return queryPrefix; + } + + private String addLowerOperation(String columnName) { + return "lower" + CommonConstants.OPEN_BRACKET + columnName + CommonConstants.CLOSE_BRACKET; + } + + private String makeFilterQueryPostfix(String queryPrefix, String keyword) { + return queryPrefix + CommonConstants.SPACE + "like" + CommonConstants.SPACE + "'" + + CommonConstants.PERCENT + keyword.toLowerCase() + CommonConstants.PERCENT + "'"; } } diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/leaks/LeakView.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/leaks/LeakView.java index 7b172b6..09bf44a 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/leaks/LeakView.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/leaks/LeakView.java @@ -35,13 +35,14 @@ import org.tizen.dynamicanalyzer.common.AnalyzerConstants; import org.tizen.dynamicanalyzer.nl.AnalyzerLabels; import org.tizen.dynamicanalyzer.nl.SummaryLabels; import org.tizen.dynamicanalyzer.resources.ColorResources; +import org.tizen.dynamicanalyzer.ui.widgets.DAAdvancedViewComposite; import org.tizen.dynamicanalyzer.ui.widgets.table.DATreeComposite; import org.tizen.dynamicanalyzer.ui.widgets.table.TableColumnSizePackListener; import org.tizen.dynamicanalyzer.ui.widgets.table.TreeDataComparator; import org.tizen.dynamicanalyzer.widgets.da.view.DAViewComposite; import org.tizen.dynamicanalyzer.widgets.da.view.DAViewData; -public class LeakView extends DAViewComposite { +public class LeakView extends DAAdvancedViewComposite { protected String[] columnNames = {SummaryLabels.LEAK_VIEW_INDEX, SummaryLabels.LEAK_VIEW_NAME, SummaryLabels.LEAK_VIEW_PID, SummaryLabels.LEAK_VIEW_TYPE, SummaryLabels.LEAK_VIEW_TIME, @@ -60,7 +61,7 @@ public class LeakView extends DAViewComposite { protected DATreeComposite treeComp = null; public LeakView(Composite parent, int style) { - super(parent, style, true); + super(parent, style, true, true); this.setLayout(new FillLayout()); setTitle(SummaryLabels.LEAK_VIEW_TITLE_LEAK); @@ -83,6 +84,7 @@ public class LeakView extends DAViewComposite { contents.addControlListener(new TableColumnSizePackListener(treeComp, columnSizes)); + setTable(treeComp); } @Override diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/profiling/FunctionUsageProfilingView.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/profiling/FunctionUsageProfilingView.java index e3b6db8..8a5306b 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/profiling/FunctionUsageProfilingView.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/profiling/FunctionUsageProfilingView.java @@ -38,11 +38,12 @@ import org.tizen.dynamicanalyzer.common.AnalyzerConstants; import org.tizen.dynamicanalyzer.model.ColumnData; import org.tizen.dynamicanalyzer.nl.SummaryLabels; import org.tizen.dynamicanalyzer.resources.ColorResources; +import org.tizen.dynamicanalyzer.ui.widgets.DAAdvancedViewComposite; import org.tizen.dynamicanalyzer.ui.widgets.table.TableColumnSizePackListener; import org.tizen.dynamicanalyzer.widgets.da.view.DAViewComposite; import org.tizen.dynamicanalyzer.widgets.da.view.DAViewData; -public class FunctionUsageProfilingView extends DAViewComposite { +public class FunctionUsageProfilingView extends DAAdvancedViewComposite { protected ProfilingTable treeComp = null; protected List columnData = null; @@ -67,7 +68,7 @@ public class FunctionUsageProfilingView extends DAViewComposite { AnalyzerConstants.SORT_TYPE_NUM }; public FunctionUsageProfilingView(Composite parent, int style) { - super(parent, style, true); + super(parent, style, true, true); this.setLayout(new FillLayout()); setTitle(SummaryLabels.FUNCTION_USER_PROFILING_VIEW_TITLE); @@ -89,6 +90,7 @@ public class FunctionUsageProfilingView extends DAViewComposite { treeComp.setTableName(SummaryLabels.FUNCTION_USER_PROFILING_VIEW_TITLE); contents.addControlListener(new TableColumnSizePackListener(treeComp, columnSizes)); + setTable(treeComp); } private void createColumnData() { diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/profiling/ProfilingTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/profiling/ProfilingTable.java index d12d225..0c01261 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/profiling/ProfilingTable.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/profiling/ProfilingTable.java @@ -37,27 +37,35 @@ import org.eclipse.nebula.widgets.grid.GridItem; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseListener; +import org.eclipse.swt.events.PaintEvent; +import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.graphics.GC; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; +import org.eclipse.swt.widgets.Shell; import org.tizen.dynamicanalyzer.common.AnalyzerConstants; import org.tizen.dynamicanalyzer.common.AnalyzerManager; import org.tizen.dynamicanalyzer.common.DASelectionData; import org.tizen.dynamicanalyzer.constant.CommonConstants; import org.tizen.dynamicanalyzer.model.ColumnData; +import org.tizen.dynamicanalyzer.model.FilterProperty; import org.tizen.dynamicanalyzer.model.TreeInput; +import org.tizen.dynamicanalyzer.nl.SummaryLabels; import org.tizen.dynamicanalyzer.ui.range.RangeDataManager; import org.tizen.dynamicanalyzer.ui.range.RangePage; import org.tizen.dynamicanalyzer.ui.summary.SummaryPage; import org.tizen.dynamicanalyzer.ui.toolbar.Toolbar; +import org.tizen.dynamicanalyzer.ui.widgets.FilterDialog; import org.tizen.dynamicanalyzer.ui.widgets.table.DATableDataFormat; import org.tizen.dynamicanalyzer.ui.widgets.table.DATableHeaderRenderer; import org.tizen.dynamicanalyzer.ui.widgets.table.DATreeComposite; import org.tizen.dynamicanalyzer.ui.widgets.table.TreeDataComparator; import org.tizen.dynamicanalyzer.util.Logger; +import org.tizen.dynamicanalyzer.util.WorkbenchUtil; import org.tizen.dynamicanalyzer.utils.Formatter; public class ProfilingTable extends DATreeComposite { @@ -155,6 +163,75 @@ public class ProfilingTable extends DATreeComposite { } } } + + @Override + public List getColumnsName() { + List columnsName = new ArrayList(); + GridColumnGroup[] columnGroups = table.getColumnGroups(); + GridColumn[] columns = table.getColumns(); + + /* lib/func name */ + columnsName.add(columns[0].getText()); + + /* exclusive group */ + columnsName.add(SummaryLabels.FUNCTION_USER_PROFILING_VIEW_EXCLUSIVE_PREFIX + + (columnGroups[0].getColumns())[0].getText()); + columnsName.add(SummaryLabels.FUNCTION_USER_PROFILING_VIEW_EXCLUSIVE_PREFIX + + (columnGroups[0].getColumns())[1].getText()); + columnsName.add(SummaryLabels.FUNCTION_USER_PROFILING_VIEW_EXCLUSIVE_PREFIX + + (columnGroups[0].getColumns())[2].getText()); + + /* inclusive group */ + columnsName.add(SummaryLabels.FUNCTION_USER_PROFILING_VIEW_INCLUSIVE_PREFIX + + (columnGroups[1].getColumns())[0].getText()); + columnsName.add(SummaryLabels.FUNCTION_USER_PROFILING_VIEW_INCLUSIVE_PREFIX + + (columnGroups[1].getColumns())[1].getText()); + columnsName.add(SummaryLabels.FUNCTION_USER_PROFILING_VIEW_INCLUSIVE_PREFIX + + (columnGroups[1].getColumns())[2].getText()); + + /* call count */ + columnsName.add(columns[1].getText()); + + return columnsName; + } + + @Override + protected void applyFilterImage() { + table.addPaintListener(new PaintListener() { + + @Override + public void paintControl(PaintEvent e) { + GC gc = e.gc; + GridColumnGroup[] columnGroups = table.getColumnGroups(); + GridColumn[] columns = table.getColumns(); + List filterProperties = getFilterPropertyList(); + for (int i = 0; i < filterProperties.size(); i++) { + int columnIndex = filterProperties.get(i).getColumnIndex(); + int y = 0; + if (columns[columnIndex].isVisible()) { + switch(columnIndex) { + case 0: + case 7: + y = columnGroups[0].getHeaderRenderer().getBounds().height / 2; + break; + case 1: // included in the column group + case 2: + case 3: + case 4: + case 5: + case 6: + y = columnGroups[0].getHeaderRenderer().getBounds().height; + break; + default: + Logger.error("wrong column index - " + columnIndex); + break; + } + gc.drawImage(filterImg, getFilterImagePosition(columnIndex), y); + } + } + } + }); + } private List getPidsOfProfileDataMakerMap() { if (isRange) { @@ -208,10 +285,14 @@ public class ProfilingTable extends DATreeComposite { final int columnIndex = index; column.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { - comparator.setType(type); - comparator.setColumn(columnIndex); - comparator.reverseDirection(); - updateTree(); + if (checkAndOpenFilterDialog(columnIndex)) { + return; + } else { + comparator.setType(type); + comparator.setColumn(columnIndex); + comparator.reverseDirection(); + updateTree(); + } } }); } diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/warning/WarningListView.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/warning/WarningListView.java index c13718c..63e65e5 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/warning/WarningListView.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/warning/WarningListView.java @@ -35,6 +35,7 @@ import org.eclipse.swt.widgets.Control; import org.tizen.dynamicanalyzer.common.AnalyzerConstants; import org.tizen.dynamicanalyzer.nl.SummaryLabels; import org.tizen.dynamicanalyzer.resources.ColorResources; +import org.tizen.dynamicanalyzer.ui.widgets.DAAdvancedViewComposite; import org.tizen.dynamicanalyzer.ui.widgets.table.DATableComposite; import org.tizen.dynamicanalyzer.ui.widgets.table.DefaultTableComparator; import org.tizen.dynamicanalyzer.ui.widgets.table.TableColumnSizePackListener; @@ -42,7 +43,7 @@ import org.tizen.dynamicanalyzer.widgets.da.view.DAPageComposite; import org.tizen.dynamicanalyzer.widgets.da.view.DAViewComposite; import org.tizen.dynamicanalyzer.widgets.da.view.DAViewData; -public class WarningListView extends DAViewComposite { +public class WarningListView extends DAAdvancedViewComposite { protected DATableComposite tableComp = null; protected String[] columnNames = { SummaryLabels.WARNING_LIST_VIEW_INDEX, SummaryLabels.WARNING_LIST_VIEW_CATEGORY, @@ -55,7 +56,7 @@ public class WarningListView extends DAViewComposite { AnalyzerConstants.SORT_TYPE_GRID }; public WarningListView(Composite parent, int style) { - super(parent, style, true); + super(parent, style, true, true); this.setLayout(new FillLayout()); setTitle(SummaryLabels.WARNING_LIST_VIEW_TITLE); @@ -73,6 +74,7 @@ public class WarningListView extends DAViewComposite { tableComp.setTableName(SummaryLabels.WARNING_LIST_VIEW_TITLE); contents.addControlListener(new TableColumnSizePackListener(tableComp, columnSizes)); + setTable(tableComp); } @Override diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/warning/WarningTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/warning/WarningTable.java index 7a4affe..25acceb 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/warning/WarningTable.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/summary/warning/WarningTable.java @@ -38,6 +38,7 @@ import org.tizen.dynamicanalyzer.common.AnalyzerConstants; import org.tizen.dynamicanalyzer.common.AnalyzerManager; import org.tizen.dynamicanalyzer.common.DASelectionData; import org.tizen.dynamicanalyzer.listeners.SummaryMouseDoubleClickListener; +import org.tizen.dynamicanalyzer.model.FilterProperty; import org.tizen.dynamicanalyzer.model.TableInput; import org.tizen.dynamicanalyzer.swap.model.data.LogDataFactory; import org.tizen.dynamicanalyzer.swap.model.data.ProbeCommonData; diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/ThreadAPIListTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/ThreadAPIListTable.java index 6508109..2cdac6e 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/ThreadAPIListTable.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/ThreadAPIListTable.java @@ -42,6 +42,7 @@ import org.tizen.dynamicanalyzer.common.AnalyzerManager; import org.tizen.dynamicanalyzer.common.DASelectionData; import org.tizen.dynamicanalyzer.database.SqlConnectionManager; import org.tizen.dynamicanalyzer.error.ErrorCodeManager; +import org.tizen.dynamicanalyzer.model.FilterProperty; import org.tizen.dynamicanalyzer.model.TableInput; import org.tizen.dynamicanalyzer.swap.model.data.ProbeCommonData; import org.tizen.dynamicanalyzer.swap.model.data.SyncData; diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/ThreadAPIListView.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/ThreadAPIListView.java index f21b9d7..a26d625 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/ThreadAPIListView.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/thread/ThreadAPIListView.java @@ -40,11 +40,12 @@ import org.tizen.dynamicanalyzer.ui.range.RangeDataManager; import org.tizen.dynamicanalyzer.ui.thread.type.ThreadPageData; import org.tizen.dynamicanalyzer.ui.timeline.TimelinePage; import org.tizen.dynamicanalyzer.ui.toolbar.Toolbar; +import org.tizen.dynamicanalyzer.ui.widgets.DAAdvancedViewComposite; import org.tizen.dynamicanalyzer.ui.widgets.table.TableColumnSizePackListener; import org.tizen.dynamicanalyzer.widgets.da.view.DAViewComposite; import org.tizen.dynamicanalyzer.widgets.da.view.DAViewData; -public class ThreadAPIListView extends DAViewComposite { +public class ThreadAPIListView extends DAAdvancedViewComposite { private ThreadPageData data; private long analysisStartTime = 0; private long analysisEndTime = 0; @@ -73,7 +74,7 @@ public class ThreadAPIListView extends DAViewComposite { ThreadAPIListTable tableComp = null; public ThreadAPIListView(Composite parent, int style) { - super(parent, style, true); + super(parent, style, true, true); this.setLayout(new FillLayout()); setTitle(ThreadPageLabels.THREAD_API_LIST_VEIW_TITLE); @@ -90,6 +91,7 @@ public class ThreadAPIListView extends DAViewComposite { tableComp.setColumnSize(columnSizes); contents.addControlListener(new TableColumnSizePackListener(tableComp, columnSizes)); + setTable(tableComp); } @Override diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/calltrace/CallTraceTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/calltrace/CallTraceTable.java index 5972bea..02f61e4 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/calltrace/CallTraceTable.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/calltrace/CallTraceTable.java @@ -39,6 +39,7 @@ import org.tizen.dynamicanalyzer.common.AnalyzerConstants; import org.tizen.dynamicanalyzer.common.AnalyzerManager; import org.tizen.dynamicanalyzer.common.DASelectionData; import org.tizen.dynamicanalyzer.common.Global; +import org.tizen.dynamicanalyzer.model.FilterProperty; import org.tizen.dynamicanalyzer.model.TableInput; import org.tizen.dynamicanalyzer.project.BinaryInfo; import org.tizen.dynamicanalyzer.project.ProcessInformation; diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/calltrace/CallTraceView.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/calltrace/CallTraceView.java index 1517d08..c18e141 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/calltrace/CallTraceView.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/calltrace/CallTraceView.java @@ -38,6 +38,7 @@ import org.tizen.dynamicanalyzer.resources.ColorResources; import org.tizen.dynamicanalyzer.ui.info.callstack.CallstackView; import org.tizen.dynamicanalyzer.ui.page.ScreenshotTabComposite; import org.tizen.dynamicanalyzer.ui.timeline.TimelinePage; +import org.tizen.dynamicanalyzer.ui.widgets.DAAdvancedViewComposite; import org.tizen.dynamicanalyzer.ui.widgets.table.DAWindowingTableComposite; import org.tizen.dynamicanalyzer.ui.widgets.table.WindowingTableColumnSizePackListener; import org.tizen.dynamicanalyzer.utils.AnalyzerUtil; @@ -45,7 +46,7 @@ import org.tizen.dynamicanalyzer.widgets.da.view.DATabComposite; import org.tizen.dynamicanalyzer.widgets.da.view.DAViewComposite; import org.tizen.dynamicanalyzer.widgets.da.view.DAViewData; -public class CallTraceView extends DAViewComposite { +public class CallTraceView extends DAAdvancedViewComposite { private DAWindowingTableComposite tableComp; /* disable parameter and return column until we can get those values private String[] columnNames = { TimelinePageLabels.CALL_TRACE_VIEW_TIME, @@ -77,7 +78,7 @@ public class CallTraceView extends DAViewComposite { AnalyzerConstants.SORT_TYPE_STRING }; public CallTraceView(Composite parent, int style) { - super(parent, style, true); + super(parent, style, true, true); this.setLayout(new FillLayout()); setTitle(TimelinePageLabels.CALL_TRACE_VIEW_TITLE); @@ -94,6 +95,7 @@ public class CallTraceView extends DAViewComposite { tableComp.setItemHeightSize(16); contents.addControlListener(new WindowingTableColumnSizePackListener( tableComp, columnSizes)); + setTable(tableComp); } @Override diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/uievent/UIEventListDialog.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/uievent/UIEventListDialog.java index eff2107..634cc18 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/uievent/UIEventListDialog.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/timeline/uievent/UIEventListDialog.java @@ -44,6 +44,7 @@ import org.eclipse.swt.widgets.Shell; import org.tizen.dynamicanalyzer.appearance.DesignConstants; import org.tizen.dynamicanalyzer.common.AnalyzerConstants; import org.tizen.dynamicanalyzer.common.AnalyzerManager; +import org.tizen.dynamicanalyzer.model.FilterProperty; import org.tizen.dynamicanalyzer.model.TableInput; import org.tizen.dynamicanalyzer.nl.TimelinePageLabels; import org.tizen.dynamicanalyzer.nl.WidgetLabels; diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/toolbar/opentrace/SaveFilesTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/toolbar/opentrace/SaveFilesTable.java index c01f13b..aba2454 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/toolbar/opentrace/SaveFilesTable.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/toolbar/opentrace/SaveFilesTable.java @@ -37,6 +37,7 @@ import org.eclipse.swt.widgets.Composite; import org.tizen.dynamicanalyzer.common.AnalyzerConstants; import org.tizen.dynamicanalyzer.common.Global; import org.tizen.dynamicanalyzer.common.path.PathManager; +import org.tizen.dynamicanalyzer.model.FilterProperty; import org.tizen.dynamicanalyzer.model.TableInput; import org.tizen.dynamicanalyzer.nl.AnalyzerLabels; import org.tizen.dynamicanalyzer.project.Project; diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/toolbar/opentrace/TempFilesTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/toolbar/opentrace/TempFilesTable.java index b70c07c..90b7d41 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/toolbar/opentrace/TempFilesTable.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/toolbar/opentrace/TempFilesTable.java @@ -37,6 +37,7 @@ import org.eclipse.swt.widgets.Composite; import org.tizen.dynamicanalyzer.common.Global; import org.tizen.dynamicanalyzer.common.path.PathManager; import org.tizen.dynamicanalyzer.constant.CommonConstants; +import org.tizen.dynamicanalyzer.model.FilterProperty; import org.tizen.dynamicanalyzer.model.TableInput; import org.tizen.dynamicanalyzer.nl.AnalyzerLabels; import org.tizen.dynamicanalyzer.project.Project; diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/toolbar/replayEditor/ReplayEditScreenshotTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/toolbar/replayEditor/ReplayEditScreenshotTable.java index d0b586b..7c33509 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/toolbar/replayEditor/ReplayEditScreenshotTable.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/toolbar/replayEditor/ReplayEditScreenshotTable.java @@ -39,6 +39,7 @@ import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.tizen.dynamicanalyzer.common.AnalyzerConstants; import org.tizen.dynamicanalyzer.common.Global; +import org.tizen.dynamicanalyzer.model.FilterProperty; import org.tizen.dynamicanalyzer.model.TableInput; import org.tizen.dynamicanalyzer.project.ImageInfo; import org.tizen.dynamicanalyzer.ui.widgets.table.DATableComposite; diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/toolbar/replayEditor/ReplayEditTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/toolbar/replayEditor/ReplayEditTable.java index 25344d0..7e1aaea 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/toolbar/replayEditor/ReplayEditTable.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/toolbar/replayEditor/ReplayEditTable.java @@ -39,6 +39,7 @@ import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.tizen.dynamicanalyzer.constant.CommonConstants; +import org.tizen.dynamicanalyzer.model.FilterProperty; import org.tizen.dynamicanalyzer.model.TableInput; import org.tizen.dynamicanalyzer.nl.ReplayEditLabels; import org.tizen.dynamicanalyzer.resources.FontResources; diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/toolbar/setting/FeatureDialogFeaturesTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/toolbar/setting/FeatureDialogFeaturesTable.java index 9eaf0d6..50ddf34 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/toolbar/setting/FeatureDialogFeaturesTable.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/toolbar/setting/FeatureDialogFeaturesTable.java @@ -38,6 +38,7 @@ import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.tizen.dynamicanalyzer.common.DAState; import org.tizen.dynamicanalyzer.constant.CommonConstants; +import org.tizen.dynamicanalyzer.model.FilterProperty; import org.tizen.dynamicanalyzer.model.TreeInput; import org.tizen.dynamicanalyzer.nl.ConfigureLabels; import org.tizen.dynamicanalyzer.resources.ColorResources; diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/userinterface/control/UIControlListTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/userinterface/control/UIControlListTable.java index a0e0b07..0fcac67 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/userinterface/control/UIControlListTable.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/userinterface/control/UIControlListTable.java @@ -44,6 +44,7 @@ import org.eclipse.swt.widgets.Listener; import org.tizen.dynamicanalyzer.common.AnalyzerManager; import org.tizen.dynamicanalyzer.common.DASelectionData; import org.tizen.dynamicanalyzer.common.Global; +import org.tizen.dynamicanalyzer.model.FilterProperty; import org.tizen.dynamicanalyzer.model.TreeInput; import org.tizen.dynamicanalyzer.project.ImageInfo; import org.tizen.dynamicanalyzer.swap.model.data.ControlData; diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/userinterface/profiling/UIFunctionProfilingTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/userinterface/profiling/UIFunctionProfilingTable.java index 30b62d6..3f9d1e1 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/userinterface/profiling/UIFunctionProfilingTable.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/userinterface/profiling/UIFunctionProfilingTable.java @@ -48,6 +48,7 @@ import org.tizen.dynamicanalyzer.common.AnalyzerManager; import org.tizen.dynamicanalyzer.common.DASelectionData; import org.tizen.dynamicanalyzer.constant.CommonConstants; import org.tizen.dynamicanalyzer.model.ColumnData; +import org.tizen.dynamicanalyzer.model.FilterProperty; import org.tizen.dynamicanalyzer.model.TreeInput; import org.tizen.dynamicanalyzer.nl.UserInterfacePageLabels; import org.tizen.dynamicanalyzer.ui.summary.profiling.ProfilingData; diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/userinterface/scene/UISceneListTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/userinterface/scene/UISceneListTable.java index c21b276..5d24c52 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/userinterface/scene/UISceneListTable.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/userinterface/scene/UISceneListTable.java @@ -38,6 +38,7 @@ import org.tizen.dynamicanalyzer.common.AnalyzerConstants; import org.tizen.dynamicanalyzer.common.AnalyzerManager; import org.tizen.dynamicanalyzer.common.DASelectionData; import org.tizen.dynamicanalyzer.common.Global; +import org.tizen.dynamicanalyzer.model.FilterProperty; import org.tizen.dynamicanalyzer.model.TableInput; import org.tizen.dynamicanalyzer.project.ImageInfo; import org.tizen.dynamicanalyzer.swap.model.data.SceneData; diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/widgets/DAAdvancedPopupMenu.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/widgets/DAAdvancedPopupMenu.java new file mode 100644 index 0000000..47349ba --- /dev/null +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/widgets/DAAdvancedPopupMenu.java @@ -0,0 +1,93 @@ +/* + * Dynamic Analyzer + * + * Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Seokgil Kang + * Juyoung Kim + * WooJin Jung + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Contributors: + * - S-Core Co., Ltd + * + */ + +package org.tizen.dynamicanalyzer.ui.widgets; + +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.events.MouseListener; +import org.eclipse.swt.events.ShellEvent; +import org.eclipse.swt.events.ShellListener; +import org.eclipse.swt.widgets.Composite; +import org.tizen.dynamicanalyzer.widgets.popupMenu.DAPopupMenu; + +public class DAAdvancedPopupMenu extends DAPopupMenu { + public DAAdvancedPopupMenu(Composite parent) { + super(parent); + } + + @Override + public void setMouseListener() { + getParent().getShell().addShellListener(new ShellListener() { + + @Override + public void shellIconified(ShellEvent e) { + closeChild(); + } + + @Override + public void shellDeiconified(ShellEvent e) { + } + + @Override + public void shellDeactivated(ShellEvent e) { + } + + @Override + public void shellClosed(ShellEvent e) { + closeChild(); + } + + @Override + public void shellActivated(ShellEvent e) { + } + }); + + getParent().addMouseListener(new MouseListener() { + + @Override + public void mouseDoubleClick(MouseEvent e) { + } + + @Override + public void mouseDown(MouseEvent e) { + switch (e.button) { + case 1: { // left button of mouse + closeParent(); + break; + } + default: { + break; + } + } + } + + @Override + public void mouseUp(MouseEvent e) { + } + }); + } +} diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/widgets/DAAdvancedViewComposite.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/widgets/DAAdvancedViewComposite.java new file mode 100644 index 0000000..8a0ca19 --- /dev/null +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/widgets/DAAdvancedViewComposite.java @@ -0,0 +1,275 @@ +/* + * Dynamic Analyzer + * + * Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Seokgil Kang + * Juyoung Kim + * WooJin Jung + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Contributors: + * - S-Core Co., Ltd + * + */ + +package org.tizen.dynamicanalyzer.ui.widgets; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.PaintEvent; +import org.eclipse.swt.events.PaintListener; +import org.eclipse.swt.graphics.GC; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.widgets.Canvas; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.Listener; +import org.eclipse.swt.widgets.Shell; +import org.tizen.dynamicanalyzer.nl.AnalyzerLabels; +import org.tizen.dynamicanalyzer.resources.FontResources; +import org.tizen.dynamicanalyzer.resources.ImageResources; +import org.tizen.dynamicanalyzer.ui.widgets.table.DATableComposite; +import org.tizen.dynamicanalyzer.util.Logger; +import org.tizen.dynamicanalyzer.util.WorkbenchUtil; +import org.tizen.dynamicanalyzer.widgets.da.view.DAViewComposite; +import org.tizen.dynamicanalyzer.widgets.popupMenu.DAPopupMenuItem; +import org.tizen.dynamicanalyzer.widgets.popupMenu.DAPopupMenuListener; + +public class DAAdvancedViewComposite extends DAViewComposite { + private static final int advancedMenuButtonXOffset = 10; + private static final int advancedMenuButtonYOffset = 4; + private DAAdvancedPopupMenu advancedMenu = null; + private static final int advancedMenuWidthOffset = 87; + private static final int advancedMenuHeightOffset = 3; +// private boolean isPopupOpen = false; + + protected DATableComposite ownTable = null; +// private DAAdvancedViewComposite me = null; + + protected enum ADVANCED_MENU_ITEM { + SEARCH(0, AnalyzerLabels.ADVANCED_MENU_SEARCH), + FILTER(1, AnalyzerLabels.ADVANCED_MENU_FILTER); + + public final int index; + public final String name; + + ADVANCED_MENU_ITEM(int index, String name) { + this.index = index; + this.name = name; + } + } + + + public DAAdvancedViewComposite(Composite parent, int style, boolean titleVisibility, + boolean advancedButtonActivation) { + super(parent, style, titleVisibility); + + contentArea = getContentArea(); + createAdvancedMenu(); + + if (titleVisibility) { + if (advancedButtonActivation) { + titleBar = getTitleArea(); + titleBar.addPaintListener(advancedMenuButtonPaintListener); + titleBar.addListener(SWT.MouseUp, advancedMenuButtonMouseUpListener); + } + } + } + + /** + * Returns a list of Integers which are indexes of the disabled menu items + * in the advanced menu. + * + * Note : used only in the DAAdvancedTabComposite + * + * @return the disabled indexes + */ + public List getDisabledMenuIndexes() { + List disabledIndexes = new ArrayList(); + for (int i = 0; i < advancedMenu.getItems().size(); i++) { + if (!advancedMenu.getItem(i).isEnabled()) + disabledIndexes.add(i); + } + return disabledIndexes; + } + + /** + * Set the table object to apply a filter feature. + * + * @param table + * table object to apply a filter feature + */ + protected void setTable(DATableComposite table) { + if (table == null) { + Logger.error("table object is null !!"); + } else { + ownTable = table; + } + } + + /** + * When the table data is updated by updateView() instead of updateTable(), + * below function(setView()) must be called. + * + * Note : It currently used only in the CallstackView class. + * + * @param view + * view object for registration + */ +// protected void setView(DAAdvancedViewComposite view) { +// me = view; +// } + + /** + * Adds a menu item to the advanced menu. + * + * @param itemName + * menu item name + * @param eventListener + * the listener which should be notified when the receiver is selected + */ + protected void addAdvancedMenuItem(String itemName, DAPopupMenuListener eventListener) { + DAPopupMenuItem searchItem = new DAPopupMenuItem(advancedMenu); + searchItem.setText(itemName); + searchItem.addListener(eventListener); + } + + /** + * Disables a menu item that corresponds to the index. + * + * @param itemIndex + * index of the menu item to disable + */ + protected void disableAdvancedMenuItem(int itemIndex) { + DAPopupMenuItem item = advancedMenu.getItem(itemIndex); + if (item != null) { + item.setEnabled(false); + } else { + Logger.debug("Wrong menu index !!"); + } + } + + private void createAdvancedMenu() { + advancedMenu = new DAAdvancedPopupMenu(contentArea); + advancedMenu.setFont(FontResources.CONTEXT_MENU_ITEM_FONT); + + setDefaultMenuItems(); + } + + private void setDefaultMenuItems() { + DAPopupMenuItem searchItem = new DAPopupMenuItem(advancedMenu); + searchItem.setText(ADVANCED_MENU_ITEM.SEARCH.name); + searchItem.addListener(new DAPopupMenuListener() { + @Override + public void widgetSelected(DAPopupMenuItem menuItem) { + Display.getDefault().asyncExec(new Runnable() { + @Override + public void run() { + Shell shell = WorkbenchUtil.getWorkbenchWindow() + .getShell(); + FindDialog findDialog = new FindDialog(shell, ownTable); + findDialog.open(); + } + }); + } + }); + + DAPopupMenuItem filterItem = new DAPopupMenuItem(advancedMenu); + filterItem.setText(ADVANCED_MENU_ITEM.FILTER.name); + filterItem.addListener(new DAPopupMenuListener() { + @Override + public void widgetSelected(DAPopupMenuItem menuItem) { + Display.getDefault().asyncExec(new Runnable() { + @Override + public void run() { + Shell shell = WorkbenchUtil.getWorkbenchWindow() + .getShell(); +// FilterDialog filterDialog = new FilterDialog(shell, me, ownTable, -1); + FilterDialog filterDialog = new FilterDialog(shell, ownTable, -1); + filterDialog.open(); + } + }); + } + }); + } + + private PaintListener advancedMenuButtonPaintListener = new PaintListener() { + + @Override + public void paintControl(PaintEvent e) { + GC gc = e.gc; + + Rectangle bounds = titleBar.getBounds(); + int width = bounds.width; + gc.drawImage(ImageResources.ADVANCED_MENU_BUTTON, width - advancedMenuButtonXOffset, + advancedMenuButtonYOffset); + } + }; + + private Listener advancedMenuButtonMouseUpListener = new Listener() { + + @Override + public void handleEvent(Event event) { + Rectangle bounds = titleBar.getBounds(); + int width = bounds.width; + if (width - advancedMenuButtonXOffset > event.x || event.x > width) { + return; + } + + // 1 means left button of mouse was clicked + if (event.button == 1) { + // TODO : think about how to display the advanced menu +// if (!isPopupOpen) { +// Point p = contentArea.toDisplay(getLocation()); +// advancedMenu.open(advancedMenu.getTopShell(), +// p.x + contentArea.getBounds().width - advancedMenuWidthOffset, +// p.y - advancedMenuHeightOffset); +// isPopupOpen = true; +// } else { +// if (advancedMenu.getTopShell() == null) { // advancedMenu was closed by timer +// Point p = contentArea.toDisplay(getLocation()); +// advancedMenu.open(advancedMenu.getTopShell(), +// p.x + contentArea.getBounds().width - advancedMenuWidthOffset, +// p.y - advancedMenuHeightOffset); +// isPopupOpen = true; +// } else { +// isPopupOpen = false; +// } +// } + +// if (contentArea.getShell() != null && !contentArea.getShell().isDisposed()) { + + // calculate position of advanced popup menu + Point loc = getLocation(); + Point p = contentArea.toDisplay(loc); + int x = 0, y = 0; + x = p.x - loc.x + contentArea.getBounds().width - advancedMenuWidthOffset; + y = p.y - loc.y - advancedMenuHeightOffset; + + advancedMenu.open(advancedMenu.getTopShell(), x, y); + +// } else { +// contentArea.getShell().dispose(); +// } + } + } + }; +} diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/widgets/FilterDialog.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/widgets/FilterDialog.java new file mode 100644 index 0000000..145c9aa --- /dev/null +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/widgets/FilterDialog.java @@ -0,0 +1,551 @@ +/* + * Dynamic Analyzer + * + * Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Seokgil Kang + * Juyoung Kim + * WooJin Jung + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Contributors: + * - S-Core Co., Ltd + * + */ + +package org.tizen.dynamicanalyzer.ui.widgets; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.ScrolledComposite; +import org.eclipse.swt.events.PaintEvent; +import org.eclipse.swt.events.PaintListener; +import org.eclipse.swt.events.ShellAdapter; +import org.eclipse.swt.events.ShellEvent; +import org.eclipse.swt.events.ShellListener; +import org.eclipse.swt.graphics.GC; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.layout.FormAttachment; +import org.eclipse.swt.layout.FormData; +import org.eclipse.swt.layout.FormLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.Listener; +import org.eclipse.swt.widgets.Shell; +import org.tizen.dynamicanalyzer.constant.CommonConstants; +import org.tizen.dynamicanalyzer.model.FilterProperty; +import org.tizen.dynamicanalyzer.nl.AnalyzerLabels; +import org.tizen.dynamicanalyzer.nl.WidgetLabels; +import org.tizen.dynamicanalyzer.resources.ColorResources; +import org.tizen.dynamicanalyzer.resources.ImageResources; +import org.tizen.dynamicanalyzer.ui.widgets.table.DATableComposite; +import org.tizen.dynamicanalyzer.ui.widgets.table.DATreeComposite; +import org.tizen.dynamicanalyzer.ui.widgets.table.DAWindowingTableComposite; +import org.tizen.dynamicanalyzer.util.Logger; +import org.tizen.dynamicanalyzer.widgets.button.DACustomButton; +import org.tizen.dynamicanalyzer.widgets.button.DACustomButtonClickEventListener; +import org.tizen.dynamicanalyzer.widgets.combo.DACustomCombo; +import org.tizen.dynamicanalyzer.widgets.combo.DACustomComboSelectionListener; +import org.tizen.dynamicanalyzer.widgets.da.base.DAButton; +import org.tizen.dynamicanalyzer.widgets.da.base.DADialog; +import org.tizen.dynamicanalyzer.widgets.da.base.DAMessageBox; +import org.tizen.dynamicanalyzer.widgets.da.base.WarningDialog; + +public class FilterDialog extends DAMessageBox { + private ScrolledComposite scrolledComposite = null; + private Composite filterInputComposite = null; + private DAButton addButton = null; + private DAButton clearButton = null; + private DAButton okButton = null; + + private DATableComposite ownTableComposite = null; +// private DAAdvancedViewComposite ownViewComposite = null; + private String compositeName = null; + private int selectedColumnIndex = -1; + + private List filterInputRowList = null; + private FilterColumn[] filterColumns = null; + private int visibleColumnCount = 0; + + class FilterColumn { + String columnName = null; + boolean isSelection = false; + + public FilterColumn(String columnName, boolean isSelection) { + this.columnName = columnName; + this.isSelection = isSelection; + } + + public String getColumnName() { + return columnName; + } + + public boolean getSelection() { + return isSelection; + } + + public void setSelection(boolean isSelection) { + this.isSelection = isSelection; + } + } + + public FilterDialog(Shell parentShell, /*DAAdvancedViewComposite ownView,*/ + DATableComposite composite, int selectedColumnIndex) { + super(parentShell); + + if (composite instanceof DATreeComposite) { + ownTableComposite = (DATreeComposite) composite; + } else if (composite instanceof DAWindowingTableComposite) { + // TODO : It will be supported soon. + } else if (composite instanceof DATableComposite) { + ownTableComposite = (DATableComposite) composite; + } else { + Logger.error("This composite type is not supported !!"); + return; + } + + compositeName = ownTableComposite.getTableName(); + List allColumnName = ownTableComposite.getColumnsName(); + if (allColumnName == null) { + Logger.error("Cannot get all column name !!"); + return; + } + + boolean[] columnVisibility = ownTableComposite.getColumnVisibility(); + if (columnVisibility != null) { + filterColumns = new FilterColumn[columnVisibility.length]; + + for (int i = 0; i < columnVisibility.length; i++) { + if (columnVisibility[i] == true) { + filterColumns[i] = new FilterColumn(allColumnName.get(i), false); + visibleColumnCount++; + } else { + // do nothing!! + } + } + } else { + Logger.error("Column visibility data is wrong !!"); + return; + } + + if (selectedColumnIndex != -1) + this.selectedColumnIndex = selectedColumnIndex; + +// ownViewComposite = ownView; + filterInputRowList = new ArrayList(); + } + + private void initFilterInputRows() { + List filterPropertyList = null; + clearFilterInputRows(); + + filterPropertyList = ownTableComposite.getFilterPropertyList(); + if (filterPropertyList == null || filterPropertyList.isEmpty()) { + return; + } + + for (int i = 0; i < filterPropertyList.size(); i++) { + FilterProperty property = filterPropertyList.get(i); + int columnIndex = property.getColumnIndex(); + // set selected columns + filterColumns[columnIndex].setSelection(true); + FilterInputRow inputRow = null; + if (selectedColumnIndex != -1 && columnIndex == selectedColumnIndex) { + inputRow = new FilterInputRow(filterInputComposite, removeButtonListener, + comboMouseDownListener, true); + } else { + inputRow = new FilterInputRow(filterInputComposite, removeButtonListener, + comboMouseDownListener, false); + } + + inputRow.setComboText(filterColumns[columnIndex].getColumnName()); + inputRow.setKeyWordText(property.getKeyWord()); + inputRow.addSelectionListener(comboSelectionListener); + filterInputRowList.add(inputRow); + } + updateLayout(); + } + + private void updateLayout() { + filterInputComposite.layout(); + scrolledComposite.setMinSize(filterInputComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT)); + if (filterInputRowList.isEmpty()) { + clearButton.setButtonEnabled(false); + } else { + clearButton.setButtonEnabled(true); + } + + if (filterInputRowList.size() >= visibleColumnCount) { + addButton.setButtonEnabled(false); + } else { + addButton.setButtonEnabled(true); + } + } + + @Override + protected boolean run() { + if (ownTableComposite == null) + return false; + + shell.setLayout(new FormLayout()); + shell.setSize(400, 300); // TODO : temporary size +// shell.setBackground(ColorResources.CONFIGURATION_TABLE_COVER_BACKGROUND_COLOR); + shell.setBackground(ColorResources.CONFIGURATION_BUTTON_COVER_BACKGROUND_COLOR); + shell.setText(AnalyzerLabels.FILTER_DLG_TITLE_PREFIX + CommonConstants.SPACE + + compositeName + CommonConstants.SPACE + AnalyzerLabels.FILTER_DLG_TITLE_POSTFIX); + + /* frame composite */ + Composite frameComposite = new Composite(shell, SWT.NONE); + FormData data = new FormData(); + data.top = new FormAttachment(0, 0); + data.left = new FormAttachment(0, 0); + data.right = new FormAttachment(100, 0); + data.bottom = new FormAttachment(100, -50); + frameComposite.setLayoutData(data); + frameComposite.setLayout(new FormLayout()); + frameComposite.setBackground(ColorResources.DIALOG_BG_UPPER); + frameComposite.addPaintListener(new PaintListener() { + + @Override + public void paintControl(PaintEvent e) { + GC gc = e.gc; + + Composite comp = (Composite) e.widget; + Rectangle rect = comp.getClientArea(); + gc.setForeground(ColorResources.SETTING_SUNKEN_LINE_1); + gc.drawLine(0, rect.height - 1, rect.width - 1, rect.height - 1); + gc.setForeground(ColorResources.SETTING_SUNKEN_LINE_2); + gc.drawLine(0, rect.height, rect.width - 1, rect.height); + } + }); + + /* scrolled composite */ + scrolledComposite = new ScrolledComposite(frameComposite, + SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL); + data = new FormData(); + data.top = new FormAttachment(0, 6); + data.left = new FormAttachment(0, 6); + data.right = new FormAttachment(100, -6); + data.bottom = new FormAttachment(100, -40); + scrolledComposite.setLayoutData(data); + scrolledComposite.setLayout(new FormLayout()); + scrolledComposite.setExpandHorizontal(true); + scrolledComposite.setExpandVertical(true); + scrolledComposite.setBackground(ColorResources.BINARY_SETTINGS_INPUT_BOX_COLOR); + + /* filter input composite */ + filterInputComposite = new Composite(scrolledComposite, SWT.NONE); + scrolledComposite.setContent(filterInputComposite); + scrolledComposite.setMinSize(filterInputComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT)); + scrolledComposite.setShowFocusedControl(true); + data = new FormData(); + data.top = new FormAttachment(0, 5); + data.left = new FormAttachment(0, 0); + data.right = new FormAttachment(100, 0); + data.bottom = new FormAttachment(100, -5); + filterInputComposite.setLayoutData(data); + filterInputComposite.setLayout(new FormLayout()); + filterInputComposite.setBackground(ColorResources.BINARY_SETTINGS_INPUT_BOX_COLOR); + + /* buttons */ + clearButton = new DAButton(frameComposite, SWT.NONE); + data = new FormData(); + data.top = new FormAttachment(scrolledComposite, 13); + data.right = new FormAttachment(100, -6); + data.height = 22; + data.width = 78; + clearButton.setLayoutData(data); + clearButton.setText(AnalyzerLabels.FILTER_DLG_CLEAR_BUTTON); + clearButton.addClickListener(clearButtonListener); + + addButton = new DAButton(frameComposite, SWT.NONE); + data = new FormData(); + data.top = new FormAttachment(scrolledComposite, 13); + data.right = new FormAttachment(clearButton, -6); + data.height = 22; + data.width = 78; + addButton.setLayoutData(data); + addButton.setText(AnalyzerLabels.FILTER_DLG_ADD_BUTTON); + addButton.addClickListener(addButtonListener); + + okButton = new DAButton(shell, SWT.NONE); + data = new FormData(); + data.top = new FormAttachment(frameComposite, 10); + data.right = new FormAttachment(100, -6); + data.height = 28; + data.width = 100; + okButton.setLayoutData(data); + okButton.setText(WidgetLabels.OK); + okButton.addClickListener(okButtonListener); + + shell.addShellListener(shellListener); + + return true; + } + + private DACustomButtonClickEventListener clearButtonListener = + new DACustomButtonClickEventListener() { + + @Override + public void handleClickEvent(DACustomButton button) { + WarningDialog dialog = new WarningDialog(shell, SWT.NONE); + dialog.setMessage(AnalyzerLabels.FILTER_DLG_CLEAR_MESSAGE); + boolean result = dialog.open(); + if (!result) { + return; + } else { + clearFilterInputRows(); + clearSelectedColumns(); + updateLayout(); + } + } + }; + + private DACustomButtonClickEventListener addButtonListener = + new DACustomButtonClickEventListener() { + + @Override + public void handleClickEvent(DACustomButton button) { + FilterInputRow inputRow = new FilterInputRow(filterInputComposite, + removeButtonListener, comboMouseDownListener, false); + inputRow.setComboText(getFirstSelectableColumnName()); + inputRow.addSelectionListener(comboSelectionListener); + filterInputRowList.add(inputRow); + updateLayout(); + } + }; + + private DACustomButtonClickEventListener okButtonListener = + new DACustomButtonClickEventListener() { + + @Override + public void handleClickEvent(DACustomButton button) { + ownTableComposite.clearFilterPropertyList(); + int size = filterInputRowList.size(); + for (int i = 0; i < size; i++) { + FilterProperty property = new FilterProperty(); + property.setColumnIndex(getColumnIndex(filterInputRowList.get(i) + .getCurrentlySelectedColumnName())); + String keyWord = filterInputRowList.get(i).getKeyWord(); + // check for keyword validation about null or empty string value + if (keyWord == null || keyWord.isEmpty()) { + DADialog dialog = new DADialog(shell, SWT.NONE); + dialog.setTitleText(WidgetLabels.DA_WARNING); + dialog.setMessage(AnalyzerLabels.FILTER_DLG_KEYWORD_VERIFICATION_MESSAGE); + dialog.setIcon(ImageResources.DIALOG_WARNING_ICON); + dialog.open(); + return; + } else { + property.setKeyWord(filterInputRowList.get(i).getKeyWord()); + } + ownTableComposite.addFilterProperty(property); + } + +// if (ownTableComposite instanceof CallstackTable) { +// if (ownViewComposite != null) { +//// DASelectionData selData = new DASelectionData(ownViewComposite.getID(), time, 0, ownTableComposite.getSelections(), ownTableComposite.getTable()); +// +// ((CallstackView) ownViewComposite).updateView(new DAViewData( +// ScreenshotTabComposite.tabID, null)); +// } else { +// Logger.debug("ownViewComposite is null !!"); +// } +// } else { +// ownTableComposite.updateTable(); +// } + ownTableComposite.updateTable(); + shell.close(); + } + }; + + private DACustomButtonClickEventListener removeButtonListener = new DACustomButtonClickEventListener() { + + @Override + public void handleClickEvent(DACustomButton button) { + // set value of isSelection of currently selected FilterColumn to false + FilterInputRow inputRow = (FilterInputRow) (button.getParent()); + int curColumnIndex = getColumnIndex(inputRow.getCurrentlySelectedColumnName()); + filterColumns[curColumnIndex].setSelection(false); + + // remove input row + removeFilterInputRow(inputRow.getCurrentlySelectedColumnName()); + updateLayout(); + } + }; + + private DACustomComboSelectionListener comboSelectionListener = new DACustomComboSelectionListener() { + + @Override + public void selectionEvent(DACustomCombo combo) { + String prevColumnName = ((FilterInputRow) (combo.getParent())) + .getCurrentlySelectedColumnName(); + String curColumnName = combo.getText(); + if (prevColumnName.compareTo(curColumnName) == 0) { + Logger.debug("same column is selected !!"); + return; + } + + changeColumnSelection(combo); + updateLayout(); + } + }; + + private Listener comboMouseDownListener = new Listener() { + + @Override + public void handleEvent(Event event) { + if (event.type == SWT.MouseDown) { + FilterInputRow inputRow = (FilterInputRow) ((DACustomCombo) (event.widget)) + .getParent(); + List columnNames = makeColumnNames(inputRow + .getCurrentlySelectedColumnName()); + inputRow.addColumnNameComboItems(columnNames); + } + } + }; + + private ShellListener shellListener = new ShellAdapter() { + + @Override + public void shellActivated(ShellEvent e) { + initFilterInputRows(); + shell.removeShellListener(this); + } + }; + + private void clearFilterInputRows() { + for (int i = 0; i < filterInputRowList.size(); i++) { + filterInputRowList.get(i).dispose(); + } + filterInputRowList.clear(); + } + + // set value of isSelection of all FilterColumn to false + private void clearSelectedColumns() { + for (int i = 0; i < filterColumns.length; i++) { + FilterColumn col = filterColumns[i]; + if (col != null) { + col.setSelection(false); + } + } + } + + private void removeFilterInputRow(String columnName) { + FilterInputRow prev = null; + FilterInputRow cur = null; + FilterInputRow next = null; + + for (int i = 0; i < filterInputRowList.size(); i++) { + if (i != 0) + prev = cur; + + cur = filterInputRowList.get(i); + if (i != filterInputRowList.size() - 1) { + next = filterInputRowList.get(i + 1); + } else { + next = null; + } + + if (cur.getCurrentlySelectedColumnName().equalsIgnoreCase(columnName)) { + if (next != null) { + FormData nextData = (FormData) next.getLayoutData(); + if (prev != null) { + nextData.top = new FormAttachment(prev, 2); + } else { + nextData.top = new FormAttachment(0, 0); + } + } + + filterInputRowList.get(i).dispose(); + filterInputRowList.remove(i); + break; + } + } + } + + private void changeColumnSelection(DACustomCombo combo) { + FilterInputRow changedFilterInputRow = (FilterInputRow) (combo.getParent()); + swapSelectionState(changedFilterInputRow.getCurrentlySelectedColumnName(), combo.getText()); + changedFilterInputRow.setCurrentlySelectedColumnName(combo.getText()); + } + + private List getSelectableColumnNames() { + List selectableColumnNames = new ArrayList(); + + /* add selectable column names */ + for (int i = 0; i < filterColumns.length; i++) { + FilterColumn col = filterColumns[i]; + if (col != null && col.getSelection() == false) { + selectableColumnNames.add(col.getColumnName()); + } + } + + return selectableColumnNames; + } + + private String getFirstSelectableColumnName() { + for (int i = 0; i < filterColumns.length; i++) { + FilterColumn col = filterColumns[i]; + if (col != null && col.getSelection() == false) { + col.setSelection(true); + return col.getColumnName(); + } + } + + return CommonConstants.EMPTY; + } + + private List makeColumnNames(String selectedColumnName) { + List columnNames = new ArrayList(); + if (!selectedColumnName.isEmpty()) { + columnNames.add(selectedColumnName); + } else { + Logger.debug("selected column name is empty !!"); + } + + columnNames.addAll(getSelectableColumnNames()); + return columnNames; + } + + private int getColumnIndex(String columnName) { + for (int i = 0; i < filterColumns.length; i++) { + FilterColumn col = filterColumns[i]; + if (col != null + && col.getColumnName().compareTo(columnName) == 0) { + return i; + } + } + + Logger.error("There is not same column name - %s", columnName); + return -1; + } + + // set value of isSelection of previously selected FilterColumn to false + // & set value of isSelection of currently selected FilterColumn to true + private void swapSelectionState(String prevColumnName, String curColumnName) { + int prevColumnIndex = getColumnIndex(prevColumnName); + int curColumnIndex = getColumnIndex(curColumnName); + + if (prevColumnIndex == -1 || curColumnIndex == -1) { + Logger.error("Failed to change selection state !!"); + return; + } else { + filterColumns[prevColumnIndex].setSelection(false); + filterColumns[curColumnIndex].setSelection(true); + } + } +} diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/widgets/FilterInputRow.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/widgets/FilterInputRow.java new file mode 100644 index 0000000..4e3d8b9 --- /dev/null +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/widgets/FilterInputRow.java @@ -0,0 +1,203 @@ +/* + * Dynamic Analyzer + * + * Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: + * Seokgil Kang + * Juyoung Kim + * WooJin Jung + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Contributors: + * - S-Core Co., Ltd + * + */ + +package org.tizen.dynamicanalyzer.ui.widgets; + +import java.util.List; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.layout.FormAttachment; +import org.eclipse.swt.layout.FormData; +import org.eclipse.swt.layout.FormLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Listener; +import org.tizen.dynamicanalyzer.resources.ColorResources; +import org.tizen.dynamicanalyzer.resources.FontResources; +import org.tizen.dynamicanalyzer.resources.ImageResources; +import org.tizen.dynamicanalyzer.widgets.button.DACustomButton; +import org.tizen.dynamicanalyzer.widgets.button.DACustomButtonClickEventListener; +import org.tizen.dynamicanalyzer.widgets.button.DACustomButtonRenderer; +import org.tizen.dynamicanalyzer.widgets.combo.DACustomCombo; +import org.tizen.dynamicanalyzer.widgets.combo.DACustomComboSelectionListener; +import org.tizen.dynamicanalyzer.widgets.da.base.DAText; + +public class FilterInputRow extends Composite { + private DACustomCombo columnNameCombo = null; + private DAText keyWordText = null; + private DACustomButton removeButton = null; + private String currentlySelectedColumnName = null; + + public FilterInputRow(Composite parent, DACustomButtonClickEventListener removeListener, + Listener comboMouseDownListener, boolean isSelected) { + super(parent, SWT.BORDER); + if (isSelected) { +// this.setBackground(ColorResources.EXPLORER_SELECT_START); + this.setBackground(ColorResources.PAGE_CHART_SELECTION_BG); + } else { + this.setBackground(ColorResources.BINARY_SETTINGS_INPUT_BOX_COLOR); + } + + Rectangle parentRect = parent.getBounds(); + Control lastChlid = null; + Control[] children = parent.getChildren(); + if (children.length - 1 > 0) { + lastChlid = children[children.length - 2]; + } + + FormData data = new FormData(); + if (lastChlid != null) { + data.top = new FormAttachment(lastChlid, 1); + } else { + data.top = new FormAttachment(0, 1); + } + data.height = 35; + data.left = new FormAttachment(0, 1); + data.width = parentRect.width - 5; + this.setLayoutData(data); + this.setLayout(new FormLayout()); + + /* column name combo */ + createColumnNameCombo(comboMouseDownListener); + data = new FormData(); + data.top = new FormAttachment(0, 5); + data.left = new FormAttachment(0, 5); + data.width = 120; + data.height = 24; + columnNameCombo.setLayoutData(data); + + /* key word text */ + keyWordText = new DAText(this, SWT.SINGLE); + keyWordText.setBackground(ColorResources.WHITE); + data = new FormData(); + data.top = new FormAttachment(0, 5); + data.left = new FormAttachment(columnNameCombo, 6); + data.width = 205; + data.height = 19; + keyWordText.setLayoutData(data); + + /* remove button */ + removeButton = new DACustomButton(this, ImageResources.DELETE_BUTTON_NORMAL, + ImageResources.DELETE_BUTTON_PUSH, ImageResources.DELETE_BUTTON_HOVER, + ImageResources.DELETE_BUTTON_DISABLE); + data = new FormData(); + data.top = new FormAttachment(0, 7); + data.right = new FormAttachment(100, -5); + data.width = 27; + data.height = 19; + removeButton.setLayoutData(data); + removeButton.addClickListener(removeListener); + } + + private void createColumnNameCombo(Listener comboMouseDownListener) { + columnNameCombo = new DACustomCombo(this, SWT.NONE); + columnNameCombo.setComboGradation( + ColorResources.TAB_COMBO_NORMAL_START, + ColorResources.TAB_COMBO_NORMAL_END, + ColorResources.TAB_COMBO_PUSH_START, + ColorResources.TAB_COMBO_PUSH_END, + ColorResources.TAB_COMBO_HOVER_START, + ColorResources.TAB_COMBO_HOVER_END, + ColorResources.FRAME_RATE_COMBO_DISABLE_START, + ColorResources.FRAME_RATE_COMBO_DISABLE_END); + columnNameCombo.setOutlineColors( + ColorResources.TAB_COMBO_NORMAL_STROKE, + ColorResources.TAB_COMBO_PUSH_STROKE, + ColorResources.TAB_COMBO_HOVER_STROKE, + ColorResources.FRAME_RATE_COMBO_OUTLINE_DISABLE); + columnNameCombo.setComboImages( + ImageResources.TAB_COMBO_BUTTON_DOWN, + ImageResources.TAB_COMBO_BUTTON_DOWN, + ImageResources.TAB_COMBO_BUTTON_DOWN, + ImageResources.TAB_COMBO_BUTTON_DOWN); + columnNameCombo.setComboImagePoint(new Point(108, 10)); + columnNameCombo.setButtonImages( + ImageResources.TAB_COMBO_BUTTON_DOWN, + ImageResources.TAB_COMBO_BUTTON_DOWN); + columnNameCombo.setFontPoint(new Point(7, 5)); + columnNameCombo.setEnabled(true); + columnNameCombo.setComboFont(FontResources.COMBO); + columnNameCombo.setItemFont(FontResources.DROPDOWN); + columnNameCombo.setFontColors( + ColorResources.ADD_CHART_FONT_COLOR, + ColorResources.ADD_CHART_FONT_COLOR, + ColorResources.ADD_CHART_FONT_COLOR, + ColorResources.ADD_CHART_FONT_COLOR); + columnNameCombo.setButtonRenderer(new DACustomButtonRenderer()); + columnNameCombo.addListener(SWT.MouseDown, comboMouseDownListener); + } + + public String getKeyWord() { + return keyWordText.getText(); + } + + public void setKeyWordText(String keyWord) { + keyWordText.setText(keyWord); + } + + public String getCurrentlySelectedColumnName() { + return currentlySelectedColumnName; + } + + public void setCurrentlySelectedColumnName(String columnName) { + currentlySelectedColumnName = columnName; + } + + public void setComboText(String columnName) { + columnNameCombo.add(columnName); + columnNameCombo.setText(columnName); + currentlySelectedColumnName = columnNameCombo.getText(); + } + + /** + * Adds column names to the Column name combo. + * + * @param columnNames + * column names + */ + public void addColumnNameComboItems(List columnNames) { + columnNameCombo.initCombo(); + for (int i = 0; i < columnNames.size(); i++) + columnNameCombo.add(columnNames.get(i)); + + columnNameCombo.setText(columnNames.get(0)); + currentlySelectedColumnName = columnNameCombo.getText(); + } + + /** + * Adds the listener to the Column name combo + * + * @param listener + * the listener which should be notified when the receiver is + * selected + */ + public void addSelectionListener(DACustomComboSelectionListener listener) { + columnNameCombo.addSelectionListener(listener); + } +} diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/widgets/table/DAApiListTableComposite.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/widgets/table/DAApiListTableComposite.java index ad04745..c7240f2 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/widgets/table/DAApiListTableComposite.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/widgets/table/DAApiListTableComposite.java @@ -33,6 +33,7 @@ import java.util.List; import org.eclipse.nebula.widgets.grid.GridItem; import org.eclipse.swt.widgets.Composite; import org.tizen.dynamicanalyzer.common.AnalyzerConstants; +import org.tizen.dynamicanalyzer.model.FilterProperty; import org.tizen.dynamicanalyzer.model.TableInput; public class DAApiListTableComposite extends DATableComposite { diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/widgets/table/DATableComposite.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/widgets/table/DATableComposite.java index f3eeaf1..6d571ca 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/widgets/table/DATableComposite.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/widgets/table/DATableComposite.java @@ -38,12 +38,16 @@ import org.eclipse.nebula.widgets.grid.GridItem; import org.eclipse.swt.SWT; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.KeyListener; +import org.eclipse.swt.events.PaintEvent; +import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; @@ -54,6 +58,7 @@ import org.tizen.dynamicanalyzer.common.SymbolManager.SourceLine; import org.tizen.dynamicanalyzer.communicator.IDECommunicator; import org.tizen.dynamicanalyzer.constant.CommonConstants; import org.tizen.dynamicanalyzer.listeners.TableTooltipListener; +import org.tizen.dynamicanalyzer.model.FilterProperty; import org.tizen.dynamicanalyzer.model.FindProperty; import org.tizen.dynamicanalyzer.model.TableInput; import org.tizen.dynamicanalyzer.nl.TimelineChartLabels; @@ -64,6 +69,7 @@ import org.tizen.dynamicanalyzer.swap.model.data.LogData; import org.tizen.dynamicanalyzer.ui.common.PopupAnalysisMenuItemClickListener; import org.tizen.dynamicanalyzer.ui.range.RangeDataManager; import org.tizen.dynamicanalyzer.ui.widgets.DAGrid; +import org.tizen.dynamicanalyzer.ui.widgets.FilterDialog; import org.tizen.dynamicanalyzer.ui.widgets.FindDialog; import org.tizen.dynamicanalyzer.util.Logger; import org.tizen.dynamicanalyzer.util.WorkbenchUtil; @@ -80,6 +86,9 @@ public abstract class DATableComposite extends Composite { protected DATableComposite me = null; protected static FindProperty findProferty; protected boolean ctrlPressed = false; + + // for filter + protected List filterPropertyList; protected Grid table; protected List selectionIndex; @@ -111,6 +120,9 @@ public abstract class DATableComposite extends Composite { protected RangeDataManager rangeDataManager = RangeDataManager .getInstance(); + + protected static final Image filterImg = ImageResources.OPENGL_SHOW_ONLY_CHANGED_SELECTED; + protected static final int filterImgOffset = 20; public DATableComposite(Composite parent, int style) { this(parent, SWT.NONE, style); @@ -140,6 +152,10 @@ public abstract class DATableComposite extends Composite { me = this; setTableToolTipListener(new TableTooltipListener(table)); + applyFilterImage(); + + // TODO : for test (will be removed) +// createTestFilterData(); } protected Grid createGrid(int tableStyle) { @@ -299,11 +315,15 @@ public abstract class DATableComposite extends Composite { column.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { - comparator.setType(type); - comparator.setColumn(columnIndex); - // comparator.setSourceColumn(sourceColumn); - comparator.reverseDirection(); - updateTable(); + if (checkAndOpenFilterDialog(columnIndex)) { + return; + } else { + comparator.setType(type); + comparator.setColumn(columnIndex); + // comparator.setSourceColumn(sourceColumn); + comparator.reverseDirection(); + updateTable(); + } } }); } @@ -322,6 +342,25 @@ public abstract class DATableComposite extends Composite { } return dbColumnsName; } + + public boolean[] getColumnVisibility() { + if (null == table) + return null; + + GridColumn[] columns = table.getColumns(); + int size = columns.length; + boolean[] columnsVisibility = new boolean[size]; + + for (int i = 0; i < size; i++) { + if (columns[i].getVisible() == true) { + columnsVisibility[i] = true; + } else { + columnsVisibility[i] = false; + } + } + + return columnsVisibility; + } public void setColumnVisibility(boolean[] columnVisibility) { if (null == table || null == columnVisibility) { @@ -377,6 +416,7 @@ public abstract class DATableComposite extends Composite { selSeqs.add(tableData.getSelectionKey()); } } + table.removeAll(); List input = makeTableInput(); @@ -463,6 +503,8 @@ public abstract class DATableComposite extends Composite { table.removeAll(); getSelectionIndex().clear(); getSelections().clear(); + if (filterPropertyList != null) + filterPropertyList.clear(); } public void setComparator(DefaultTableComparator comparator) { @@ -597,6 +639,22 @@ public abstract class DATableComposite extends Composite { public static void setFindProferty(FindProperty findProferty) { DATableComposite.findProferty = findProferty; } + + public List getFilterPropertyList() { + if (filterPropertyList == null) { + filterPropertyList = new ArrayList(); + } + + return filterPropertyList; + } + + public void addFilterProperty(FilterProperty filterProperty) { + getFilterPropertyList().add(filterProperty); + } + + public void clearFilterPropertyList() { + getFilterPropertyList().clear(); + } protected void actionSetStartEnd(int type) { GridItem item = table.getItem(mousePoint); @@ -797,4 +855,88 @@ public abstract class DATableComposite extends Composite { this.itemHeightSize = itemHeightSize; table.setItemHeight(itemHeightSize); } + + protected void applyFilterImage() { + table.addPaintListener(new PaintListener() { + + @Override + public void paintControl(PaintEvent e) { + GC gc = e.gc; + GridColumn[] columns = table.getColumns(); + List filerProperties = getFilterPropertyList(); + for (int i = 0; i < filerProperties.size(); i++) { + int columnIndex = filerProperties.get(i).getColumnIndex(); + if (columns[columnIndex].isVisible()) { + gc.drawImage(filterImg, getFilterImagePosition(columnIndex), 0); + } + } + } + }); + } + + protected int getFilterImagePosition(int columnIndex) { + int position = 0; + if (table.getHorizontalBar().getSelection() > 0) + position -= table.getHorizontalBar().getSelection(); + + GridColumn[] columns = table.getColumns(); + for (int i = 0; i <= columnIndex; i++) { + if (columns[i].isVisible()) { + position += columns[i].getWidth(); + } + } + + return position - filterImgOffset; + } + + protected boolean isFilterAppledColumn(int columnIndex) { + boolean flag = false; + if (filterPropertyList != null && filterPropertyList.size() > 0) { + for (int i = 0; i < filterPropertyList.size(); i++) { + if (columnIndex == filterPropertyList.get(i).getColumnIndex()) { + flag = true; + break; + } + } + } + + return flag; + } + + protected boolean checkAndOpenFilterDialog(int columnIndex) { + // check if this column applies filter + if (!isFilterAppledColumn(columnIndex)) { + return false; + } else { + int pos = getFilterImagePosition(columnIndex); + if (mousePoint.x < pos || mousePoint.x > pos + filterImgOffset) { + return false; + } else { + Shell shell = WorkbenchUtil.getWorkbenchWindow() + .getShell(); +// FilterDialog filterDialog = new FilterDialog(shell, null, me, +// columnIndex); + FilterDialog filterDialog = new FilterDialog(shell, me, columnIndex); + filterDialog.open(); + return true; + } + } + } + + // TODO : for test (will be removed) + private void createTestFilterData() { + if (filterPropertyList == null) { + filterPropertyList = new ArrayList(); + } + + FilterProperty property = new FilterProperty(); + property.setColumnIndex(1); + property.setKeyWord("abc"); + filterPropertyList.add(property); + + property = new FilterProperty(); + property.setColumnIndex(2); + property.setKeyWord("kkk"); + filterPropertyList.add(property); + } } diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/widgets/table/DATreeComposite.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/widgets/table/DATreeComposite.java index 3e6b0f1..6c403f1 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/widgets/table/DATreeComposite.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/widgets/table/DATreeComposite.java @@ -36,7 +36,9 @@ import org.eclipse.nebula.widgets.grid.Grid; import org.eclipse.nebula.widgets.grid.GridItem; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Composite; +import org.tizen.dynamicanalyzer.model.FilterProperty; import org.tizen.dynamicanalyzer.model.TableInput; import org.tizen.dynamicanalyzer.model.TreeInput; import org.tizen.dynamicanalyzer.util.Logger; @@ -58,6 +60,7 @@ public abstract class DATreeComposite extends DATableComposite { public DATreeComposite(Composite parent, int compStyle, int tableStyle) { super(parent, compStyle, tableStyle); + applyFilterImage(); } protected HashMap getExpandMap() { @@ -175,9 +178,8 @@ public abstract class DATreeComposite extends DATableComposite { selSeqs.add(tableData.getSelectionKey()); } table.removeAll(); - - List input = makeTreeInput(); - + + List input = makeTreeInput(); if (null == input) { return; } -- 2.7.4