com.kopson.cite.views.SmartLogConsole.java Source code

Java tutorial

Introduction

Here is the source code for com.kopson.cite.views.SmartLogConsole.java

Source

/*******************************************************************************
 * 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();
    }

}