X-Git-Url: http://git.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/java/JavaStringAutoIndentStrategySQ.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/java/JavaStringAutoIndentStrategySQ.java index d58f57b..e4f4d54 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/java/JavaStringAutoIndentStrategySQ.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/java/JavaStringAutoIndentStrategySQ.java @@ -26,7 +26,7 @@ import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.texteditor.ITextEditorExtension3; /** - * Auto indent strategy for java strings + * Auto indent strategy for single quoted PHP strings */ public class JavaStringAutoIndentStrategySQ extends DefaultIndentLineAutoEditStrategy { @@ -40,23 +40,22 @@ public class JavaStringAutoIndentStrategySQ extends * the given input string * @return the displayable string. */ - private String displayString(String inputString, String indentation, - String delimiter) { - + private String displayString (String inputString, String indentation, String delimiter) { int length = inputString.length(); StringBuffer buffer = new StringBuffer(length); - java.util.StringTokenizer tokenizer = new java.util.StringTokenizer( - inputString, "\n\r", true); //$NON-NLS-1$ - while (tokenizer.hasMoreTokens()) { + java.util.StringTokenizer tokenizer = + new java.util.StringTokenizer (inputString, "\n\r", true); //$NON-NLS-1$ + + while (tokenizer.hasMoreTokens ()) { + String token = tokenizer.nextToken (); - String token = tokenizer.nextToken(); if (token.equals("\r")) { //$NON-NLS-1$ buffer.append("\\r"); //$NON-NLS-1$ if (tokenizer.hasMoreTokens()) { token = tokenizer.nextToken(); if (token.equals("\n")) { //$NON-NLS-1$ buffer.append("\\n"); //$NON-NLS-1$ - buffer.append("\' . " + delimiter); //$NON-NLS-1$ + buffer.append("\" . " + delimiter); //$NON-NLS-1$ buffer.append(indentation); buffer.append("\'"); //$NON-NLS-1$ continue; @@ -77,6 +76,7 @@ public class JavaStringAutoIndentStrategySQ extends } StringBuffer tokenBuffer = new StringBuffer(); + for (int i = 0; i < token.length(); i++) { char c = token.charAt(i); switch (c) { @@ -111,6 +111,7 @@ public class JavaStringAutoIndentStrategySQ extends } buffer.append(tokenBuffer); } + return buffer.toString(); } @@ -121,43 +122,134 @@ public class JavaStringAutoIndentStrategySQ extends * @param partitioning * the document partitioning */ - public JavaStringAutoIndentStrategySQ(String partitioning) { + public JavaStringAutoIndentStrategySQ (String partitioning) { super(); fPartitioning = partitioning; } + /** + * Check whether the 'text' is one of the allowed line delimiters (e.g. \n \r) + * + * @param document The document object for which we do the check + * @param text The text with the possible delimiter + * @return + * - true if 'text' is a valid delimiter + * - false if 'text' is not a valid delimiter + */ private boolean isLineDelimiter(IDocument document, String text) { String[] delimiters = document.getLegalLineDelimiters(); - if (delimiters != null) + + if (delimiters != null) { return TextUtilities.equals(delimiters, text) > -1; + } + return false; } + /** + * Get back the indentation of the line to which the offset belongs. + * + * It searches the first occurrence of a white space (non space/non tab) + * + * @param document + * @param offset + * @return + * @throws BadLocationException + */ private String getLineIndentation(IDocument document, int offset) throws BadLocationException { + String indentation = ""; + int start; + int end; + int length = 0; // find start of line - int adjustedOffset = (offset == document.getLength() ? offset - 1 - : offset); - IRegion line = document.getLineInformationOfOffset(adjustedOffset); - int start = line.getOffset(); + int adjustedOffset = (offset == document.getLength() ? offset - 1 : offset);// Check whether the offset is not at the end of file + IRegion line = document.getLineInformationOfOffset (adjustedOffset); // Get the start and the length of the line - // find white spaces - int end = findEndOfWhiteSpace(document, start, offset); + start = line.getOffset (); // Get the start of the line + end = findStringStart (document, start, offset); + + IPreferenceStore preferenceStore = PHPeclipsePlugin.getDefault().getPreferenceStore(); + + int tabWidth = preferenceStore.getInt (PreferenceConstants.EDITOR_TAB_WIDTH); + + for (int pos = start; pos < end; pos++) { + if (document.getChar (pos) == '\t') { // If the character is a tab + length += tabWidth; // take the tab width for calculating the indentation length + } + else { // If it's just a space + length++; // add one character to the indentation length + } + } + + if (preferenceStore.getBoolean (PreferenceConstants.EDITOR_SPACES_FOR_TABS)) { // Indentation with spaces only + if (length > 0) { + indentation = String.format ("%" + length + "s", ""); + } + } + else { // Indentation with tabs + if (length > 0) { + int spaces; + int tabs; + + tabs = length / tabWidth; + spaces = length % tabWidth; + + indentation = new String (new char[tabs]).replace('\0', '\t'); + + if (spaces > 0) { + indentation += String.format ("%" + spaces + "s", ""); + } + } + } + + return indentation; + } + + /** + * Return the position of the string start (first occurrence of a quote or double quote) + * + * @param offset + * @param start + * @param document + * @return + */ + private int findStringStart(IDocument document, int offset, int end) throws BadLocationException { + while (offset < end) { + char c = document.getChar (offset); + + if ((c == '\'') || (c == '\"')) { + return offset; + } + + offset++; + } - return document.get(start, end - start); + return end; } - private String getModifiedText(String string, String indentation, - String delimiter) throws BadLocationException { + /** + * + * @param string + * @param indentation + * @param delimiter + * @return + * @throws BadLocationException + */ + private String getModifiedText (String string, String indentation, String delimiter) + throws BadLocationException { return displayString(string, indentation, delimiter); } - private void javaStringIndentAfterNewLine(IDocument document, - DocumentCommand command) throws BadLocationException { - - ITypedRegion partition = TextUtilities.getPartition(document, - fPartitioning, command.offset, false); + /** + * + * @param document + * @param command + * @throws BadLocationException + */ + private void javaStringIndentAfterNewLine (IDocument document, DocumentCommand command) throws BadLocationException { + ITypedRegion partition = TextUtilities.getPartition (document, fPartitioning, command.offset, false); int offset = partition.getOffset(); int length = partition.getLength(); @@ -170,38 +262,49 @@ public class JavaStringAutoIndentStrategySQ extends return; } - if (command.offset == offset + length - && document.getChar(offset + length - 1) == '\'') + if ((command.offset == offset + length) && + (document.getChar (offset + length - 1) == '\'')) { return; + } String indentation = getLineIndentation(document, command.offset); String delimiter = TextUtilities.getDefaultLineDelimiter(document); IRegion line = document.getLineInformationOfOffset(offset); - String string = document.get(line.getOffset(), offset - - line.getOffset()); - if (string.trim().length() != 0) + String string = document.get (line.getOffset(), + offset - line.getOffset()); // Get the current line as string +/* + if (string.trim().length() != 0) { indentation += String.valueOf("\t\t"); //$NON-NLS-1$ + } +*/ + IPreferenceStore preferenceStore = PHPeclipsePlugin.getDefault ().getPreferenceStore(); - IPreferenceStore preferenceStore = PHPeclipsePlugin.getDefault() - .getPreferenceStore(); - if (isLineDelimiter(document, command.text)) + if (isLineDelimiter (document, command.text)) { command.text = "\' ." + command.text + indentation + "\'"; //$NON-NLS-1$//$NON-NLS-2$ - else if (command.text.length() > 1 - && preferenceStore - .getBoolean(PreferenceConstants.EDITOR_ESCAPE_STRINGS_SQ)) + } + else if ((command.text.length() > 1) && + preferenceStore.getBoolean (PreferenceConstants.EDITOR_ESCAPE_STRINGS_SQ)) { command.text = getModifiedText(command.text, indentation, delimiter); + } } + /** + * + * @return + */ private boolean isSmartMode() { IWorkbenchPage page = PHPeclipsePlugin.getActivePage(); + if (page != null) { IEditorPart part = page.getActiveEditor(); + if (part instanceof ITextEditorExtension3) { ITextEditorExtension3 extension = (ITextEditorExtension3) part; return extension.getInsertMode() == ITextEditorExtension3.SMART_INSERT; } } + return false; } @@ -209,19 +312,18 @@ public class JavaStringAutoIndentStrategySQ extends * @see org.eclipse.jface.text.IAutoIndentStrategy#customizeDocumentCommand(IDocument, * DocumentCommand) */ - public void customizeDocumentCommand(IDocument document, - DocumentCommand command) { + public void customizeDocumentCommand(IDocument document, DocumentCommand command) { try { - if (command.length != 0 || command.text == null) + if ((command.length != 0) || + (command.text == null)) { return; + } - IPreferenceStore preferenceStore = PHPeclipsePlugin.getDefault() - .getPreferenceStore(); + IPreferenceStore preferenceStore = PHPeclipsePlugin.getDefault().getPreferenceStore(); - if (preferenceStore - .getBoolean(PreferenceConstants.EDITOR_WRAP_STRINGS_SQ) - && isSmartMode()) + if (preferenceStore.getBoolean (PreferenceConstants.EDITOR_WRAP_STRINGS_SQ) && isSmartMode()) { javaStringIndentAfterNewLine(document, command); + } } catch (BadLocationException e) { }