package tk.eclipse.plugin.jspeditor.editors; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRunnable; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.IBreakpointManager; import org.eclipse.debug.core.model.IBreakpoint; import org.eclipse.jdt.debug.core.IJavaStratumLineBreakpoint; import org.eclipse.jdt.debug.core.JDIDebugModel; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IMenuManager; 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.text.ITypedRegion; import org.eclipse.swt.SWT; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IFileEditorInput; import tk.eclipse.plugin.htmleditor.HTMLPlugin; import tk.eclipse.plugin.htmleditor.HTMLProjectParams; import tk.eclipse.plugin.htmleditor.editors.HTMLConfiguration; import tk.eclipse.plugin.htmleditor.editors.HTMLPartitionScanner; import tk.eclipse.plugin.htmleditor.editors.HTMLSourceEditor; import tk.eclipse.plugin.htmleditor.editors.IHTMLOutlinePage; /** * @author takezoe */ public class JSPSourceEditor extends HTMLSourceEditor { public static final String ACTION_JSP_COMMENT = "_jsp_comment"; public static final String ACTION_TOGGLE_BREAKPOINT = "_jsp_toggle_breakpoint"; public JSPSourceEditor(HTMLConfiguration config) { super(config); setAction(ACTION_JSP_COMMENT,new JSPCommentAction()); setAction(ACTION_TOGGLE_BREAKPOINT, new ToggleBreakPointAction()); } @Override protected void doValidate(){ // if(!isFileEditorInput()){ // return; // } try { String[] natureIds = HTMLPlugin.getDefault().getNoValidationNatureId(); final IFile file = ((IFileEditorInput)getEditorInput()).getFile(); for(int i=0;i<natureIds.length;i++){ if(file.getProject().hasNature(natureIds[i])){ return; } } ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() { public void run(IProgressMonitor monitor) throws CoreException { try { file.deleteMarkers(IMarker.PROBLEM,false,0); HTMLProjectParams params = new HTMLProjectParams(file.getProject()); if(params.getValidateJSP()){ new JSPValidator(file).doValidate(); } } catch(Exception ex){ //HTMLPlugin.logException(ex); } } },null); } catch(Exception ex){ HTMLPlugin.logException(ex); } } @Override protected IHTMLOutlinePage createOutlinePage() { return new JSPOutlinePage(this); } // public String getHTMLSource(){ // String source = super.getHTMLSource(); // source = HTMLUtil.scriptlet2space(source,false); // return source; // } @Override protected void addContextMenuActions(IMenuManager menu) { super.addContextMenuActions(menu); addAction(menu,GROUP_HTML,ACTION_JSP_COMMENT); } @Override protected void updateSelectionDependentActions() { super.updateSelectionDependentActions(); ITextSelection sel = (ITextSelection)getSelectionProvider().getSelection(); if(sel.getText().equals("")){ getAction(ACTION_JSP_COMMENT).setEnabled(false); } else { getAction(ACTION_JSP_COMMENT).setEnabled(true); } } @Override protected void rulerContextMenuAboutToShow(IMenuManager menu) { menu.add(getAction(ACTION_TOGGLE_BREAKPOINT)); super.rulerContextMenuAboutToShow(menu); } /** * Update informations about code-completion. */ @Override protected void updateAssist(){ super.updateAssist(); JSPConfiguration config = (JSPConfiguration)getSourceViewerConfiguration(); JSPDirectiveAssistProcessor directiveProcessor = config.getDirectiveAssistProcessor(); directiveProcessor.update(this); JSPScriptletAssistProcessor scriptletProcessor = config.getScriptletAssistProcessor(); scriptletProcessor.update(this); IEditorInput input = getEditorInput(); if(input instanceof IFileEditorInput){ JSPAutoEditStrategy autoEdit = (JSPAutoEditStrategy)config.getAutoEditStrategy(); autoEdit.setFile(((IFileEditorInput)input).getFile()); } } /** The action to comment JSP */ private class JSPCommentAction extends Action { public JSPCommentAction(){ super(HTMLPlugin.getResourceString("HTMLEditor.JSPCommentAction")); setEnabled(false); setAccelerator(SWT.CTRL | SWT.ALT | '/'); } @Override public void run() { ITextSelection sel = (ITextSelection)getSelectionProvider().getSelection(); IDocument doc = getDocumentProvider().getDocument(getEditorInput()); String text = sel.getText().trim(); try { if(text.startsWith("<%--") && text.endsWith("--%>")){ text = sel.getText().replaceAll("<%--|--%>", ""); doc.replace(sel.getOffset(),sel.getLength(),text); } else { doc.replace(sel.getOffset(),sel.getLength(),"<%--" + sel.getText() + "--%>"); } } catch (BadLocationException e) { HTMLPlugin.logException(e); } } } /** An action to toggle breakpoints */ private class ToggleBreakPointAction extends Action { public ToggleBreakPointAction(){ super(HTMLPlugin.getResourceString("JSPEditor.ToggleBreakPoint")); setEnabled(true); } @Override public void run(){ IBreakpointManager manager = DebugPlugin.getDefault().getBreakpointManager(); IBreakpoint[] breakpoints = manager.getBreakpoints(); IEditorInput input = getEditorInput(); IResource resource = (IResource)input.getAdapter(IFile.class); if(resource==null){ resource = (IResource)input.getAdapter(IResource.class); } int lineNumber = getVerticalRuler().getLineOfLastMouseButtonActivity() + 1; for(int i=0;i<breakpoints.length;i++){ if(breakpoints[i] instanceof IJavaStratumLineBreakpoint){ IJavaStratumLineBreakpoint breakpoint = (IJavaStratumLineBreakpoint)breakpoints[i]; if(breakpoint.getMarker().getResource().equals(resource)){ try { if(breakpoint.getLineNumber()==lineNumber){ breakpoint.delete(); return; } } catch(Exception ex){ HTMLPlugin.logException(ex); } } } } try { // TODO set a valid position!! int pos = getValidPosition(getViewer().getDocument(), lineNumber); System.out.println(pos); JDIDebugModel.createStratumBreakpoint(resource, "JSP", resource.getName(), null, "*", lineNumber, pos, pos, 0, true, null); } catch(Exception ex){ HTMLPlugin.logException(ex); } } /** * Finds a valid position somewhere on lineNumber in document, idoc, where * a breakpoint can be set and returns that position. -1 is returned if a * position could not be found. * * @param idoc * @param editorLineNumber * @return position to set breakpoint or -1 if no position could be found */ private int getValidPosition(IDocument idoc, int editorLineNumber) { int result = -1; if (idoc != null) { int startOffset = 0; int endOffset = 0; try { IRegion line = idoc.getLineInformation(editorLineNumber - 1); startOffset = line.getOffset(); endOffset = Math.max(line.getOffset(), line.getOffset() + line.getLength()); String lineText = idoc.get(startOffset, endOffset - startOffset).trim(); // blank lines or lines with only an open or close brace or // scriptlet tag cannot have a breakpoint if (lineText.equals("") || lineText.equals("{") || lineText.equals("}") || lineText.equals("<%")){ result = -1; } else { // get all partitions for current line ITypedRegion[] partitions = null; partitions = idoc.computePartitioning(startOffset, endOffset - startOffset); for (int i = 0; i < partitions.length; ++i) { String type = partitions[i].getType(); // if found jsp java content, jsp directive tags, // custom // tags, // return that position if (type == HTMLPartitionScanner.HTML_COMMENT || type == HTMLPartitionScanner.HTML_DIRECTIVE) { result = partitions[i].getOffset(); } } } } catch (BadLocationException e) { result = -1; } } return result; } } }