/*******************************************************************************
 * Copyright (c) 2002, 2018 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.viewers.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;

/**
 * Implements the Metadata Spy view. This view allows the user to browse the
 * known files under a specified directory. "Known files" are those whose names
 * are known by the DumperFactory, thus they can be dumped.
 */
public class MetadataTreeView extends SpyView {

	/**
	 * A JFace widget used to display a tree corresponding to the metadata
	 * directory structure (containing only files of known types).
	 */
	protected AbstractTreeViewer viewer;

	/** The currently selected metadata dir. */
	protected File metadataPath;

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

	/**
	 * Dump file action implementation.
	 */
	private class DumpFileAction extends Action {
		/**
		 * Constructs a DumpFileAction, initializing text and tool tip text.
		 */
		DumpFileAction() {
			this.setText("Dump Selected File"); //$NON-NLS-1$
			this.setToolTipText("Dump selected file"); //$NON-NLS-1$
		}

		/**
		 * This action activates the Dump Contents view with the current selected
		 * file in this view (if any)
		 *
		 * @see org.eclipse.jface.action.IAction#run()
		 */
		@Override
		public void run() {
			IStructuredSelection sel = MetadataTreeView.this.viewer.getStructuredSelection();
			if (sel == null || sel.isEmpty())
				return;

			TreeContentProviderNode fileNode = (TreeContentProviderNode) sel.getFirstElement();

			File file = (File) fileNode.getValue();
			// we have no interest in directories
			if (!file.isFile())
				return;

			try {
				DumpContentsView dumpView = (DumpContentsView) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView(DumpContentsView.VIEW_ID);
				dumpView.setFile(file);
			} catch (PartInitException e) {
				ErrorUtil.showErrorMessage(e.getMessage(), "Error opening view"); //$NON-NLS-1$
				ErrorUtil.logException(e, "Error opening view"); //$NON-NLS-1$
			}
		}
	}

	/**
	 * Select metadata root action implementation.
	 */
	private class SelectMetadataLocationAction extends Action {
		/**
		 * Initializes action's text and tool tip text.
		 */
		SelectMetadataLocationAction() {
			this.setText("Select metadata location..."); //$NON-NLS-1$
			this.setToolTipText("Select metadata location..."); //$NON-NLS-1$
		}

		/**
		 * Executes action, opening a file dialog so the user can select which
		 * metadata directory will be browsed.
		 *
		 * @see org.eclipse.jface.action.IAction#run()
		 */
		@Override
		public void run() {
			DirectoryDialog dirDialog = new DirectoryDialog(viewer.getControl().getShell());

			dirDialog.setText("Open a metadata directory"); //$NON-NLS-1$
			dirDialog.setMessage("Please choose a directory where to look for metadata files"); //$NON-NLS-1$
			if (metadataPath != null)
				dirDialog.setFilterPath(metadataPath.getAbsolutePath());

			String dirPath = dirDialog.open();

			if (dirPath == null)
				return;

			setMetadataRoot(new File(dirPath));
		}
	}

	/**
	 * 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(Composite parent) {
		viewer = new TreeViewer(parent);

		// sets a content provider for the viewer
		DumperFactory factory = DumperFactory.getInstance();
		String[] fileNames = factory.getRegisteredFileNames();
		viewer.setContentProvider(new MetadataTreeContentProvider(fileNames));

		// creates actions
		final IAction dumpFileAction = new DumpFileAction();
		final IAction selectMetadataLocationAction = new SelectMetadataLocationAction();

		// adds actions to the menu bar
		IMenuManager barMenuManager = getViewSite().getActionBars().getMenuManager();
		barMenuManager.add(selectMetadataLocationAction);
		barMenuManager.add(dumpFileAction);

		// creates a context menu with actions and adds it to the viewer control
		MenuManager menuMgr = new MenuManager();
		menuMgr.add(selectMetadataLocationAction);
		menuMgr.add(dumpFileAction);

		Menu menu = menuMgr.createContextMenu(viewer.getControl());
		viewer.getControl().setMenu(menu);

		// associates double-click to dump file action
		viewer.addDoubleClickListener(event -> dumpFileAction.run());
	}

	/**
	 * Rebuilds the viewer content provider.
	 *
	 * @param file
	 * @see WorkspaceContentProvider#inputChanged(Viewer, Object, Object)
	 */
	protected void setMetadataRoot(final File file) {
		if (file == null)
			return;
		if (!file.isDirectory()) {
			ErrorUtil.showErrorMessage("Selected item is not a directory", "Error selecting metadata location"); //$NON-NLS-1$ //$NON-NLS-2$
			return;
		}
		metadataPath = file;
		viewer.setInput(file);
	}

}
