v9t9.gui.client.swt.shells.debugger.CpuInstructionTableComposite.java Source code

Java tutorial

Introduction

Here is the source code for v9t9.gui.client.swt.shells.debugger.CpuInstructionTableComposite.java

Source

/*
  CpuInstructionTableComposite.java
    
  (c) 2012 Edward Swartz
    
  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.eclipse.org/legal/epl-v10.html
 */
package v9t9.gui.client.swt.shells.debugger;

import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.resource.FontDescriptor;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.Font;
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.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.ejs.gui.common.FontUtils;

import v9t9.common.cpu.IInstructionEffectLabelProvider;
import v9t9.common.machine.IMachine;

/**
 * @author ejs
 *
 */
public class CpuInstructionTableComposite extends CpuInstructionComposite {
    private Table instTable;
    private Font smallerFont;
    private Font tableFont;
    protected int pageSize = 1;
    private InstLabelProvider instLabelProvider;

    public CpuInstructionTableComposite(Composite parent, int style, IMachine machine_) {
        super(parent, style, machine_);

        GridLayoutFactory.fillDefaults().applyTo(this);

        ///
        instTable = new Table(this, SWT.BORDER + SWT.VIRTUAL + SWT.NO_FOCUS + SWT.FULL_SELECTION);
        //      instTable.setLabelProvider(new InstLabelProvider(
        //            //getDisplay().getSystemColor(SWT.COLOR_RED)
        //            ));
        instLabelProvider = new InstLabelProvider(machine.getCpu().createInstructionEffectLabelProvider());
        GridDataFactory.fillDefaults().grab(true, true).span(1, 1).applyTo(instTable);

        FontDescriptor fontDescriptor = FontUtils.getFontDescriptor(JFaceResources.getTextFont());
        //fontDescriptor = fontDescriptor.increaseHeight(-2);
        tableFont = fontDescriptor.createFont(getDisplay());
        FontDescriptor smallerFontDescriptor = fontDescriptor.increaseHeight(-2);
        smallerFont = smallerFontDescriptor.createFont(getDisplay());

        instTable.setFont(smallerFont);

        GC gc = new GC(getDisplay());
        gc.setFont(smallerFont);
        int charWidth = gc.stringExtent("M").x;
        gc.dispose();

        TableColumn column;

        for (IInstructionEffectLabelProvider.Column col : instLabelProvider.getColumns()) {
            column = new TableColumn(instTable, SWT.LEFT);
            column.setText(col.label);
            column.setMoveable(true);
            column.setWidth(charWidth * (col.width + 2));
        }

        instTable.setHeaderVisible(true);
        instTable.setLinesVisible(true);

        start();
    }

    /* (non-Javadoc)
     * @see v9t9.gui.client.swt.shells.debugger.CpuInstructionComposite#setupEvents()
     */
    @Override
    public void setupEvents() {
        instTable.addListener(SWT.Resize, new Listener() {

            @Override
            public void handleEvent(Event event) {
                pageSize = instTable.getClientArea().height / instTable.getItemHeight() - 1;
            }
        });
        instTable.addListener(SWT.SetData, new Listener() {

            @Override
            public void handleEvent(Event event) {
                if (pageSize == 0)
                    return;

                TableItem item = (TableItem) event.item;
                int index = event.index;

                int start;
                int end;
                Object[] rows;
                synchronized (instHistory) {
                    start = Math.min(instHistory.size(), index / pageSize * pageSize);
                    end = Math.min(start + pageSize, Math.min(instHistory.size(), instTable.getItemCount()));
                    rows = instHistory.subList(start, end).toArray();
                }
                int columnCount = instTable.getColumnCount();
                for (int i = start; i < end; i++) {
                    item = instTable.getItem(i);
                    InstRow row = (InstRow) rows[i - start];
                    for (int c = 0; c < columnCount; c++) {
                        item.setText(c, instLabelProvider.getColumnText(row, c));
                    }
                }
            }
        });
        addDisposeListener(new DisposeListener() {

            @Override
            public void widgetDisposed(DisposeEvent e) {
                tableFont.dispose();
                smallerFont.dispose();

            }
        });
    }

    /* (non-Javadoc)
     * @see v9t9.gui.client.swt.shells.debugger.CpuInstructionComposite#go()
     */
    @Override
    public void go() {
        //instTable.setItemCount(MAX_INST_HISTORY);
    }

    /* (non-Javadoc)
     * @see v9t9.gui.client.swt.shells.debugger.CpuInstructionComposite#flush(java.util.LinkedList)
     */
    @Override
    public void flush() {
        int count;
        synchronized (instHistory) {
            count = instHistory.size();
        }
        instTable.setItemCount(count);
        instTable.setSelection(count - 1); //new int[] { count - 1 });
    }

    protected void resizeTable() {
        for (TableColumn c : instTable.getColumns()) {
            c.pack();
        }
    }

    /* (non-Javadoc)
     * @see v9t9.gui.client.swt.shells.debugger.CpuInstructionComposite#clear()
     */
    @Override
    public void clear() {
        super.clear();
    }

}