/* CpuInstructionTableComposite.java (c) 2012-2015 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(), 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(); } }