package net.sourceforge.phpeclipse.phpeditor;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import net.sourceforge.phpdt.core.ICompilationUnit;
import net.sourceforge.phpdt.core.IJavaElement;
import net.sourceforge.phpdt.core.IJavaProject;
import net.sourceforge.phpdt.core.IMember;
import net.sourceforge.phpdt.core.ISourceRange;
import net.sourceforge.phpdt.core.ISourceReference;
import net.sourceforge.phpdt.core.JavaCore;
import net.sourceforge.phpdt.core.JavaModelException;
import net.sourceforge.phpdt.core.dom.CompilationUnit;
import net.sourceforge.phpdt.internal.compiler.parser.Scanner;
import net.sourceforge.phpdt.internal.corext.codemanipulation.StubUtility;
import net.sourceforge.phpdt.internal.ui.actions.AddBlockCommentAction;
import net.sourceforge.phpdt.internal.ui.actions.CompositeActionGroup;
import net.sourceforge.phpdt.internal.ui.actions.IndentAction;
import net.sourceforge.phpdt.internal.ui.actions.RemoveBlockCommentAction;
import net.sourceforge.phpdt.internal.ui.text.ContentAssistPreference;
import net.sourceforge.phpdt.internal.ui.text.IPHPPartitions;
import net.sourceforge.phpdt.internal.ui.text.JavaHeuristicScanner;
import net.sourceforge.phpdt.internal.ui.text.JavaIndenter;
import net.sourceforge.phpdt.internal.ui.text.PHPPairMatcher;
import net.sourceforge.phpdt.internal.ui.text.SmartBackspaceManager;
import net.sourceforge.phpdt.internal.ui.text.SmartSemicolonAutoEditStrategy;
import net.sourceforge.phpdt.internal.ui.text.comment.CommentFormattingContext;
import net.sourceforge.phpdt.internal.ui.text.java.IJavaReconcilingListener;
import net.sourceforge.phpdt.internal.ui.text.link.LinkedPositionManager;
import net.sourceforge.phpdt.internal.ui.text.link.LinkedPositionUI;
import net.sourceforge.phpdt.internal.ui.text.link.LinkedPositionUI.ExitFlags;
import net.sourceforge.phpdt.ui.IWorkingCopyManager;
import net.sourceforge.phpdt.ui.PreferenceConstants;
import net.sourceforge.phpdt.ui.actions.GenerateActionGroup;
import net.sourceforge.phpdt.ui.text.JavaTextTools;
import net.sourceforge.phpeclipse.PHPeclipsePlugin;
import net.sourceforge.phpeclipse.phpeditor.actions.RTrimAction;
import net.sourceforge.phpeclipse.ui.editor.ShowExternalPreviewAction;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Preferences;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferenceConverter;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.DocumentCommand;
import org.eclipse.jface.text.IAutoEditStrategy;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ILineTracker;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.ITextOperationTarget;
import org.eclipse.jface.text.ITextViewerExtension;
import org.eclipse.jface.text.ITypedRegion;
import org.eclipse.jface.text.IWidgetTokenKeeper;
import org.eclipse.jface.text.contentassist.ContentAssistant;
import org.eclipse.jface.text.contentassist.IContentAssistant;
import org.eclipse.jface.text.formatter.FormattingContextProperties;
import org.eclipse.jface.text.formatter.IFormattingContext;
import org.eclipse.jface.text.source.IOverviewRuler;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.jface.text.source.IVerticalRuler;
import org.eclipse.jface.text.source.SourceViewerConfiguration;
import org.eclipse.jface.util.ListenerList;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.VerifyKeyListener;
import org.eclipse.swt.events.VerifyEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.ActionContext;
import org.eclipse.ui.actions.ActionGroup;
import org.eclipse.ui.dialogs.SaveAsDialog;
import org.eclipse.ui.editors.text.IStorageDocumentProvider;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.texteditor.AbstractDecoratedTextEditorPreferenceConstants;
import org.eclipse.ui.texteditor.ContentAssistAction;
import org.eclipse.ui.texteditor.IDocumentProvider;
import org.eclipse.ui.texteditor.ITextEditorActionConstants;
import org.eclipse.ui.texteditor.TextOperationAction;
/*******************************************************************************
* Copyright (c) 2000, 2002 IBM Corp. and others. All rights reserved. This
* program and the accompanying materials are made available under the terms of
* the Common Public License v1.0 which accompanies this distribution, and is
* available at http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors: IBM Corporation - Initial implementation
* www.phpeclipse.de
******************************************************************************/
/**
* PHP specific text editor.
*/
public class PHPUnitEditor extends PHPEditor { //implements
// IJavaReconcilingListener {
interface ITextConverter {
void customizeDocumentCommand(IDocument document, DocumentCommand command);
};
// class AdaptedSourceViewer extends JavaSourceViewer {
// private List fTextConverters;
//
// private boolean fIgnoreTextConverters = false;
//
// // private JavaCorrectionAssistant fCorrectionAssistant;
// public AdaptedSourceViewer(Composite parent, IVerticalRuler verticalRuler,
// IOverviewRuler overviewRuler, boolean showAnnotationsOverview,
// int styles, IPreferenceStore store) {
// super(parent, verticalRuler, overviewRuler, showAnnotationsOverview,
// styles, store);
// }
//
// // public AdaptedSourceViewer(Composite parent,
// // IVerticalRuler verticalRuler, IOverviewRuler overviewRuler,
// // boolean showAnnotationsOverview, int styles) {
// // super(parent, verticalRuler, overviewRuler,
// // showAnnotationsOverview, styles);
// // }
// public IContentAssistant getContentAssistant() {
// return fContentAssistant;
// }
//
// /*
// * @see ITextOperationTarget#doOperation(int)
// */
// public void doOperation(int operation) {
// if (getTextWidget() == null)
// return;
// switch (operation) {
// case CONTENTASSIST_PROPOSALS:
// String msg = fContentAssistant.showPossibleCompletions();
// setStatusLineErrorMessage(msg);
// return;
// // case CORRECTIONASSIST_PROPOSALS:
// // fCorrectionAssistant.showPossibleCompletions();
// // return;
// case UNDO:
// fIgnoreTextConverters = true;
// break;
// case REDO:
// fIgnoreTextConverters = true;
// break;
// }
// super.doOperation(operation);
// }
//
// /*
// * @see ITextOperationTarget#canDoOperation(int)
// */
// public boolean canDoOperation(int operation) {
// // if (operation == CORRECTIONASSIST_PROPOSALS)
// // return isEditable();
// return super.canDoOperation(operation);
// }
//
// /*
// * @see TextViewer#handleDispose()
// */
// protected void handleDispose() {
// // if (fCorrectionAssistant != null) {
// // fCorrectionAssistant.uninstall();
// // fCorrectionAssistant= null;
// // }
// super.handleDispose();
// }
//
// public void insertTextConverter(ITextConverter textConverter, int index) {
// throw new UnsupportedOperationException();
// }
//
// public void addTextConverter(ITextConverter textConverter) {
// if (fTextConverters == null) {
// fTextConverters = new ArrayList(1);
// fTextConverters.add(textConverter);
// } else if (!fTextConverters.contains(textConverter))
// fTextConverters.add(textConverter);
// }
//
// public void removeTextConverter(ITextConverter textConverter) {
// if (fTextConverters != null) {
// fTextConverters.remove(textConverter);
// if (fTextConverters.size() == 0)
// fTextConverters = null;
// }
// }
//
// /*
// * @see TextViewer#customizeDocumentCommand(DocumentCommand)
// */
// protected void customizeDocumentCommand(DocumentCommand command) {
// super.customizeDocumentCommand(command);
// if (!fIgnoreTextConverters && fTextConverters != null) {
// for (Iterator e = fTextConverters.iterator(); e.hasNext();)
// ((ITextConverter) e.next()).customizeDocumentCommand(getDocument(),
// command);
// }
// fIgnoreTextConverters = false;
// }
//
// // http://dev.eclipse.org/bugs/show_bug.cgi?id=19270
// public void updateIndentationPrefixes() {
// SourceViewerConfiguration configuration = getSourceViewerConfiguration();
// String[] types = configuration.getConfiguredContentTypes(this);
// for (int i = 0; i < types.length; i++) {
// String[] prefixes = configuration.getIndentPrefixes(this, types[i]);
// if (prefixes != null && prefixes.length > 0)
// setIndentPrefixes(prefixes, types[i]);
// }
// }
//
// /*
// * @see IWidgetTokenOwner#requestWidgetToken(IWidgetTokenKeeper)
// */
// public boolean requestWidgetToken(IWidgetTokenKeeper requester) {
// if (WorkbenchHelp.isContextHelpDisplayed())
// return false;
// return super.requestWidgetToken(requester);
// }
//
//// /*
//// * @see org.eclipse.jface.text.source.ISourceViewer#configure(org.eclipse.jface.text.source.SourceViewerConfiguration)
//// */
//// public void configure(SourceViewerConfiguration configuration) {
//// super.configure(configuration);
//// // fCorrectionAssistant= new
//// // JavaCorrectionAssistant(CompilationUnitEditor.this);
//// // fCorrectionAssistant.install(this);
//// //TODO install SmartBracesAutoEditStrategy
//// // prependAutoEditStrategy(new SmartBracesAutoEditStrategy(this),
//// // IDocument.DEFAULT_CONTENT_TYPE);
//// }
// public void configure(SourceViewerConfiguration configuration) {
// super.configure(configuration);
//// fCorrectionAssistant= new JavaCorrectionAssistant(CompilationUnitEditor.this);
//// fCorrectionAssistant.install(this);
// IAutoEditStrategy smartSemi= new SmartSemicolonAutoEditStrategy(IPHPPartitions.PHP_PARTITIONING);
// prependAutoEditStrategy(smartSemi, IDocument.DEFAULT_CONTENT_TYPE);
// prependAutoEditStrategy(smartSemi, IPHPPartitions.PHP_STRING_DQ);
// prependAutoEditStrategy(smartSemi, IPHPPartitions.PHP_STRING_SQ);
//// prependAutoEditStrategy(smartSemi, IPHPPartitions.JAVA_CHARACTER);
// }
// };
class AdaptedSourceViewer extends JavaSourceViewer {
private List fTextConverters;
private boolean fIgnoreTextConverters = false;
// private JavaCorrectionAssistant fCorrectionAssistant;
public AdaptedSourceViewer(Composite parent, IVerticalRuler verticalRuler, IOverviewRuler overviewRuler,
boolean showAnnotationsOverview, int styles, IPreferenceStore store) {
super(parent, verticalRuler, overviewRuler, showAnnotationsOverview, styles, store);
}
public IContentAssistant getContentAssistant() {
return fContentAssistant;
}
/*
* @see ITextOperationTarget#doOperation(int)
*/
public void doOperation(int operation) {
if (getTextWidget() == null)
return;
switch (operation) {
case CONTENTASSIST_PROPOSALS:
String msg = fContentAssistant.showPossibleCompletions();
setStatusLineErrorMessage(msg);
return;
// case CORRECTIONASSIST_PROPOSALS:
// msg = fCorrectionAssistant.showPossibleCompletions();
// setStatusLineErrorMessage(msg);
// return;
case UNDO:
fIgnoreTextConverters = true;
super.doOperation(operation);
fIgnoreTextConverters = false;
return;
case REDO:
fIgnoreTextConverters = true;
super.doOperation(operation);
fIgnoreTextConverters = false;
return;
}
super.doOperation(operation);
}
/*
* @see ITextOperationTarget#canDoOperation(int)
*/
public boolean canDoOperation(int operation) {
// if (operation == CORRECTIONASSIST_PROPOSALS)
// return isEditable();
return super.canDoOperation(operation);
}
/*
* @see org.eclipse.jface.text.source.ISourceViewerExtension2#unconfigure()
* @since 3.0
*/
public void unconfigure() {
// if (fCorrectionAssistant != null) {
// fCorrectionAssistant.uninstall();
// fCorrectionAssistant = null;
// }
super.unconfigure();
}
public void insertTextConverter(ITextConverter textConverter, int index) {
throw new UnsupportedOperationException();
}
public void addTextConverter(ITextConverter textConverter) {
if (fTextConverters == null) {
fTextConverters = new ArrayList(1);
fTextConverters.add(textConverter);
} else if (!fTextConverters.contains(textConverter))
fTextConverters.add(textConverter);
}
public void removeTextConverter(ITextConverter textConverter) {
if (fTextConverters != null) {
fTextConverters.remove(textConverter);
if (fTextConverters.size() == 0)
fTextConverters = null;
}
}
/*
* @see TextViewer#customizeDocumentCommand(DocumentCommand)
*/
protected void customizeDocumentCommand(DocumentCommand command) {
super.customizeDocumentCommand(command);
if (!fIgnoreTextConverters && fTextConverters != null) {
for (Iterator e = fTextConverters.iterator(); e.hasNext();)
((ITextConverter) e.next()).customizeDocumentCommand(getDocument(), command);
}
}
// http://dev.eclipse.org/bugs/show_bug.cgi?id=19270
public void updateIndentationPrefixes() {
SourceViewerConfiguration configuration = getSourceViewerConfiguration();
String[] types = configuration.getConfiguredContentTypes(this);
for (int i = 0; i < types.length; i++) {
String[] prefixes = configuration.getIndentPrefixes(this, types[i]);
if (prefixes != null && prefixes.length > 0)
setIndentPrefixes(prefixes, types[i]);
}
}
/*
* @see IWidgetTokenOwner#requestWidgetToken(IWidgetTokenKeeper)
*/
public boolean requestWidgetToken(IWidgetTokenKeeper requester) {
if (PlatformUI.getWorkbench().getHelpSystem()
.isContextHelpDisplayed())
return false;
return super.requestWidgetToken(requester);
}
/*
* @see IWidgetTokenOwnerExtension#requestWidgetToken(IWidgetTokenKeeper,
* int)
* @since 3.0
*/
public boolean requestWidgetToken(IWidgetTokenKeeper requester,
int priority) {
if (PlatformUI.getWorkbench().getHelpSystem()
.isContextHelpDisplayed())
return false;
return super.requestWidgetToken(requester, priority);
}
/*
* @see org.eclipse.jface.text.source.ISourceViewer#configure(org.eclipse.jface.text.source.SourceViewerConfiguration)
*/
public void configure(SourceViewerConfiguration configuration) {
super.configure(configuration);
// fCorrectionAssistant = new JavaCorrectionAssistant(CompilationUnitEditor.this);
// fCorrectionAssistant.install(this);
IAutoEditStrategy smartSemi = new SmartSemicolonAutoEditStrategy(IPHPPartitions.PHP_PARTITIONING);
prependAutoEditStrategy(smartSemi, IDocument.DEFAULT_CONTENT_TYPE);
prependAutoEditStrategy(smartSemi, IPHPPartitions.PHP_STRING_DQ);
prependAutoEditStrategy(smartSemi, IPHPPartitions.PHP_STRING_SQ);
prependAutoEditStrategy(smartSemi, IPHPPartitions.PHP_STRING_HEREDOC);
}
/*
* @see org.eclipse.jface.text.source.SourceViewer#createFormattingContext()
* @since 3.0
*/
public IFormattingContext createFormattingContext() {
IFormattingContext context = new CommentFormattingContext();
Map preferences;
IJavaElement inputJavaElement = getInputJavaElement();
IJavaProject javaProject = inputJavaElement != null ? inputJavaElement.getJavaProject() : null;
if (javaProject == null)
preferences = new HashMap(JavaCore.getOptions());
else
preferences = new HashMap(javaProject.getOptions(true));
context.storeToMap(PreferenceConstants.getPreferenceStore(), preferences, false);
context.setProperty(FormattingContextProperties.CONTEXT_PREFERENCES, preferences);
return context;
}
}
/**
* Remembers data related to the current selection to be able to restore it later.
*
* @since 3.0
*/
private class RememberedSelection {
/** The remembered selection start. */
private RememberedOffset fStartOffset = new RememberedOffset();
/** The remembered selection end. */
private RememberedOffset fEndOffset = new RememberedOffset();
/**
* Remember current selection.
*/
public void remember() {
/*
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=52257 This method may be called inside an async call posted to the UI thread,
* so protect against intermediate disposal of the editor.
*/
ISourceViewer viewer = getSourceViewer();
if (viewer != null) {
IRegion selection = getSignedSelection(viewer);
int startOffset = selection.getOffset();
int endOffset = startOffset + selection.getLength();
fStartOffset.setOffset(startOffset);
fEndOffset.setOffset(endOffset);
}
}
/**
* Restore remembered selection.
*/
public void restore() {
/*
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=52257 This method may be called inside an async call posted to the UI thread,
* so protect against intermediate disposal of the editor.
*/
if (getSourceViewer() == null)
return;
try {
int startOffset, endOffset;
int revealStartOffset, revealEndOffset;
if (showsHighlightRangeOnly()) {
IJavaElement newStartElement = fStartOffset.getElement();
startOffset = fStartOffset.getRememberedOffset(newStartElement);
revealStartOffset = fStartOffset.getRevealOffset(newStartElement, startOffset);
if (revealStartOffset == -1)
startOffset = -1;
IJavaElement newEndElement = fEndOffset.getElement();
endOffset = fEndOffset.getRememberedOffset(newEndElement);
revealEndOffset = fEndOffset.getRevealOffset(newEndElement, endOffset);
if (revealEndOffset == -1)
endOffset = -1;
} else {
startOffset = fStartOffset.getOffset();
revealStartOffset = startOffset;
endOffset = fEndOffset.getOffset();
revealEndOffset = endOffset;
}
if (startOffset == -1) {
startOffset = endOffset; // fallback to caret offset
revealStartOffset = revealEndOffset;
}
if (endOffset == -1) {
endOffset = startOffset; // fallback to other offset
revealEndOffset = revealStartOffset;
}
IJavaElement element;
if (endOffset == -1) {
// fallback to element selection
element = fEndOffset.getElement();
if (element == null)
element = fStartOffset.getElement();
if (element != null)
setSelection(element);
return;
}
if (isValidSelection(revealStartOffset, revealEndOffset - revealStartOffset)
&& isValidSelection(startOffset, endOffset - startOffset))
selectAndReveal(startOffset, endOffset - startOffset, revealStartOffset, revealEndOffset - revealStartOffset);
} finally {
fStartOffset.clear();
fEndOffset.clear();
}
}
private boolean isValidSelection(int offset, int length) {
IDocumentProvider provider = getDocumentProvider();
if (provider != null) {
IDocument document = provider.getDocument(getEditorInput());
if (document != null) {
int end = offset + length;
int documentLength = document.getLength();
return 0 <= offset && offset <= documentLength && 0 <= end && end <= documentLength;
}
}
return false;
}
}
/**
* Remembers additional data for a given offset to be able restore it later.
*
* @since 3.0
*/
private class RememberedOffset {
/** Remembered line for the given offset */
private int fLine;
/** Remembered column for the given offset */
private int fColumn;
/** Remembered Java element for the given offset */
private IJavaElement fElement;
/** Remembered Java element line for the given offset */
private int fElementLine;
/**
* Store visual properties of the given offset.
*
* @param offset
* Offset in the document
*/
public void setOffset(int offset) {
try {
IDocument document = getSourceViewer().getDocument();
fLine = document.getLineOfOffset(offset);
fColumn = offset - document.getLineOffset(fLine);
fElement = getElementAt(offset, true);
fElementLine = -1;
if (fElement instanceof IMember) {
ISourceRange range = ((IMember) fElement).getNameRange();
if (range != null)
fElementLine = document.getLineOfOffset(range.getOffset());
}
if (fElementLine == -1)
fElementLine = document.getLineOfOffset(getOffset(fElement));
} catch (BadLocationException e) {
// should not happen
PHPeclipsePlugin.log(e);
clear();
} catch (JavaModelException e) {
// should not happen
PHPeclipsePlugin.log(e.getStatus());
clear();
}
}
/**
* Return offset recomputed from stored visual properties.
*
* @return Offset in the document
*/
public int getOffset() {
IJavaElement newElement = getElement();
int offset = getRememberedOffset(newElement);
if (offset != -1 && !containsOffset(newElement, offset) && (offset == 0 || !containsOffset(newElement, offset - 1)))
return -1;
return offset;
}
/**
* Return offset recomputed from stored visual properties.
*
* @param newElement
* Enclosing element
* @return Offset in the document
*/
public int getRememberedOffset(IJavaElement newElement) {
try {
if (newElement == null)
return -1;
IDocument document = getSourceViewer().getDocument();
int newElementLine = -1;
if (newElement instanceof IMember) {
ISourceRange range = ((IMember) newElement).getNameRange();
if (range != null)
newElementLine = document.getLineOfOffset(range.getOffset());
}
if (newElementLine == -1)
newElementLine = document.getLineOfOffset(getOffset(newElement));
if (newElementLine == -1)
return -1;
int newLine = fLine + newElementLine - fElementLine;
if (newLine < 0 || newLine >= document.getNumberOfLines())
return -1;
int maxColumn = document.getLineLength(newLine);
String lineDelimiter = document.getLineDelimiter(newLine);
if (lineDelimiter != null)
maxColumn = maxColumn - lineDelimiter.length();
int offset;
if (fColumn > maxColumn)
offset = document.getLineOffset(newLine) + maxColumn;
else
offset = document.getLineOffset(newLine) + fColumn;
return offset;
} catch (BadLocationException e) {
// should not happen
PHPeclipsePlugin.log(e);
return -1;
} catch (JavaModelException e) {
// should not happen
PHPeclipsePlugin.log(e.getStatus());
return -1;
}
}
/**
* Returns the offset used to reveal the given element based on the given selection offset.
*
* @param element
* the element
* @param offset
* the selection offset
* @return the offset to reveal the given element based on the given selection offset
*/
public int getRevealOffset(IJavaElement element, int offset) {
if (element == null || offset == -1)
return -1;
if (containsOffset(element, offset)) {
if (offset > 0) {
IJavaElement alternateElement = getElementAt(offset, false);
if (element.getHandleIdentifier().equals(alternateElement.getParent().getHandleIdentifier()))
return offset - 1; // Solves test case 2 from https://bugs.eclipse.org/bugs/show_bug.cgi?id=47727#c3
}
return offset;
} else if (offset > 0 && containsOffset(element, offset - 1))
return offset - 1; // Solves test case 1 from https://bugs.eclipse.org/bugs/show_bug.cgi?id=47727#c3
return -1;
}
/**
* Return Java element recomputed from stored visual properties.
*
* @return Java element
*/
public IJavaElement getElement() {
if (fElement == null)
return null;
return findElement(fElement);
}
/**
* Clears the stored position
*/
public void clear() {
fLine = -1;
fColumn = -1;
fElement = null;
fElementLine = -1;
}
/**
* Does the given Java element contain the given offset?
*
* @param element
* Java element
* @param offset
* Offset
* @return true
iff the Java element contains the offset
*/
private boolean containsOffset(IJavaElement element, int offset) {
int elementOffset = getOffset(element);
int elementLength = getLength(element);
return (elementOffset > -1 && elementLength > -1) ? (offset >= elementOffset && offset < elementOffset + elementLength)
: false;
}
/**
* Returns the offset of the given Java element.
*
* @param element
* Java element
* @return Offset of the given Java element
*/
private int getOffset(IJavaElement element) {
if (element instanceof ISourceReference) {
ISourceReference sr = (ISourceReference) element;
try {
ISourceRange srcRange = sr.getSourceRange();
if (srcRange != null)
return srcRange.getOffset();
} catch (JavaModelException e) {
}
}
return -1;
}
/**
* Returns the length of the given Java element.
*
* @param element
* Java element
* @return Length of the given Java element
*/
private int getLength(IJavaElement element) {
if (element instanceof ISourceReference) {
ISourceReference sr = (ISourceReference) element;
try {
ISourceRange srcRange = sr.getSourceRange();
if (srcRange != null)
return srcRange.getLength();
} catch (JavaModelException e) {
}
}
return -1;
}
/**
* Returns the updated java element for the old java element.
*
* @param element
* Old Java element
* @return Updated Java element
*/
private IJavaElement findElement(IJavaElement element) {
if (element == null)
return null;
IWorkingCopyManager manager = PHPeclipsePlugin.getDefault().getWorkingCopyManager();
ICompilationUnit unit = manager.getWorkingCopy(getEditorInput());
if (unit != null) {
try {
synchronized (unit) {
// unit.reconcile(ICompilationUnit.NO_AST, false, null, null);
unit.reconcile();
}
IJavaElement[] findings = unit.findElements(element);
if (findings != null && findings.length > 0)
return findings[0];
} catch (JavaModelException x) {
PHPeclipsePlugin.log(x.getStatus());
// nothing found, be tolerant and go on
}
}
return null;
}
}
static class TabConverter implements ITextConverter {
private int fTabRatio;
private ILineTracker fLineTracker;
public TabConverter() {
}
public void setNumberOfSpacesPerTab(int ratio) {
fTabRatio = ratio;
}
public void setLineTracker(ILineTracker lineTracker) {
fLineTracker = lineTracker;
}
private int insertTabString(StringBuffer buffer, int offsetInLine) {
if (fTabRatio == 0)
return 0;
int remainder = offsetInLine % fTabRatio;
remainder = fTabRatio - remainder;
for (int i = 0; i < remainder; i++)
buffer.append(' ');
return remainder;
}
public void customizeDocumentCommand(IDocument document, DocumentCommand command) {
String text = command.text;
if (text == null)
return;
int index = text.indexOf('\t');
if (index > -1) {
StringBuffer buffer = new StringBuffer();
fLineTracker.set(command.text);
int lines = fLineTracker.getNumberOfLines();
try {
for (int i = 0; i < lines; i++) {
int offset = fLineTracker.getLineOffset(i);
int endOffset = offset + fLineTracker.getLineLength(i);
String line = text.substring(offset, endOffset);
int position = 0;
if (i == 0) {
IRegion firstLine = document.getLineInformationOfOffset(command.offset);
position = command.offset - firstLine.getOffset();
}
int length = line.length();
for (int j = 0; j < length; j++) {
char c = line.charAt(j);
if (c == '\t') {
position += insertTabString(buffer, position);
} else {
buffer.append(c);
++position;
}
}
}
command.text = buffer.toString();
} catch (BadLocationException x) {
}
}
}
};
private static class ExitPolicy implements LinkedPositionUI.ExitPolicy {
final char fExitCharacter;
public ExitPolicy(char exitCharacter) {
fExitCharacter = exitCharacter;
}
/*
* @see org.phpeclipse.phpdt.internal.ui.text.link.LinkedPositionUI.ExitPolicy#doExit(org.phpeclipse.phpdt.internal.ui.text.link.LinkedPositionManager,
* org.eclipse.swt.events.VerifyEvent, int, int)
*/
public ExitFlags doExit(LinkedPositionManager manager, VerifyEvent event, int offset, int length) {
if (event.character == fExitCharacter) {
if (manager.anyPositionIncludes(offset, length))
return new ExitFlags(LinkedPositionUI.COMMIT | LinkedPositionUI.UPDATE_CARET, false);
else
return new ExitFlags(LinkedPositionUI.COMMIT, true);
}
switch (event.character) {
case '\b':
if (manager.getFirstPosition().length == 0)
return new ExitFlags(0, false);
else
return null;
case '\n':
case '\r':
return new ExitFlags(LinkedPositionUI.COMMIT, true);
default:
return null;
}
}
}
private static class BracketLevel {
int fOffset;
int fLength;
LinkedPositionManager fManager;
LinkedPositionUI fEditor;
};
private class BracketInserter implements VerifyKeyListener, LinkedPositionUI.ExitListener {
private boolean fCloseBracketsPHP = true;
private boolean fCloseStringsPHPDQ = true;
private boolean fCloseStringsPHPSQ = true;
private int fOffset;
private int fLength;
public void setCloseBracketsPHPEnabled(boolean enabled) {
fCloseBracketsPHP = enabled;
}
public void setCloseStringsPHPDQEnabled(boolean enabled) {
fCloseStringsPHPDQ = enabled;
}
public void setCloseStringsPHPSQEnabled(boolean enabled) {
fCloseStringsPHPSQ = enabled;
}
private boolean hasIdentifierToTheRight(IDocument document, int offset) {
try {
int end = offset;
IRegion endLine = document.getLineInformationOfOffset(end);
int maxEnd = endLine.getOffset() + endLine.getLength();
while (end != maxEnd && Character.isWhitespace(document.getChar(end)))
++end;
return end != maxEnd && Scanner.isPHPIdentifierPart(document.getChar(end));
} catch (BadLocationException e) {
// be conservative
return true;
}
}
private boolean hasIdentifierToTheLeft(IDocument document, int offset) {
try {
int start = offset;
IRegion startLine = document.getLineInformationOfOffset(start);
int minStart = startLine.getOffset();
while (start != minStart && Character.isWhitespace(document.getChar(start - 1)))
--start;
return start != minStart && Scanner.isPHPIdentifierPart(document.getChar(start - 1));
} catch (BadLocationException e) {
return true;
}
}
private boolean hasCharacterToTheLeft(IDocument document, int offset, char character) {
try {
int start = offset;
IRegion startLine = document.getLineInformationOfOffset(start);
int minStart = startLine.getOffset();
while (start != minStart && Character.isWhitespace(document.getChar(start - 1)))
--start;
return start != minStart && document.getChar(start - 1)== character;
} catch (BadLocationException e) {
return false;
}
}
private boolean hasCharacterToTheRight(IDocument document, int offset, char character) {
try {
int end = offset;
IRegion endLine = document.getLineInformationOfOffset(end);
int maxEnd = endLine.getOffset() + endLine.getLength();
while (end != maxEnd && Character.isWhitespace(document.getChar(end)))
++end;
return end != maxEnd && document.getChar(end) == character;
} catch (BadLocationException e) {
// be conservative
return true;
}
}
/*
* @see org.eclipse.swt.custom.VerifyKeyListener#verifyKey(org.eclipse.swt.events.VerifyEvent)
*/
public void verifyKey(VerifyEvent event) {
if (!event.doit)
return;
final ISourceViewer sourceViewer = getSourceViewer();
IDocument document = sourceViewer.getDocument();
final Point selection = sourceViewer.getSelectedRange();
final int offset = selection.x;
final int length = selection.y;
try {
ITypedRegion partition = document.getPartition(offset);
String type = partition.getType();
if (type.equals(IPHPPartitions.PHP_PARTITIONING) || type.equals(IDocument.DEFAULT_CONTENT_TYPE)) {
// you will get IDocument.DEFAULT_CONTENT_TYPE for both PHP and HTML area
switch (event.character) {
case '(':
if (hasCharacterToTheRight(document, offset + length, '('))
return;
// fall through
case '[':
if (!fCloseBracketsPHP)
return;
if (hasIdentifierToTheRight(document, offset + length))
return;
// fall through
case '"':
if (event.character == '"') {
if (!fCloseStringsPHPDQ)
return;
// changed for statements like echo "" print ""
// if (hasIdentifierToTheLeft(document, offset)
// ||
// hasIdentifierToTheRight(document, offset +
// length))
if (hasIdentifierToTheRight(document, offset + length))
return;
}
// ITypedRegion partition=
// document.getPartition(offset);
// if (!
// IDocument.DEFAULT_CONTENT_TYPE.equals(partition.getType())
// &&
// (partition.getOffset() != offset))
// return;
final char characterDQ = event.character;
final char closingCharacterDQ = getPeerCharacter(characterDQ);
final StringBuffer bufferDQ = new StringBuffer();
bufferDQ.append(characterDQ);
bufferDQ.append(closingCharacterDQ);
document.replace(offset, length, bufferDQ.toString());
LinkedPositionManager managerDQ = new LinkedPositionManager(document);
managerDQ.addPosition(offset + 1, 0);
fOffset = offset;
fLength = 2;
LinkedPositionUI editorDQ = new LinkedPositionUI(sourceViewer, managerDQ);
editorDQ.setCancelListener(this);
editorDQ.setExitPolicy(new ExitPolicy(closingCharacterDQ));
editorDQ.setFinalCaretOffset(offset + 2);
editorDQ.enter();
IRegion newSelectionDQ = editorDQ.getSelectedRegion();
sourceViewer.setSelectedRange(newSelectionDQ.getOffset(), newSelectionDQ.getLength());
event.doit = false;
break;
case '\'':
if (event.character == '\'') {
if (!fCloseStringsPHPSQ)
return;
// changed for statements like echo "" print ""
// if (hasIdentifierToTheLeft(document, offset)
// ||
// hasIdentifierToTheRight(document, offset +
// length))
if (hasIdentifierToTheRight(document, offset + length))
return;
}
// ITypedRegion partition=
// document.getPartition(offset);
// if (!
// IDocument.DEFAULT_CONTENT_TYPE.equals(partition.getType())
// &&
// (partition.getOffset() != offset))
// return;
final char characterSQ = event.character;
final char closingCharacterSQ = getPeerCharacter(characterSQ);
final StringBuffer bufferSQ = new StringBuffer();
bufferSQ.append(characterSQ);
bufferSQ.append(closingCharacterSQ);
document.replace(offset, length, bufferSQ.toString());
LinkedPositionManager managerSQ = new LinkedPositionManager(document);
managerSQ.addPosition(offset + 1, 0);
fOffset = offset;
fLength = 2;
LinkedPositionUI editorSQ = new LinkedPositionUI(sourceViewer, managerSQ);
editorSQ.setCancelListener(this);
editorSQ.setExitPolicy(new ExitPolicy(closingCharacterSQ));
editorSQ.setFinalCaretOffset(offset + 2);
editorSQ.enter();
IRegion newSelectionSQ = editorSQ.getSelectedRegion();
sourceViewer.setSelectedRange(newSelectionSQ.getOffset(), newSelectionSQ.getLength());
event.doit = false;
case '\r': { // insert linebreaks and new closing brace after brace and return
if (!fCloseBracketsPHP) {
return;
}
if (hasCharacterToTheLeft(document,offset,'{')) {
String lineDelimiter=StubUtility.getLineDelimiterFor(document);
int caretPos=sourceViewer.getTextWidget().getCaretOffset();
final StringBuffer buffer = new StringBuffer(lineDelimiter);
// get indentation
IRegion line = document.getLineInformationOfOffset(offset);
String currentLine=document.get(line.getOffset(),line.getLength());
int index=0;
int max=currentLine.length();
StringBuffer indent=new StringBuffer();
while (index
reconcile
is true
the editor's
* input element is reconciled in advance. If it is false
this method only returns a result if the editor's input
* element does not need to be reconciled.
*
* @param offset
* the offset included by the retrieved element
* @param reconcile
* true
if working copy should be reconciled
*/
protected IJavaElement getElementAt(int offset, boolean reconcile) {
IWorkingCopyManager manager = PHPeclipsePlugin.getDefault().getWorkingCopyManager();
ICompilationUnit unit = manager.getWorkingCopy(getEditorInput());
if (unit != null) {
try {
if (reconcile) {
synchronized (unit) {
unit.reconcile();
}
return unit.getElementAt(offset);
} else if (unit.isConsistent())
return unit.getElementAt(offset);
} catch (JavaModelException x) {
PHPeclipsePlugin.log(x.getStatus());
// nothing found, be tolerant and go on
}
}
return null;
}
/*
* @see JavaEditor#getCorrespondingElement(IJavaElement)
*/
protected IJavaElement getCorrespondingElement(IJavaElement element) {
try {
return EditorUtility.getWorkingCopy(element, true);
} catch (JavaModelException x) {
PHPeclipsePlugin.log(x.getStatus());
// nothing found, be tolerant and go on
}
return null;
}
public void createPartControl(Composite parent) {
super.createPartControl(parent);
// fPaintManager = new PaintManager(getSourceViewer());
LinePainter linePainter;
linePainter = new LinePainter(getSourceViewer());
linePainter.setHighlightColor(new Color(Display.getCurrent(), 225, 235, 224));
// fPaintManager.addPainter(linePainter);
// if (isBracketHighlightingEnabled())
// startBracketHighlighting();
// if (isLineHighlightingEnabled())
// startLineHighlighting();
// if (isPrintMarginVisible())
// showPrintMargin();
// Iterator e = ANNOTATION_MAP.keySet().iterator();
// while (e.hasNext()) {
// AnnotationType type = (AnnotationType) e.next();
// if (isAnnotationIndicationEnabled(type))
// startAnnotationIndication(type);
// }
if (isTabConversionEnabled())
startTabConversion();
// if (isOverviewRulerVisible())
// showOverviewRuler();
//
// Preferences preferences =
// PHPeclipsePlugin.getDefault().getPluginPreferences();
// preferences.addPropertyChangeListener(fPropertyChangeListener);
IPreferenceStore preferenceStore = getPreferenceStore();
boolean closeBracketsPHP = preferenceStore.getBoolean(CLOSE_BRACKETS_PHP);
boolean closeStringsPHPDQ = preferenceStore.getBoolean(CLOSE_STRINGS_DQ_PHP);
boolean closeStringsPHPSQ = preferenceStore.getBoolean(CLOSE_STRINGS_SQ_PHP);
fBracketInserter.setCloseBracketsPHPEnabled(closeBracketsPHP);
fBracketInserter.setCloseStringsPHPDQEnabled(closeStringsPHPDQ);
fBracketInserter.setCloseStringsPHPSQEnabled(closeStringsPHPSQ);
ISourceViewer sourceViewer = getSourceViewer();
if (sourceViewer instanceof ITextViewerExtension)
((ITextViewerExtension) sourceViewer).prependVerifyKeyListener(fBracketInserter);
}
private static char getPeerCharacter(char character) {
switch (character) {
case '(':
return ')';
case ')':
return '(';
case '[':
return ']';
case ']':
return '[';
case '"':
return character;
case '\'':
return character;
case '{':
return '}';
default:
throw new IllegalArgumentException();
}
}
// private void startBracketHighlighting() {
// if (fBracketPainter == null) {
// ISourceViewer sourceViewer = getSourceViewer();
// fBracketPainter = new BracketPainter(sourceViewer);
// fBracketPainter.setHighlightColor(getColor(MATCHING_BRACKETS_COLOR));
// // fPaintManager.addPainter(fBracketPainter);
// }
// }
//
// private void stopBracketHighlighting() {
// if (fBracketPainter != null) {
// // fPaintManager.removePainter(fBracketPainter);
// fBracketPainter.deactivate(true);
// fBracketPainter.dispose();
// fBracketPainter = null;
// }
// }
// private boolean isBracketHighlightingEnabled() {
// IPreferenceStore store = getPreferenceStore();
// return store.getBoolean(MATCHING_BRACKETS);
// }
// private void startLineHighlighting() {
// if (fLinePainter == null) {
// ISourceViewer sourceViewer = getSourceViewer();
// fLinePainter = new LinePainter(sourceViewer);
// fLinePainter.setHighlightColor(getColor(CURRENT_LINE_COLOR));
// // fPaintManager.addPainter(fLinePainter);
// }
// }
// private void stopLineHighlighting() {
// if (fLinePainter != null) {
// // fPaintManager.removePainter(fLinePainter);
// fLinePainter.deactivate(true);
// fLinePainter.dispose();
// fLinePainter = null;
// }
// }
// private boolean isLineHighlightingEnabled() {
// IPreferenceStore store = getPreferenceStore();
// return store.getBoolean(CURRENT_LINE);
// }
// private void showPrintMargin() {
// if (fPrintMarginPainter == null) {
// fPrintMarginPainter = new PrintMarginPainter(getSourceViewer());
// fPrintMarginPainter.setMarginRulerColor(getColor(PRINT_MARGIN_COLOR));
// fPrintMarginPainter.setMarginRulerColumn(getPreferenceStore().getInt(PRINT_MARGIN_COLUMN));
// // fPaintManager.addPainter(fPrintMarginPainter);
// }
// }
// private void hidePrintMargin() {
// if (fPrintMarginPainter != null) {
// // fPaintManager.removePainter(fPrintMarginPainter);
// fPrintMarginPainter.deactivate(true);
// fPrintMarginPainter.dispose();
// fPrintMarginPainter = null;
// }
// }
// private boolean isPrintMarginVisible() {
// IPreferenceStore store = getPreferenceStore();
// return store.getBoolean(PRINT_MARGIN);
// }
private int getTabSize() {
Preferences preferences = PHPeclipsePlugin.getDefault().getPluginPreferences();
return preferences.getInt(CODE_FORMATTER_TAB_SIZE);
}
private boolean isTabConversionEnabled() {
IPreferenceStore store = getPreferenceStore();
return store.getBoolean(SPACES_FOR_TABS);
}
private Color getColor(String key) {
RGB rgb = PreferenceConverter.getColor(getPreferenceStore(), key);
return getColor(rgb);
}
private Color getColor(RGB rgb) {
JavaTextTools textTools = PHPeclipsePlugin.getDefault().getJavaTextTools();
return textTools.getColorManager().getColor(rgb);
}
// private Color getColor(AnnotationType annotationType) {
// AnnotationInfo info = (AnnotationInfo)
// ANNOTATION_MAP.get(annotationType);
// if (info != null)
// return getColor(info.fColorPreference);
// return null;
// }
public void dispose() {
ISourceViewer sourceViewer = getSourceViewer();
if (sourceViewer instanceof ITextViewerExtension)
((ITextViewerExtension) sourceViewer).removeVerifyKeyListener(fBracketInserter);
// if (fPropertyChangeListener != null) {
// Preferences preferences =
// PHPeclipsePlugin.getDefault().getPluginPreferences();
// preferences.removePropertyChangeListener(fPropertyChangeListener);
// fPropertyChangeListener = null;
// }
if (fJavaEditorErrorTickUpdater != null) {
fJavaEditorErrorTickUpdater.dispose();
fJavaEditorErrorTickUpdater = null;
}
// if (fSelectionHistory != null)
// fSelectionHistory.dispose();
// if (fPaintManager != null) {
// fPaintManager.dispose();
// fPaintManager = null;
// }
if (fActionGroups != null) {
fActionGroups.dispose();
fActionGroups = null;
}
super.dispose();
}
// protected AnnotationType getAnnotationType(String preferenceKey) {
// Iterator e = ANNOTATION_MAP.keySet().iterator();
// while (e.hasNext()) {
// AnnotationType type = (AnnotationType) e.next();
// AnnotationInfo info = (AnnotationInfo) ANNOTATION_MAP.get(type);
// if (info != null) {
// if (preferenceKey.equals(info.fColorPreference)
// || preferenceKey.equals(info.fEditorPreference)
// || preferenceKey.equals(info.fOverviewRulerPreference))
// return type;
// }
// }
// return null;
// }
/*
* @see AbstractTextEditor#handlePreferenceStoreChanged(PropertyChangeEvent)
*/
protected void handlePreferenceStoreChanged(PropertyChangeEvent event) {
try {
AdaptedSourceViewer asv = (AdaptedSourceViewer) getSourceViewer();
if (asv != null) {
String p = event.getProperty();
if (CLOSE_BRACKETS_PHP.equals(p)) {
fBracketInserter.setCloseBracketsPHPEnabled(getPreferenceStore().getBoolean(p));
return;
}
if (CLOSE_STRINGS_DQ_PHP.equals(p)) {
fBracketInserter.setCloseStringsPHPDQEnabled(getPreferenceStore().getBoolean(p));
return;
}
if (CLOSE_STRINGS_SQ_PHP.equals(p)) {
fBracketInserter.setCloseStringsPHPSQEnabled(getPreferenceStore().getBoolean(p));
return;
}
if (SPACES_FOR_TABS.equals(p)) {
if (isTabConversionEnabled())
startTabConversion();
else
stopTabConversion();
return;
}
// if (MATCHING_BRACKETS.equals(p)) {
// if (isBracketHighlightingEnabled())
// startBracketHighlighting();
// else
// stopBracketHighlighting();
// return;
// }
// if (MATCHING_BRACKETS_COLOR.equals(p)) {
// if (fBracketPainter != null)
// fBracketPainter.setHighlightColor(getColor(MATCHING_BRACKETS_COLOR));
// return;
// }
// if (CURRENT_LINE.equals(p)) {
// if (isLineHighlightingEnabled())
// startLineHighlighting();
// else
// stopLineHighlighting();
// return;
// }
// if (CURRENT_LINE_COLOR.equals(p)) {
// if (fLinePainter != null) {
// stopLineHighlighting();
// startLineHighlighting();
// }
// return;
// }
// if (PRINT_MARGIN.equals(p)) {
// if (isPrintMarginVisible())
// showPrintMargin();
// else
// hidePrintMargin();
// return;
// }
// if (PRINT_MARGIN_COLOR.equals(p)) {
// if (fPrintMarginPainter != null)
// fPrintMarginPainter.setMarginRulerColor(getColor(PRINT_MARGIN_COLOR));
// return;
// }
// if (PRINT_MARGIN_COLUMN.equals(p)) {
// if (fPrintMarginPainter != null)
// fPrintMarginPainter.setMarginRulerColumn(getPreferenceStore().getInt(PRINT_MARGIN_COLUMN));
// return;
// }
// if (OVERVIEW_RULER.equals(p)) {
// if (isOverviewRulerVisible())
// showOverviewRuler();
// else
// hideOverviewRuler();
// return;
// }
// AnnotationType type = getAnnotationType(p);
// if (type != null) {
//
// AnnotationInfo info = (AnnotationInfo)
// ANNOTATION_MAP.get(type);
// if (info.fColorPreference.equals(p)) {
// Color color = getColor(type);
// if (fProblemPainter != null) {
// fProblemPainter.setColor(type, color);
// fProblemPainter.paint(IPainter.CONFIGURATION);
// }
// setColorInOverviewRuler(type, color);
// return;
// }
//
// if (info.fEditorPreference.equals(p)) {
// if (isAnnotationIndicationEnabled(type))
// startAnnotationIndication(type);
// else
// stopAnnotationIndication(type);
// return;
// }
//
// if (info.fOverviewRulerPreference.equals(p)) {
// if (isAnnotationIndicationInOverviewRulerEnabled(type))
// showAnnotationIndicationInOverviewRuler(type, true);
// else
// showAnnotationIndicationInOverviewRuler(type, false);
// return;
// }
// }
IContentAssistant c = asv.getContentAssistant();
if (c instanceof ContentAssistant)
ContentAssistPreference.changeConfiguration((ContentAssistant) c, getPreferenceStore(), event);
}
} finally {
super.handlePreferenceStoreChanged(event);
}
}
/*
* @see net.sourceforge.phpdt.internal.ui.javaeditor.JavaEditor#handlePreferencePropertyChanged(org.eclipse.core.runtime.Preferences.PropertyChangeEvent)
*/
protected void handlePreferencePropertyChanged(org.eclipse.core.runtime.Preferences.PropertyChangeEvent event) {
AdaptedSourceViewer asv = (AdaptedSourceViewer) getSourceViewer();
if (asv != null) {
String p = event.getProperty();
if (CODE_FORMATTER_TAB_SIZE.equals(p)) {
asv.updateIndentationPrefixes();
if (fTabConverter != null)
fTabConverter.setNumberOfSpacesPerTab(getTabSize());
}
}
super.handlePreferencePropertyChanged(event);
}
/**
* Handles a property change event describing a change of the php core's preferences and updates the preference related editor
* properties.
*
* @param event
* the property change event
*/
// protected void
// handlePreferencePropertyChanged(org.eclipse.core.runtime.Preferences.PropertyChangeEvent
// event) {
// AdaptedSourceViewer asv = (AdaptedSourceViewer) getSourceViewer();
// if (asv != null) {
// String p = event.getProperty();
// if (CODE_FORMATTER_TAB_SIZE.equals(p)) {
// asv.updateIndentationPrefixes();
// if (fTabConverter != null)
// fTabConverter.setNumberOfSpacesPerTab(getTabSize());
// }
// }
// }
/*
* @see net.sourceforge.phpdt.internal.ui.javaeditor.JavaEditor#createJavaSourceViewer(org.eclipse.swt.widgets.Composite,
* org.eclipse.jface.text.source.IVerticalRuler, org.eclipse.jface.text.source.IOverviewRuler, boolean, int)
*/
protected ISourceViewer createJavaSourceViewer(Composite parent, IVerticalRuler verticalRuler, IOverviewRuler overviewRuler,
boolean isOverviewRulerVisible, int styles, IPreferenceStore store) {
return new AdaptedSourceViewer(parent, verticalRuler, overviewRuler, isOverviewRulerVisible, styles, store);
}
// protected ISourceViewer createJavaSourceViewer(Composite parent,
// IVerticalRuler ruler, int styles) {
// return new AdaptedSourceViewer(parent, ruler, styles);
// }
private boolean isValidSelection(int offset, int length) {
IDocumentProvider provider = getDocumentProvider();
if (provider != null) {
IDocument document = provider.getDocument(getEditorInput());
if (document != null) {
int end = offset + length;
int documentLength = document.getLength();
return 0 <= offset && offset <= documentLength && 0 <= end && end <= documentLength;
}
}
return false;
}
/*
* @see net.sourceforge.phpdt.internal.ui.javaeditor.JavaEditor#getInputElement()
*/
protected IJavaElement getInputJavaElement() {
return PHPeclipsePlugin.getDefault().getWorkingCopyManager().getWorkingCopy(getEditorInput());
}
/*
* @see AbstractTextEditor#editorContextMenuAboutToShow(IMenuManager)
*/
public void editorContextMenuAboutToShow(IMenuManager menu) {
super.editorContextMenuAboutToShow(menu);
ActionContext context = new ActionContext(getSelectionProvider().getSelection());
fContextMenuGroup.setContext(context);
fContextMenuGroup.fillContextMenu(menu);
fContextMenuGroup.setContext(null);
}
/*
* @see JavaEditor#setOutlinePageInput(JavaOutlinePage, IEditorInput)
*/
protected void setOutlinePageInput(JavaOutlinePage page, IEditorInput input) {
if (page != null) {
IWorkingCopyManager manager = PHPeclipsePlugin.getDefault().getWorkingCopyManager();
page.setInput(manager.getWorkingCopy(input));
}
}
/*
* @see AbstractTextEditor#performSaveOperation(WorkspaceModifyOperation, IProgressMonitor)
*/
// protected void performSaveOperation(WorkspaceModifyOperation operation,
// IProgressMonitor progressMonitor) {
// IDocumentProvider p = getDocumentProvider();
// if (p instanceof PHPDocumentProvider) {
// PHPDocumentProvider cp = (PHPDocumentProvider) p;
// cp.setSavePolicy(fSavePolicy);
// }
//
// try {
// super.performSaveOperation(operation, progressMonitor);
// } finally {
// if (p instanceof PHPDocumentProvider) {
// PHPDocumentProvider cp = (PHPDocumentProvider) p;
// cp.setSavePolicy(null);
// }
// }
// }
/*
* @see AbstractTextEditor#doSave(IProgressMonitor)
*/
public void doSave(IProgressMonitor progressMonitor) {
IDocumentProvider p = getDocumentProvider();
if (p == null) {
// editor has been closed
return;
}
if (p.isDeleted(getEditorInput())) {
if (isSaveAsAllowed()) {
/*
* 1GEUSSR: ITPUI:ALL - User should never loose changes made in the editors. Changed Behavior to make sure that if called
* inside a regular save (because of deletion of input element) there is a way to report back to the caller.
*/
performSaveAs(progressMonitor);
} else {
/*
* 1GF5YOX: ITPJUI:ALL - Save of delete file claims it's still there Missing resources.
*/
Shell shell = getSite().getShell();
MessageDialog
.openError(
shell,
PHPEditorMessages.getString("PHPUnitEditor.error.saving.title1"), PHPEditorMessages.getString("PHPUnitEditor.error.saving.message1")); //$NON-NLS-1$ //$NON-NLS-2$
}
} else {
if (getPreferenceStore().getBoolean(PreferenceConstants.EDITOR_P_RTRIM_ON_SAVE)) {
RTrimAction trimAction = new RTrimAction();
trimAction.setActiveEditor(null, getSite().getPage().getActiveEditor());
trimAction.run(null);
}
setStatusLineErrorMessage(null);
updateState(getEditorInput());
validateState(getEditorInput());
IWorkingCopyManager manager = PHPeclipsePlugin.getDefault().getWorkingCopyManager();
ICompilationUnit unit = manager.getWorkingCopy(getEditorInput());
if (unit != null) {
synchronized (unit) {
performSave(false, progressMonitor);
}
} else
performSave(false, progressMonitor);
}
}
public boolean isSaveAsAllowed() {
return true;
}
/**
* The compilation unit editor implementation of this AbstractTextEditor
method asks the user for the workspace
* path of a file resource and saves the document there. See http://dev.eclipse.org/bugs/show_bug.cgi?id=6295
*
* @param progressMonitor
* the progress monitor
*/
protected void performSaveAs(IProgressMonitor progressMonitor) {
Shell shell = getSite().getShell();
IEditorInput input = getEditorInput();
SaveAsDialog dialog = new SaveAsDialog(shell);
IFile original = (input instanceof IFileEditorInput) ? ((IFileEditorInput) input).getFile() : null;
if (original != null)
dialog.setOriginalFile(original);
dialog.create();
IDocumentProvider provider = getDocumentProvider();
if (provider == null) {
// editor has been programmatically closed while the dialog was open
return;
}
if (provider.isDeleted(input) && original != null) {
String message = PHPEditorMessages.getFormattedString(
"CompilationUnitEditor.warning.save.delete", new Object[] { original.getName() }); //$NON-NLS-1$
dialog.setErrorMessage(null);
dialog.setMessage(message, IMessageProvider.WARNING);
}
if (dialog.open() == Window.CANCEL) {
if (progressMonitor != null)
progressMonitor.setCanceled(true);
return;
}
IPath filePath = dialog.getResult();
if (filePath == null) {
if (progressMonitor != null)
progressMonitor.setCanceled(true);
return;
}
IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
IFile file = workspaceRoot.getFile(filePath);
final IEditorInput newInput = new FileEditorInput(file);
boolean success = false;
try {
provider.aboutToChange(newInput);
getDocumentProvider().saveDocument(progressMonitor, newInput, getDocumentProvider().getDocument(getEditorInput()), true);
success = true;
} catch (CoreException x) {
IStatus status = x.getStatus();
if (status == null || status.getSeverity() != IStatus.CANCEL)
ErrorDialog
.openError(
shell,
PHPEditorMessages.getString("CompilationUnitEditor.error.saving.title2"), PHPEditorMessages.getString("CompilationUnitEditor.error.saving.message2"), x.getStatus()); //$NON-NLS-1$ //$NON-NLS-2$
} finally {
provider.changed(newInput);
if (success)
setInput(newInput);
}
if (progressMonitor != null)
progressMonitor.setCanceled(!success);
}
/*
* @see AbstractTextEditor#doSetInput(IEditorInput)
*/
protected void doSetInput(IEditorInput input) throws CoreException {
super.doSetInput(input);
configureTabConverter();
configureToggleCommentAction();
}
// /*
// * @see
// net.sourceforge.phpdt.internal.ui.javaeditor.JavaEditor#installOverrideIndicator(boolean)
// * @since 3.0
// */
// protected void installOverrideIndicator(boolean waitForReconcilation) {
// IAnnotationModel model=
// getDocumentProvider().getAnnotationModel(getEditorInput());
// if (!waitForReconcilation)
// super.installOverrideIndicator(false);
// else {
// uninstallOverrideIndicator();
// IJavaElement inputElement= getInputJavaElement();
// if (model == null || inputElement == null)
// return;
//
// fOverrideIndicatorManager= new OverrideIndicatorManager(model,
// inputElement, null);
// addReconcileListener(fOverrideIndicatorManager);
// }
// }
//
// /*
// * @see
// net.sourceforge.phpdt.internal.ui.javaeditor.JavaEditor#uninstallOverrideIndicator()
// * @since 3.0
// */
// protected void uninstallOverrideIndicator() {
// if (fOverrideIndicatorManager != null)
// removeReconcileListener(fOverrideIndicatorManager);
// super.uninstallOverrideIndicator();
// }
/**
* Configures the toggle comment action
*
* @since 3.0
*/
private void configureToggleCommentAction() {
IAction action = getAction("ToggleComment"); //$NON-NLS-1$
if (action instanceof ToggleCommentAction) {
ISourceViewer sourceViewer = getSourceViewer();
SourceViewerConfiguration configuration = getSourceViewerConfiguration();
((ToggleCommentAction) action).configure(sourceViewer, configuration);
}
}
// private void configureTabConverter() {
// if (fTabConverter != null) {
// IDocumentProvider provider = getDocumentProvider();
// if (provider instanceof PHPDocumentProvider) {
// PHPDocumentProvider cup = (PHPDocumentProvider) provider;
// fTabConverter.setLineTracker(cup.createLineTracker(getEditorInput()));
// }
// }
// }
private void configureTabConverter() {
if (fTabConverter != null) {
IDocumentProvider provider = getDocumentProvider();
if (provider instanceof ICompilationUnitDocumentProvider) {
ICompilationUnitDocumentProvider cup = (ICompilationUnitDocumentProvider) provider;
fTabConverter.setLineTracker(cup.createLineTracker(getEditorInput()));
}
}
}
private void startTabConversion() {
if (fTabConverter == null) {
fTabConverter = new TabConverter();
configureTabConverter();
fTabConverter.setNumberOfSpacesPerTab(getTabSize());
AdaptedSourceViewer asv = (AdaptedSourceViewer) getSourceViewer();
asv.addTextConverter(fTabConverter);
// http://dev.eclipse.org/bugs/show_bug.cgi?id=19270
asv.updateIndentationPrefixes();
}
}
private void stopTabConversion() {
if (fTabConverter != null) {
AdaptedSourceViewer asv = (AdaptedSourceViewer) getSourceViewer();
asv.removeTextConverter(fTabConverter);
// http://dev.eclipse.org/bugs/show_bug.cgi?id=19270
asv.updateIndentationPrefixes();
fTabConverter = null;
}
}
/*
* @see org.eclipse.ui.texteditor.AbstractTextEditor#performSave(boolean, org.eclipse.core.runtime.IProgressMonitor)
*/
protected void performSave(boolean overwrite, IProgressMonitor progressMonitor) {
// IDocumentProvider p = getDocumentProvider();
// if (p instanceof PHPDocumentProvider) {
// PHPDocumentProvider cp = (PHPDocumentProvider) p;
// cp.setSavePolicy(fSavePolicy);
// }
// try {
// super.performSave(overwrite, progressMonitor);
// } finally {
// if (p instanceof PHPDocumentProvider) {
// PHPDocumentProvider cp = (PHPDocumentProvider) p;
// cp.setSavePolicy(null);
// }
// }
IDocumentProvider p = getDocumentProvider();
if (p instanceof ICompilationUnitDocumentProvider) {
ICompilationUnitDocumentProvider cp = (ICompilationUnitDocumentProvider) p;
cp.setSavePolicy(fSavePolicy);
}
try {
super.performSave(overwrite, progressMonitor);
} finally {
if (p instanceof ICompilationUnitDocumentProvider) {
ICompilationUnitDocumentProvider cp = (ICompilationUnitDocumentProvider) p;
cp.setSavePolicy(null);
}
}
}
/*
* @see AbstractTextEditor#doSaveAs
*/
public void doSaveAs() {
if (askIfNonWorkbenchEncodingIsOk()) {
super.doSaveAs();
}
}
/**
* Asks the user if it is ok to store in non-workbench encoding.
*
* @return true
if this is the active editor in the active page
* @see IWorkbenchPage#getActiveEditor();
*/
protected final boolean isActiveEditor() {
IWorkbenchWindow window = getSite().getWorkbenchWindow();
IWorkbenchPage page = window.getActivePage();
if (page == null)
return false;
IEditorPart activeEditor = page.getActiveEditor();
return activeEditor != null && activeEditor.equals(this);
}
/**
* Adds the given listener. Has no effect if an identical listener was not already registered.
*
* @param listener
* The reconcile listener to be added
* @since 3.0
*/
final void addReconcileListener(IJavaReconcilingListener listener) {
synchronized (fReconcilingListeners) {
fReconcilingListeners.add(listener);
}
}
/**
* Removes the given listener. Has no effect if an identical listener was not already registered.
*
* @param listener
* the reconcile listener to be removed
* @since 3.0
*/
final void removeReconcileListener(IJavaReconcilingListener listener) {
synchronized (fReconcilingListeners) {
fReconcilingListeners.remove(listener);
}
}
protected void updateStateDependentActions() {
super.updateStateDependentActions();
fGenerateActionGroup.editorStateChanged();
}
/*
* @see AbstractTextEditor#rememberSelection()
*/
protected void rememberSelection() {
fRememberedSelection.remember();
}
/*
* @see AbstractTextEditor#restoreSelection()
*/
protected void restoreSelection() {
fRememberedSelection.restore();
}
/*
* @see AbstractTextEditor#canHandleMove(IEditorInput, IEditorInput)
*/
protected boolean canHandleMove(IEditorInput originalElement, IEditorInput movedElement) {
String oldExtension = ""; //$NON-NLS-1$
if (originalElement instanceof IFileEditorInput) {
IFile file = ((IFileEditorInput) originalElement).getFile();
if (file != null) {
String ext = file.getFileExtension();
if (ext != null)
oldExtension = ext;
}
}
String newExtension = ""; //$NON-NLS-1$
if (movedElement instanceof IFileEditorInput) {
IFile file = ((IFileEditorInput) movedElement).getFile();
if (file != null)
newExtension = file.getFileExtension();
}
return oldExtension.equals(newExtension);
}
/*
* @see org.eclipse.ui.texteditor.AbstractDecoratedTextEditor#isPrefQuickDiffAlwaysOn()
*/
protected boolean isPrefQuickDiffAlwaysOn() {
// reestablishes the behaviour from AbstractDecoratedTextEditor which was hacked by JavaEditor
// to disable the change bar for the class file (attached source) java editor.
IPreferenceStore store = getPreferenceStore();
return store.getBoolean(AbstractDecoratedTextEditorPreferenceConstants.QUICK_DIFF_ALWAYS_ON);
}
/*
* @see net.sourceforge.phpdt.internal.ui.javaeditor.JavaEditor#getAdapter(java.lang.Class)
*/
public Object getAdapter(Class required) {
if (SmartBackspaceManager.class.equals(required)) {
if (getSourceViewer() instanceof JavaSourceViewer) {
return ((JavaSourceViewer) getSourceViewer()).getBackspaceManager();
}
}
return super.getAdapter(required);
}
/**
* Returns the mutex for the reconciler. See https://bugs.eclipse.org/bugs/show_bug.cgi?id=63898 for a description of the problem.
* * TODO remove once the underlying problem is solved. *
* * @return the lock reconcilers may use to synchronize on */ public Object getReconcilerLock() { return fReconcilerLock; } /* * (non-Javadoc) * * @see org.eclipse.ui.texteditor.AbstractTextEditor#editorSaved() */ protected void editorSaved() { super.editorSaved(); ShowExternalPreviewAction a = ShowExternalPreviewAction.getInstance(); if (a != null) { a.refresh(ShowExternalPreviewAction.PHP_TYPE); } } }