/*******************************************************************************
 * Copyright (c) 2000, 2006 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
 *     Tom Schindl <tom.schindl@bestsolution.at> - Fix for
 *     		Bug 154289 [Viewers] - NPE in TreeEditorImpl.activateCellEditor
 *******************************************************************************/

package org.eclipse.ui.views.markers.internal;

import java.util.HashMap;
import java.util.Map;

import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.operations.IUndoContext;
import org.eclipse.core.commands.operations.IUndoableOperation;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Item;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.undo.UpdateMarkersOperation;
import org.eclipse.ui.ide.undo.WorkspaceUndoUtil;
import org.eclipse.ui.internal.ide.IDEInternalPreferences;
import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
import org.eclipse.ui.part.CellEditorActionHandler;

/**
 * The BookmarkView is the marker view for bookmarks.
 *
 */
public class BookmarkView extends MarkerView {

	private final IField[] HIDDEN_FIELDS = { new FieldCreationTime() };

	private final static String[] ROOT_TYPES = { IMarker.BOOKMARK };

	private final static String[] TABLE_COLUMN_PROPERTIES = {IMarker.MESSAGE,
		Util.EMPTY_STRING,
		Util.EMPTY_STRING,
		Util.EMPTY_STRING
	};

	private final static String TAG_DIALOG_SECTION = "org.eclipse.ui.views.bookmark"; //$NON-NLS-1$

	private final IField[] VISIBLE_FIELDS = {new FieldMessage(),
			new FieldResource(), new FieldFolder(), new FieldLineNumber() };

	private ICellModifier cellModifier = new ICellModifier() {
		/* (non-Javadoc)
		 * @see org.eclipse.jface.viewers.ICellModifier#getValue(java.lang.Object, java.lang.String)
		 */
		@Override
		public Object getValue(Object element, String property) {
			if (element instanceof ConcreteMarker
					&& IMarker.MESSAGE.equals(property)) {
				return ((ConcreteMarker) element).getDescription();
			}
			return null;
		}

		/* (non-Javadoc)
		 * @see org.eclipse.jface.viewers.ICellModifier#canModify(java.lang.Object, java.lang.String)
		 */
		@Override
		public boolean canModify(Object element, String property) {
			return element instanceof ConcreteMarker && IMarker.MESSAGE.equals(property);
		}

		/* (non-Javadoc)
		 * @see org.eclipse.jface.viewers.ICellModifier#modify(java.lang.Object, java.lang.String, java.lang.Object)
		 */
		@Override
		public void modify(Object element, String property, Object value) {
			if (element instanceof Item) {
				Item item = (Item) element;
				Object data = item.getData();

				if (data instanceof ConcreteMarker) {
					IMarker marker = ((ConcreteMarker) data).getMarker();

					try {
						if (!marker.getAttribute(property).equals(value)) {
							if (IMarker.MESSAGE.equals(property)) {
								Map attrs = new HashMap();
								attrs.put(IMarker.MESSAGE, value);
								IUndoableOperation op = new UpdateMarkersOperation(marker, attrs, MarkerMessages.modifyBookmark_title, true);
						           PlatformUI.getWorkbench().getOperationSupport().getOperationHistory().execute(
						        		   op, null, WorkspaceUndoUtil.getUIInfoAdapter(getSite().getShell()));
							}
						}
					} catch (ExecutionException e) {
						if (e.getCause() instanceof CoreException) {
							ErrorDialog.openError(
									getSite().getShell(),
									MarkerMessages.errorModifyingBookmark, null, ((CoreException)e.getCause()).getStatus());
						} else {
							// something rather unexpected occurred.
							IDEWorkbenchPlugin.log(MarkerMessages.errorModifyingBookmark, e);
						}
					} catch (CoreException e) {
						ErrorDialog.openError(
								getSite().getShell(),
								MarkerMessages.errorModifyingBookmark, null, e.getStatus());
					}
				}
			}
		}
	};

	private CellEditorActionHandler cellEditorActionHandler;

	/* (non-Javadoc)
	 * @see org.eclipse.ui.views.markers.internal.MarkerView#createPartControl(org.eclipse.swt.widgets.Composite)
	 */
	@Override
	public void createPartControl(Composite parent) {
		super.createPartControl(parent);

		TreeViewer treeViewer = getViewer();
		CellEditor cellEditors[] = new CellEditor[treeViewer.getTree()
				.getColumnCount()];
		CellEditor descriptionCellEditor = new TextCellEditor(treeViewer
				.getTree());
		cellEditors[0] = descriptionCellEditor;
		treeViewer.setCellEditors(cellEditors);
		treeViewer.setCellModifier(cellModifier);
		treeViewer.setColumnProperties(TABLE_COLUMN_PROPERTIES);

		cellEditorActionHandler = new CellEditorActionHandler(getViewSite()
				.getActionBars());
		cellEditorActionHandler.addCellEditor(descriptionCellEditor);
		cellEditorActionHandler.setCopyAction(copyAction);
		cellEditorActionHandler.setPasteAction(pasteAction);
		cellEditorActionHandler.setDeleteAction(deleteAction);
		cellEditorActionHandler.setSelectAllAction(selectAllAction);
		cellEditorActionHandler.setUndoAction(undoAction);
		cellEditorActionHandler.setRedoAction(redoAction);
	}

