sysperfana/perfinvestigator/com.nokia.carbide.cpp.pi.button/src/com/nokia/carbide/cpp/internal/pi/button/ui/BupMapTableViewer.java
author Matti Laitinen <matti.t.laitinen@nokia.com>
Thu, 11 Feb 2010 15:32:31 +0200
changeset 2 b9ab3b238396
child 5 844b047e260d
permissions -rw-r--r--
Initial version of Performance Investigator under EPL

/*
 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
 * All rights reserved.
 * This component and the accompanying materials are made available
 * under the terms of the License "Eclipse Public License v1.0"
 * which accompanies this distribution, and is available
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
 *
 * Initial Contributors:
 * Nokia Corporation - initial contribution.
 *
 * Contributors:
 *
 * Description: 
 *
 */

package com.nokia.carbide.cpp.internal.pi.button.ui;

import java.util.ArrayList;
import java.util.Set;

import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.resource.FontRegistry;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.IFontProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;

import com.nokia.carbide.cpp.pi.button.IBupEventMap;
import com.nokia.carbide.cpp.pi.button.IBupEventMapEditable;

public class BupMapTableViewer extends TableViewer {
	// Set the table column property names
	private final String KEY_CODE_COLUMN 		= Messages.getString("BupMapTableViewer.keycode"); //$NON-NLS-1$
	private final String ENUM_COLUMN 			= Messages.getString("BupMapTableViewer.enum"); //$NON-NLS-1$
	private final String LABEL_COLUMN 			= Messages.getString("BupMapTableViewer.label"); //$NON-NLS-1$
	private static final FontRegistry fontRegistry = new FontRegistry();
	private static Font regularFont = fontRegistry.get(""); //$NON-NLS-1$
	private static Font boldFont = fontRegistry.getBold(""); //$NON-NLS-1$
	private TableColumn columnKeyCode;
	private TableColumn columnEnum;
	private TableColumn columnLabel;
	
	// Set column names
	private String[] columnNames = new String[] { 
			KEY_CODE_COLUMN, 
			ENUM_COLUMN,
			LABEL_COLUMN
			};
	
	public class BupMapEntry {
		public int keyCode;
		public String enumString;
		public String label;
		public boolean modified;
	}

	private ArrayList<BupMapEntry> mapList = new ArrayList<BupMapEntry>();
	private BupMapEntrySorter mapEntrySorter = new BupMapEntrySorter();
	public BupMapTableViewer mapTableViewer = this;
	boolean modifible = false;
	
	public class BupMapEntrySorter extends ViewerSorter {
		// public constants indicating sorting type
		public final static int SORT_BY_KEYCODE = 0;
		public final static int SORT_BY_ENUM = 1;
		public final static int SORT_BY_LABEL = 2;
		
		TableColumn columnCurrentSort = columnKeyCode;
		int dirKeyCode = SWT.UP;
		int dirEnum = SWT.UP;
		int dirLabel = SWT.UP;
		
		public BupMapEntrySorter () {
			super();
		}
		
		// only sort by keyCode
		public int compare(Viewer viewer, Object o1, Object o2) {
			if (!(o1 instanceof BupMapEntry) ||
					!(o2 instanceof BupMapEntry)) {
				return 0;
			}
			
			// ask table for sorting column criterion
			TableColumn tableColumn = ((TableViewer)viewer).getTable().getSortColumn();
			int result = 0;
			if (tableColumn == columnKeyCode) {
				result = new Integer(((BupMapEntry)o1).keyCode).compareTo(((BupMapEntry)o2).keyCode);
				if (dirKeyCode != SWT.UP) {
					result *= -1;
				}
			} else if (tableColumn == columnEnum) {
				result = ((BupMapEntry)o1).enumString.compareTo(((BupMapEntry)o2).enumString);
				if (dirEnum != SWT.UP) {
					result *= -1;
				}
			}else if (tableColumn == columnLabel) {
				result = ((BupMapEntry)o1).label.compareTo(((BupMapEntry)o2).label);
				if (dirLabel != SWT.UP) {
					result *= -1;
				}
			}

			return result;
		}

		/**
		 * @param currentSortColumn
		 */
		public void setSortCriteria(TableColumn columnNewSort) {

			if (columnCurrentSort != columnNewSort) {
				// update sorting column criterion to table
				mapTableViewer.getTable().setSortColumn(columnNewSort);
				columnCurrentSort = columnNewSort;
			} else {
				// update sorting order we keep locally, I wish there was getSortDirection(TableColumn)
				if (columnNewSort == columnKeyCode) {
					dirKeyCode = dirKeyCode == SWT.UP ? SWT.DOWN : SWT.UP;
				} else if (columnNewSort == columnEnum) {
					dirEnum = dirEnum == SWT.UP ? SWT.DOWN : SWT.UP;
				}else if (columnNewSort == columnLabel) {
					dirLabel = dirLabel == SWT.UP ? SWT.DOWN : SWT.UP;
				}
			}
			if (columnNewSort == columnKeyCode) {
				mapTableViewer.getTable().setSortDirection(dirKeyCode);
			} else if (columnNewSort == columnEnum) {
				mapTableViewer.getTable().setSortDirection(dirEnum);
			}else if (columnNewSort == columnLabel) {
				mapTableViewer.getTable().setSortDirection(dirLabel);
			}
		}
		
	}
	
