ch.qos.logback.beagle.view.TableMediator.java Source code

Java tutorial

Introduction

Here is the source code for ch.qos.logback.beagle.view.TableMediator.java

Source

/**
 * Logback-beagle: The logback Console Plugin for Eclipse 
 * Copyright (C) 2006-2012, QOS.ch. All rights reserved.
 *
 * This program and the accompanying materials are licensed under
 * either the terms of the Eclipse Public License v1.0 as published by
 * the Eclipse Foundation.
 */
package ch.qos.logback.beagle.view;

import java.util.List;

import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.nebula.widgets.grid.Grid;
import org.eclipse.nebula.widgets.grid.GridColumn;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Sash;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.swt.widgets.Tree;

import ch.qos.logback.beagle.Activator;
import ch.qos.logback.beagle.Constants;
import ch.qos.logback.beagle.menu.GridMenuBuilder;
import ch.qos.logback.beagle.preferences.BeaglePreferencesChangeListenter;
import ch.qos.logback.beagle.preferences.BeaglePreferencesPage;
import ch.qos.logback.beagle.tree.LoggerTree;
import ch.qos.logback.beagle.tree.TreeMenuBuilder;
import ch.qos.logback.beagle.util.FontUtil;
import ch.qos.logback.beagle.util.LayoutDataHelper;
import ch.qos.logback.beagle.util.MementoUtil;
import ch.qos.logback.beagle.util.MetricsUtil;
import ch.qos.logback.beagle.util.ResourceUtil;
import ch.qos.logback.beagle.util.SashUtil;
import ch.qos.logback.beagle.view.listener.ColumnControlListener;
import ch.qos.logback.beagle.view.listener.TableControlListener;
import ch.qos.logback.beagle.view.listener.TableItemSelectionListener;
import ch.qos.logback.beagle.view.listener.TableSelectionViaMouseMovements;
import ch.qos.logback.beagle.view.listener.TimeDifferenceMouseListener;
import ch.qos.logback.beagle.view.listener.UnfreezeToolItemListener;
import ch.qos.logback.beagle.visual.ClassicTISBuffer;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.pattern.MessageConverter;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.pattern.Converter;

public class TableMediator {

    static final int OFFSET_FROM_BUTTOM = -10;

    final Grid grid;
    final Tree tree;
    public ClassicTISBuffer classicTISBuffer;
    final Sash sash;
    private final LoggerTree loggerTree;

    public BeaglePreferencesChangeListenter preferencesChangeListenter;

    final Composite parent;
    ConverterFacade converterFacade = new ConverterFacade();
    LoggerContext loggerContext = new LoggerContext();
    Label timeDifferenceLabel;
    Label totalEventsLabel;
    ToolItem unfreezeToolItem;
    MementoUtil mementoUtil;

    public TableMediator(Composite parent, MementoUtil mementoUtil) {
        this.parent = parent;
        this.mementoUtil = mementoUtil;
        this.timeDifferenceLabel = new Label(parent, SWT.LEFT);
        this.totalEventsLabel = new Label(parent, SWT.LEFT);
        this.grid = new Grid(parent, SWT.VIRTUAL | SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI | SWT.BORDER);
        this.tree = new Tree(parent, SWT.BORDER);
        this.sash = new Sash(parent, SWT.VERTICAL);
        this.loggerTree = new LoggerTree(loggerContext, tree);
        init();
    }

    private void init() {
        loggerContext.setName("beagle");

        Font beagleFont = FontUtil.getBeagleFont();
        grid.setFont(beagleFont);
        FontUtil.listenAndAdaptToFontChanges(grid);

        int charHeight = MetricsUtil.computeCharHeight(grid);
        int charWidth = MetricsUtil.computeCharWidth(grid);

        LayoutDataHelper.make(this.totalEventsLabel, 12 * charWidth, charHeight).left(charWidth)
                .bottom(OFFSET_FROM_BUTTOM).set();
        this.totalEventsLabel.setText("0 ?");

        Label separator0Label = new Label(parent, SWT.SEPARATOR | SWT.VERTICAL);
        LayoutDataHelper.make(separator0Label, charWidth, charHeight).bottom(OFFSET_FROM_BUTTOM)
                .rightOf(this.totalEventsLabel, 10).set();

        LayoutDataHelper.make(timeDifferenceLabel, 12 * charWidth, charHeight).bottom(OFFSET_FROM_BUTTOM)
                .rightOf(separator0Label, 10).set();

        ToolBar toolbar = buildToolbarAndItsItems();

        LayoutDataHelper sashLDH = LayoutDataHelper.make(sash).top(5).above(toolbar, -1);
        int sashX = mementoUtil.getSashXCoordinate(Constants.DEFAULT_SASH_X_COORDINATE);
        SashUtil.setXCoordinate(sash, sashLDH.getFormData(), sashX);
        sashLDH.set();
        sash.addListener(SWT.Selection, new SashListener(sash, sashLDH.getFormData()));

        LayoutDataHelper.make(tree).top(5).left(5).leftOf(sash, 0).above(toolbar, -1).set();

        // place grid
        LayoutDataHelper.make(grid).top(5).rightOf(sash, 0).right(-5).above(toolbar, -1).set();

        grid.setHeaderVisible(true);
        grid.setLinesVisible(false);
        grid.setAutoHeight(true);

        grid.addControlListener(new TableControlListener());

        initConverterFacade();

        int bufSize = getPreferredBufferSize();
        classicTISBuffer = new ClassicTISBuffer(this, bufSize);
        createColumns();

        tree.setMenu(TreeMenuBuilder.buildTreeMenu(loggerTree, classicTISBuffer));

        grid.pack();

        preferencesChangeListenter = new BeaglePreferencesChangeListenter(this);

        // when the table is cleared classicTISBuffer's handleEvent method will
        // re-populate the item
        grid.addListener(SWT.SetData, classicTISBuffer);
        grid.addDisposeListener(classicTISBuffer);

        unfreezeToolItem.addSelectionListener(new UnfreezeToolItemListener(this));

        grid.addSelectionListener(new TableItemSelectionListener(this));

        TableSelectionViaMouseMovements myMouseListener = new TableSelectionViaMouseMovements(this);
        grid.addMouseMoveListener(myMouseListener);
        grid.addMouseListener(myMouseListener);
        grid.addMouseTrackListener(myMouseListener);

        grid.addMouseMoveListener(new TimeDifferenceMouseListener(this));

        Menu menu = GridMenuBuilder.buildMenu(classicTISBuffer);
        GridMenuBuilder.addOnMenuSelectionAction(menu, classicTISBuffer);
        grid.setMenu(menu);
        grid.setItemCount(0);

    }

