### Eclipse Workspace Patch 1.0 #P org.eclipse.wst.xml.ui Index: src/org/eclipse/wst/xml/ui/internal/actions/AbstractCommentActionXMLDelegate.java =================================================================== RCS file: /cvsroot/webtools/sourceediting/plugins/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/AbstractCommentActionXMLDelegate.java,v retrieving revision 1.3 diff -u -r1.3 AbstractCommentActionXMLDelegate.java --- src/org/eclipse/wst/xml/ui/internal/actions/AbstractCommentActionXMLDelegate.java 10 Apr 2007 20:04:55 -0000 1.3 +++ src/org/eclipse/wst/xml/ui/internal/actions/AbstractCommentActionXMLDelegate.java 17 Dec 2007 02:53:48 -0000 @@ -74,7 +74,7 @@ // do nothing } - private ITextSelection getCurrentSelection() { + ITextSelection getCurrentSelection() { if (fEditor instanceof ITextEditor) { ISelectionProvider provider = ((ITextEditor) fEditor).getSelectionProvider(); if (provider != null) { Index: src/org/eclipse/wst/xml/ui/internal/actions/CleanupActionXMLDelegate.java =================================================================== RCS file: /cvsroot/webtools/sourceediting/plugins/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/actions/CleanupActionXMLDelegate.java,v retrieving revision 1.5 diff -u -r1.5 CleanupActionXMLDelegate.java --- src/org/eclipse/wst/xml/ui/internal/actions/CleanupActionXMLDelegate.java 10 Apr 2007 20:04:55 -0000 1.5 +++ src/org/eclipse/wst/xml/ui/internal/actions/CleanupActionXMLDelegate.java 17 Dec 2007 02:53:48 -0000 @@ -34,6 +34,7 @@ /** * Cleanup action delegate for CSS editor + * @deprecated */ public class CleanupActionXMLDelegate implements IEditorActionDelegate, IActionDelegate2, IViewActionDelegate { private IEditorPart fEditor; Index: META-INF/MANIFEST.MF =================================================================== RCS file: /cvsroot/webtools/sourceediting/plugins/org.eclipse.wst.xml.ui/META-INF/MANIFEST.MF,v retrieving revision 1.27 diff -u -r1.27 MANIFEST.MF --- META-INF/MANIFEST.MF 30 Oct 2007 22:42:35 -0000 1.27 +++ META-INF/MANIFEST.MF 17 Dec 2007 02:53:48 -0000 @@ -21,6 +21,7 @@ org.eclipse.wst.xml.ui.internal.dnd;x-friends:="org.eclipse.wst.xsd.ui,org.eclipse.wst.dtd.ui", org.eclipse.wst.xml.ui.internal.doubleclick;x-friends:="org.eclipse.wst.xsd.ui,org.eclipse.wst.dtd.ui", org.eclipse.wst.xml.ui.internal.editor;x-friends:="org.eclipse.wst.xsd.ui,org.eclipse.wst.dtd.ui", + org.eclipse.wst.xml.ui.internal.handlers;x-internal:=true, org.eclipse.wst.xml.ui.internal.hyperlink;x-friends:="org.eclipse.wst.xsd.ui,org.eclipse.wst.dtd.ui", org.eclipse.wst.xml.ui.internal.nsedit;x-friends:="org.eclipse.wst.xsd.ui,org.eclipse.wst.dtd.ui", org.eclipse.wst.xml.ui.internal.preferences;x-friends:="org.eclipse.wst.xsd.ui,org.eclipse.wst.dtd.ui", @@ -54,6 +55,7 @@ org.eclipse.wst.xml.core;bundle-version="[1.1.0,1.2.0)", org.eclipse.wst.common.ui;bundle-version="[1.1.0,1.2.0)", org.eclipse.wst.validation;bundle-version="[1.1.0,1.2.0)", - com.ibm.icu;bundle-version="[3.4.4,4.0.0)" + com.ibm.icu;bundle-version="[3.4.4,4.0.0)", + org.eclipse.core.expressions;bundle-version="3.3.100" Eclipse-LazyStart: true Bundle-RequiredExecutionEnvironment: J2SE-1.4 Index: plugin.xml =================================================================== RCS file: /cvsroot/webtools/sourceediting/plugins/org.eclipse.wst.xml.ui/plugin.xml,v retrieving revision 1.73 diff -u -r1.73 plugin.xml --- plugin.xml 5 Nov 2007 22:20:20 -0000 1.73 +++ plugin.xml 17 Dec 2007 02:53:48 -0000 @@ -1,449 +1,319 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - %_UI_CREATE_NEW_XML_FILE - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - %XMLExampleProjectCreationWizard.description - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + %_UI_CREATE_NEW_XML_FILE + + + + + + + + + + + + + + + + + + + + + + + %XMLExampleProjectCreationWizard.description + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Index: src/org/eclipse/wst/xml/ui/internal/handlers/RemoveBlockCommentHandler.java =================================================================== RCS file: src/org/eclipse/wst/xml/ui/internal/handlers/RemoveBlockCommentHandler.java diff -N src/org/eclipse/wst/xml/ui/internal/handlers/RemoveBlockCommentHandler.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/wst/xml/ui/internal/handlers/RemoveBlockCommentHandler.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,75 @@ +/** + * + */ +package org.eclipse.wst.xml.ui.internal.handlers; + +import org.eclipse.core.commands.IHandler; +import org.eclipse.jface.text.BadLocationException; +import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.ITextSelection; +import org.eclipse.wst.sse.core.StructuredModelManager; +import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel; +import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion; +import org.eclipse.wst.xml.core.internal.document.CommentImpl; +import org.eclipse.wst.xml.ui.internal.Logger; +import org.eclipse.wst.xml.ui.internal.XMLUIMessages; + +/** + * @author dcarver + * + */ +public class RemoveBlockCommentHandler extends CommentHandler implements IHandler { + + public RemoveBlockCommentHandler() { + super(); + } + + void processAction(IDocument document, ITextSelection textSelection) { + IStructuredModel model = StructuredModelManager.getModelManager().getExistingModelForEdit(document); + if (model != null) { + try { + IndexedRegion selectionStartIndexedRegion = model.getIndexedRegion(textSelection.getOffset()); + IndexedRegion selectionEndIndexedRegion = model.getIndexedRegion(textSelection.getOffset() + textSelection.getLength()); + + if ((selectionStartIndexedRegion == null) || (selectionEndIndexedRegion == null)) { + return; + } + + int openCommentOffset = selectionStartIndexedRegion.getStartOffset(); + int closeCommentOffset = selectionEndIndexedRegion.getEndOffset() - OPEN_COMMENT.length() - CLOSE_COMMENT.length(); + + model.beginRecording(this, XMLUIMessages.RemoveBlockComment_tooltip); + model.aboutToChangeModel(); + + try { + if (textSelection.getLength() == 0) { + if (selectionStartIndexedRegion instanceof CommentImpl) { + document.replace(openCommentOffset, OPEN_COMMENT.length(), ""); //$NON-NLS-1$ + document.replace(closeCommentOffset, CLOSE_COMMENT.length(), ""); //$NON-NLS-1$ + } + } + else { + if (selectionStartIndexedRegion instanceof CommentImpl) { + document.replace(openCommentOffset, OPEN_COMMENT.length(), ""); //$NON-NLS-1$ + } + + if (selectionEndIndexedRegion instanceof CommentImpl) { + document.replace(closeCommentOffset, CLOSE_COMMENT.length(), ""); //$NON-NLS-1$ + } + } + removeOpenCloseComments(document, openCommentOffset + OPEN_COMMENT.length(), closeCommentOffset - openCommentOffset - CLOSE_COMMENT.length()); + } + catch (BadLocationException e) { + Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e); + } + finally { + model.changedModel(); + model.endRecording(this); + } + } + finally { + model.releaseFromEdit(); + } + } + } +} Index: src/org/eclipse/wst/xml/ui/internal/handlers/CleanupdocumentHandler.java =================================================================== RCS file: src/org/eclipse/wst/xml/ui/internal/handlers/CleanupdocumentHandler.java diff -N src/org/eclipse/wst/xml/ui/internal/handlers/CleanupdocumentHandler.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/wst/xml/ui/internal/handlers/CleanupdocumentHandler.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,116 @@ +/******************************************************************************* + * Copyright (c) 2007 Standards for Technology in Automotive Retail 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: + * David Carver - initial API and implementation - bug 212330 - + * Based off CleanupActionXMLDelegate + *******************************************************************************/ + +package org.eclipse.wst.xml.ui.internal.handlers; + +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; +import org.eclipse.core.commands.IHandler; +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.text.ITextSelection; +import org.eclipse.jface.window.Window; +import org.eclipse.swt.custom.BusyIndicator; +import org.eclipse.ui.IEditorPart; +import org.eclipse.ui.handlers.HandlerUtil; +import org.eclipse.ui.texteditor.ITextEditor; +import org.eclipse.wst.sse.core.StructuredModelManager; +import org.eclipse.wst.sse.core.internal.cleanup.IStructuredCleanupProcessor; +import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel; +import org.eclipse.wst.sse.ui.internal.SSEUIMessages; +import org.eclipse.wst.xml.core.internal.cleanup.CleanupProcessorXML; +import org.eclipse.wst.xml.ui.internal.actions.CleanupDialogXML; +import org.eclipse.wst.xml.ui.internal.tabletree.XMLMultiPageEditorPart; + +public class CleanupdocumentHandler extends AbstractHandler implements IHandler { + + private IEditorPart fEditor; + private IStructuredCleanupProcessor fCleanupProcessor; + + public void dispose() { + // nulling out just in case + fEditor = null; + fCleanupProcessor = null; + } + + public Object execute(ExecutionEvent event) throws ExecutionException { + fEditor = HandlerUtil.getActiveEditor(event); + + if (fEditor instanceof XMLMultiPageEditorPart) { + final ITextEditor editor = (ITextEditor) fEditor.getAdapter(ITextEditor.class); + Dialog cleanupDialog = new CleanupDialogXML(editor.getSite().getShell()); + if (cleanupDialog.open() == Window.OK) { + // setup runnable + Runnable runnable = new Runnable() { + public void run() { + IStructuredCleanupProcessor cleanupProcessor = getCleanupProcessor(); + if (cleanupProcessor != null) { + IStructuredModel model = null; + try { + model = StructuredModelManager.getModelManager().getExistingModelForEdit(editor.getDocumentProvider().getDocument(editor.getEditorInput())); + if (model != null) { + cleanupProcessor.cleanupModel(model); + } + } + finally { + if (model != null) { + model.releaseFromEdit(); + } + } + } + } + }; + + // TODO: make independent of 'model'. + IStructuredModel model = null; + try { + model = StructuredModelManager.getModelManager().getExistingModelForEdit(editor.getDocumentProvider().getDocument(editor.getEditorInput())); + if (model != null) { + // begin recording + ITextSelection selection = (ITextSelection) editor.getSelectionProvider().getSelection(); + model.beginRecording(this, SSEUIMessages.Cleanup_Document_UI_, SSEUIMessages.Cleanup_Document_UI_, selection.getOffset(), selection.getLength()); + + // tell the model that we are about to make a big + // model change + model.aboutToChangeModel(); + + // run + BusyIndicator.showWhile(fEditor.getEditorSite().getWorkbenchWindow().getShell().getDisplay(), runnable); + } + } + finally { + if (model != null) { + // tell the model that we are done with the big + // model + // change + model.changedModel(); + + // end recording + ITextSelection selection = (ITextSelection) editor.getSelectionProvider().getSelection(); + model.endRecording(this, selection.getOffset(), selection.getLength()); + model.releaseFromEdit(); + } + } + } + } + + return null; + } + + IStructuredCleanupProcessor getCleanupProcessor() { + if (fCleanupProcessor == null) { + fCleanupProcessor = new CleanupProcessorXML(); + } + + return fCleanupProcessor; + } +} Index: src/org/eclipse/wst/xml/ui/internal/handlers/XMLFindOccurencesHandler.java =================================================================== RCS file: src/org/eclipse/wst/xml/ui/internal/handlers/XMLFindOccurencesHandler.java diff -N src/org/eclipse/wst/xml/ui/internal/handlers/XMLFindOccurencesHandler.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/wst/xml/ui/internal/handlers/XMLFindOccurencesHandler.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,136 @@ +/******************************************************************************* + * Copyright (c) 2007 Standards for Technology in Automotive Retail 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: + * David Carver - initial API and implementation - bug 212330 - + * Based off CleanupActionXMLDelegate + *******************************************************************************/ + +package org.eclipse.wst.xml.ui.internal.handlers; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; +import org.eclipse.core.commands.IHandler; +import org.eclipse.core.resources.IFile; +import org.eclipse.jface.text.BadLocationException; +import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.ITextSelection; +import org.eclipse.jface.text.ITypedRegion; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.ui.IEditorPart; +import org.eclipse.ui.IFileEditorInput; +import org.eclipse.ui.handlers.HandlerUtil; +import org.eclipse.ui.texteditor.ITextEditor; +import org.eclipse.wst.sse.ui.internal.SSEUIMessages; +import org.eclipse.wst.sse.ui.internal.search.FindOccurrencesProcessor; +import org.eclipse.wst.sse.ui.internal.util.PlatformStatusLineUtil; +import org.eclipse.wst.xml.ui.internal.search.XMLFindOccurrencesProcessor; +import org.eclipse.wst.xml.ui.internal.tabletree.XMLMultiPageEditorPart; + +public class XMLFindOccurencesHandler extends AbstractHandler implements IHandler { + + private IEditorPart fEditor; + private List fProcessors; + + public void dispose() { + // nulling out just in case + fEditor = null; + } + + public Object execute(ExecutionEvent event) throws ExecutionException { + fEditor = HandlerUtil.getActiveEditor(event); + boolean okay = false; + + if (fEditor instanceof XMLMultiPageEditorPart) { + final ITextEditor textEditor = (ITextEditor) fEditor.getAdapter(ITextEditor.class); + IDocument document = textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput()); + if (document != null) { + ITextSelection textSelection = getTextSelection(textEditor); + FindOccurrencesProcessor findOccurrenceProcessor = getProcessorForCurrentSelection(document, textSelection); + if (findOccurrenceProcessor != null) { + if (textEditor.getEditorInput() instanceof IFileEditorInput) { + IFile file = ((IFileEditorInput) textEditor.getEditorInput()).getFile(); + okay = findOccurrenceProcessor.findOccurrences(document, textSelection, file); + } + } + } + } + if (okay) { + // clear status message + PlatformStatusLineUtil.clearStatusLine(); + } + else { + String errorMessage = SSEUIMessages.FindOccurrencesActionProvider_0; //$NON-NLS-1$ + PlatformStatusLineUtil.displayErrorMessage(errorMessage); + PlatformStatusLineUtil.addOneTimeClearListener(); + } + + return null; + } + + /** + * Get the appropriate find occurrences processor + * + * @param document - + * assumes not null + * @param textSelection + * @return + */ + private FindOccurrencesProcessor getProcessorForCurrentSelection(IDocument document, ITextSelection textSelection) { + // check if we have an action that's enabled on the current partition + ITypedRegion tr = getPartition(document, textSelection); + String partition = tr != null ? tr.getType() : ""; //$NON-NLS-1$ + + Iterator it = getProcessors().iterator(); + FindOccurrencesProcessor action = null; + while (it.hasNext()) { + action = (FindOccurrencesProcessor) it.next(); + // we just choose the first action that can handle the partition + if (action.enabledForParitition(partition)) + return action; + } + return null; + } + + private ITypedRegion getPartition(IDocument document, ITextSelection textSelection) { + ITypedRegion region = null; + if (textSelection != null) { + try { + region = document.getPartition(textSelection.getOffset()); + } + catch (BadLocationException e) { + region = null; + } + } + return region; + } + + private ITextSelection getTextSelection(ITextEditor textEditor) { + ITextSelection textSelection = null; + ISelection selection = textEditor.getSelectionProvider().getSelection(); + if (selection instanceof ITextSelection && !selection.isEmpty()) { + textSelection = (ITextSelection) selection; + } + return textSelection; + } + + protected List getProcessors() { + if (fProcessors == null) { + fProcessors = new ArrayList(); + XMLFindOccurrencesProcessor htmlProcessor = new XMLFindOccurrencesProcessor(); + fProcessors.add(htmlProcessor); + } + return fProcessors; + } + + +} Index: src/org/eclipse/wst/xml/ui/internal/handlers/AddBlockCommentHandler.java =================================================================== RCS file: src/org/eclipse/wst/xml/ui/internal/handlers/AddBlockCommentHandler.java diff -N src/org/eclipse/wst/xml/ui/internal/handlers/AddBlockCommentHandler.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/wst/xml/ui/internal/handlers/AddBlockCommentHandler.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,76 @@ +/** + * + */ +package org.eclipse.wst.xml.ui.internal.handlers; + +import org.eclipse.core.commands.IHandler; +import org.eclipse.jface.text.BadLocationException; +import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.ITextSelection; +import org.eclipse.wst.sse.core.StructuredModelManager; +import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel; +import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion; +import org.eclipse.wst.xml.core.internal.document.CommentImpl; +import org.eclipse.wst.xml.ui.internal.Logger; +import org.eclipse.wst.xml.ui.internal.XMLUIMessages; + +/** + * @author dcarver + * + */ +public class AddBlockCommentHandler extends CommentHandler implements IHandler { + + public AddBlockCommentHandler() { + super(); + } + + void processAction(IDocument document, ITextSelection textSelection) { + IStructuredModel model = StructuredModelManager.getModelManager().getExistingModelForEdit(document); + if (model != null) { + try { + IndexedRegion selectionStartIndexedRegion = model.getIndexedRegion(textSelection.getOffset()); + IndexedRegion selectionEndIndexedRegion = model.getIndexedRegion(textSelection.getOffset() + textSelection.getLength()); + + if (selectionStartIndexedRegion == null) { + return; + } + if ((selectionEndIndexedRegion == null) && (textSelection.getLength() > 0)) { + selectionEndIndexedRegion = model.getIndexedRegion(textSelection.getOffset() + textSelection.getLength() - 1); + } + if (selectionEndIndexedRegion == null) { + return; + } + + int openCommentOffset = selectionStartIndexedRegion.getStartOffset(); + int closeCommentOffset = selectionEndIndexedRegion.getEndOffset() + OPEN_COMMENT.length(); + + + if ((textSelection.getLength() == 0) && (selectionStartIndexedRegion instanceof CommentImpl)) { + return; + } + + model.beginRecording(this, XMLUIMessages.AddBlockComment_tooltip); + model.aboutToChangeModel(); + + try { + document.replace(openCommentOffset, 0, OPEN_COMMENT); + document.replace(closeCommentOffset, 0, CLOSE_COMMENT); + super.removeOpenCloseComments(document, openCommentOffset + OPEN_COMMENT.length(), closeCommentOffset - openCommentOffset - CLOSE_COMMENT.length()); + } + catch (BadLocationException e) { + Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e); + } + finally { + model.changedModel(); + model.endRecording(this); + } + } + finally { + model.releaseFromEdit(); + } + } + } + + + +} Index: src/org/eclipse/wst/xml/ui/internal/handlers/ToggleCommentHandler.java =================================================================== RCS file: src/org/eclipse/wst/xml/ui/internal/handlers/ToggleCommentHandler.java diff -N src/org/eclipse/wst/xml/ui/internal/handlers/ToggleCommentHandler.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/wst/xml/ui/internal/handlers/ToggleCommentHandler.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,182 @@ +package org.eclipse.wst.xml.ui.internal.handlers; + +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; +import org.eclipse.core.commands.IHandler; +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.Position; +import org.eclipse.jface.text.TextSelection; +import org.eclipse.jface.viewers.ISelectionProvider; +import org.eclipse.ui.handlers.HandlerUtil; +import org.eclipse.ui.texteditor.ITextEditor; +import org.eclipse.wst.sse.core.StructuredModelManager; +import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel; +import org.eclipse.wst.xml.ui.internal.Logger; +import org.eclipse.wst.xml.ui.internal.XMLUIMessages; +import org.eclipse.wst.xml.ui.internal.tabletree.XMLMultiPageEditorPart; + +public class ToggleCommentHandler extends CommentHandler implements IHandler { + + public ToggleCommentHandler() { + // TODO Auto-generated constructor stub + super(); + } + + public Object execute(ExecutionEvent event) throws ExecutionException { + + fEditor = HandlerUtil.getActiveEditor(event); + + if (fEditor instanceof XMLMultiPageEditorPart) { + final ITextEditor textEditor = (ITextEditor) fEditor.getAdapter(ITextEditor.class); + fEditor = textEditor; + IDocument document = textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput()); + if (document != null) { + // get current text selection + ITextSelection textSelection = getCurrentSelection(); + if (textSelection.isEmpty()) { + return null; + } + + processAction(document, textSelection); + } + } + return null; + } + + void processAction(IDocument document, ITextSelection textSelection) { + // get text selection lines info + int selectionStartLine = textSelection.getStartLine(); + int selectionEndLine = textSelection.getEndLine(); + try { + int selectionEndLineOffset = document.getLineOffset(selectionEndLine); + int selectionEndOffset = textSelection.getOffset() + textSelection.getLength(); + + // adjust selection end line + if ((selectionEndLine > selectionStartLine) && (selectionEndLineOffset == selectionEndOffset)) { + selectionEndLine--; + } + + } + catch (BadLocationException e) { + Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e); + } + + // save the selection position since it will be changing + Position selectionPosition = null; + boolean updateStartOffset = false; + try { + selectionPosition = new Position(textSelection.getOffset(), textSelection.getLength()); + document.addPosition(selectionPosition); + + // extra check if commenting from beginning of line + int selectionStartLineOffset = document.getLineOffset(selectionStartLine); + if ((textSelection.getLength() > 0) && (selectionStartLineOffset == textSelection.getOffset()) && !isCommentLine(document, selectionStartLine)) { + updateStartOffset = true; + } + } + catch (BadLocationException e) { + Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e); + } + + processAction(document, selectionStartLine, selectionEndLine); + + updateCurrentSelection(selectionPosition, document, updateStartOffset); + } + + private void processAction(IDocument document, int selectionStartLine, int selectionEndLine) { + IStructuredModel model = StructuredModelManager.getModelManager().getExistingModelForEdit(document); + if (model != null) { + try { + model.beginRecording(this, XMLUIMessages.ToggleComment_tooltip); + model.aboutToChangeModel(); + + for (int i = selectionStartLine; i <= selectionEndLine; i++) { + try { + if (document.getLineLength(i) > 0) { + if (isCommentLine(document, i)) { + int lineOffset = document.getLineOffset(i); + IRegion region = document.getLineInformation(i); + String string = document.get(region.getOffset(), region.getLength()); + int openCommentOffset = lineOffset + string.indexOf(OPEN_COMMENT); + int closeCommentOffset = lineOffset + string.indexOf(CLOSE_COMMENT) - OPEN_COMMENT.length(); + uncomment(document, openCommentOffset, closeCommentOffset); + } + else { + int openCommentOffset = document.getLineOffset(i); + int lineDelimiterLength = document.getLineDelimiter(i) == null ? 0 : document.getLineDelimiter(i).length(); + int closeCommentOffset = openCommentOffset + document.getLineLength(i) - lineDelimiterLength + OPEN_COMMENT.length(); + comment(document, openCommentOffset, closeCommentOffset); + } + } + } + catch (BadLocationException e) { + Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e); + } + } + } + finally { + model.changedModel(); + model.endRecording(this); + model.releaseFromEdit(); + } + } + } + + private boolean isCommentLine(IDocument document, int line) { + boolean isComment = false; + + try { + IRegion region = document.getLineInformation(line); + String string = document.get(region.getOffset(), region.getLength()).trim(); + isComment = (string.length() >= OPEN_COMMENT.length() + CLOSE_COMMENT.length()) && string.startsWith(OPEN_COMMENT) && string.endsWith(CLOSE_COMMENT); + } + catch (BadLocationException e) { + Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e); + } + return isComment; + } + + private void comment(IDocument document, int openCommentOffset, int closeCommentOffset) { + try { + document.replace(openCommentOffset, 0, OPEN_COMMENT); + document.replace(closeCommentOffset, 0, CLOSE_COMMENT); + removeOpenCloseComments(document, openCommentOffset + OPEN_COMMENT.length(), closeCommentOffset - openCommentOffset - CLOSE_COMMENT.length()); + } + catch (BadLocationException e) { + Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e); + } + } + + private void uncomment(IDocument document, int openCommentOffset, int closeCommentOffset) { + try { + document.replace(openCommentOffset, OPEN_COMMENT.length(), ""); //$NON-NLS-1$ + document.replace(closeCommentOffset, CLOSE_COMMENT.length(), ""); //$NON-NLS-1$ + } + catch (BadLocationException e) { + Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e); + } + } + + private void updateCurrentSelection(Position selectionPosition, IDocument document, boolean updateStartOffset) { + if (fEditor instanceof ITextEditor) { + // update the selection if text selection changed + if (selectionPosition != null) { + ITextSelection selection = null; + if (updateStartOffset) { + selection = new TextSelection(document, selectionPosition.getOffset() - OPEN_COMMENT.length(), selectionPosition.getLength() + OPEN_COMMENT.length()); + } + else { + selection = new TextSelection(document, selectionPosition.getOffset(), selectionPosition.getLength()); + } + ISelectionProvider provider = ((ITextEditor) fEditor).getSelectionProvider(); + if (provider != null) { + provider.setSelection(selection); + } + document.removePosition(selectionPosition); + } + } + } +} Index: src/org/eclipse/wst/xml/ui/internal/handlers/CommentHandler.java =================================================================== RCS file: src/org/eclipse/wst/xml/ui/internal/handlers/CommentHandler.java diff -N src/org/eclipse/wst/xml/ui/internal/handlers/CommentHandler.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/wst/xml/ui/internal/handlers/CommentHandler.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,97 @@ +package org.eclipse.wst.xml.ui.internal.handlers; + +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; +import org.eclipse.core.commands.IHandler; +import org.eclipse.jface.text.BadLocationException; +import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.ITextSelection; +import org.eclipse.jface.text.TextSelection; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.ISelectionProvider; +import org.eclipse.ui.IEditorPart; +import org.eclipse.ui.handlers.HandlerUtil; +import org.eclipse.ui.texteditor.ITextEditor; +import org.eclipse.wst.xml.ui.internal.Logger; +import org.eclipse.wst.xml.ui.internal.tabletree.XMLMultiPageEditorPart; + +public class CommentHandler extends AbstractHandler implements IHandler { + + + static final String CLOSE_COMMENT = "-->"; //$NON-NLS-1$ + static final String OPEN_COMMENT = " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + %sourceEditorFontDefintion.description + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - %sourceEditorFontDefintion.description - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + --> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Index: src/org/eclipse/wst/sse/ui/internal/actions/ActionContributor.java =================================================================== RCS file: /cvsroot/webtools/sourceediting/plugins/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/actions/ActionContributor.java,v retrieving revision 1.5 diff -u -r1.5 ActionContributor.java --- src/org/eclipse/wst/sse/ui/internal/actions/ActionContributor.java 8 Nov 2006 21:02:43 -0000 1.5 +++ src/org/eclipse/wst/sse/ui/internal/actions/ActionContributor.java 17 Dec 2007 02:53:52 -0000 @@ -12,11 +12,11 @@ *******************************************************************************/ package org.eclipse.wst.sse.ui.internal.actions; -import java.util.ResourceBundle; +//import java.util.ResourceBundle; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.action.GroupMarker; -import org.eclipse.jface.action.IAction; +//import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.IStatusLineManager; import org.eclipse.jface.action.IToolBarManager; @@ -24,21 +24,21 @@ import org.eclipse.jface.action.Separator; import org.eclipse.ui.IActionBars; import org.eclipse.ui.IEditorPart; -import org.eclipse.ui.IWorkbenchActionConstants; +//import org.eclipse.ui.IWorkbenchActionConstants; import org.eclipse.ui.IWorkbenchPage; -import org.eclipse.ui.actions.ActionFactory; +//import org.eclipse.ui.actions.ActionFactory; import org.eclipse.ui.editors.text.TextEditorActionContributor; -import org.eclipse.ui.ide.IDEActionFactory; +//import org.eclipse.ui.ide.IDEActionFactory; import org.eclipse.ui.texteditor.ITextEditor; -import org.eclipse.ui.texteditor.ITextEditorActionConstants; -import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds; -import org.eclipse.ui.texteditor.ITextEditorExtension; +//import org.eclipse.ui.texteditor.ITextEditorActionConstants; +//import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds; +//import org.eclipse.ui.texteditor.ITextEditorExtension; import org.eclipse.ui.texteditor.RetargetTextEditorAction; -import org.eclipse.wst.sse.ui.internal.ExtendedEditorActionBuilder; +//import org.eclipse.wst.sse.ui.internal.ExtendedEditorActionBuilder; import org.eclipse.wst.sse.ui.internal.GotoAnnotationAction; import org.eclipse.wst.sse.ui.internal.IExtendedContributor; import org.eclipse.wst.sse.ui.internal.ISourceViewerActionBarContributor; -import org.eclipse.wst.sse.ui.internal.SSEUIMessages; +//import org.eclipse.wst.sse.ui.internal.SSEUIMessages; import org.eclipse.wst.sse.ui.internal.ui.OffsetStatusLineContributionItem; /** @@ -85,7 +85,7 @@ public ActionContributor() { super(); - ResourceBundle resourceBundle = SSEUIMessages.getResourceBundle(); +/* ResourceBundle resourceBundle = SSEUIMessages.getResourceBundle(); fCommandsSeparator = new Separator(); @@ -146,11 +146,11 @@ if (_showDebugStatus) { fDebugStatusOffset = new OffsetStatusLineContributionItem(StructuredTextEditorActionConstants.STATUS_CATEGORY_OFFSET, true, 20); } - } +*/ } protected void addToMenu(IMenuManager menu) { // edit commands - IMenuManager editMenu = menu.findMenuUsingPath(IWorkbenchActionConstants.M_EDIT); +/* IMenuManager editMenu = menu.findMenuUsingPath(IWorkbenchActionConstants.M_EDIT); if (editMenu != null) { editMenu.add(fCommandsSeparator); editMenu.add(fToggleInsertModeAction); @@ -159,7 +159,7 @@ editMenu.add(fCommandsSeparator); editMenu.add(fMenuAdditionsGroupMarker); } - + // source commands String sourceMenuLabel = SSEUIMessages.SourceMenu_label; //$NON-NLS-1$ String sourceMenuId = "sourceMenuId"; // This is just a menu id. No //$NON-NLS-1$ @@ -175,7 +175,7 @@ sourceMenu.add(fShiftRight); sourceMenu.add(fShiftLeft); } - } +*/ } protected void addToPopupMenu(IMenuManager menu) { // add nothing @@ -188,22 +188,22 @@ } protected void addToToolBar(IToolBarManager toolBarManager) { - toolBarManager.add(fToolbarSeparator); +/* toolBarManager.add(fToolbarSeparator); toolBarManager.add(fToolbarAdditionsGroupMarker); - } +*/ } /** * @see org.eclipse.ui.part.EditorActionBarContributor#contributeToMenu(IMenuManager) */ public void contributeToMenu(IMenuManager menu) { super.contributeToMenu(menu); - +/* addToMenu(menu); if (extendedContributor != null) { extendedContributor.contributeToMenu(menu); } - } +*/ } /* * (non-Javadoc) @@ -212,12 +212,12 @@ */ public void contributeToPopupMenu(IMenuManager menu) { - addToPopupMenu(menu); +/* addToPopupMenu(menu); if (extendedContributor != null) { extendedContributor.contributeToPopupMenu(menu); } - } +*/ } /* * (non-Javadoc) @@ -240,12 +240,12 @@ public void contributeToToolBar(IToolBarManager toolBarManager) { super.contributeToToolBar(toolBarManager); - addToToolBar(toolBarManager); +/* addToToolBar(toolBarManager); if (extendedContributor != null) { extendedContributor.contributeToToolBar(toolBarManager); } - } +*/ } /** * @see org.eclipse.ui.part.EditorActionBarContributor#dispose() @@ -300,9 +300,9 @@ return; super.setActiveEditor(activeEditor); - ITextEditor textEditor = getTextEditor(activeEditor); +// ITextEditor textEditor = getTextEditor(activeEditor); - IActionBars actionBars = getActionBars(); +/* IActionBars actionBars = getActionBars(); if (actionBars != null) { actionBars.setGlobalActionHandler(ITextEditorActionDefinitionIds.GOTO_NEXT_ANNOTATION, fNextAnnotation); actionBars.setGlobalActionHandler(ITextEditorActionDefinitionIds.GOTO_PREVIOUS_ANNOTATION, fPreviousAnnotation); @@ -342,7 +342,7 @@ ((ITextEditorExtension) textEditor).setStatusField(fDebugStatusOffset, StructuredTextEditorActionConstants.STATUS_CATEGORY_OFFSET); fDebugStatusOffset.setActiveEditor(textEditor); } - } +*/ } /* * (non-Javadoc) @@ -350,19 +350,19 @@ * @see org.eclipse.wst.sse.ui.ISourceViewerActionBarContributor#setViewerSpecificContributionsEnabled(boolean) */ public void setViewerSpecificContributionsEnabled(boolean enabled) { - fShiftRight.setEnabled(enabled); +/* fShiftRight.setEnabled(enabled); fShiftLeft.setEnabled(enabled); fNextAnnotation.setEnabled(enabled); fPreviousAnnotation.setEnabled(enabled); - /* + * fComment.setEnabled(enabled); fUncomment.setEnabled(enabled); - */ + fToggleComment.setEnabled(enabled); fAddBlockComment.setEnabled(enabled); fRemoveBlockComment.setEnabled(enabled); // convert line delimiters are not source viewer-specific - } +*/ } /* * (non-Javadoc) @@ -370,8 +370,8 @@ * @see org.eclipse.wst.sse.ui.extension.IExtendedContributor#updateToolbarActions() */ public void updateToolbarActions() { - if (extendedContributor != null) { +/* if (extendedContributor != null) { extendedContributor.updateToolbarActions(); } - } +*/ } } Index: src/org/eclipse/wst/sse/ui/StructuredTextEditor.java =================================================================== RCS file: /cvsroot/webtools/sourceediting/plugins/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/StructuredTextEditor.java,v retrieving revision 1.85 diff -u -r1.85 StructuredTextEditor.java --- src/org/eclipse/wst/sse/ui/StructuredTextEditor.java 3 Dec 2007 18:45:58 -0000 1.85 +++ src/org/eclipse/wst/sse/ui/StructuredTextEditor.java 17 Dec 2007 02:53:51 -0000 @@ -105,6 +105,8 @@ import org.eclipse.ui.IWorkbenchActionConstants; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; +//import org.eclipse.ui.contexts.IContextActivation; +import org.eclipse.ui.contexts.IContextService; import org.eclipse.ui.editors.text.EditorsUI; import org.eclipse.ui.editors.text.ITextEditorHelpContextIds; import org.eclipse.ui.editors.text.TextEditor; @@ -1509,6 +1511,10 @@ * @see org.eclipse.ui.texteditor.AbstractDecoratedTextEditor#createPartControl(org.eclipse.swt.widgets.Composite) */ public void createPartControl(Composite parent) { + + IContextService contextService = (IContextService) getSite().getService(IContextService.class); + contextService.activateContext("org.eclipse.wst.sse.ui.structuredTextEditorScope"); + if (getSourceViewerConfiguration() == null) { ConfigurationAndTarget cat = createSourceViewerConfiguration(); fViewerConfigurationTargetId = cat.getTargetId();