/*******************************************************************************
 * Copyright (c) 2000, 2015 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.jdt.internal.debug.ui.breakpoints;

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

import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.model.IBreakpoint;
import org.eclipse.jdt.core.ISourceRange;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.search.SearchEngine;
import org.eclipse.jdt.debug.core.IJavaBreakpoint;
import org.eclipse.jdt.debug.core.IJavaClassPrepareBreakpoint;
import org.eclipse.jdt.debug.core.JDIDebugModel;
import org.eclipse.jdt.internal.debug.ui.BreakpointUtils;
import org.eclipse.jdt.internal.debug.ui.JDIDebugUIPlugin;
import org.eclipse.jdt.ui.IJavaElementSearchConstants;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
import org.eclipse.ui.dialogs.SelectionDialog;

/**
 * The workbench action for creating a class load breakpoint
 */
public class AddClassPrepareBreakpointAction implements IWorkbenchWindowActionDelegate {

    /**
     * the current workbench window
     */
    private IWorkbenchWindow workbenchWindow;

    /**
     * Creates the breakpoints from the array of returned selections
     * @param selection the selections form the dialog
     * @since 3.2
     */
    private void createBreakpoints(final Object[] selection) {
    	try {
	        for (int i = 0; i < selection.length; i++) {
	            final IType type = (IType) selection[i];
	            final IResource resource = BreakpointUtils.getBreakpointResource(type);
	            final Map<String, Object> map = new HashMap<>(10);
	            BreakpointUtils.addJavaBreakpointAttributes(map, type);
	            int kind = IJavaClassPrepareBreakpoint.TYPE_CLASS;
	            if (!type.isClass()) {
	                kind = IJavaClassPrepareBreakpoint.TYPE_INTERFACE;
	            }
	            IBreakpoint[] breakpoints = DebugPlugin.getDefault().getBreakpointManager().getBreakpoints(JDIDebugModel.getPluginIdentifier());
	            boolean exists = false;
	            for (int j = 0; j < breakpoints.length; j++) {
	                IJavaBreakpoint breakpoint = (IJavaBreakpoint) breakpoints[j];
	                if (breakpoint instanceof IJavaClassPrepareBreakpoint) {
						String typeName = breakpoint.getTypeName();
						if (typeName != null && typeName.equals(type.getFullyQualifiedName())) {
	                        exists = true;
	                        break;
	                    }
	                }
	            }
	            if (!exists) {
	                ISourceRange range = type.getNameRange();
	                int start = -1;
	                int end = -1;
	                if (range != null) {
	                    start = range.getOffset();
	                    end = start + range.getLength();
	                }
	                final int finalKind = kind;
	                final int finalStart = start;
	                final int finalEnd = end;
	                new Job(BreakpointMessages.AddClassPrepareBreakpointAction_2) {
	                    @Override
						protected IStatus run(IProgressMonitor monitor) {
	                        try {
	                            JDIDebugModel.createClassPrepareBreakpoint(resource, type.getFullyQualifiedName(), finalKind, finalStart, finalEnd, true, map);
	                            return Status.OK_STATUS;
	                        } catch (CoreException e) {
	                            return e.getStatus();
	                        }
	                    }

	                }.schedule();
	            }
	        }
	    } catch(CoreException e) {
	    	JDIDebugUIPlugin.statusDialog(e.getStatus());
	    }
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
     */
    @Override
	public void run(IAction action) {
        Shell shell = JDIDebugUIPlugin.getActiveWorkbenchShell();
        SelectionDialog dialog = null;
        try {
        	dialog = JavaUI.createTypeDialog(shell, workbenchWindow,
        									 SearchEngine.createWorkspaceScope(),
        									 IJavaElementSearchConstants.CONSIDER_CLASSES,
        									 true, "", null); //$NON-NLS-1$
            dialog.setTitle(BreakpointMessages.AddClassPrepareBreakpointAction_0);
            dialog.setMessage(BreakpointMessages.AddClassPrepareBreakpointAction_1);
            if (dialog.open() == IDialogConstants.OK_ID) {
               createBreakpoints(dialog.getResult());
            }
        } catch (CoreException e) {JDIDebugUIPlugin.log(e);}
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
     */
    @Override
	public void selectionChanged(IAction action, ISelection selection) {}

    /* (non-Javadoc)
     * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
     */
    @Override
	public void dispose() {
        workbenchWindow = null;
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow)
     */
    @Override
	public void init(IWorkbenchWindow window) {
        workbenchWindow = window;
    }
}
