/*******************************************************************************
 * Copyright (c) 2003, 2005 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.wst.server.ui.internal.viewers;

import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.swt.graphics.Image;

import org.eclipse.wst.server.core.IServer;
import org.eclipse.wst.server.core.internal.IMonitoredServerPort;
import org.eclipse.wst.server.ui.internal.ImageResource;
import org.eclipse.wst.server.ui.internal.ServerUIPlugin;
/**
 * Monitor port label provider.
 */
public class MonitorLabelProvider extends BaseLabelProvider implements ITableLabelProvider {
	protected IServer server;

	public MonitorLabelProvider(IServer server) {
		super();
		this.server = server;
	}

	public Image getColumnImage(Object element, int columnIndex) {
		IMonitoredServerPort port = (IMonitoredServerPort) element;
		if (columnIndex == 0) {
			if (port.isStarted())
				return ImageResource.getImage(ImageResource.IMG_MONITOR_ON);
			return ImageResource.getImage(ImageResource.IMG_MONITOR_OFF);
		}
		return null;
	}

	public String getColumnText(Object element, int columnIndex) {
		IMonitoredServerPort port = (IMonitoredServerPort) element;
		if (columnIndex == 0) {
			if (port.isStarted())
				return ServerUIPlugin.getResource("%started");
			return ServerUIPlugin.getResource("%stopped");
		} else if (columnIndex == 1)
			return notNull(port.getServerPort().getName());
		else if (columnIndex == 2)
			return port.getServerPort().getPort() + "";
		else if (columnIndex == 3)
			return port.getMonitorPort() + "";
		else {
			String[] content = port.getContentTypes();
			if (content == null || content.length == 0)
				return ServerUIPlugin.getResource("%dialogMonitorContentTypeAll");
			
			StringBuffer sb = new StringBuffer();
			int size = content.length;
			for (int i = 0; i < size; i++) {
				if (i > 0)
					sb.append(",");
				sb.append(getContentTypeString(content[i]));
			}
			return sb.toString();
		}
	}
	
	protected static String getContentTypeString(String s) {
		if ("web".equals(s))
			return ServerUIPlugin.getResource("%dialogMonitorContentTypeWeb");
		else if ("webservices".equals(s))
			return ServerUIPlugin.getResource("%dialogMonitorContentTypeWebServices");
		else
			return s;
	}
}