Package org.eclipse.wst.sse.ui.internal.debug

Source Code of org.eclipse.wst.sse.ui.internal.debug.ToggleBreakpointAction

/*******************************************************************************
* Copyright (c) 2001, 2010 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
*     Jens Lukowski/Innoopract - initial renaming/restructuring
*    
*******************************************************************************/
package org.eclipse.wst.sse.ui.internal.debug;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.IBreakpointManager;
import org.eclipse.debug.core.model.IBreakpoint;
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.debug.ui.IDebugUIConstants;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.source.IVerticalRulerInfo;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.texteditor.IDocumentProvider;
import org.eclipse.ui.texteditor.IDocumentProviderExtension4;
import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.wst.sse.core.StructuredModelManager;
import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
import org.eclipse.wst.sse.core.internal.util.Debug;
import org.eclipse.wst.sse.ui.internal.Logger;
import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
import org.eclipse.wst.sse.ui.internal.extension.BreakpointProviderBuilder;
import org.eclipse.wst.sse.ui.internal.provisional.extensions.ISourceEditingTextTools;
import org.eclipse.wst.sse.ui.internal.provisional.extensions.breakpoint.IBreakpointProvider;

/**
* ToggleBreakpointAction
*/
public class ToggleBreakpointAction extends BreakpointRulerAction {
  IAction fFallbackAction;

  /**
   * @param editor
   * @param rulerInfo
   */
  public ToggleBreakpointAction(ITextEditor editor, IVerticalRulerInfo rulerInfo) {
    super(editor, rulerInfo);
    setText(SSEUIMessages.ToggleBreakpointAction_0); //$NON-NLS-1$
  }

  public ToggleBreakpointAction(ITextEditor editor, IVerticalRulerInfo rulerInfo, IAction fallbackAction) {
    this(editor, rulerInfo);
    fFallbackAction = fallbackAction;
  }

  protected boolean createBreakpoints(int lineNumber) {
    /*
     * Note: we'll always allow processing to continue, even for a "read
     * only" IStorageEditorInput, for the ActiveScript debugger. But this
     * means sometimes the ActiveScript provider might get an input from
     * CVS or something that is not related to debugging.
     */

    ITextEditor editor = getTextEditor();
    IEditorInput input = editor.getEditorInput();
    IDocument document = editor.getDocumentProvider().getDocument(input);
    if (document == null)
      return false;

    String contentType = getContentType(document);
    IBreakpointProvider[] providers = BreakpointProviderBuilder.getInstance().getBreakpointProviders(editor, contentType, getFileExtension(input));

    int pos = -1;
    ISourceEditingTextTools tools = (ISourceEditingTextTools) editor.getAdapter(ISourceEditingTextTools.class);
    if (tools != null) {
      pos = tools.getCaretOffset();
    }

    final int n = providers.length;
    List errors = new ArrayList(0);
    for (int i = 0; i < n; i++) {
      try {
        if (Debug.debugBreakpoints)
          System.out.println(providers[i].getClass().getName() + " adding breakpoint to line " + lineNumber); //$NON-NLS-1$
        IStatus status = providers[i].addBreakpoint(document, input, lineNumber, pos);
        if (status != null && !status.isOK()) {
          errors.add(status);
        }
      }
      catch (CoreException e) {
        errors.add(e.getStatus());
      }
      catch (Exception t) {
        Logger.logException("exception while adding breakpoint", t); //$NON-NLS-1$
      }
    }

    IStatus status = null;
    if (errors.size() > 0) {
      Shell shell = editor.getSite().getShell();
      if (errors.size() > 1) {
        status = new MultiStatus(SSEUIPlugin.ID, IStatus.OK, (IStatus[]) errors.toArray(new IStatus[0]), SSEUIMessages.ManageBreakpoints_error_adding_message1, null); //$NON-NLS-1$
      }
      else {
        status = (IStatus) errors.get(0);
      }
      if ((status.getSeverity() > IStatus.INFO) || (Platform.inDebugMode() && !status.isOK())) {
        Platform.getLog(SSEUIPlugin.getDefault().getBundle()).log(status);
      }
      /*
       * Show for conditions more severe than INFO or when no
       * breakpoints were created
       */
      if (status.getSeverity() > IStatus.INFO && getBreakpoints(getMarkers()).length < 1) {
        ErrorDialog.openError(shell, SSEUIMessages.ManageBreakpoints_error_adding_title1, status.getMessage(), status); //$NON-NLS-1$ //$NON-NLS-2$
        return false;
      }
    }
    /*
     * Although no errors were reported, no breakpoints exist on this line
     * after having run the existing providers. Run the fallback action.
     */
    if ((status == null || status.getSeverity() < IStatus.WARNING) && fFallbackAction != null && !hasMarkers()) {
      if (fFallbackAction instanceof ISelectionListener) {
        ((ISelectionListener) fFallbackAction).selectionChanged(null, null);
      }
      fFallbackAction.run();
    }
    return true;
  }

  protected String getContentType(IDocument document) {
    IModelManager mgr = StructuredModelManager.getModelManager();
    String contentType = null;

    IDocumentProvider provider = fTextEditor.getDocumentProvider();
    if (provider instanceof IDocumentProviderExtension4) {
      try {
        IContentType type = ((IDocumentProviderExtension4) provider).getContentType(fTextEditor.getEditorInput());
        if (type != null)
          contentType = type.getId();
      }
      catch (CoreException e) {
        /*
         * A failure accessing the underlying store really isn't
         * interesting, although it can be a problem for
         * IStorageEditorInputs.
         */
      }
    }

    if (contentType == null) {
      IStructuredModel model = null;
      try {
        model = mgr.getExistingModelForRead(document);
        if (model != null) {
          contentType = model.getContentTypeIdentifier();
        }
      }
      finally {
        if (model != null) {
          model.releaseFromRead();
        }
      }
    }
    return contentType;
  }

  protected void removeBreakpoints(int lineNumber) {
    IBreakpointManager breakpointManager = DebugPlugin.getDefault().getBreakpointManager();
    IBreakpoint[] breakpoints = getBreakpoints(getMarkers());
    for (int i = 0; i < breakpoints.length; i++) {
      try {
        breakpointManager.removeBreakpoint(breakpoints[i], true);
      }
      catch (CoreException e) {
        Logger.logException(e);
      }
    }
  }

  public void run() {
    int lineNumber = fRulerInfo.getLineOfLastMouseButtonActivity() + 1;
    boolean doAdd = !hasMarkers();
    if (doAdd)
      createBreakpoints(lineNumber);
    else
      removeBreakpoints(lineNumber);
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.ui.texteditor.IUpdate#update()
   */
  public void update() {
  }
 
  /*
   * (non-Javadoc)
   * @see org.eclipse.jface.action.Action#getImageDescriptor()
   * overriding for lazy loading
   */
  public ImageDescriptor getImageDescriptor() {
   
    ImageDescriptor image = super.getImageDescriptor();
    if (image == null){
      image = DebugUITools.getImageDescriptor(IDebugUIConstants.IMG_OBJS_BREAKPOINT);
      setImageDescriptor(image);
    }
    return image;
  }
}
TOP

Related Classes of org.eclipse.wst.sse.ui.internal.debug.ToggleBreakpointAction

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.