    public Grid getGrid() {
        return grid;
    }

    public ToolItem getUnfreezeToolItem() {
        return unfreezeToolItem;
    }

    public void setBufferSize(int size) {
        classicTISBuffer.setBufferSize(size);
    }

    private ToolBar buildToolbarAndItsItems() {
        ToolBar toolbar = new ToolBar(parent, SWT.HORIZONTAL);
        // place the toolbar on the bottom-right corner
        LayoutDataHelper.make(toolbar).right(-5).bottom(-5).set();

        this.unfreezeToolItem = new ToolItem(toolbar, SWT.PUSH);
        this.unfreezeToolItem.setEnabled(false);
        this.unfreezeToolItem.setImage(ResourceUtil.getImage(ResourceUtil.RELEASE_SCROLL_LOCK_IMG_KEY));
        this.unfreezeToolItem.setToolTipText("?? ");
        return toolbar;
    }

    void disposeOfExistingColumns() {
        for (GridColumn column : grid.getColumns()) {
            column.dispose();
        }
    }

    public void patternChange(String newPattern) {
        if (newPattern != null) {
            converterFacade.setPattern(newPattern);
            converterFacade.start();
            grid.removeAll();
            disposeOfExistingColumns();
            createColumns();
            classicTISBuffer.rebuildEmptyGrid();
        }
    }

    int getPreferredBufferSize() {
        int result = BeaglePreferencesPage.BUFFER_SIZE_PREFERENCE_DEFAULT_VALUE;
        if (Activator.INSTANCE != null) {
            IPreferenceStore pStore = Activator.INSTANCE.getPreferenceStore();
            result = pStore.getInt(BeaglePreferencesPage.BUFFER_SIZE_PREFERENCE);
        }
        return result;
    }

    int getColumnSizeDialogSetting(String columnName, int defaultValue) {
        if (Activator.INSTANCE == null)
            return defaultValue;
        IDialogSettings dialogSettings = Activator.INSTANCE.getDialogSettings();
        try {
            int val = dialogSettings.getInt(Constants.COLUMN_SIZE_DIALOG_SETTINGS_PREFIX + columnName);
            return val;
        } catch (NumberFormatException e) {
            return defaultValue;
        }
    }

    public void createColumns() {
        GridColumn column0 = new GridColumn(this.grid, SWT.NONE);
        column0.setWidth(24);
        List<Converter<ILoggingEvent>> converterList = converterFacade.getConverterList();
        int size = converterList.size();

        for (int i = 0; i < size; i++) {
            Converter<ILoggingEvent> c = converterList.get(i);
            GridColumn column = new GridColumn(grid, SWT.NONE);
            String columnName = converterFacade.computeConverterName(c);
            column.setText(columnName);
            column.setWidth(getColumnSizeDialogSetting(columnName, 100));
            boolean isLast = (i == size - 1);
            column.addControlListener(new ColumnControlListener(grid, columnName, isLast));
            if (c instanceof MessageConverter) {
                column.setWordWrap(true);
            }
        }
    }

    private void initConverterFacade() {
        converterFacade.setContext(loggerContext);
        String pattern = BeaglePreferencesPage.PATTERN_PREFERENCE_DEFAULT_VALUE;
        if (Activator.INSTANCE != null) {
            IPreferenceStore pStore = Activator.INSTANCE.getPreferenceStore();
            pattern = pStore.getString(BeaglePreferencesPage.PATTERN_PREFERENCE);
        }
        converterFacade.setPattern(pattern);
        converterFacade.start();
    }

    public void setTimeDifferenceLabelText(String str) {
        timeDifferenceLabel.setText(str);
    }

    public void setTotalEventsLabelText(String str) {
        totalEventsLabel.setText(str);
    }

    public ConverterFacade getConverterFacade() {
        return converterFacade;
    }

    public LoggerContext getLoggerContext() {
        return loggerContext;
    }

    public LoggerTree getLoggerTree() {
        return loggerTree;
    }

    public Sash getSash() {
        return sash;
    }

}