	public class BupMapTableLabelProvider extends LabelProvider implements ITableLabelProvider, IFontProvider {

		/* (non-Javadoc)
		 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
		 */
		public Image getColumnImage(Object arg0, int arg1) {
			return null;
		}

		/* (non-Javadoc)
		 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int)
		 */
		public String getColumnText(Object element, int columnIndex) {
			String result = ""; //$NON-NLS-1$
			BupMapEntry mapEntry = (BupMapEntry) element;
			
			switch(columnIndex) {
				case 0:
					result = Integer.toHexString(mapEntry.keyCode);
					break;
				case 1:
					result = mapEntry.enumString;
					break;
				case 2:
					result = mapEntry.label;
					break;
			}
			return result;
		}

		/* (non-Javadoc)
		 * @see org.eclipse.jface.viewers.IFontProvider#getFont(java.lang.Object)
		 */
		public Font getFont(Object element) {
			if (((BupMapEntry)element).modified) {
				return boldFont;
			}
			return regularFont;
		}
	}

	/**
	 * @param parent
	 */
	public BupMapTableViewer(Composite parent, boolean modify) {
		super(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER | (modify ? SWT.FULL_SELECTION | SWT.SINGLE : SWT.NONE));
		final int KEYCODE_WIDTH = 60;
		final int ENUM_WIDTH = 150;
		final int LABEL_WIDTH = 200;
		
		modifible = modify;
		
		setSorter(mapEntrySorter);
		
		SelectionListener columnSelectinListener = new SelectionListener () {

			public void widgetDefaultSelected(SelectionEvent arg0) {
			}

			public void widgetSelected(SelectionEvent arg0) {
		        // determine new sort column and direction
		        TableColumn currentSortColumn = (TableColumn) arg0.widget;
		        
		        mapEntrySorter.setSortCriteria(currentSortColumn);
		        
		        // sort the data based on column and direction criteria, sort well pick that up from table
		        mapTableViewer.getSorter().sort(mapTableViewer, mapList.toArray());
		        mapTableViewer.setInput(mapList.toArray());
		    }
		};
		
		columnKeyCode = new TableColumn(getTable(), SWT.LEFT, 0);	
		columnKeyCode.setText(Messages.getString("BupMapTableViewer.hex")); //$NON-NLS-1$
		columnKeyCode.setWidth(60);
		columnKeyCode.addSelectionListener (columnSelectinListener);

		columnEnum = new TableColumn(getTable(), SWT.LEFT, 1);	
		columnEnum.setText(Messages.getString("BupMapTableViewer.tKeyCode")); //$NON-NLS-1$
		columnEnum.setWidth(150);
		columnEnum.addSelectionListener (columnSelectinListener);
		
		columnLabel = new TableColumn(getTable(), SWT.LEFT, 2);	
		columnLabel.setText(Messages.getString("BupMapTableViewer.Label")); //$NON-NLS-1$
		columnLabel.setWidth(200);
		columnLabel.addSelectionListener (columnSelectinListener);
		
		setColumnProperties(columnNames);

		Table mappingTable = getTable();
		// initial size, so scroll bar show up
		GridDataFactory.fillDefaults().grab(true, true).hint(KEYCODE_WIDTH + ENUM_WIDTH + LABEL_WIDTH - 15, 200).applyTo(mappingTable);
		mappingTable.setHeaderVisible(true);
		mappingTable.setLinesVisible(true);
		
		setContentProvider(new ArrayContentProvider());
		setLabelProvider(new BupMapTableLabelProvider());
		
		setInput(mapList.toArray(new BupMapEntry[mapList.size()]));
	}
	
	public void loadMap(IBupEventMap map) {
		mapList.clear();
		Set<Integer> keyCodeSet = map.getKeyCodeSet();
		BupMapEntry entry;
		for (Integer keyCode : keyCodeSet) {
			entry = new BupMapEntry();
			entry.keyCode = keyCode.intValue();
			entry.enumString = map.getEnum(keyCode);
			entry.label = map.getLabel(keyCode);
			if (map instanceof IBupEventMapEditable) {
				entry.modified = ((IBupEventMapEditable)map).isModified(keyCode);
			} else {
				entry.modified = false;
			}
			mapList.add(entry);
		}
		setInput(mapList.toArray(new BupMapEntry[mapList.size()]));
	}
}