/** * Aptana Studio * Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved. * Licensed under the terms of the GNU Public License (GPL) v3 (with exceptions). * Please see the license.html included with this distribution for details. * Any modifications to this file must keep this entire header intact. */ package com.aptana.editor.php.formatter.nodes; import com.aptana.editor.php.formatter.PHPFormatterConstants; import com.aptana.formatter.IFormatterContext; import com.aptana.formatter.IFormatterDocument; import com.aptana.formatter.IFormatterWriter; import com.aptana.formatter.nodes.FormatterCommentNode; /** * A PHP formatter comment node.<br> * The comment node formatting will indent with an extra space any lines that appear under a multi-line comment block * (accept for the first line). * * @author Shalom Gibly <sgibly@aptana.com> */ public class FormatterPHPCommentNode extends FormatterCommentNode { private boolean isFirstline; private boolean isMultiLine; /** * Constructs a new formatter node for PHP comments * * @param document * @param startOffset * @param endOffset * @param isMultiLine * Indicates that this comment line is part of a multi-lines comment. * @param isFirstline * Indicates that this line is the first line of the comment block. */ public FormatterPHPCommentNode(IFormatterDocument document, int startOffset, int endOffset, boolean isMultiLine, boolean isFirstline) { super(document, startOffset, endOffset); this.isMultiLine = isMultiLine; this.isFirstline = isFirstline; } /* * (non-Javadoc) * @see com.aptana.formatter.nodes.FormatterCommentNode#accept(com.aptana.formatter.IFormatterContext, * com.aptana.formatter.IFormatterWriter) */ @Override public void accept(IFormatterContext context, IFormatterWriter visitor) throws Exception { boolean currentCommentState = context.isComment(); context.setComment(true); if (getDocument().getBoolean(getWrappingKey())) { boolean savedWrapping = context.isWrapping(); context.setWrapping(true); writeCommentLine(visitor, context, getStartOffset(), getEndOffset()); context.setWrapping(savedWrapping); } else { writeCommentLine(visitor, context, getStartOffset(), getEndOffset()); } context.setComment(currentCommentState); } /** * Do the actual writing of the comment line. * * @param visitor * @param context * @param startOffset * @param endOffset */ protected void writeCommentLine(IFormatterWriter visitor, IFormatterContext context, int startOffset, int endOffset) { if (!visitor.endsWithNewLine() && !isFirstline && isMultiLine) { visitor.writeLineBreak(context); } if (!isMultiLine) { // just write the comment as it is visitor.write(context, startOffset, endOffset); } else { if (!isFirstline) { // it's a multi-line, so we have to treat it differently and add the space in-front of the // lines, accept for the first line. visitor.ensureLineStarted(context); visitor.writeText(context, " ", false); //$NON-NLS-1$ } visitor.write(context, startOffset, endOffset); } } /* * (non-Javadoc) * @see com.aptana.formatter.nodes.FormatterCommentNode#getWrappingKey() */ public String getWrappingKey() { return PHPFormatterConstants.WRAP_COMMENTS; } }