Java tutorial
/******************************************************************************* * Copyright (c) 2012 Piotr Kopka * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.kopson.cite.com/legal/epl-v10.html * * Contributors: * Piotr Kopka *******************************************************************************/ package com.kopson.cite.views; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.CellLabelProvider; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.StyledCellLabelProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.ViewerCell; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StyleRange; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.part.ViewPart; import com.kopson.cite.application.Activator; import com.kopson.cite.application.CITE; import com.kopson.cite.application.IImageKeys; import com.kopson.cite.smartlogmodel.SmartLogComparator; import com.kopson.cite.smartlogmodel.SmartLogFilter; import com.kopson.cite.smartlogmodel.TypeEditingSupport; import com.kopson.cite.smartlogmodel.TagEditingSupport; import com.kopson.cite.smartlogmodel.MessageEditingSupport; import com.kopson.cite.smartlogmodel.AssertionEditingSupport; import com.kopson.cite.smartlogmodel.SmartLogProvider; import com.kopson.cite.smartlogmodel.SmartLogEntry; import com.kopson.cite.utils.SearchUtil; /** * Smart log console: * * How to refresh console instance from outside: * * ((SmartLogConsole) getViewSite().getPage().findView(SmartLogConsole.ID).refresh(); * * @author kopson * */ public class SmartLogConsole extends ViewPart { /** * View ID. */ public static final String ID = "com.kopson.cite.views.smartlogconsole"; /** * Comparator */ private SmartLogComparator comparator; /** * Table */ private TableViewer viewer; /** * Filter */ private SmartLogFilter filter; /** * Icons */ private static final Image CHECKED = Activator.getImageDescriptor(IImageKeys.SMARTLOG_CHECKED).createImage(); private static final Image UNCHECKED = Activator.getImageDescriptor(IImageKeys.SMARTLOG_UNCHECKED) .createImage(); /** * Search text. */ private Text searchText; /** * Color */ private static Color colorYellow = Display.getCurrent().getSystemColor(SWT.COLOR_YELLOW); /** * Popup Menu */ private Menu headerMenu; @Override public void createPartControl(Composite parent) { GridLayout layout = new GridLayout(2, false); parent.setLayout(layout); Label searchLabel = new Label(parent, SWT.NONE); searchLabel.setText(CITE.SMARTLOG_SEARCH); searchText = new Text(parent, SWT.BORDER | SWT.SEARCH); searchText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL)); createViewer(parent); // Set the sorter for the table comparator = new SmartLogComparator(); viewer.setComparator(comparator); // New to support the search searchText.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { filter.setSearchText(searchText.getText()); viewer.refresh(); } }); filter = new SmartLogFilter(); viewer.addFilter(filter); } /** * Creates log table viewer * * @param parent */ private void createViewer(Composite parent) { // Define the TableViewer viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER); createColumns(parent); // Make lines and make header visible final Table table = viewer.getTable(); table.setHeaderVisible(true); table.setLinesVisible(true); viewer.setContentProvider(ArrayContentProvider.getInstance()); // Get the content for the Viewer, // setInput will call getElements in the ContentProvider viewer.setInput(SmartLogProvider.INSTANCE.getRow()); // Make the selection available to other Views getSite().setSelectionProvider(viewer); // Layout the viewer GridData gridData = new GridData(); gridData.verticalAlignment = GridData.FILL; gridData.horizontalSpan = 2; gridData.grabExcessHorizontalSpace = true; gridData.grabExcessVerticalSpace = true; gridData.horizontalAlignment = GridData.FILL; viewer.getControl().setLayoutData(gridData); } /** * Used to update the viewer from outsite */ public void refresh() { viewer.refresh(); } /** * This will create the columns for the table * * @param parent */ private void createColumns(final Composite parent) { headerMenu = new Menu(parent.getShell(), SWT.POP_UP); String[] titles = { CITE.SMARTLOG_COLUMN_ID, CITE.SMARTLOG_COLUMN_TYPE, CITE.SMARTLOG_COLUMN_TAG, CITE.SMARTLOG_COLUMN_MESSAGE, CITE.SMARTLOG_COLUMN_OBJECT, CITE.SMARTLOG_COLUMN_ASSERT }; int[] bounds = { 100, 100, 100, 100, 100, 100 }; TableViewerColumn idColumn = createTableViewerColumn(titles[0], bounds[0], 0); idColumn.setLabelProvider(new CellLabelProvider() { @Override public void update(ViewerCell cell) { cell.setText("" + ((SmartLogEntry) cell.getElement()).getId()); } @Override public String getToolTipText(Object element) { return "Tooltip (" + element + ")"; } @Override public Point getToolTipShift(Object object) { return new Point(5, 5); } @Override public int getToolTipDisplayDelayTime(Object object) { return 100; } @Override public int getToolTipTimeDisplayed(Object object) { return 5000; } }); TableViewerColumn typeColumn = createTableViewerColumn(titles[1], bounds[1], 1); typeColumn.setLabelProvider(new StyledCellLabelProvider() { @Override public void update(ViewerCell cell) { String search = searchText.getText(); SmartLogEntry logRow = (SmartLogEntry) cell.getElement(); String cellText = logRow.getType(); cell.setText(cellText); if (search != null && search.length() > 0) { int intRangesCorrectSize[] = SearchUtil.getSearchTermOccurrences(search, cellText); List<StyleRange> styleRange = new ArrayList<StyleRange>(); for (int i = 0; i < intRangesCorrectSize.length / 2; i++) { int start = intRangesCorrectSize[i]; int length = intRangesCorrectSize[++i]; StyleRange myStyledRange = new StyleRange(start, length, null, colorYellow); styleRange.add(myStyledRange); } cell.setStyleRanges(styleRange.toArray(new StyleRange[styleRange.size()])); } else { cell.setStyleRanges(null); } super.update(cell); } }); typeColumn.setEditingSupport(new TypeEditingSupport(viewer)); TableViewerColumn tagColumn = createTableViewerColumn(titles[2], bounds[2], 2); tagColumn.setLabelProvider(new CellLabelProvider() { @Override public void update(ViewerCell cell) { cell.setText(((SmartLogEntry) cell.getElement()).getTag()); } @Override public String getToolTipText(Object element) { return "Tooltip (" + element + ")"; } @Override public Point getToolTipShift(Object object) { return new Point(5, 5); } @Override public int getToolTipDisplayDelayTime(Object object) { return 100; } @Override public int getToolTipTimeDisplayed(Object object) { return 5000; } }); tagColumn.setEditingSupport(new TagEditingSupport(viewer)); TableViewerColumn messageColumn = createTableViewerColumn(titles[3], bounds[3], 3); messageColumn.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { return ((SmartLogEntry) element).getMessage(); } }); messageColumn.setEditingSupport(new MessageEditingSupport(viewer)); TableViewerColumn objectColumn = createTableViewerColumn(titles[4], bounds[4], 4); objectColumn.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { return ((SmartLogEntry) element).getObject(); } //TODO: set meaningful images @Override public Image getImage(Object element) { if (((SmartLogEntry) element).getObject() != null) { return CHECKED; } return UNCHECKED; } }); TableViewerColumn assertColumn = createTableViewerColumn(titles[5], bounds[5], 5); assertColumn.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { return ((SmartLogEntry) element).getAssertion(); } }); assertColumn.setEditingSupport(new AssertionEditingSupport(viewer)); } /** * Creat popup menu items * * @param parent * @param column */ private void createMenuItem(Menu parent, final TableColumn column) { final MenuItem itemName = new MenuItem(parent, SWT.CHECK); itemName.setText(column.getText()); itemName.setSelection(column.getResizable()); itemName.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { if (itemName.getSelection()) { column.setWidth(150); column.setResizable(true); } else { column.setWidth(0); column.setResizable(false); } } }); } /** * Create column. * * @param title * @param bound * @param colNumber * @return */ private TableViewerColumn createTableViewerColumn(String title, int bound, final int colNumber) { final TableViewerColumn viewerColumn = new TableViewerColumn(viewer, SWT.NONE); final TableColumn column = viewerColumn.getColumn(); column.setText(title); column.setWidth(bound); column.setResizable(true); column.setMoveable(true); column.addSelectionListener(getSelectionAdapter(column, colNumber)); // Create the menu item for this column createMenuItem(headerMenu, column); return viewerColumn; } /** * Get selection adapter * * @param column * @param index * @return */ private SelectionAdapter getSelectionAdapter(final TableColumn column, final int index) { SelectionAdapter selectionAdapter = new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { comparator.setColumn(index); int dir = comparator.getDirection(); viewer.getTable().setSortDirection(dir); viewer.getTable().setSortColumn(column); viewer.refresh(); } }; return selectionAdapter; } /** * Passing the focus request to the viewer's control. */ @Override public void setFocus() { viewer.getControl().setFocus(); } }