	@Override
	public void dispose() {
		if (cellEditorActionHandler != null) {
			cellEditorActionHandler.dispose();
		}

		super.dispose();
	}

	@Override
	protected IDialogSettings getDialogSettings() {
		IDialogSettings workbenchSettings = IDEWorkbenchPlugin.getDefault().getDialogSettings();
		IDialogSettings settings = workbenchSettings
				.getSection(TAG_DIALOG_SECTION);

		if (settings == null) {
			settings = workbenchSettings.addNewSection(TAG_DIALOG_SECTION);
		}

		return settings;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.ui.views.markers.internal.TableView#getSortingFields()
	 */
	@Override
	protected IField[] getSortingFields() {
		IField[] all = new IField[VISIBLE_FIELDS.length + HIDDEN_FIELDS.length];

		System.arraycopy(VISIBLE_FIELDS, 0, all, 0, VISIBLE_FIELDS.length);
		System.arraycopy(HIDDEN_FIELDS, 0, all, VISIBLE_FIELDS.length, HIDDEN_FIELDS.length);

		return all;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.ui.views.markers.internal.TableView#getAllFields()
	 */
	@Override
	protected IField[] getAllFields() {
		return getSortingFields();
	}

	@Override
	protected String[] getRootTypes() {
		return ROOT_TYPES;
	}


	@Override
	public void setSelection(IStructuredSelection structuredSelection,
			boolean reveal) {
		// TODO: added because nick doesn't like public API inherited from
		// internal classes
		super.setSelection(structuredSelection, reveal);
	}

	/*
	 * (non-Javadoc)
	 *
	 * @see org.eclipse.ui.views.markers.internal.MarkerView#getMarkerTypes()
	 */
	@Override
	protected String[] getMarkerTypes() {
		return new String[] { IMarker.BOOKMARK };
	}

	/* (non-Javadoc)
	 * @see org.eclipse.ui.views.markers.internal.MarkerView#createFiltersDialog()
	 */
	@Override
	protected DialogMarkerFilter createFiltersDialog() {

		MarkerFilter[] filters = getUserFilters();
		BookmarkFilter[] bookmarkFilters = new BookmarkFilter[filters.length];
		System.arraycopy(filters, 0, bookmarkFilters, 0, filters.length);
		return new DialogBookmarkFilter(getSite().getShell(), bookmarkFilters);
	}

	@Override
	protected String getStaticContextId() {
		return PlatformUI.PLUGIN_ID + ".bookmark_view_context"; //$NON-NLS-1$
	}

	/* (non-Javadoc)
	 * @see org.eclipse.ui.views.markers.internal.MarkerView#createFilter(java.lang.String)
	 */
	@Override
	protected MarkerFilter createFilter(String name) {
		return new BookmarkFilter(name);
	}

	/* (non-Javadoc)
	 * @see org.eclipse.ui.views.markers.internal.MarkerView#getSectionTag()
	 */
	@Override
	protected String getSectionTag() {
		return TAG_DIALOG_SECTION;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.ui.views.markers.internal.MarkerView#fillContextMenuAdditions(org.eclipse.jface.action.IMenuManager)
	 */
	@Override
	void fillContextMenuAdditions(IMenuManager manager) {
		//Do nothing in this view

	}

	/* (non-Javadoc)
	 * @see org.eclipse.ui.views.markers.internal.MarkerView#getMarkerEnablementPreferenceName()
	 */
	@Override
	String getMarkerEnablementPreferenceName() {
		return IDEInternalPreferences.LIMIT_BOOKMARKS;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.ui.views.markers.internal.MarkerView#getMarkerLimitPreferenceName()
	 */
	@Override
	String getMarkerLimitPreferenceName() {
		return IDEInternalPreferences.BOOKMARKS_LIMIT;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.ui.views.markers.internal.MarkerView#getFiltersPreferenceName()
	 */
	@Override
	String getFiltersPreferenceName() {
		return IDEInternalPreferences.BOOKMARKS_FILTERS;
	}

	/*
	 * (non-Javadoc)
	 *
	 * @see org.eclipse.ui.views.markers.internal.MarkerView#getMarkerName()
	 */
	@Override
	protected String getMarkerName() {
		return MarkerMessages.bookmark_title;
	}

	/*
	 * (non-Javadoc)
	 * @see org.eclipse.ui.views.markers.internal.MarkerView#getUndoContext()
	 */
	@Override
	protected IUndoContext getUndoContext() {
		return WorkspaceUndoUtil.getBookmarksUndoContext();
	}

}
