/*
* #%~
* org.overture.ide.debug
* %%
* Copyright (C) 2008 - 2014 Overture
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #~%
*/
package org.overture.ide.debug.ui.model;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.model.IBreakpoint;
import org.eclipse.debug.core.model.ILineBreakpoint;
import org.eclipse.debug.ui.actions.IToggleBreakpointsTarget;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.texteditor.ITextEditor;
import org.overture.ast.node.INode;
import org.overture.ide.core.IVdmElement;
import org.overture.ide.core.resources.IVdmSourceUnit;
import org.overture.ide.debug.core.IDebugConstants;
import org.overture.ide.debug.core.VdmDebugPlugin;
import org.overture.ide.debug.core.model.internal.VdmLineBreakpoint;
import org.overture.ide.debug.utils.ExecutableAnalysis;
import org.overture.ide.ui.editor.core.VdmEditor;
public class VdmLineBreakpointAdapter implements IToggleBreakpointsTarget
{
public void toggleLineBreakpoints(IWorkbenchPart part, ISelection selection)
throws CoreException
{
ITextEditor textEditor = getEditor(part);
IResource resource = (IResource) textEditor.getEditorInput().getAdapter(IResource.class);
ITextSelection textSelection = (ITextSelection) selection;
int lineNumber = textSelection.getStartLine() + 1;
boolean executable = false;
if (textEditor != null)
{
if (textEditor instanceof VdmEditor)
{
VdmEditor vEditor = (VdmEditor) textEditor;
IVdmElement element = vEditor.getInputVdmElement();
if (element != null && element instanceof IVdmSourceUnit)
{
IVdmSourceUnit sourceUnti = (IVdmSourceUnit) element;
for (INode node : sourceUnti.getParseList())
{
executable = ExecutableAnalysis.isExecutable(node, lineNumber, true);
if (executable)
{
break;
}
}
}
}
IBreakpoint[] breakpoints = DebugPlugin.getDefault().getBreakpointManager().getBreakpoints(IDebugConstants.ID_VDM_DEBUG_MODEL);
for (int i = 0; i < breakpoints.length; i++)
{
IBreakpoint breakpoint = breakpoints[i];
if (resource.equals(breakpoint.getMarker().getResource()))
{
if (((ILineBreakpoint) breakpoint).getLineNumber() == lineNumber)
{
breakpoint.delete();
return;
}
}
}
if (!executable)
{
return;
}
IDocument document = textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput());
IRegion line;
try
{
line = document.getLineInformation(textSelection.getStartLine());
int start = line.getOffset();
int end = start + line.getLength();
String debugModelId = IDebugConstants.ID_VDM_DEBUG_MODEL;// getDebugModelId(textEditor,
// resource);
if (debugModelId == null)
{
return;
}
IPath location = resource.getFullPath();
VdmLineBreakpoint lineBreakpoint = new VdmLineBreakpoint(IDebugConstants.ID_VDM_DEBUG_MODEL, resource, location, lineNumber, start, end, false);
StringBuilder message = new StringBuilder();
message.append("Line breakpoint:");
message.append(location.lastSegment());
message.append("[line:" + lineNumber + "]");
lineBreakpoint.setMessage(message.toString());
DebugPlugin.getDefault().getBreakpointManager().addBreakpoint(lineBreakpoint);
} catch (BadLocationException e)
{
VdmDebugPlugin.log(e);
}
}
}
/*
* (non-Javadoc)
* @seeorg.eclipse.debug.ui.actions.IToggleBreakpointsTarget# canToggleLineBreakpoints(org.eclipse.ui.
* IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
*/
public boolean canToggleLineBreakpoints(IWorkbenchPart part,
ISelection selection)
{
return getEditor(part) != null;
}
/**
* Returns the editor being used to edit a PDA file, associated with the given part, or <code>null</code> if none.
*
* @param part
* workbench part
* @return the editor being used to edit a PDA file, associated with the given part, or <code>null</code> if none
*/
private ITextEditor getEditor(IWorkbenchPart part)
{
if (part instanceof ITextEditor)
{
ITextEditor editorPart = (ITextEditor) part;
IResource resource = (IResource) editorPart.getEditorInput().getAdapter(IResource.class);
if (resource != null && resource instanceof IFile)
{
return editorPart;
// IFile file = (IFile) resource;
// try
// {
// String contentTypeId = file.getContentDescription().getContentType().getId();
// if (SourceViewerEditorManager.getInstance().getContentTypeIds().contains(contentTypeId))
// {
// return editorPart;
// }
// } catch (CoreException e)
// {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
}
}
return null;
}
/*
* (non-Javadoc)
* @see org.eclipse.debug.ui.actions.IToggleBreakpointsTarget#toggleMethodBreakpoints (org.eclipse.ui.IWorkbenchPart
* , org.eclipse.jface.viewers.ISelection)
*/
public void toggleMethodBreakpoints(IWorkbenchPart part,
ISelection selection) throws CoreException
{
}
// private static IWorkspaceRoot getWorkspaceRoot()
// {
// return ResourcesPlugin.getWorkspace().getRoot();
// }
// private static IResource getBreakpointResource(ITextEditor textEditor)
// {
// return getBreakpointResource(textEditor.getEditorInput());
// }
// private static IResource getBreakpointResource(
// final IEditorInput editorInput)
// {
// IResource resource = (IResource) editorInput.getAdapter(IResource.class);
// if (resource == null)
// resource = getWorkspaceRoot();
// return resource;
// }
/*
* (non-Javadoc)
* @seeorg.eclipse.debug.ui.actions.IToggleBreakpointsTarget# canToggleMethodBreakpoints(org.eclipse.ui.
* IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
*/
public boolean canToggleMethodBreakpoints(IWorkbenchPart part,
ISelection selection)
{
return false;
}
/*
* (non-Javadoc)
* @see org.eclipse.debug.ui.actions.IToggleBreakpointsTarget#toggleWatchpoints (org.eclipse.ui.IWorkbenchPart,
* org.eclipse.jface.viewers.ISelection)
*/
public void toggleWatchpoints(IWorkbenchPart part, ISelection selection)
throws CoreException
{
}
/*
* (non-Javadoc)
* @see org.eclipse.debug.ui.actions.IToggleBreakpointsTarget#canToggleWatchpoints (org.eclipse.ui.IWorkbenchPart ,
* org.eclipse.jface.viewers.ISelection)
*/
public boolean canToggleWatchpoints(IWorkbenchPart part,
ISelection selection)
{
return false;
}
}