/*******************************************************************************
 * Copyright (c) 2008 IBM Corporation and others.
 * 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
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.debug.examples.ui.midi.adapters;

import javax.sound.midi.MidiEvent;
import javax.sound.midi.MidiMessage;
import javax.sound.midi.ShortMessage;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.internal.ui.model.elements.ElementLabelProvider;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
import org.eclipse.jface.viewers.TreePath;

/**
 * Provides labels for MIDI tracks.
 * 
 * @since 1.0
 */
public class MidiEventLabelProvider extends ElementLabelProvider {

	/* (non-Javadoc)
	 * @see org.eclipse.debug.internal.ui.model.elements.ElementLabelProvider#getLabel(org.eclipse.jface.viewers.TreePath, org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext, java.lang.String)
	 */
	protected String getLabel(TreePath elementPath, IPresentationContext presentationContext, String columnId) throws CoreException {
		MidiEvent event = (MidiEvent) elementPath.getLastSegment();
		MidiMessage message = event.getMessage();
		if (TrackColumnPresentation.COL_TICK.equals(columnId)) {
			return Long.toString(event.getTick());
		} else if (TrackColumnPresentation.COL_BYTES.equals(columnId)) {
			byte[] bytes = message.getMessage();
			StringBuffer buffer = new StringBuffer();
			for (int i = 0; i < message.getLength(); i++) {
				buffer.append(' ');
				appendByte(buffer, bytes[i]);
			}
			return buffer.toString();
		} else if (TrackColumnPresentation.COL_COMMAND.equals(columnId)) {
			if (message instanceof ShortMessage) {
				ShortMessage sm = (ShortMessage) message;
				StringBuffer buf = new StringBuffer();
				appendByte(buf, (byte)sm.getCommand());
				return buf.toString();
			}
		} else if (TrackColumnPresentation.COL_CHANNEL.equals(columnId)) {
			if (message instanceof ShortMessage) {
				return Integer.toString(((ShortMessage)message).getChannel());
			}
		}
		return "";
	}
	
	/**
	 * Appends a byte to the buffer with 2 hex characters.
	 * 
	 * @param buffer
	 * @param b
	 */
	private void appendByte(StringBuffer buffer, byte b) { 
		String hex = Integer.toHexString(b & 0xFF).toUpperCase();
		for (int i = hex.length(); i < 2; i++) {
			buffer.append('0');
		}
		buffer.append(hex);
	}

}
