/*******************************************************************************
 * Copyright (c) 2005 The Regents of the University of California. 
 * This material was produced under U.S. Government contract W-7405-ENG-36 
 * for Los Alamos National Laboratory, which is operated by the University 
 * of California for the U.S. Department of Energy. The U.S. Government has 
 * rights to use, reproduce, and distribute this software. NEITHER THE 
 * GOVERNMENT NOR THE UNIVERSITY MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR 
 * ASSUMES ANY LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified 
 * to produce derivative works, such modified software should be clearly marked, 
 * so as not to confuse it with the version available from LANL.
 * 
 * Additionally, 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
 * 
 * LA-CC 04-115
 *******************************************************************************/
package org.eclipse.ptp.debug.internal.ui;

import java.io.File;

import org.eclipse.cdt.internal.ui.util.ExternalEditorInput;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IStorage;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.debug.core.sourcelookup.containers.LocalFileStorage;
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.debug.ui.IDebugUIConstants;
import org.eclipse.debug.ui.sourcelookup.CommonSourceNotFoundEditorInput;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.Region;
import org.eclipse.ptp.core.resources.FileStorage;
import org.eclipse.ptp.core.util.BitList;
import org.eclipse.ptp.debug.core.model.IPBreakpoint;
import org.eclipse.ptp.debug.core.model.IPStackFrame;
import org.eclipse.ptp.debug.internal.core.sourcelookup.PSourceNotFoundElement;
import org.eclipse.ui.IEditorDescriptor;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorRegistry;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.FileEditorInput;

/**
 * @author Clement chu
 * 
 */
public class PDebugUIUtils {
	/** Find region by given offset in given document
	 * @param document
	 * @param offset
	 * @return
	 */
	static public IRegion findWord(IDocument document, int offset) {
		int start = -1;
		int end = -1;
		try {
			int pos = offset;
			char c;
			while(pos >= 0) {
				c = document.getChar(pos);
				//TODO check java char?
				if (!Character.isJavaIdentifierPart(c))
					break;
				--pos;
			}
			start = pos;
			pos = offset;
			int length = document.getLength();
			while(pos < length) {
				c = document.getChar(pos);
				//TODO check java char?
				if (!Character.isJavaIdentifierPart(c))
					break;
				++pos;
			}
			end = pos;
		}
		catch(BadLocationException x) {
		}
		if (start > -1 && end > -1) {
			if (start == offset && end == offset)
				return new Region(offset, 0);
			else if (start == offset)
				return new Region(start, end - start);
			else
				return new Region(start + 1, end - start - 1);
		}
		return null;
	}

	/** Get current stack frame
	 * @return
	 */
	static public IPStackFrame getCurrentStackFrame() {
		IAdaptable context = DebugUITools.getDebugContext();
		return ( context != null ) ? (IPStackFrame)context.getAdapter( IPStackFrame.class ) : null;
	}
	
	/** Show tasks with standard format
	 * @param array
	 * @return
	 */
	static public String arrayToString(int[] array) {
		if (array.length == 0) {
			return "";
		}
		String msg = "";
		int preTask = array[0];
		msg += preTask;
		boolean isContinue = false;
		for (int i = 1; i < array.length; i++) {
			if (preTask == (array[i] - 1)) {
				preTask = array[i];
				isContinue = true;
				if (i == (array.length - 1)) {
					msg += "-" + array[i];
					break;
				}
				continue;
			}
			if (isContinue)
				msg += "-" + preTask;
			msg += "," + array[i];
			isContinue = false;
			preTask = array[i];
		}
		return msg;
	}
	static public IEditorInput getEditorInput(Object element) {
		if (element instanceof IMarker) {
			IResource resource = ((IMarker) element).getResource();
			if (resource instanceof IFile)
				return new FileEditorInput((IFile) resource);
		}
		if (element instanceof IFile) {
			IFile f = (IFile)element;
			if  (f.exists())
				return new FileEditorInput(f);
			
			return new ExternalEditorInput(new LocalFileStorage(f.getFullPath().toFile()));
		}
		if (element instanceof IPBreakpoint) {
			IPBreakpoint pbk = (IPBreakpoint) element;
			IFile file = null;
			try {
				String handle = pbk.getSourceHandle();
				IPath path = new Path(handle);
				if (path.isValidPath(handle)) {
					IFile[] files = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocation(path);
					if (files.length > 0) {
						file = files[0];
					}
					else {
						File fsfile = new File(handle);
						if (fsfile.isFile() && fsfile.exists()) {
							return new ExternalEditorInput(new LocalFileStorage(fsfile));
						}
					}
				}
			} catch (CoreException e) {
			}
			if (file == null)
				file = (IFile) pbk.getMarker().getResource().getAdapter(IFile.class);
			if (file != null)
				return new FileEditorInput(file);
		}
		if (element instanceof FileStorage || element instanceof LocalFileStorage) {
			return new ExternalEditorInput((IStorage) element);
		}
		if (element instanceof PSourceNotFoundElement) {
			return new CommonSourceNotFoundEditorInput((PSourceNotFoundElement) element);
		}
		return null;
	}
	static public String getEditorId(Object element) {
		String name = null;
		if (element instanceof IFile) {
			name = ((IFile)element).getName();
		}
		if (element instanceof IEditorInput) {
			name = ((IEditorInput)element).getName();
		}
		//if (element instanceof PSourceNotFoundElement)
			//return IDebugUIConstants.ID_COMMON_SOURCE_NOT_FOUND_EDITOR;
		if (name == null)
			return IDebugUIConstants.ID_COMMON_SOURCE_NOT_FOUND_EDITOR;
		
		IEditorRegistry registry = PlatformUI.getWorkbench().getEditorRegistry();
		IEditorDescriptor descriptor = registry.getDefaultEditor(name);
		return (descriptor != null) ? descriptor.getId() : CUIPlugin.EDITOR_ID;
	}
	static public String getEditorId(IEditorInput input, Object element) {
		if (input != null) {
			return getEditorId(input);
		}
		return null;
	}
	
	
	/** Show tasks with standard format
	 * @param tasks
	 * @return
	 */
	static public String showBitList(BitList tasks) {
		if (tasks == null || tasks.isEmpty()) {
			return "";
		}
		return arrayToString(tasks.toArray());
	}
	//self testing
	public static void main(String[] args) {
		BitList tasks = new BitList(0);
		System.out.println(showBitList(tasks));
	}
}
