Java tutorial
/* * Copyright 2013 Alessandro Atria * * 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. */ package org.dynami.views; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.dynami.Activator; import org.dynami.IContentViewManager; import org.dynami.core.service.ITraceManager; import org.dynami.core.util.DUtils; import org.dynami.msg.Trace; import org.dynami.services.EDispatcher; import org.dynami.services.ETraceService; import org.dynami.utils.RCPUtils; import org.eclipse.jface.layout.TableColumnLayout; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.CellLabelProvider; import org.eclipse.jface.viewers.ColumnWeightData; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerCell; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.TraverseEvent; import org.eclipse.swt.events.TraverseListener; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.layout.FormLayout; import org.eclipse.swt.layout.RowData; import org.eclipse.swt.layout.RowLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.part.ViewPart; import org.eclipse.wb.swt.SWTResourceManager; public class TracesView extends ViewPart implements IContentViewManager { public static final String ID = "org.dynami.views.TracesView"; private final ETraceService traceService = RCPUtils.getService(ETraceService.class); private final IPreferenceStore preferenceStore = Activator.getDefault().getPreferenceStore(); private TableViewer tableViewer; private Text textTraceFilter; private TextFilter traceFilter = new TextFilter(); private final VerboseFilter infoFilter = new VerboseFilter(ITraceManager.INFO); private final VerboseFilter warnFilter = new VerboseFilter(ITraceManager.WARN); private final VerboseFilter errorFilter = new VerboseFilter(ITraceManager.ERROR); private final VerboseFilter debugFilter = new VerboseFilter(ITraceManager.DEBUG); private final VerboseFilter marketFilter = new VerboseFilter(ITraceManager.MARKET); private List<Trace> list = new ArrayList<Trace>(); public TracesView() { } private final EDispatcher.EServiceListener<Trace> traceListener = new EDispatcher.EServiceListener<Trace>() { @Override public void update(final Trace msg) { // System.out.println("TracesView.enclosing_method("+msg.line+")"); Display.getDefault().asyncExec(new Runnable() { @Override public void run() { tableViewer.add(msg); tableViewer.getTable().setSelection(tableViewer.getTable().getItemCount() - 1); } }); } }; @Override public void createPartControl(Composite parent) { Composite container = new Composite(parent, SWT.NONE); container.setLayout(new FormLayout()); Composite fltr_composite = new Composite(container, SWT.NONE); fltr_composite.setLayout(new RowLayout(SWT.HORIZONTAL)); FormData fd_fltr_composite = new FormData(); fd_fltr_composite.bottom = new FormAttachment(0, 29); fd_fltr_composite.top = new FormAttachment(0); fd_fltr_composite.left = new FormAttachment(0); fltr_composite.setLayoutData(fd_fltr_composite); Composite tbl_composite = new Composite(container, SWT.NONE); fd_fltr_composite.right = new FormAttachment(tbl_composite, 0, SWT.RIGHT); TableColumnLayout tcl_layout = new TableColumnLayout(); tbl_composite.setLayout(tcl_layout); tableViewer = new TableViewer(tbl_composite, SWT.BORDER | SWT.FULL_SELECTION | SWT.V_SCROLL); tableViewer.setContentProvider(ArrayContentProvider.getInstance()); traceFilter = new TextFilter(); tableViewer.addFilter(traceFilter); FormData fd_table = new FormData(); fd_table.top = new FormAttachment(fltr_composite, 6); fd_table.bottom = new FormAttachment(100); final Button btnFiltermarket = new Button(fltr_composite, SWT.TOGGLE); btnFiltermarket.setSelection(true); btnFiltermarket.setText(""); btnFiltermarket.setToolTipText("Filter market"); btnFiltermarket.setImage(Activator.getImageDescriptor("/icons/trace_market.gif").createImage()); btnFiltermarket.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (((Button) e.getSource()).getSelection()) { tableViewer.removeFilter(marketFilter); tableViewer.refresh(); } else { tableViewer.addFilter(marketFilter); tableViewer.refresh(); } } }); final Button btnFilterinfo = new Button(fltr_composite, SWT.TOGGLE); btnFilterinfo.setSelection(true); btnFilterinfo.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (((Button) e.getSource()).getSelection()) { tableViewer.removeFilter(infoFilter); tableViewer.refresh(); } else { tableViewer.addFilter(infoFilter); tableViewer.refresh(); } } }); btnFilterinfo.setToolTipText("Info Filter"); btnFilterinfo.setText(""); btnFilterinfo.setImage(Activator.getImageDescriptor("/icons/trace_info.gif").createImage()); Button btnFilterwarn = new Button(fltr_composite, SWT.TOGGLE); btnFilterwarn.setSelection(true); btnFilterwarn.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (((Button) e.getSource()).getSelection()) { tableViewer.removeFilter(warnFilter); tableViewer.refresh(); } else { tableViewer.addFilter(warnFilter); tableViewer.refresh(); } } }); btnFilterwarn.setText(""); btnFilterwarn.setToolTipText("Warning filter"); btnFilterwarn.setImage(Activator.getImageDescriptor("/icons/trace_warn.gif").createImage()); Button btnFiltererror = new Button(fltr_composite, SWT.TOGGLE); btnFiltererror.setSelection(true); btnFiltererror.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (((Button) e.getSource()).getSelection()) { tableViewer.removeFilter(errorFilter); tableViewer.refresh(); } else { tableViewer.addFilter(errorFilter); tableViewer.refresh(); } } }); btnFiltererror.setToolTipText("Error filter"); btnFiltererror.setImage(Activator.getImageDescriptor("/icons/trace_error.gif").createImage()); btnFiltererror.setText(""); Button btnFilterdebug = new Button(fltr_composite, SWT.TOGGLE); btnFilterdebug.setSelection(true); btnFilterdebug.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (((Button) e.getSource()).getSelection()) { tableViewer.removeFilter(debugFilter); } else { tableViewer.addFilter(debugFilter); } } }); btnFilterdebug.setToolTipText("Debug filter"); btnFilterdebug.setImage(Activator.getImageDescriptor("/icons/trace_debug.gif").createImage()); btnFilterdebug.setText(""); Label label = new Label(fltr_composite, SWT.SEPARATOR | SWT.VERTICAL); label.setLayoutData(new RowData(2, 25)); textTraceFilter = new Text(fltr_composite, SWT.BORDER | SWT.WRAP); textTraceFilter.setLayoutData(new RowData(281, SWT.DEFAULT)); textTraceFilter.setText(""); textTraceFilter.addTraverseListener(new TraverseListener() { @Override public void keyTraversed(TraverseEvent event) { if (event.detail == SWT.TRAVERSE_RETURN) { traceFilter.setSearchText(textTraceFilter.getText()); tableViewer.addFilter(traceFilter); } } }); Button btnSearch = new Button(fltr_composite, SWT.NONE); btnSearch.setToolTipText("Search"); btnSearch.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { traceFilter.setSearchText(textTraceFilter.getText()); tableViewer.addFilter(traceFilter); } }); btnSearch.setImage(Activator.getImageDescriptor("/icons/trace_search.gif").createImage()); Label label_1 = new Label(fltr_composite, SWT.SEPARATOR | SWT.VERTICAL); label_1.setLayoutData(new RowData(2, 24)); Button btnRemove = new Button(fltr_composite, SWT.NONE); btnRemove.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { textTraceFilter.setText(""); traceFilter.setSearchText(""); tableViewer.removeFilter(traceFilter); } }); btnRemove.setToolTipText("Remove"); btnRemove.setImage(Activator.getImageDescriptor("/icons/trace_remove.gif").createImage()); btnRemove.setText(""); fd_table.left = new FormAttachment(0); fd_table.right = new FormAttachment(100); tbl_composite.setLayoutData(fd_table); tableViewer.getTable().setHeaderVisible(true); tableViewer.getTable().setLinesVisible(true); final TableViewerColumn tblclmnDate = new TableViewerColumn(tableViewer, SWT.NONE); tblclmnDate.getColumn().setText("Date"); tcl_layout.setColumnData(tblclmnDate.getColumn(), new ColumnWeightData(10, true)); tblclmnDate.setLabelProvider(new CellLabelProvider() { @Override public void update(ViewerCell cell) { Trace t = (Trace) cell.getElement(); cell.setText(DUtils.LONG_DATE_FORMAT.format(new Date(t.time))); cell.setForeground(getColor(t.type)); } }); final TableViewerColumn tblclmnType = new TableViewerColumn(tableViewer, SWT.NONE); tcl_layout.setColumnData(tblclmnType.getColumn(), new ColumnWeightData(10, true)); tblclmnType.getColumn().setText("Type"); tblclmnType.setLabelProvider(new CellLabelProvider() { @Override public void update(ViewerCell cell) { Trace t = (Trace) cell.getElement(); cell.setText(ITraceManager.KEYS.type(t.type)); cell.setForeground(getColor(t.type)); } }); final TableViewerColumn tblclmnPhase = new TableViewerColumn(tableViewer, SWT.NONE); tblclmnPhase.getColumn().setText("Phase"); tcl_layout.setColumnData(tblclmnPhase.getColumn(), new ColumnWeightData(20, true)); tblclmnPhase.setLabelProvider(new CellLabelProvider() { @Override public void update(ViewerCell cell) { Trace t = (Trace) cell.getElement(); cell.setText(t.phase); cell.setForeground(getColor(t.type)); } }); final TableViewerColumn tblclmnTrace = new TableViewerColumn(tableViewer, SWT.NONE); tblclmnTrace.getColumn().setText("Trace"); tcl_layout.setColumnData(tblclmnTrace.getColumn(), new ColumnWeightData(60, true)); tblclmnTrace.setLabelProvider(new CellLabelProvider() { @Override public void update(ViewerCell cell) { Trace t = (Trace) cell.getElement(); cell.setText(t.line); cell.setForeground(getColor(t.type)); } }); traceService.dispatch().subscribe(traceListener); } @Override public void setFocus() { } public Color getColor(int type) { switch (type) { case ITraceManager.INFO: return getTraceColor(preferenceStore.getString(ITraceManager.KEYS.INFO_COLOR)); case ITraceManager.WARN: return getTraceColor(preferenceStore.getString(ITraceManager.KEYS.WARN_COLOR)); case ITraceManager.ERROR: return getTraceColor(preferenceStore.getString(ITraceManager.KEYS.ERROR_COLOR)); case ITraceManager.DEBUG: return getTraceColor(preferenceStore.getString(ITraceManager.KEYS.DEBUG_COLOR)); case ITraceManager.MARKET: return getTraceColor(preferenceStore.getString(ITraceManager.KEYS.MARKET_COLOR)); default: return null; } } private Color getTraceColor(String in) { String[] tmp = in.split(","); RGB rgb = new RGB(Integer.parseInt(tmp[0]), Integer.parseInt(tmp[1]), Integer.parseInt(tmp[2])); return SWTResourceManager.getColor(rgb); } @Override public void dispose() { traceService.dispatch().unsubscribe(traceListener); super.dispose(); } @Override public void reset() throws Exception { getSite().getShell().getDisplay().asyncExec(new Runnable() { @Override public void run() { list.clear(); tableViewer.getTable().removeAll(); tableViewer.refresh(); } }); } } class TextFilter extends ViewerFilter { private String searchString; public void setSearchText(String s) { // Search must be a substring of the existing value this.searchString = ".*" + s + ".*"; } @Override public boolean select(Viewer viewer, Object parentElement, Object element) { if (searchString == null || searchString.length() == 0) { return true; } Trace trace = (Trace) element; if (trace.line.matches(searchString)) { return true; } return false; } } class VerboseFilter extends ViewerFilter { final int verbose; public VerboseFilter(int verbose) { this.verbose = verbose; } @Override public boolean select(Viewer viewer, Object parentElement, Object element) { Trace trace = (Trace) element; if (verbose == trace.type) { return false; } return true; } }