/*******************************************************************************
 * Copyright (c) 2000, 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.ltk.ui.refactoring;

import org.eclipse.core.runtime.IAdaptable;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.custom.ViewForm;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;

import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.source.SourceViewer;

import org.eclipse.ui.model.IWorkbenchAdapter;

import org.eclipse.ltk.internal.ui.refactoring.RefactoringUIMessages;

/**
 * An abstract base implementation of a status context viewer that presents
 * textual context information.
 * <p>
 * Subclasses need to implement {@link #createSourceViewer(Composite)} to create
 * the correct source viewer. They should use the method {@link #updateTitle(IAdaptable)}
 * and {@link #setInput(IDocument, IRegion)} to set the title text and image and to
 * populate the source viewer.
 * </p>
 * 
 * @since 3.0
 */
public abstract class TextStatusContextViewer implements IStatusContextViewer {

	private SourceViewer fSourceViewer;
	private ViewForm fForm;
	private CLabel fLabel;
	private Image fPaneImage;

	/**
	 * Returns the internal source viewer.
	 * 
	 * @return the internal source viewer or <code>null</code> if the
	 *  source viewer hasn't been created yet
	 */
	protected SourceViewer getSourceViewer() {
		return fSourceViewer;
	}
	
	/**
	 * Hook to create the source viewer used to present the textual context
	 * information.
	 * 
	 * @param parent the composite to be used as the source viewer's
	 *  parent
	 * @return the source viewer to be used
	 */
	protected abstract SourceViewer createSourceViewer(Composite parent);

	//---- Helper methods to populate viewer -------------------------------

	/**
	 * Updates the title image and text of the pane surrounding the source
	 * viewer. The image and text is determined by retrieving the <code>
	 * IWorkbenchAdapter</code> for the given element. If the element doen't
	 * provide a <code>IWorkbenchAdapter</code> or if the element is <code>
	 * null</code> the image is reseted and a default label is shown.  
	 * 
	 * @param element the element providing the image and label for the title.
	 *  Can be <code>null</code> to reset the image and text
	 */
	protected void updateTitle(IAdaptable element) {
		String title= null;
		ImageDescriptor imageDescriptor= null;
		if (element != null) {
			IWorkbenchAdapter adapter= (IWorkbenchAdapter)element.getAdapter(IWorkbenchAdapter.class);
			if (adapter != null) {
				title= adapter.getLabel(element);
				imageDescriptor= adapter.getImageDescriptor(element);
			}
		}
		if (title == null || title.length() == 0)
			title= RefactoringUIMessages.RefactoringStatusViewer_Problem_context; 
		fLabel.setText(title);
		if (fPaneImage != null) {
			fPaneImage.dispose();
			fPaneImage= null;
		}
		if (imageDescriptor != null) {
			fPaneImage= imageDescriptor.createImage(getControl().getDisplay());
		}
		fLabel.setImage(fPaneImage);
	}
	
	/**
	 * Sets the input of the source viewer to the given document and reveals the
	 * region determined by the given parameter region.
	 * 
	 * @param document the document to present
	 * @param region the region to reveal.
	 */
	protected void setInput(IDocument document, IRegion region) {
		Control ctrl= getControl();
		if (ctrl != null && ctrl.isDisposed())
			ctrl= null;
		try {
			if (ctrl != null)
				ctrl.setRedraw(false);
			fSourceViewer.setInput(document);
			if (region != null && document != null) {
				int offset= region.getOffset();
				int length= region.getLength();
				if (offset >= 0 && length >= 0) {
					fSourceViewer.setSelectedRange(offset, length);
					fSourceViewer.revealRange(offset, length);
				}
			}
		} finally {
			if (ctrl != null)
				ctrl.setRedraw(true);
		}
	}
	
	//---- Methods defined in IStatusContextViewer -------------------------------

	/**
	 * {@inheritDoc}
	 */
	public void createControl(Composite parent) {
		fForm= new ViewForm(parent, SWT.BORDER | SWT.FLAT);
		fForm.marginWidth= 0;
		fForm.marginHeight= 0;
		fLabel= new CLabel(fForm, SWT.NONE);
		fForm.setTopLeft(fLabel);
		fForm.addDisposeListener(new DisposeListener() {
			public void widgetDisposed(DisposeEvent e) {
				if (fPaneImage != null)
					fPaneImage.dispose();
			}
		});
		
		fSourceViewer= createSourceViewer(fForm);
		fSourceViewer.setEditable(false);
		fForm.setContent(fSourceViewer.getControl());
	}

	/**
	 * {@inheritDoc}
	 */
	public Control getControl() {
		return fForm;
	}
}

