/*******************************************************************************
 * Copyright (c) 2002, 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 - Initial API and implementation
 *******************************************************************************/
package org.eclipse.core.tools.metadata;

import java.io.File;
import org.eclipse.core.tools.*;
import org.eclipse.jface.action.*;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.TextViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;

/**
 * Dump Contents Spy view. This view shows the contents resulting of a dumping
 * process.
 */
public class DumpContentsView extends SpyView {

	/** Stores the initially assigned view title. */
	private String initialTitle;

	/** The JFace widget that shows the current selected file dump contents. */
	protected TextViewer viewer;

	/** The file names registered in the DumperFactory. */
	protected String[] registeredFileNames;

	/** The dumper factory used to instantiate dumpers. */
	private DumperFactory dumperFactory;

	/** The current selected file. */
	private File currentFile;

	/** The id by which this view is known in the plug-in registry */
	public static final String VIEW_ID = DumpContentsView.class.getName();

	/**
	 * Constructs a DumpContentsView.
	 */
	public DumpContentsView() {
		dumperFactory = DumperFactory.getInstance();
		this.registeredFileNames = dumperFactory.getRegisteredFileNames();
	}

	/**
	 * Creates this view widget and actions.
	 *
	 * @param parent the parent control
	 * @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
	 */
	@Override
	public void createPartControl(final Composite parent) {
		// creates a read-only text viewer
		viewer = new TextViewer(parent, SWT.V_SCROLL | SWT.H_SCROLL);
		viewer.setDocument(new Document());
		viewer.setEditable(false);

		// creates the actions
		final IAction loadFileAction = new LoadFileAction();
		final IAction copySelectionAction = new CopyTextSelectionAction(viewer);
		final IAction clearContentsAction = new ClearTextAction(viewer.getDocument());

		// adds actions to the menu bar
		IMenuManager barMenuManager = getViewSite().getActionBars().getMenuManager();
		barMenuManager.add(loadFileAction);
		barMenuManager.add(copySelectionAction);
		barMenuManager.add(clearContentsAction);

		// creates a context menu with actions and adds it to the viewer control
		MenuManager menuMgr = new MenuManager();
		menuMgr.add(loadFileAction);
		menuMgr.add(copySelectionAction);
		menuMgr.add(clearContentsAction);
		Menu menu = menuMgr.createContextMenu(viewer.getControl());
		viewer.getControl().setMenu(menu);
	}

	/**
	 * Sets the file to be dumped. The view state will be updated to reflect
	 * changes.
	 *
	 * @param file the file to be dumped
	 */
	public void setFile(File file) {
		IDumper dumper = null;

		// tries to get the associated file dumper
		try {
			dumper = dumperFactory.getDumper(file.getName());
		} catch (DumpException de) {
			ErrorUtil.logException(de, null);
			ErrorUtil.showErrorMessage(de.getMessage(), "Error creating file dumper"); //$NON-NLS-1$
			return;
		}

		// dumps file
		IDump dump = dumper.dump(file);
		if (dump.isFailed()) {
			CoreToolsPlugin.getDefault().log("Error during file dump", dump.getFailureReason()); //$NON-NLS-1$
			String message = "File dumping did not complete successfully. Reason: " + dump.getFailureReason(); //$NON-NLS-1$
			ErrorUtil.showErrorMessage(message, "Error during file dump"); //$NON-NLS-1$
		}

		// loads the new dump object
		load(dump);
	}

	/**
	 * Rebuilds the view with the dump object provided.
	 *
	 * @param dump a dump object to be shown on this view
	 */
	private void load(IDump dump) {

		this.currentFile = dump.getFile();

		// now it is safe to get the part title
		// (during createPartControl it gets Workbench window title)
		if (initialTitle == null)
			this.initialTitle = this.getTitle();

		// updates title and title tool tip
		this.setContentDescription(initialTitle + " : " + this.currentFile.getName()); //$NON-NLS-1$
		this.setTitleToolTip("Dump contents for " + this.currentFile.getAbsolutePath()); //$NON-NLS-1$

		// updates viewer
		viewer.getDocument().set(dump.getContents().toString());

		// tries to show summary information in Dump Summary view
		IWorkbenchPage page = this.getSite().getPage();
		String summaryId = DumpSummaryView.VIEW_ID;

		// maybe the summary view is already open
		DumpSummaryView summaryView = (DumpSummaryView) page.findView(summaryId);

		// if it is not the case and the dump failed, tries to open it
		if (summaryView == null && dump.isFailed())
			try {
				summaryView = (DumpSummaryView) page.showView(summaryId);
			} catch (PartInitException pie) {
				ErrorUtil.logException(pie, "Error opening view"); //$NON-NLS-1$
			}

		// if the Dump Summary view is available, updates it
		if (summaryView != null)
			summaryView.load(dump);
	}

	/**
	 * File load action implementation.
	 */
	private class LoadFileAction extends Action {
		/** Sets action text and tool tip. */
		LoadFileAction() {
			this.setText("Load File..."); //$NON-NLS-1$
			this.setToolTipText("Load file..."); //$NON-NLS-1$
		}

		/**
		 * Executes this action, opening a file dialog so the user can select the
		 * file to be dumped. If a file is successfully selected, opens it by
		 * calling <code>#setFile(File)</code>.
		 *
		 * @see DumpContentsView#setFile
		 * @see org.eclipse.jface.action.IAction#run()
		 */
		@Override
		public void run() {
			// opens a file dialog
			FileDialog fileDialog = new FileDialog(viewer.getControl().getShell(), SWT.OPEN);
			fileDialog.setText("Please choose a metadata file to view"); //$NON-NLS-1$
			fileDialog.setFilterExtensions(DumpContentsView.this.registeredFileNames);

			// if a file hasn't been selected, ignore
			String filePath = fileDialog.open();
			if (filePath == null)
				return;

			// opens the selected file
			DumpContentsView.this.setFile(new File(filePath));
		}
	}

}
